LyoKICogc25tcF9jbGllbnQuYyAtIGEgdG9vbGtpdCBvZiBjb21tb24gZnVuY3Rpb25zIGZvciBhbiBTTk1QIGNsaWVudC4KICoKICovCi8qIFBvcnRpb25zIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvcHlyaWdodChzKS4gIFNlZQogKiB0aGUgTmV0LVNOTVAncyBDT1BZSU5HIGZpbGUgZm9yIG1vcmUgZGV0YWlscyBhbmQgb3RoZXIgY29weXJpZ2h0cwogKiB0aGF0IG1heSBhcHBseToKICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCglDb3B5cmlnaHQgMTk4OCwgMTk4OSwgMTk5MSwgMTk5MiBieSBDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eQoKICAgICAgICAgICAgICAgICAgICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKClBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kIGl0cwpkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsCnByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCnN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgQ01VIG5vdCBiZQp1c2VkIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUKc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLgoKQ01VIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLCBJTkNMVURJTkcKQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PIEVWRU5UIFNIQUxMCkNNVSBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IKQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLApXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sCkFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMKU09GVFdBUkUuCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoKICogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBjb3B5cmlnaHRlZCBieToKICogQ29weXJpZ2h0IKkgMjAwMyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqIFVzZSBpcyBzdWJqZWN0IHRvIGxpY2Vuc2UgdGVybXMgc3BlY2lmaWVkIGluIHRoZSBDT1BZSU5HIGZpbGUKICogZGlzdHJpYnV0ZWQgd2l0aCB0aGUgTmV0LVNOTVAgcGFja2FnZS4KICovCgovKiogQGRlZmdyb3VwIHNubXBfY2xpZW50IHZhcmlvdXMgUERVIHByb2Nlc3Npbmcgcm91dGluZXMKICogIEBpbmdyb3VwIGxpYnJhcnkKICogCiAqICBAewogKi8KI2luY2x1ZGUgPG5ldC1zbm1wL25ldC1zbm1wLWNvbmZpZy5oPgoKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxlcnJuby5oPgojaWYgSEFWRV9TVERMSUJfSAojaW5jbHVkZSA8c3RkbGliLmg+CiNlbmRpZgojaWYgSEFWRV9TVFJJTkdfSAojaW5jbHVkZSA8c3RyaW5nLmg+CiNlbHNlCiNpbmNsdWRlIDxzdHJpbmdzLmg+CiNlbmRpZgojaWYgSEFWRV9VTklTVERfSAojaW5jbHVkZSA8dW5pc3RkLmg+CiNlbmRpZgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpZiBUSU1FX1dJVEhfU1lTX1RJTUUKIyBpZmRlZiBXSU4zMgojICBpbmNsdWRlIDxzeXMvdGltZWIuaD4KIyBlbHNlCiMgIGluY2x1ZGUgPHN5cy90aW1lLmg+CiMgZW5kaWYKIyBpbmNsdWRlIDx0aW1lLmg+CiNlbHNlCiMgaWYgSEFWRV9TWVNfVElNRV9ICiMgIGluY2x1ZGUgPHN5cy90aW1lLmg+CiMgZWxzZQojICBpbmNsdWRlIDx0aW1lLmg+CiMgZW5kaWYKI2VuZGlmCiNpZiBIQVZFX1NZU19QQVJBTV9ICiNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KI2VuZGlmCiNpZiBIQVZFX05FVElORVRfSU5fSAojaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgojZW5kaWYKI2lmIEhBVkVfQVJQQV9JTkVUX0gKI2luY2x1ZGUgPGFycGEvaW5ldC5oPgojZW5kaWYKI2lmIEhBVkVfU1lTX1NFTEVDVF9ICiNpbmNsdWRlIDxzeXMvc2VsZWN0Lmg+CiNlbmRpZgojaWYgSEFWRV9TWVNMT0dfSAojaW5jbHVkZSA8c3lzbG9nLmg+CiNlbmRpZgoKI2lmIEhBVkVfRE1BTExPQ19ICiNpbmNsdWRlIDxkbWFsbG9jLmg+CiNlbmRpZgoKI2lmIEhBVkVfV0lOU09DS19ICiNpbmNsdWRlIDx3aW5zb2NrLmg+CiNlbmRpZgoKI2luY2x1ZGUgPG5ldC1zbm1wL3R5cGVzLmg+CgojaW5jbHVkZSA8bmV0LXNubXAvbGlicmFyeS9zbm1wX2FwaS5oPgojaW5jbHVkZSA8bmV0LXNubXAvbGlicmFyeS9zbm1wX2NsaWVudC5oPgojaW5jbHVkZSA8bmV0LXNubXAvbGlicmFyeS9zbm1wX3NlY21vZC5oPgojaW5jbHVkZSA8bmV0LXNubXAvbGlicmFyeS9zbm1wdXNtLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9saWJyYXJ5L21pYi5oPgojaW5jbHVkZSA8bmV0LXNubXAvbGlicmFyeS9zbm1wX2xvZ2dpbmcuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL2xpYnJhcnkvc25tcF9hc3NlcnQuaD4KCgojaWZuZGVmIEJTRDRfMwojZGVmaW5lIEJTRDRfMgojZW5kaWYKCiNpZm5kZWYgRkRfU0VUCgp0eXBlZGVmIGxvbmcgICAgZmRfbWFzazsKI2RlZmluZSBORkRCSVRTCShzaXplb2YoZmRfbWFzaykgKiBOQkJZKSAgICAgICAgLyogYml0cyBwZXIgbWFzayAqLwoKI2RlZmluZQlGRF9TRVQobiwgcCkJKChwKS0+ZmRzX2JpdHNbKG4pL05GREJJVFNdIHw9ICgxIDw8ICgobikgJSBORkRCSVRTKSkpCiNkZWZpbmUJRkRfQ0xSKG4sIHApCSgocCktPmZkc19iaXRzWyhuKS9ORkRCSVRTXSAmPSB+KDEgPDwgKChuKSAlIE5GREJJVFMpKSkKI2RlZmluZQlGRF9JU1NFVChuLCBwKQkoKHApLT5mZHNfYml0c1sobikvTkZEQklUU10gJiAoMSA8PCAoKG4pICUgTkZEQklUUykpKQojZGVmaW5lIEZEX1pFUk8ocCkJbWVtc2V0KChwKSwgMCwgc2l6ZW9mKCoocCkpKQojZW5kaWYKCi8qCiAqIFByb3RvdHlwZSBkZWZpbml0aW9ucyAKICovCnN0YXRpYyBpbnQgICAgICBzbm1wX3N5bmNoX2lucHV0KGludCBvcCwgbmV0c25tcF9zZXNzaW9uICogc2Vzc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlcWlkLCBuZXRzbm1wX3BkdSAqcGR1LCB2b2lkICptYWdpYyk7CgpuZXRzbm1wX3BkdSAgICAqCnNubXBfcGR1X2NyZWF0ZShpbnQgY29tbWFuZCkKewogICAgbmV0c25tcF9wZHUgICAgKnBkdTsKCiAgICBwZHUgPSAobmV0c25tcF9wZHUgKikgY2FsbG9jKDEsIHNpemVvZihuZXRzbm1wX3BkdSkpOwogICAgaWYgKHBkdSkgewogICAgICAgIHBkdS0+dmVyc2lvbiA9IFNOTVBfREVGQVVMVF9WRVJTSU9OOwogICAgICAgIHBkdS0+Y29tbWFuZCA9IGNvbW1hbmQ7CiAgICAgICAgcGR1LT5lcnJzdGF0ID0gU05NUF9ERUZBVUxUX0VSUlNUQVQ7CiAgICAgICAgcGR1LT5lcnJpbmRleCA9IFNOTVBfREVGQVVMVF9FUlJJTkRFWDsKICAgICAgICBwZHUtPnNlY3VyaXR5TW9kZWwgPSBTTk1QX0RFRkFVTFRfU0VDTU9ERUw7CiAgICAgICAgcGR1LT50cmFuc3BvcnRfZGF0YSA9IE5VTEw7CiAgICAgICAgcGR1LT50cmFuc3BvcnRfZGF0YV9sZW5ndGggPSAwOwogICAgICAgIHBkdS0+c2VjdXJpdHlOYW1lTGVuID0gMDsKICAgICAgICBwZHUtPmNvbnRleHROYW1lTGVuID0gMDsKICAgICAgICBwZHUtPnRpbWUgPSAwOwogICAgICAgIHBkdS0+cmVxaWQgPSBzbm1wX2dldF9uZXh0X3JlcWlkKCk7CiAgICAgICAgcGR1LT5tc2dpZCA9IHNubXBfZ2V0X25leHRfbXNnaWQoKTsKICAgIH0KICAgIHJldHVybiBwZHU7Cgp9CgoKLyoKICogQWRkIGEgbnVsbCB2YXJpYWJsZSB3aXRoIHRoZSByZXF1ZXN0ZWQgbmFtZSB0byB0aGUgZW5kIG9mIHRoZSBsaXN0IG9mCiAqIHZhcmlhYmxlcyBmb3IgdGhpcyBwZHUuCiAqLwpuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKgpzbm1wX2FkZF9udWxsX3ZhcihuZXRzbm1wX3BkdSAqcGR1LCBjb25zdCBvaWQgKiBuYW1lLCBzaXplX3QgbmFtZV9sZW5ndGgpCnsKICAgIHJldHVybiBzbm1wX3BkdV9hZGRfdmFyaWFibGUocGR1LCBuYW1lLCBuYW1lX2xlbmd0aCwgQVNOX05VTEwsIE5VTEwsIDApOwp9CgoKc3RhdGljIGludApzbm1wX3N5bmNoX2lucHV0KGludCBvcCwKICAgICAgICAgICAgICAgICBuZXRzbm1wX3Nlc3Npb24gKiBzZXNzaW9uLAogICAgICAgICAgICAgICAgIGludCByZXFpZCwgbmV0c25tcF9wZHUgKnBkdSwgdm9pZCAqbWFnaWMpCnsKICAgIHN0cnVjdCBzeW5jaF9zdGF0ZSAqc3RhdGUgPSAoc3RydWN0IHN5bmNoX3N0YXRlICopIG1hZ2ljOwogICAgaW50ICAgICAgICAgICAgIHJwdF90eXBlOwoKICAgIGlmIChyZXFpZCAhPSBzdGF0ZS0+cmVxaWQgJiYgcGR1ICYmIHBkdS0+Y29tbWFuZCAhPSBTTk1QX01TR19SRVBPUlQpIHsKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICBzdGF0ZS0+d2FpdGluZyA9IDA7CgogICAgaWYgKG9wID09IE5FVFNOTVBfQ0FMTEJBQ0tfT1BfUkVDRUlWRURfTUVTU0FHRSAmJiBwZHUpIHsKICAgICAgICBpZiAocGR1LT5jb21tYW5kID09IFNOTVBfTVNHX1JFUE9SVCkgewogICAgICAgICAgICBycHRfdHlwZSA9IHNubXB2M19nZXRfcmVwb3J0X3R5cGUocGR1KTsKICAgICAgICAgICAgaWYgKFNOTVBWM19JR05PUkVfVU5BVVRIX1JFUE9SVFMgfHwKICAgICAgICAgICAgICAgIHJwdF90eXBlID09IFNOTVBFUlJfTk9UX0lOX1RJTUVfV0lORE9XKSB7CiAgICAgICAgICAgICAgICBzdGF0ZS0+d2FpdGluZyA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3RhdGUtPnBkdSA9IE5VTEw7CiAgICAgICAgICAgIHN0YXRlLT5zdGF0dXMgPSBTVEFUX0VSUk9SOwogICAgICAgICAgICBzZXNzaW9uLT5zX3NubXBfZXJybm8gPSBycHRfdHlwZTsKICAgICAgICAgICAgU0VUX1NOTVBfRVJST1IocnB0X3R5cGUpOwogICAgICAgIH0gZWxzZSBpZiAocGR1LT5jb21tYW5kID09IFNOTVBfTVNHX1JFU1BPTlNFKSB7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIGNsb25lIHRoZSBwZHUgdG8gcmV0dXJuIHRvIHNubXBfc3luY2hfcmVzcG9uc2UgCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBzdGF0ZS0+cGR1ID0gc25tcF9jbG9uZV9wZHUocGR1KTsKICAgICAgICAgICAgc3RhdGUtPnN0YXR1cyA9IFNUQVRfU1VDQ0VTUzsKICAgICAgICAgICAgc2Vzc2lvbi0+c19zbm1wX2Vycm5vID0gU05NUEVSUl9TVUNDRVNTOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgY2hhciBtc2dfYnVmWzUwXTsKICAgICAgICAgICAgc3RhdGUtPnN0YXR1cyA9IFNUQVRfRVJST1I7CiAgICAgICAgICAgIHNlc3Npb24tPnNfc25tcF9lcnJubyA9IFNOTVBFUlJfUFJPVE9DT0w7CiAgICAgICAgICAgIFNFVF9TTk1QX0VSUk9SKFNOTVBFUlJfUFJPVE9DT0wpOwogICAgICAgICAgICBzbnByaW50Zihtc2dfYnVmLCBzaXplb2YobXNnX2J1ZiksICJFeHBlY3RlZCBSRVNQT05TRS1QRFUgYnV0IGdvdCAlcy1QRFUiLAogICAgICAgICAgICAgICAgICAgICBzbm1wX3BkdV90eXBlKHBkdS0+Y29tbWFuZCkpOwogICAgICAgICAgICBzbm1wX3NldF9kZXRhaWwobXNnX2J1Zik7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0gZWxzZSBpZiAob3AgPT0gTkVUU05NUF9DQUxMQkFDS19PUF9USU1FRF9PVVQpIHsKICAgICAgICBzdGF0ZS0+cGR1ID0gTlVMTDsKICAgICAgICBzdGF0ZS0+c3RhdHVzID0gU1RBVF9USU1FT1VUOwogICAgICAgIHNlc3Npb24tPnNfc25tcF9lcnJubyA9IFNOTVBFUlJfVElNRU9VVDsKICAgICAgICBTRVRfU05NUF9FUlJPUihTTk1QRVJSX1RJTUVPVVQpOwogICAgfSBlbHNlIGlmIChvcCA9PSBORVRTTk1QX0NBTExCQUNLX09QX0RJU0NPTk5FQ1QpIHsKICAgICAgICBzdGF0ZS0+cGR1ID0gTlVMTDsKICAgICAgICBzdGF0ZS0+c3RhdHVzID0gU1RBVF9FUlJPUjsKICAgICAgICBzZXNzaW9uLT5zX3NubXBfZXJybm8gPSBTTk1QRVJSX0FCT1JUOwogICAgICAgIFNFVF9TTk1QX0VSUk9SKFNOTVBFUlJfQUJPUlQpOwogICAgfQoKICAgIHJldHVybiAxOwp9CgoKLyoKICogQ2xvbmUgYW4gU05NUCB2YXJpYWJsZSBkYXRhIHN0cnVjdHVyZS4KICogU2V0cyBwb2ludGVycyB0byBzdHJ1Y3R1cmUgcHJpdmF0ZSBzdG9yYWdlLCBvcgogKiBhbGxvY2F0ZXMgbGFyZ2VyIG9iamVjdCBpZGVudGlmaWVycyBhbmQgdmFsdWVzIGFzIG5lZWRlZC4KICoKICogQ2FsbGVyIG11c3QgbWFrZSBsaXN0IGFzc29jaWF0aW9uIGZvciBjbG9uZWQgdmFyaWFibGUuCiAqCiAqIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLgogKi8KaW50CnNubXBfY2xvbmVfdmFyKG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIHZhciwgbmV0c25tcF92YXJpYWJsZV9saXN0ICogbmV3dmFyKQp7CiAgICBpZiAoIW5ld3ZhciB8fCAhdmFyKQogICAgICAgIHJldHVybiAxOwoKICAgIG1lbW1vdmUobmV3dmFyLCB2YXIsIHNpemVvZihuZXRzbm1wX3ZhcmlhYmxlX2xpc3QpKTsKICAgIG5ld3Zhci0+bmV4dF92YXJpYWJsZSA9IDA7CiAgICBuZXd2YXItPm5hbWUgPSAwOwogICAgbmV3dmFyLT52YWwuc3RyaW5nID0gMDsKICAgIG5ld3Zhci0+ZGF0YSA9IDA7CiAgICBuZXd2YXItPmRhdGFGcmVlSG9vayA9IDA7CiAgICBuZXd2YXItPmluZGV4ID0gMDsKCiAgICAvKgogICAgICogQ2xvbmUgdGhlIG9iamVjdCBpZGVudGlmaWVyIGFuZCB0aGUgdmFsdWUuCiAgICAgKiBBbGxvY2F0ZSBtZW1vcnkgaWZmIG9yaWdpbmFsIHdpbGwgbm90IGZpdCBpbnRvIGxvY2FsIHN0b3JhZ2UuCiAgICAgKi8KICAgIGlmIChzbm1wX3NldF92YXJfb2JqaWQobmV3dmFyLCB2YXItPm5hbWUsIHZhci0+bmFtZV9sZW5ndGgpKQogICAgICAgIHJldHVybiAxOwoKICAgIC8qCiAgICAgKiBuZWVkIGEgcG9pbnRlciB0byBjb3B5IGEgc3RyaW5nIHZhbHVlLiAKICAgICAqLwogICAgaWYgKHZhci0+dmFsLnN0cmluZykgewogICAgICAgIGlmICh2YXItPnZhbC5zdHJpbmcgIT0gJnZhci0+YnVmWzBdKSB7CiAgICAgICAgICAgIGlmICh2YXItPnZhbF9sZW4gPD0gc2l6ZW9mKHZhci0+YnVmKSkKICAgICAgICAgICAgICAgIG5ld3Zhci0+dmFsLnN0cmluZyA9IG5ld3Zhci0+YnVmOwogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIG5ld3Zhci0+dmFsLnN0cmluZyA9ICh1X2NoYXIgKikgbWFsbG9jKHZhci0+dmFsX2xlbik7CiAgICAgICAgICAgICAgICBpZiAoIW5ld3Zhci0+dmFsLnN0cmluZykKICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgICAgfQogICAgICAgICAgICBtZW1tb3ZlKG5ld3Zhci0+dmFsLnN0cmluZywgdmFyLT52YWwuc3RyaW5nLCB2YXItPnZhbF9sZW4pOwogICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgIC8qIGZpeCB0aGUgcG9pbnRlciB0byBuZXcgbG9jYWwgc3RvcmUgKi8KICAgICAgICAgICAgbmV3dmFyLT52YWwuc3RyaW5nID0gbmV3dmFyLT5idWY7CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICBuZXd2YXItPnZhbC5zdHJpbmcgPSAwOwogICAgICAgIG5ld3Zhci0+dmFsX2xlbiA9IDA7CiAgICB9CgogICAgcmV0dXJuIDA7Cn0KCgovKgogKiBQb3NzaWJseSBtYWtlIGEgY29weSBvZiBzb3VyY2UgbWVtb3J5IGJ1ZmZlci4KICogV2lsbCByZXNldCBkZXN0aW5hdGlvbiBwb2ludGVyIGlmIHNvdXJjZSBwb2ludGVyIGlzIE5VTEwuCiAqIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLCAxIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgogKi8KaW50CnNubXBfY2xvbmVfbWVtKHZvaWQgKipkc3RQdHIsIHZvaWQgKnNyY1B0ciwgdW5zaWduZWQgbGVuKQp7CiAgICAqZHN0UHRyID0gMDsKICAgIGlmIChzcmNQdHIpIHsKICAgICAgICAqZHN0UHRyID0gbWFsbG9jKGxlbiArIDEpOwogICAgICAgIGlmICghKmRzdFB0cikgewogICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICB9CiAgICAgICAgbWVtbW92ZSgqZHN0UHRyLCBzcmNQdHIsIGxlbik7CiAgICAgICAgLyoKICAgICAgICAgKiB0aGlzIGlzIGZvciB0aG9zZSByb3V0aW5lcyB0aGF0IGV4cGVjdCAwLXRlcm1pbmF0ZWQgc3RyaW5ncyEhIQogICAgICAgICAqIHNvbWVvbmUgc2hvdWxkIHJhdGhlciBoYXZlIGNhbGxlZCBzdHJkdXAKICAgICAgICAgKi8KICAgICAgICAoKGNoYXIgKikgKmRzdFB0cilbbGVuXSA9IDA7CiAgICB9CiAgICByZXR1cm4gMDsKfQoKCi8qCiAqIFdhbGtzIHRocm91Z2ggYSBsaXN0IG9mIHZhcmJpbmRzIGFuZCBmcmVlcyBhbmQgYWxsb2NhdGVkIG1lbW9yeSwKICogcmVzdG9yaW5nIHBvaW50ZXJzIHRvIGxvY2FsIGJ1ZmZlcnMKICovCnZvaWQKc25tcF9yZXNldF92YXJfYnVmZmVycyhuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXIpCnsKICAgIHdoaWxlICh2YXIpIHsKICAgICAgICBpZiAodmFyLT5uYW1lICE9IHZhci0+bmFtZV9sb2MpIHsKICAgICAgICAgICAgaWYoTlVMTCAhPSB2YXItPm5hbWUpCiAgICAgICAgICAgICAgICBmcmVlKHZhci0+bmFtZSk7CiAgICAgICAgICAgIHZhci0+bmFtZSA9IHZhci0+bmFtZV9sb2M7CiAgICAgICAgICAgIHZhci0+bmFtZV9sZW5ndGggPSAwOwogICAgICAgIH0KICAgICAgICBpZiAodmFyLT52YWwuc3RyaW5nICE9IHZhci0+YnVmKSB7CiAgICAgICAgICAgIGlmIChOVUxMICE9IHZhci0+dmFsLnN0cmluZykKICAgICAgICAgICAgICAgIGZyZWUodmFyLT52YWwuc3RyaW5nKTsKICAgICAgICAgICAgdmFyLT52YWwuc3RyaW5nID0gdmFyLT5idWY7CiAgICAgICAgICAgIHZhci0+dmFsX2xlbiA9IDA7CiAgICAgICAgfQogICAgICAgIHZhciA9IHZhci0+bmV4dF92YXJpYWJsZTsKICAgIH0KfQoKLyoKICogQ3JlYXRlcyBhbmQgYWxsb2NhdGVzIGEgY2xvbmUgb2YgdGhlIGlucHV0IFBEVSwKICogYnV0IGRvZXMgTk9UIGNvcHkgdGhlIHZhcmlhYmxlcy4KICogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgdXNlZCB3aXRoIGFub3RoZXIgZnVuY3Rpb24sCiAqIHN1Y2ggYXMgX2NvcHlfcGR1X3ZhcnMuCiAqCiAqIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBjbG9uZWQgUERVIGlmIHN1Y2Nlc3NmdWwuCiAqIFJldHVybnMgMCBpZiBmYWlsdXJlLgogKi8Kc3RhdGljCm5ldHNubXBfcGR1ICAgICoKX2Nsb25lX3BkdV9oZWFkZXIobmV0c25tcF9wZHUgKnBkdSkKewogICAgbmV0c25tcF9wZHUgICAgKm5ld3BkdTsKICAgIHN0cnVjdCBzbm1wX3NlY21vZF9kZWYgKnNwdHI7CiAgICBpbnQgcmV0OwoKICAgIG5ld3BkdSA9IChuZXRzbm1wX3BkdSAqKSBtYWxsb2Moc2l6ZW9mKG5ldHNubXBfcGR1KSk7CiAgICBpZiAoIW5ld3BkdSkKICAgICAgICByZXR1cm4gMDsKICAgIG1lbW1vdmUobmV3cGR1LCBwZHUsIHNpemVvZihuZXRzbm1wX3BkdSkpOwoKICAgIC8qCiAgICAgKiByZXNldCBjb3BpZWQgcG9pbnRlcnMgaWYgY29weSBmYWlscyAKICAgICAqLwogICAgbmV3cGR1LT52YXJpYWJsZXMgPSAwOwogICAgbmV3cGR1LT5lbnRlcnByaXNlID0gMDsKICAgIG5ld3BkdS0+Y29tbXVuaXR5ID0gMDsKICAgIG5ld3BkdS0+c2VjdXJpdHlFbmdpbmVJRCA9IDA7CiAgICBuZXdwZHUtPnNlY3VyaXR5TmFtZSA9IDA7CiAgICBuZXdwZHUtPmNvbnRleHRFbmdpbmVJRCA9IDA7CiAgICBuZXdwZHUtPmNvbnRleHROYW1lID0gMDsKICAgIG5ld3BkdS0+dHJhbnNwb3J0X2RhdGEgPSAwOwoKICAgIC8qCiAgICAgKiBjb3B5IGJ1ZmZlcnMgaW5kaXZpZHVhbGx5LiBJZiBhbnkgY29weSBmYWlscywgYWxsIGFyZSBmcmVlZC4gCiAgICAgKi8KICAgIGlmIChzbm1wX2Nsb25lX21lbSgodm9pZCAqKikgJm5ld3BkdS0+ZW50ZXJwcmlzZSwgcGR1LT5lbnRlcnByaXNlLAogICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihvaWQpICogcGR1LT5lbnRlcnByaXNlX2xlbmd0aCkgfHwKICAgICAgICBzbm1wX2Nsb25lX21lbSgodm9pZCAqKikgJm5ld3BkdS0+Y29tbXVuaXR5LCBwZHUtPmNvbW11bml0eSwKICAgICAgICAgICAgICAgICAgICAgICBwZHUtPmNvbW11bml0eV9sZW4pIHx8CiAgICAgICAgc25tcF9jbG9uZV9tZW0oKHZvaWQgKiopICZuZXdwZHUtPmNvbnRleHRFbmdpbmVJRCwKICAgICAgICAgICAgICAgICAgICAgICBwZHUtPmNvbnRleHRFbmdpbmVJRCwgcGR1LT5jb250ZXh0RW5naW5lSURMZW4pCiAgICAgICAgfHwgc25tcF9jbG9uZV9tZW0oKHZvaWQgKiopICZuZXdwZHUtPnNlY3VyaXR5RW5naW5lSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgcGR1LT5zZWN1cml0eUVuZ2luZUlELCBwZHUtPnNlY3VyaXR5RW5naW5lSURMZW4pCiAgICAgICAgfHwgc25tcF9jbG9uZV9tZW0oKHZvaWQgKiopICZuZXdwZHUtPmNvbnRleHROYW1lLCBwZHUtPmNvbnRleHROYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgIHBkdS0+Y29udGV4dE5hbWVMZW4pCiAgICAgICAgfHwgc25tcF9jbG9uZV9tZW0oKHZvaWQgKiopICZuZXdwZHUtPnNlY3VyaXR5TmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICBwZHUtPnNlY3VyaXR5TmFtZSwgcGR1LT5zZWN1cml0eU5hbWVMZW4pCiAgICAgICAgfHwgc25tcF9jbG9uZV9tZW0oKHZvaWQgKiopICZuZXdwZHUtPnRyYW5zcG9ydF9kYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgIHBkdS0+dHJhbnNwb3J0X2RhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgcGR1LT50cmFuc3BvcnRfZGF0YV9sZW5ndGgpKSB7CiAgICAgICAgc25tcF9mcmVlX3BkdShuZXdwZHUpOwogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIGlmIChwZHUgIT0gTlVMTCAmJiBwZHUtPnNlY3VyaXR5U3RhdGVSZWYgJiYKICAgICAgICBwZHUtPmNvbW1hbmQgPT0gU05NUF9NU0dfVFJBUDIpIHsKCiAgICAgICAgcmV0ID0gdXNtX2Nsb25lX3VzbVN0YXRlUmVmZXJlbmNlKChzdHJ1Y3QgdXNtU3RhdGVSZWZlcmVuY2UgKikgcGR1LT5zZWN1cml0eVN0YXRlUmVmLAogICAgICAgICAgICAgICAgKHN0cnVjdCB1c21TdGF0ZVJlZmVyZW5jZSAqKikgJm5ld3BkdS0+c2VjdXJpdHlTdGF0ZVJlZiApOwoKICAgICAgICBpZiAocmV0KQogICAgICAgIHsKICAgICAgICAgICAgc25tcF9mcmVlX3BkdShuZXdwZHUpOwogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CiAgICBpZiAoKHNwdHIgPSBmaW5kX3NlY19tb2QobmV3cGR1LT5zZWN1cml0eU1vZGVsKSkgIT0gTlVMTCAmJgogICAgICAgIHNwdHItPnBkdV9jbG9uZSAhPSBOVUxMKSB7CiAgICAgICAgLyoKICAgICAgICAgKiBjYWxsIHNlY3VyaXR5IG1vZGVsIGlmIGl0IG5lZWRzIHRvIGtub3cgYWJvdXQgdGhpcyAKICAgICAgICAgKi8KICAgICAgICAoKnNwdHItPnBkdV9jbG9uZSkgKHBkdSwgbmV3cGR1KTsKICAgIH0KCiAgICByZXR1cm4gbmV3cGR1Owp9CgpzdGF0aWMKbmV0c25tcF92YXJpYWJsZV9saXN0ICoKX2NvcHlfdmFybGlzdChuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXIsICAgICAgLyogc291cmNlIHZhckxpc3QgKi8KICAgICAgICAgICAgICBpbnQgZXJyaW5kZXgsICAgICAvKiBpbmRleCBvZiB2YXJpYWJsZSB0byBkcm9wIChpZiBhbnkpICovCiAgICAgICAgICAgICAgaW50IGNvcHlfY291bnQpCnsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIT0wIG51bWJlciB2YXJpYWJsZXMgdG8gY29weSAqLwogICAgbmV0c25tcF92YXJpYWJsZV9saXN0ICpuZXdoZWFkLCAqbmV3dmFyLCAqb2xkdmFyOwogICAgaW50ICAgICAgICAgICAgIGlpID0gMDsKCiAgICBuZXdoZWFkID0gTlVMTDsKICAgIG9sZHZhciA9IE5VTEw7CgogICAgd2hpbGUgKHZhciAmJiAoY29weV9jb3VudC0tID4gMCkpIHsKICAgICAgICAvKgogICAgICAgICAqIERyb3AgdGhlIHNwZWNpZmllZCB2YXJpYWJsZSAoaWYgYXBwbGljYWJsZSkgCiAgICAgICAgICovCiAgICAgICAgaWYgKCsraWkgPT0gZXJyaW5kZXgpIHsKICAgICAgICAgICAgdmFyID0gdmFyLT5uZXh0X3ZhcmlhYmxlOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CgogICAgICAgIC8qCiAgICAgICAgICogY2xvbmUgdGhlIG5leHQgdmFyaWFibGUuIENsZWFudXAgaWYgYWxsb2MgZmFpbHMgCiAgICAgICAgICovCiAgICAgICAgbmV3dmFyID0gKG5ldHNubXBfdmFyaWFibGVfbGlzdCAqKQogICAgICAgICAgICBtYWxsb2Moc2l6ZW9mKG5ldHNubXBfdmFyaWFibGVfbGlzdCkpOwogICAgICAgIGlmIChzbm1wX2Nsb25lX3Zhcih2YXIsIG5ld3ZhcikpIHsKICAgICAgICAgICAgaWYgKG5ld3ZhcikKICAgICAgICAgICAgICAgIGZyZWUoKGNoYXIgKikgbmV3dmFyKTsKICAgICAgICAgICAgc25tcF9mcmVlX3ZhcmJpbmQobmV3aGVhZCk7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KCiAgICAgICAgLyoKICAgICAgICAgKiBhZGQgY2xvbmVkIHZhcmlhYmxlIHRvIG5ldyBsaXN0ICAKICAgICAgICAgKi8KICAgICAgICBpZiAoMCA9PSBuZXdoZWFkKQogICAgICAgICAgICBuZXdoZWFkID0gbmV3dmFyOwogICAgICAgIGlmIChvbGR2YXIpCiAgICAgICAgICAgIG9sZHZhci0+bmV4dF92YXJpYWJsZSA9IG5ld3ZhcjsKICAgICAgICBvbGR2YXIgPSBuZXd2YXI7CgogICAgICAgIHZhciA9IHZhci0+bmV4dF92YXJpYWJsZTsKICAgIH0KICAgIHJldHVybiBuZXdoZWFkOwp9CgoKLyoKICogQ29weSBzb21lIG9yIGFsbCB2YXJpYWJsZXMgZnJvbSBzb3VyY2UgUERVIHRvIHRhcmdldCBQRFUuCiAqIFRoaXMgZnVuY3Rpb24gY29uc29saWRhdGVzIG1hbnkgb2YgdGhlIG5lZWRzIG9mIFBEVSB2YXJpYWJsZXM6CiAqIENsb25lIFBEVSA6IGNvcHkgYWxsIHRoZSB2YXJpYWJsZXMuCiAqIFNwbGl0IFBEVSA6IHNraXAgb3ZlciBzb21lIHZhcmlhYmxlcyB0byBjb3B5IG90aGVyIHZhcmlhYmxlcy4KICogRml4IFBEVSAgIDogcmVtb3ZlIHZhcmlhYmxlIGFzc29jaWF0ZWQgd2l0aCBlcnJvciBpbmRleC4KICoKICogRGVzaWduZWQgdG8gd29yayB3aXRoIF9jbG9uZV9wZHVfaGVhZGVyLgogKgogKiBJZiBkcm9wX2VyciBpcyBzZXQsIGRyb3AgYW55IHZhcmlhYmxlIGFzc29jaWF0ZWQgd2l0aCBlcnJpbmRleC4KICogSWYgc2tpcF9jb3VudCBpcyBzZXQsIHNraXAgdGhlIG51bWJlciBvZiB2YXJpYWJsZSBpbiBwZHUncyBsaXN0LgogKiBXaGlsZSBjb3B5X2NvdW50IGlzIGdyZWF0ZXIgdGhhbiB6ZXJvLCBjb3B5IHBkdSB2YXJpYWJsZXMgdG8gbmV3cGR1LgogKgogKiBJZiBhbiBlcnJvciBvY2N1cnMsIG5ld3BkdSBpcyBmcmVlZCBhbmQgcG9pbnRlciBpcyBzZXQgdG8gMC4KICoKICogUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGNsb25lZCBQRFUgaWYgc3VjY2Vzc2Z1bC4KICogUmV0dXJucyAwIGlmIGZhaWx1cmUuCiAqLwpzdGF0aWMKbmV0c25tcF9wZHUgICAgKgpfY29weV9wZHVfdmFycyhuZXRzbm1wX3BkdSAqcGR1LCAgICAgICAgLyogc291cmNlIFBEVSAqLwogICAgICAgICAgICAgICBuZXRzbm1wX3BkdSAqbmV3cGR1LCAgICAgLyogdGFyZ2V0IFBEVSAqLwogICAgICAgICAgICAgICBpbnQgZHJvcF9lcnIsICAgIC8qICE9MCBkcm9wIGVycm9yZWQgdmFyaWFibGUgKi8KICAgICAgICAgICAgICAgaW50IHNraXBfY291bnQsICAvKiAhPTAgbnVtYmVyIG9mIHZhcmlhYmxlcyB0byBza2lwICovCiAgICAgICAgICAgICAgIGludCBjb3B5X2NvdW50KQp7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICE9MCBudW1iZXIgb2YgdmFyaWFibGVzIHRvIGNvcHkgKi8KICAgIG5ldHNubXBfdmFyaWFibGVfbGlzdCAqdmFyOwojaWYgVEVNUE9SQVJJTFlfRElTQUJMRUQKICAgIGludCAgICAgICAgICAgICBjb3BpZWQ7CiNlbmRpZgogICAgaW50ICAgICAgICAgICAgIGRyb3BfaWR4OwoKICAgIGlmICghbmV3cGR1KQogICAgICAgIHJldHVybiAwOyAgICAgICAgICAgICAgIC8qIHdoZXJlIGlzIFBEVSB0byBjb3B5IHRvID8gKi8KCiAgICBpZiAoZHJvcF9lcnIpCiAgICAgICAgZHJvcF9pZHggPSBwZHUtPmVycmluZGV4IC0gc2tpcF9jb3VudDsKICAgIGVsc2UKICAgICAgICBkcm9wX2lkeCA9IDA7CgogICAgdmFyID0gcGR1LT52YXJpYWJsZXM7CiAgICB3aGlsZSAodmFyICYmIChza2lwX2NvdW50LS0gPiAwKSkgICAvKiBza2lwIG92ZXIgcGR1IHZhcmlhYmxlcyAqLwogICAgICAgIHZhciA9IHZhci0+bmV4dF92YXJpYWJsZTsKCiNpZiBURU1QT1JBUklMWV9ESVNBQkxFRAogICAgY29waWVkID0gMDsKICAgIGlmIChwZHUtPmZsYWdzICYgVUNEX01TR19GTEFHX0ZPUkNFX1BEVV9DT1BZKQogICAgICAgIGNvcGllZCA9IDE7ICAgICAgICAgICAgIC8qIFdlJ3JlIGludGVyZXN0ZWQgaW4gJ2VtcHR5JyByZXNwb25zZXMgdG9vICovCiNlbmRpZgoKICAgIG5ld3BkdS0+dmFyaWFibGVzID0gX2NvcHlfdmFybGlzdCh2YXIsIGRyb3BfaWR4LCBjb3B5X2NvdW50KTsKI2lmIFRFTVBPUkFSSUxZX0RJU0FCTEVECiAgICBpZiAobmV3cGR1LT52YXJpYWJsZXMpCiAgICAgICAgY29waWVkID0gMTsKI2VuZGlmCgojaWYgQUxTT19URU1QT1JBUklMWV9ESVNBQkxFRAogICAgLyoKICAgICAqIEVycm9yIGlmIGJhZCBlcnJpbmRleCBvciBpZiB0YXJnZXQgUERVIGhhcyBubyB2YXJpYWJsZXMgY29waWVkIAogICAgICovCiAgICBpZiAoKGRyb3BfZXJyICYmIChpaSA8IHBkdS0+ZXJyaW5kZXgpKQojaWYgVEVNUE9SQVJJTFlfRElTQUJMRUQKICAgICAgICAvKgogICAgICAgICAqIFNOTVB2MyBlbmdpbmVJRCBwcm9iZXMgYXJlIGFsbG93ZWQgdG8gYmUgZW1wdHkuCiAgICAgICAgICogU2VlIHRoZSBjb21tZW50IGluIHNubXBfYXBpLmMgZm9yIGZ1cnRoZXIgZGV0YWlscyAKICAgICAgICAgKi8KICAgICAgICB8fCBjb3BpZWQgPT0gMAojZW5kaWYKICAgICAgICApIHsKICAgICAgICBzbm1wX2ZyZWVfcGR1KG5ld3BkdSk7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CiNlbmRpZgogICAgcmV0dXJuIG5ld3BkdTsKfQoKCi8qCiAqIENyZWF0ZXMgKGFsbG9jYXRlcyBhbmQgY29waWVzKSBhIGNsb25lIG9mIHRoZSBpbnB1dCBQRFUuCiAqIElmIGRyb3BfZXJyIGlzIHNldCwgZG9uJ3QgY29weSBhbnkgdmFyaWFibGUgYXNzb2NpYXRlZCB3aXRoIGVycmluZGV4LgogKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBzbm1wX2Nsb25lX3BkdSBhbmQgc25tcF9maXhfcGR1LgogKgogKiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgY2xvbmVkIFBEVSBpZiBzdWNjZXNzZnVsLgogKiBSZXR1cm5zIDAgaWYgZmFpbHVyZS4KICovCnN0YXRpYwpuZXRzbm1wX3BkdSAgICAqCl9jbG9uZV9wZHUobmV0c25tcF9wZHUgKnBkdSwgaW50IGRyb3BfZXJyKQp7CiAgICBuZXRzbm1wX3BkdSAgICAqbmV3cGR1OwogICAgbmV3cGR1ID0gX2Nsb25lX3BkdV9oZWFkZXIocGR1KTsKICAgIG5ld3BkdSA9IF9jb3B5X3BkdV92YXJzKHBkdSwgbmV3cGR1LCBkcm9wX2VyciwgMCwgMTAwMDApOyAgIC8qIHNraXAgbm9uZSwgY29weSBhbGwgKi8KCiAgICByZXR1cm4gbmV3cGR1Owp9CgoKLyoKICogVGhpcyBmdW5jdGlvbiB3aWxsIGNsb25lIGEgZnVsbCB2YXJiaW5kIGxpc3QKICoKICogUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGNsb25lZCBQRFUgaWYgc3VjY2Vzc2Z1bC4KICogUmV0dXJucyAwIGlmIGZhaWx1cmUKICovCm5ldHNubXBfdmFyaWFibGVfbGlzdCAqCnNubXBfY2xvbmVfdmFyYmluZChuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXJsaXN0KQp7CiAgICByZXR1cm4gX2NvcHlfdmFybGlzdCh2YXJsaXN0LCAwLCAxMDAwMCk7ICAgIC8qIHNraXAgbm9uZSwgY29weSBhbGwgKi8KfQoKLyoKICogVGhpcyBmdW5jdGlvbiB3aWxsIGNsb25lIGEgUERVIGluY2x1ZGluZyBhbGwgb2YgaXRzIHZhcmlhYmxlcy4KICoKICogUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGNsb25lZCBQRFUgaWYgc3VjY2Vzc2Z1bC4KICogUmV0dXJucyAwIGlmIGZhaWx1cmUKICovCm5ldHNubXBfcGR1ICAgICoKc25tcF9jbG9uZV9wZHUobmV0c25tcF9wZHUgKnBkdSkKewogICAgcmV0dXJuIF9jbG9uZV9wZHUocGR1LCAwKTsgIC8qIGNvcGllcyBhbGwgdmFyaWFibGVzICovCn0KCgovKgogKiBUaGlzIGZ1bmN0aW9uIHdpbGwgY2xvbmUgYSBQRFUgaW5jbHVkaW5nIHNvbWUgb2YgaXRzIHZhcmlhYmxlcy4KICoKICogSWYgc2tpcF9jb3VudCBpcyBub3QgemVybywgaXQgZGVmaW5lcyB0aGUgbnVtYmVyIG9mIHZhcmlhYmxlcyB0byBza2lwLgogKiBJZiBjb3B5X2NvdW50IGlzIG5vdCB6ZXJvLCBpdCBkZWZpbmVzIHRoZSBudW1iZXIgb2YgdmFyaWFibGVzIHRvIGNvcHkuCiAqCiAqIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBjbG9uZWQgUERVIGlmIHN1Y2Nlc3NmdWwuCiAqIFJldHVybnMgMCBpZiBmYWlsdXJlLgogKi8KbmV0c25tcF9wZHUgICAgKgpzbm1wX3NwbGl0X3BkdShuZXRzbm1wX3BkdSAqcGR1LCBpbnQgc2tpcF9jb3VudCwgaW50IGNvcHlfY291bnQpCnsKICAgIG5ldHNubXBfcGR1ICAgICpuZXdwZHU7CiAgICBuZXdwZHUgPSBfY2xvbmVfcGR1X2hlYWRlcihwZHUpOwogICAgbmV3cGR1ID0gX2NvcHlfcGR1X3ZhcnMocGR1LCBuZXdwZHUsIDAsICAgICAvKiBkb24ndCBkcm9wIGFueSB2YXJpYWJsZXMgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraXBfY291bnQsIGNvcHlfY291bnQpOwoKICAgIHJldHVybiBuZXdwZHU7Cn0KCgovKgogKiBJZiB0aGVyZSB3YXMgYW4gZXJyb3IgaW4gdGhlIGlucHV0IHBkdSwgY3JlYXRlcyBhIGNsb25lIG9mIHRoZSBwZHUKICogdGhhdCBpbmNsdWRlcyBhbGwgdGhlIHZhcmlhYmxlcyBleGNlcHQgdGhlIG9uZSBtYXJrZWQgYnkgdGhlIGVycmluZGV4LgogKiBUaGUgY29tbWFuZCBpcyBzZXQgdG8gdGhlIGlucHV0IGNvbW1hbmQgYW5kIHRoZSByZXFpZCwgZXJyc3RhdCwgYW5kCiAqIGVycmluZGV4IGFyZSBzZXQgdG8gZGVmYXVsdCB2YWx1ZXMuCiAqIElmIHRoZSBlcnJvciBzdGF0dXMgZGlkbid0IGluZGljYXRlIGFuIGVycm9yLCB0aGUgZXJyb3IgaW5kZXggZGlkbid0CiAqIGluZGljYXRlIGEgdmFyaWFibGUsIHRoZSBwZHUgd2Fzbid0IGEgZ2V0IHJlc3BvbnNlIG1lc3NhZ2UsIHRoZQogKiBtYXJrZWQgdmFyaWFibGUgd2FzIG5vdCBwcmVzZW50IGluIHRoZSBpbml0aWFsIHJlcXVlc3QsIG9yIHRoZXJlCiAqIHdvdWxkIGJlIG5vIHJlbWFpbmluZyB2YXJpYWJsZXMsIHRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gMC4KICogSWYgZXZlcnl0aGluZyB3YXMgc3VjY2Vzc2Z1bCwgYSBwb2ludGVyIHRvIHRoZSBmaXhlZCBjbG9uZWQgcGR1IHdpbGwKICogYmUgcmV0dXJuZWQuCiAqLwpuZXRzbm1wX3BkdSAgICAqCnNubXBfZml4X3BkdShuZXRzbm1wX3BkdSAqcGR1LCBpbnQgY29tbWFuZCkKewogICAgbmV0c25tcF9wZHUgICAgKm5ld3BkdTsKCiAgICBpZiAoKHBkdS0+Y29tbWFuZCAhPSBTTk1QX01TR19SRVNQT05TRSkKICAgICAgICB8fCAocGR1LT5lcnJzdGF0ID09IFNOTVBfRVJSX05PRVJST1IpCiAgICAgICAgfHwgKDAgPT0gcGR1LT52YXJpYWJsZXMpCiAgICAgICAgfHwgKHBkdS0+ZXJyaW5kZXggPiBzbm1wX3ZhcmJpbmRfbGVuKHBkdSkpCiAgICAgICAgfHwgKHBkdS0+ZXJyaW5kZXggPD0gMCkpIHsKICAgICAgICByZXR1cm4gMDsgICAgICAgICAgICAgICAvKiBwcmUtY29uZGl0aW9uIHRlc3RzIGZhaWwgKi8KICAgIH0KCiAgICBuZXdwZHUgPSBfY2xvbmVfcGR1KHBkdSwgMSk7ICAgICAgICAvKiBjb3BpZXMgYWxsIGV4Y2VwdCBlcnJvcmVkIHZhcmlhYmxlICovCiAgICBpZiAoIW5ld3BkdSkKICAgICAgICByZXR1cm4gMDsKICAgIGlmICghbmV3cGR1LT52YXJpYWJsZXMpIHsKICAgICAgICBzbm1wX2ZyZWVfcGR1KG5ld3BkdSk7CiAgICAgICAgcmV0dXJuIDA7ICAgICAgICAgICAgICAgLyogbm8gdmFyaWFibGVzLiAic2hvdWxkIG5vdCBoYXBwZW4iICovCiAgICB9CiAgICBuZXdwZHUtPmNvbW1hbmQgPSBjb21tYW5kOwogICAgbmV3cGR1LT5yZXFpZCA9IHNubXBfZ2V0X25leHRfcmVxaWQoKTsKICAgIG5ld3BkdS0+bXNnaWQgPSBzbm1wX2dldF9uZXh0X21zZ2lkKCk7CiAgICBuZXdwZHUtPmVycnN0YXQgPSBTTk1QX0RFRkFVTFRfRVJSU1RBVDsKICAgIG5ld3BkdS0+ZXJyaW5kZXggPSBTTk1QX0RFRkFVTFRfRVJSSU5ERVg7CgogICAgcmV0dXJuIG5ld3BkdTsKfQoKCi8qCiAqIFJldHVybnMgdGhlIG51bWJlciBvZiB2YXJpYWJsZXMgYm91bmQgdG8gYSBQRFUgc3RydWN0dXJlCiAqLwp1bnNpZ25lZCBsb25nCnNubXBfdmFyYmluZF9sZW4obmV0c25tcF9wZHUgKnBkdSkKewogICAgcmVnaXN0ZXIgbmV0c25tcF92YXJpYWJsZV9saXN0ICp2YXJzOwogICAgdW5zaWduZWQgbG9uZyAgIHJldFZhbCA9IDA7CiAgICBpZiAocGR1KQogICAgICAgIGZvciAodmFycyA9IHBkdS0+dmFyaWFibGVzOyB2YXJzOyB2YXJzID0gdmFycy0+bmV4dF92YXJpYWJsZSkgewogICAgICAgICAgICByZXRWYWwrKzsKICAgICAgICB9CgogICAgcmV0dXJuIHJldFZhbDsKfQoKLyoKICogQWRkIG9iamVjdCBpZGVudGlmaWVyIG5hbWUgdG8gU05NUCB2YXJpYWJsZS4KICogSWYgdGhlIG5hbWUgaXMgbGFyZ2UsIGFkZGl0aW9uYWwgbWVtb3J5IGlzIGFsbG9jYXRlZC4KICogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuCiAqLwoKaW50CnNubXBfc2V0X3Zhcl9vYmppZChuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2cCwKICAgICAgICAgICAgICAgICAgIGNvbnN0IG9pZCAqIG9iamlkLCBzaXplX3QgbmFtZV9sZW5ndGgpCnsKICAgIHNpemVfdCAgICAgICAgICBsZW4gPSBzaXplb2Yob2lkKSAqIG5hbWVfbGVuZ3RoOwoKICAgIGlmICh2cC0+bmFtZSAhPSB2cC0+bmFtZV9sb2MgJiYgdnAtPm5hbWUgIT0gTlVMTCkgewogICAgICAgIC8qCiAgICAgICAgICogUHJvYmFibHkgcHJldmlvdXNseS1hbGxvY2F0ZWQgImJpZyBzdG9yYWdlIi4gIEJldHRlciBmcmVlIGl0CiAgICAgICAgICogZWxzZSBtZW1vcnkgbGVha3MgcG9zc2libGUuICAKICAgICAgICAgKi8KICAgICAgICBmcmVlKHZwLT5uYW1lKTsKICAgIH0KCiAgICAvKgogICAgICogdXNlIGJ1aWx0LWluIHN0b3JhZ2UgZm9yIHNtYWxsZXIgdmFsdWVzIAogICAgICovCiAgICBpZiAobGVuIDw9IHNpemVvZih2cC0+bmFtZV9sb2MpKSB7CiAgICAgICAgdnAtPm5hbWUgPSB2cC0+bmFtZV9sb2M7CiAgICB9IGVsc2UgewogICAgICAgIHZwLT5uYW1lID0gKG9pZCAqKSBtYWxsb2MobGVuKTsKICAgICAgICBpZiAoIXZwLT5uYW1lKQogICAgICAgICAgICByZXR1cm4gMTsKICAgIH0KICAgIGlmIChvYmppZCkKICAgICAgICBtZW1tb3ZlKHZwLT5uYW1lLCBvYmppZCwgbGVuKTsKICAgIHZwLT5uYW1lX2xlbmd0aCA9IG5hbWVfbGVuZ3RoOwogICAgcmV0dXJuIDA7Cn0KCi8qKgogKiBzbm1wX3NldF92YXJfdHlwZWRfdmFsdWUgaXMgdXNlZCB0byBzZXQgZGF0YSBpbnRvIHRoZSBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QKICogc3RydWN0dXJlLiAgVXNlZCB0byByZXR1cm4gZGF0YSB0byB0aGUgc25tcCByZXF1ZXN0IHZpYSB0aGUKICogbmV0c25tcF9yZXF1ZXN0X2luZm8gc3RydWN0dXJlJ3MgcmVxdWVzdHZiIHBvaW50ZXIuCiAqCiAqIEBwYXJhbSBuZXd2YXIgICB0aGUgc3RydWN0dXJlIGdldHMgcG9wdWxhdGVkIHdpdGggdGhlIGdpdmVuIGRhdGEsIHR5cGUsCiAqICAgICAgICAgICAgICAgICB2YWxfc3RyLCBhbmQgdmFsX2xlbi4KICogQHBhcmFtIHR5cGUgICAgIGlzIHRoZSBhc24gZGF0YSB0eXBlIHRvIGJlIGNvcGllZAogKiBAcGFyYW0gdmFsX3N0ciAgaXMgYSBidWZmZXIgY29udGFpbmluZyB0aGUgdmFsdWUgdG8gYmUgY29waWVkIGludG8gdGhlCiAqICAgICAgICAgICAgICAgICBuZXd2YXIgc3RydWN0dXJlLiAKICogQHBhcmFtIHZhbF9sZW4gIHRoZSBsZW5ndGggb2YgdmFsX3N0cgogKiAKICogQHJldHVybiByZXR1cm5zIDAgb24gc3VjY2VzcyBhbmQgMSBvbiBhIG1hbGxvYyBlcnJvcgogKi8KCmludApzbm1wX3NldF92YXJfdHlwZWRfdmFsdWUobmV0c25tcF92YXJpYWJsZV9saXN0ICogbmV3dmFyLCB1X2NoYXIgdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKiB2YWxfc3RyLCBzaXplX3QgdmFsX2xlbikKewogICAgbmV3dmFyLT50eXBlID0gdHlwZTsKICAgIHJldHVybiBzbm1wX3NldF92YXJfdmFsdWUobmV3dmFyLCB2YWxfc3RyLCB2YWxfbGVuKTsKfQoKaW50CnNubXBfc2V0X3Zhcl90eXBlZF9pbnRlZ2VyKG5ldHNubXBfdmFyaWFibGVfbGlzdCAqIG5ld3ZhciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyIHR5cGUsIGxvbmcgdmFsKQp7CiAgICBjb25zdCBsb25nIHYgPSB2YWw7CiAgICBuZXd2YXItPnR5cGUgPSB0eXBlOwogICAgcmV0dXJuIHNubXBfc2V0X3Zhcl92YWx1ZShuZXd2YXIsICZ2LCBzaXplb2YobG9uZykpOwogICAgcmV0dXJuIDA7Cn0KCmludApjb3VudF92YXJiaW5kcyhuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXJfcHRyKQp7CiAgICBpbnQgICAgICAgICAgICAgY291bnQgPSAwOwoKICAgIGZvciAoOyB2YXJfcHRyICE9IE5VTEw7IHZhcl9wdHIgPSB2YXJfcHRyLT5uZXh0X3ZhcmlhYmxlKQogICAgICAgIGNvdW50Kys7CgogICAgcmV0dXJuIGNvdW50Owp9CgppbnQKY291bnRfdmFyYmluZHNfb2ZfdHlwZShuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXJfcHRyLCB1X2NoYXIgdHlwZSkKewogICAgaW50ICAgICAgICAgICAgIGNvdW50ID0gMDsKCiAgICBmb3IgKDsgdmFyX3B0ciAhPSBOVUxMOyB2YXJfcHRyID0gdmFyX3B0ci0+bmV4dF92YXJpYWJsZSkKICAgICAgICBpZiAodmFyX3B0ci0+dHlwZSA9PSB0eXBlKQogICAgICAgICAgICBjb3VudCsrOwoKICAgIHJldHVybiBjb3VudDsKfQoKbmV0c25tcF92YXJpYWJsZV9saXN0ICoKZmluZF92YXJiaW5kX29mX3R5cGUobmV0c25tcF92YXJpYWJsZV9saXN0ICogdmFyX3B0ciwgdV9jaGFyIHR5cGUpCnsKICAgIGZvciAoOyB2YXJfcHRyICE9IE5VTEwgJiYgdmFyX3B0ci0+dHlwZSAhPSB0eXBlOwogICAgICAgICB2YXJfcHRyID0gdmFyX3B0ci0+bmV4dF92YXJpYWJsZSk7CgogICAgcmV0dXJuIHZhcl9wdHI7Cn0KCm5ldHNubXBfdmFyaWFibGVfbGlzdCoKZmluZF92YXJiaW5kX2luX2xpc3QoIG5ldHNubXBfdmFyaWFibGVfbGlzdCAqdmJsaXN0LAogICAgICAgICAgICAgICAgICAgICAgb2lkICpuYW1lLCBzaXplX3QgbGVuKQp7CiAgICBmb3IgKDsgdmJsaXN0ICE9IE5VTEw7IHZibGlzdCA9IHZibGlzdC0+bmV4dF92YXJpYWJsZSkKICAgICAgICBpZiAoIXNubXBfb2lkX2NvbXBhcmUodmJsaXN0LT5uYW1lLCB2Ymxpc3QtPm5hbWVfbGVuZ3RoLCBuYW1lLCBsZW4pKQogICAgICAgICAgICByZXR1cm4gdmJsaXN0OwoKICAgIHJldHVybiBOVUxMOwp9CgovKgogKiBBZGQgc29tZSB2YWx1ZSB0byBTTk1QIHZhcmlhYmxlLgogKiBJZiB0aGUgdmFsdWUgaXMgbGFyZ2UsIGFkZGl0aW9uYWwgbWVtb3J5IGlzIGFsbG9jYXRlZC4KICogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuCiAqLwoKaW50CnNubXBfc2V0X3Zhcl92YWx1ZShuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YXJzLAogICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqIHZhbHVlLCBzaXplX3QgbGVuKQp7CiAgICBpbnQgICAgICAgICAgICAgbGFyZ2V2YWwgPSAxOwoKICAgIC8qCiAgICAgKiB4eHgtcmtzOiB3aHkgdGhlIHVuY29uZGl0aW9uYWwgZnJlZT8gd2h5IG5vdCB1c2UgZXhpc3RpbmcKICAgICAqIG1lbW9yeSwgaWYgbGVuIDwgdmFycy0+dmFsX2xlbiA/CiAgICAgKi8KICAgIGlmICh2YXJzLT52YWwuc3RyaW5nICYmIHZhcnMtPnZhbC5zdHJpbmcgIT0gdmFycy0+YnVmKSB7CiAgICAgICAgZnJlZSh2YXJzLT52YWwuc3RyaW5nKTsKICAgIH0KICAgIHZhcnMtPnZhbC5zdHJpbmcgPSAwOwogICAgdmFycy0+dmFsX2xlbiA9IDA7CgogICAgaWYgKHZhbHVlID09IE5VTEwgJiYgbGVuID4gMCkgewogICAgICAgIHNubXBfbG9nKExPR19FUlIsICJiYWQgc2l6ZSBmb3IgTlVMTCB2YWx1ZVxuIik7CiAgICAgICAgcmV0dXJuIDE7CiAgICB9CgogICAgLyoKICAgICAqIHVzZSBidWlsdC1pbiBzdG9yYWdlIGZvciBzbWFsbGVyIHZhbHVlcyAKICAgICAqLwogICAgaWYgKGxlbiA8PSAoc2l6ZW9mKHZhcnMtPmJ1ZikgLSAxKSkgewogICAgICAgIHZhcnMtPnZhbC5zdHJpbmcgPSAodV9jaGFyICopIHZhcnMtPmJ1ZjsKICAgICAgICBsYXJnZXZhbCA9IDA7CiAgICB9CgogICAgaWYgKCgwID09IGxlbikgfHwgKE5VTEwgPT0gdmFsdWUpKSB7CiAgICAgICAgdmFycy0+dmFsLnN0cmluZ1swXSA9IDA7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgdmFycy0+dmFsX2xlbiA9IGxlbjsKICAgIHN3aXRjaCAodmFycy0+dHlwZSkgewogICAgY2FzZSBBU05fSU5URUdFUjoKICAgIGNhc2UgQVNOX1VOU0lHTkVEOgogICAgY2FzZSBBU05fVElNRVRJQ0tTOgogICAgY2FzZSBBU05fQ09VTlRFUjoKICAgIGNhc2UgQVNOX1VJTlRFR0VSOgogICAgICAgIGlmICh2YXJzLT52YWxfbGVuID09IHNpemVvZihpbnQpKSB7CiAgICAgICAgICAgIGlmIChBU05fSU5URUdFUiA9PSB2YXJzLT50eXBlKSB7CiAgICAgICAgICAgICAgICBjb25zdCBpbnQgICAgICAqdmFsX2ludCAKICAgICAgICAgICAgICAgICAgICA9IChjb25zdCBpbnQgKikgdmFsdWU7CiAgICAgICAgICAgICAgICAqKHZhcnMtPnZhbC5pbnRlZ2VyKSA9IChsb25nKSAqdmFsX2ludDsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGNvbnN0IHVfaW50ICAgICp2YWxfdWludAogICAgICAgICAgICAgICAgICAgID0gKGNvbnN0IHVfaW50ICopIHZhbHVlOwogICAgICAgICAgICAgICAgKih2YXJzLT52YWwuaW50ZWdlcikgPSAodW5zaWduZWQgbG9uZykgKnZhbF91aW50OwogICAgICAgICAgICB9CiAgICAgICAgfQojaWYgU0laRU9GX0xPTkcgIT0gU0laRU9GX0lOVAogICAgICAgIGVsc2UgaWYgKHZhcnMtPnZhbF9sZW4gPT0gc2l6ZW9mKGxvbmcpKXsKICAgICAgICAgICAgY29uc3QgdV9sb25nICAgKnZhbF91bG9uZwogICAgICAgICAgICAgICAgPSAoY29uc3QgdV9sb25nICopIHZhbHVlOwogICAgICAgICAgICAqKHZhcnMtPnZhbC5pbnRlZ2VyKSA9ICp2YWxfdWxvbmc7CiAgICAgICAgICAgIGlmICgqKHZhcnMtPnZhbC5pbnRlZ2VyKSA+IDB4ZmZmZmZmZmYpIHsKICAgICAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsInRydW5jYXRpbmcgaW50ZWdlciB2YWx1ZSA+IDMyIGJpdHNcbiIpOwogICAgICAgICAgICAgICAgKih2YXJzLT52YWwuaW50ZWdlcikgJj0gMHhmZmZmZmZmZjsKICAgICAgICAgICAgfQogICAgICAgIH0KI2VuZGlmCiNpZiBkZWZpbmVkKFNJWkVPRl9MT05HX0xPTkcpICYmIChTSVpFT0ZfTE9ORyAhPSBTSVpFT0ZfTE9OR19MT05HKSAmJiAoU0laRU9GX0xPTkdfTE9ORyAhPSBTSVpFT0ZfSU5UTUFYX1QpCiAgICAgICAgZWxzZSBpZiAodmFycy0+dmFsX2xlbiA9PSBzaXplb2YobG9uZyBsb25nKSl7CiAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAgICp2YWxfdWxsb25nCiAgICAgICAgICAgICAgICA9IChjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgKikgdmFsdWU7CiAgICAgICAgICAgICoodmFycy0+dmFsLmludGVnZXIpID0gKGxvbmcpICp2YWxfdWxsb25nOwogICAgICAgICAgICBpZiAoKih2YXJzLT52YWwuaW50ZWdlcikgPiAweGZmZmZmZmZmKSB7CiAgICAgICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLCJ0cnVuY2F0aW5nIGludGVnZXIgdmFsdWUgPiAzMiBiaXRzXG4iKTsKICAgICAgICAgICAgICAgICoodmFycy0+dmFsLmludGVnZXIpICY9IDB4ZmZmZmZmZmY7CiAgICAgICAgICAgIH0KICAgICAgICB9CiNlbmRpZgojaWYgU0laRU9GX0xPTkcgIT0gU0laRU9GX0lOVE1BWF9UCiAgICAgICAgZWxzZSBpZiAodmFycy0+dmFsX2xlbiA9PSBzaXplb2YoaW50bWF4X3QpKXsKICAgICAgICAgICAgY29uc3QgdWludG1heF90ICp2YWxfdWludG1heF90CiAgICAgICAgICAgICAgICA9IChjb25zdCB1aW50bWF4X3QgKikgdmFsdWU7CiAgICAgICAgICAgICoodmFycy0+dmFsLmludGVnZXIpID0gKGxvbmcpICp2YWxfdWludG1heF90OwogICAgICAgICAgICBpZiAoKih2YXJzLT52YWwuaW50ZWdlcikgPiAweGZmZmZmZmZmKSB7CiAgICAgICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLCJ0cnVuY2F0aW5nIGludGVnZXIgdmFsdWUgPiAzMiBiaXRzXG4iKTsKICAgICAgICAgICAgICAgICoodmFycy0+dmFsLmludGVnZXIpICY9IDB4ZmZmZmZmZmY7CiAgICAgICAgICAgIH0KICAgICAgICB9CiNlbmRpZgojaWYgU0laRU9GX1NIT1JUICE9IFNJWkVPRl9JTlQKICAgICAgICBlbHNlIGlmICh2YXJzLT52YWxfbGVuID09IHNpemVvZihzaG9ydCkpIHsKICAgICAgICAgICAgaWYgKEFTTl9JTlRFR0VSID09IHZhcnMtPnR5cGUpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHNob3J0ICAgICAgKnZhbF9zaG9ydCAKICAgICAgICAgICAgICAgICAgICA9IChjb25zdCBzaG9ydCAqKSB2YWx1ZTsKICAgICAgICAgICAgICAgICoodmFycy0+dmFsLmludGVnZXIpID0gKGxvbmcpICp2YWxfc2hvcnQ7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBjb25zdCB1X3Nob3J0ICAgICp2YWxfdXNob3J0CiAgICAgICAgICAgICAgICAgICAgPSAoY29uc3QgdV9zaG9ydCAqKSB2YWx1ZTsKICAgICAgICAgICAgICAgICoodmFycy0+dmFsLmludGVnZXIpID0gKHVuc2lnbmVkIGxvbmcpICp2YWxfdXNob3J0OwogICAgICAgICAgICB9CiAgICAgICAgfQojZW5kaWYKICAgICAgICBlbHNlIGlmICh2YXJzLT52YWxfbGVuID09IHNpemVvZihjaGFyKSkgewogICAgICAgICAgICBpZiAoQVNOX0lOVEVHRVIgPT0gdmFycy0+dHlwZSkgewogICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICp2YWxfY2hhciAKICAgICAgICAgICAgICAgICAgICA9IChjb25zdCBjaGFyICopIHZhbHVlOwogICAgICAgICAgICAgICAgKih2YXJzLT52YWwuaW50ZWdlcikgPSAobG9uZykgKnZhbF9jaGFyOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgY29uc3QgdV9jaGFyICAgICp2YWxfdWNoYXIgCiAgICAgICAgICAgICAgICAgICAgPSAoY29uc3QgdV9jaGFyICopIHZhbHVlOwogICAgICAgICAgICAgICAgKih2YXJzLT52YWwuaW50ZWdlcikgPSAodW5zaWduZWQgbG9uZykgKnZhbF91Y2hhcjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwiYmFkIHNpemUgZm9yIGludGVnZXItbGlrZSB0eXBlICglZClcbiIsCiAgICAgICAgICAgICAgICAgICAgIChpbnQpdmFycy0+dmFsX2xlbik7CiAgICAgICAgICAgIHJldHVybiAoMSk7CiAgICAgICAgfQogICAgICAgIHZhcnMtPnZhbF9sZW4gPSBzaXplb2YobG9uZyk7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBBU05fT0JKRUNUX0lEOgogICAgY2FzZSBBU05fUFJJVl9JTVBMSUVEX09CSkVDVF9JRDoKICAgIGNhc2UgQVNOX1BSSVZfSU5DTF9SQU5HRToKICAgIGNhc2UgQVNOX1BSSVZfRVhDTF9SQU5HRToKICAgICAgICBpZiAobGFyZ2V2YWwpIHsKICAgICAgICAgICAgdmFycy0+dmFsLm9iamlkID0gKG9pZCAqKSBtYWxsb2ModmFycy0+dmFsX2xlbik7CiAgICAgICAgfQogICAgICAgIGlmICh2YXJzLT52YWwub2JqaWQgPT0gTlVMTCkgewogICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLCJubyBzdG9yYWdlIGZvciBPSURcbiIpOwogICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICB9CiAgICAgICAgbWVtbW92ZSh2YXJzLT52YWwub2JqaWQsIHZhbHVlLCB2YXJzLT52YWxfbGVuKTsKICAgICAgICBicmVhazsKCiAgICBjYXNlIEFTTl9JUEFERFJFU1M6IC8qIHNubXBfYnVpbGRfdmFyX29wIHRyZWF0cyBJUEFERFIgbGlrZSBhIHN0cmluZyAqLwogICAgICAgIGlmICg0ICE9IHZhcnMtPnZhbF9sZW4pIHsKICAgICAgICAgICAgbmV0c25tcF9hc3NlcnQoImlwYWRkcmVzcyBsZW5ndGggPT0gNCIpOwogICAgICAgIH0KICAgICAgICAvKiogRkFMTCBUSFJPVUdIICovCiAgICBjYXNlIEFTTl9QUklWX0lNUExJRURfT0NURVRfU1RSOgogICAgY2FzZSBBU05fT0NURVRfU1RSOgogICAgY2FzZSBBU05fQklUX1NUUjoKICAgIGNhc2UgQVNOX09QQVFVRToKICAgIGNhc2UgQVNOX05TQVA6CiAgICAgICAgaWYgKGxhcmdldmFsKSB7CiAgICAgICAgICAgIHZhcnMtPnZhbC5zdHJpbmcgPSAodV9jaGFyICopIG1hbGxvYyh2YXJzLT52YWxfbGVuICsgMSk7CiAgICAgICAgfQogICAgICAgIGlmICh2YXJzLT52YWwuc3RyaW5nID09IE5VTEwpIHsKICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwibm8gc3RvcmFnZSBmb3Igc3RyaW5nXG4iKTsKICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgfQogICAgICAgIG1lbW1vdmUodmFycy0+dmFsLnN0cmluZywgdmFsdWUsIHZhcnMtPnZhbF9sZW4pOwogICAgICAgIC8qCiAgICAgICAgICogTWFrZSBzdXJlIHRoZSBzdHJpbmcgaXMgemVyby10ZXJtaW5hdGVkOyBzb21lIGJpdHMgb2YgY29kZSBtYWtlCiAgICAgICAgICogdGhpcyBhc3N1bXB0aW9uLiAgRWFzaWVyIHRvIGRvIHRoaXMgaGVyZSB0aGFuIGZpeCBhbGwgdGhlc2Ugd3JvbmcKICAgICAgICAgKiBhc3N1bXB0aW9ucy4gIAogICAgICAgICAqLwogICAgICAgIHZhcnMtPnZhbC5zdHJpbmdbdmFycy0+dmFsX2xlbl0gPSAnXDAnOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgU05NUF9OT1NVQ0hPQkpFQ1Q6CiAgICBjYXNlIFNOTVBfTk9TVUNISU5TVEFOQ0U6CiAgICBjYXNlIFNOTVBfRU5ET0ZNSUJWSUVXOgogICAgY2FzZSBBU05fTlVMTDoKICAgICAgICB2YXJzLT52YWxfbGVuID0gMDsKICAgICAgICB2YXJzLT52YWwuc3RyaW5nID0gTlVMTDsKICAgICAgICBicmVhazsKCiNpZmRlZiBORVRTTk1QX1dJVEhfT1BBUVVFX1NQRUNJQUxfVFlQRVMKICAgIGNhc2UgQVNOX09QQVFVRV9VNjQ6CiAgICBjYXNlIEFTTl9PUEFRVUVfSTY0OgojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5FVFNOTVBfV0lUSF9PUEFRVUVfU1BFQ0lBTF9UWVBFUyAqLwogICAgY2FzZSBBU05fQ09VTlRFUjY0OgogICAgICAgIGlmIChsYXJnZXZhbCkgewogICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLCJiYWQgc2l6ZSBmb3IgY291bnRlciA2NCAoJWQpXG4iLAogICAgICAgICAgICAgICAgICAgICAoaW50KXZhcnMtPnZhbF9sZW4pOwogICAgICAgICAgICByZXR1cm4gKDEpOwogICAgICAgIH0KICAgICAgICB2YXJzLT52YWxfbGVuID0gc2l6ZW9mKHN0cnVjdCBjb3VudGVyNjQpOwogICAgICAgIG1lbW1vdmUodmFycy0+dmFsLmNvdW50ZXI2NCwgdmFsdWUsIHZhcnMtPnZhbF9sZW4pOwogICAgICAgIGJyZWFrOwoKI2lmZGVmIE5FVFNOTVBfV0lUSF9PUEFRVUVfU1BFQ0lBTF9UWVBFUwogICAgY2FzZSBBU05fT1BBUVVFX0ZMT0FUOgogICAgICAgIGlmIChsYXJnZXZhbCkgewogICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLCJiYWQgc2l6ZSBmb3Igb3BhcXVlIGZsb2F0ICglZClcbiIsCiAgICAgICAgICAgICAgICAgICAgIChpbnQpdmFycy0+dmFsX2xlbik7CiAgICAgICAgICAgIHJldHVybiAoMSk7CiAgICAgICAgfQogICAgICAgIHZhcnMtPnZhbF9sZW4gPSBzaXplb2YoZmxvYXQpOwogICAgICAgIG1lbW1vdmUodmFycy0+dmFsLmZsb2F0VmFsLCB2YWx1ZSwgdmFycy0+dmFsX2xlbik7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBBU05fT1BBUVVFX0RPVUJMRToKICAgICAgICBpZiAobGFyZ2V2YWwpIHsKICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwiYmFkIHNpemUgZm9yIG9wYXF1ZSBkb3VibGUgKCVkKVxuIiwKICAgICAgICAgICAgICAgICAgICAgKGludCl2YXJzLT52YWxfbGVuKTsKICAgICAgICAgICAgcmV0dXJuICgxKTsKICAgICAgICB9CiAgICAgICAgdmFycy0+dmFsX2xlbiA9IHNpemVvZihkb3VibGUpOwogICAgICAgIG1lbW1vdmUodmFycy0+dmFsLmRvdWJsZVZhbCwgdmFsdWUsIHZhcnMtPnZhbF9sZW4pOwogICAgICAgIGJyZWFrOwoKI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBORVRTTk1QX1dJVEhfT1BBUVVFX1NQRUNJQUxfVFlQRVMgKi8KCiAgICBkZWZhdWx0OgogICAgICAgIHNubXBfbG9nKExPR19FUlIsIkludGVybmFsIGVycm9yIGluIHR5cGUgc3dpdGNoaW5nXG4iKTsKICAgICAgICBzbm1wX3NldF9kZXRhaWwoIkludGVybmFsIGVycm9yIGluIHR5cGUgc3dpdGNoaW5nXG4iKTsKICAgICAgICByZXR1cm4gKDEpOwogICAgfQoKICAgIHJldHVybiAwOwp9Cgp2b2lkCnNubXBfcmVwbGFjZV92YXJfdHlwZXMobmV0c25tcF92YXJpYWJsZV9saXN0ICogdmJsLCB1X2NoYXIgb2xkX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyIG5ld190eXBlKQp7CiAgICB3aGlsZSAodmJsKSB7CiAgICAgICAgaWYgKHZibC0+dHlwZSA9PSBvbGRfdHlwZSkgewogICAgICAgICAgICBzbm1wX3NldF92YXJfdHlwZWRfdmFsdWUodmJsLCBuZXdfdHlwZSwgTlVMTCwgMCk7CiAgICAgICAgfQogICAgICAgIHZibCA9IHZibC0+bmV4dF92YXJpYWJsZTsKICAgIH0KfQoKdm9pZApzbm1wX3Jlc2V0X3Zhcl90eXBlcyhuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiB2YmwsIHVfY2hhciBuZXdfdHlwZSkKewogICAgd2hpbGUgKHZibCkgewogICAgICAgIHNubXBfc2V0X3Zhcl90eXBlZF92YWx1ZSh2YmwsIG5ld190eXBlLCBOVUxMLCAwKTsKICAgICAgICB2YmwgPSB2YmwtPm5leHRfdmFyaWFibGU7CiAgICB9Cn0KCmludApzbm1wX3N5bmNoX3Jlc3BvbnNlX2NiKG5ldHNubXBfc2Vzc2lvbiAqIHNzLAogICAgICAgICAgICAgICAgICAgICAgIG5ldHNubXBfcGR1ICpwZHUsCiAgICAgICAgICAgICAgICAgICAgICAgbmV0c25tcF9wZHUgKipyZXNwb25zZSwgc25tcF9jYWxsYmFjayBwY2IpCnsKICAgIHN0cnVjdCBzeW5jaF9zdGF0ZSBsc3RhdGUsICpzdGF0ZTsKICAgIHNubXBfY2FsbGJhY2sgICBjYnNhdjsKICAgIHZvaWQgICAgICAgICAgICpjYm1hZ3NhdjsKICAgIGludCAgICAgICAgICAgICBudW1mZHMsIGNvdW50OwogICAgZmRfc2V0ICAgICAgICAgIGZkc2V0OwogICAgc3RydWN0IHRpbWV2YWwgIHRpbWVvdXQsICp0dnA7CiAgICBpbnQgICAgICAgICAgICAgYmxvY2s7CgogICAgbWVtc2V0KCh2b2lkICopICZsc3RhdGUsIDAsIHNpemVvZihsc3RhdGUpKTsKICAgIHN0YXRlID0gJmxzdGF0ZTsKICAgIGNic2F2ID0gc3MtPmNhbGxiYWNrOwogICAgY2JtYWdzYXYgPSBzcy0+Y2FsbGJhY2tfbWFnaWM7CiAgICBzcy0+Y2FsbGJhY2sgPSBwY2I7CiAgICBzcy0+Y2FsbGJhY2tfbWFnaWMgPSAodm9pZCAqKSBzdGF0ZTsKCiAgICBpZiAoKHN0YXRlLT5yZXFpZCA9IHNubXBfc2VuZChzcywgcGR1KSkgPT0gMCkgewogICAgICAgIHNubXBfZnJlZV9wZHUocGR1KTsKICAgICAgICBzdGF0ZS0+c3RhdHVzID0gU1RBVF9FUlJPUjsKICAgIH0gZWxzZQogICAgICAgIHN0YXRlLT53YWl0aW5nID0gMTsKCiAgICB3aGlsZSAoc3RhdGUtPndhaXRpbmcpIHsKICAgICAgICBudW1mZHMgPSAwOwogICAgICAgIEZEX1pFUk8oJmZkc2V0KTsKICAgICAgICBibG9jayA9IE5FVFNOTVBfU05NUEJMT0NLOwogICAgICAgIHR2cCA9ICZ0aW1lb3V0OwogICAgICAgIHRpbWVyY2xlYXIodHZwKTsKICAgICAgICBzbm1wX3NlbGVjdF9pbmZvKCZudW1mZHMsICZmZHNldCwgdHZwLCAmYmxvY2spOwogICAgICAgIGlmIChibG9jayA9PSAxKQogICAgICAgICAgICB0dnAgPSBOVUxMOyAgICAgICAgIC8qIGJsb2NrIHdpdGhvdXQgdGltZW91dCAqLwogICAgICAgIGNvdW50ID0gc2VsZWN0KG51bWZkcywgJmZkc2V0LCAwLCAwLCB0dnApOwogICAgICAgIGlmIChjb3VudCA+IDApIHsKICAgICAgICAgICAgc25tcF9yZWFkKCZmZHNldCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc3dpdGNoIChjb3VudCkgewogICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICBzbm1wX3RpbWVvdXQoKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIC0xOgogICAgICAgICAgICAgICAgaWYgKGVycm5vID09IEVJTlRSKSB7CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHNubXBfZXJybm8gPSBTTk1QRVJSX0dFTkVSUjsgICAgLypNVENSSVRJQ0FMX1JFU09VUkNFICovCiAgICAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgICAgKiBDQVVUSU9OISBpZiBhbm90aGVyIHRocmVhZCBjbG9zZWQgdGhlIHNvY2tldChzKQogICAgICAgICAgICAgICAgICAgICAqIHdhaXRlZCBvbiBoZXJlLCB0aGUgc2Vzc2lvbiBzdHJ1Y3R1cmUgd2FzIGZyZWVkLgogICAgICAgICAgICAgICAgICAgICAqIEl0IHdvdWxkIGJlIG5pY2UsIGJ1dCB3ZSBjYW4ndCByZWx5IG9uIHRoZSBwb2ludGVyLgogICAgICAgICAgICAgICAgICAgICAqIHNzLT5zX3NubXBfZXJybm8gPSBTTk1QRVJSX0dFTkVSUjsKICAgICAgICAgICAgICAgICAgICAgKiBzcy0+c19lcnJubyA9IGVycm5vOwogICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgIHNubXBfc2V0X2RldGFpbChzdHJlcnJvcihlcnJubykpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIEZBTExUSFJVIAogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICBzdGF0ZS0+c3RhdHVzID0gU1RBVF9FUlJPUjsKICAgICAgICAgICAgICAgIHN0YXRlLT53YWl0aW5nID0gMDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCBzcy0+ZmxhZ3MgJiBTTk1QX0ZMQUdTX1JFU1BfQ0FMTEJBQ0sgKSB7CiAgICAgICAgICAgIHZvaWQgKCpjYikodm9pZCk7CiAgICAgICAgICAgIGNiID0gc3MtPm15dm9pZDsKICAgICAgICAgICAgY2IoKTsgICAgICAgIC8qIFVzZWQgdG8gaW52b2tlICduZXRzbm1wX2NoZWNrX291dHN0YW5kaW5nX2FnZW50X3JlcXVlc3RzKCk7JwogICAgICAgICAgICAgICAgICAgICAgICAgICAgb24gaW50ZXJuYWwgQWdlbnRYIHF1ZXJpZXMuICAqLwogICAgICAgIH0KICAgIH0KICAgICpyZXNwb25zZSA9IHN0YXRlLT5wZHU7CiAgICBzcy0+Y2FsbGJhY2sgPSBjYnNhdjsKICAgIHNzLT5jYWxsYmFja19tYWdpYyA9IGNibWFnc2F2OwogICAgcmV0dXJuIHN0YXRlLT5zdGF0dXM7Cn0KCmludApzbm1wX3N5bmNoX3Jlc3BvbnNlKG5ldHNubXBfc2Vzc2lvbiAqIHNzLAogICAgICAgICAgICAgICAgICAgIG5ldHNubXBfcGR1ICpwZHUsIG5ldHNubXBfcGR1ICoqcmVzcG9uc2UpCnsKICAgIHJldHVybiBzbm1wX3N5bmNoX3Jlc3BvbnNlX2NiKHNzLCBwZHUsIHJlc3BvbnNlLCBzbm1wX3N5bmNoX2lucHV0KTsKfQoKaW50CnNubXBfc2Vzc19zeW5jaF9yZXNwb25zZSh2b2lkICpzZXNzcCwKICAgICAgICAgICAgICAgICAgICAgICAgIG5ldHNubXBfcGR1ICpwZHUsIG5ldHNubXBfcGR1ICoqcmVzcG9uc2UpCnsKICAgIG5ldHNubXBfc2Vzc2lvbiAqc3M7CiAgICBzdHJ1Y3Qgc3luY2hfc3RhdGUgbHN0YXRlLCAqc3RhdGU7CiAgICBzbm1wX2NhbGxiYWNrICAgY2JzYXY7CiAgICB2b2lkICAgICAgICAgICAqY2JtYWdzYXY7CiAgICBpbnQgICAgICAgICAgICAgbnVtZmRzLCBjb3VudDsKICAgIGZkX3NldCAgICAgICAgICBmZHNldDsKICAgIHN0cnVjdCB0aW1ldmFsICB0aW1lb3V0LCAqdHZwOwogICAgaW50ICAgICAgICAgICAgIGJsb2NrOwoKICAgIHNzID0gc25tcF9zZXNzX3Nlc3Npb24oc2Vzc3ApOwogICAgaWYgKHNzID09IE5VTEwpIHsKICAgICAgICByZXR1cm4gU1RBVF9FUlJPUjsKICAgIH0KCiAgICBtZW1zZXQoKHZvaWQgKikgJmxzdGF0ZSwgMCwgc2l6ZW9mKGxzdGF0ZSkpOwogICAgc3RhdGUgPSAmbHN0YXRlOwogICAgY2JzYXYgPSBzcy0+Y2FsbGJhY2s7CiAgICBjYm1hZ3NhdiA9IHNzLT5jYWxsYmFja19tYWdpYzsKICAgIHNzLT5jYWxsYmFjayA9IHNubXBfc3luY2hfaW5wdXQ7CiAgICBzcy0+Y2FsbGJhY2tfbWFnaWMgPSAodm9pZCAqKSBzdGF0ZTsKCiAgICBpZiAoKHN0YXRlLT5yZXFpZCA9IHNubXBfc2Vzc19zZW5kKHNlc3NwLCBwZHUpKSA9PSAwKSB7CiAgICAgICAgc25tcF9mcmVlX3BkdShwZHUpOwogICAgICAgIHN0YXRlLT5zdGF0dXMgPSBTVEFUX0VSUk9SOwogICAgfSBlbHNlCiAgICAgICAgc3RhdGUtPndhaXRpbmcgPSAxOwoKICAgIHdoaWxlIChzdGF0ZS0+d2FpdGluZykgewogICAgICAgIG51bWZkcyA9IDA7CiAgICAgICAgRkRfWkVSTygmZmRzZXQpOwogICAgICAgIGJsb2NrID0gTkVUU05NUF9TTk1QQkxPQ0s7CiAgICAgICAgdHZwID0gJnRpbWVvdXQ7CiAgICAgICAgdGltZXJjbGVhcih0dnApOwogICAgICAgIHNubXBfc2Vzc19zZWxlY3RfaW5mbyhzZXNzcCwgJm51bWZkcywgJmZkc2V0LCB0dnAsICZibG9jayk7CiAgICAgICAgaWYgKGJsb2NrID09IDEpCiAgICAgICAgICAgIHR2cCA9IE5VTEw7ICAgICAgICAgLyogYmxvY2sgd2l0aG91dCB0aW1lb3V0ICovCiAgICAgICAgY291bnQgPSBzZWxlY3QobnVtZmRzLCAmZmRzZXQsIDAsIDAsIHR2cCk7CiAgICAgICAgaWYgKGNvdW50ID4gMCkgewogICAgICAgICAgICBzbm1wX3Nlc3NfcmVhZChzZXNzcCwgJmZkc2V0KTsKICAgICAgICB9IGVsc2UKICAgICAgICAgICAgc3dpdGNoIChjb3VudCkgewogICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICBzbm1wX3Nlc3NfdGltZW91dChzZXNzcCk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAtMToKICAgICAgICAgICAgICAgIGlmIChlcnJubyA9PSBFSU5UUikgewogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBzbm1wX2Vycm5vID0gU05NUEVSUl9HRU5FUlI7ICAgIC8qTVRDUklUSUNBTF9SRVNPVVJDRSAqLwogICAgICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICAgICogQ0FVVElPTiEgaWYgYW5vdGhlciB0aHJlYWQgY2xvc2VkIHRoZSBzb2NrZXQocykKICAgICAgICAgICAgICAgICAgICAgKiB3YWl0ZWQgb24gaGVyZSwgdGhlIHNlc3Npb24gc3RydWN0dXJlIHdhcyBmcmVlZC4KICAgICAgICAgICAgICAgICAgICAgKiBJdCB3b3VsZCBiZSBuaWNlLCBidXQgd2UgY2FuJ3QgcmVseSBvbiB0aGUgcG9pbnRlci4KICAgICAgICAgICAgICAgICAgICAgKiBzcy0+c19zbm1wX2Vycm5vID0gU05NUEVSUl9HRU5FUlI7CiAgICAgICAgICAgICAgICAgICAgICogc3MtPnNfZXJybm8gPSBlcnJubzsKICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICBzbm1wX3NldF9kZXRhaWwoc3RyZXJyb3IoZXJybm8pKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiBGQUxMVEhSVSAKICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgc3RhdGUtPnN0YXR1cyA9IFNUQVRfRVJST1I7CiAgICAgICAgICAgICAgICBzdGF0ZS0+d2FpdGluZyA9IDA7CiAgICAgICAgICAgIH0KICAgIH0KICAgICpyZXNwb25zZSA9IHN0YXRlLT5wZHU7CiAgICBzcy0+Y2FsbGJhY2sgPSBjYnNhdjsKICAgIHNzLT5jYWxsYmFja19tYWdpYyA9IGNibWFnc2F2OwogICAgcmV0dXJuIHN0YXRlLT5zdGF0dXM7Cn0KCgpjb25zdCBjaGFyICAgICAqCnNubXBfZXJyc3RyaW5nKGludCBlcnJzdGF0KQp7CiAgICBjb25zdCBjaGFyICogY29uc3QgZXJyb3Jfc3RyaW5nWzE5XSA9IHsKICAgICAgICAiKG5vRXJyb3IpIE5vIEVycm9yIiwKICAgICAgICAiKHRvb0JpZykgUmVzcG9uc2UgbWVzc2FnZSB3b3VsZCBoYXZlIGJlZW4gdG9vIGxhcmdlLiIsCiAgICAgICAgIihub1N1Y2hOYW1lKSBUaGVyZSBpcyBubyBzdWNoIHZhcmlhYmxlIG5hbWUgaW4gdGhpcyBNSUIuIiwKICAgICAgICAiKGJhZFZhbHVlKSBUaGUgdmFsdWUgZ2l2ZW4gaGFzIHRoZSB3cm9uZyB0eXBlIG9yIGxlbmd0aC4iLAogICAgICAgICIocmVhZE9ubHkpIFRoZSB0d28gcGFydGllcyB1c2VkIGRvIG5vdCBoYXZlIGFjY2VzcyB0byB1c2UgdGhlIHNwZWNpZmllZCBTTk1QIFBEVS4iLAogICAgICAgICIoZ2VuRXJyb3IpIEEgZ2VuZXJhbCBmYWlsdXJlIG9jY3VyZWQiLAogICAgICAgICJub0FjY2VzcyIsCiAgICAgICAgIndyb25nVHlwZSAoVGhlIHNldCBkYXRhdHlwZSBkb2VzIG5vdCBtYXRjaCB0aGUgZGF0YSB0eXBlIHRoZSBhZ2VudCBleHBlY3RzKSIsCiAgICAgICAgIndyb25nTGVuZ3RoIChUaGUgc2V0IHZhbHVlIGhhcyBhbiBpbGxlZ2FsIGxlbmd0aCBmcm9tIHdoYXQgdGhlIGFnZW50IGV4cGVjdHMpIiwKICAgICAgICAid3JvbmdFbmNvZGluZyIsCiAgICAgICAgIndyb25nVmFsdWUgKFRoZSBzZXQgdmFsdWUgaXMgaWxsZWdhbCBvciB1bnN1cHBvcnRlZCBpbiBzb21lIHdheSkiLAogICAgICAgICJub0NyZWF0aW9uIChUaGF0IHRhYmxlIGRvZXMgbm90IHN1cHBvcnQgcm93IGNyZWF0aW9uIG9yIHRoYXQgb2JqZWN0IGNhbiBub3QgZXZlciBiZSBjcmVhdGVkKSIsCiAgICAgICAgImluY29uc2lzdGVudFZhbHVlIChUaGUgc2V0IHZhbHVlIGlzIGlsbGVnYWwgb3IgdW5zdXBwb3J0ZWQgaW4gc29tZSB3YXkpIiwKICAgICAgICAicmVzb3VyY2VVbmF2YWlsYWJsZSAoVGhpcyBpcyBsaWtlbHkgYSBvdXQtb2YtbWVtb3J5IGZhaWx1cmUgd2l0aGluIHRoZSBhZ2VudCkiLAogICAgICAgICJjb21taXRGYWlsZWQiLAogICAgICAgICJ1bmRvRmFpbGVkIiwKICAgICAgICAiYXV0aG9yaXphdGlvbkVycm9yIChhY2Nlc3MgZGVuaWVkIHRvIHRoYXQgb2JqZWN0KSIsCiAgICAgICAgIm5vdFdyaXRhYmxlIChUaGF0IG9iamVjdCBkb2VzIG5vdCBzdXBwb3J0IG1vZGlmaWNhdGlvbikiLAogICAgICAgICJpbmNvbnNpc3RlbnROYW1lIChUaGF0IG9iamVjdCBjYW4gbm90IGN1cnJlbnRseSBiZSBjcmVhdGVkKSIKICAgIH07CgogICAgaWYgKGVycnN0YXQgPD0gTUFYX1NOTVBfRVJSICYmIGVycnN0YXQgPj0gU05NUF9FUlJfTk9FUlJPUikgewogICAgICAgIHJldHVybiBlcnJvcl9zdHJpbmdbZXJyc3RhdF07CiAgICB9IGVsc2UgewogICAgICAgIHJldHVybiAiVW5rbm93biBFcnJvciI7CiAgICB9Cn0KCgoKLyoKICoKICogIENvbnZlbmllbmNlIHJvdXRpbmVzIHRvIG1ha2UgdmFyaW91cyByZXF1ZXN0cwogKiAgb3ZlciB0aGUgc3BlY2lmaWVkIFNOTVAgc2Vzc2lvbi4KICoKICovCnN0YXRpYyBuZXRzbm1wX3Nlc3Npb24gKl9kZWZfcXVlcnlfc2Vzc2lvbiA9IE5VTEw7CnZvaWQKbmV0c25tcF9xdWVyeV9zZXRfZGVmYXVsdF9zZXNzaW9uKCBuZXRzbm1wX3Nlc3Npb24gKnNlc3MpIHsKICAgIF9kZWZfcXVlcnlfc2Vzc2lvbiA9IHNlc3M7Cn0KCm5ldHNubXBfc2Vzc2lvbiAqCm5ldHNubXBfcXVlcnlfZ2V0X2RlZmF1bHRfc2Vzc2lvbiggdm9pZCApIHsKICAgIHJldHVybiBfZGVmX3F1ZXJ5X3Nlc3Npb247Cn0KCgovKgogKiBJbnRlcm5hbCB1dGlsaXR5IHJvdXRpbmUgdG8gYWN0dWFsbHkgc2VuZCB0aGUgcXVlcnkKICovCnN0YXRpYyBpbnQgX3F1ZXJ5KG5ldHNubXBfdmFyaWFibGVfbGlzdCAqbGlzdCwKICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LAogICAgICAgICAgICAgICAgICBuZXRzbm1wX3Nlc3Npb24gICAgICAgKnNlc3Npb24pIHsKCiAgICBuZXRzbm1wX3BkdSAqcGR1ICAgICAgPSBzbm1wX3BkdV9jcmVhdGUoIHJlcXVlc3QgKTsKICAgIG5ldHNubXBfcGR1ICpyZXNwb25zZSA9IE5VTEw7CiAgICBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKnZiMSwgKnZiMiwgKnZ0bXA7CiAgICBpbnQgcmV0OwoKICAgIC8qCiAgICAgKiBDbG9uZSB0aGUgdmFyYmluZCBsaXN0IGludG8gdGhlIHJlcXVlc3QgUERVLi4uCiAgICAgKi8KICAgIHBkdS0+dmFyaWFibGVzID0gc25tcF9jbG9uZV92YXJiaW5kKCBsaXN0ICk7CnJldHJ5OgogICAgaWYgKCBzZXNzaW9uICkKICAgICAgICByZXQgPSBzbm1wX3N5bmNoX3Jlc3BvbnNlKCAgICAgICAgICAgIHNlc3Npb24sIHBkdSwgJnJlc3BvbnNlICk7CiAgICBlbHNlIGlmIChfZGVmX3F1ZXJ5X3Nlc3Npb24pCiAgICAgICAgcmV0ID0gc25tcF9zeW5jaF9yZXNwb25zZSggX2RlZl9xdWVyeV9zZXNzaW9uLCBwZHUsICZyZXNwb25zZSApOwogICAgZWxzZSB7CiAgICAgICAgLyogTm8gc2Vzc2lvbiBzcGVjaWZpZWQgKi8KICAgICAgICBzbm1wX2ZyZWVfcGR1KHBkdSk7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX0dFTkVSUjsKICAgIH0KCiAgICAvKgogICAgICogLi4uLnRoZW4gY29weSB0aGUgcmVzdWx0cyBiYWNrIGludG8gdGhlCiAgICAgKiBsaXN0IChhc3N1bWluZyB0aGUgcmVxdWVzdCBzdWNjZWVkZWQhKS4KICAgICAqIFRoaXMgYXZvaWRzIGhhdmluZyB0byB3b3JyeSBhYm91dCBob3cgdGhpcwogICAgICogbGlzdCB3YXMgb3JpZ2luYWxseSBhbGxvY2F0ZWQuCiAgICAgKi8KICAgIGlmICggcmV0ID09IFNOTVBfRVJSX05PRVJST1IgKSB7CiAgICAgICAgaWYgKCByZXNwb25zZS0+ZXJyc3RhdCAhPSBTTk1QX0VSUl9OT0VSUk9SICkgewogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBJZiB0aGUgcmVxdWVzdCBmYWlsZWQsIHRoZW4gcmVtb3ZlIHRoZQogICAgICAgICAgICAgKiAgb2ZmZW5kaW5nIHZhcmJpbmQgYW5kIHRyeSBhZ2Fpbi4KICAgICAgICAgICAgICogIChhbGwgZXhjZXB0IFNFVCByZXF1ZXN0cykKICAgICAgICAgICAgICoKICAgICAgICAgICAgICogWFhYIC0gaW1wbGVtZW50IGEgbGlicmFyeSB2ZXJzaW9uIG9mCiAgICAgICAgICAgICAqICAgICAgIE5FVFNOTVBfRFNfQVBQX0RPTlRfRklYX1BEVVMgPz8KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHJldCA9IHJlc3BvbnNlLT5lcnJzdGF0OwogICAgICAgICAgICBpZiAocmVxdWVzdCAhPSBTTk1QX01TR19TRVQgJiYKICAgICAgICAgICAgICAgIHJlc3BvbnNlLT5lcnJpbmRleCAhPSAwKSB7CiAgICAgICAgICAgICAgICBwZHUgPSBzbm1wX2ZpeF9wZHUoIHJlc3BvbnNlLCByZXF1ZXN0ICk7CiAgICAgICAgICAgICAgICBzbm1wX2ZyZWVfcGR1KCByZXNwb25zZSApOwogICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBOVUxMOwogICAgICAgICAgICAgICAgaWYgKCBwZHUgIT0gTlVMTCApCiAgICAgICAgICAgICAgICAgICAgZ290byByZXRyeTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGZvciAodmIxID0gcmVzcG9uc2UtPnZhcmlhYmxlcywgdmIyID0gbGlzdDsKICAgICAgICAgICAgICAgICB2YjE7CiAgICAgICAgICAgICAgICAgdmIxID0gdmIxLT5uZXh0X3ZhcmlhYmxlLCAgdmIyID0gdmIyLT5uZXh0X3ZhcmlhYmxlKSB7CiAgICAgICAgICAgICAgICBpZiAoICF2YjIgKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0ID0gU05NUF9FUlJfR0VORVJSOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdnRtcCA9IHZiMi0+bmV4dF92YXJpYWJsZTsKICAgICAgICAgICAgICAgIC8qIGZyZWUgb2xkIGRhdGEgYmVmb3JlIG92ZXJ3cml0aW5nICovCiAgICAgICAgICAgICAgICBpZiAodmIyLT52YWwuc3RyaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHZiMi0+dmFsLnN0cmluZyAhPSAmdmIyLT5idWZbMF0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgZnJlZSh2YjItPnZhbC5zdHJpbmcpOwogICAgICAgICAgICAgICAgICAgICAgICB2YjItPnZhbC5zdHJpbmcgPSBOVUxMOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHNubXBfY2xvbmVfdmFyKCB2YjEsIHZiMiApOwogICAgICAgICAgICAgICAgdmIyLT5uZXh0X3ZhcmlhYmxlID0gdnRtcDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgLyogRGlzdGluZ3Vpc2ggc25tcF9zZW5kIGVycm9ycyBmcm9tIFNOTVAgZXJyU3RhdCBlcnJvcnMgKi8KICAgICAgICByZXQgPSAtcmV0OwogICAgfQogICAgc25tcF9mcmVlX3BkdSggcmVzcG9uc2UgKTsKICAgIHJldHVybiByZXQ7Cn0KCi8qCiAqIFRoZXNlIGFyZSBzaW1wbGUgd3JhcHBlcnMgcm91bmQgdGhlIGludGVybmFsIHV0aWxpdHkgcm91dGluZQogKi8KaW50IG5ldHNubXBfcXVlcnlfZ2V0KG5ldHNubXBfdmFyaWFibGVfbGlzdCAqbGlzdCwKICAgICAgICAgICAgICAgICAgICAgIG5ldHNubXBfc2Vzc2lvbiAgICAgICAqc2Vzc2lvbil7CiAgICByZXR1cm4gX3F1ZXJ5KCBsaXN0LCBTTk1QX01TR19HRVQsIHNlc3Npb24gKTsKfQoKCmludCBuZXRzbm1wX3F1ZXJ5X2dldG5leHQobmV0c25tcF92YXJpYWJsZV9saXN0ICpsaXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgIG5ldHNubXBfc2Vzc2lvbiAgICAgICAqc2Vzc2lvbil7CiAgICByZXR1cm4gX3F1ZXJ5KCBsaXN0LCBTTk1QX01TR19HRVRORVhULCBzZXNzaW9uICk7Cn0KCgppbnQgbmV0c25tcF9xdWVyeV9zZXQobmV0c25tcF92YXJpYWJsZV9saXN0ICpsaXN0LAogICAgICAgICAgICAgICAgICAgICAgbmV0c25tcF9zZXNzaW9uICAgICAgICpzZXNzaW9uKXsKICAgIHJldHVybiBfcXVlcnkoIGxpc3QsIFNOTVBfTVNHX1NFVCwgc2Vzc2lvbiApOwp9CgovKgogKiBBIHdhbGsgbmVlZHMgYSBiaXQgbW9yZSB3b3JrLgogKi8KaW50IG5ldHNubXBfcXVlcnlfd2FsayhuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKmxpc3QsCiAgICAgICAgICAgICAgICAgICAgICAgbmV0c25tcF9zZXNzaW9uICAgICAgICpzZXNzaW9uKSB7CiAgICAvKgogICAgICogQ3JlYXRlIGEgd29ya2luZyBjb3B5IG9mIHRoZSBvcmlnaW5hbCAoc2luZ2xlKQogICAgICogdmFyYmluZCwgc28gd2UgY2FuIHVzZSB0aGlzIHZhcmJpbmQgcGFyYW1ldGVyCiAgICAgKiB0byBjaGVjayB3aGVuIHdlJ3ZlIGZpbmlzaGVkIHdhbGtpbmcgdGhpcyBzdWJ0cmVlLgogICAgICovCiAgICBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKnZiID0gc25tcF9jbG9uZV92YXJiaW5kKCBsaXN0ICk7CiAgICBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKnJlc19saXN0ID0gTlVMTDsKICAgIG5ldHNubXBfdmFyaWFibGVfbGlzdCAqcmVzX2xhc3QgPSBOVUxMOwogICAgaW50IHJldDsKCiAgICAvKgogICAgICogTm93IHdhbGsgdGhlIHRyZWUgYXMgdXN1YWwKICAgICAqLwogICAgcmV0ID0gX3F1ZXJ5KCB2YiwgU05NUF9NU0dfR0VUTkVYVCwgc2Vzc2lvbiApOwogICAgd2hpbGUgKCByZXQgPT0gU05NUF9FUlJfTk9FUlJPUiAmJgogICAgICAgIHNubXBfb2lkdHJlZV9jb21wYXJlKCBsaXN0LT5uYW1lLCBsaXN0LT5uYW1lX2xlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2Yi0+bmFtZSwgICB2Yi0+bmFtZV9sZW5ndGggKSA9PSAwKSB7CgoJaWYgKHZiLT50eXBlID09IFNOTVBfRU5ET0ZNSUJWSUVXIHx8CgkgICAgdmItPnR5cGUgPT0gU05NUF9OT1NVQ0hPQkpFQ1QgfHwKCSAgICB2Yi0+dHlwZSA9PSBTTk1QX05PU1VDSElOU1RBTkNFKQoJICAgIGJyZWFrOwoKICAgICAgICAvKgogICAgICAgICAqIENvcHkgZWFjaCByZXNwb25zZSB2YXJiaW5kIHRvIHRoZSBlbmQgb2YgdGhlIHJlc3VsdCBsaXN0CiAgICAgICAgICogYW5kIHRoZW4gcmUtdXNlIHRoaXMgdG8gYXNrIGZvciB0aGUgbmV4dCBlbnRyeS4KICAgICAgICAgKi8KICAgICAgICBpZiAoIHJlc19sYXN0ICkgewogICAgICAgICAgICByZXNfbGFzdC0+bmV4dF92YXJpYWJsZSA9IHNubXBfY2xvbmVfdmFyYmluZCggdmIgKTsKICAgICAgICAgICAgcmVzX2xhc3QgPSByZXNfbGFzdC0+bmV4dF92YXJpYWJsZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXNfbGlzdCA9IHNubXBfY2xvbmVfdmFyYmluZCggdmIgKTsKICAgICAgICAgICAgcmVzX2xhc3QgPSByZXNfbGlzdDsKICAgICAgICB9CiAgICAgICAgcmV0ID0gX3F1ZXJ5KCB2YiwgU05NUF9NU0dfR0VUTkVYVCwgc2Vzc2lvbiApOwogICAgfQogICAgLyoKICAgICAqIENvcHkgdGhlIGZpcnN0IHJlc3VsdCBiYWNrIGludG8gdGhlIG9yaWdpbmFsIHZhcmJpbmQgcGFyYW1ldGVyLAogICAgICogYWRkIHRoZSByZXN0IG9mIHRoZSByZXN1bHRzIChpZiBhbnkpLCBhbmQgY2xlYW4gdXAuCiAgICAgKi8KICAgIGlmICggcmVzX2xpc3QgKSB7CiAgICAgICAgc25tcF9jbG9uZV92YXIoIHJlc19saXN0LCBsaXN0ICk7CiAgICAgICAgbGlzdC0+bmV4dF92YXJpYWJsZSA9IHJlc19saXN0LT5uZXh0X3ZhcmlhYmxlOwogICAgICAgIHJlc19saXN0LT5uZXh0X3ZhcmlhYmxlID0gTlVMTDsKICAgICAgICBzbm1wX2ZyZWVfdmFyYmluZCggcmVzX2xpc3QgKTsKICAgIH0KICAgIHNubXBfZnJlZV92YXJiaW5kKCB2YiApOwogICAgcmV0dXJuIHJldDsKfQovKiogQH0gKi8K