LyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwovKiBpMmMtZWxla3Rvci5jIGkyYy1odyBhY2Nlc3MgZm9yIFBDRjg1ODQgc3R5bGUgaXNhIGJ1cyBhZGFwdGVzICAgICAgICAgICAgICovCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLyogICBDb3B5cmlnaHQgKEMpIDE5OTUtOTcgU2ltb24gRy4gVm9nbAogICAgICAgICAgICAgICAgICAgMTk5OC05OSBIYW5zIEJlcmdsdW5kCgogICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgogICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KCiAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgoKICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCQkgICAgICovCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCi8qIFdpdGggc29tZSBjaGFuZ2VzIGZyb20gS3n2c3RpIE3kbGtraSA8a21hbGtraUBjYy5odXQuZmk+IGFuZCBldmVuCiAgIEZyb2RvIExvb2lqYWFyZCA8ZnJvZG9sQGRkcy5ubD4gKi8KCi8qIFBhcnRpYWx5IHJld3JpdGVuIGJ5IE9sZWcgSS4gVmRvdmlraW4gZm9yIG1tYXBwZWQgc3VwcG9ydCBvZgogICBmb3IgQWxwaGEgUHJvY2Vzc29yIEluYy4gVVAtMjAwMCgrKSBib2FyZHMgKi8KCiNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgojaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgojaW5jbHVkZSA8bGludXgvc2xhYi5oPgojaW5jbHVkZSA8bGludXgvaW5pdC5oPgojaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiNpbmNsdWRlIDxsaW51eC9wY2kuaD4KI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KCiNpbmNsdWRlIDxsaW51eC9pMmMuaD4KI2luY2x1ZGUgPGxpbnV4L2kyYy1hbGdvLXBjZi5oPgoKI2luY2x1ZGUgPGFzbS9pby5oPgojaW5jbHVkZSA8YXNtL2lycS5oPgoKI2luY2x1ZGUgIi4uL2FsZ29zL2kyYy1hbGdvLXBjZi5oIgoKI2RlZmluZSBERUZBVUxUX0JBU0UgMHgzMzAKCnN0YXRpYyBpbnQgYmFzZTsKc3RhdGljIHU4IF9faW9tZW0gKmJhc2VfaW9tZW07CgpzdGF0aWMgaW50IGlycTsKc3RhdGljIGludCBjbG9jayAgPSAweDFjOwpzdGF0aWMgaW50IG93biAgICA9IDB4NTU7CnN0YXRpYyBpbnQgbW1hcHBlZDsKCi8qIHZkb3Zpa2luOiByZW1vdmVkIHN0YXRpYyBzdHJ1Y3QgaTJjX3BjZl9pc2EgZ3BpOyBjb2RlIC0KICB0aGlzIG1vZHVsZSBpbiByZWFsIHN1cHBvcnRzIG9ubHkgb25lIGRldmljZSwgZHVlIHRvIG1pc3NpbmcgYXJndW1lbnRzCiAgaW4gc29tZSBmdW5jdGlvbnMsIGNhbGxlZCBmcm9tIHRoZSBhbGdvLXBjZiBtb2R1bGUuIFNvbWV0aW1lcyBpdCdzCiAgbmVlZCB0byBiZSByZXdyaXRlbiAtIGJ1dCBmb3Igbm93IGp1c3QgcmVtb3ZlIHRoaXMgZm9yIHNpbXBsZXIgcmVhZGluZyAqLwoKc3RhdGljIHdhaXRfcXVldWVfaGVhZF90IHBjZl93YWl0OwpzdGF0aWMgaW50IHBjZl9wZW5kaW5nOwpzdGF0aWMgc3BpbmxvY2tfdCBsb2NrOwoKc3RhdGljIHN0cnVjdCBpMmNfYWRhcHRlciBwY2ZfaXNhX29wczsKCi8qIC0tLS0tIGxvY2FsIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCSovCgpzdGF0aWMgdm9pZCBwY2ZfaXNhX3NldGJ5dGUodm9pZCAqZGF0YSwgaW50IGN0bCwgaW50IHZhbCkKewoJdTggX19pb21lbSAqYWRkcmVzcyA9IGN0bCA/IChiYXNlX2lvbWVtICsgMSkgOiBiYXNlX2lvbWVtOwoKCS8qIGVuYWJsZSBpcnEgaWYgYW55IHNwZWNpZmllZCBmb3Igc2VyaWFsIG9wZXJhdGlvbiAqLwoJaWYgKGN0bCAmJiBpcnEgJiYgKHZhbCAmIEkyQ19QQ0ZfRVNPKSkgewoJCXZhbCB8PSBJMkNfUENGX0VOSTsKCX0KCglwcl9kZWJ1ZygiJXM6IFdyaXRlICVwIDB4JTAyWFxuIiwgcGNmX2lzYV9vcHMubmFtZSwgYWRkcmVzcywgdmFsKTsKCWlvd3JpdGU4KHZhbCwgYWRkcmVzcyk7CiNpZmRlZiBfX2FscGhhX18KCS8qIEFQSSBVUDIwMDAgbmVlZHMgc29tZSBoYXJkd2FyZSBmdWRnaW5nIHRvIG1ha2UgdGhlIHdyaXRlIHN0aWNrICovCglpb3dyaXRlOCh2YWwsIGFkZHJlc3MpOwojZW5kaWYKfQoKc3RhdGljIGludCBwY2ZfaXNhX2dldGJ5dGUodm9pZCAqZGF0YSwgaW50IGN0bCkKewoJdTggX19pb21lbSAqYWRkcmVzcyA9IGN0bCA/IChiYXNlX2lvbWVtICsgMSkgOiBiYXNlX2lvbWVtOwoJaW50IHZhbCA9IGlvcmVhZDgoYWRkcmVzcyk7CgoJcHJfZGVidWcoIiVzOiBSZWFkICVwIDB4JTAyWFxuIiwgcGNmX2lzYV9vcHMubmFtZSwgYWRkcmVzcywgdmFsKTsKCXJldHVybiAodmFsKTsKfQoKc3RhdGljIGludCBwY2ZfaXNhX2dldG93bih2b2lkICpkYXRhKQp7CglyZXR1cm4gKG93bik7Cn0KCgpzdGF0aWMgaW50IHBjZl9pc2FfZ2V0Y2xvY2sodm9pZCAqZGF0YSkKewoJcmV0dXJuIChjbG9jayk7Cn0KCnN0YXRpYyB2b2lkIHBjZl9pc2Ffd2FpdGZvcnBpbih2b2lkKSB7CglERUZJTkVfV0FJVCh3YWl0KTsKCWludCB0aW1lb3V0ID0gMjsKCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CgoJaWYgKGlycSA+IDApIHsKCQlzcGluX2xvY2tfaXJxc2F2ZSgmbG9jaywgZmxhZ3MpOwoJCWlmIChwY2ZfcGVuZGluZyA9PSAwKSB7CgkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvY2ssIGZsYWdzKTsKCQkJcHJlcGFyZV90b193YWl0KCZwY2Zfd2FpdCwgJndhaXQsIFRBU0tfSU5URVJSVVBUSUJMRSk7CgkJCWlmIChzY2hlZHVsZV90aW1lb3V0KHRpbWVvdXQqSFopKSB7CgkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmbG9jaywgZmxhZ3MpOwoJCQkJaWYgKHBjZl9wZW5kaW5nID09IDEpIHsKCQkJCQlwY2ZfcGVuZGluZyA9IDA7CgkJCQl9CgkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NrLCBmbGFncyk7CgkJCX0KCQkJZmluaXNoX3dhaXQoJnBjZl93YWl0LCAmd2FpdCk7CgkJfSBlbHNlIHsKCQkJcGNmX3BlbmRpbmcgPSAwOwoJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NrLCBmbGFncyk7CgkJfQoJfSBlbHNlIHsKCQl1ZGVsYXkoMTAwKTsKCX0KfQoKCnN0YXRpYyBpcnFyZXR1cm5fdCBwY2ZfaXNhX2hhbmRsZXIoaW50IHRoaXNfaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKSB7CglzcGluX2xvY2soJmxvY2spOwoJcGNmX3BlbmRpbmcgPSAxOwoJc3Bpbl91bmxvY2soJmxvY2spOwoJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwY2Zfd2FpdCk7CglyZXR1cm4gSVJRX0hBTkRMRUQ7Cn0KCgpzdGF0aWMgaW50IHBjZl9pc2FfaW5pdCh2b2lkKQp7CglzcGluX2xvY2tfaW5pdCgmbG9jayk7CglpZiAoIW1tYXBwZWQpIHsKCQlpZiAoIXJlcXVlc3RfcmVnaW9uKGJhc2UsIDIsIHBjZl9pc2Ffb3BzLm5hbWUpKSB7CgkJCXByaW50ayhLRVJOX0VSUiAiJXM6IHJlcXVlc3RlZCBJL08gcmVnaW9uICglI3g6MikgaXMgIgoJCQkgICAgICAgImluIHVzZVxuIiwgcGNmX2lzYV9vcHMubmFtZSwgYmFzZSk7CgkJCXJldHVybiAtRU5PREVWOwoJCX0KCQliYXNlX2lvbWVtID0gaW9wb3J0X21hcChiYXNlLCAyKTsKCQlpZiAoIWJhc2VfaW9tZW0pIHsKCQkJcHJpbnRrKEtFUk5fRVJSICIlczogcmVtYXAgb2YgSS9PIHJlZ2lvbiAlI3ggZmFpbGVkXG4iLAoJCQkgICAgICAgcGNmX2lzYV9vcHMubmFtZSwgYmFzZSk7CgkJCXJlbGVhc2VfcmVnaW9uKGJhc2UsIDIpOwoJCQlyZXR1cm4gLUVOT0RFVjsKCQl9Cgl9IGVsc2UgewoJCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKGJhc2UsIDIsIHBjZl9pc2Ffb3BzLm5hbWUpKSB7CgkJCXByaW50ayhLRVJOX0VSUiAiJXM6IHJlcXVlc3RlZCBtZW1vcnkgcmVnaW9uICglI3g6MikgIgoJCQkgICAgICAgImlzIGluIHVzZVxuIiwgcGNmX2lzYV9vcHMubmFtZSwgYmFzZSk7CgkJCXJldHVybiAtRU5PREVWOwoJCX0KCQliYXNlX2lvbWVtID0gaW9yZW1hcChiYXNlLCAyKTsKCQlpZiAoYmFzZV9pb21lbSA9PSBOVUxMKSB7CgkJCXByaW50ayhLRVJOX0VSUiAiJXM6IHJlbWFwIG9mIG1lbW9yeSByZWdpb24gJSN4ICIKCQkJICAgICAgICJmYWlsZWRcbiIsIHBjZl9pc2Ffb3BzLm5hbWUsIGJhc2UpOwoJCQlyZWxlYXNlX21lbV9yZWdpb24oYmFzZSwgMik7CgkJCXJldHVybiAtRU5PREVWOwoJCX0KCX0KCXByX2RlYnVnKCIlczogcmVnaXN0ZXJzICUjeCByZW1hcHBlZCB0byAlcFxuIiwgcGNmX2lzYV9vcHMubmFtZSwgYmFzZSwKCQkgYmFzZV9pb21lbSk7CgoJaWYgKGlycSA+IDApIHsKCQlpZiAocmVxdWVzdF9pcnEoaXJxLCBwY2ZfaXNhX2hhbmRsZXIsIDAsIHBjZl9pc2Ffb3BzLm5hbWUsCgkJCQlOVUxMKSA8IDApIHsKCQkJcHJpbnRrKEtFUk5fRVJSICIlczogUmVxdWVzdCBpcnElZCBmYWlsZWRcbiIsCgkJCSAgICAgICBwY2ZfaXNhX29wcy5uYW1lLCBpcnEpOwoJCQlpcnEgPSAwOwoJCX0gZWxzZQoJCQllbmFibGVfaXJxKGlycSk7Cgl9CglyZXR1cm4gMDsKfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIEVuY2Fwc3VsYXRlIHRoZSBhYm92ZSBmdW5jdGlvbnMgaW4gdGhlIGNvcnJlY3Qgb3BlcmF0aW9ucyBzdHJ1Y3R1cmUuCiAqIFRoaXMgaXMgb25seSBkb25lIHdoZW4gbW9yZSB0aGFuIG9uZSBoYXJkd2FyZSBhZGFwdGVyIGlzIHN1cHBvcnRlZC4KICovCnN0YXRpYyBzdHJ1Y3QgaTJjX2FsZ29fcGNmX2RhdGEgcGNmX2lzYV9kYXRhID0gewoJLnNldHBjZgkgICAgPSBwY2ZfaXNhX3NldGJ5dGUsCgkuZ2V0cGNmCSAgICA9IHBjZl9pc2FfZ2V0Ynl0ZSwKCS5nZXRvd24JICAgID0gcGNmX2lzYV9nZXRvd24sCgkuZ2V0Y2xvY2sgICA9IHBjZl9pc2FfZ2V0Y2xvY2ssCgkud2FpdGZvcnBpbiA9IHBjZl9pc2Ffd2FpdGZvcnBpbiwKCS51ZGVsYXkJICAgID0gMTAsCgkubWRlbGF5CSAgICA9IDEwLAoJLnRpbWVvdXQgICAgPSAxMDAsCn07CgpzdGF0aWMgc3RydWN0IGkyY19hZGFwdGVyIHBjZl9pc2Ffb3BzID0gewoJLm93bmVyCQk9IFRISVNfTU9EVUxFLAoJLmNsYXNzCQk9IEkyQ19DTEFTU19IV01PTiwKCS5pZAkJPSBJMkNfSFdfUF9FTEVLLAoJLmFsZ29fZGF0YQk9ICZwY2ZfaXNhX2RhdGEsCgkubmFtZQkJPSAiaTJjLWVsZWt0b3IiLAp9OwoKc3RhdGljIGludCBfX2luaXQgaTJjX3BjZmlzYV9pbml0KHZvaWQpCnsKI2lmZGVmIF9fYWxwaGFfXwoJLyogY2hlY2sgdG8gc2VlIHdlIGhhdmUgbWVtb3J5IG1hcHBlZCBQQ0Y4NTg0IGNvbm5lY3RlZCB0byB0aGUKCUN5cHJlc3MgY3k4MmM2OTMgUENJLUlTQSBicmlkZ2UgYXMgb24gVVAyMDAwIGJvYXJkICovCglpZiAoYmFzZSA9PSAwKSB7CgkJc3RydWN0IHBjaV9kZXYgKmN5NjkzX2RldjsKCgkJY3k2OTNfZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9DT05UQVEsCgkJCQkJICAgUENJX0RFVklDRV9JRF9DT05UQVFfODJDNjkzLCBOVUxMKTsKCQlpZiAoY3k2OTNfZGV2KSB7CgkJCXVuc2lnbmVkIGNoYXIgY29uZmlnOwoJCQkvKiB5ZWFwLCB3ZSd2ZSBmb3VuZCBjeXByZXNzLCBsZXQncyBjaGVjayBjb25maWcgKi8KCQkJaWYgKCFwY2lfcmVhZF9jb25maWdfYnl0ZShjeTY5M19kZXYsIDB4NDcsICZjb25maWcpKSB7CgoJCQkJcHJfZGVidWcoIiVzOiBmb3VuZCBjeTgyYzY5MywgY29uZmlnICIKCQkJCQkgInJlZ2lzdGVyIDB4NDcgPSAweCUwMnhcbiIsCgkJCQkJIHBjZl9pc2Ffb3BzLm5hbWUsIGNvbmZpZyk7CgoJCQkJLyogVVAyMDAwIGJvYXJkIGhhcyB0aGlzIHJlZ2lzdGVyIHNldCB0byAweGUxLAoJCQkJICAgYnV0IHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdCBhcyBzZWVtcyBjYW4gYmUKCQkJCSAgIHJlc2V0IGR1cmluZyB0aGUgcHJvcGVyIGluaXRpYWxpc2F0aW9uCgkJCQkgICBzZXF1ZW5jZSBpZiBndXlzIGZyb20gQVBJIGRlY2lkZXMgdG8gZG8gdGhhdAoJCQkJICAgKHNvLCB3ZSBjYW4gZXZlbiBlbmFibGUgVHN1bmFtaSBQY2hpcAoJCQkJICAgd2luZG93IGZvciB0aGUgdXBwZXIgMSBHYikgKi8KCgkJCQkvKiBzbyBqdXN0IGNoZWNrIGZvciBST01DUyBhdCAweGUwMDAwLAoJCQkJICAgUk9NQ1MgZW5hYmxlZCBmb3Igd3JpdGVzCgkJCQkgICBhbmQgZXh0ZXJuYWwgWEQgQnVzIGJ1ZmZlciBpbiB1c2UuICovCgkJCQlpZiAoKGNvbmZpZyAmIDB4N2YpID09IDB4NjEpIHsKCQkJCQkvKiBzZWVtcyB0byBiZSBVUDIwMDAgbGlrZSBib2FyZCAqLwoJCQkJCWJhc2UgPSAweGUwMDAwOwoJCQkJCW1tYXBwZWQgPSAxOwoJCQkJCS8qIFVQMjAwMCBkcml2ZXMgSVNBIHdpdGgKCQkJCQkgICA4LjI1IE1IeiAoUENJLzQpIGNsb2NrCgkJCQkJICAgKHRoaXMgY2FuIGJlIHJlYWQgZnJvbSBjeXByZXNzKSAqLwoJCQkJCWNsb2NrID0gSTJDX1BDRl9DTEsgfCBJMkNfUENGX1RSTlM5MDsKCQkJCQlwcl9pbmZvKCIlczogZm91bmQgQVBJIFVQMjAwMCBsaWtlICIKCQkJCQkJImJvYXJkLCB3aWxsIHByb2JlIFBDRjg1ODQgIgoJCQkJCQkibGF0ZXJcbiIsIHBjZl9pc2Ffb3BzLm5hbWUpOwoJCQkJfQoJCQl9CgkJCXBjaV9kZXZfcHV0KGN5NjkzX2Rldik7CgkJfQoJfQojZW5kaWYKCgkvKiBzYW5pdHkgY2hlY2tzIGZvciBtbWFwcGVkIEkvTyAqLwoJaWYgKG1tYXBwZWQgJiYgYmFzZSA8IDB4YzgwMDApIHsKCQlwcmludGsoS0VSTl9FUlIgIiVzOiBpbmNvcnJlY3QgYmFzZSBhZGRyZXNzICglI3gpIHNwZWNpZmllZCAiCgkJICAgICAgICJmb3IgbW1hcHBlZCBJL09cbiIsIHBjZl9pc2Ffb3BzLm5hbWUsIGJhc2UpOwoJCXJldHVybiAtRU5PREVWOwoJfQoKCWlmIChiYXNlID09IDApIHsKCQliYXNlID0gREVGQVVMVF9CQVNFOwoJfQoKCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnBjZl93YWl0KTsKCWlmIChwY2ZfaXNhX2luaXQoKSkKCQlyZXR1cm4gLUVOT0RFVjsKCWlmIChpMmNfcGNmX2FkZF9idXMoJnBjZl9pc2Ffb3BzKSA8IDApCgkJZ290byBmYWlsOwoKCWRldl9pbmZvKCZwY2ZfaXNhX29wcy5kZXYsICJmb3VuZCBkZXZpY2UgYXQgJSN4XG4iLCBiYXNlKTsKCglyZXR1cm4gMDsKCiBmYWlsOgoJaWYgKGlycSA+IDApIHsKCQlkaXNhYmxlX2lycShpcnEpOwoJCWZyZWVfaXJxKGlycSwgTlVMTCk7Cgl9CgoJaWYgKCFtbWFwcGVkKSB7CgkJaW9wb3J0X3VubWFwKGJhc2VfaW9tZW0pOwoJCXJlbGVhc2VfcmVnaW9uKGJhc2UsIDIpOwoJfSBlbHNlIHsKCQlpb3VubWFwKGJhc2VfaW9tZW0pOwoJCXJlbGVhc2VfbWVtX3JlZ2lvbihiYXNlLCAyKTsKCX0KCXJldHVybiAtRU5PREVWOwp9CgpzdGF0aWMgdm9pZCBpMmNfcGNmaXNhX2V4aXQodm9pZCkKewoJaTJjX3BjZl9kZWxfYnVzKCZwY2ZfaXNhX29wcyk7CgoJaWYgKGlycSA+IDApIHsKCQlkaXNhYmxlX2lycShpcnEpOwoJCWZyZWVfaXJxKGlycSwgTlVMTCk7Cgl9CgoJaWYgKCFtbWFwcGVkKSB7CgkJaW9wb3J0X3VubWFwKGJhc2VfaW9tZW0pOwoJCXJlbGVhc2VfcmVnaW9uKGJhc2UsIDIpOwoJfSBlbHNlIHsKCQlpb3VubWFwKGJhc2VfaW9tZW0pOwoJCXJlbGVhc2VfbWVtX3JlZ2lvbihiYXNlLCAyKTsKCX0KfQoKTU9EVUxFX0FVVEhPUigiSGFucyBCZXJnbHVuZCA8aGJAc3BhY2V0ZWMubm8+Iik7Ck1PRFVMRV9ERVNDUklQVElPTigiSTJDLUJ1cyBhZGFwdGVyIHJvdXRpbmVzIGZvciBQQ0Y4NTg0IElTQSBidXMgYWRhcHRlciIpOwpNT0RVTEVfTElDRU5TRSgiR1BMIik7Cgptb2R1bGVfcGFyYW0oYmFzZSwgaW50LCAwKTsKbW9kdWxlX3BhcmFtKGlycSwgaW50LCAwKTsKbW9kdWxlX3BhcmFtKGNsb2NrLCBpbnQsIDApOwptb2R1bGVfcGFyYW0ob3duLCBpbnQsIDApOwptb2R1bGVfcGFyYW0obW1hcHBlZCwgaW50LCAwKTsKCm1vZHVsZV9pbml0KGkyY19wY2Zpc2FfaW5pdCk7Cm1vZHVsZV9leGl0KGkyY19wY2Zpc2FfZXhpdCk7Cg==