LyoKICogIFVEUCBNSUIgZ3JvdXAgVGFibGUgaW1wbGVtZW50YXRpb24gLSB1ZHBUYWJsZS5jCiAqCiAqLwoKLyogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29weXJpZ2h0KHMpLiAgU2VlCiAqIHRoZSBOZXQtU05NUCdzIENPUFlJTkcgZmlsZSBmb3IgbW9yZSBkZXRhaWxzIGFuZCBvdGhlciBjb3B5cmlnaHRzCiAqIHRoYXQgbWF5IGFwcGx5OgogKi8KLyoKICogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBjb3B5cmlnaHRlZCBieToKICogQ29weXJpZ2h0IKkgMjAwMyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqIFVzZSBpcyBzdWJqZWN0IHRvIGxpY2Vuc2UgdGVybXMgc3BlY2lmaWVkIGluIHRoZSBDT1BZSU5HIGZpbGUKICogZGlzdHJpYnV0ZWQgd2l0aCB0aGUgTmV0LVNOTVAgcGFja2FnZS4KICovCgojaW5jbHVkZSA8bmV0LXNubXAvbmV0LXNubXAtY29uZmlnLmg+CiNpbmNsdWRlICJtaWJJSV9jb21tb24uaCIKCiNpZiBIQVZFX05FVElORVRfVURQX0gKI2luY2x1ZGUgPG5ldGluZXQvdWRwLmg+CiNlbmRpZgojaWYgSEFWRV9ORVRJTkVUX1VEUF9WQVJfSAojaW5jbHVkZSA8bmV0aW5ldC91ZHBfdmFyLmg+CiNlbmRpZgoKI2luY2x1ZGUgPG5ldC1zbm1wL25ldC1zbm1wLWluY2x1ZGVzLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9hZ2VudC9uZXQtc25tcC1hZ2VudC1pbmNsdWRlcy5oPgojaW5jbHVkZSA8bmV0LXNubXAvYWdlbnQvYXV0b19ubGlzdC5oPgoKI2lmZGVmIGxpbnV4CiNpbmNsdWRlICJ0Y3BUYWJsZS5oIgojZW5kaWYKI2luY2x1ZGUgInVkcC5oIgojaW5jbHVkZSAidWRwVGFibGUuaCIKCiNpZmRlZiBocHV4MTEKI2RlZmluZQlVRFBUQUJMRV9FTlRSWV9UWVBFCW1pYl91ZHBMc25FbnQgCiNkZWZpbmUJVURQVEFCTEVfTE9DQUxBRERSRVNTCUxvY2FsQWRkcmVzcyAKI2RlZmluZQlVRFBUQUJMRV9MT0NBTFBPUlQJTG9jYWxQb3J0IAojZGVmaW5lCVVEUFRBQkxFX0lTX1RBQkxFCiNlbHNlCgojaWZkZWYgc29sYXJpczIKdHlwZWRlZiBzdHJ1Y3QgbmV0c25tcF91ZHBFbnRyeV9zIG5ldHNubXBfdWRwRW50cnk7CnN0cnVjdCBuZXRzbm1wX3VkcEVudHJ5X3MgewogICAgbWliMl91ZHBFbnRyeV90ICAgZW50cnk7CiAgICBuZXRzbm1wX3VkcEVudHJ5ICppbnBfbmV4dDsKfTsKI2RlZmluZQlVRFBUQUJMRV9FTlRSWV9UWVBFCW5ldHNubXBfdWRwRW50cnkKI2RlZmluZQlVRFBUQUJMRV9MT0NBTEFERFJFU1MJZW50cnkudWRwTG9jYWxBZGRyZXNzIAojZGVmaW5lCVVEUFRBQkxFX0xPQ0FMUE9SVAllbnRyeS51ZHBMb2NhbFBvcnQgCiNkZWZpbmUJVURQVEFCTEVfSVNfTElOS0VEX0xJU1QKI2Vsc2UKCiNpZiBkZWZpbmVkIChXSU4zMikgfHwgZGVmaW5lZCAoY3lnd2luKQojaW5jbHVkZSA8aXBobHBhcGkuaD4KI2RlZmluZQlVRFBUQUJMRV9FTlRSWV9UWVBFCU1JQl9VRFBST1cJCS8qID8/PyAqLwojZGVmaW5lCVVEUFRBQkxFX0xPQ0FMQUREUkVTUwlkd0xvY2FsQWRkcgojZGVmaW5lCVVEUFRBQkxFX0xPQ0FMUE9SVAlkd0xvY2FsUG9ydCAKI2RlZmluZQlVRFBUQUJMRV9JU19UQUJMRQojZWxzZQkJCS8qIGV2ZXJ5dGhpbmcgZWxzZSAqLwoKI2lmZGVmIGxpbnV4CiNkZWZpbmUgSU5QX05FWFRfU1lNQk9MCQlpbnBfbmV4dAojZW5kaWYKI2lmZGVmIG9wZW5ic2Q0CiNkZWZpbmUgSU5QX05FWFRfU1lNQk9MCQlpbnBfcXVldWUuY3FlX25leHQJLyogb3Igc2V0IHZpYSA8bmV0LXNubXAvc3lzdGVtL29wZW5ic2QuaD4gKi8KI2VuZGlmCgojaWYgZGVmaW5lZChmcmVlYnNkNCkgfHwgZGVmaW5lZChkYXJ3aW4pIHx8IGRlZmluZWQob3NmNSkKdHlwZWRlZiBzdHJ1Y3QgbmV0c25tcF9pbnBjYl9zIG5ldHNubXBfaW5wY2I7CnN0cnVjdCBuZXRzbm1wX2lucGNiX3MgewogICAgc3RydWN0IGlucGNiICAgIHBjYjsKICAgIGludCAgICAgICAgICAgICBzdGF0ZTsKICAgIG5ldHNubXBfaW5wY2IgICppbnBfbmV4dDsKfTsKI2RlZmluZQlVRFBUQUJMRV9FTlRSWV9UWVBFCW5ldHNubXBfaW5wY2IgCiNkZWZpbmUJVURQVEFCTEVfTE9DQUxBRERSRVNTCXBjYi5pbnBfbGFkZHIuc19hZGRyIAojZGVmaW5lCVVEUFRBQkxFX0xPQ0FMUE9SVAlwY2IuaW5wX2xwb3J0CiNlbHNlCiNkZWZpbmUJVURQVEFCTEVfRU5UUllfVFlQRQlzdHJ1Y3QgaW5wY2IgCiNkZWZpbmUJVURQVEFCTEVfTE9DQUxBRERSRVNTCWlucF9sYWRkci5zX2FkZHIgCiNkZWZpbmUJVURQVEFCTEVfTE9DQUxQT1JUCWlucF9scG9ydAojZW5kaWYKI2RlZmluZQlVRFBUQUJMRV9JU19MSU5LRURfTElTVAoKI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXSU4zMiBjeWd3aW4gKi8KI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzb2xhcmlzMiAqLwojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGhwdXgxMSAqLwoKCQkJCS8qIEhlYWQgb2YgbGlua2VkIGxpc3QsIG9yIHJvb3Qgb2YgdGFibGUgKi8KVURQVEFCTEVfRU5UUllfVFlQRQkqdWRwX2hlYWQgID0gTlVMTDsKaW50ICAgICAgICAgICAgICAgICAgICAgIHVkcF9zaXplICA9IDA7CS8qIE9ubHkgdXNlZCBmb3IgdGFibGUtYmFzZWQgc3lzdGVtcyAqLwoKCgkvKgoJICoKCSAqIEluaXRpYWxpemF0aW9uIGFuZCBoYW5kbGVyIHJvdXRpbmVzIGFyZSBjb21tb24gdG8gYWxsIGFyY2hpdGVjdHVyZXMKCSAqCgkgKi8KI2lmbmRlZiBNSUJfU1RBVFNfQ0FDSEVfVElNRU9VVAojZGVmaW5lIE1JQl9TVEFUU19DQUNIRV9USU1FT1VUCTUKI2VuZGlmCiNpZm5kZWYgVURQX1NUQVRTX0NBQ0hFX1RJTUVPVVQKI2RlZmluZSBVRFBfU1RBVFNfQ0FDSEVfVElNRU9VVAlNSUJfU1RBVFNfQ0FDSEVfVElNRU9VVAojZW5kaWYKCiNpZmRlZiBVRFBfQUREUkVTU0VTX0lOX0hPU1RfT1JERVIKI2RlZmluZSBVRFBfQUREUkVTU19UT19IT1NUX09SREVSKHgpIHgKI2RlZmluZSBVRFBfQUREUkVTU19UT19ORVRXT1JLX09SREVSKHgpIGh0b25sKHgpCiNlbHNlCiNkZWZpbmUgVURQX0FERFJFU1NfVE9fSE9TVF9PUkRFUih4KSBudG9obCh4KQojZGVmaW5lIFVEUF9BRERSRVNTX1RPX05FVFdPUktfT1JERVIoeCkgeAojZW5kaWYKCiNpZmRlZiBVRFBfUE9SVFNfSU5fSE9TVF9PUkRFUgojZGVmaW5lIFVEUF9QT1JUX1RPX0hPU1RfT1JERVIoeCkgeAojZWxzZQojZGVmaW5lIFVEUF9QT1JUX1RPX0hPU1RfT1JERVIoeCkgbnRvaHMoeCkKI2VuZGlmCgoKb2lkICAgICAgICAgICAgIHVkcFRhYmxlX29pZFtdID0geyBTTk1QX09JRF9NSUIyLCA3LCA1IH07Cgp2b2lkCmluaXRfdWRwVGFibGUodm9pZCkKewogICAgbmV0c25tcF90YWJsZV9yZWdpc3RyYXRpb25faW5mbyAqdGFibGVfaW5mbzsKICAgIG5ldHNubXBfaXRlcmF0b3JfaW5mbyAgICAgICAgICAgKmlpbmZvOwogICAgbmV0c25tcF9oYW5kbGVyX3JlZ2lzdHJhdGlvbiAgICAqcmVnaW5mbzsKICAgIGludCByYzsKCiAgICBERUJVR01TR1RMKCgibWliSUkvdWRwVGFibGUiLCAiSW5pdGlhbGlzaW5nIFVEUCBUYWJsZVxuIikpOwogICAgLyoKICAgICAqIENyZWF0ZSB0aGUgdGFibGUgZGF0YSBzdHJ1Y3R1cmUsIGFuZCBkZWZpbmUgdGhlIGluZGV4aW5nLi4uLgogICAgICovCiAgICB0YWJsZV9pbmZvID0gU05NUF9NQUxMT0NfVFlQRURFRihuZXRzbm1wX3RhYmxlX3JlZ2lzdHJhdGlvbl9pbmZvKTsKICAgIGlmICghdGFibGVfaW5mbykgewogICAgICAgIHJldHVybjsKICAgIH0KICAgIG5ldHNubXBfdGFibGVfaGVscGVyX2FkZF9pbmRleGVzKHRhYmxlX2luZm8sIEFTTl9JUEFERFJFU1MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU05fSU5URUdFUiwgMCk7CiAgICB0YWJsZV9pbmZvLT5taW5fY29sdW1uID0gVURQTE9DQUxBRERSRVNTOwogICAgdGFibGVfaW5mby0+bWF4X2NvbHVtbiA9IFVEUExPQ0FMUE9SVDsKCgogICAgLyoKICAgICAqIC4uLi4gYW5kIGl0ZXJhdGlvbiBpbmZvcm1hdGlvbiAuLi4uCiAgICAgKi8KICAgIGlpbmZvICAgICAgPSBTTk1QX01BTExPQ19UWVBFREVGKG5ldHNubXBfaXRlcmF0b3JfaW5mbyk7CiAgICBpZiAoIWlpbmZvKSB7CiAgICAgICAgbmV0c25tcF90YWJsZV9yZWdpc3RyYXRpb25faW5mb19mcmVlKHRhYmxlX2luZm8pOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIGlpbmZvLT5nZXRfZmlyc3RfZGF0YV9wb2ludCA9IHVkcFRhYmxlX2ZpcnN0X2VudHJ5OwogICAgaWluZm8tPmdldF9uZXh0X2RhdGFfcG9pbnQgID0gdWRwVGFibGVfbmV4dF9lbnRyeTsKICAgIGlpbmZvLT50YWJsZV9yZWdpbmZvICAgICAgICA9IHRhYmxlX2luZm87CiNpZiBkZWZpbmVkIChXSU4zMikgfHwgZGVmaW5lZCAoY3lnd2luKQogICAgaWluZm8tPmZsYWdzICAgICAgICAgICAgICAgfD0gTkVUU05NUF9JVEVSQVRPUl9GTEFHX1NPUlRFRDsKI2VuZGlmIC8qIFdJTjMyIHx8IGN5Z3dpbiAqLwoKCiAgICAvKgogICAgICogLi4uLiBhbmQgcmVnaXN0ZXIgdGhlIHRhYmxlIHdpdGggdGhlIGFnZW50LgogICAgICovCiAgICByZWdpbmZvID0gbmV0c25tcF9jcmVhdGVfaGFuZGxlcl9yZWdpc3RyYXRpb24oInVkcFRhYmxlIiwKICAgICAgICAgICAgdWRwVGFibGVfaGFuZGxlciwKICAgICAgICAgICAgdWRwVGFibGVfb2lkLCBPSURfTEVOR1RIKHVkcFRhYmxlX29pZCksCiAgICAgICAgICAgIEhBTkRMRVJfQ0FOX1JPTkxZKSwKICAgIHJjID0gbmV0c25tcF9yZWdpc3Rlcl90YWJsZV9pdGVyYXRvcihyZWdpbmZvLCBpaW5mbyk7CiAgICBpZiAocmMgIT0gU05NUEVSUl9TVUNDRVNTKQogICAgICAgIHJldHVybjsKCiAgICAvKgogICAgICogLi4uLiB3aXRoIGEgbG9jYWwgY2FjaGUKICAgICAqLwogICAgbmV0c25tcF9pbmplY3RfaGFuZGxlciggcmVnaW5mbywKCQkgICAgbmV0c25tcF9nZXRfY2FjaGVfaGFuZGxlcihVRFBfU1RBVFNfQ0FDSEVfVElNRU9VVCwKCQkJICAgCQl1ZHBUYWJsZV9sb2FkLCB1ZHBUYWJsZV9mcmVlLAoJCQkJCXVkcFRhYmxlX29pZCwgT0lEX0xFTkdUSCh1ZHBUYWJsZV9vaWQpKSk7Cn0KCgoKaW50CnVkcFRhYmxlX2hhbmRsZXIobmV0c25tcF9taWJfaGFuZGxlciAgICAgICAgICAqaGFuZGxlciwKICAgICAgICAgICAgICAgICBuZXRzbm1wX2hhbmRsZXJfcmVnaXN0cmF0aW9uICpyZWdpbmZvLAogICAgICAgICAgICAgICAgIG5ldHNubXBfYWdlbnRfcmVxdWVzdF9pbmZvICAgKnJlcWluZm8sCiAgICAgICAgICAgICAgICAgbmV0c25tcF9yZXF1ZXN0X2luZm8gICAgICAgICAqcmVxdWVzdHMpCnsKICAgIG5ldHNubXBfcmVxdWVzdF9pbmZvICAqcmVxdWVzdDsKICAgIG5ldHNubXBfdmFyaWFibGVfbGlzdCAqcmVxdWVzdHZiOwogICAgbmV0c25tcF90YWJsZV9yZXF1ZXN0X2luZm8gKnRhYmxlX2luZm87CiAgICBVRFBUQUJMRV9FTlRSWV9UWVBFCSAgKmVudHJ5OwogICAgb2lkICAgICAgc3ViaWQ7CiAgICBsb25nICAgICBwb3J0OwogICAgaW5fYWRkcl90IGFkZHI7CgogICAgREVCVUdNU0dUTCgoIm1pYklJL3VkcFRhYmxlIiwgIkhhbmRsZXIgLSBtb2RlICVzXG4iLAogICAgICAgICAgICAgICAgICAgIHNlX2ZpbmRfbGFiZWxfaW5fc2xpc3QoImFnZW50X21vZGUiLCByZXFpbmZvLT5tb2RlKSkpOwogICAgc3dpdGNoIChyZXFpbmZvLT5tb2RlKSB7CiAgICBjYXNlIE1PREVfR0VUOgogICAgICAgIGZvciAocmVxdWVzdD1yZXF1ZXN0czsgcmVxdWVzdDsgcmVxdWVzdD1yZXF1ZXN0LT5uZXh0KSB7CiAgICAgICAgICAgIHJlcXVlc3R2YiA9IHJlcXVlc3QtPnJlcXVlc3R2YjsKICAgICAgICAgICAgREVCVUdNU0dUTCgoICJtaWJJSS91ZHBUYWJsZSIsICJvaWQ6ICIpKTsKICAgICAgICAgICAgREVCVUdNU0dPSUQoKCJtaWJJSS91ZHBUYWJsZSIsIHJlcXVlc3R2Yi0+bmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3R2Yi0+bmFtZV9sZW5ndGgpKTsKICAgICAgICAgICAgREVCVUdNU0coKCAgICJtaWJJSS91ZHBUYWJsZSIsICJcbiIpKTsKCiAgICAgICAgICAgIGVudHJ5ID0gKFVEUFRBQkxFX0VOVFJZX1RZUEUgKiluZXRzbm1wX2V4dHJhY3RfaXRlcmF0b3JfY29udGV4dChyZXF1ZXN0KTsKICAgICAgICAgICAgaWYgKCFlbnRyeSkKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB0YWJsZV9pbmZvID0gbmV0c25tcF9leHRyYWN0X3RhYmxlX2luZm8ocmVxdWVzdCk7CiAgICAgICAgICAgIHN1YmlkICAgICAgPSB0YWJsZV9pbmZvLT5jb2xudW07CgogICAgICAgICAgICBzd2l0Y2ggKHN1YmlkKSB7CiAgICAgICAgICAgIGNhc2UgVURQTE9DQUxBRERSRVNTOgojaWYgZGVmaW5lZChvc2Y1KSAmJiBkZWZpbmVkKElONl9FWFRSQUNUX1Y0QUREUikKICAgICAgICAgICAgICAgIGFkZHIgPSBudG9obChJTjZfRVhUUkFDVF9WNEFERFIoJmVudHJ5LT5wY2IuaW5wX2xhZGRyKSk7CgkgICAgICAgIHNubXBfc2V0X3Zhcl90eXBlZF92YWx1ZShyZXF1ZXN0dmIsIEFTTl9JUEFERFJFU1MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVfY2hhciopJmFkZHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHVpbnQzMl90KSk7CiNlbHNlCiAgICAgICAgICAgICAgICBhZGRyID0gVURQX0FERFJFU1NfVE9fSE9TVF9PUkRFUihlbnRyeS0+VURQVEFCTEVfTE9DQUxBRERSRVNTKTsKCSAgICAgICAgc25tcF9zZXRfdmFyX3R5cGVkX3ZhbHVlKHJlcXVlc3R2YiwgQVNOX0lQQUREUkVTUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodV9jaGFyICopJmFkZHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHVpbnQzMl90KSk7CiNlbmRpZgogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgVURQTE9DQUxQT1JUOgogICAgICAgICAgICAgICAgcG9ydCA9IFVEUF9QT1JUX1RPX0hPU1RfT1JERVIoKHVfc2hvcnQpZW50cnktPlVEUFRBQkxFX0xPQ0FMUE9SVCk7CgkgICAgICAgIHNubXBfc2V0X3Zhcl90eXBlZF92YWx1ZShyZXF1ZXN0dmIsIEFTTl9JTlRFR0VSLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodV9jaGFyICopJnBvcnQsIHNpemVvZihwb3J0KSk7CiAgICAgICAgICAgICAgICBicmVhazsKCSAgICB9Cgl9CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBNT0RFX0dFVE5FWFQ6CiAgICBjYXNlIE1PREVfR0VUQlVMSzoKICAgIGNhc2UgTU9ERV9TRVRfUkVTRVJWRTE6CiAgICBjYXNlIE1PREVfU0VUX1JFU0VSVkUyOgogICAgY2FzZSBNT0RFX1NFVF9BQ1RJT046CiAgICBjYXNlIE1PREVfU0VUX0NPTU1JVDoKICAgIGNhc2UgTU9ERV9TRVRfRlJFRToKICAgIGNhc2UgTU9ERV9TRVRfVU5ETzoKICAgICAgICBzbm1wX2xvZyhMT0dfV0FSTklORywgIm1pYklJL3VkcFRhYmxlOiBVbnN1cHBvcnRlZCBtb2RlICglZClcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXFpbmZvLT5tb2RlKTsKICAgICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgICAgc25tcF9sb2coTE9HX1dBUk5JTkcsICJtaWJJSS91ZHBUYWJsZTogVW5yZWNvZ25pc2VkIG1vZGUgKCVkKVxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcWluZm8tPm1vZGUpOwogICAgICAgIGJyZWFrOwogICAgfQoKICAgIHJldHVybiBTTk1QX0VSUl9OT0VSUk9SOwp9CgoJLyoKCSAqIFR3byBmb3JtcyBvZiBpdGVyYXRpb24gaG9vayByb3V0aW5lczoKCSAqICAgIE9uZSBmb3Igd2hlbiB0aGUgVURQIHRhYmxlIGlzIHN0b3JlZCBhcyBhIHRhYmxlCgkgKiAgICBPbmUgZm9yIHdoZW4gdGhlIFVEUCB0YWJsZSBpcyBzdG9yZWQgYXMgYSBsaW5rZWQgbGlzdAoJICoKCSAqIEFsc28gYXBwbGllcyB0byB0aGUgY2FjaGUtaGFuZGxlciBmcmVlIHJvdXRpbmUKCSAqLwoKI2lmZGVmCVVEUFRBQkxFX0lTX1RBQkxFCm5ldHNubXBfdmFyaWFibGVfbGlzdCAqCnVkcFRhYmxlX2ZpcnN0X2VudHJ5KHZvaWQgKipsb29wX2NvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgIHZvaWQgKipkYXRhX2NvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgIG5ldHNubXBfdmFyaWFibGVfbGlzdCAqaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgIG5ldHNubXBfaXRlcmF0b3JfaW5mbyAqZGF0YSkKewogICAgLyoKICAgICAqIFhYWCAtIEhvdyBjYW4gd2UgdGVsbCBpZiB0aGUgY2FjaGUgaXMgdmFsaWQ/CiAgICAgKiAgICAgICBObyBhY2Nlc3MgdG8gJ3JlcWluZm8nCiAgICAgKi8KICAgIGlmICh1ZHBfc2l6ZSA9PSAwKQogICAgICAgIHJldHVybiBOVUxMOwoKICAgIC8qCiAgICAgKiBQb2ludCB0byB0aGUgZmlyc3QgZW50cnksIGFuZCB1c2UgdGhlCiAgICAgKiAnbmV4dF9lbnRyeScgaG9vayB0byByZXRyaWV2ZSB0aGlzIHJvdwogICAgICovCiAgICAqbG9vcF9jb250ZXh0ID0gMDsKICAgIHJldHVybiB1ZHBUYWJsZV9uZXh0X2VudHJ5KCBsb29wX2NvbnRleHQsIGRhdGFfY29udGV4dCwgaW5kZXgsIGRhdGEgKTsKfQoKbmV0c25tcF92YXJpYWJsZV9saXN0ICoKdWRwVGFibGVfbmV4dF9lbnRyeSggdm9pZCAqKmxvb3BfY29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKmRhdGFfY29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgbmV0c25tcF92YXJpYWJsZV9saXN0ICppbmRleCwKICAgICAgICAgICAgICAgICAgICAgbmV0c25tcF9pdGVyYXRvcl9pbmZvICpkYXRhKQp7CiAgICBpbnQgaSA9IChpbnQpKmxvb3BfY29udGV4dDsKICAgIGxvbmcgcG9ydDsKCiAgICBpZiAodWRwX3NpemUgPCBpKQogICAgICAgIHJldHVybiBOVUxMOwoKICAgIC8qCiAgICAgKiBTZXQgdXAgdGhlIGluZGV4aW5nIGZvciB0aGUgc3BlY2lmaWVkIHJvdy4uLgogICAgICovCiNpZiBkZWZpbmVkIChXSU4zMikgfHwgZGVmaW5lZCAoY3lnd2luKQogICAgcG9ydCA9IG50b2hsKCh1X2xvbmcpdWRwX2hlYWRbaV0uVURQVEFCTEVfTE9DQUxBRERSRVNTKTsKICAgIHNubXBfc2V0X3Zhcl92YWx1ZShpbmRleCwgKHVfY2hhciAqKSZwb3J0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHVkcF9oZWFkW2ldLlVEUFRBQkxFX0xPQ0FMQUREUkVTUykpOwojZWxzZQogICAgc25tcF9zZXRfdmFyX3ZhbHVlKGluZGV4LCAodV9jaGFyICopJnVkcF9oZWFkW2ldLlVEUFRBQkxFX0xPQ0FMQUREUkVTUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih1ZHBfaGVhZFtpXS5VRFBUQUJMRV9MT0NBTEFERFJFU1MpKTsKI2VuZGlmCiAgICBwb3J0ID0gVURQX1BPUlRfVE9fSE9TVF9PUkRFUigodV9zaG9ydCl1ZHBfaGVhZFtpXS5VRFBUQUJMRV9MT0NBTFBPUlQpOwogICAgc25tcF9zZXRfdmFyX3ZhbHVlKGluZGV4LT5uZXh0X3ZhcmlhYmxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVfY2hhciopJnBvcnQsIHNpemVvZihwb3J0KSk7CiAgICAvKgogICAgICogLi4uIHJldHVybiB0aGUgZGF0YSBzdHJ1Y3R1cmUgZm9yIHRoaXMgcm93LAogICAgICogYW5kIHVwZGF0ZSB0aGUgbG9vcCBjb250ZXh0IHJlYWR5IGZvciB0aGUgbmV4dCBvbmUuCiAgICAgKi8KICAgICpkYXRhX2NvbnRleHQgPSAodm9pZCopJnVkcF9oZWFkW2ldOwogICAgKmxvb3BfY29udGV4dCA9ICh2b2lkKikrK2k7CiAgICByZXR1cm4gaW5kZXg7Cn0KCnZvaWQKdWRwVGFibGVfZnJlZShuZXRzbm1wX2NhY2hlICpjYWNoZSwgdm9pZCAqbWFnaWMpCnsKI2lmIGRlZmluZWQgKFdJTjMyKSB8fCBkZWZpbmVkIChjeWd3aW4pCiAgICBpZiAodWRwX2hlYWQpIHsKCQkvKiB0aGUgYWxsb2NhdGVkIHN0cnVjdHVyZSBpcyBhIGNvdW50IGZvbGxvd2VkIGJ5IHRhYmxlIGVudHJpZXMgKi8KCQlmcmVlKChjaGFyICopKHVkcF9oZWFkKSAtIHNpemVvZihEV09SRCkpOwoJfQojZWxzZQogICAgaWYgKHVkcF9oZWFkKQogICAgICAgIGZyZWUodWRwX2hlYWQpOwojZW5kaWYKICAgIHVkcF9oZWFkID0gTlVMTDsKICAgIHVkcF9zaXplID0gMDsKfQojZWxzZQojaWZkZWYgVURQVEFCTEVfSVNfTElOS0VEX0xJU1QKbmV0c25tcF92YXJpYWJsZV9saXN0ICoKdWRwVGFibGVfZmlyc3RfZW50cnkodm9pZCAqKmxvb3BfY29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKmRhdGFfY29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgbmV0c25tcF92YXJpYWJsZV9saXN0ICppbmRleCwKICAgICAgICAgICAgICAgICAgICAgbmV0c25tcF9pdGVyYXRvcl9pbmZvICpkYXRhKQp7CiAgICAvKgogICAgICogWFhYIC0gSG93IGNhbiB3ZSB0ZWxsIGlmIHRoZSBjYWNoZSBpcyB2YWxpZD8KICAgICAqICAgICAgIE5vIGFjY2VzcyB0byAncmVxaW5mbycKICAgICAqLwogICAgaWYgKHVkcF9oZWFkID09IE5VTEwpCiAgICAgICAgcmV0dXJuIE5VTEw7CgogICAgLyoKICAgICAqIFBvaW50IHRvIHRoZSBmaXJzdCBlbnRyeSwgYW5kIHVzZSB0aGUKICAgICAqICduZXh0X2VudHJ5JyBob29rIHRvIHJldHJpZXZlIHRoaXMgcm93CiAgICAgKi8KICAgICpsb29wX2NvbnRleHQgPSAodm9pZCopdWRwX2hlYWQ7CiAgICByZXR1cm4gdWRwVGFibGVfbmV4dF9lbnRyeSggbG9vcF9jb250ZXh0LCBkYXRhX2NvbnRleHQsIGluZGV4LCBkYXRhICk7Cn0KCm5ldHNubXBfdmFyaWFibGVfbGlzdCAqCnVkcFRhYmxlX25leHRfZW50cnkoIHZvaWQgKipsb29wX2NvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgIHZvaWQgKipkYXRhX2NvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgIG5ldHNubXBfdmFyaWFibGVfbGlzdCAqaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgIG5ldHNubXBfaXRlcmF0b3JfaW5mbyAqZGF0YSkKewogICAgVURQVEFCTEVfRU5UUllfVFlQRQkgKmVudHJ5ID0gKFVEUFRBQkxFX0VOVFJZX1RZUEUgKikqbG9vcF9jb250ZXh0OwogICAgbG9uZyBwb3J0OwogICAgbG9uZyBhZGRyOwoKICAgIGlmICghZW50cnkpCiAgICAgICAgcmV0dXJuIE5VTEw7CgogICAgLyoKICAgICAqIFNldCB1cCB0aGUgaW5kZXhpbmcgZm9yIHRoZSBzcGVjaWZpZWQgcm93Li4uCiAgICAgKi8KI2lmIGRlZmluZWQob3NmNSkgJiYgZGVmaW5lZChJTjZfRVhUUkFDVF9WNEFERFIpCiAgICAgICAgICAgICAgICBzbm1wX3NldF92YXJfdmFsdWUoaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1X2NoYXIqKSZJTjZfRVhUUkFDVF9WNEFERFIoJmVudHJ5LT5wY2IuaW5wX2xhZGRyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKElONl9FWFRSQUNUX1Y0QUREUigmZW50cnktPnBjYi5pbnBfbGFkZHIpKSk7CiNlbHNlCiAgICBhZGRyID0gVURQX0FERFJFU1NfVE9fTkVUV09SS19PUkRFUigoaW5fYWRkcl90KWVudHJ5LT5VRFBUQUJMRV9MT0NBTEFERFJFU1MpOwogICAgc25tcF9zZXRfdmFyX3ZhbHVlKGluZGV4LCAodV9jaGFyICopJmFkZHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihhZGRyKSk7CiNlbmRpZgogICAgcG9ydCA9IFVEUF9QT1JUX1RPX0hPU1RfT1JERVIoZW50cnktPlVEUFRBQkxFX0xPQ0FMUE9SVCk7CiAgICBzbm1wX3NldF92YXJfdmFsdWUoaW5kZXgtPm5leHRfdmFyaWFibGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodV9jaGFyKikmcG9ydCwgc2l6ZW9mKHBvcnQpKTsKCiAgICAvKgogICAgICogLi4uIHJldHVybiB0aGUgZGF0YSBzdHJ1Y3R1cmUgZm9yIHRoaXMgcm93LAogICAgICogYW5kIHVwZGF0ZSB0aGUgbG9vcCBjb250ZXh0IHJlYWR5IGZvciB0aGUgbmV4dCBvbmUuCiAgICAgKi8KICAgICpkYXRhX2NvbnRleHQgPSAodm9pZCopZW50cnk7CiAgICAqbG9vcF9jb250ZXh0ID0gKHZvaWQqKWVudHJ5LT5JTlBfTkVYVF9TWU1CT0w7CiAgICByZXR1cm4gaW5kZXg7Cn0KCnZvaWQKdWRwVGFibGVfZnJlZShuZXRzbm1wX2NhY2hlICpjYWNoZSwgdm9pZCAqbWFnaWMpCnsKICAgIFVEUFRBQkxFX0VOVFJZX1RZUEUJICpwOwogICAgd2hpbGUgKHVkcF9oZWFkKSB7CiAgICAgICAgcCA9IHVkcF9oZWFkOwogICAgICAgIHVkcF9oZWFkID0gdWRwX2hlYWQtPklOUF9ORVhUX1NZTUJPTDsKICAgICAgICBmcmVlKHApOwogICAgfQoKICAgIHVkcF9oZWFkID0gTlVMTDsKfQojZW5kaWYJCS8qIFVEUFRBQkxFX0lTX0xJTktFRF9MSVNUICovCiNlbmRpZgkJLyogVURQVEFCTEVfSVNfVEFCTEUgKi8KCgoJLyoKCSAqCgkgKiBUaGUgY2FjaGUtaGFuZGxlciBsb2FkaW5nIHJvdXRpbmUgaXMgdGhlIG1haW4KCSAqICAgIHBsYWNlIGZvciBhcmNoaXRlY3R1cmUtc3BlY2lmaWMgY29kZQoJICoKCSAqIExvYWQgaW50byBlaXRoZXIgYSB0YWJsZSBzdHJ1Y3R1cmUsIG9yIGEgbGlua2VkIGxpc3QKCSAqICAgIGRlcGVuZGluZyBvbiB0aGUgc3lzdGVtIGFyY2hpdGVjdHVyZQoJICovCgoKI2lmZGVmIGhwdXgxMQppbnQKdWRwVGFibGVfbG9hZChuZXRzbm1wX2NhY2hlICpjYWNoZSwgdm9pZCAqdm1hZ2ljKQp7CiAgICBpbnQgICAgICAgICAgICAgZmQ7CiAgICBzdHJ1Y3Qgbm1wYXJtcyAgcDsKICAgIGludCAgICAgICAgICAgICB2YWwgPSAwOwogICAgdW5zaWduZWQgaW50ICAgIHVsZW47CiAgICBpbnQgICAgICAgICAgICAgcmV0OwoKICAgIHVkcFRhYmxlX2ZyZWUoTlVMTCwgTlVMTCk7CgogICAgaWYgKChmZCA9IG9wZW5fbWliKCIvZGV2L2lwIiwgT19SRE9OTFksIDAsIE5NX0FTWU5DX09GRikpID49IDApIHsKICAgICAgICBwLm9iamlkID0gSURfdWRwTHNuTnVtRW50OwogICAgICAgIHAuYnVmZmVyID0gKHZvaWQgKikgJnZhbDsKICAgICAgICB1bGVuID0gc2l6ZW9mKGludCk7CiAgICAgICAgcC5sZW4gPSAmdWxlbjsKICAgICAgICBpZiAoKHJldCA9IGdldF9taWJfaW5mbyhmZCwgJnApKSA9PSAwKQogICAgICAgICAgICB1ZHBfc2l6ZSA9IHZhbDsKCiAgICAgICAgaWYgKHVkcF9zaXplID4gMCkgewogICAgICAgICAgICB1bGVuID0gKHVuc2lnbmVkKSB1ZHBfc2l6ZSAqc2l6ZW9mKG1pYl91ZHBMc25FbnQpOwogICAgICAgICAgICB1ZHBfaGVhZCA9IChtaWJfdWRwTHNuRW50ICopIG1hbGxvYyh1bGVuKTsKICAgICAgICAgICAgcC5vYmppZCA9IElEX3VkcExzblRhYmxlOwogICAgICAgICAgICBwLmJ1ZmZlciA9ICh2b2lkICopIHVkcF9oZWFkOwogICAgICAgICAgICBwLmxlbiA9ICZ1bGVuOwogICAgICAgICAgICBpZiAoKHJldCA9IGdldF9taWJfaW5mbyhmZCwgJnApKSA8IDApIHsKICAgICAgICAgICAgICAgIHVkcF9zaXplID0gMDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgY2xvc2VfbWliKGZkKTsKICAgIH0KCiAgICBpZiAodWRwX3NpemUgPiAwKSB7CiAgICAgICAgREVCVUdNU0dUTCgoIm1pYklJL3VkcFRhYmxlIiwgIkxvYWRlZCBVRFAgVGFibGUgKGhwdXgxMSlcbiIpKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KICAgIERFQlVHTVNHVEwoKCJtaWJJSS91ZHBUYWJsZSIsICJGYWlsZWQgdG8gbG9hZCBVRFAgVGFibGUgKGhwdXgxMSlcbiIpKTsKICAgIHJldHVybiAtMTsKfQojZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGhwdXgxMSAqLwoKI2lmZGVmIGxpbnV4CmludAp1ZHBUYWJsZV9sb2FkKG5ldHNubXBfY2FjaGUgKmNhY2hlLCB2b2lkICp2bWFnaWMpCnsKICAgIEZJTEUgICAgICAgICAgICppbjsKICAgIGNoYXIgICAgICAgICAgICBsaW5lWzI1Nl07CgogICAgdWRwVGFibGVfZnJlZShjYWNoZSwgTlVMTCk7CgogICAgaWYgKCEoaW4gPSBmb3BlbigiL3Byb2MvbmV0L3VkcCIsICJyIikpKSB7CiAgICAgICAgREVCVUdNU0dUTCgoIm1pYklJL3VkcFRhYmxlIiwgIkZhaWxlZCB0byBsb2FkIFVEUCBUYWJsZSAobGludXgpXG4iKSk7CiAgICAgICAgc25tcF9sb2coTE9HX0VSUiwgInNubXBkOiBjYW5ub3Qgb3BlbiAvcHJvYy9uZXQvdWRwIC4uLlxuIik7CiAgICAgICAgcmV0dXJuIC0xOwogICAgfQoKICAgIC8qCiAgICAgKiBzY2FuIHByb2MtZmlsZSBhbmQgYnVpbGQgdXAgYSBsaW5rZWQgbGlzdCAKICAgICAqIFRoaXMgd2lsbCBhY3R1YWxseSBiZSBidWlsdCB1cCBpbiByZXZlcnNlLAogICAgICogICBidXQgc2luY2UgdGhlIGVudHJpZXMgYXJlIHVuc29ydGVkLCB0aGF0IGRvZXNuJ3QgbWF0dGVyLgogICAgICovCiAgICB3aGlsZSAobGluZSA9PSBmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIGluKSkgewogICAgICAgIHN0cnVjdCBpbnBjYiAgICBwY2IsICpubmV3OwogICAgICAgIHVuc2lnbmVkIGludCAgICBzdGF0ZSwgbHBvcnQ7CgogICAgICAgIG1lbXNldCgmcGNiLCAwLCBzaXplb2YocGNiKSk7CgogICAgICAgIGlmICgzICE9IHNzY2FuZihsaW5lLCAiJSpkOiAleDoleCAlKng6JSp4ICV4IiwKICAgICAgICAgICAgICAgICAgICAgICAgJnBjYi5pbnBfbGFkZHIuc19hZGRyLCAmbHBvcnQsICZzdGF0ZSkpCiAgICAgICAgICAgIGNvbnRpbnVlOwoKICAgICAgICBpZiAoc3RhdGUgIT0gNykgICAgICAgICAvKiBmaXggbWU6ICBVRFBfTElTVEVOID8/PyAqLwogICAgICAgICAgICBjb250aW51ZTsKCiAgICAgICAgLyogc3RvcmUgaW4gbmV0d29yayBieXRlIG9yZGVyICovCiAgICAgICAgcGNiLmlucF9sYWRkci5zX2FkZHIgPSBodG9ubChwY2IuaW5wX2xhZGRyLnNfYWRkcik7CiAgICAgICAgcGNiLmlucF9scG9ydCA9IGh0b25zKCh1bnNpZ25lZCBzaG9ydCkgKGxwb3J0KSk7CgogICAgICAgIG5uZXcgPSBTTk1QX01BTExPQ19UWVBFREVGKHN0cnVjdCBpbnBjYik7CiAgICAgICAgaWYgKG5uZXcgPT0gTlVMTCkKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgbWVtY3B5KG5uZXcsICZwY2IsIHNpemVvZihzdHJ1Y3QgaW5wY2IpKTsKICAgICAgICBubmV3LT5pbnBfbmV4dCA9IHVkcF9oZWFkOwogICAgICAgIHVkcF9oZWFkICAgICAgID0gbm5ldzsKICAgIH0KCiAgICBmY2xvc2UoaW4pOwoKICAgIERFQlVHTVNHVEwoKCJtaWJJSS91ZHBUYWJsZSIsICJMb2FkZWQgVURQIFRhYmxlIChsaW51eClcbiIpKTsKICAgIHJldHVybiAwOwp9CiNlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGludXggKi8KCiNpZmRlZiBzb2xhcmlzMgpzdGF0aWMgaW50ClVEUF9DbXAodm9pZCAqYWRkciwgdm9pZCAqZXApCnsKICAgIGlmIChtZW1jbXAoKG1pYjJfdWRwRW50cnlfdCAqKSBlcCwgKG1pYjJfdWRwRW50cnlfdCAqKSBhZGRyLAogICAgICAgICAgICAgICBzaXplb2YobWliMl91ZHBFbnRyeV90KSkgPT0gMCkKICAgICAgICByZXR1cm4gKDApOwogICAgZWxzZQogICAgICAgIHJldHVybiAoMSk7Cn0KCgppbnQKdWRwVGFibGVfbG9hZChuZXRzbm1wX2NhY2hlICpjYWNoZSwgdm9pZCAqdm1hZ2ljKQp7CiAgICBtaWIyX3VkcEVudHJ5X3QgICBlbnRyeTsKICAgIG5ldHNubXBfdWRwRW50cnkgKm5uZXc7CiAgICBuZXRzbm1wX3VkcEVudHJ5ICpwcmV2X2VudHJ5ID0gTlVMTDsKCgogICAgdWRwVGFibGVfZnJlZShOVUxMLCBOVUxMKTsKCiAgICBpZiAoZ2V0TWlic3RhdChNSUJfVURQX0xJU1RFTiwgJmVudHJ5LCBzaXplb2YobWliMl91ZHBFbnRyeV90KSwKICAgICAgICAgICAgICAgICAgIEdFVF9GSVJTVCwgJlVEUF9DbXAsICZlbnRyeSkgIT0gMCkgewogICAgICAgIERFQlVHTVNHVEwoKCJtaWJJSS91ZHBUYWJsZSIsICJGYWlsZWQgdG8gbG9hZCBVRFAgVGFibGUgKHNvbGFyaXMpXG4iKSk7CiAgICAgICAgcmV0dXJuIC0xOwogICAgfQoKICAgIHdoaWxlICgxKSB7CiAgICAgICAgLyoKICAgICAgICAgKiBOb3QgaW50ZXJlc3RlZCBpbiAnaWRsZScgZW50cmllcywgYXBwYXJlbnRseS4uLi4KICAgICAgICAgKi8KICAgICAgICBERUJVR01TR1RMKCgibWliSUkvdWRwVGFibGUiLCAiVURQIEVudHJ5ICV4OiVkICglZClcbiIsCiAgICAgICAgICAgICAgICAgICAgIGVudHJ5LnVkcExvY2FsQWRkcmVzcywgZW50cnkudWRwTG9jYWxQb3J0LCBlbnRyeS51ZHBFbnRyeUluZm8udWVfc3RhdGUpKTsKICAgICAgICBpZiAoZW50cnkudWRwRW50cnlJbmZvLnVlX3N0YXRlID09IE1JQjJfVURQX2lkbGUpIHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogQnVpbGQgdXAgYSBsaW5rZWQgbGlzdCBjb3B5IG9mIHRoZSBnZXRNaWJzdGF0IHJlc3VsdHMKICAgICAgICAgICAgICogTm90ZSB0aGF0IHNpbmNlIGdldE1pYnN0YXQgcmV0dXJucyByb3dzIGluIHNvcnRlZCBvcmRlciwKCSAgICAgKiAgICB3ZSBuZWVkIHRvIHJldGFpbiB0aGlzIG9yZGVyIHdoaWxlIGJ1aWxkaW5nIHRoZSBsaXN0CgkgICAgICogICAgc28gbmV3IGVudHJpZXMgYXJlIGFkZGVkIG9udG8gdGhlIGVuZCBvZiB0aGUgbGlzdC4KICAgICAgICAgICAgICogeHh4LXJrczogV0FSTklORzogdGhpcyBpcyBOT1QgVFJVRSBvbiB0aGUgc2YgY2Ygc29sYXJpcyBib3hlcy4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIG5uZXcgPSBTTk1QX01BTExPQ19UWVBFREVGKG5ldHNubXBfdWRwRW50cnkpOwogICAgICAgICAgICBpZiAobm5ldyA9PSBOVUxMKQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIG1lbWNweSgmKG5uZXctPmVudHJ5KSwgJmVudHJ5LCBzaXplb2YobWliMl91ZHBFbnRyeV90KSk7CiAgICAgICAgICAgIGlmICghcHJldl9lbnRyeSkKCSAgICAgICAgdWRwX2hlYWQgPSBubmV3OwoJICAgIGVsc2UKCSAgICAgICAgcHJldl9lbnRyeS0+aW5wX25leHQgPSBubmV3OwoJICAgIHByZXZfZW50cnkgPSBubmV3OwoJfQoKICAgICAgICBpZiAoZ2V0TWlic3RhdChNSUJfVURQX0xJU1RFTiwgJmVudHJ5LCBzaXplb2YobWliMl91ZHBFbnRyeV90KSwKICAgICAgICAgICAgICAgICAgICAgICBHRVRfTkVYVCwgJlVEUF9DbXAsICZlbnRyeSkgIT0gMCkKCSAgICBicmVhazsKICAgIH0KCiAgICBpZiAodWRwX2hlYWQpIHsKICAgICAgICBERUJVR01TR1RMKCgibWliSUkvdWRwVGFibGUiLCAiTG9hZGVkIFVEUCBUYWJsZSAoc29sYXJpcylcbiIpKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KICAgIERFQlVHTVNHVEwoKCJtaWJJSS91ZHBUYWJsZSIsICJGYWlsZWQgdG8gbG9hZCBVRFAgVGFibGUgKHNvbGFyaXMpXG4iKSk7CiAgICByZXR1cm4gLTE7Cn0KI2Vsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzb2xhcmlzMiAqLwoKI2lmIGRlZmluZWQgKFdJTjMyKSB8fCBkZWZpbmVkIChjeWd3aW4pCmludAp1ZHBUYWJsZV9sb2FkKG5ldHNubXBfY2FjaGUgKmNhY2hlLCB2b2lkICp2bWFnaWMpCnsKICAgIFBNSUJfVURQVEFCTEUgcFVkcFRhYmxlID0gTlVMTDsKICAgIERXT1JEICAgICAgICAgZHdBY3R1YWxTaXplID0gMDsKICAgIERXT1JEICAgICAgICAgc3RhdHVzID0gTk9fRVJST1I7CgogICAgLyoKICAgICAqIHF1ZXJ5IGZvciB0aGUgYnVmZmVyIHNpemUgbmVlZGVkIAogICAgICovCiAgICBzdGF0dXMgPSBHZXRVZHBUYWJsZShwVWRwVGFibGUsICZkd0FjdHVhbFNpemUsIFRSVUUpOwogICAgaWYgKHN0YXR1cyA9PSBFUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSKSB7CiAgICAgICAgcFVkcFRhYmxlID0gKFBNSUJfVURQVEFCTEUpIG1hbGxvYyhkd0FjdHVhbFNpemUpOwogICAgICAgIGlmIChwVWRwVGFibGUgIT0gTlVMTCkgewogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBHZXQgdGhlIHNvcnRlZCBVRFAgdGFibGUgCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBzdGF0dXMgPSBHZXRVZHBUYWJsZShwVWRwVGFibGUsICZkd0FjdHVhbFNpemUsIFRSVUUpOwogICAgICAgIH0KICAgIH0KICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKICAgICAgICBERUJVR01TR1RMKCgibWliSUkvdWRwVGFibGUiLCAiTG9hZGVkIFVEUCBUYWJsZSAod2luMzIpXG4iKSk7CiAgICAgICAgdWRwX3NpemUgPSBwVWRwVGFibGUtPmR3TnVtRW50cmllcyAtMTsgIC8qIGVudHJpZXMgYXJlIGNvdW50ZWQgc3RhcnRpbmcgd2l0aCAwICovCiAgICAgICAgdWRwX2hlYWQgPSBwVWRwVGFibGUtPnRhYmxlOwogICAgICAgIHJldHVybiAwOwogICAgfQogICAgREVCVUdNU0dUTCgoIm1pYklJL3VkcFRhYmxlIiwgIkZhaWxlZCB0byBsb2FkIFVEUCBUYWJsZSAod2luMzIpXG4iKSk7CiAgICBpZiAocFVkcFRhYmxlKQoJZnJlZShwVWRwVGFibGUpOwogICAgcmV0dXJuIC0xOwp9CiNlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV0lOMzIgY3lnd2luKi8KCiNpZiAoZGVmaW5lZChORVRTTk1QX0NBTl9VU0VfU1lTQ1RMKSAmJiBkZWZpbmVkKFVEUENUTF9QQ0JMSVNUKSkKaW50CnVkcFRhYmxlX2xvYWQobmV0c25tcF9jYWNoZSAqY2FjaGUsIHZvaWQgKnZtYWdpYykKewogICAgc2l6ZV90ICAgbGVuOwogICAgaW50ICAgICAgc25hbWVbXSA9IHsgQ1RMX05FVCwgUEZfSU5FVCwgSVBQUk9UT19VRFAsIFVEUENUTF9QQ0JMSVNUIH07CiAgICBjaGFyICAgICAqdWRwY2JfYnVmID0gTlVMTDsKI2lmIGRlZmluZWQoZHJhZ29uZmx5KQogICAgc3RydWN0IHhpbnBjYiAgKnhpZyA9IE5VTEw7CiNlbHNlCiAgICBzdHJ1Y3QgeGlucGdlbiAqeGlnID0gTlVMTDsKI2VuZGlmCiAgICBVRFBUQUJMRV9FTlRSWV9UWVBFICAqbm5ldzsKCiAgICB1ZHBUYWJsZV9mcmVlKE5VTEwsIE5VTEwpOwoKICAgIC8qCiAgICAgKiAgUmVhZCBpbiB0aGUgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIFVEUCB0YWJsZSBkYXRhCiAgICAgKi8KICAgIGxlbiA9IDA7CiAgICBpZiAoc3lzY3RsKHNuYW1lLCA0LCAwLCAmbGVuLCAwLCAwKSA8IDAgfHwKICAgICAgICh1ZHBjYl9idWYgPSBtYWxsb2MobGVuKSkgPT0gTlVMTCkKICAgICAgICByZXR1cm4gLTE7CiAgICBpZiAoc3lzY3RsKHNuYW1lLCA0LCB1ZHBjYl9idWYsICZsZW4sIDAsIDApIDwgMCkgewogICAgICAgIGZyZWUodWRwY2JfYnVmKTsKICAgICAgICByZXR1cm4gLTE7CiAgICB9CgogICAgLyoKICAgICAqICBVbnBpY2sgdGhpcyBpbnRvIHRoZSBjb25zdGl0dWVudCAneGlucGdlbicgc3RydWN0dXJlcywgYW5kIGV4dHJhY3QKICAgICAqICAgICB0aGUgJ2lucGNiJyBlbGVtZW50cyBpbnRvIGEgbGlua2VkIGxpc3QgKGJ1aWx0IGluIHJldmVyc2UpCiAgICAgKi8KI2lmIGRlZmluZWQoZHJhZ29uZmx5KQogICAgeGlnID0gKHN0cnVjdCB4aW5wY2IgICopIHVkcGNiX2J1ZjsKI2Vsc2UKICAgIHhpZyA9IChzdHJ1Y3QgeGlucGdlbiAqKSB1ZHBjYl9idWY7CiAgICB4aWcgPSAoc3RydWN0IHhpbnBnZW4gKikgKChjaGFyICopIHhpZyArIHhpZy0+eGlnX2xlbik7CiNlbmRpZgoKI2lmIGRlZmluZWQoZHJhZ29uZmx5KQogICAgd2hpbGUgKHhpZyAmJiAoKGNoYXIgKil4aWcgKyB4aWctPnhpX2xlbiA8IHVkcGNiX2J1ZiArIGxlbikpCiNlbHNlCiAgICB3aGlsZSAoeGlnICYmICh4aWctPnhpZ19sZW4gPiBzaXplb2Yoc3RydWN0IHhpbnBnZW4pKSkKI2VuZGlmCiAgICB7CiAgICAgICAgbm5ldyA9IFNOTVBfTUFMTE9DX1RZUEVERUYoVURQVEFCTEVfRU5UUllfVFlQRSk7CiAgICAgICAgaWYgKCFubmV3KQogICAgICAgICAgICBicmVhazsKICAgICAgICBtZW1jcHkoJm5uZXctPnBjYiwgJigoc3RydWN0IHhpbnBjYiAqKSB4aWcpLT54aV9pbnAsIHNpemVvZihzdHJ1Y3QgaW5wY2IpKTsKCW5uZXctPmlucF9uZXh0ID0gdWRwX2hlYWQ7Cgl1ZHBfaGVhZCAgID0gbm5ldzsKI2lmIGRlZmluZWQoZHJhZ29uZmx5KQogICAgICAgIHhpZyA9IChzdHJ1Y3QgeGlucGNiICAqKSAoKGNoYXIgKikgeGlnICsgeGlnLT54aV9sZW4pOwojZWxzZQogICAgICAgIHhpZyA9IChzdHJ1Y3QgeGlucGdlbiAqKSAoKGNoYXIgKikgeGlnICsgeGlnLT54aWdfbGVuKTsKI2VuZGlmCiAgICB9CgogICAgZnJlZSh1ZHBjYl9idWYpOwogICAgaWYgKHVkcF9oZWFkKSB7CiAgICAgICAgREVCVUdNU0dUTCgoIm1pYklJL3VkcFRhYmxlIiwgIkxvYWRlZCBVRFAgVGFibGUgKHN5c2N0bClcbiIpKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KICAgIERFQlVHTVNHVEwoKCJtaWJJSS91ZHBUYWJsZSIsICJGYWlsZWQgdG8gbG9hZCBVRFAgVGFibGUgKHN5c2N0bClcbiIpKTsKICAgIHJldHVybiAtMTsKfQojZWxzZQkJLyogKGRlZmluZWQoTkVUU05NUF9DQU5fVVNFX1NZU0NUTCkgJiYgZGVmaW5lZChVRFBDVExfUENCTElTVCkpICovCiNpZmRlZiBQQ0JfVEFCTEUKaW50CnVkcFRhYmxlX2xvYWQobmV0c25tcF9jYWNoZSAqY2FjaGUsIHZvaWQgKnZtYWdpYykKewogICAgc3RydWN0IGlucGNidGFibGUgdGFibGU7CiAgICBzdHJ1Y3QgaW5wY2IgICAqbm5ldywgKmVudHJ5OwoKICAgIHVkcFRhYmxlX2ZyZWUoTlVMTCwgTlVMTCk7CgogICAgaWYgKCFhdXRvX25saXN0KFVEQl9TWU1CT0wsIChjaGFyICopICZ0YWJsZSwgc2l6ZW9mKHRhYmxlKSkpIHsKICAgICAgICBERUJVR01TR1RMKCgibWliSUkvdWRwVGFibGUiLCAiRmFpbGVkIHRvIHJlYWQgaW5wY2J0YWJsZVxuIikpOwogICAgICAgIHJldHVybiAtMTsKICAgIH0KCiAgICAvKgogICAgICogIFNldCB1cCBhIGxpbmtlZCBsaXN0CiAgICAgKi8KICAgIGVudHJ5ICA9IHRhYmxlLmlucHRfcXVldWUuY3FoX2ZpcnN0OwogICAgd2hpbGUgKGVudHJ5KSB7CiAgIAogICAgICAgIG5uZXcgPSBTTk1QX01BTExPQ19UWVBFREVGKHN0cnVjdCBpbnBjYik7CiAgICAgICAgaWYgKCFubmV3KQogICAgICAgICAgICBicmVhazsKCiAgICAgICAgaWYgKCFORVRTTk1QX0tMT09LVVAoZW50cnksIChjaGFyICopIG5uZXcsIHNpemVvZihzdHJ1Y3QgaW5wY2IpKSkgewogICAgICAgICAgICBERUJVR01TR1RMKCgibWliSUkvdWRwVGFibGU6dWRwVGFibGVfbG9hZCIsICJrbG9va3VwIGZhaWxlZFxuIikpOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICAgIGVudHJ5ICAgID0gbm5ldy0+aW5wX3F1ZXVlLmNxZV9uZXh0OwkvKiBOZXh0IGtlcm5lbCBlbnRyeSAqLwoJbm5ldy0+aW5wX3F1ZXVlLmNxZV9uZXh0ID0gdWRwX2hlYWQ7Cgl1ZHBfaGVhZCA9IG5uZXc7CgogICAgICAgIGlmIChlbnRyeSA9PSB0YWJsZS5pbnB0X3F1ZXVlLmNxaF9maXJzdCkKICAgICAgICAgICAgYnJlYWs7CiAgICB9CgogICAgaWYgKHVkcF9oZWFkKSB7CiAgICAgICAgREVCVUdNU0dUTCgoIm1pYklJL3VkcFRhYmxlIiwgIkxvYWRlZCBVRFAgVGFibGUgKHBjYl90YWJsZSlcbiIpKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KICAgIERFQlVHTVNHVEwoKCJtaWJJSS91ZHBUYWJsZSIsICJGYWlsZWQgdG8gbG9hZCBVRFAgVGFibGUgKHBjYl90YWJsZSlcbiIpKTsKICAgIHJldHVybiAtMTsKfQoKI2Vsc2UJCQkJLyogUENCX1RBQkxFICovCiNpZmRlZiBVREJfU1lNQk9MCmludAp1ZHBUYWJsZV9sb2FkKG5ldHNubXBfY2FjaGUgKmNhY2hlLCB2b2lkICp2bWFnaWMpCnsKICAgIHN0cnVjdCBpbnBjYiAgIHVkcF9pbnBjYjsKICAgIHN0cnVjdCBpbnBjYiAgICpubmV3LCAqZW50cnk7CgogICAgdWRwVGFibGVfZnJlZShOVUxMLCBOVUxMKTsKCiAgICBpZiAoIWF1dG9fbmxpc3QoVURCX1NZTUJPTCwgKGNoYXIgKikgJnVkcF9pbnBjYiwgc2l6ZW9mKHVkcF9pbnBjYikpKSB7CiAgICAgICAgREVCVUdNU0dUTCgoIm1pYklJL3VkcFRhYmxlIiwgIkZhaWxlZCB0byByZWFkIHVkYl9zeW1ib2xcbiIpKTsKICAgICAgICByZXR1cm4gLTE7CiAgICB9CgogICAgLyoKICAgICAqICBTZXQgdXAgYSBsaW5rZWQgbGlzdAogICAgICovCiAgICBlbnRyeSAgPSB1ZHBfaW5wY2IuSU5QX05FWFRfU1lNQk9MOwogICAgd2hpbGUgKGVudHJ5KSB7CiAgIAogICAgICAgIG5uZXcgPSBTTk1QX01BTExPQ19UWVBFREVGKHN0cnVjdCBpbnBjYik7CiAgICAgICAgaWYgKCFubmV3KQogICAgICAgICAgICBicmVhazsKCiAgICAgICAgaWYgKCFORVRTTk1QX0tMT09LVVAoZW50cnksIChjaGFyICopIG5uZXcsIHNpemVvZihzdHJ1Y3QgaW5wY2IpKSkgewogICAgICAgICAgICBERUJVR01TR1RMKCgibWliSUkvdWRwVGFibGU6dWRwVGFibGVfbG9hZCIsICJrbG9va3VwIGZhaWxlZFxuIikpOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICAgIGVudHJ5ICAgID0gbm5ldy0+SU5QX05FWFRfU1lNQk9MOwkJLyogTmV4dCBrZXJuZWwgZW50cnkgKi8KCW5uZXctPklOUF9ORVhUX1NZTUJPTCA9IHVkcF9oZWFkOwoJdWRwX2hlYWQgPSBubmV3OwoKICAgICAgICBpZiAoZW50cnkgPT0gdWRwX2lucGNiLklOUF9ORVhUX1NZTUJPTCkKICAgICAgICAgICAgYnJlYWs7CiAgICB9CgogICAgaWYgKHVkcF9oZWFkKSB7CiAgICAgICAgREVCVUdNU0dUTCgoIm1pYklJL3VkcFRhYmxlIiwgIkxvYWRlZCBVRFAgVGFibGUgKHVkYl9zeW1ib2wpXG4iKSk7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICBERUJVR01TR1RMKCgibWliSUkvdWRwVGFibGUiLCAiRmFpbGVkIHRvIGxvYWQgVURQIFRhYmxlICh1ZGJfc3ltYm9sKVxuIikpOwogICAgcmV0dXJuIC0xOwp9CgojZWxzZQkJCQkvKiBVREJfU1lNQk9MICovCmludAp1ZHBUYWJsZV9sb2FkKG5ldHNubXBfY2FjaGUgKmNhY2hlLCB2b2lkICp2bWFnaWMpCnsKICAgIERFQlVHTVNHVEwoKCJtaWJJSS91ZHBUYWJsZSIsICJMb2FkaW5nIFVEUCBUYWJsZSBub3QgaW1wbGVtZW50ZWRcbiIpKTsKICAgIHJldHVybiAtMTsKfQojZW5kaWYJCQkJLyogVURCX1NZTUJPTCAqLwojZW5kaWYJCQkJLyogUENCX1RBQkxFICovCiNlbmRpZgkJLyogKGRlZmluZWQoTkVUU05NUF9DQU5fVVNFX1NZU0NUTCkgJiYgZGVmaW5lZChVRFBDVExfUENCTElTVCkpICovCiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV0lOMzIgY3lnd2luKi8KI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsaW51eCAqLwojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNvbGFyaXMyICovCiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaHB1eDExICovCg==