LyoKICogREVDIDkzIEVyaWsgQm9zIDxlcmlrQHhzNGFsbC5ubD4KICoKICogQ29weXJpZ2h0IDE5OTYgTWFyY3VzIE1laXNzbmVyCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogKgogKiBIaXN0b3J5OgogKgogKiBBcHIgMywgMTk5OS4gIExhd3NvbiBXaGl0bmV5IDxsYXdzb25fd2hpdG5leUBqdW5vLmNvbT4KICogLSBGaXhlZCB0aGUgbW9kZW0gY29udHJvbCBwYXJ0IG9mIEVzY2FwZUNvbW1GdW5jdGlvbjE2LgogKgogKiBNYXIgMzEsIDE5OTkuIE92ZSBL5XZlbiA8b3Zla0BhcmN0aWNuZXQubm8+CiAqIC0gSW1wbGVtZW50ZWQgYnVmZmVycyBhbmQgRW5hYmxlQ29tbU5vdGlmaWNhdGlvbi4KICoKICogTWFyIDMsIDE5OTkuIE92ZSBL5XZlbiA8b3Zla0BhcmN0aWNuZXQubm8+CiAqIC0gVXNlIHBvcnQgaW5kaWNlcyBpbnN0ZWFkIG9mIHVuaXhmZHMgZm9yIHdpbjE2CiAqIC0gTW92ZWQgdGhpbmdzIGFyb3VuZCAoc2VwYXJhdGVkIHdpbjE2IGFuZCB3aW4zMiByb3V0aW5lcykKICogLSBBZGRlZCBzb21lIGhpbnRzIG9uIGhvdyB0byBpbXBsZW1lbnQgYnVmZmVycyBhbmQgRW5hYmxlQ29tbU5vdGlmaWNhdGlvbi4KICoKICogT2t0b2JlciA5OCwgUmVpbiBLbGF6ZXMgW1JIS10KICogQSBwcm9ncmFtIHRoYXQgd2FudHMgdG8gbW9uaXRvciB0aGUgbW9kZW0gc3RhdHVzIGxpbmUgKFJMU0QvRENEKSBtYXkKICogcG9sbCB0aGUgbW9kZW0gc3RhdHVzIHJlZ2lzdGVyIGluIHRoZSBjb21tTWFzayBzdHJ1Y3R1cmUuIEkgdXBkYXRlIHRoZSBiaXQKICogaW4gR2V0Q29tbUVycm9yLCB3YWl0aW5nIGZvciBhbiBpbXBsZW1lbnRhdGlvbiBvZiBjb21tdW5pY2F0aW9uIGV2ZW50cy4KICoKICogSnVseSA2LCAxOTk4LiBGaXhlcyBhbmQgY29tbWVudHMgYnkgVmFsZW50aWpuIFNlc3NpbmsKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZzZXNzaW5rQGljLnV2YS5ubD4gW1ZdCiAqCiAqIEF1Z3VzdCAxMiwgMTk5Ny4gIFRha2UgYSBiYXNoIGF0IFNldENvbW1FdmVudE1hc2sgLSBMYXdzb24gV2hpdG5leQogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGF3c29uX3doaXRuZXlAanVuby5jb20+CiAqCiAqIE1heSAyNiwgMTk5Ny4gIEZpeGVzIGFuZCBjb21tZW50cyBieSBSaWNrIFJpY2hhcmRzb24gPHJpY2tAZGdpaS5jb20+IFtSRVJdCiAqIC0gcHRyLT5mZCB3YXNuJ3QgZ2V0dGluZyBjbGVhcmVkIG9uIGNsb3NlLgogKiAtIEdldENvbW1FdmVudE1hc2soKSBhbmQgR2V0Q29tbUVycm9yKCkgZGlkbid0IGRvIG11Y2ggb2YgYW55dGhpbmcuCiAqICAgSU1ITywgdGhleSBhcmUgc3RpbGwgd3JvbmcsIGJ1dCB0aGV5IGF0IGxlYXN0IGltcGxlbWVudCB0aGUgUlhDSEFSCiAqICAgZXZlbnQgYW5kIHJldHVybiBJL08gcXVldWUgc2l6ZXMsIHdoaWNoIG1ha2VzIHRoZSBhcHAgSSdtIGludGVyZXN0ZWQKICogICBpbiAoYW5hbG9nIGRldmljZXMgRVpLSVQgRFNQIGRldmVsb3BtZW50IHN5c3RlbSkgd29yay4KICovCgojaW5jbHVkZSAiY29uZmlnLmgiCiNpbmNsdWRlICJ3aW5lL3BvcnQuaCIKCiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0ZGFyZy5oPgojaW5jbHVkZSA8c3RkaW8uaD4KI2lmZGVmIEhBVkVfVEVSTUlPU19ICiNpbmNsdWRlIDx0ZXJtaW9zLmg+CiNlbmRpZgojaW5jbHVkZSA8ZmNudGwuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaWZkZWYgSEFWRV9TVFJJTkdTX0gKIyBpbmNsdWRlIDxzdHJpbmdzLmg+CiNlbmRpZgojaW5jbHVkZSA8ZXJybm8uaD4KI2luY2x1ZGUgPGN0eXBlLmg+CiNpbmNsdWRlIDxzeXMvc3RhdC5oPgojaWZkZWYgSEFWRV9TWVNfRklMSU9fSAojIGluY2x1ZGUgPHN5cy9maWxpby5oPgojZW5kaWYKI2lmZGVmIEhBVkVfU1lTX0lPQ1RMX0gKI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgojZW5kaWYKI2lmZGVmIEhBVkVfVU5JU1REX0gKIyBpbmNsdWRlIDx1bmlzdGQuaD4KI2VuZGlmCiNpZmRlZiBIQVZFX1NZU19QT0xMX0gKIyBpbmNsdWRlIDxzeXMvcG9sbC5oPgojZW5kaWYKI2lmZGVmIEhBVkVfU1lTX01PREVNX0gKIyBpbmNsdWRlIDxzeXMvbW9kZW0uaD4KI2VuZGlmCiNpZmRlZiBIQVZFX1NZU19TVFJUSU9fSAojIGluY2x1ZGUgPHN5cy9zdHJ0aW8uaD4KI2VuZGlmCgojZGVmaW5lIE5PTkFNRUxFU1NVTklPTgojZGVmaW5lIE5PTkFNRUxFU1NTVFJVQ1QKI2luY2x1ZGUgIm50c3RhdHVzLmgiCiNpbmNsdWRlICJ3aW5kZWYuaCIKI2luY2x1ZGUgIndpbmJhc2UuaCIKI2luY2x1ZGUgIndpbmVycm9yLmgiCgojaW5jbHVkZSAid2luZS9zZXJ2ZXIuaCIKI2luY2x1ZGUgImFzeW5jLmgiCiNpbmNsdWRlICJoZWFwLmgiCiNpbmNsdWRlICJ3aW5lL3VuaWNvZGUuaCIKCiNpbmNsdWRlICJ3aW5lL2RlYnVnLmgiCgojaWZkZWYgSEFWRV9MSU5VWF9TRVJJQUxfSAojaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CiNlbmRpZgoKV0lORV9ERUZBVUxUX0RFQlVHX0NIQU5ORUwoY29tbSk7CgovKiByZXRyaWV2ZSB0aGUgVW5peCBoYW5kbGUgY29ycmVzcG9uZGluZyB0byBhIGNvbW0gaGFuZGxlICovCnN0YXRpYyBpbnQgZ2V0X2NvbW1fZmQoIEhBTkRMRSBoYW5kbGUsIERXT1JEIGFjY2VzcyApCnsKICAgIGludCBmZCwgcmV0OwoKICAgIHJldCA9IHdpbmVfc2VydmVyX2hhbmRsZV90b19mZCggaGFuZGxlLCBhY2Nlc3MsICZmZCwgTlVMTCwgTlVMTCApOwogICAgaWYgKHJldCkgU2V0TGFzdEVycm9yKCBSdGxOdFN0YXR1c1RvRG9zRXJyb3IocmV0KSApOwogICAgcmV0dXJuIGZkOwp9CgovKiByZWxlYXNlIHRoZSBVbml4IGhhbmRsZSByZXR1cm5lZCBieSBnZXRfY29tbV9mZCAqLwpzdGF0aWMgaW5saW5lIHZvaWQgcmVsZWFzZV9jb21tX2ZkKCBIQU5ETEUgaGFuZGxlLCBpbnQgZmQgKQp7CiAgICB3aW5lX3NlcnZlcl9yZWxlYXNlX2ZkKCBoYW5kbGUsIGZkICk7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQXN5bmNocm9ub3VzIEkvTyBmb3IgYXN5bmNocm9ub3VzIHdhaXQgcmVxdWVzdHMgICAgICAgICAgICAgICAgICAgICAqCiAqLwoKc3RhdGljIERXT1JEIGNvbW1pb19nZXRfYXN5bmNfY291bnQgKGNvbnN0IGFzeW5jX3ByaXZhdGUgKm92cCk7CnN0YXRpYyB2b2lkIGNvbW1pb19hc3luY19jbGVhbnVwICAoYXN5bmNfcHJpdmF0ZSAqb3ZwKTsKCnN0YXRpYyBhc3luY19vcHMgY29tbWlvX2FzeW5jX29wcyA9CnsKICAgIGNvbW1pb19nZXRfYXN5bmNfY291bnQsICAgICAgICAvKiBnZXRfY291bnQgKi8KICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjYWxsX2NvbXBsZXRpb24gKi8KICAgIGNvbW1pb19hc3luY19jbGVhbnVwICAgICAgICAgICAvKiBjbGVhbnVwICovCn07Cgp0eXBlZGVmIHN0cnVjdCBhc3luY19jb21taW8KewogICAgc3RydWN0IGFzeW5jX3ByaXZhdGUgICAgICAgICAgICAgYXN5bmM7CiAgICBjaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnVmZmVyOwp9IGFzeW5jX2NvbW1pbzsKCnN0YXRpYyBEV09SRCBjb21taW9fZ2V0X2FzeW5jX2NvdW50IChjb25zdCBzdHJ1Y3QgYXN5bmNfcHJpdmF0ZSAqb3ZwKQp7CiAgICByZXR1cm4gMDsKfQoKc3RhdGljIHZvaWQgY29tbWlvX2FzeW5jX2NsZWFudXAgIChhc3luY19wcml2YXRlICpvdnApCnsKICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIG92cCApOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgojaWYgIWRlZmluZWQoVElPQ0lOUSkgJiYgZGVmaW5lZChGSU9OUkVBRCkKI2RlZmluZQlUSU9DSU5RIEZJT05SRUFECiNlbmRpZgoKc3RhdGljIGludCBDT01NX1doYWNrTW9kZW0oaW50IGZkLCB1bnNpZ25lZCBpbnQgYW5keSwgdW5zaWduZWQgaW50IG9ycmllKQp7CiNpZmRlZiBUSU9DTUdFVAogICAgdW5zaWduZWQgaW50IG1zdGF0LCBva2F5OwogICAgb2theSA9IGlvY3RsKGZkLCBUSU9DTUdFVCwgJm1zdGF0KTsKICAgIGlmIChva2F5KSByZXR1cm4gb2theTsKICAgIGlmIChhbmR5KSBtc3RhdCAmPSBhbmR5OwogICAgbXN0YXQgfD0gb3JyaWU7CiAgICByZXR1cm4gaW9jdGwoZmQsIFRJT0NNU0VULCAmbXN0YXQpOwojZWxzZQogICAgcmV0dXJuIDA7CiNlbmRpZgp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIENPTU1fUGFyc2UqICAgKEludGVybmFsKQogKgogKiAgVGhlIGZvbGxvd2luZyBDT01NX1BhcnNlKiBmdW5jdGlvbnMgYXJlIHVzZWQgYnkgdGhlIEJ1aWxkQ29tbURDQgogKiAgZnVuY3Rpb25zIHRvIGhlbHAgcGFyc2UgdGhlIHZhcmlvdXMgcGFydHMgb2YgdGhlIGRldmljZSBjb250cm9sIHN0cmluZy4KICovCnN0YXRpYyBMUENXU1RSIENPTU1fUGFyc2VTdGFydChMUENXU1RSIHB0cikKewoJc3RhdGljIGNvbnN0IFdDSEFSIGNvbVdbXSA9IHsnQycsJ08nLCdNJywwfTsKCgkvKiBUaGUgZGV2aWNlIGNvbnRyb2wgc3RyaW5nIG1heSBvcHRpb25hbGx5IHN0YXJ0IHdpdGggIkNPTXgiIGZvbGxvd2VkCgkgICBieSBhbiBvcHRpb25hbCAnOicgYW5kIHNwYWNlcy4gKi8KCWlmKCFzdHJuY21waVcocHRyLCBjb21XLCAzKSkKCXsKCQlwdHIgKz0gMzsKCgkJLyogQWxsb3cgYW55IGNvbSBwb3J0IGFib3ZlIDAgYXMgV2luIDl4IGRvZXMgKE5UIG9ubHkgYWxsb3dzCgkJICAgdmFsdWVzIGZvciBjb20gcG9ydHMgd2hpY2ggYXJlIGFjdHVhbGx5IHByZXNlbnQpICovCgkJaWYoKnB0ciA8ICcxJyB8fCAqcHRyID4gJzknKQoJCQlyZXR1cm4gTlVMTDsKCQkKCQkvKiBBZHZhbmNlIHBvaW50ZXIgcGFzdCBwb3J0IG51bWJlciAqLwoJCXdoaWxlKCpwdHIgPj0gJzAnICYmICpwdHIgPD0gJzknKSBwdHIrKzsKCQkKCQkvKiBUaGUgY29tIHBvcnQgbnVtYmVyIG11c3QgYmUgZm9sbG93ZWQgYnkgYSAnOicgb3IgJyAnICovCgkJaWYoKnB0ciAhPSAnOicgJiYgKnB0ciAhPSAnICcpCgkJCXJldHVybiBOVUxMOwoKCQkvKiBBZHZhbmNlIHBvaW50ZXIgdG8gYmVnaW5uaW5nIG9mIG5leHQgcGFyYW1ldGVyICovCgkJd2hpbGUoKnB0ciA9PSAnICcpIHB0cisrOwoJCWlmKCpwdHIgPT0gJzonKQoJCXsKCQkJcHRyKys7CgkJCXdoaWxlKCpwdHIgPT0gJyAnKSBwdHIrKzsKCQl9Cgl9CgkvKiBUaGUgZGV2aWNlIGNvbnRyb2wgc3RyaW5nIG11c3Qgbm90IHN0YXJ0IHdpdGggYSBzcGFjZS4gKi8KCWVsc2UgaWYoKnB0ciA9PSAnICcpCgkJcmV0dXJuIE5VTEw7CgkKCXJldHVybiBwdHI7Cn0KIApzdGF0aWMgTFBDV1NUUiBDT01NX1BhcnNlTnVtYmVyKExQQ1dTVFIgcHRyLCBMUERXT1JEIGxwbnVtYmVyKQp7CglpZigqcHRyIDwgJzAnIHx8ICpwdHIgPiAnOScpIHJldHVybiBOVUxMOwoJKmxwbnVtYmVyID0gc3RydG91bFcocHRyLCBOVUxMLCAxMCk7Cgl3aGlsZSgqcHRyID49ICcwJyAmJiAqcHRyIDw9ICc5JykgcHRyKys7CglyZXR1cm4gcHRyOwp9CgpzdGF0aWMgTFBDV1NUUiBDT01NX1BhcnNlUGFyaXR5KExQQ1dTVFIgcHRyLCBMUEJZVEUgbHBwYXJpdHkpCnsKCS8qIENvbnRyYXJ5IHRvIHdoYXQgeW91IG1pZ2h0IGV4cGVjdCwgV2luZG93cyBvbmx5IHNldHMgdGhlIFBhcml0eQoJICAgbWVtYmVyIG9mIERDQiBhbmQgbm90IGZQYXJpdHkgZXZlbiB3aGVuIHBhcml0eSBpcyBzcGVjaWZpZWQgaW4gdGhlCgkgICBkZXZpY2UgY29udHJvbCBzdHJpbmcgKi8KCglzd2l0Y2godG91cHBlclcoKnB0cisrKSkKCXsKCWNhc2UgJ0UnOgoJCSpscHBhcml0eSA9IEVWRU5QQVJJVFk7CgkJYnJlYWs7CgljYXNlICdNJzoKCQkqbHBwYXJpdHkgPSBNQVJLUEFSSVRZOwoJCWJyZWFrOwoJY2FzZSAnTic6CgkJKmxwcGFyaXR5ID0gTk9QQVJJVFk7CgkJYnJlYWs7CgljYXNlICdPJzoKCQkqbHBwYXJpdHkgPSBPRERQQVJJVFk7CgkJYnJlYWs7CgljYXNlICdTJzoKCQkqbHBwYXJpdHkgPSBTUEFDRVBBUklUWTsKCQlicmVhazsKCWRlZmF1bHQ6CgkJcmV0dXJuIE5VTEw7Cgl9CgoJcmV0dXJuIHB0cjsKfQoKc3RhdGljIExQQ1dTVFIgQ09NTV9QYXJzZUJ5dGVTaXplKExQQ1dTVFIgcHRyLCBMUEJZVEUgbHBieXRlc2l6ZSkKewoJRFdPUkQgdGVtcDsKCglpZighKHB0ciA9IENPTU1fUGFyc2VOdW1iZXIocHRyLCAmdGVtcCkpKQoJCXJldHVybiBOVUxMOwoKCWlmKHRlbXAgPj0gNSAmJiB0ZW1wIDw9IDgpCgl7CgkJKmxwYnl0ZXNpemUgPSB0ZW1wOwoJCXJldHVybiBwdHI7Cgl9CgllbHNlCgkJcmV0dXJuIE5VTEw7Cn0KCnN0YXRpYyBMUENXU1RSIENPTU1fUGFyc2VTdG9wQml0cyhMUENXU1RSIHB0ciwgTFBCWVRFIGxwc3RvcGJpdHMpCnsKCURXT1JEIHRlbXA7CglzdGF0aWMgY29uc3QgV0NIQVIgc3RvcGJpdHMxNVdbXSA9IHsnMScsJy4nLCc1JywwfTsKCglpZighc3RybmNtcFcoc3RvcGJpdHMxNVcsIHB0ciwgMykpCgl7CgkJcHRyICs9IDM7CgkJKmxwc3RvcGJpdHMgPSBPTkU1U1RPUEJJVFM7Cgl9CgllbHNlCgl7CgkJaWYoIShwdHIgPSBDT01NX1BhcnNlTnVtYmVyKHB0ciwgJnRlbXApKSkKCQkJcmV0dXJuIE5VTEw7CgoJCWlmKHRlbXAgPT0gMSkKCQkJKmxwc3RvcGJpdHMgPSBPTkVTVE9QQklUOwoJCWVsc2UgaWYodGVtcCA9PSAyKQoJCQkqbHBzdG9wYml0cyA9IFRXT1NUT1BCSVRTOwoJCWVsc2UKCQkJcmV0dXJuIE5VTEw7Cgl9CgkKCXJldHVybiBwdHI7Cn0KCnN0YXRpYyBMUENXU1RSIENPTU1fUGFyc2VPbk9mZihMUENXU1RSIHB0ciwgTFBEV09SRCBscG9ub2ZmKQp7CglzdGF0aWMgY29uc3QgV0NIQVIgb25XW10gPSB7J28nLCduJywwfTsKCXN0YXRpYyBjb25zdCBXQ0hBUiBvZmZXW10gPSB7J28nLCdmJywnZicsMH07CgoJaWYoIXN0cm5jbXBpVyhvblcsIHB0ciwgMikpCgl7CgkJcHRyICs9IDI7CgkJKmxwb25vZmYgPSAxOwoJfQoJZWxzZSBpZighc3RybmNtcGlXKG9mZlcsIHB0ciwgMykpCgl7CgkJcHRyICs9IDM7CgkJKmxwb25vZmYgPSAwOwoJfQoJZWxzZQoJCXJldHVybiBOVUxMOwoKCXJldHVybiBwdHI7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgQ09NTV9CdWlsZE9sZENvbW1EQ0IgICAoSW50ZXJuYWwpCiAqCiAqICBCdWlsZCBhIERDQiB1c2luZyB0aGUgb2xkIHN0eWxlIHNldHRpbmdzIHN0cmluZyBlZzogIjk2LG4sOCwxIgogKi8Kc3RhdGljIEJPT0wgQ09NTV9CdWlsZE9sZENvbW1EQ0IoTFBDV1NUUiBkZXZpY2UsIExQRENCIGxwZGNiKQp7CglXQ0hBUiBsYXN0ID0gMDsKCglpZighKGRldmljZSA9IENPTU1fUGFyc2VOdW1iZXIoZGV2aWNlLCAmbHBkY2ItPkJhdWRSYXRlKSkpCgkJcmV0dXJuIEZBTFNFOwoJCglzd2l0Y2gobHBkY2ItPkJhdWRSYXRlKQoJewoJY2FzZSAxMToKCWNhc2UgMzA6CgljYXNlIDYwOgoJCWxwZGNiLT5CYXVkUmF0ZSAqPSAxMDsKCQlicmVhazsKCWNhc2UgMTI6CgljYXNlIDI0OgoJY2FzZSA0ODoKCWNhc2UgOTY6CgkJbHBkY2ItPkJhdWRSYXRlICo9IDEwMDsKCQlicmVhazsKCWNhc2UgMTk6CgkJbHBkY2ItPkJhdWRSYXRlID0gMTkyMDA7CgkJYnJlYWs7Cgl9CgoJd2hpbGUoKmRldmljZSA9PSAnICcpIGRldmljZSsrOwoJaWYoKmRldmljZSsrICE9ICcsJykgcmV0dXJuIEZBTFNFOwoJd2hpbGUoKmRldmljZSA9PSAnICcpIGRldmljZSsrOwoKCWlmKCEoZGV2aWNlID0gQ09NTV9QYXJzZVBhcml0eShkZXZpY2UsICZscGRjYi0+UGFyaXR5KSkpCgkJcmV0dXJuIEZBTFNFOwoKCXdoaWxlKCpkZXZpY2UgPT0gJyAnKSBkZXZpY2UrKzsKCWlmKCpkZXZpY2UrKyAhPSAnLCcpIHJldHVybiBGQUxTRTsKCXdoaWxlKCpkZXZpY2UgPT0gJyAnKSBkZXZpY2UrKzsKCQkKCWlmKCEoZGV2aWNlID0gQ09NTV9QYXJzZUJ5dGVTaXplKGRldmljZSwgJmxwZGNiLT5CeXRlU2l6ZSkpKQoJCXJldHVybiBGQUxTRTsKCgl3aGlsZSgqZGV2aWNlID09ICcgJykgZGV2aWNlKys7CglpZigqZGV2aWNlKysgIT0gJywnKSByZXR1cm4gRkFMU0U7Cgl3aGlsZSgqZGV2aWNlID09ICcgJykgZGV2aWNlKys7CgoJaWYoIShkZXZpY2UgPSBDT01NX1BhcnNlU3RvcEJpdHMoZGV2aWNlLCAmbHBkY2ItPlN0b3BCaXRzKSkpCgkJcmV0dXJuIEZBTFNFOwoKCS8qIFRoZSBsYXN0IHBhcmFtZXRlciBmb3IgZmxvdyBjb250cm9sIGlzIG9wdGlvbmFsLiAqLwoJd2hpbGUoKmRldmljZSA9PSAnICcpIGRldmljZSsrOwoJaWYoKmRldmljZSA9PSAnLCcpCgl7CgkJZGV2aWNlKys7CgkJd2hpbGUoKmRldmljZSA9PSAnICcpIGRldmljZSsrOwoJCWlmKCpkZXZpY2UpIGxhc3QgPSB0b3VwcGVyVygqZGV2aWNlKyspOwoJCXdoaWxlKCpkZXZpY2UgPT0gJyAnKSBkZXZpY2UrKzsKCX0KCgkvKiBXaW4gTlQgc2V0cyB0aGUgZmxvdyBjb250cm9sIG1lbWJlcnMgYmFzZWQgb24gKG9yIGxhY2sgb2YpIHRoZSBsYXN0CgkgICBwYXJhbWV0ZXIuICBXaW4gOXggZG9lcyBub3Qgc2V0IHRoZXNlIG1lbWJlcnMuICovCglzd2l0Y2gobGFzdCkKCXsKCWNhc2UgMDoKCQlscGRjYi0+ZkluWCA9IEZBTFNFOwoJCWxwZGNiLT5mT3V0WCA9IEZBTFNFOwoJCWxwZGNiLT5mT3V0eEN0c0Zsb3cgPSBGQUxTRTsKCQlscGRjYi0+Zk91dHhEc3JGbG93ID0gRkFMU0U7CgkJbHBkY2ItPmZEdHJDb250cm9sID0gRFRSX0NPTlRST0xfRU5BQkxFOwoJCWxwZGNiLT5mUnRzQ29udHJvbCA9IFJUU19DT05UUk9MX0VOQUJMRTsKCQlicmVhazsKCWNhc2UgJ1gnOgoJCWxwZGNiLT5mSW5YID0gVFJVRTsKCQlscGRjYi0+Zk91dFggPSBUUlVFOwoJCWxwZGNiLT5mT3V0eEN0c0Zsb3cgPSBGQUxTRTsKCQlscGRjYi0+Zk91dHhEc3JGbG93ID0gRkFMU0U7CgkJbHBkY2ItPmZEdHJDb250cm9sID0gRFRSX0NPTlRST0xfRU5BQkxFOwoJCWxwZGNiLT5mUnRzQ29udHJvbCA9IFJUU19DT05UUk9MX0VOQUJMRTsKCQlicmVhazsKCWNhc2UgJ1AnOgoJCWxwZGNiLT5mSW5YID0gRkFMU0U7CgkJbHBkY2ItPmZPdXRYID0gRkFMU0U7CgkJbHBkY2ItPmZPdXR4Q3RzRmxvdyA9IFRSVUU7CgkJbHBkY2ItPmZPdXR4RHNyRmxvdyA9IFRSVUU7CgkJbHBkY2ItPmZEdHJDb250cm9sID0gRFRSX0NPTlRST0xfSEFORFNIQUtFOwoJCWxwZGNiLT5mUnRzQ29udHJvbCA9IFJUU19DT05UUk9MX0hBTkRTSEFLRTsKCQlicmVhazsKCWRlZmF1bHQ6CgkJcmV0dXJuIEZBTFNFOwoJfQoKCS8qIFRoaXMgc2hvdWxkIGJlIHRoZSBlbmQgb2YgdGhlIHN0cmluZy4gKi8KCWlmKCpkZXZpY2UpIHJldHVybiBGQUxTRTsKCQoJcmV0dXJuIFRSVUU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgQ09NTV9CdWlsZE5ld0NvbW1EQ0IgICAoSW50ZXJuYWwpCiAqCiAqICBCdWlsZCBhIERDQiB1c2luZyB0aGUgbmV3IHN0eWxlIHNldHRpbmdzIHN0cmluZy4KICogICBlZzogImJhdWQ9OTYwMCBwYXJpdHk9biBkYXRhPTggc3RvcD0xIHhvbj1vbiB0bz1vbiIKICovCnN0YXRpYyBCT09MIENPTU1fQnVpbGROZXdDb21tRENCKExQQ1dTVFIgZGV2aWNlLCBMUERDQiBscGRjYiwgTFBDT01NVElNRU9VVFMgbHB0aW1lb3V0cykKewoJRFdPUkQgdGVtcDsKCUJPT0wgYmF1ZCA9IEZBTFNFLCBzdG9wID0gRkFMU0U7CglzdGF0aWMgY29uc3QgV0NIQVIgYmF1ZFdbXSA9IHsnYicsJ2EnLCd1JywnZCcsJz0nLDB9OwoJc3RhdGljIGNvbnN0IFdDSEFSIHBhcml0eVdbXSA9IHsncCcsJ2EnLCdyJywnaScsJ3QnLCd5JywnPScsMH07CglzdGF0aWMgY29uc3QgV0NIQVIgZGF0YVdbXSA9IHsnZCcsJ2EnLCd0JywnYScsJz0nLDB9OwoJc3RhdGljIGNvbnN0IFdDSEFSIHN0b3BXW10gPSB7J3MnLCd0JywnbycsJ3AnLCc9JywwfTsKCXN0YXRpYyBjb25zdCBXQ0hBUiB0b1dbXSA9IHsndCcsJ28nLCc9JywwfTsKCXN0YXRpYyBjb25zdCBXQ0hBUiB4b25XW10gPSB7J3gnLCdvJywnbicsJz0nLDB9OwoJc3RhdGljIGNvbnN0IFdDSEFSIG9kc3JXW10gPSB7J28nLCdkJywncycsJ3InLCc9JywwfTsKCXN0YXRpYyBjb25zdCBXQ0hBUiBvY3RzV1tdID0geydvJywnYycsJ3QnLCdzJywnPScsMH07CglzdGF0aWMgY29uc3QgV0NIQVIgZHRyV1tdID0geydkJywndCcsJ3InLCc9JywwfTsKCXN0YXRpYyBjb25zdCBXQ0hBUiBydHNXW10gPSB7J3InLCd0JywncycsJz0nLDB9OwoJc3RhdGljIGNvbnN0IFdDSEFSIGlkc3JXW10gPSB7J2knLCdkJywncycsJ3InLCc9JywwfTsKCgl3aGlsZSgqZGV2aWNlKQoJewoJCXdoaWxlKCpkZXZpY2UgPT0gJyAnKSBkZXZpY2UrKzsKCgkJaWYoIXN0cm5jbXBpVyhiYXVkVywgZGV2aWNlLCA1KSkKCQl7CgkJCWJhdWQgPSBUUlVFOwoJCQkKCQkJaWYoIShkZXZpY2UgPSBDT01NX1BhcnNlTnVtYmVyKGRldmljZSArIDUsICZscGRjYi0+QmF1ZFJhdGUpKSkKCQkJCXJldHVybiBGQUxTRTsKCQl9CgkJZWxzZSBpZighc3RybmNtcGlXKHBhcml0eVcsIGRldmljZSwgNykpCgkJewoJCQlpZighKGRldmljZSA9IENPTU1fUGFyc2VQYXJpdHkoZGV2aWNlICsgNywgJmxwZGNiLT5QYXJpdHkpKSkKCQkJCXJldHVybiBGQUxTRTsKCQl9CgkJZWxzZSBpZighc3RybmNtcGlXKGRhdGFXLCBkZXZpY2UsIDUpKQoJCXsKCQkJaWYoIShkZXZpY2UgPSBDT01NX1BhcnNlQnl0ZVNpemUoZGV2aWNlICsgNSwgJmxwZGNiLT5CeXRlU2l6ZSkpKQoJCQkJcmV0dXJuIEZBTFNFOwoJCX0KCQllbHNlIGlmKCFzdHJuY21waVcoc3RvcFcsIGRldmljZSwgNSkpCgkJewoJCQlzdG9wID0gVFJVRTsKCQkJCgkJCWlmKCEoZGV2aWNlID0gQ09NTV9QYXJzZVN0b3BCaXRzKGRldmljZSArIDUsICZscGRjYi0+U3RvcEJpdHMpKSkKCQkJCXJldHVybiBGQUxTRTsKCQl9CgkJZWxzZSBpZighc3RybmNtcGlXKHRvVywgZGV2aWNlLCAzKSkKCQl7CgkJCWlmKCEoZGV2aWNlID0gQ09NTV9QYXJzZU9uT2ZmKGRldmljZSArIDMsICZ0ZW1wKSkpCgkJCQlyZXR1cm4gRkFMU0U7CgoJCQlscHRpbWVvdXRzLT5SZWFkSW50ZXJ2YWxUaW1lb3V0ID0gMDsKCQkJbHB0aW1lb3V0cy0+UmVhZFRvdGFsVGltZW91dE11bHRpcGxpZXIgPSAwOwoJCQlscHRpbWVvdXRzLT5SZWFkVG90YWxUaW1lb3V0Q29uc3RhbnQgPSAwOwoJCQlscHRpbWVvdXRzLT5Xcml0ZVRvdGFsVGltZW91dE11bHRpcGxpZXIgPSAwOwoJCQlscHRpbWVvdXRzLT5Xcml0ZVRvdGFsVGltZW91dENvbnN0YW50ID0gdGVtcCA/IDYwMDAwIDogMDsKCQl9CgkJZWxzZSBpZighc3RybmNtcGlXKHhvblcsIGRldmljZSwgNCkpCgkJewoJCQlpZighKGRldmljZSA9IENPTU1fUGFyc2VPbk9mZihkZXZpY2UgKyA0LCAmdGVtcCkpKQoJCQkJcmV0dXJuIEZBTFNFOwoKCQkJbHBkY2ItPmZPdXRYID0gdGVtcDsKCQkJbHBkY2ItPmZJblggPSB0ZW1wOwoJCX0KCQllbHNlIGlmKCFzdHJuY21waVcob2RzclcsIGRldmljZSwgNSkpCgkJewoJCQlpZighKGRldmljZSA9IENPTU1fUGFyc2VPbk9mZihkZXZpY2UgKyA1LCAmdGVtcCkpKQoJCQkJcmV0dXJuIEZBTFNFOwoKCQkJbHBkY2ItPmZPdXR4RHNyRmxvdyA9IHRlbXA7CgkJfQoJCWVsc2UgaWYoIXN0cm5jbXBpVyhvY3RzVywgZGV2aWNlLCA1KSkKCQl7CgkJCWlmKCEoZGV2aWNlID0gQ09NTV9QYXJzZU9uT2ZmKGRldmljZSArIDUsICZ0ZW1wKSkpCgkJCQlyZXR1cm4gRkFMU0U7CgoJCQlscGRjYi0+Zk91dHhDdHNGbG93ID0gdGVtcDsKCQl9CgkJZWxzZSBpZighc3RybmNtcGlXKGR0clcsIGRldmljZSwgNCkpCgkJewoJCQlpZighKGRldmljZSA9IENPTU1fUGFyc2VPbk9mZihkZXZpY2UgKyA0LCAmdGVtcCkpKQoJCQkJcmV0dXJuIEZBTFNFOwoKCQkJbHBkY2ItPmZEdHJDb250cm9sID0gdGVtcDsKCQl9CgkJZWxzZSBpZighc3RybmNtcGlXKHJ0c1csIGRldmljZSwgNCkpCgkJewoJCQlpZighKGRldmljZSA9IENPTU1fUGFyc2VPbk9mZihkZXZpY2UgKyA0LCAmdGVtcCkpKQoJCQkJcmV0dXJuIEZBTFNFOwoKCQkJbHBkY2ItPmZSdHNDb250cm9sID0gdGVtcDsKCQl9CgkJZWxzZSBpZighc3RybmNtcGlXKGlkc3JXLCBkZXZpY2UsIDUpKQoJCXsKCQkJaWYoIShkZXZpY2UgPSBDT01NX1BhcnNlT25PZmYoZGV2aWNlICsgNSwgJnRlbXApKSkKCQkJCXJldHVybiBGQUxTRTsKCgkJCS8qIFdpbiBOVCBzZXRzIHRoZSBmRHNyU2Vuc2l0aXZpdHkgbWVtYmVyIGJhc2VkIG9uIHRoZQoJCQkgICBpZHNyIHBhcmFtZXRlci4gIFdpbiA5eCBzZXRzIGZPdXR4RHNyRmxvdyBpbnN0ZWFkLiAqLwoJCQlscGRjYi0+ZkRzclNlbnNpdGl2aXR5ID0gdGVtcDsKCQl9CgkJZWxzZQoJCQlyZXR1cm4gRkFMU0U7CgoJCS8qIEFmdGVyIHRoZSBhYm92ZSBwYXJzaW5nLCB0aGUgbmV4dCBjaGFyYWN0ZXIgKGlmIG5vdCB0aGUgZW5kIG9mCgkJICAgdGhlIHN0cmluZykgc2hvdWxkIGJlIGEgc3BhY2UgKi8KCQlpZigqZGV2aWNlICYmICpkZXZpY2UgIT0gJyAnKQoJCQlyZXR1cm4gRkFMU0U7Cgl9CgoJLyogSWYgc3RvcCBiaXRzIHdlcmUgbm90IHNwZWNpZmllZCwgYSBkZWZhdWx0IGlzIGFsd2F5cyBzdXBwbGllZC4gKi8KCWlmKCFzdG9wKQoJewoJCWlmKGJhdWQgJiYgbHBkY2ItPkJhdWRSYXRlID09IDExMCkKCQkJbHBkY2ItPlN0b3BCaXRzID0gVFdPU1RPUEJJVFM7CgkJZWxzZQoJCQlscGRjYi0+U3RvcEJpdHMgPSBPTkVTVE9QQklUOwoJfQoKCXJldHVybiBUUlVFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICBCdWlsZENvbW1EQ0JBCQkoS0VSTkVMMzIuQCkKICoKICogIFVwZGF0ZXMgYSBkZXZpY2UgY29udHJvbCBibG9jayBkYXRhIHN0cnVjdHVyZSB3aXRoIHZhbHVlcyBmcm9tIGFuCiAqICBhc2NpaSBkZXZpY2UgY29udHJvbCBzdHJpbmcuICBUaGUgZGV2aWNlIGNvbnRyb2wgc3RyaW5nIGhhcyB0d28gZm9ybXMKICogIG5vcm1hbCBhbmQgZXh0ZW5kZWQsIGl0IG11c3QgYmUgZXhjbHVzaXZlbHkgaW4gb25lIG9yIHRoZSBvdGhlciBmb3JtLgogKgogKiBSRVRVUk5TCiAqCiAqICBUcnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIG9uIGEgbWFsZm9ybWVkIGNvbnRyb2wgc3RyaW5nLgogKi8KQk9PTCBXSU5BUEkgQnVpbGRDb21tRENCQSgKICAgIExQQ1NUUiBkZXZpY2UsIC8qIFtpbl0gVGhlIGFzY2lpIGRldmljZSBjb250cm9sIHN0cmluZyB1c2VkIHRvIHVwZGF0ZSB0aGUgRENCLiAqLwogICAgTFBEQ0IgIGxwZGNiKSAgLyogW291dF0gVGhlIGRldmljZSBjb250cm9sIGJsb2NrIHRvIGJlIHVwZGF0ZWQuICovCnsKCXJldHVybiBCdWlsZENvbW1EQ0JBbmRUaW1lb3V0c0EoZGV2aWNlLGxwZGNiLE5VTEwpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICBCdWlsZENvbW1EQ0JBbmRUaW1lb3V0c0EJCShLRVJORUwzMi5AKQogKgogKiAgVXBkYXRlcyBhIGRldmljZSBjb250cm9sIGJsb2NrIGRhdGEgc3RydWN0dXJlIHdpdGggdmFsdWVzIGZyb20gYW4KICogIGFzY2lpIGRldmljZSBjb250cm9sIHN0cmluZy4gIFRha2luZyB0aW1lb3V0IHZhbHVlcyBmcm9tIGEgdGltZW91dHMKICogIHN0cnVjdCBpZiBkZXNpcmVkIGJ5IHRoZSBjb250cm9sIHN0cmluZy4KICoKICogUkVUVVJOUwogKgogKiAgVHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBiYWQgaGFuZGxlcyBldGMuCiAqLwpCT09MIFdJTkFQSSBCdWlsZENvbW1EQ0JBbmRUaW1lb3V0c0EoCiAgICBMUENTVFIgICAgICAgICBkZXZpY2UsICAgICAvKiBbaW5dIFRoZSBhc2NpaSBkZXZpY2UgY29udHJvbCBzdHJpbmcuICovCiAgICBMUERDQiAgICAgICAgICBscGRjYiwgICAgICAvKiBbb3V0XSBUaGUgZGV2aWNlIGNvbnRyb2wgYmxvY2sgdG8gYmUgdXBkYXRlZC4gKi8KICAgIExQQ09NTVRJTUVPVVRTIGxwdGltZW91dHMpIC8qIFtpbl0gVGhlIENPTU1USU1FT1VUUyBzdHJ1Y3R1cmUgdG8gYmUgdXBkYXRlZC4gKi8KewoJQk9PTCByZXQgPSBGQUxTRTsKCVVOSUNPREVfU1RSSU5HIGRldmljZVc7CgoJVFJBQ0UoIiglcywlcCwlcClcbiIsZGV2aWNlLGxwZGNiLGxwdGltZW91dHMpOwoJaWYoZGV2aWNlKSBSdGxDcmVhdGVVbmljb2RlU3RyaW5nRnJvbUFzY2lpeigmZGV2aWNlVyxkZXZpY2UpOwoJZWxzZSBkZXZpY2VXLkJ1ZmZlciA9IE5VTEw7CgoJaWYoZGV2aWNlVy5CdWZmZXIpIHJldCA9IEJ1aWxkQ29tbURDQkFuZFRpbWVvdXRzVyhkZXZpY2VXLkJ1ZmZlcixscGRjYixscHRpbWVvdXRzKTsKCglSdGxGcmVlVW5pY29kZVN0cmluZygmZGV2aWNlVyk7CglyZXR1cm4gcmV0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICBCdWlsZENvbW1EQ0JBbmRUaW1lb3V0c1cJKEtFUk5FTDMyLkApCiAqCiAqICBVcGRhdGVzIGEgZGV2aWNlIGNvbnRyb2wgYmxvY2sgZGF0YSBzdHJ1Y3R1cmUgd2l0aCB2YWx1ZXMgZnJvbSBhCiAqICB1bmljb2RlIGRldmljZSBjb250cm9sIHN0cmluZy4gIFRha2luZyB0aW1lb3V0IHZhbHVlcyBmcm9tIGEgdGltZW91dHMKICogIHN0cnVjdCBpZiBkZXNpcmVkIGJ5IHRoZSBjb250cm9sIHN0cmluZy4KICoKICogUkVUVVJOUwogKgogKiAgVHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBiYWQgaGFuZGxlcyBldGMKICovCkJPT0wgV0lOQVBJIEJ1aWxkQ29tbURDQkFuZFRpbWVvdXRzVygKICAgIExQQ1dTVFIgICAgICAgIGRldmlkLCAgICAgIC8qIFtpbl0gVGhlIHVuaWNvZGUgZGV2aWNlIGNvbnRyb2wgc3RyaW5nLiAqLwogICAgTFBEQ0IgICAgICAgICAgbHBkY2IsICAgICAgLyogW291dF0gVGhlIGRldmljZSBjb250cm9sIGJsb2NrIHRvIGJlIHVwZGF0ZWQuICovCiAgICBMUENPTU1USU1FT1VUUyBscHRpbWVvdXRzKSAvKiBbaW5dIFRoZSBDT01NVElNRU9VVFMgc3RydWN0dXJlIHRvIGJlIHVwZGF0ZWQuICovCnsKCURDQiBkY2I7CglDT01NVElNRU9VVFMgdGltZW91dHM7CglCT09MIHJlc3VsdDsKCUxQQ1dTVFIgcHRyID0gZGV2aWQ7CgkKCVRSQUNFKCIoJXMsJXAsJXApXG4iLGRlYnVnc3RyX3coZGV2aWQpLGxwZGNiLGxwdGltZW91dHMpOwoKCS8qIFNldCBEQ0JsZW5ndGguIChXaW5kb3dzIE5UIGRvZXMgbm90IGRvIHRoaXMsIGJ1dCA5eCBkb2VzKSAqLwoJbHBkY2ItPkRDQmxlbmd0aCA9IHNpemVvZihEQ0IpOwoKCS8qIE1ha2UgYSBjb3B5IG9mIHRoZSBvcmlnaW5hbCBkYXRhIHN0cnVjdHVyZXMgdG8gd29yayB3aXRoIHNpbmNlIGlmCgkgICBpZiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgZGV2aWNlIGNvbnRyb2wgc3RyaW5nIHRoZSBvcmlnaW5hbHMKCSAgIHNob3VsZCBub3QgYmUgbW9kaWZpZWQgKGV4Y2VwdCBwb3NzaWJseSBEQ0JsZW5ndGgpICovCgltZW1jcHkoJmRjYiwgbHBkY2IsIHNpemVvZihEQ0IpKTsKCWlmKGxwdGltZW91dHMpIG1lbWNweSgmdGltZW91dHMsIGxwdGltZW91dHMsIHNpemVvZihDT01NVElNRU9VVFMpKTsKCglwdHIgPSBDT01NX1BhcnNlU3RhcnQocHRyKTsKCglpZihwdHIgPT0gTlVMTCkKCQlyZXN1bHQgPSBGQUxTRTsKCWVsc2UgaWYoc3RyY2hyVyhwdHIsICcsJykpCgkJcmVzdWx0ID0gQ09NTV9CdWlsZE9sZENvbW1EQ0IocHRyLCAmZGNiKTsKCWVsc2UKCQlyZXN1bHQgPSBDT01NX0J1aWxkTmV3Q29tbURDQihwdHIsICZkY2IsICZ0aW1lb3V0cyk7CgoJaWYocmVzdWx0KQoJewoJCW1lbWNweShscGRjYiwgJmRjYiwgc2l6ZW9mKERDQikpOwoJCWlmKGxwdGltZW91dHMpIG1lbWNweShscHRpbWVvdXRzLCAmdGltZW91dHMsIHNpemVvZihDT01NVElNRU9VVFMpKTsKCQlyZXR1cm4gVFJVRTsKCX0KCWVsc2UKCXsKCQlXQVJOKCJJbnZhbGlkIGRldmljZSBjb250cm9sIHN0cmluZzogJXNcbiIsIGRlYnVnc3RyX3coZGV2aWQpKTsKCQlTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwoJCXJldHVybiBGQUxTRTsKCX0JCn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgIEJ1aWxkQ29tbURDQlcJCShLRVJORUwzMi5AKQogKgogKiAgVXBkYXRlcyBhIGRldmljZSBjb250cm9sIGJsb2NrIHN0cnVjdHVyZSB3aXRoIHZhbHVlcyBmcm9tIGFuCiAqICB1bmljb2RlIGRldmljZSBjb250cm9sIHN0cmluZy4gIFRoZSBkZXZpY2UgY29udHJvbCBzdHJpbmcgaGFzIHR3byBmb3JtcwogKiAgbm9ybWFsIGFuZCBleHRlbmRlZCwgaXQgbXVzdCBiZSBleGNsdXNpdmVseSBpbiBvbmUgb3IgdGhlIG90aGVyIGZvcm0uCiAqCiAqIFJFVFVSTlMKICoKICogIFRydWUgb24gc3VjY2VzcywgZmFsc2Ugb24gYW4gbWFsZm9ybWVkIGNvbnRyb2wgc3RyaW5nLgogKi8KQk9PTCBXSU5BUEkgQnVpbGRDb21tRENCVygKICAgIExQQ1dTVFIgZGV2aWQsIC8qIFtpbl0gVGhlIHVuaWNvZGUgZGV2aWNlIGNvbnRyb2wgc3RyaW5nLiAqLwogICAgTFBEQ0IgICBscGRjYikgLyogW291dF0gVGhlIGRldmljZSBjb250cm9sIGJsb2NrIHRvIGJlIHVwZGF0ZWQuICovCnsKCXJldHVybiBCdWlsZENvbW1EQ0JBbmRUaW1lb3V0c1coZGV2aWQsbHBkY2IsTlVMTCk7Cn0KCnN0YXRpYyBCT09MIENPTU1fU2V0Q29tbUVycm9yKEhBTkRMRSBoYW5kbGUsIERXT1JEIGVycm9yKQp7CiAgICBEV09SRCByZXQ7CgogICAgU0VSVkVSX1NUQVJUX1JFUSggc2V0X3NlcmlhbF9pbmZvICkKICAgIHsKICAgICAgICByZXEtPmhhbmRsZSA9IGhhbmRsZTsKICAgICAgICByZXEtPmZsYWdzID0gU0VSSUFMSU5GT19TRVRfRVJST1I7CiAgICAgICAgcmVxLT5jb21tZXJyb3IgPSBlcnJvcjsKICAgICAgICByZXQgPSAhd2luZV9zZXJ2ZXJfY2FsbF9lcnIoIHJlcSApOwogICAgfQogICAgU0VSVkVSX0VORF9SRVE7CiAgICByZXR1cm4gcmV0Owp9CgpzdGF0aWMgQk9PTCBDT01NX0dldENvbW1FcnJvcihIQU5ETEUgaGFuZGxlLCBMUERXT1JEIGxwZXJyb3IpCnsKICAgIERXT1JEIHJldDsKCiAgICBpZighbHBlcnJvcikKICAgICAgICByZXR1cm4gRkFMU0U7CgogICAgU0VSVkVSX1NUQVJUX1JFUSggZ2V0X3NlcmlhbF9pbmZvICkKICAgIHsKICAgICAgICByZXEtPmhhbmRsZSA9IGhhbmRsZTsKICAgICAgICByZXQgPSAhd2luZV9zZXJ2ZXJfY2FsbF9lcnIoIHJlcSApOwogICAgICAgICpscGVycm9yID0gcmVwbHktPmNvbW1lcnJvcjsKICAgIH0KICAgIFNFUlZFUl9FTkRfUkVROwoKICAgIHJldHVybiByZXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglTZXRDb21tQnJlYWsJCShLRVJORUwzMi5AKQogKgogKiAgSGFsdHMgdGhlIHRyYW5zbWlzc2lvbiBvZiBjaGFyYWN0ZXJzIHRvIGEgY29tbXVuaWNhdGlvbnMgZGV2aWNlLgogKgogKiBSRVRVUk5TCiAqCiAqICBUcnVlIG9uIHN1Y2Nlc3MsIGFuZCBmYWxzZSBpZiB0aGUgY29tbXVuaWNhdGlvbnMgZGV2aWNlIGNvdWxkIG5vdCBiZSBmb3VuZCwKICogIHRoZSBjb250cm9sIGlzIG5vdCBzdXBwb3J0ZWQuCiAqCiAqIEJVR1MKICoKICogIE9ubHkgVElPQ1NCUksgYW5kIFRJT0NDQlJLIGFyZSBzdXBwb3J0ZWQuCiAqLwpCT09MIFdJTkFQSSBTZXRDb21tQnJlYWsoCiAgICBIQU5ETEUgaGFuZGxlKSAvKiBbaW5dIFRoZSBjb21tdW5pY3Rpb25zIGRldmljZSB0byBzdXNwZW5kLiAqLwp7CiNpZiBkZWZpbmVkKFRJT0NTQlJLKSAmJiBkZWZpbmVkKFRJT0NDQlJLKSAvKiBjaGVjayBpZiBhdmFpbGFibGUgZm9yIGNvbXBpbGF0aW9uICovCiAgICAgICAgaW50IGZkLHJlc3VsdDsKCglmZCA9IGdldF9jb21tX2ZkKCBoYW5kbGUsIEdFTkVSSUNfUkVBRCApOwoJaWYoZmQ8MCkgcmV0dXJuIEZBTFNFOwoJcmVzdWx0ID0gaW9jdGwoZmQsVElPQ1NCUkssMCk7CglyZWxlYXNlX2NvbW1fZmQoIGhhbmRsZSwgZmQgKTsKCWlmIChyZXN1bHQgPT0tMSkKCSAgewoJICAgICAgICBUUkFDRSgiaW9jdGwgZmFpbGVkXG4iKTsKCQlTZXRMYXN0RXJyb3IoRVJST1JfTk9UX1NVUFBPUlRFRCk7CgkJcmV0dXJuIEZBTFNFOwoJICB9CglyZXR1cm4gVFJVRTsKI2Vsc2UKCUZJWE1FKCJpb2N0bCBub3QgYXZhaWxhYmxlXG4iKTsKCVNldExhc3RFcnJvcihFUlJPUl9OT1RfU1VQUE9SVEVEKTsKCXJldHVybiBGQUxTRTsKI2VuZGlmCn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglDbGVhckNvbW1CcmVhawkJKEtFUk5FTDMyLkApCiAqCiAqICBSZXN1bWVzIGNoYXJhY3RlciB0cmFuc21pc3Npb24gZnJvbSBhIGNvbW11bmljYXRpb24gZGV2aWNlLgogKgogKiBSRVRVUk5TCiAqCiAqICBUcnVlIG9uIHN1Y2Nlc3MgYW5kIGZhbHNlIGlmIHRoZSBjb21tdW5pY2F0aW9ucyBkZXZpY2UgY291bGQgbm90IGJlIGZvdW5kLgogKgogKiBCVUdTCiAqCiAqICBPbmx5IFRJT0NTQlJLIGFuZCBUSU9DQ0JSSyBhcmUgc3VwcG9ydGVkLgogKi8KQk9PTCBXSU5BUEkgQ2xlYXJDb21tQnJlYWsoCiAgICBIQU5ETEUgaGFuZGxlKSAvKiBbaW5dIFRoZSBoYWx0ZWQgY29tbXVuaWNhdGlvbiBkZXZpY2Ugd2hvc2UgY2hhcmFjdGVyIHRyYW5zbWlzc2lvbiBpcyB0byBiZSByZXN1bWVkLiAqLwp7CiNpZiBkZWZpbmVkKFRJT0NTQlJLKSAmJiBkZWZpbmVkKFRJT0NDQlJLKSAvKiBjaGVjayBpZiBhdmFpbGFibGUgZm9yIGNvbXBpbGF0aW9uICovCiAgICAgICAgaW50IGZkLHJlc3VsdDsKCglmZCA9IGdldF9jb21tX2ZkKCBoYW5kbGUsIEdFTkVSSUNfUkVBRCApOwoJaWYoZmQ8MCkgcmV0dXJuIEZBTFNFOwoJcmVzdWx0ID0gaW9jdGwoZmQsVElPQ0NCUkssMCk7CglyZWxlYXNlX2NvbW1fZmQoIGhhbmRsZSwgZmQgKTsKCWlmIChyZXN1bHQgPT0tMSkKCSAgewoJICAgICAgICBUUkFDRSgiaW9jdGwgZmFpbGVkXG4iKTsKCQlTZXRMYXN0RXJyb3IoRVJST1JfTk9UX1NVUFBPUlRFRCk7CgkJcmV0dXJuIEZBTFNFOwoJICB9CglyZXR1cm4gVFJVRTsKI2Vsc2UKCUZJWE1FKCJpb2N0bCBub3QgYXZhaWxhYmxlXG4iKTsKCVNldExhc3RFcnJvcihFUlJPUl9OT1RfU1VQUE9SVEVEKTsKCXJldHVybiBGQUxTRTsKI2VuZGlmCn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglFc2NhcGVDb21tRnVuY3Rpb24JKEtFUk5FTDMyLkApCiAqCiAqICBEaXJlY3RzIGEgY29tbXVuaWNhdGlvbiBkZXZpY2UgdG8gcGVyZm9ybSBhbiBleHRlbmRlZCBmdW5jdGlvbi4KICoKICogUkVUVVJOUwogKgogKiAgVHJ1ZSBvciByZXF1ZXN0ZWQgZGF0YSBvbiBzdWNjZXNzZnVsIGNvbXBsZXRpb24gb2YgdGhlIGNvbW1hbmQsCiAqICBmYWxzZSBpZiB0aGUgZGV2aWNlIGlzIG5vdCBwcmVzZW50IGNhbm5vdCBleGVjdXRlIHRoZSBjb21tYW5kCiAqICBvciB0aGUgY29tbWFuZCBmYWlsZWQuCiAqLwpCT09MIFdJTkFQSSBFc2NhcGVDb21tRnVuY3Rpb24oCiAgICBIQU5ETEUgaGFuZGxlLCAgICAvKiBbaW5dIFRoZSBjb21tdW5pY2F0aW9uIGRldmljZSB0byBwZXJmb3JtIHRoZSBleHRlbmRlZCBmdW5jdGlvbi4gKi8KICAgIFVJTlQgICBuRnVuY3Rpb24pIC8qIFtpbl0gVGhlIGV4dGVuZGVkIGZ1bmN0aW9uIHRvIGJlIHBlcmZvcm1lZC4gKi8KewoJaW50IGZkLGRpcmVjdD1GQUxTRSxyZXN1bHQ9RkFMU0U7CglzdHJ1Y3QgdGVybWlvcwlwb3J0OwoKICAgIAlUUkFDRSgiaGFuZGxlICVwLCBmdW5jdGlvbj0lZFxuIiwgaGFuZGxlLCBuRnVuY3Rpb24pOwoJZmQgPSBnZXRfY29tbV9mZCggaGFuZGxlLCBHRU5FUklDX1JFQUQgKTsKCWlmKGZkPDApIHJldHVybiBGQUxTRTsKCglpZiAodGNnZXRhdHRyKGZkLCZwb3J0KSA9PSAtMSkgewoJCUNPTU1fU2V0Q29tbUVycm9yKGhhbmRsZSxDRV9JT0UpOwoJCXJlbGVhc2VfY29tbV9mZCggaGFuZGxlLCBmZCApOwoJCXJldHVybiBGQUxTRTsKCX0KCglzd2l0Y2ggKG5GdW5jdGlvbikgewoJCWNhc2UgUkVTRVRERVY6CgkJICAgICAgICBUUkFDRSgiXG4iKTsKCQkJYnJlYWs7CgoJCWNhc2UgQ0xSRFRSOgoJCSAgICAgICAgVFJBQ0UoIkNMUkRUUlxuIik7CiNpZmRlZiBUSU9DTV9EVFIKCQkJZGlyZWN0PVRSVUU7CgkJCXJlc3VsdD0gQ09NTV9XaGFja01vZGVtKGZkLCB+VElPQ01fRFRSLCAwKTsKCQkJYnJlYWs7CiNlbmRpZgoKCQljYXNlIENMUlJUUzoKCQkgICAgICAgIFRSQUNFKCJDTFJSVFNcbiIpOwojaWZkZWYgVElPQ01fUlRTCgkJCWRpcmVjdD1UUlVFOwoJCQlyZXN1bHQ9IENPTU1fV2hhY2tNb2RlbShmZCwgflRJT0NNX1JUUywgMCk7CgkJCWJyZWFrOwojZW5kaWYKCgkJY2FzZSBTRVREVFI6CgkJICAgICAgICBUUkFDRSgiU0VURFRSXG4iKTsKI2lmZGVmIFRJT0NNX0RUUgoJCQlkaXJlY3Q9VFJVRTsKCQkJcmVzdWx0PSBDT01NX1doYWNrTW9kZW0oZmQsIDAsIFRJT0NNX0RUUik7CgkJCWJyZWFrOwojZW5kaWYKCgkJY2FzZSBTRVRSVFM6CgkJICAgICAgICBUUkFDRSgiU0VUUlRTXG4iKTsKI2lmZGVmIFRJT0NNX1JUUwoJCQlkaXJlY3Q9VFJVRTsKCQkJcmVzdWx0PSBDT01NX1doYWNrTW9kZW0oZmQsIDAsIFRJT0NNX1JUUyk7CgkJCWJyZWFrOwojZW5kaWYKCgkJY2FzZSBTRVRYT0ZGOgoJCSAgICAgICAgVFJBQ0UoIlNFVFhPRkZcbiIpOwoJCQlwb3J0LmNfaWZsYWcgfD0gSVhPRkY7CgkJCWJyZWFrOwoKCQljYXNlIFNFVFhPTjoKCQkgICAgICAgIFRSQUNFKCJTRVRYT05cbiIpOwoJCQlwb3J0LmNfaWZsYWcgfD0gSVhPTjsKCQkJYnJlYWs7CgkJY2FzZSBTRVRCUkVBSzoKCQkJVFJBQ0UoInNldGJyZWFrXG4iKTsKI2lmZGVmIAlUSU9DU0JSSwoJCQlkaXJlY3Q9VFJVRTsKCQkJcmVzdWx0ID0gaW9jdGwoZmQsVElPQ1NCUkssMCk7CgkJCWJyZWFrOwojZW5kaWYKCQljYXNlIENMUkJSRUFLOgoJCQlUUkFDRSgiY2xyYnJlYWtcbiIpOwojaWZkZWYgCVRJT0NTQlJLCgkJCWRpcmVjdD1UUlVFOwoJCQlyZXN1bHQgPSBpb2N0bChmZCxUSU9DQ0JSSywwKTsKCQkJYnJlYWs7CiNlbmRpZgoJCWRlZmF1bHQ6CgkJCVdBUk4oIihoYW5kbGU9JXAsbkZ1bmN0aW9uPSVkKTogVW5rbm93biBmdW5jdGlvblxuIiwKCQkJaGFuZGxlLCBuRnVuY3Rpb24pOwoJCQlicmVhazsKCX0KCglpZiAoIWRpcmVjdCkKCSAgaWYgKHRjc2V0YXR0cihmZCwgVENTQURSQUlOLCAmcG9ydCkgPT0gLTEpIHsKCQlyZWxlYXNlX2NvbW1fZmQoIGhhbmRsZSwgZmQgKTsKCQlDT01NX1NldENvbW1FcnJvcihoYW5kbGUsQ0VfSU9FKTsKCQlyZXR1cm4gRkFMU0U7CgkgIH0gZWxzZQoJICAgICAgICByZXN1bHQ9IFRSVUU7CgllbHNlCgkgIHsKCSAgICBpZiAocmVzdWx0ID09IC0xKQoJICAgICAgewoJCXJlc3VsdD0gRkFMU0U7CgkJQ09NTV9TZXRDb21tRXJyb3IoaGFuZGxlLENFX0lPRSk7CgkgICAgICB9CgkgICAgZWxzZQoJICAgICAgcmVzdWx0ID0gVFJVRTsKCSAgfQoJcmVsZWFzZV9jb21tX2ZkKCBoYW5kbGUsIGZkICk7CglyZXR1cm4gcmVzdWx0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBQdXJnZUNvbW0gICAgICAgIChLRVJORUwzMi5AKQogKgogKiAgVGVybWluYXRlcyBwZW5kaW5nIG9wZXJhdGlvbnMgYW5kL29yIGRpc2NhcmRzIGJ1ZmZlcnMgb24gYQogKiAgY29tbXVuaWNhdGlvbiByZXNvdXJjZS4KICoKICogUkVUVVJOUwogKgogKiAgVHJ1ZSBvbiBzdWNjZXNzIGFuZCBmYWxzZSBpZiB0aGUgY29tbXVuaWNhdGlvbnMgaGFuZGxlIGlzIGJhZC4KICovCkJPT0wgV0lOQVBJIFB1cmdlQ29tbSgKICAgIEhBTkRMRSBoYW5kbGUsIC8qIFtpbl0gVGhlIGNvbW11bmljYXRpb24gcmVzb3VyY2UgdG8gYmUgcHVyZ2VkLiAqLwogICAgRFdPUkQgIGZsYWdzKSAgLyogW2luXSBGbGFncyBmb3IgY2xlYXIgcGVuZGluZy9idWZmZXIgb24gaW5wdXQvb3V0cHV0LiAqLwp7CiAgICAgaW50IGZkOwoKICAgICBUUkFDRSgiaGFuZGxlICVwLCBmbGFncyAlbHhcbiIsIGhhbmRsZSwgZmxhZ3MpOwoKICAgICBmZCA9IGdldF9jb21tX2ZkKCBoYW5kbGUsIEdFTkVSSUNfUkVBRCApOwogICAgIGlmKGZkPDApIHJldHVybiBGQUxTRTsKCiAgICAgLyoKICAgICAqKiBub3QgZXhhY3RseSBzdXJlIGhvdyB0aGVzZSBhcmUgZGlmZmVyZW50CiAgICAgKiogUGVyaGFwcyBpZiB3ZSBoYWQgb3VyIG93biBpbnRlcm5hbCBxdWV1ZXMsIG9uZSBmbHVzaGVzIHRoZW0KICAgICAqKiBhbmQgdGhlIG90aGVyIGZsdXNoZXMgdGhlIGtlcm5lbCdzIGJ1ZmZlcnMuCiAgICAgKi8KICAgICBpZihmbGFncyZQVVJHRV9UWEFCT1JUKQogICAgICAgICB0Y2ZsdXNoKGZkLFRDT0ZMVVNIKTsKICAgICBpZihmbGFncyZQVVJHRV9SWEFCT1JUKQogICAgICAgICB0Y2ZsdXNoKGZkLFRDSUZMVVNIKTsKICAgICBpZihmbGFncyZQVVJHRV9UWENMRUFSKQogICAgICAgICB0Y2ZsdXNoKGZkLFRDT0ZMVVNIKTsKICAgICBpZihmbGFncyZQVVJHRV9SWENMRUFSKQogICAgICAgICB0Y2ZsdXNoKGZkLFRDSUZMVVNIKTsKICAgICByZWxlYXNlX2NvbW1fZmQoIGhhbmRsZSwgZmQgKTsKCiAgICAgcmV0dXJuIDE7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglDbGVhckNvbW1FcnJvcgkoS0VSTkVMMzIuQCkKICoKICogIEVuYWJsZXMgZnVydGhlciBJL08gb3BlcmF0aW9ucyBvbiBhIGNvbW11bmljYXRpb25zIHJlc291cmNlIGFmdGVyCiAqICBzdXBwbHlpbmcgZXJyb3IgYW5kIGN1cnJlbnQgc3RhdHVzIGluZm9ybWF0aW9uLgogKgogKiBSRVRVUk5TCiAqCiAqICBUcnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIGlmIHRoZSBjb21tdW5pY2F0aW9uIHJlc291cmNlIGhhbmRsZSBpcyBiYWQuCiAqLwpCT09MIFdJTkFQSSBDbGVhckNvbW1FcnJvcigKICAgIEhBTkRMRSAgICBoYW5kbGUsIC8qIFtpbl0gVGhlIGNvbW11bmljYXRpb24gcmVzb3VyY2Ugd2l0aCB0aGUgZXJyb3IuICovCiAgICBMUERXT1JEICAgZXJyb3JzLCAvKiBbb3V0XSBGbGFncyBpbmRpY2F0aW5nIGVycm9yIHRoZSByZXNvdXJjZSBleHBlcmllbmNlZC4gKi8KICAgIExQQ09NU1RBVCBscFN0YXQpIC8qIFtvdXRdIFRoZSBzdGF0dXMgb2YgdGhlIGNvbW11bmljYXRpb24gcmVzb3VyY2UuICovCnsKICAgIGludCBmZDsKCiAgICBmZD1nZXRfY29tbV9mZCggaGFuZGxlLCBHRU5FUklDX1JFQUQgKTsKICAgIGlmKDA+ZmQpIHJldHVybiBGQUxTRTsKCiAgICBpZiAobHBTdGF0KQogICAgewogICAgICAgIGxwU3RhdC0+ZkN0c0hvbGQgPSAwOwoJbHBTdGF0LT5mRHNySG9sZCA9IDA7CglscFN0YXQtPmZSbHNkSG9sZCA9IDA7CglscFN0YXQtPmZYb2ZmSG9sZCA9IDA7CglscFN0YXQtPmZYb2ZmU2VudCA9IDA7CglscFN0YXQtPmZFb2YgPSAwOwoJbHBTdGF0LT5mVHhpbSA9IDA7CglscFN0YXQtPmZSZXNlcnZlZCA9IDA7CgojaWZkZWYgVElPQ09VVFEKCWlmKGlvY3RsKGZkLCBUSU9DT1VUUSwgJmxwU3RhdC0+Y2JPdXRRdWUpKQoJICAgIFdBUk4oImlvY3RsIHJldHVybmVkIGVycm9yXG4iKTsKI2Vsc2UKCWxwU3RhdC0+Y2JPdXRRdWUgPSAwOyAvKiBGSVhNRTogZmluZCBhIGRpZmZlcmVudCB3YXkgdG8gZmluZCBvdXQgKi8KI2VuZGlmCgojaWZkZWYgVElPQ0lOUQoJaWYoaW9jdGwoZmQsIFRJT0NJTlEsICZscFN0YXQtPmNiSW5RdWUpKQoJICAgIFdBUk4oImlvY3RsIHJldHVybmVkIGVycm9yXG4iKTsKI2VuZGlmCgoJVFJBQ0UoImhhbmRsZSAlcCBjYkluUXVlID0gJWxkIGNiT3V0UXVlID0gJWxkXG4iLAoJICAgICAgaGFuZGxlLCBscFN0YXQtPmNiSW5RdWUsIGxwU3RhdC0+Y2JPdXRRdWUpOwogICAgfQoKICAgIHJlbGVhc2VfY29tbV9mZCggaGFuZGxlLCBmZCApOwoKICAgIENPTU1fR2V0Q29tbUVycm9yKGhhbmRsZSwgZXJyb3JzKTsKICAgIENPTU1fU2V0Q29tbUVycm9yKGhhbmRsZSwgMCk7CgogICAgcmV0dXJuIFRSVUU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIFNldHVwQ29tbSAgICAgICAoS0VSTkVMMzIuQCkKICoKICogIENhbGxlZCBhZnRlciBDcmVhdGVGaWxlIHRvIGhpbnQgdG8gdGhlIGNvbW11bmljYXRpb24gcmVzb3VyY2UgdG8gdXNlCiAqICBzcGVjaWZpZWQgc2l6ZXMgZm9yIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVycyByYXRoZXIgdGhhbiB0aGUgZGVmYXVsdCB2YWx1ZXMuCiAqCiAqIFJFVFVSTlMKICoKICogIFRydWUgaWYgc3VjY2Vzc2Z1bCwgZmFsc2UgaWYgdGhlIGNvbW11bmljYXRpb25zIHJlc291cmNlIGhhbmRsZSBpcyBiYWQuCiAqCiAqIEJVR1MKICoKICogIFN0dWIuCiAqLwpCT09MIFdJTkFQSSBTZXR1cENvbW0oCiAgICBIQU5ETEUgaGFuZGxlLCAgLyogW2luXSBUaGUganVzdCBjcmVhdGVkIGNvbW11bmljYXRpb24gcmVzb3VyY2UgaGFuZGxlLiAqLwogICAgRFdPUkQgIGluc2l6ZSwgIC8qIFtpbl0gVGhlIHN1Z2dlc3RlZCBzaXplIG9mIHRoZSBjb21tdW5pY2F0aW9uIHJlc291cmNlcyBpbnB1dCBidWZmZXIgaW4gYnl0ZXMuICovCiAgICBEV09SRCAgb3V0c2l6ZSkgLyogW2luXSBUaGUgc3VnZ2VzdGVkIHNpemUgb2YgdGhlIGNvbW11bmljYXRpb24gcmVzb3VyY2VzIG91dHB1dCBidWZmZXIgaW4gYnl0ZXMuICovCnsKICAgIGludCBmZDsKCiAgICBGSVhNRSgiaW5zaXplICVsZCBvdXRzaXplICVsZCB1bmltcGxlbWVudGVkIHN0dWJcbiIsIGluc2l6ZSwgb3V0c2l6ZSk7CiAgICBmZD1nZXRfY29tbV9mZCggaGFuZGxlLCBHRU5FUklDX1JFQUQgKTsKICAgIGlmKDA+ZmQpIHJldHVybiBGQUxTRTsKICAgIHJlbGVhc2VfY29tbV9mZCggaGFuZGxlLCBmZCApOwogICAgcmV0dXJuIFRSVUU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglHZXRDb21tTWFzawkoS0VSTkVMMzIuQCkKICoKICogIE9idGFpbiB0aGUgZXZlbnRzIGFzc29jaWF0ZWQgd2l0aCBhIGNvbW11bmljYXRpb24gZGV2aWNlIHRoYXQgd2lsbCBjYXVzZQogKiAgYSBjYWxsIFdhaXRDb21tRXZlbnQgdG8gcmV0dXJuLgogKgogKiAgUkVUVVJOUwogKgogKiAgIFRydWUgb24gc3VjY2VzcywgZmFpbCBvbiBiYWQgZGV2aWNlIGhhbmRsZSBldGMuCiAqLwpCT09MIFdJTkFQSSBHZXRDb21tTWFzaygKICAgIEhBTkRMRSAgaGFuZGxlLCAgLyogW2luXSBUaGUgY29tbXVuaWNhdGlvbnMgZGV2aWNlLiAqLwogICAgTFBEV09SRCBldnRtYXNrKSAvKiBbb3V0XSBUaGUgZXZlbnRzIHdoaWNoIGNhdXNlIFdhaXRDb21tRXZlbnQgdG8gcmV0dXJuLiAqLwp7CiAgICBCT09MIHJldDsKCiAgICBUUkFDRSgiaGFuZGxlICVwLCBtYXNrICVwXG4iLCBoYW5kbGUsIGV2dG1hc2spOwoKICAgIFNFUlZFUl9TVEFSVF9SRVEoIGdldF9zZXJpYWxfaW5mbyApCiAgICB7CiAgICAgICAgcmVxLT5oYW5kbGUgPSBoYW5kbGU7CiAgICAgICAgaWYgKChyZXQgPSAhd2luZV9zZXJ2ZXJfY2FsbF9lcnIoIHJlcSApKSkKICAgICAgICB7CiAgICAgICAgICAgIGlmIChldnRtYXNrKSAqZXZ0bWFzayA9IHJlcGx5LT5ldmVudG1hc2s7CiAgICAgICAgfQogICAgfQogICAgU0VSVkVSX0VORF9SRVE7CiAgICByZXR1cm4gcmV0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJU2V0Q29tbU1hc2sJKEtFUk5FTDMyLkApCiAqCiAqICBUaGVyZSBiZSBzb21lIHRoaW5ncyB3ZSBuZWVkIHRvIGhlYXIgYWJvdXQgeW9uIHRoZXJlIGNvbW11bmljYXRpb25zIGRldmljZS4KICogIChTZXQgd2hpY2ggZXZlbnRzIGFzc29jaWF0ZWQgd2l0aCBhIGNvbW11bmljYXRpb24gZGV2aWNlIHNob3VsZCBjYXVzZQogKiAgYSBjYWxsIFdhaXRDb21tRXZlbnQgdG8gcmV0dXJuLikKICoKICogUkVUVVJOUwogKgogKiAgVHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvbiBiYWQgaGFuZGxlIGV0Yy4KICovCkJPT0wgV0lOQVBJIFNldENvbW1NYXNrKAogICAgSEFORExFIGhhbmRsZSwgIC8qIFtpbl0gVGhlIGNvbW11bmljYXRpb25zIGRldmljZS4gICovCiAgICBEV09SRCAgZXZ0bWFzaykgLyogW2luXSBUaGUgZXZlbnRzIHRoYXQgYXJlIHRvIGJlIG1vbml0b3JlZC4gKi8KewogICAgQk9PTCByZXQ7CgogICAgVFJBQ0UoImhhbmRsZSAlcCwgbWFzayAlbHhcbiIsIGhhbmRsZSwgZXZ0bWFzayk7CgogICAgU0VSVkVSX1NUQVJUX1JFUSggc2V0X3NlcmlhbF9pbmZvICkKICAgIHsKICAgICAgICByZXEtPmhhbmRsZSAgICA9IGhhbmRsZTsKICAgICAgICByZXEtPmZsYWdzICAgICA9IFNFUklBTElORk9fU0VUX01BU0s7CiAgICAgICAgcmVxLT5ldmVudG1hc2sgPSBldnRtYXNrOwogICAgICAgIHJldCA9ICF3aW5lX3NlcnZlcl9jYWxsX2VyciggcmVxICk7CiAgICB9CiAgICBTRVJWRVJfRU5EX1JFUTsKICAgIHJldHVybiByZXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglTZXRDb21tU3RhdGUgICAgKEtFUk5FTDMyLkApCiAqCiAqICBSZS1pbml0aWFsaXplcyBhbGwgaGFyZHdhcmUgYW5kIGNvbnRyb2wgc2V0dGluZ3Mgb2YgYSBjb21tdW5pY2F0aW9ucyBkZXZpY2UsCiAqICB3aXRoIHZhbHVlcyBmcm9tIGEgZGV2aWNlIGNvbnRyb2wgYmxvY2sgd2l0aG91dCBlZmZlY3RpbmcgdGhlIGlucHV0IGFuZCBvdXRwdXQKICogIHF1ZXVlcy4KICoKICogUkVUVVJOUwogKgogKiAgVHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvbiBmYWlsdXJlIGVnIGlmIHRoZSBYb25DaGFyIGlzIGVxdWFsIHRvIHRoZSBYb2ZmQ2hhci4KICovCkJPT0wgV0lOQVBJIFNldENvbW1TdGF0ZSgKICAgIEhBTkRMRSBoYW5kbGUsIC8qIFtpbl0gVGhlIGNvbW11bmljYXRpb25zIGRldmljZS4gKi8KICAgIExQRENCICBscGRjYikgIC8qIFtvdXRdIFRoZSBkZXZpY2UgY29udHJvbCBibG9jay4gKi8KewogICAgIHN0cnVjdCB0ZXJtaW9zIHBvcnQ7CiAgICAgaW50IGZkLCBieXRlc2l6ZSwgc3RvcGJpdHM7CiAgICAgQk9PTCByZXQ7CgogICAgIFRSQUNFKCJoYW5kbGUgJXAsIHB0ciAlcFxuIiwgaGFuZGxlLCBscGRjYik7CiAgICAgVFJBQ0UoImJ5dGVzaXplICVkIGJhdWRyYXRlICVsZCBmUGFyaXR5ICVkIFBhcml0eSAlZCBzdG9wYml0cyAlZFxuIiwKCSAgIGxwZGNiLT5CeXRlU2l6ZSxscGRjYi0+QmF1ZFJhdGUsbHBkY2ItPmZQYXJpdHksIGxwZGNiLT5QYXJpdHksCgkgICAobHBkY2ItPlN0b3BCaXRzID09IE9ORVNUT1BCSVQpPzE6CgkgICAobHBkY2ItPlN0b3BCaXRzID09IFRXT1NUT1BCSVRTKT8yOjApOwogICAgIFRSQUNFKCIlcyAlc1xuIiwobHBkY2ItPmZJblgpPyJJWE9OIjoifklYT04iLAoJICAgKGxwZGNiLT5mT3V0WCk/IklYT0ZGIjoifklYT0ZGIik7CiAgICAgVFJBQ0UoImZPdXR4Q3RzRmxvdyAlZCBmUnRzQ29udHJvbCAlZFxuIiwgbHBkY2ItPmZPdXR4Q3RzRmxvdywKICAgICAgICAgICAgIGxwZGNiLT5mUnRzQ29udHJvbCk7CiAgICAgVFJBQ0UoImZPdXR4RHNyRmxvdyAlZCBmRHRyQ29udHJvbCVkXG4iLCBscGRjYi0+Zk91dHhEc3JGbG93LAogICAgICAgICAgICAgbHBkY2ItPmZEdHJDb250cm9sKTsKICAgICAgICAgICAgIAoKICAgICBmZCA9IGdldF9jb21tX2ZkKCBoYW5kbGUsIEdFTkVSSUNfUkVBRCApOwogICAgIGlmIChmZCA8IDApIHJldHVybiBGQUxTRTsKCiAgICAgaWYgKCh0Y2dldGF0dHIoZmQsJnBvcnQpKSA9PSAtMSkgewogICAgICAgICBpbnQgc2F2ZV9lcnJvciA9IGVycm5vOwogICAgICAgICBDT01NX1NldENvbW1FcnJvcihoYW5kbGUsQ0VfSU9FKTsKICAgICAgICAgcmVsZWFzZV9jb21tX2ZkKCBoYW5kbGUsIGZkICk7CiAgICAgICAgIEVSUigidGNnZXRhdHRyIGVycm9yICclcydcbiIsIHN0cmVycm9yKHNhdmVfZXJyb3IpKTsKICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KCglwb3J0LmNfY2NbVk1JTl0gPSAwOwoJcG9ydC5jX2NjW1ZUSU1FXSA9IDE7CgojaWZkZWYgSU1BWEJFTAoJcG9ydC5jX2lmbGFnICY9IH4oSVNUUklQfEJSS0lOVHxJR05DUnxJQ1JOTHxJTkxDUnxJTUFYQkVMKTsKI2Vsc2UKCXBvcnQuY19pZmxhZyAmPSB+KElTVFJJUHxCUktJTlR8SUdOQ1J8SUNSTkx8SU5MQ1IpOwojZW5kaWYKCXBvcnQuY19pZmxhZyB8PSAoSUdOQlJLKTsKCglwb3J0LmNfb2ZsYWcgJj0gfihPUE9TVCk7CgoJcG9ydC5jX2NmbGFnICY9IH4oSFVQQ0wpOwoJcG9ydC5jX2NmbGFnIHw9IENMT0NBTCB8IENSRUFEOwoKCXBvcnQuY19sZmxhZyAmPSB+KElDQU5PTnxFQ0hPfElTSUcpOwoJcG9ydC5jX2xmbGFnIHw9IE5PRkxTSDsKCiNpZmRlZiBDQkFVRAoJcG9ydC5jX2NmbGFnICY9IH5DQkFVRDsKCXN3aXRjaCAobHBkY2ItPkJhdWRSYXRlKSB7CgkJY2FzZSAwOgoJCQlwb3J0LmNfY2ZsYWcgfD0gQjA7CgkJCWJyZWFrOwoJCWNhc2UgNTA6CgkJCXBvcnQuY19jZmxhZyB8PSBCNTA7CgkJCWJyZWFrOwoJCWNhc2UgNzU6CgkJCXBvcnQuY19jZmxhZyB8PSBCNzU7CgkJCWJyZWFrOwoJCWNhc2UgMTEwOgoJCWNhc2UgQ0JSXzExMDoKCQkJcG9ydC5jX2NmbGFnIHw9IEIxMTA7CgkJCWJyZWFrOwoJCWNhc2UgMTM0OgoJCQlwb3J0LmNfY2ZsYWcgfD0gQjEzNDsKCQkJYnJlYWs7CgkJY2FzZSAxNTA6CgkJCXBvcnQuY19jZmxhZyB8PSBCMTUwOwoJCQlicmVhazsKCQljYXNlIDIwMDoKCQkJcG9ydC5jX2NmbGFnIHw9IEIyMDA7CgkJCWJyZWFrOwoJCWNhc2UgMzAwOgoJCWNhc2UgQ0JSXzMwMDoKCQkJcG9ydC5jX2NmbGFnIHw9IEIzMDA7CgkJCWJyZWFrOwoJCWNhc2UgNjAwOgoJCWNhc2UgQ0JSXzYwMDoKCQkJcG9ydC5jX2NmbGFnIHw9IEI2MDA7CgkJCWJyZWFrOwoJCWNhc2UgMTIwMDoKCQljYXNlIENCUl8xMjAwOgoJCQlwb3J0LmNfY2ZsYWcgfD0gQjEyMDA7CgkJCWJyZWFrOwoJCWNhc2UgMTgwMDoKCQkJcG9ydC5jX2NmbGFnIHw9IEIxODAwOwoJCQlicmVhazsKCQljYXNlIDI0MDA6CgkJY2FzZSBDQlJfMjQwMDoKCQkJcG9ydC5jX2NmbGFnIHw9IEIyNDAwOwoJCQlicmVhazsKCQljYXNlIDQ4MDA6CgkJY2FzZSBDQlJfNDgwMDoKCQkJcG9ydC5jX2NmbGFnIHw9IEI0ODAwOwoJCQlicmVhazsKCQljYXNlIDk2MDA6CgkJY2FzZSBDQlJfOTYwMDoKCQkJcG9ydC5jX2NmbGFnIHw9IEI5NjAwOwoJCQlicmVhazsKCQljYXNlIDE5MjAwOgoJCWNhc2UgQ0JSXzE5MjAwOgoJCQlwb3J0LmNfY2ZsYWcgfD0gQjE5MjAwOwoJCQlicmVhazsKCQljYXNlIDM4NDAwOgoJCWNhc2UgQ0JSXzM4NDAwOgoJCQlwb3J0LmNfY2ZsYWcgfD0gQjM4NDAwOwoJCQlicmVhazsKI2lmZGVmIEI1NzYwMAoJCWNhc2UgNTc2MDA6CgkJCXBvcnQuY19jZmxhZyB8PSBCNTc2MDA7CgkJCWJyZWFrOwojZW5kaWYKI2lmZGVmIEIxMTUyMDAKCQljYXNlIDExNTIwMDoKCQkJcG9ydC5jX2NmbGFnIHw9IEIxMTUyMDA7CgkJCWJyZWFrOwojZW5kaWYKI2lmZGVmIEIyMzA0MDAKCQljYXNlIDIzMDQwMDoKCQkJcG9ydC5jX2NmbGFnIHw9IEIyMzA0MDA7CgkJCWJyZWFrOwojZW5kaWYKI2lmZGVmIEI0NjA4MDAKCQljYXNlIDQ2MDgwMDoKCQkJcG9ydC5jX2NmbGFnIHw9IEI0NjA4MDA7CgkJCWJyZWFrOwojZW5kaWYKICAgICAgIAkgICAgICAgIGRlZmF1bHQ6CiNpZiBkZWZpbmVkIChIQVZFX0xJTlVYX1NFUklBTF9IKSAmJiBkZWZpbmVkIChUSU9DU1NFUklBTCkKCQkJeyAgIHN0cnVjdCBzZXJpYWxfc3RydWN0IG51dHM7CgkJCSAgICBpbnQgYXJieTsKCQkJICAgIGlvY3RsKGZkLCBUSU9DR1NFUklBTCwgJm51dHMpOwoJCQkgICAgbnV0cy5jdXN0b21fZGl2aXNvciA9IG51dHMuYmF1ZF9iYXNlIC8gbHBkY2ItPkJhdWRSYXRlOwoJCQkgICAgaWYgKCEobnV0cy5jdXN0b21fZGl2aXNvcikpIG51dHMuY3VzdG9tX2Rpdmlzb3IgPSAxOwoJCQkgICAgYXJieSA9IG51dHMuYmF1ZF9iYXNlIC8gbnV0cy5jdXN0b21fZGl2aXNvcjsKCQkJICAgIG51dHMuZmxhZ3MgJj0gfkFTWU5DX1NQRF9NQVNLOwoJCQkgICAgbnV0cy5mbGFncyB8PSBBU1lOQ19TUERfQ1VTVDsKCQkJICAgIFdBUk4oIllvdSAob3IgYSBwcm9ncmFtIGFjdGluZyBhdCB5b3VyIGJlaGVzdCkgaGF2ZSBzcGVjaWZpZWRcbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImEgbm9uLXN0YW5kYXJkIGJhdWQgcmF0ZSAlbGQuICBXaW5lIHdpbGwgc2V0IHRoZSByYXRlIHRvICVkLFxuIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2hpY2ggaXMgYXMgY2xvc2UgYXMgd2UgY2FuIGdldCBieSBvdXIgcHJlc2VudCB1bmRlcnN0YW5kaW5nIG9mIHlvdXJcbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImhhcmR3YXJlLiBJIGhvcGUgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nLiAgQW55IGRpc3J1cHRpb24gV2luZVxuIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGFzIGNhdXNlZCB0byB5b3VyIGxpbnV4IHN5c3RlbSBjYW4gYmUgdW5kb25lIHdpdGggc2V0c2VyaWFsIFxuIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKHNlZSBtYW4gc2V0c2VyaWFsKS4gSWYgeW91IGhhdmUgaW5jYXBhY2l0YXRlZCBhIEhheWVzIHR5cGUgbW9kZW0sXG4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZXNldCBpdCBhbmQgaXQgd2lsbCBwcm9iYWJseSByZWNvdmVyLlxuIiwgbHBkY2ItPkJhdWRSYXRlLCBhcmJ5KTsKICAJCQkgICAgaW9jdGwoZmQsIFRJT0NTU0VSSUFMLCAmbnV0cyk7CgkJCSAgICBwb3J0LmNfY2ZsYWcgfD0gQjM4NDAwOwogCQkJfQogCQkJYnJlYWs7CiNlbmRpZiAgICAvKiBEb24ndCBoYXZlIGxpbnV4L3NlcmlhbC5oIG9yIGxhY2sgVElPQ1NTRVJJQUwgKi8KCgogICAgICAgICAgICAgICAgICAgICAgICBDT01NX1NldENvbW1FcnJvcihoYW5kbGUsSUVfQkFVRFJBVEUpOwogICAgICAgICAgICAgICAgICAgICAgICByZWxlYXNlX2NvbW1fZmQoIGhhbmRsZSwgZmQgKTsKCQkJRVJSKCJiYXVkcmF0ZSAlbGRcbiIsbHBkY2ItPkJhdWRSYXRlKTsKCQkJcmV0dXJuIEZBTFNFOwoJfQojZWxpZiAhZGVmaW5lZChfX0VNWF9fKQogICAgICAgIHN3aXRjaCAobHBkY2ItPkJhdWRSYXRlKSB7CiAgICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQuY19vc3BlZWQgPSBCMDsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDUwOgogICAgICAgICAgICAgICAgICAgICAgICBwb3J0LmNfb3NwZWVkID0gQjUwOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgNzU6CiAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQuY19vc3BlZWQgPSBCNzU7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAxMTA6CiAgICAgICAgICAgICAgICBjYXNlIENCUl8xMTA6CiAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQuY19vc3BlZWQgPSBCMTEwOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgMTM0OgogICAgICAgICAgICAgICAgICAgICAgICBwb3J0LmNfb3NwZWVkID0gQjEzNDsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDE1MDoKICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC5jX29zcGVlZCA9IEIxNTA7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAyMDA6CiAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQuY19vc3BlZWQgPSBCMjAwOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgMzAwOgogICAgICAgICAgICAgICAgY2FzZSBDQlJfMzAwOgogICAgICAgICAgICAgICAgICAgICAgICBwb3J0LmNfb3NwZWVkID0gQjMwMDsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDYwMDoKICAgICAgICAgICAgICAgIGNhc2UgQ0JSXzYwMDoKICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC5jX29zcGVlZCA9IEI2MDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAxMjAwOgogICAgICAgICAgICAgICAgY2FzZSBDQlJfMTIwMDoKICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC5jX29zcGVlZCA9IEIxMjAwOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgMTgwMDoKICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC5jX29zcGVlZCA9IEIxODAwOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgMjQwMDoKICAgICAgICAgICAgICAgIGNhc2UgQ0JSXzI0MDA6CiAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQuY19vc3BlZWQgPSBCMjQwMDsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDQ4MDA6CiAgICAgICAgICAgICAgICBjYXNlIENCUl80ODAwOgogICAgICAgICAgICAgICAgICAgICAgICBwb3J0LmNfb3NwZWVkID0gQjQ4MDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSA5NjAwOgogICAgICAgICAgICAgICAgY2FzZSBDQlJfOTYwMDoKICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC5jX29zcGVlZCA9IEI5NjAwOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgMTkyMDA6CiAgICAgICAgICAgICAgICBjYXNlIENCUl8xOTIwMDoKICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC5jX29zcGVlZCA9IEIxOTIwMDsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDM4NDAwOgogICAgICAgICAgICAgICAgY2FzZSBDQlJfMzg0MDA6CiAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQuY19vc3BlZWQgPSBCMzg0MDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwojaWZkZWYgQjU3NjAwCgkJY2FzZSA1NzYwMDoKCQljYXNlIENCUl81NzYwMDoKCQkJcG9ydC5jX2NmbGFnIHw9IEI1NzYwMDsKCQkJYnJlYWs7CiNlbmRpZgojaWZkZWYgQjExNTIwMAoJCWNhc2UgMTE1MjAwOgoJCWNhc2UgQ0JSXzExNTIwMDoKCQkJcG9ydC5jX2NmbGFnIHw9IEIxMTUyMDA7CgkJCWJyZWFrOwojZW5kaWYKI2lmZGVmIEIyMzA0MDAKCQljYXNlIDIzMDQwMDoKCQkJcG9ydC5jX2NmbGFnIHw9IEIyMzA0MDA7CgkJCWJyZWFrOwojZW5kaWYKI2lmZGVmIEI0NjA4MDAKCQljYXNlIDQ2MDgwMDoKCQkJcG9ydC5jX2NmbGFnIHw9IEI0NjA4MDA7CgkJCWJyZWFrOwojZW5kaWYKICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgIENPTU1fU2V0Q29tbUVycm9yKGhhbmRsZSxJRV9CQVVEUkFURSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlbGVhc2VfY29tbV9mZCggaGFuZGxlLCBmZCApOwoJCQlFUlIoImJhdWRyYXRlICVsZFxuIixscGRjYi0+QmF1ZFJhdGUpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgfQogICAgICAgIHBvcnQuY19pc3BlZWQgPSBwb3J0LmNfb3NwZWVkOwojZW5kaWYKICAgICAgICBieXRlc2l6ZT1scGRjYi0+Qnl0ZVNpemU7CiAgICAgICAgc3RvcGJpdHM9bHBkY2ItPlN0b3BCaXRzOwoKI2lmZGVmIENNU1BBUgoJcG9ydC5jX2NmbGFnICY9IH4oUEFSRU5CIHwgUEFST0REIHwgQ01TUEFSKTsKI2Vsc2UKCXBvcnQuY19jZmxhZyAmPSB+KFBBUkVOQiB8IFBBUk9ERCk7CiNlbmRpZgoJaWYgKGxwZGNiLT5mUGFyaXR5KQogICAgICAgICAgICBwb3J0LmNfaWZsYWcgfD0gSU5QQ0s7CiAgICAgICAgZWxzZQogICAgICAgICAgICBwb3J0LmNfaWZsYWcgJj0gfklOUENLOwogICAgICAgIHN3aXRjaCAobHBkY2ItPlBhcml0eSkgewogICAgICAgICAgICAgICAgY2FzZSBOT1BBUklUWToKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIE9ERFBBUklUWToKICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC5jX2NmbGFnIHw9IChQQVJFTkIgfCBQQVJPREQpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgRVZFTlBBUklUWToKICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC5jX2NmbGFnIHw9IFBBUkVOQjsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiNpZmRlZiBDTVNQQVIKICAgICAgICAgICAgICAgIC8qIExpbnV4IGRlZmluZXMgbWFyay9zcGFjZSAoc3RpY2spIHBhcml0eSAqLwogICAgICAgICAgICAgICAgY2FzZSBNQVJLUEFSSVRZOgogICAgICAgICAgICAgICAgICAgICAgICBwb3J0LmNfY2ZsYWcgfD0gKFBBUkVOQiB8IENNU1BBUik7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSBTUEFDRVBBUklUWToKICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC5jX2NmbGFnIHw9IChQQVJFTkIgfCBQQVJPREQgfCAgQ01TUEFSKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiNlbHNlCiAgICAgICAgICAgICAgICAvKiB0cnkgdGhlIFBPU0lYIHdheSAqLwogICAgICAgICAgICAgICAgY2FzZSBNQVJLUEFSSVRZOgogICAgICAgICAgICAgICAgICAgICAgICBpZiggc3RvcGJpdHMgPT0gT05FU1RPUEJJVCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcGJpdHMgPSBUV09TVE9QQklUUzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQuY19pZmxhZyAmPSB+SU5QQ0s7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT01NX1NldENvbW1FcnJvcihoYW5kbGUsSUVfQllURVNJWkUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsZWFzZV9jb21tX2ZkKCBoYW5kbGUsIGZkICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFUlIoIkNhbm5vdCBzZXQgTUFSSyBQYXJpdHlcbiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSBTUEFDRVBBUklUWToKICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGJ5dGVzaXplIDwgOCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXNpemUgKz0xOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC5jX2lmbGFnICY9IH5JTlBDSzsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTU1fU2V0Q29tbUVycm9yKGhhbmRsZSxJRV9CWVRFU0laRSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxlYXNlX2NvbW1fZmQoIGhhbmRsZSwgZmQgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSUigiQ2Fubm90IHNldCBTUEFDRSBQYXJpdHlcbiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwojZW5kaWYKICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgQ09NTV9TZXRDb21tRXJyb3IoaGFuZGxlLElFX0JZVEVTSVpFKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmVsZWFzZV9jb21tX2ZkKCBoYW5kbGUsIGZkICk7CgkJCUVSUigiUGFyaXR5XG4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgIH0KCgoJcG9ydC5jX2NmbGFnICY9IH5DU0laRTsKCXN3aXRjaCAoYnl0ZXNpemUpIHsKCQljYXNlIDU6CgkJCXBvcnQuY19jZmxhZyB8PSBDUzU7CgkJCWJyZWFrOwoJCWNhc2UgNjoKCQkJcG9ydC5jX2NmbGFnIHw9IENTNjsKCQkJYnJlYWs7CgkJY2FzZSA3OgoJCQlwb3J0LmNfY2ZsYWcgfD0gQ1M3OwoJCQlicmVhazsKCQljYXNlIDg6CgkJCXBvcnQuY19jZmxhZyB8PSBDUzg7CgkJCWJyZWFrOwoJCWRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgIENPTU1fU2V0Q29tbUVycm9yKGhhbmRsZSxJRV9CWVRFU0laRSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlbGVhc2VfY29tbV9mZCggaGFuZGxlLCBmZCApOwoJCQlFUlIoIkJ5dGVTaXplXG4iKTsKCQkJcmV0dXJuIEZBTFNFOwoJfQoKCXN3aXRjaCAoc3RvcGJpdHMpIHsKCQljYXNlIE9ORVNUT1BCSVQ6CgkJCQlwb3J0LmNfY2ZsYWcgJj0gfkNTVE9QQjsKCQkJCWJyZWFrOwoJCWNhc2UgT05FNVNUT1BCSVRTOiAvKiB3aWwgYmUgc2VsZWN0ZWQgaWYgYnl0ZXNpemUgaXMgNSAqLwoJCWNhc2UgVFdPU1RPUEJJVFM6CgkJCQlwb3J0LmNfY2ZsYWcgfD0gQ1NUT1BCOwoJCQkJYnJlYWs7CgkJZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgQ09NTV9TZXRDb21tRXJyb3IoaGFuZGxlLElFX0JZVEVTSVpFKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmVsZWFzZV9jb21tX2ZkKCBoYW5kbGUsIGZkICk7CgkJCUVSUigiU3RvcEJpdHNcbiIpOwoJCQlyZXR1cm4gRkFMU0U7Cgl9CiNpZmRlZiBDUlRTQ1RTCglpZiAoCWxwZGNiLT5mT3V0eEN0c0Zsb3cgCQkJfHwKCQlscGRjYi0+ZlJ0c0NvbnRyb2wgPT0gUlRTX0NPTlRST0xfSEFORFNIQUtFCgkpCgkgIHsKCSAgICBwb3J0LmNfY2ZsYWcgfD0gQ1JUU0NUUzsKCSAgICBUUkFDRSgiQ1JUU0NUU1xuIik7CgkgIH0KI2VuZGlmCgoJaWYgKGxwZGNiLT5mSW5YKQoJCXBvcnQuY19pZmxhZyB8PSBJWE9OOwoJZWxzZQoJCXBvcnQuY19pZmxhZyAmPSB+SVhPTjsKCWlmIChscGRjYi0+Zk91dFgpCgkJcG9ydC5jX2lmbGFnIHw9IElYT0ZGOwoJZWxzZQoJCXBvcnQuY19pZmxhZyAmPSB+SVhPRkY7CgoJaWYgKHRjc2V0YXR0cihmZCxUQ1NBTk9XLCZwb3J0KT09LTEpIHsgLyogb3RoZXJ3aXNlIGl0IGhhbmdzIHdpdGggcGVuZGluZyBpbnB1dCovCiAgICAgICAgICAgICAgICBFUlIoInRjc2V0YXR0ciBlcnJvciAnJXMnXG4iLCBzdHJlcnJvcihlcnJubykpOwogICAgICAgICAgICAgICAgQ09NTV9TZXRDb21tRXJyb3IoaGFuZGxlLENFX0lPRSk7CgkJcmV0ID0gRkFMU0U7Cgl9IGVsc2UgewogICAgICAgICAgICAgICAgQ09NTV9TZXRDb21tRXJyb3IoaGFuZGxlLDApOwoJCXJldCA9IFRSVUU7Cgl9CgogICAgICAgIC8qIG5vdGU6IGNoYW5nZSBEVFIvUlRTIGxpbmVzIGFmdGVyIHNldHRpbmcgdGhlIGNvbW0gYXR0cmlidXRlcywKICAgICAgICAgKiBzbyBmbG93IGNvbnRyb2wgZG9lcyBub3QgaW50ZXJmZXJlLiAqLwojaWZkZWYgVElPQ01fRFRSCglpZiAobHBkY2ItPmZEdHJDb250cm9sID09IERUUl9DT05UUk9MX0hBTkRTSEFLRSkKICAgICAgICB7CiAgICAgICAgICAgICBXQVJOKCJEU1IvRFRSIGZsb3cgY29udHJvbCBub3Qgc3VwcG9ydGVkXG4iKTsKCX0gZWxzZSBpZihscGRjYi0+ZkR0ckNvbnRyb2wgPT0gRFRSX0NPTlRST0xfRElTQUJMRSkKICAgICAgICAgICAgQ09NTV9XaGFja01vZGVtKGZkLCB+VElPQ01fRFRSLCAwKTsKICAgICAgICBlbHNlICAgIAogICAgICAgICAgICBDT01NX1doYWNrTW9kZW0oZmQsIDAsIFRJT0NNX0RUUik7CiNlbmRpZgojaWZkZWYgVElPQ01fUlRTCglpZighbHBkY2ItPmZPdXR4Q3RzRmxvdyApCiAgICAgICAgewogICAgICAgICAgICBpZihscGRjYi0+ZlJ0c0NvbnRyb2wgPT0gUlRTX0NPTlRST0xfRElTQUJMRSkKICAgICAgICAgICAgICAgIENPTU1fV2hhY2tNb2RlbShmZCwgflRJT0NNX1JUUywgMCk7CiAgICAgICAgICAgIGVsc2UgICAgCiAgICAgICAgICAgICAgICBDT01NX1doYWNrTW9kZW0oZmQsIDAsIFRJT0NNX1JUUyk7CiAgICAgICAgfQojZW5kaWYKICAgICAgICBpZihscGRjYi0+ZlJ0c0NvbnRyb2wgPT0gUlRTX0NPTlRST0xfVE9HR0xFKQogICAgICAgICAgICBGSVhNRSgiUlRTX0NPTlRST0xfVE9HR0xFIGlzIG5vdCBzdXBwb3J0ZWQuXG4iKTsKICAgICAgICByZWxlYXNlX2NvbW1fZmQoIGhhbmRsZSwgZmQgKTsKICAgICAgICByZXR1cm4gcmV0OwoKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglHZXRDb21tU3RhdGUJKEtFUk5FTDMyLkApCiAqCiAqICBGaWxscyBpbiBhIGRldmljZSBjb250cm9sIGJsb2NrIHdpdGggaW5mb3JtYXRpb24gZnJvbSBhIGNvbW11bmljYXRpb25zIGRldmljZS4KICoKICogUkVUVVJOUwogKgogKiAgVHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBpZiB0aGUgY29tbXVuaWNhdGlvbiBkZXZpY2UgaGFuZGxlIGlzIGJhZCBldGMKICoKICogQlVHUwogKgogKiAgWG9uQ2hhciBhbmQgWG9mZkNoYXIgYXJlIG5vdCBzZXQuCiAqLwpCT09MIFdJTkFQSSBHZXRDb21tU3RhdGUoCiAgICBIQU5ETEUgaGFuZGxlLCAvKiBbaW5dIFRoZSBjb21tdW5pY2F0aW9ucyBkZXZpY2UuICovCiAgICBMUERDQiAgbHBkY2IpICAvKiBbb3V0XSBUaGUgZGV2aWNlIGNvbnRyb2wgYmxvY2suICovCnsKICAgICBzdHJ1Y3QgdGVybWlvcyBwb3J0OwogICAgIGludCBmZCxzcGVlZDsKICAgICBpbnQgc3RhdCA9IERUUl9DT05UUk9MX0VOQUJMRSB8IFJUU19DT05UUk9MX0VOQUJMRTsKCiAgICAgVFJBQ0UoImhhbmRsZSAlcCwgcHRyICVwXG4iLCBoYW5kbGUsIGxwZGNiKTsKCiAgICAgZmQgPSBnZXRfY29tbV9mZCggaGFuZGxlLCBHRU5FUklDX1JFQUQgKTsKICAgICBpZiAoZmQgPCAwKSByZXR1cm4gRkFMU0U7CiAgICAgaWYgKHRjZ2V0YXR0cihmZCwgJnBvcnQpID09IC0xCiNpZmRlZiBUSU9DTUdFVAogICAgICAgICAgICAgfHwgaW9jdGwoZmQsIFRJT0NNR0VULCAmc3RhdCkgPT0gLTEKI2VuZGlmCiAgICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgIGludCBzYXZlX2Vycm9yPWVycm5vOwogICAgICAgICAgICAgICAgRVJSKCJ0Y2dldGF0dHIgb3IgaW9jdGwgZXJyb3IgJyVzJ1xuIiwgc3RyZXJyb3Ioc2F2ZV9lcnJvcikpOwogICAgICAgICAgICAgICAgQ09NTV9TZXRDb21tRXJyb3IoaGFuZGxlLENFX0lPRSk7CiAgICAgICAgICAgICAgICByZWxlYXNlX2NvbW1fZmQoIGhhbmRsZSwgZmQgKTsKCQlyZXR1cm4gRkFMU0U7Cgl9CiAgICAgcmVsZWFzZV9jb21tX2ZkKCBoYW5kbGUsIGZkICk7CiNpZm5kZWYgX19FTVhfXwojaWZkZWYgQ0JBVUQKICAgICBzcGVlZD0gKHBvcnQuY19jZmxhZyAmIENCQVVEKTsKI2Vsc2UKICAgICBzcGVlZD0gKGNmZ2V0b3NwZWVkKCZwb3J0KSk7CiNlbmRpZgogICAgIHN3aXRjaCAoc3BlZWQpIHsKCQljYXNlIEIwOgoJCQlscGRjYi0+QmF1ZFJhdGUgPSAwOwoJCQlicmVhazsKCQljYXNlIEI1MDoKCQkJbHBkY2ItPkJhdWRSYXRlID0gNTA7CgkJCWJyZWFrOwoJCWNhc2UgQjc1OgoJCQlscGRjYi0+QmF1ZFJhdGUgPSA3NTsKCQkJYnJlYWs7CgkJY2FzZSBCMTEwOgoJCQlscGRjYi0+QmF1ZFJhdGUgPSAxMTA7CgkJCWJyZWFrOwoJCWNhc2UgQjEzNDoKCQkJbHBkY2ItPkJhdWRSYXRlID0gMTM0OwoJCQlicmVhazsKCQljYXNlIEIxNTA6CgkJCWxwZGNiLT5CYXVkUmF0ZSA9IDE1MDsKCQkJYnJlYWs7CgkJY2FzZSBCMjAwOgoJCQlscGRjYi0+QmF1ZFJhdGUgPSAyMDA7CgkJCWJyZWFrOwoJCWNhc2UgQjMwMDoKCQkJbHBkY2ItPkJhdWRSYXRlID0gMzAwOwoJCQlicmVhazsKCQljYXNlIEI2MDA6CgkJCWxwZGNiLT5CYXVkUmF0ZSA9IDYwMDsKCQkJYnJlYWs7CgkJY2FzZSBCMTIwMDoKCQkJbHBkY2ItPkJhdWRSYXRlID0gMTIwMDsKCQkJYnJlYWs7CgkJY2FzZSBCMTgwMDoKCQkJbHBkY2ItPkJhdWRSYXRlID0gMTgwMDsKCQkJYnJlYWs7CgkJY2FzZSBCMjQwMDoKCQkJbHBkY2ItPkJhdWRSYXRlID0gMjQwMDsKCQkJYnJlYWs7CgkJY2FzZSBCNDgwMDoKCQkJbHBkY2ItPkJhdWRSYXRlID0gNDgwMDsKCQkJYnJlYWs7CgkJY2FzZSBCOTYwMDoKCQkJbHBkY2ItPkJhdWRSYXRlID0gOTYwMDsKCQkJYnJlYWs7CgkJY2FzZSBCMTkyMDA6CgkJCWxwZGNiLT5CYXVkUmF0ZSA9IDE5MjAwOwoJCQlicmVhazsKCQljYXNlIEIzODQwMDoKCQkJbHBkY2ItPkJhdWRSYXRlID0gMzg0MDA7CgkJCWJyZWFrOwojaWZkZWYgQjU3NjAwCgkJY2FzZSBCNTc2MDA6CgkJCWxwZGNiLT5CYXVkUmF0ZSA9IDU3NjAwOwoJCQlicmVhazsKI2VuZGlmCiNpZmRlZiBCMTE1MjAwCgkJY2FzZSBCMTE1MjAwOgoJCQlscGRjYi0+QmF1ZFJhdGUgPSAxMTUyMDA7CgkJCWJyZWFrOwojZW5kaWYKI2lmZGVmIEIyMzA0MDAKICAgICAgICAgICAgICAgIGNhc2UgQjIzMDQwMDoKCQkJbHBkY2ItPkJhdWRSYXRlID0gMjMwNDAwOwoJCQlicmVhazsKI2VuZGlmCiNpZmRlZiBCNDYwODAwCiAgICAgICAgICAgICAgICBjYXNlIEI0NjA4MDA6CgkJCWxwZGNiLT5CYXVkUmF0ZSA9IDQ2MDgwMDsKCQkJYnJlYWs7CiNlbmRpZgoJICAgICAgICBkZWZhdWx0OgoJCSAgICAgICAgRVJSKCJ1bmtub3duIHNwZWVkICV4IFxuIixzcGVlZCk7Cgl9CiNlbmRpZgoJc3dpdGNoIChwb3J0LmNfY2ZsYWcgJiBDU0laRSkgewoJCWNhc2UgQ1M1OgoJCQlscGRjYi0+Qnl0ZVNpemUgPSA1OwoJCQlicmVhazsKCQljYXNlIENTNjoKCQkJbHBkY2ItPkJ5dGVTaXplID0gNjsKCQkJYnJlYWs7CgkJY2FzZSBDUzc6CgkJCWxwZGNiLT5CeXRlU2l6ZSA9IDc7CgkJCWJyZWFrOwoJCWNhc2UgQ1M4OgoJCQlscGRjYi0+Qnl0ZVNpemUgPSA4OwoJCQlicmVhazsKCSAgICAgICAgZGVmYXVsdDoKCQkgICAgICAgIEVSUigidW5rbm93biBzaXplICV4IFxuIixwb3J0LmNfY2ZsYWcgJiBDU0laRSk7Cgl9CgogICAgICAgIGlmKHBvcnQuY19pZmxhZyAmIElOUENLKQogICAgICAgICAgICBscGRjYi0+ZlBhcml0eSA9IFRSVUU7CiAgICAgICAgZWxzZQogICAgICAgICAgICBscGRjYi0+ZlBhcml0eSA9IEZBTFNFOwojaWZkZWYgQ01TUEFSCglzd2l0Y2ggKHBvcnQuY19jZmxhZyAmIChQQVJFTkIgfCBQQVJPREQgfCBDTVNQQVIpKQojZWxzZQoJc3dpdGNoIChwb3J0LmNfY2ZsYWcgJiAoUEFSRU5CIHwgUEFST0REKSkKI2VuZGlmCgl7CgkJY2FzZSAwOgoJCQlscGRjYi0+UGFyaXR5ID0gTk9QQVJJVFk7CgkJCWJyZWFrOwoJCWNhc2UgUEFSRU5COgoJCQlscGRjYi0+UGFyaXR5ID0gRVZFTlBBUklUWTsKCQkJYnJlYWs7CgkJY2FzZSAoUEFSRU5CIHwgUEFST0REKToKCQkJbHBkY2ItPlBhcml0eSA9IE9ERFBBUklUWTsKCQkJYnJlYWs7CiNpZmRlZiBDTVNQQVIKCQljYXNlIChQQVJFTkIgfCBDTVNQQVIpOgoJCQlscGRjYi0+UGFyaXR5ID0gTUFSS1BBUklUWTsKCQkJYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIChQQVJFTkIgfCBQQVJPREQgfCBDTVNQQVIpOgoJCQlscGRjYi0+UGFyaXR5ID0gU1BBQ0VQQVJJVFk7CgkJCWJyZWFrOwojZW5kaWYKCX0KCglpZiAocG9ydC5jX2NmbGFnICYgQ1NUT1BCKQogICAgICAgICAgICBpZihscGRjYi0+Qnl0ZVNpemUgPT0gNSkKICAgICAgICAgICAgICAgIGxwZGNiLT5TdG9wQml0cyA9IE9ORTVTVE9QQklUUzsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgbHBkY2ItPlN0b3BCaXRzID0gVFdPU1RPUEJJVFM7CgllbHNlCiAgICAgICAgICAgIGxwZGNiLT5TdG9wQml0cyA9IE9ORVNUT1BCSVQ7CgoJbHBkY2ItPmZOdWxsID0gMDsKCWxwZGNiLT5mQmluYXJ5ID0gMTsKCgkvKiB0ZXJtaW9zIGRvZXMgbm90IHN1cHBvcnQgRFRSL0RTUiBmbG93IGNvbnRyb2wgKi8KCWxwZGNiLT5mT3V0eERzckZsb3cgPSAwOwoJbHBkY2ItPmZEdHJDb250cm9sID0KI2lmZGVmIFRJT0NNX0RUUgogICAgICAgICAgICAhKHN0YXQgJiBUSU9DTV9EVFIpID8gIERUUl9DT05UUk9MX0RJU0FCTEU6CiNlbmRpZgogICAgICAgICAgICAgICAgRFRSX0NPTlRST0xfRU5BQkxFICA7CgojaWZkZWYgQ1JUU0NUUwoKCWlmIChwb3J0LmNfY2ZsYWcgJiBDUlRTQ1RTKSB7CgkJbHBkY2ItPmZSdHNDb250cm9sID0gUlRTX0NPTlRST0xfSEFORFNIQUtFOwoJCWxwZGNiLT5mT3V0eEN0c0Zsb3cgPSAxOwoJfSBlbHNlCiNlbmRpZgoJewoJCWxwZGNiLT5mUnRzQ29udHJvbCA9IAojaWZkZWYgVElPQ01fUlRTCiAgICAgICAgICAgICAgICAgICAgIShzdGF0ICYgVElPQ01fUlRTKSA/ICBSVFNfQ09OVFJPTF9ESVNBQkxFIDoKI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgUlRTX0NPTlRST0xfRU5BQkxFIDsKCQlscGRjYi0+Zk91dHhDdHNGbG93ID0gMDsKCX0KCWlmIChwb3J0LmNfaWZsYWcgJiBJWE9OKQoJCWxwZGNiLT5mSW5YID0gMTsKCWVsc2UKCQlscGRjYi0+ZkluWCA9IDA7CgoJaWYgKHBvcnQuY19pZmxhZyAmIElYT0ZGKQoJCWxwZGNiLT5mT3V0WCA9IDE7CgllbHNlCgkJbHBkY2ItPmZPdXRYID0gMDsKLyoKCWxwZGNiLT5Yb25DaGFyID0KCWxwZGNiLT5Yb2ZmQ2hhciA9CiAqLwoJbHBkY2ItPlhvbkxpbSA9IDEwOwoJbHBkY2ItPlhvZmZMaW0gPSAxMDsKCiAgICAgICAgQ09NTV9TZXRDb21tRXJyb3IoaGFuZGxlLDApOwoKICAgICAgICBUUkFDRSgiT0tcbiIpOwoKCVRSQUNFKCJieXRlc2l6ZSAlZCBiYXVkcmF0ZSAlbGQgZlBhcml0eSAlZCBQYXJpdHkgJWQgc3RvcGJpdHMgJWRcbiIsCgkgICAgICBscGRjYi0+Qnl0ZVNpemUsbHBkY2ItPkJhdWRSYXRlLGxwZGNiLT5mUGFyaXR5LCBscGRjYi0+UGFyaXR5LAoJICAgICAgKGxwZGNiLT5TdG9wQml0cyA9PSBPTkVTVE9QQklUKT8xOgoJICAgICAgKGxwZGNiLT5TdG9wQml0cyA9PSBUV09TVE9QQklUUyk/MjowKTsKCVRSQUNFKCIlcyAlc1xuIiwobHBkY2ItPmZJblgpPyJJWE9OIjoifklYT04iLAoJICAgICAgKGxwZGNiLT5mT3V0WCk/IklYT0ZGIjoifklYT0ZGIik7CiAgICAgICAgIFRSQUNFKCJmT3V0eEN0c0Zsb3cgJWQgZlJ0c0NvbnRyb2wgJWRcbiIsIGxwZGNiLT5mT3V0eEN0c0Zsb3csCiAgICAgICAgICAgICAgICAgbHBkY2ItPmZSdHNDb250cm9sKTsKICAgICAgICAgVFJBQ0UoImZPdXR4RHNyRmxvdyAlZCBmRHRyQ29udHJvbCVkXG4iLCBscGRjYi0+Zk91dHhEc3JGbG93LAogICAgICAgICAgICAgICAgIGxwZGNiLT5mRHRyQ29udHJvbCk7CiNpZmRlZiBDUlRTQ1RTCglpZiAoCWxwZGNiLT5mT3V0eEN0c0Zsb3cgCQkJfHwKCQlscGRjYi0+ZlJ0c0NvbnRyb2wgPT0gUlRTX0NPTlRST0xfSEFORFNIQUtFCgkJKQoJICBUUkFDRSgiQ1JUU0NUU1xuIik7CiAgICAgICAgZWxzZQoKCSAgVFJBQ0UoIn5DUlRTQ1RTXG4iKTsKI2VuZGlmCglyZXR1cm4gVFJVRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCVRyYW5zbWl0Q29tbUNoYXIJKEtFUk5FTDMyLkApCiAqCiAqICBUcmFuc21pdHMgYSBzaW5nbGUgY2hhcmFjdGVyIGluIGZyb250IG9mIGFueSBwZW5kaW5nIGNoYXJhY3RlcnMgaW4gdGhlCiAqICBvdXRwdXQgYnVmZmVyLiAgVXN1YWxseSB1c2VkIHRvIHNlbmQgYW4gaW50ZXJydXB0IGNoYXJhY3RlciB0byBhIGhvc3QuCiAqCiAqIFJFVFVSTlMKICoKICogIFRydWUgaWYgdGhlIGNhbGwgc3VjY2VlZGVkLCBmYWxzZSBpZiB0aGUgcHJldmlvdXMgY29tbWFuZCBjaGFyYWN0ZXIgdG8gdGhlCiAqICBzYW1lIGRldmljZSBoYXMgbm90IGJlZW4gc2VudCB5ZXQgdGhlIGhhbmRsZSBpcyBiYWQgZXRjLgogKgogKiBCVUdTCiAqCiAqICBTdHViLgogKi8KQk9PTCBXSU5BUEkgVHJhbnNtaXRDb21tQ2hhcigKICAgIEhBTkRMRSBoQ29tbSwgICAgICAvKiBbaW5dIFRoZSBjb21tdW5pY2F0aW9uIGRldmljZSBpbiBuZWVkIG9mIGEgY29tbWFuZCBjaGFyYWN0ZXIuICovCiAgICBDSEFSICAgY2hUcmFuc21pdCkgLyogW2luXSBUaGUgY2hhcmFjdGVyIHRvIHRyYW5zbWl0LiAqLwp7CiAgICBXQVJOKCIoJXAsJyVjJykgbm90IHBlcmZlY3QhXG4iLGhDb21tLGNoVHJhbnNtaXQpOwoKICAgIHJldHVybiBXcml0ZUZpbGUoIGhDb21tLCAmY2hUcmFuc21pdCwgMSwgTlVMTCwgTlVMTCApOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCUdldENvbW1UaW1lb3V0cwkJKEtFUk5FTDMyLkApCiAqCiAqICBPYnRhaW5zIHRoZSByZXF1ZXN0IHRpbWVvdXQgdmFsdWVzIGZvciB0aGUgY29tbXVuaWNhdGlvbnMgZGV2aWNlLgogKgogKiBSRVRVUk5TCiAqCiAqICBUcnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIGlmIGNvbW11bmljYXRpb25zIGRldmljZSBoYW5kbGUgaXMgYmFkCiAqICBvciB0aGUgdGFyZ2V0IHN0cnVjdHVyZSBpcyBudWxsLgogKi8KQk9PTCBXSU5BUEkgR2V0Q29tbVRpbWVvdXRzKAogICAgSEFORExFICAgICAgICAgaENvbW0sICAgICAgLyogW2luXSBUaGUgY29tbXVuaWNhdGlvbnMgZGV2aWNlLiAqLwogICAgTFBDT01NVElNRU9VVFMgbHB0aW1lb3V0cykgLyogW291dF0gVGhlIHN0cnVjdCBvZiByZXF1ZXN0IHRpbWVvdXRzLiAqLwp7CiAgICBCT09MIHJldDsKCiAgICBUUkFDRSgiKCVwLCVwKVxuIixoQ29tbSxscHRpbWVvdXRzKTsKCiAgICBpZighbHB0aW1lb3V0cykKICAgIHsKICAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwogICAgICAgIHJldHVybiBGQUxTRTsKICAgIH0KCiAgICBTRVJWRVJfU1RBUlRfUkVRKCBnZXRfc2VyaWFsX2luZm8gKQogICAgewogICAgICAgIHJlcS0+aGFuZGxlID0gaENvbW07CiAgICAgICAgaWYgKChyZXQgPSAhd2luZV9zZXJ2ZXJfY2FsbF9lcnIoIHJlcSApKSkKICAgICAgICB7CiAgICAgICAgICAgIGxwdGltZW91dHMtPlJlYWRJbnRlcnZhbFRpbWVvdXQgICAgICAgICA9IHJlcGx5LT5yZWFkaW50ZXJ2YWw7CiAgICAgICAgICAgIGxwdGltZW91dHMtPlJlYWRUb3RhbFRpbWVvdXRNdWx0aXBsaWVyICA9IHJlcGx5LT5yZWFkbXVsdDsKICAgICAgICAgICAgbHB0aW1lb3V0cy0+UmVhZFRvdGFsVGltZW91dENvbnN0YW50ICAgID0gcmVwbHktPnJlYWRjb25zdDsKICAgICAgICAgICAgbHB0aW1lb3V0cy0+V3JpdGVUb3RhbFRpbWVvdXRNdWx0aXBsaWVyID0gcmVwbHktPndyaXRlbXVsdDsKICAgICAgICAgICAgbHB0aW1lb3V0cy0+V3JpdGVUb3RhbFRpbWVvdXRDb25zdGFudCAgID0gcmVwbHktPndyaXRlY29uc3Q7CiAgICAgICAgfQogICAgfQogICAgU0VSVkVSX0VORF9SRVE7CiAgICByZXR1cm4gcmV0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJU2V0Q29tbVRpbWVvdXRzCQkoS0VSTkVMMzIuQCkKICoKICogU2V0cyB0aGUgdGltZW91dHMgdXNlZCB3aGVuIHJlYWRpbmcgYW5kIHdyaXRpbmcgZGF0YSB0by9mcm9tIENPTU0gcG9ydHMuCiAqCiAqIFJlYWRJbnRlcnZhbFRpbWVvdXQKICogICAgIC0gY29udmVydGVkIGFuZCBwYXNzZXMgdG8gbGludXgga2VybmVsIGFzIGNfY2NbVlRJTUVdCiAqIFJlYWRUb3RhbFRpbWVvdXRNdWx0aXBsaWVyLCBSZWFkVG90YWxUaW1lb3V0Q29uc3RhbnQKICogICAgIC0gdXNlZCBpbiBSZWFkRmlsZSB0byBjYWxjdWxhdGUgR2V0T3ZlcmxhcHBlZFJlc3VsdCdzIHRpbWVvdXQKICogV3JpdGVUb3RhbFRpbWVvdXRNdWx0aXBsaWVyLCBXcml0ZVRvdGFsVGltZW91dENvbnN0YW50CiAqICAgICAtIHVzZWQgaW4gV3JpdGVGaWxlIHRvIGNhbGN1bGF0ZSBHZXRPdmVybGFwcGVkUmVzdWx0J3MgdGltZW91dAogKgogKiBSRVRVUk5TCiAqCiAqICBUcnVlIGlmIHRoZSB0aW1lb3V0cyB3ZXJlIHNldCwgZmFsc2Ugb3RoZXJ3aXNlLgogKi8KQk9PTCBXSU5BUEkgU2V0Q29tbVRpbWVvdXRzKAogICAgSEFORExFIGhDb21tLCAgICAgICAgICAgICAgLyogW2luXSBoYW5kbGUgb2YgQ09NTSBkZXZpY2UgKi8KICAgIExQQ09NTVRJTUVPVVRTIGxwdGltZW91dHMpIC8qIFtpbl0gcG9pbnRlciB0byBDT01NVElNRU9VVFMgc3RydWN0dXJlICovCnsKICAgIEJPT0wgcmV0OwogICAgaW50IGZkOwogICAgc3RydWN0IHRlcm1pb3MgdGlvczsKCiAgICBUUkFDRSgiKCVwLCVwKVxuIixoQ29tbSxscHRpbWVvdXRzKTsKCiAgICBpZighbHB0aW1lb3V0cykKICAgIHsKICAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwogICAgICAgIHJldHVybiBGQUxTRTsKICAgIH0KCiAgICBTRVJWRVJfU1RBUlRfUkVRKCBzZXRfc2VyaWFsX2luZm8gKQogICAgewogICAgICAgIHJlcS0+aGFuZGxlICAgICAgID0gaENvbW07CiAgICAgICAgcmVxLT5mbGFncyAgICAgICAgPSBTRVJJQUxJTkZPX1NFVF9USU1FT1VUUzsKICAgICAgICByZXEtPnJlYWRpbnRlcnZhbCA9IGxwdGltZW91dHMtPlJlYWRJbnRlcnZhbFRpbWVvdXQgOwogICAgICAgIHJlcS0+cmVhZG11bHQgICAgID0gbHB0aW1lb3V0cy0+UmVhZFRvdGFsVGltZW91dE11bHRpcGxpZXIgOwogICAgICAgIHJlcS0+cmVhZGNvbnN0ICAgID0gbHB0aW1lb3V0cy0+UmVhZFRvdGFsVGltZW91dENvbnN0YW50IDsKICAgICAgICByZXEtPndyaXRlbXVsdCAgICA9IGxwdGltZW91dHMtPldyaXRlVG90YWxUaW1lb3V0TXVsdGlwbGllciA7CiAgICAgICAgcmVxLT53cml0ZWNvbnN0ICAgPSBscHRpbWVvdXRzLT5Xcml0ZVRvdGFsVGltZW91dENvbnN0YW50IDsKICAgICAgICByZXQgPSAhd2luZV9zZXJ2ZXJfY2FsbF9lcnIoIHJlcSApOwogICAgfQogICAgU0VSVkVSX0VORF9SRVE7CiAgICBpZiAoIXJldCkgcmV0dXJuIEZBTFNFOwoKICAgIC8qIEZJWE1FOiBtb3ZlIHRoaXMgc3R1ZmYgdG8gdGhlIHNlcnZlciAqLwogICAgZmQgPSBnZXRfY29tbV9mZCggaENvbW0sIEdFTkVSSUNfUkVBRCApOwogICAgaWYgKGZkIDwgMCkgcmV0dXJuIEZBTFNFOwoKICAgIGlmICgtMT09dGNnZXRhdHRyKGZkLCZ0aW9zKSkgewogICAgICAgIEZJWE1FKCJ0Y2dldGF0dHIgb24gZmQgJWQgZmFpbGVkIVxuIixmZCk7CiAgICAgICAgcmVsZWFzZV9jb21tX2ZkKCBoQ29tbSwgZmQgKTsKICAgICAgICByZXR1cm4gRkFMU0U7CiAgICB9CgogICAgLyogVlRJTUUgaXMgaW4gMS8xMCBzZWNvbmRzICovCgl7CgkJdW5zaWduZWQgaW50IHV4X3RpbWVvdXQ7CgoJCWlmKGxwdGltZW91dHMtPlJlYWRJbnRlcnZhbFRpbWVvdXQgPT0gMCkgLyogMCBtZWFucyBubyB0aW1lb3V0ICovCgkJewoJCQl1eF90aW1lb3V0ID0gMDsKCQl9CgkJZWxzZQoJCXsKCQkJdXhfdGltZW91dCA9IChscHRpbWVvdXRzLT5SZWFkSW50ZXJ2YWxUaW1lb3V0Kzk5KS8xMDA7CgkJCWlmKHV4X3RpbWVvdXQgPT0gMCkKCQkJewoJCQkJdXhfdGltZW91dCA9IDE7IC8qIG11c3QgYmUgYXQgbGVhc3Qgc29tZSB0aW1lb3V0ICovCgkJCX0KCQl9CgkJdGlvcy5jX2NjW1ZUSU1FXSA9IHV4X3RpbWVvdXQ7Cgl9CgogICAgaWYgKC0xPT10Y3NldGF0dHIoZmQsMCwmdGlvcykpIHsKICAgICAgICBGSVhNRSgidGNzZXRhdHRyIG9uIGZkICVkIGZhaWxlZCFcbiIsZmQpOwogICAgICAgIHJlbGVhc2VfY29tbV9mZCggaENvbW0sIGZkICk7CiAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgfQogICAgcmVsZWFzZV9jb21tX2ZkKCBoQ29tbSwgZmQgKTsKICAgIHJldHVybiBUUlVFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIEdldENvbW1Nb2RlbVN0YXR1cyAgIChLRVJORUwzMi5AKQogKgogKiAgT2J0YWlucyB0aGUgZm91ciBjb250cm9sIHJlZ2lzdGVyIGJpdHMgaWYgc3VwcG9ydGVkIGJ5IHRoZSBoYXJkd2FyZS4KICoKICogUkVUVVJOUwogKgogKiAgVHJ1ZSBpZiB0aGUgY29tbXVuaWNhdGlvbnMgaGFuZGxlIHdhcyBnb29kIGFuZCBmb3IgaGFyZHdhcmUgdGhhdAogKiAgY29udHJvbCByZWdpc3RlciBhY2Nlc3MsIGZhbHNlIG90aGVyd2lzZS4KICovCkJPT0wgV0lOQVBJIEdldENvbW1Nb2RlbVN0YXR1cygKICAgIEhBTkRMRSAgaEZpbGUsICAgICAgIC8qIFtpbl0gVGhlIGNvbW11bmljYXRpb25zIGRldmljZS4gKi8KICAgIExQRFdPUkQgbHBNb2RlbVN0YXQpIC8qIFtvdXRdIFRoZSBjb250cm9sIHJlZ2lzdGVyIGJpdHMuICovCnsKCWludCBmZCxtc3RhdCwgcmVzdWx0PUZBTFNFOwoKCSpscE1vZGVtU3RhdD0wOwojaWZkZWYgVElPQ01HRVQKCWZkID0gZ2V0X2NvbW1fZmQoIGhGaWxlLCBHRU5FUklDX1JFQUQgKTsKCWlmKGZkPDApCgkJcmV0dXJuIEZBTFNFOwoJcmVzdWx0ID0gaW9jdGwoZmQsIFRJT0NNR0VULCAmbXN0YXQpOwoJcmVsZWFzZV9jb21tX2ZkKCBoRmlsZSwgZmQgKTsKCWlmIChyZXN1bHQgPT0gLTEpCgkgIHsKCSAgICBXQVJOKCJpb2N0bCBmYWlsZWRcbiIpOwoJICAgIHJldHVybiBGQUxTRTsKCSAgfQojaWZkZWYgVElPQ01fQ1RTCglpZiAobXN0YXQgJiBUSU9DTV9DVFMpCgkgICAgKmxwTW9kZW1TdGF0IHw9IE1TX0NUU19PTjsKI2VuZGlmCiNpZmRlZiBUSU9DTV9EU1IKCWlmIChtc3RhdCAmIFRJT0NNX0RTUikKCSAgKmxwTW9kZW1TdGF0IHw9IE1TX0RTUl9PTjsKI2VuZGlmCiNpZmRlZiBUSU9DTV9STkcKCWlmIChtc3RhdCAmIFRJT0NNX1JORykKCSAgKmxwTW9kZW1TdGF0IHw9IE1TX1JJTkdfT047CiNlbmRpZgojaWZkZWYgVElPQ01fQ0FSCgkvKkZJWE1FOiAgTm90IHJlYWxseSBzdXJlIGFib3V0IFJMU0QgIFVCIDk5MDgxMCovCglpZiAobXN0YXQgJiBUSU9DTV9DQVIpCgkgICpscE1vZGVtU3RhdCB8PSBNU19STFNEX09OOwojZW5kaWYKCVRSQUNFKCIlMDR4IC0+ICVzJXMlcyVzXG4iLCBtc3RhdCwKCSAgICAgICgqbHBNb2RlbVN0YXQgJk1TX1JMU0RfT04pPyJNU19STFNEX09OICI6IiIsCgkgICAgICAoKmxwTW9kZW1TdGF0ICZNU19SSU5HX09OKT8iTVNfUklOR19PTiAiOiIiLAoJICAgICAgKCpscE1vZGVtU3RhdCAmTVNfRFNSX09OKT8iTVNfRFNSX09OICI6IiIsCgkgICAgICAoKmxwTW9kZW1TdGF0ICZNU19DVFNfT04pPyJNU19DVFNfT04gIjoiIik7CglyZXR1cm4gVFJVRTsKI2Vsc2UKCXJldHVybiBGQUxTRTsKI2VuZGlmCn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICBDT01NX1dhaXRDb21tRXZlbnRTZXJ2aWNlICAgICAgKElOVEVSTkFMKQogKgogKiAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hpbGUgdGhlIGNsaWVudCBpcyB3YWl0aW5nIG9uIHRoZQogKiAgc2VydmVyLCBzbyB3ZSBjYW4ndCBtYWtlIGFueSBzZXJ2ZXIgY2FsbHMgaGVyZS4KICovCnN0YXRpYyB2b2lkIENPTU1fV2FpdENvbW1FdmVudFNlcnZpY2UoYXN5bmNfcHJpdmF0ZSAqb3ZwKQp7CiAgICBhc3luY19jb21taW8gKmNvbW1pbyA9IChhc3luY19jb21taW8qKSBvdnA7CiAgICBJT19TVEFUVVNfQkxPQ0sqIGlvc2IgPSBjb21taW8tPmFzeW5jLmlvc2I7CgogICAgVFJBQ0UoImlvc2IgJXBcbiIsaW9zYik7CgogICAgLyogRklYTUU6IGRldGVjdCBvdGhlciBldmVudHMgKi8KICAgICpjb21taW8tPmJ1ZmZlciA9IEVWX1JYQ0hBUjsKCiAgICBpb3NiLT51LlN0YXR1cyA9IFNUQVRVU19TVUNDRVNTOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgIENPTU1fV2FpdENvbW1FdmVudCAgICAgICAgIChJTlRFUk5BTCkKICoKICogIFRoaXMgZnVuY3Rpb24gbXVzdCBoYXZlIGFuIGxwT3ZlcmxhcHBlZC4KICovCnN0YXRpYyBCT09MIENPTU1fV2FpdENvbW1FdmVudCgKICAgIEhBTkRMRSBoRmlsZSwgICAgICAgICAgICAgIC8qIFtpbl0gaGFuZGxlIG9mIGNvbW0gcG9ydCB0byB3YWl0IGZvciAqLwogICAgTFBEV09SRCBscGR3RXZlbnRzLCAgICAgICAgLyogW291dF0gZXZlbnQocykgdGhhdCB3ZXJlIGRldGVjdGVkICovCiAgICBMUE9WRVJMQVBQRUQgbHBPdmVybGFwcGVkKSAvKiBbaW4vb3V0XSBmb3IgQXN5bmNocm9ub3VzIHdhaXRpbmcgKi8KewogICAgaW50IGZkOwogICAgYXN5bmNfY29tbWlvICpvdnA7CgogICAgaWYoIWxwT3ZlcmxhcHBlZCkKICAgIHsKICAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwogICAgICAgIHJldHVybiBGQUxTRTsKICAgIH0KCiAgICBpZihOdFJlc2V0RXZlbnQobHBPdmVybGFwcGVkLT5oRXZlbnQsTlVMTCkpCiAgICAgICAgcmV0dXJuIEZBTFNFOwoKICAgIGZkID0gZ2V0X2NvbW1fZmQoIGhGaWxlLCBHRU5FUklDX1dSSVRFICk7CiAgICBpZihmZDwwKQoJcmV0dXJuIEZBTFNFOwoKICAgIG92cCA9IChhc3luY19jb21taW8qKSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc2l6ZW9mIChhc3luY19jb21taW8pKTsKICAgIGlmKCFvdnApCiAgICB7CiAgICAgICAgcmVsZWFzZV9jb21tX2ZkKCBoRmlsZSwgZmQgKTsKICAgICAgICByZXR1cm4gRkFMU0U7CiAgICB9CgogICAgb3ZwLT5hc3luYy5vcHMgPSAmY29tbWlvX2FzeW5jX29wczsKICAgIG92cC0+YXN5bmMuaGFuZGxlID0gaEZpbGU7CiAgICBvdnAtPmFzeW5jLmZkID0gZmQ7ICAvKiBGSVhNRSAqLwogICAgb3ZwLT5hc3luYy50eXBlID0gQVNZTkNfVFlQRV9XQUlUOwogICAgb3ZwLT5hc3luYy5mdW5jID0gQ09NTV9XYWl0Q29tbUV2ZW50U2VydmljZTsKICAgIG92cC0+YXN5bmMuZXZlbnQgPSBscE92ZXJsYXBwZWQtPmhFdmVudDsKICAgIG92cC0+YXN5bmMuaW9zYiA9IChJT19TVEFUVVNfQkxPQ0sqKWxwT3ZlcmxhcHBlZDsKICAgIG92cC0+YnVmZmVyID0gKGNoYXIgKilscGR3RXZlbnRzOwoKICAgIGxwT3ZlcmxhcHBlZC0+SW50ZXJuYWxIaWdoID0gMDsKICAgIGxwT3ZlcmxhcHBlZC0+T2Zmc2V0ID0gMDsKICAgIGxwT3ZlcmxhcHBlZC0+T2Zmc2V0SGlnaCA9IDA7CgogICAgaWYgKCAhcmVnaXN0ZXJfbmV3X2FzeW5jICgmb3ZwLT5hc3luYykgKQogICAgICAgIFNldExhc3RFcnJvciggRVJST1JfSU9fUEVORElORyApOwoKICAgIHJldHVybiBGQUxTRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBXYWl0Q29tbUV2ZW50ICAgKEtFUk5FTDMyLkApCiAqCiAqIFdhaXQgdW50aWwgc29tZXRoaW5nIGludGVyZXN0aW5nIGhhcHBlbnMgb24gYSBDT01NIHBvcnQuCiAqIEludGVyZXN0aW5nIHRoaW5ncyAoZXZlbnRzKSBhcmUgc2V0IGJ5IGNhbGxpbmcgU2V0Q29tbU1hc2sgYmVmb3JlCiAqIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLgogKgogKiBSRVRVUk5TOgogKiAgIFRSVUUgaWYgc3VjY2Vzc2Z1bAogKiAgIEZBTFNFIGlmIGZhaWx1cmUKICoKICogICBUaGUgc2V0IG9mIGRldGVjdGVkIGV2ZW50cyB3aWxsIGJlIHdyaXR0ZW4gdG8gKmxwZHdFdmVudE1hc2sKICogICBFUlJPUl9JT19QRU5ESU5HIHdpbGwgYmUgcmV0dXJuZWQgdGhlIG92ZXJsYXBwZWQgc3RydWN0dXJlIHdhcyBwYXNzZWQKICoKICogQlVHUzoKICogIE9ubHkgc3VwcG9ydHMgRVZfUlhDSEFSIGFuZCBFVl9UWEVNUFRZCiAqLwpCT09MIFdJTkFQSSBXYWl0Q29tbUV2ZW50KAogICAgSEFORExFIGhGaWxlLCAgICAgICAgICAgICAgLyogW2luXSBoYW5kbGUgb2YgY29tbSBwb3J0IHRvIHdhaXQgZm9yICovCiAgICBMUERXT1JEIGxwZHdFdmVudHMsICAgICAgICAvKiBbb3V0XSBldmVudChzKSB0aGF0IHdlcmUgZGV0ZWN0ZWQgKi8KICAgIExQT1ZFUkxBUFBFRCBscE92ZXJsYXBwZWQpIC8qIFtpbi9vdXRdIGZvciBBc3luY2hyb25vdXMgd2FpdGluZyAqLwp7CiAgICBPVkVSTEFQUEVEIG92OwogICAgaW50IHJldDsKCiAgICBUUkFDRSgiKCVwICVwICVwIClcbiIsaEZpbGUsIGxwZHdFdmVudHMsbHBPdmVybGFwcGVkKTsKCiAgICBpZihscE92ZXJsYXBwZWQpCiAgICAgICAgcmV0dXJuIENPTU1fV2FpdENvbW1FdmVudChoRmlsZSwgbHBkd0V2ZW50cywgbHBPdmVybGFwcGVkKTsKCiAgICAvKiBpZiB0aGVyZSBpcyBubyBvdmVybGFwcGVkIHN0cnVjdHVyZSwgY3JlYXRlIG91ciBvd24gKi8KICAgIG92LmhFdmVudCA9IENyZWF0ZUV2ZW50QShOVUxMLEZBTFNFLEZBTFNFLE5VTEwpOwoKICAgIENPTU1fV2FpdENvbW1FdmVudChoRmlsZSwgbHBkd0V2ZW50cywgJm92KTsKCiAgICAvKiB3YWl0IGZvciB0aGUgb3ZlcmxhcHBlZCB0byBjb21wbGV0ZSAqLwogICAgcmV0ID0gR2V0T3ZlcmxhcHBlZFJlc3VsdChoRmlsZSwgJm92LCBOVUxMLCBUUlVFKTsKICAgIENsb3NlSGFuZGxlKG92LmhFdmVudCk7CgogICAgcmV0dXJuIHJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBHZXRDb21tUHJvcGVydGllcyAgIChLRVJORUwzMi5AKQogKgogKiBUaGlzIGZ1bmN0aW9uIGZpbGxzIGluIGEgc3RydWN0dXJlIHdpdGggdGhlIGNhcGFiaWxpdGllcyBvZiB0aGUKICogY29tbXVuaWNhdGlvbnMgcG9ydCBkcml2ZXIuCiAqCiAqIFJFVFVSTlMKICoKICogIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZQogKiAgSWYgc3VjY2Vzc2Z1bCwgdGhlIGxwQ29tbVByb3Agc3RydWN0dXJlIGJlIGZpbGxlZCBpbiB3aXRoCiAqICBwcm9wZXJ0aWVzIG9mIHRoZSBjb21tIHBvcnQuCiAqLwpCT09MIFdJTkFQSSBHZXRDb21tUHJvcGVydGllcygKICAgIEhBTkRMRSBoRmlsZSwgICAgICAgICAgLyogW2luXSBoYW5kbGUgb2YgdGhlIGNvbW0gcG9ydCAqLwogICAgTFBDT01NUFJPUCBscENvbW1Qcm9wKSAvKiBbb3V0XSBwb2ludGVyIHRvIHN0cnVjdCB0byBiZSBmaWxsZWQgKi8KewogICAgRklYTUUoIiglcCAlcCApXG4iLGhGaWxlLGxwQ29tbVByb3ApOwogICAgaWYoIWxwQ29tbVByb3ApCiAgICAgICAgcmV0dXJuIEZBTFNFOwoKICAgIC8qCiAgICAgKiBUaGVzZSB2YWx1ZXMgc2hvdWxkIGJlIHZhbGlkIGZvciBMSU5VWCdzIHNlcmlhbCBkcml2ZXIKICAgICAqIEZJWE1FOiBQZXJoYXBzIHRoZXkgZGVzZXJ2ZSBhbiAjaWZkZWYgTElOVVgKICAgICAqLwogICAgbWVtc2V0KGxwQ29tbVByb3AsMCxzaXplb2YoQ09NTVBST1ApKTsKICAgIGxwQ29tbVByb3AtPndQYWNrZXRMZW5ndGggICAgICAgPSAxOwogICAgbHBDb21tUHJvcC0+d1BhY2tldFZlcnNpb24gICAgICA9IDE7CiAgICBscENvbW1Qcm9wLT5kd1NlcnZpY2VNYXNrICAgICAgID0gU1BfU0VSSUFMQ09NTTsKICAgIGxwQ29tbVByb3AtPmR3UmVzZXJ2ZWQxICAgICAgICAgPSAwOwogICAgbHBDb21tUHJvcC0+ZHdNYXhUeFF1ZXVlICAgICAgICA9IDQwOTY7CiAgICBscENvbW1Qcm9wLT5kd01heFJ4UXVldWUgICAgICAgID0gNDA5NjsKICAgIGxwQ29tbVByb3AtPmR3TWF4QmF1ZCAgICAgICAgICAgPSBCQVVEXzExNTIwMDsKICAgIGxwQ29tbVByb3AtPmR3UHJvdlN1YlR5cGUgICAgICAgPSBQU1RfUlMyMzI7CiAgICBscENvbW1Qcm9wLT5kd1Byb3ZDYXBhYmlsaXRpZXMgID0gUENGX0RUUkRTUiB8IFBDRl9QQVJJVFlfQ0hFQ0sgfCBQQ0ZfUlRTQ1RTIHwgUENGX1RPVEFMVElNRU9VVFM7CiAgICBscENvbW1Qcm9wLT5kd1NldHRhYmxlUGFyYW1zICAgID0gU1BfQkFVRCB8IFNQX0RBVEFCSVRTIHwgU1BfSEFORFNIQUtJTkcgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNQX1BBUklUWSB8IFNQX1BBUklUWV9DSEVDSyB8IFNQX1NUT1BCSVRTIDsKICAgIGxwQ29tbVByb3AtPmR3U2V0dGFibGVCYXVkICAgICAgPSBCQVVEXzA3NSB8IEJBVURfMTEwIHwgQkFVRF8xMzRfNSB8IEJBVURfMTUwIHwKICAgICAgICAgICAgICAgIEJBVURfMzAwIHwgQkFVRF82MDAgfCBCQVVEXzEyMDAgfCBCQVVEXzE4MDAgfCBCQVVEXzI0MDAgfCBCQVVEXzQ4MDAgfAogICAgICAgICAgICAgICAgQkFVRF85NjAwIHwgQkFVRF8xOTIwMCB8IEJBVURfMzg0MDAgfCBCQVVEXzU3NjAwIHwgQkFVRF8xMTUyMDAgOwogICAgbHBDb21tUHJvcC0+d1NldHRhYmxlRGF0YSAgICAgICA9IERBVEFCSVRTXzUgfCBEQVRBQklUU182IHwgREFUQUJJVFNfNyB8IERBVEFCSVRTXzggOwogICAgbHBDb21tUHJvcC0+d1NldHRhYmxlU3RvcFBhcml0eSA9IFNUT1BCSVRTXzEwIHwgU1RPUEJJVFNfMTUgfCBTVE9QQklUU18yMCB8CiAgICAgICAgICAgICAgICBQQVJJVFlfTk9ORSB8IFBBUklUWV9PREQgfFBBUklUWV9FVkVOIHwgUEFSSVRZX01BUksgfCBQQVJJVFlfU1BBQ0U7CiAgICBscENvbW1Qcm9wLT5kd0N1cnJlbnRUeFF1ZXVlICAgID0gbHBDb21tUHJvcC0+ZHdNYXhUeFF1ZXVlOwogICAgbHBDb21tUHJvcC0+ZHdDdXJyZW50UnhRdWV1ZSAgICA9IGxwQ29tbVByb3AtPmR3TWF4UnhRdWV1ZTsKCiAgICByZXR1cm4gVFJVRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIEZJWE1FOgogKiBUaGUgZnVuY3Rpb25hbGl0eSBvZiBDb21tQ29uZmlnRGlhbG9nQSwgR2V0RGVmYXVsdENvbW1Db25maWcgYW5kCiAqIFNldERlZmF1bHRDb21tQ29uZmlnIGlzIGltcGxlbWVudGVkIGluIGEgRExMICh1c3VhbGx5IFNFUklBTFVJLkRMTCkuCiAqIFRoaXMgaXMgZGVwZW5kZW50IG9uIHRoZSB0eXBlIG9mIENPTU0gcG9ydCwgYnV0IHNpbmNlIGl0IGlzIGRvdWJ0ZnVsCiAqIGFueWJvZHkgd2lsbCBnZXQgYXJvdW5kIHRvIGltcGxlbWVudGluZyBzdXBwb3J0IGZvciBmYW5jeSBzZXJpYWwKICogcG9ydHMgaW4gV0lORSwgdGhpcyBpcyBoYXJkY29kZWQgZm9yIHRoZSB0aW1lIGJlaW5nLiAgVGhlIG5hbWUgb2YKICogdGhpcyBETEwgc2hvdWxkIGJlIHN0b3JlZCBpbiBhbmQgcmVhZCBmcm9tIHRoZSBzeXN0ZW0gcmVnaXN0cnkgaW4KICogdGhlIGhpdmUgSEtFWV9MT0NBTF9NQUNISU5FLCBrZXkKICogU3lzdGVtXFxDdXJyZW50Q29udHJvbFNldFxcU2VydmljZXNcXENsYXNzXFxQb3J0c1xcPz8/PwogKiB3aGVyZSA/Pz8/IGlzIHRoZSBwb3J0IG51bWJlci4uLiB0aGF0IGlzIGRldGVybWluZWQgYnkgUE5QCiAqIFRoZSBETEwgc2hvdWxkIGJlIGxvYWRlZCB3aGVuIHRoZSBDT01NIHBvcnQgaXMgb3BlbmVkLCBhbmQgY2xvc2VkCiAqIHdoZW4gdGhlIENPTU0gcG9ydCBpcyBjbG9zZWQuIC0gTUpNIDIwIEp1bmUgMjAwMAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBDSEFSIGxwc3pTZXJpYWxVSVtdID0gInNlcmlhbHVpLmRsbCI7CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBDb21tQ29uZmlnRGlhbG9nQSAgIChLRVJORUwzMi5AKQogKgogKiBSYWlzZXMgYSBkaWFsb2cgdGhhdCBhbGxvd3MgdGhlIHVzZXIgdG8gY29uZmlndXJlIGEgY29tbSBwb3J0LgogKiBGaWxscyB0aGUgQ09NTUNPTkZJRyBzdHJ1Y3Qgd2l0aCBpbmZvcm1hdGlvbiBzcGVjaWZpZWQgYnkgdGhlIHVzZXIuCiAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGNhbGwgYSBzaW1pbGFyIHJvdXRpbmUgaW4gdGhlIENPTU0gZHJpdmVyLi4uCiAqCiAqIFJFVFVSTlMKICoKICogIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZQogKiAgSWYgc3VjY2Vzc2Z1bCwgdGhlIGxwQ29tbUNvbmZpZyBzdHJ1Y3R1cmUgd2lsbCBjb250YWluIGEgbmV3CiAqICBjb25maWd1cmF0aW9uIGZvciB0aGUgY29tbSBwb3J0LCBhcyBzcGVjaWZpZWQgYnkgdGhlIHVzZXIuCiAqCiAqIEJVR1MKICogIFRoZSBsaWJyYXJ5IHdpdGggdGhlIENvbW1Db25maWdEaWFsb2cgY29kZSBpcyBuZXZlciB1bmxvYWRlZC4KICogUGVyaGFwcyB0aGlzIHNob3VsZCBiZSBkb25lIHdoZW4gdGhlIGNvbW0gcG9ydCBpcyBjbG9zZWQ/CiAqLwpCT09MIFdJTkFQSSBDb21tQ29uZmlnRGlhbG9nQSgKICAgIExQQ1NUUiBscHN6RGV2aWNlLCAgICAgICAgIC8qIFtpbl0gbmFtZSBvZiBjb21tdW5pY2F0aW9ucyBkZXZpY2UgKi8KICAgIEhBTkRMRSBoV25kLCAgICAgICAgICAgICAgIC8qIFtpbl0gcGFyZW50IHdpbmRvdyBmb3IgdGhlIGRpYWxvZyAqLwogICAgTFBDT01NQ09ORklHIGxwQ29tbUNvbmZpZykgLyogW291dF0gcG9pbnRlciB0byBzdHJ1Y3QgdG8gZmlsbCAqLwp7CiAgICBGQVJQUk9DIGxwZm5Db21tRGlhbG9nOwogICAgSE1PRFVMRSBoQ29uZmlnTW9kdWxlOwogICAgQk9PTCByOwoKICAgIFRSQUNFKCIoJXAgJXAgJXApXG4iLGxwc3pEZXZpY2UsIGhXbmQsIGxwQ29tbUNvbmZpZyk7CgogICAgaENvbmZpZ01vZHVsZSA9IExvYWRMaWJyYXJ5QShscHN6U2VyaWFsVUkpOwogICAgaWYoIWhDb25maWdNb2R1bGUpCiAgICAgICAgcmV0dXJuIEZBTFNFOwoKICAgIGxwZm5Db21tRGlhbG9nID0gR2V0UHJvY0FkZHJlc3MoaENvbmZpZ01vZHVsZSwgKExQQ1NUUikzTCk7CgogICAgaWYoIWxwZm5Db21tRGlhbG9nKQogICAgICAgIHJldHVybiBGQUxTRTsKCiAgICByID0gbHBmbkNvbW1EaWFsb2cobHBzekRldmljZSxoV25kLGxwQ29tbUNvbmZpZyk7CgogICAgLyogVW5sb2FkTGlicmFyeShoQ29uZmlnTW9kdWxlKTsgKi8KCiAgICByZXR1cm4gcjsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBDb21tQ29uZmlnRGlhbG9nVyAgIChLRVJORUwzMi5AKQogKgogKiBzZWUgQ29tbUNvbmZpZ0RpYWxvZ0EgZm9yIG1vcmUgaW5mbwogKi8KQk9PTCBXSU5BUEkgQ29tbUNvbmZpZ0RpYWxvZ1coCiAgICBMUENXU1RSIGxwc3pEZXZpY2UsICAgICAgICAvKiBbaW5dIG5hbWUgb2YgY29tbXVuaWNhdGlvbnMgZGV2aWNlICovCiAgICBIQU5ETEUgaFduZCwgICAgICAgICAgICAgICAvKiBbaW5dIHBhcmVudCB3aW5kb3cgZm9yIHRoZSBkaWFsb2cgKi8KICAgIExQQ09NTUNPTkZJRyBscENvbW1Db25maWcpIC8qIFtvdXRdIHBvaW50ZXIgdG8gc3RydWN0IHRvIGZpbGwgKi8KewogICAgQk9PTCByOwogICAgTFBTVFIgbHBEZXZpY2VBOwoKICAgIGxwRGV2aWNlQSA9IEhFQVBfc3RyZHVwV3RvQSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgbHBzekRldmljZSApOwogICAgaWYobHBEZXZpY2VBKQogICAgICAgIHJldHVybiBGQUxTRTsKICAgIHIgPSBDb21tQ29uZmlnRGlhbG9nQShscERldmljZUEsaFduZCxscENvbW1Db25maWcpOwogICAgSGVhcEZyZWUoIEdldFByb2Nlc3NIZWFwKCksIDAsIGxwRGV2aWNlQSApOwogICAgcmV0dXJuIHI7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgR2V0Q29tbUNvbmZpZyAgICAgKEtFUk5FTDMyLkApCiAqCiAqIEZpbGwgaW4gdGhlIENPTU1DT05GSUcgc3RydWN0dXJlIGZvciB0aGUgY29tbSBwb3J0IGhGaWxlCiAqCiAqIFJFVFVSTlMKICoKICogIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZQogKiAgSWYgc3VjY2Vzc2Z1bCwgbHBDb21tQ29uZmlnIGNvbnRhaW5zIHRoZSBjb21tIHBvcnQgY29uZmlndXJhdGlvbi4KICoKICogQlVHUwogKgogKi8KQk9PTCBXSU5BUEkgR2V0Q29tbUNvbmZpZygKICAgIEhBTkRMRSAgICAgICBoRmlsZSwgICAgICAgIC8qIFtpbl0gVGhlIGNvbW11bmljYXRpb25zIGRldmljZS4gKi8KICAgIExQQ09NTUNPTkZJRyBscENvbW1Db25maWcsIC8qIFtvdXRdIFRoZSBjb21tdW5pY2F0aW9ucyBjb25maWd1cmF0aW9uIG9mIHRoZSBkZXZpY2UgKGlmIGl0IGZpdHMpLiAqLwogICAgTFBEV09SRCAgICAgIGxwZHdTaXplKSAgICAgLyogW2luL291dF0gSW5pdGlhbGx5IHRoZSBzaXplIG9mIHRoZSBjb25maWd1cmF0aW9uIGJ1ZmZlci9zdHJ1Y3R1cmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZnRlcndhcmRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgY29waWVkIHRvIHRoZSBidWZmZXIgb3IKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBuZWVkZWQgc2l6ZSBvZiB0aGUgYnVmZmVyLiAqLwp7CiAgICBCT09MIHI7CgogICAgVFJBQ0UoIiglcCAlcClcbiIsaEZpbGUsbHBDb21tQ29uZmlnKTsKCiAgICBpZihscENvbW1Db25maWcgPT0gTlVMTCkKICAgICAgICByZXR1cm4gRkFMU0U7CiAgICByID0gKmxwZHdTaXplIDwgc2l6ZW9mKENPTU1DT05GSUcpOyAvKiBUUlVFIGlmIG5vdCBlbm91Z2ggc3BhY2UgKi8KICAgICpscGR3U2l6ZSA9IHNpemVvZihDT01NQ09ORklHKTsKICAgIGlmKHIpCiAgICAgICAgcmV0dXJuIEZBTFNFOwoKICAgIGxwQ29tbUNvbmZpZy0+ZHdTaXplID0gc2l6ZW9mKENPTU1DT05GSUcpOwogICAgbHBDb21tQ29uZmlnLT53VmVyc2lvbiA9IDE7CiAgICBscENvbW1Db25maWctPndSZXNlcnZlZCA9IDA7CiAgICByID0gR2V0Q29tbVN0YXRlKGhGaWxlLCZscENvbW1Db25maWctPmRjYik7CiAgICBscENvbW1Db25maWctPmR3UHJvdmlkZXJTdWJUeXBlID0gUFNUX1JTMjMyOwogICAgbHBDb21tQ29uZmlnLT5kd1Byb3ZpZGVyT2Zmc2V0ID0gMDsKICAgIGxwQ29tbUNvbmZpZy0+ZHdQcm92aWRlclNpemUgPSAwOwoKICAgIHJldHVybiByOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIFNldENvbW1Db25maWcgICAgIChLRVJORUwzMi5AKQogKgogKiAgU2V0cyB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGUgY29tbXVuaWNhdGlvbnMgZGV2aWNlLgogKgogKiBSRVRVUk5TCiAqCiAqICBUcnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIGlmIHRoZSBoYW5kbGUgd2FzIGJhZCBpcyBub3QgYSBjb21tdW5pY2F0aW9ucyBkZXZpY2UuCiAqLwpCT09MIFdJTkFQSSBTZXRDb21tQ29uZmlnKAogICAgSEFORExFICAgICAgIGhGaWxlLAkJLyogW2luXSBUaGUgY29tbXVuaWNhdGlvbnMgZGV2aWNlLiAqLwogICAgTFBDT01NQ09ORklHIGxwQ29tbUNvbmZpZywJLyogW2luXSBUaGUgZGVzaXJlZCBjb25maWd1cmF0aW9uLiAqLwogICAgRFdPUkQgZHdTaXplKSAJCS8qIFtpbl0gc2l6ZSBvZiB0aGUgbHBDb21tQ29uZmlnIHN0cnVjdCAqLwp7CiAgICBUUkFDRSgiKCVwICVwKVxuIixoRmlsZSxscENvbW1Db25maWcpOwogICAgcmV0dXJuIFNldENvbW1TdGF0ZShoRmlsZSwmbHBDb21tQ29uZmlnLT5kY2IpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIFNldERlZmF1bHRDb21tQ29uZmlnQSAgIChLRVJORUwzMi5AKQogKgogKiAgSW5pdGlhbGl6ZXMgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBjb21tdW5pY2F0aW9uCiAqICBkZXZpY2UuIChhc2NpaSkKICoKICogUkVUVVJOUwogKgogKiAgVHJ1ZSBpZiB0aGUgZGV2aWNlIHdhcyBmb3VuZCBhbmQgdGhlIGRlZmF1bHRzIHNldCwgZmFsc2Ugb3RoZXJ3aXNlCiAqLwpCT09MIFdJTkFQSSBTZXREZWZhdWx0Q29tbUNvbmZpZ0EoCiAgICBMUENTVFIgICAgICAgbHBzekRldmljZSwgICAvKiBbaW5dIFRoZSBhc2NpaSBuYW1lIG9mIHRoZSBkZXZpY2UgdGFyZ2V0ZWQgZm9yIGNvbmZpZ3VyYXRpb24uICovCiAgICBMUENPTU1DT05GSUcgbHBDb21tQ29uZmlnLCAvKiBbaW5dIFRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBkZXZpY2UuICovCiAgICBEV09SRCAgICAgICAgZHdTaXplKSAgICAgICAvKiBbaW5dIFRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlLiAqLwp7CiAgICBGQVJQUk9DIGxwZm5TZXREZWZhdWx0Q29tbUNvbmZpZzsKICAgIEhNT0RVTEUgaENvbmZpZ01vZHVsZTsKICAgIEJPT0wgcjsKCiAgICBUUkFDRSgiKCVwICVwICVseClcbiIsbHBzekRldmljZSwgbHBDb21tQ29uZmlnLCBkd1NpemUpOwoKICAgIGhDb25maWdNb2R1bGUgPSBMb2FkTGlicmFyeUEobHBzelNlcmlhbFVJKTsKICAgIGlmKCFoQ29uZmlnTW9kdWxlKQogICAgICAgIHJldHVybiBGQUxTRTsKCiAgICBscGZuU2V0RGVmYXVsdENvbW1Db25maWcgPSBHZXRQcm9jQWRkcmVzcyhoQ29uZmlnTW9kdWxlLCAoTFBDU1RSKTRMKTsKCiAgICBpZighIGxwZm5TZXREZWZhdWx0Q29tbUNvbmZpZykKCXJldHVybiBUUlVFOwoKICAgIHIgPSBscGZuU2V0RGVmYXVsdENvbW1Db25maWcobHBzekRldmljZSwgbHBDb21tQ29uZmlnLCBkd1NpemUpOwoKICAgIC8qIFVubG9hZExpYnJhcnkoaENvbmZpZ01vZHVsZSk7ICovCgogICAgcmV0dXJuIHI7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIFNldERlZmF1bHRDb21tQ29uZmlnVyAgICAgKEtFUk5FTDMyLkApCiAqCiAqICBJbml0aWFsaXplcyB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIGZvciB0aGUgc3BlY2lmaWVkCiAqICBjb21tdW5pY2F0aW9uIGRldmljZS4gKHVuaWNvZGUpCiAqCiAqIFJFVFVSTlMKICoKICovCkJPT0wgV0lOQVBJIFNldERlZmF1bHRDb21tQ29uZmlnVygKICAgIExQQ1dTVFIgICAgICBscHN6RGV2aWNlLCAgIC8qIFtpbl0gVGhlIHVuaWNvZGUgbmFtZSBvZiB0aGUgZGV2aWNlIHRhcmdldGVkIGZvciBjb25maWd1cmF0aW9uLiAqLwogICAgTFBDT01NQ09ORklHIGxwQ29tbUNvbmZpZywgLyogW2luXSBUaGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIGZvciB0aGUgZGV2aWNlLiAqLwogICAgRFdPUkQgICAgICAgIGR3U2l6ZSkgICAgICAgLyogW2luXSBUaGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBjb25maWd1cmF0aW9uIHN0cnVjdHVyZS4gKi8KewogICAgQk9PTCByOwogICAgTFBTVFIgbHBEZXZpY2VBOwoKICAgIFRSQUNFKCIoJXMgJXAgJWx4KVxuIixkZWJ1Z3N0cl93KGxwc3pEZXZpY2UpLGxwQ29tbUNvbmZpZyxkd1NpemUpOwoKICAgIGxwRGV2aWNlQSA9IEhFQVBfc3RyZHVwV3RvQSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgbHBzekRldmljZSApOwogICAgaWYobHBEZXZpY2VBKQogICAgICAgIHJldHVybiBGQUxTRTsKICAgIHIgPSBTZXREZWZhdWx0Q29tbUNvbmZpZ0EobHBEZXZpY2VBLGxwQ29tbUNvbmZpZyxkd1NpemUpOwogICAgSGVhcEZyZWUoIEdldFByb2Nlc3NIZWFwKCksIDAsIGxwRGV2aWNlQSApOwogICAgcmV0dXJuIHI7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIEdldERlZmF1bHRDb21tQ29uZmlnVyAgIChLRVJORUwzMi5AKQogKgogKiAgIEFjcXVpcmVzIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gb2YgdGhlIHNwZWNpZmllZCBjb21tdW5pY2F0aW9uIGRldmljZS4gKHVuaWNvZGUpCiAqCiAqICBSRVRVUk5TCiAqCiAqICAgVHJ1ZSBvbiBzdWNjZXNzZnVsIHJlYWRpbmcgb2YgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiwKICogICBpZiB0aGUgZGV2aWNlIGlzIG5vdCBmb3VuZCBvciB0aGUgYnVmZmVyIGlzIHRvbyBzbWFsbC4KICovCkJPT0wgV0lOQVBJIEdldERlZmF1bHRDb21tQ29uZmlnVygKICAgIExQQ1dTVFIgICAgICBscHN6TmFtZSwgLyogW2luXSBUaGUgdW5pY29kZSBuYW1lIG9mIHRoZSBkZXZpY2UgdGFyZ2V0ZWQgZm9yIGNvbmZpZ3VyYXRpb24uICovCiAgICBMUENPTU1DT05GSUcgbHBDQywgICAgIC8qIFtvdXRdIFRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBkZXZpY2UuICovCiAgICBMUERXT1JEICAgICAgbHBkd1NpemUpIC8qIFtpbi9vdXRdIEluaXRpYWxseSB0aGUgc2l6ZSBvZiB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIGJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXJ3YXJkcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvcGllZCB0byB0aGUgYnVmZmVyIG9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBuZWVkZWQgc2l6ZSBvZiB0aGUgYnVmZmVyLiAqLwp7CiAgICAgTFBEQ0IgbHBkY2IgPSAmKGxwQ0MtPmRjYik7CiAgICAgV0NIQVIgdGVtcFs0MF07CiAgICAgc3RhdGljIGNvbnN0IFdDSEFSIGNvbVdbXSA9IHsnQycsJ08nLCdNJywwfTsKICAgICBzdGF0aWMgY29uc3QgV0NIQVIgZm9ybWF0V1tdID0geydDJywnTycsJ00nLCclJywnYycsJzonLCczJywnOCcsJzQnLCcwJywnMCcsJywnLCduJywnLCcsJzgnLCcsJywnMScsMH07CgogICAgIGlmIChzdHJuY21waVcobHBzek5hbWUsY29tVywzKSkgewogICAgICAgIEVSUigibm90IGltcGxlbWVudGVkIGZvciA8JXM+XG4iLCBkZWJ1Z3N0cl93KGxwc3pOYW1lKSk7CiAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KCiAgICAgVFJBQ0UoIiglcyAlcCAlbGQpXG4iLCBkZWJ1Z3N0cl93KGxwc3pOYW1lKSwgbHBDQywgKmxwZHdTaXplICk7CiAgICAgaWYgKCpscGR3U2l6ZSA8IHNpemVvZihDT01NQ09ORklHKSkgewogICAgICAgICAqbHBkd1NpemUgPSBzaXplb2YoQ09NTUNPTkZJRyk7CiAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgIH0KCiAgICAgKmxwZHdTaXplID0gc2l6ZW9mKENPTU1DT05GSUcpOwoKICAgICBscENDLT5kd1NpemUgPSBzaXplb2YoQ09NTUNPTkZJRyk7CiAgICAgbHBDQy0+d1ZlcnNpb24gPSAxOwogICAgIGxwQ0MtPmR3UHJvdmlkZXJTdWJUeXBlID0gUFNUX1JTMjMyOwogICAgIGxwQ0MtPmR3UHJvdmlkZXJPZmZzZXQgPSAwTDsKICAgICBscENDLT5kd1Byb3ZpZGVyU2l6ZSA9IDBMOwoKICAgICBzcHJpbnRmVyggdGVtcCwgZm9ybWF0VywgbHBzek5hbWVbM10pOwogICAgIEZJWE1FKCJzZXR0aW5nICVzIGFzIGRlZmF1bHRcbiIsIGRlYnVnc3RyX3codGVtcCkpOwoKICAgICByZXR1cm4gQnVpbGRDb21tRENCVyggdGVtcCwgbHBkY2IpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICBHZXREZWZhdWx0Q29tbUNvbmZpZ0EJCShLRVJORUwzMi5AKQogKgogKiAgIEFjcXVpcmVzIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gb2YgdGhlIHNwZWNpZmllZCBjb21tdW5pY2F0aW9uIGRldmljZS4gKGFzY2lpKQogKgogKiAgUkVUVVJOUwogKgogKiAgIFRydWUgb24gc3VjY2Vzc2Z1bCByZWFkaW5nIG9mIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24sCiAqICAgaWYgdGhlIGRldmljZSBpcyBub3QgZm91bmQgb3IgdGhlIGJ1ZmZlciBpcyB0b28gc21hbGwuCiAqLwpCT09MIFdJTkFQSSBHZXREZWZhdWx0Q29tbUNvbmZpZ0EoCiAgICBMUENTVFIgICAgICAgbHBzek5hbWUsIC8qIFtpbl0gVGhlIGFzY2lpIG5hbWUgb2YgdGhlIGRldmljZSB0YXJnZXRlZCBmb3IgY29uZmlndXJhdGlvbi4gKi8KICAgIExQQ09NTUNPTkZJRyBscENDLCAgICAgLyogW291dF0gVGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBmb3IgdGhlIGRldmljZS4gKi8KICAgIExQRFdPUkQgICAgICBscGR3U2l6ZSkgLyogW2luL291dF0gSW5pdGlhbGx5IHRoZSBzaXplIG9mIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gYnVmZmVyLAoJCQkgICAgICBhZnRlcndhcmRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgY29waWVkIHRvIHRoZSBidWZmZXIgb3IKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG5lZWRlZCBzaXplIG9mIHRoZSBidWZmZXIuICovCnsKCUJPT0wgcmV0ID0gRkFMU0U7CglVTklDT0RFX1NUUklORyBscHN6TmFtZVc7CgoJVFJBQ0UoIiglcywlcCwlbGQpXG4iLGxwc3pOYW1lLGxwQ0MsKmxwZHdTaXplKTsKCWlmKGxwc3pOYW1lKSBSdGxDcmVhdGVVbmljb2RlU3RyaW5nRnJvbUFzY2lpeigmbHBzek5hbWVXLGxwc3pOYW1lKTsKCWVsc2UgbHBzek5hbWVXLkJ1ZmZlciA9IE5VTEw7CgoJaWYobHBzek5hbWVXLkJ1ZmZlcikgcmV0ID0gR2V0RGVmYXVsdENvbW1Db25maWdXKGxwc3pOYW1lVy5CdWZmZXIsbHBDQyxscGR3U2l6ZSk7CgoJUnRsRnJlZVVuaWNvZGVTdHJpbmcoJmxwc3pOYW1lVyk7CglyZXR1cm4gcmV0Owp9Cg==