LyoKICogT0xFMzIgY2FsbG91dHMsIENPTSBpbnRlcmZhY2UgbWFyc2hhbGxpbmcKICoKICogQ29weXJpZ2h0IDIwMDEgT3ZlIEvldmVuLCBUcmFuc0dhbWluZyBUZWNobm9sb2dpZXMKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBCiAqCiAqIFRPRE86CiAqICAtIGZpeCB0aGUgd2lyZS1wcm90b2NvbCB0byBtYXRjaCBNUy9SUEMKICogIC0gZmluaXNoIFJwY1N0cmVhbV9WdGJsCiAqLwoKI2luY2x1ZGUgPHN0ZGFyZy5oPgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0cmluZy5oPgoKI2RlZmluZSBDT0JKTUFDUk9TCiNkZWZpbmUgTk9OQU1FTEVTU1VOSU9OCiNkZWZpbmUgTk9OQU1FTEVTU1NUUlVDVAoKI2luY2x1ZGUgIndpbmRlZi5oIgojaW5jbHVkZSAid2luYmFzZS5oIgojaW5jbHVkZSAid2luZXJyb3IuaCIKCiNpbmNsdWRlICJvYmpiYXNlLmgiCgojaW5jbHVkZSAibmRyX21pc2MuaCIKI2luY2x1ZGUgInJwY25kci5oIgojaW5jbHVkZSAicnBjcHJveHkuaCIKI2luY2x1ZGUgIndpbmUvcnBjZmMuaCIKI2luY2x1ZGUgImNwc2YuaCIKCiNpbmNsdWRlICJ3aW5lL2RlYnVnLmgiCgpXSU5FX0RFRkFVTFRfREVCVUdfQ0hBTk5FTChvbGUpOwoKc3RhdGljIEhNT0RVTEUgaE9MRTsKCnN0YXRpYyBIUkVTVUxUIChXSU5BUEkgKkNPTV9HZXRNYXJzaGFsU2l6ZU1heCkoVUxPTkcgKixSRUZJSUQsTFBVTktOT1dOLERXT1JELExQVk9JRCxEV09SRCk7CnN0YXRpYyBIUkVTVUxUIChXSU5BUEkgKkNPTV9NYXJzaGFsSW50ZXJmYWNlKShMUFNUUkVBTSxSRUZJSUQsTFBVTktOT1dOLERXT1JELExQVk9JRCxEV09SRCk7CnN0YXRpYyBIUkVTVUxUIChXSU5BUEkgKkNPTV9Vbm1hcnNoYWxJbnRlcmZhY2UpKExQU1RSRUFNLFJFRklJRCxMUFZPSUQqKTsKc3RhdGljIEhSRVNVTFQgKFdJTkFQSSAqQ09NX1JlbGVhc2VNYXJzaGFsRGF0YSkoTFBTVFJFQU0pOwpzdGF0aWMgSFJFU1VMVCAoV0lOQVBJICpDT01fR2V0Q2xhc3NPYmplY3QpKFJFRkNMU0lELERXT1JELENPU0VSVkVSSU5GTyAqLFJFRklJRCxMUFZPSUQgKik7CnN0YXRpYyBIUkVTVUxUIChXSU5BUEkgKkNPTV9HZXRQU0Nsc2lkKShSRUZJSUQsQ0xTSUQgKik7CnN0YXRpYyBMUFZPSUQgKFdJTkFQSSAqQ09NX01lbUFsbG9jKShVTE9ORyk7CnN0YXRpYyB2b2lkIChXSU5BUEkgKkNPTV9NZW1GcmVlKShMUFZPSUQpOwoKc3RhdGljIEhNT0RVTEUgTG9hZENPTSh2b2lkKQp7CiAgaWYgKGhPTEUpIHJldHVybiBoT0xFOwogIGhPTEUgPSBMb2FkTGlicmFyeUEoIk9MRTMyLkRMTCIpOwogIGlmICghaE9MRSkgcmV0dXJuIDA7CiAgQ09NX0dldE1hcnNoYWxTaXplTWF4ICA9IChMUFZPSUQpR2V0UHJvY0FkZHJlc3MoaE9MRSwgIkNvR2V0TWFyc2hhbFNpemVNYXgiKTsKICBDT01fTWFyc2hhbEludGVyZmFjZSAgID0gKExQVk9JRClHZXRQcm9jQWRkcmVzcyhoT0xFLCAiQ29NYXJzaGFsSW50ZXJmYWNlIik7CiAgQ09NX1VubWFyc2hhbEludGVyZmFjZSA9IChMUFZPSUQpR2V0UHJvY0FkZHJlc3MoaE9MRSwgIkNvVW5tYXJzaGFsSW50ZXJmYWNlIik7CiAgQ09NX1JlbGVhc2VNYXJzaGFsRGF0YSA9IChMUFZPSUQpR2V0UHJvY0FkZHJlc3MoaE9MRSwgIkNvUmVsZWFzZU1hcnNoYWxEYXRhIik7CiAgQ09NX0dldENsYXNzT2JqZWN0ICAgICA9IChMUFZPSUQpR2V0UHJvY0FkZHJlc3MoaE9MRSwgIkNvR2V0Q2xhc3NPYmplY3QiKTsKICBDT01fR2V0UFNDbHNpZCAgICAgICAgID0gKExQVk9JRClHZXRQcm9jQWRkcmVzcyhoT0xFLCAiQ29HZXRQU0Nsc2lkIik7CiAgQ09NX01lbUFsbG9jID0gKExQVk9JRClHZXRQcm9jQWRkcmVzcyhoT0xFLCAiQ29UYXNrTWVtQWxsb2MiKTsKICBDT01fTWVtRnJlZSAgPSAoTFBWT0lEKUdldFByb2NBZGRyZXNzKGhPTEUsICJDb1Rhc2tNZW1GcmVlIik7CiAgcmV0dXJuIGhPTEU7Cn0KCi8qIENvTWFyc2hhbEludGVyZmFjZS9Db1VubWFyc2hhbEludGVyZmFjZSB3b3JrcyBvbiBzdHJlYW1zLAogKiBzbyBpbXBsZW1lbnQgYSBzaW1wbGUgc3RyZWFtIG9uIHRvcCBvZiB0aGUgUlBDIGJ1ZmZlcgogKiAod2hpY2ggYWxzbyBpbXBsZW1lbnRzIHRoZSBNSW50ZXJmYWNlUG9pbnRlciBzdHJ1Y3R1cmUpICovCnR5cGVkZWYgc3RydWN0IFJwY1N0cmVhbUltcGwKewogIGNvbnN0IElTdHJlYW1WdGJsICpscFZ0Ymw7CiAgRFdPUkQgUmVmQ291bnQ7CiAgUE1JRExfU1RVQl9NRVNTQUdFIHBNc2c7CiAgTFBEV09SRCBzaXplOwogIGNoYXIgKmRhdGE7CiAgRFdPUkQgcG9zOwp9IFJwY1N0cmVhbUltcGw7CgpzdGF0aWMgSFJFU1VMVCBXSU5BUEkgUnBjU3RyZWFtX1F1ZXJ5SW50ZXJmYWNlKExQU1RSRUFNIGlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVGSUlEIHJpaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFZPSUQgKm9iaikKewogIFJwY1N0cmVhbUltcGwgKlRoaXMgPSAoUnBjU3RyZWFtSW1wbCAqKWlmYWNlOwogIGlmIChJc0VxdWFsR1VJRCgmSUlEX0lVbmtub3duLCByaWlkKSB8fAogICAgICBJc0VxdWFsR1VJRCgmSUlEX0lTZXF1ZW50aWFsU3RyZWFtLCByaWlkKSB8fAogICAgICBJc0VxdWFsR1VJRCgmSUlEX0lTdHJlYW0sIHJpaWQpKSB7CiAgICAqb2JqID0gVGhpczsKICAgIFRoaXMtPlJlZkNvdW50Kys7CiAgICByZXR1cm4gU19PSzsKICB9CiAgcmV0dXJuIEVfTk9JTlRFUkZBQ0U7Cn0KCnN0YXRpYyBVTE9ORyBXSU5BUEkgUnBjU3RyZWFtX0FkZFJlZihMUFNUUkVBTSBpZmFjZSkKewogIFJwY1N0cmVhbUltcGwgKlRoaXMgPSAoUnBjU3RyZWFtSW1wbCAqKWlmYWNlOwogIHJldHVybiArKyhUaGlzLT5SZWZDb3VudCk7Cn0KCnN0YXRpYyBVTE9ORyBXSU5BUEkgUnBjU3RyZWFtX1JlbGVhc2UoTFBTVFJFQU0gaWZhY2UpCnsKICBScGNTdHJlYW1JbXBsICpUaGlzID0gKFJwY1N0cmVhbUltcGwgKilpZmFjZTsKICBpZiAoIS0tKFRoaXMtPlJlZkNvdW50KSkgewogICAgVFJBQ0UoInNpemU9JWRcbiIsICpUaGlzLT5zaXplKTsKICAgIFRoaXMtPnBNc2ctPkJ1ZmZlciA9ICh1bnNpZ25lZCBjaGFyKilUaGlzLT5kYXRhICsgKlRoaXMtPnNpemU7CiAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsVGhpcyk7CiAgICByZXR1cm4gMDsKICB9CiAgcmV0dXJuIFRoaXMtPlJlZkNvdW50Owp9CgpzdGF0aWMgSFJFU1VMVCBXSU5BUEkgUnBjU3RyZWFtX1JlYWQoTFBTVFJFQU0gaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnB2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTE9ORyBjYiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUxPTkcgKnBjYlJlYWQpCnsKICBScGNTdHJlYW1JbXBsICpUaGlzID0gKFJwY1N0cmVhbUltcGwgKilpZmFjZTsKICBIUkVTVUxUIGhyID0gU19PSzsKICBpZiAoVGhpcy0+cG9zICsgY2IgPiAqVGhpcy0+c2l6ZSkKICB7CiAgICBjYiA9ICpUaGlzLT5zaXplIC0gVGhpcy0+cG9zOwogICAgaHIgPSBTX0ZBTFNFOwogIH0KICBpZiAoY2IpIHsKICAgIG1lbWNweShwdiwgVGhpcy0+ZGF0YSArIFRoaXMtPnBvcywgY2IpOwogICAgVGhpcy0+cG9zICs9IGNiOwogIH0KICBpZiAocGNiUmVhZCkgKnBjYlJlYWQgPSBjYjsKICByZXR1cm4gaHI7Cn0KCnN0YXRpYyBIUkVTVUxUIFdJTkFQSSBScGNTdHJlYW1fV3JpdGUoTFBTVFJFQU0gaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpwdiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVMT05HIGNiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUxPTkcgKnBjYldyaXR0ZW4pCnsKICBScGNTdHJlYW1JbXBsICpUaGlzID0gKFJwY1N0cmVhbUltcGwgKilpZmFjZTsKICBpZiAoVGhpcy0+ZGF0YSArIGNiID4gKGNoYXIgKilUaGlzLT5wTXNnLT5CdWZmZXJFbmQpCiAgICByZXR1cm4gU1RHX0VfTUVESVVNRlVMTDsKICBtZW1jcHkoVGhpcy0+ZGF0YSArIFRoaXMtPnBvcywgcHYsIGNiKTsKICBUaGlzLT5wb3MgKz0gY2I7CiAgaWYgKFRoaXMtPnBvcyA+ICpUaGlzLT5zaXplKSAqVGhpcy0+c2l6ZSA9IFRoaXMtPnBvczsKICBpZiAocGNiV3JpdHRlbikgKnBjYldyaXR0ZW4gPSBjYjsKICByZXR1cm4gU19PSzsKfQoKc3RhdGljIEhSRVNVTFQgV0lOQVBJIFJwY1N0cmVhbV9TZWVrKExQU1RSRUFNIGlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMQVJHRV9JTlRFR0VSIG1vdmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIG9yaWdpbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUxBUkdFX0lOVEVHRVIgKm5ld1BvcykKewogIFJwY1N0cmVhbUltcGwgKlRoaXMgPSAoUnBjU3RyZWFtSW1wbCAqKWlmYWNlOwogIHN3aXRjaCAob3JpZ2luKSB7CiAgY2FzZSBTVFJFQU1fU0VFS19TRVQ6CiAgICBUaGlzLT5wb3MgPSBtb3ZlLnUuTG93UGFydDsKICAgIGJyZWFrOwogIGNhc2UgU1RSRUFNX1NFRUtfQ1VSOgogICAgVGhpcy0+cG9zID0gVGhpcy0+cG9zICsgbW92ZS51Lkxvd1BhcnQ7CiAgICBicmVhazsKICBjYXNlIFNUUkVBTV9TRUVLX0VORDoKICAgIFRoaXMtPnBvcyA9ICpUaGlzLT5zaXplICsgbW92ZS51Lkxvd1BhcnQ7CiAgICBicmVhazsKICBkZWZhdWx0OgogICAgcmV0dXJuIFNUR19FX0lOVkFMSURGVU5DVElPTjsKICB9CiAgaWYgKG5ld1BvcykgewogICAgbmV3UG9zLT51Lkxvd1BhcnQgPSBUaGlzLT5wb3M7CiAgICBuZXdQb3MtPnUuSGlnaFBhcnQgPSAwOwogIH0KICByZXR1cm4gU19PSzsKfQoKc3RhdGljIEhSRVNVTFQgV0lOQVBJIFJwY1N0cmVhbV9TZXRTaXplKExQU1RSRUFNIGlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTEFSR0VfSU5URUdFUiBuZXdTaXplKQp7CiAgUnBjU3RyZWFtSW1wbCAqVGhpcyA9IChScGNTdHJlYW1JbXBsICopaWZhY2U7CiAgKlRoaXMtPnNpemUgPSBuZXdTaXplLnUuTG93UGFydDsKICByZXR1cm4gU19PSzsKfQoKc3RhdGljIGNvbnN0IElTdHJlYW1WdGJsIFJwY1N0cmVhbV9WdGJsID0KewogIFJwY1N0cmVhbV9RdWVyeUludGVyZmFjZSwKICBScGNTdHJlYW1fQWRkUmVmLAogIFJwY1N0cmVhbV9SZWxlYXNlLAogIFJwY1N0cmVhbV9SZWFkLAogIFJwY1N0cmVhbV9Xcml0ZSwKICBScGNTdHJlYW1fU2VlaywKICBScGNTdHJlYW1fU2V0U2l6ZSwKICBOVUxMLCAvKiBDb3B5VG8gKi8KICBOVUxMLCAvKiBDb21taXQgKi8KICBOVUxMLCAvKiBSZXZlcnQgKi8KICBOVUxMLCAvKiBMb2NrUmVnaW9uICovCiAgTlVMTCwgLyogVW5sb2NrUmVnaW9uICovCiAgTlVMTCwgLyogU3RhdCAqLwogIE5VTEwgIC8qIENsb25lICovCn07CgpzdGF0aWMgTFBTVFJFQU0gUnBjU3RyZWFtX0NyZWF0ZShQTUlETF9TVFVCX01FU1NBR0UgcFN0dWJNc2csIEJPT0wgaW5pdCkKewogIFJwY1N0cmVhbUltcGwgKlRoaXM7CiAgVGhpcyA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLEhFQVBfWkVST19NRU1PUlksc2l6ZW9mKFJwY1N0cmVhbUltcGwpKTsKICBpZiAoIVRoaXMpIHJldHVybiBOVUxMOwogIFRoaXMtPmxwVnRibCA9ICZScGNTdHJlYW1fVnRibDsKICBUaGlzLT5SZWZDb3VudCA9IDE7CiAgVGhpcy0+cE1zZyA9IHBTdHViTXNnOwogIFRoaXMtPnNpemUgPSAoTFBEV09SRClwU3R1Yk1zZy0+QnVmZmVyOwogIFRoaXMtPmRhdGEgPSAoY2hhciopKFRoaXMtPnNpemUgKyAxKTsKICBUaGlzLT5wb3MgPSAwOwogIGlmIChpbml0KSAqVGhpcy0+c2l6ZSA9IDA7CiAgVFJBQ0UoImluaXQgc2l6ZT0lZFxuIiwgKlRoaXMtPnNpemUpOwogIHJldHVybiAoTFBTVFJFQU0pVGhpczsKfQoKc3RhdGljIGNvbnN0IElJRCogZ2V0X2lwX2lpZChQTUlETF9TVFVCX01FU1NBR0UgcFN0dWJNc2csIHVuc2lnbmVkIGNoYXIgKnBNZW1vcnksIFBGT1JNQVRfU1RSSU5HIHBGb3JtYXQpCnsKICBjb25zdCBJSUQgKnJpaWQ7CiAgaWYgKCFwRm9ybWF0KSByZXR1cm4gJklJRF9JVW5rbm93bjsKICBUUkFDRSgiZm9ybWF0PSUwMnggJTAyeFxuIiwgcEZvcm1hdFswXSwgcEZvcm1hdFsxXSk7CiAgaWYgKHBGb3JtYXRbMF0gIT0gUlBDX0ZDX0lQKSBGSVhNRSgiZm9ybWF0PSVkXG4iLCBwRm9ybWF0WzBdKTsKICBpZiAocEZvcm1hdFsxXSA9PSBSUENfRkNfQ09OU1RBTlRfSUlEKSB7CiAgICByaWlkID0gKGNvbnN0IElJRCAqKSZwRm9ybWF0WzJdOwogIH0gZWxzZSB7CiAgICBDb21wdXRlQ29uZm9ybWFuY2UocFN0dWJNc2csIHBNZW1vcnksIHBGb3JtYXQrMiwgMCk7CiAgICByaWlkID0gKGNvbnN0IElJRCAqKXBTdHViTXNnLT5NYXhDb3VudDsKICB9CiAgaWYgKCFyaWlkKSByaWlkID0gJklJRF9JVW5rbm93bjsKICBUUkFDRSgiZ290ICVzXG4iLCBkZWJ1Z3N0cl9ndWlkKHJpaWQpKTsKICByZXR1cm4gcmlpZDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBOZHJJbnRlcmZhY2VQb2ludGVyTWFyc2hhbGwgW1JQQ1JUNC5AXQogKi8KdW5zaWduZWQgY2hhciAqIFdJTkFQSSBOZHJJbnRlcmZhY2VQb2ludGVyTWFyc2hhbGwoUE1JRExfU1RVQl9NRVNTQUdFIHBTdHViTXNnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnBNZW1vcnksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEZPUk1BVF9TVFJJTkcgcEZvcm1hdCkKewogIGNvbnN0IElJRCAqcmlpZCA9IGdldF9pcF9paWQocFN0dWJNc2csIHBNZW1vcnksIHBGb3JtYXQpOwogIExQU1RSRUFNIHN0cmVhbTsKICBIUkVTVUxUIGhyOwoKICBUUkFDRSgiKCVwLCVwLCVwKVxuIiwgcFN0dWJNc2csIHBNZW1vcnksIHBGb3JtYXQpOwogIHBTdHViTXNnLT5NYXhDb3VudCA9IDA7CiAgaWYgKCFMb2FkQ09NKCkpIHJldHVybiBOVUxMOwogIGlmIChwU3R1Yk1zZy0+QnVmZmVyICsgc2l6ZW9mKERXT1JEKSA8PSAodW5zaWduZWQgY2hhciAqKXBTdHViTXNnLT5ScGNNc2ctPkJ1ZmZlciArIHBTdHViTXNnLT5CdWZmZXJMZW5ndGgpIHsKICAgIHN0cmVhbSA9IFJwY1N0cmVhbV9DcmVhdGUocFN0dWJNc2csIFRSVUUpOwogICAgaWYgKHN0cmVhbSkgewogICAgICBpZiAocE1lbW9yeSkKICAgICAgICBociA9IENPTV9NYXJzaGFsSW50ZXJmYWNlKHN0cmVhbSwgcmlpZCwgKExQVU5LTk9XTilwTWVtb3J5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN0dWJNc2ctPmR3RGVzdENvbnRleHQsIHBTdHViTXNnLT5wdkRlc3RDb250ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVNITEZMQUdTX05PUk1BTCk7CiAgICAgIGVsc2UKICAgICAgICBociA9IFNfT0s7CgogICAgICBJU3RyZWFtX1JlbGVhc2Uoc3RyZWFtKTsKICAgICAgaWYgKEZBSUxFRChocikpCiAgICAgICAgUnBjUmFpc2VFeGNlcHRpb24oaHIpOwogICAgfQogIH0KICByZXR1cm4gTlVMTDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBOZHJJbnRlcmZhY2VQb2ludGVyVW5tYXJzaGFsbCBbUlBDUlQ0LkBdCiAqLwp1bnNpZ25lZCBjaGFyICogV0lOQVBJIE5kckludGVyZmFjZVBvaW50ZXJVbm1hcnNoYWxsKFBNSURMX1NUVUJfTUVTU0FHRSBwU3R1Yk1zZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKipwcE1lbW9yeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBGT1JNQVRfU1RSSU5HIHBGb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGZNdXN0QWxsb2MpCnsKICBMUFNUUkVBTSBzdHJlYW07CiAgSFJFU1VMVCBocjsKCiAgVFJBQ0UoIiglcCwlcCwlcCwlZClcbiIsIHBTdHViTXNnLCBwcE1lbW9yeSwgcEZvcm1hdCwgZk11c3RBbGxvYyk7CiAgaWYgKCFMb2FkQ09NKCkpIHJldHVybiBOVUxMOwogICooTFBWT0lEKilwcE1lbW9yeSA9IE5VTEw7CiAgaWYgKHBTdHViTXNnLT5CdWZmZXIgKyBzaXplb2YoRFdPUkQpIDwgKHVuc2lnbmVkIGNoYXIgKilwU3R1Yk1zZy0+UnBjTXNnLT5CdWZmZXIgKyBwU3R1Yk1zZy0+QnVmZmVyTGVuZ3RoKSB7CiAgICBzdHJlYW0gPSBScGNTdHJlYW1fQ3JlYXRlKHBTdHViTXNnLCBGQUxTRSk7CiAgICBpZiAoIXN0cmVhbSkgUnBjUmFpc2VFeGNlcHRpb24oRV9PVVRPRk1FTU9SWSk7CiAgICBpZiAoKigoUnBjU3RyZWFtSW1wbCAqKXN0cmVhbSktPnNpemUgIT0gMCkKICAgICAgaHIgPSBDT01fVW5tYXJzaGFsSW50ZXJmYWNlKHN0cmVhbSwgJklJRF9OVUxMLCAoTFBWT0lEKilwcE1lbW9yeSk7CiAgICBlbHNlCiAgICAgIGhyID0gU19PSzsKICAgIElTdHJlYW1fUmVsZWFzZShzdHJlYW0pOwogICAgaWYgKEZBSUxFRChocikpCiAgICAgICAgUnBjUmFpc2VFeGNlcHRpb24oaHIpOwogIH0KICByZXR1cm4gTlVMTDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBOZHJJbnRlcmZhY2VQb2ludGVyQnVmZmVyU2l6ZSBbUlBDUlQ0LkBdCiAqLwp2b2lkIFdJTkFQSSBOZHJJbnRlcmZhY2VQb2ludGVyQnVmZmVyU2l6ZShQTUlETF9TVFVCX01FU1NBR0UgcFN0dWJNc2csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqcE1lbW9yeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQRk9STUFUX1NUUklORyBwRm9ybWF0KQp7CiAgY29uc3QgSUlEICpyaWlkID0gZ2V0X2lwX2lpZChwU3R1Yk1zZywgcE1lbW9yeSwgcEZvcm1hdCk7CiAgVUxPTkcgc2l6ZSA9IDA7CiAgSFJFU1VMVCBocjsKCiAgVFJBQ0UoIiglcCwlcCwlcClcbiIsIHBTdHViTXNnLCBwTWVtb3J5LCBwRm9ybWF0KTsKICBpZiAoIUxvYWRDT00oKSkgcmV0dXJuOwogIGhyID0gQ09NX0dldE1hcnNoYWxTaXplTWF4KCZzaXplLCByaWlkLCAoTFBVTktOT1dOKXBNZW1vcnksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3R1Yk1zZy0+ZHdEZXN0Q29udGV4dCwgcFN0dWJNc2ctPnB2RGVzdENvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNU0hMRkxBR1NfTk9STUFMKTsKICBUUkFDRSgic2l6ZT0lZFxuIiwgc2l6ZSk7CiAgcFN0dWJNc2ctPkJ1ZmZlckxlbmd0aCArPSBzaXplb2YoRFdPUkQpICsgc2l6ZTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBOZHJJbnRlcmZhY2VQb2ludGVyTWVtb3J5U2l6ZSBbUlBDUlQ0LkBdCiAqLwpVTE9ORyBXSU5BUEkgTmRySW50ZXJmYWNlUG9pbnRlck1lbW9yeVNpemUoUE1JRExfU1RVQl9NRVNTQUdFIHBTdHViTXNnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEZPUk1BVF9TVFJJTkcgcEZvcm1hdCkKewogIFVMT05HIHNpemU7CgogIFRSQUNFKCIoJXAsJXApXG4iLCBwU3R1Yk1zZywgcEZvcm1hdCk7CgogIHNpemUgPSAqKFVMT05HICopcFN0dWJNc2ctPkJ1ZmZlcjsKICBwU3R1Yk1zZy0+QnVmZmVyICs9IDQ7CiAgcFN0dWJNc2ctPk1lbW9yeVNpemUgKz0gNDsKCiAgcFN0dWJNc2ctPkJ1ZmZlciArPSBzaXplOwoKICByZXR1cm4gcFN0dWJNc2ctPk1lbW9yeVNpemU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgTmRySW50ZXJmYWNlUG9pbnRlckZyZWUgW1JQQ1JUNC5AXQogKi8Kdm9pZCBXSU5BUEkgTmRySW50ZXJmYWNlUG9pbnRlckZyZWUoUE1JRExfU1RVQl9NRVNTQUdFIHBTdHViTXNnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnBNZW1vcnksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEZPUk1BVF9TVFJJTkcgcEZvcm1hdCkKewogIExQVU5LTk9XTiBwVW5rID0gKExQVU5LTk9XTilwTWVtb3J5OwogIFRSQUNFKCIoJXAsJXAsJXApXG4iLCBwU3R1Yk1zZywgcE1lbW9yeSwgcEZvcm1hdCk7CiAgaWYgKHBVbmspIElVbmtub3duX1JlbGVhc2UocFVuayk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgTmRyT2xlQWxsb2NhdGUgW1JQQ1JUNC5AXQogKi8Kdm9pZCAqIFdJTkFQSSBOZHJPbGVBbGxvY2F0ZShzaXplX3QgU2l6ZSkKewogIGlmICghTG9hZENPTSgpKSByZXR1cm4gTlVMTDsKICByZXR1cm4gQ09NX01lbUFsbG9jKFNpemUpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIE5kck9sZUZyZWUgW1JQQ1JUNC5AXQogKi8Kdm9pZCBXSU5BUEkgTmRyT2xlRnJlZSh2b2lkICpOb2RlVG9GcmVlKQp7CiAgaWYgKCFMb2FkQ09NKCkpIHJldHVybjsKICBDT01fTWVtRnJlZShOb2RlVG9GcmVlKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIEhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgYSBzdHViLgogKiBUaGlzIHByb2JhYmx5IGxvb2tzIHZlcnkgbXVjaCBsaWtlIE5kcnBDcmVhdGVTdHViLgogKi8KSFJFU1VMVCBjcmVhdGVfc3R1YihSRUZJSUQgaWlkLCBJVW5rbm93biAqcFVuaywgSVJwY1N0dWJCdWZmZXIgKipwcHN0dWIpCnsKICAgIENMU0lEIGNsc2lkOwogICAgSVBTRmFjdG9yeUJ1ZmZlciAqcHNmYWM7CiAgICBIUkVTVUxUIHI7CgogICAgaWYoIUxvYWRDT00oKSkgcmV0dXJuIEVfRkFJTDsKCiAgICByID0gQ09NX0dldFBTQ2xzaWQoIGlpZCwgJmNsc2lkICk7CiAgICBpZihGQUlMRUQocikpIHJldHVybiByOwoKICAgIHIgPSBDT01fR2V0Q2xhc3NPYmplY3QoICZjbHNpZCwgQ0xTQ1RYX0lOUFJPQ19TRVJWRVIsIE5VTEwsICZJSURfSVBTRmFjdG9yeUJ1ZmZlciwgKHZvaWQqKikmcHNmYWMgKTsKICAgIGlmKEZBSUxFRChyKSkgcmV0dXJuIHI7CgogICAgciA9IElQU0ZhY3RvcnlCdWZmZXJfQ3JlYXRlU3R1Yihwc2ZhYywgaWlkLCBwVW5rLCBwcHN0dWIpOwoKICAgIElQU0ZhY3RvcnlCdWZmZXJfUmVsZWFzZShwc2ZhYyk7CiAgICByZXR1cm4gcjsKfQo=