LyoKKiBDb3B5cmlnaHQgqSB7MTk5Ni0xOTk5fSwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqLwoKI2lmbmRlZiBVQlJLX0gKI2RlZmluZSBVQlJLX0gKCiNpbmNsdWRlICJ1bmljb2RlL3V0eXBlcy5oIgovKioKICogQG5hbWUgQnJlYWtJdGVyYXRvciBDIEFQSQogKgogKiBUaGUgQnJlYWtJdGVyYXRvciBDIEFQSSBkZWZpbmVzICBtZXRob2RzIGZvciBmaW5kaW5nIHRoZSBsb2NhdGlvbgogKiBvZiBib3VuZGFyaWVzIGluIHRleHQuIFBvaW50ZXIgdG8gYSBVQnJlYWtJdGVyYXRvciBtYWludGFpbiBhIAogKiBjdXJyZW50IHBvc2l0aW9uIGFuZCBzY2FuIG92ZXIgdGV4dCByZXR1cm5pbmcgdGhlIGluZGV4IG9mIGNoYXJhY3RlcnMgCiAqIHdoZXJlIGJvdW5kYXJpZXMgb2NjdXIuCiAqIDxQPgogKiBMaW5lIGJvdW5kYXJ5IGFuYWx5c2lzIGRldGVybWluZXMgd2hlcmUgYSB0ZXh0IHN0cmluZyBjYW4gYmUgYnJva2VuCiAqIHdoZW4gbGluZS13cmFwcGluZy4gVGhlIG1lY2hhbmlzbSBjb3JyZWN0bHkgaGFuZGxlcyBwdW5jdHVhdGlvbiBhbmQKICogaHlwaGVuYXRlZCB3b3Jkcy4KICogPFA+CiAqIFNlbnRlbmNlIGJvdW5kYXJ5IGFuYWx5c2lzIGFsbG93cyBzZWxlY3Rpb24gd2l0aCBjb3JyZWN0CiAqIGludGVycHJldGF0aW9uIG9mIHBlcmlvZHMgd2l0aGluIG51bWJlcnMgYW5kIGFiYnJldmlhdGlvbnMsIGFuZAogKiB0cmFpbGluZyBwdW5jdHVhdGlvbiBtYXJrcyBzdWNoIGFzIHF1b3RhdGlvbiBtYXJrcyBhbmQgcGFyZW50aGVzZXMuCiAqIDxQPgogKiBXb3JkIGJvdW5kYXJ5IGFuYWx5c2lzIGlzIHVzZWQgYnkgc2VhcmNoIGFuZCByZXBsYWNlIGZ1bmN0aW9ucywgYXMKICogd2VsbCBhcyB3aXRoaW4gdGV4dCBlZGl0aW5nIGFwcGxpY2F0aW9ucyB0aGF0IGFsbG93IHRoZSB1c2VyIHRvCiAqIHNlbGVjdCB3b3JkcyB3aXRoIGEgZG91YmxlIGNsaWNrLiBXb3JkIHNlbGVjdGlvbiBwcm92aWRlcyBjb3JyZWN0CiAqIGludGVycHJldGF0aW9uIG9mIHB1bmN0dWF0aW9uIG1hcmtzIHdpdGhpbiBhbmQgZm9sbG93aW5nCiAqIHdvcmRzLiBDaGFyYWN0ZXJzIHRoYXQgYXJlIG5vdCBwYXJ0IG9mIGEgd29yZCwgc3VjaCBhcyBzeW1ib2xzIG9yCiAqIHB1bmN0dWF0aW9uIG1hcmtzLCBoYXZlIHdvcmQtYnJlYWtzIG9uIGJvdGggc2lkZXMuCiAqIDxQPgogKiBDaGFyYWN0ZXIgYm91bmRhcnkgYW5hbHlzaXMgYWxsb3dzIHVzZXJzIHRvIGludGVyYWN0IHdpdGgKICogY2hhcmFjdGVycyBhcyB0aGV5IGV4cGVjdCB0bywgZm9yIGV4YW1wbGUsIHdoZW4gbW92aW5nIHRoZSBjdXJzb3IKICogdGhyb3VnaCBhIHRleHQgc3RyaW5nLiBDaGFyYWN0ZXIgYm91bmRhcnkgYW5hbHlzaXMgcHJvdmlkZXMgY29ycmVjdAogKiBuYXZpZ2F0aW9uIG9mIHRocm91Z2ggY2hhcmFjdGVyIHN0cmluZ3MsIHJlZ2FyZGxlc3Mgb2YgaG93IHRoZQogKiBjaGFyYWN0ZXIgaXMgc3RvcmVkLiAgRm9yIGV4YW1wbGUsIGFuIGFjY2VudGVkIGNoYXJhY3RlciBtaWdodCBiZQogKiBzdG9yZWQgYXMgYSBiYXNlIGNoYXJhY3RlciBhbmQgYSBkaWFjcml0aWNhbCBtYXJrLiBXaGF0IHVzZXJzCiAqIGNvbnNpZGVyIHRvIGJlIGEgY2hhcmFjdGVyIGNhbiBkaWZmZXIgYmV0d2VlbiBsYW5ndWFnZXMuCiAqIDxQPgogKiBUaGlzIGlzIHRoZSBpbnRlcmZhY2UgZm9yIGFsbCB0ZXh0IGJvdW5kYXJpZXMuCiAqIDxQPgogKiBFeGFtcGxlczoKICogPFA+CiAqIEhlbHBlciBmdW5jdGlvbiB0byBvdXRwdXQgdGV4dAogKiA8cHJlPgogKiAuICAgdm9pZCBwcmludFRleHRSYW5nZShVQ2hhciogc3RyLCBVVGV4dE9mZnNldCBzdGFydCwgVVRleHRPZmZzZXQgZW5kICkgewogKiAuICAgICAgICBVQ2hhciogcmVzdWx0OwogKiAuICAgICAgICBVQ2hhciogdGVtcDsKICogLiAgICAgICAgY29uc3QgY2hhciogcmVzOwogKiAuICAgICAgICB0ZW1wPShVQ2hhciopbWFsbG9jKHNpemVvZihVQ2hhcikgKiAoKHVfc3RybGVuKHN0ciktc3RhcnQpKzEpKTsKICogLiAgICAgICAgcmVzdWx0PShVQ2hhciopbWFsbG9jKHNpemVvZihVQ2hhcikgKiAoKGVuZC1zdGFydCkrMSkpOwogKiAuICAgICAgICB1X3N0cmNweSh0ZW1wLCAmc3RyW3N0YXJ0XSk7CiAqIC4gICAgICAgIHVfc3RybmNweShyZXN1bHQsIHRlbXAsIGVuZC1zdGFydCk7CiAqIC4gICAgICAgIHJlcz0oY2hhciopbWFsbG9jKHNpemVvZihjaGFyKSAqICh1X3N0cmxlbihyZXN1bHQpKzEpKTsKICogLiAgICAgICAgdV9hdXN0cmNweShyZXMsIHJlc3VsdCk7CiAqIC4gICAgICAgIHByaW50ZigiJXNcbiIsIHJlcyk7IAogKiAuICAgfQogKiA8L3ByZT4KICogUHJpbnQgZWFjaCBlbGVtZW50IGluIG9yZGVyOgogKiA8cHJlPgogKiAuICAgdm9pZCBwcmludEVhY2hGb3J3YXJkKCBVQnJlYWtJdGVyYXRvciogYm91bmRhcnksIFVDaGFyKiBzdHIpIHsKICogLiAgICAgIFVUZXh0T2Zmc2V0IGVuZDsKICogLiAgICAgIFVUZXh0T2Zmc2V0IHN0YXJ0ID0gdWJya19maXJzdChib3VuZGFyeSk7CiAqIC4gICAgICBmb3IgKGVuZCA9IHVicmtfbmV4dChib3VuZGFyeSkpOyBlbmQgIT0gVUJSS19ET05FOyBzdGFydCA9IGVuZCwgZW5kID0gdWJya19uZXh0KGJvdW5kYXJ5KSkgewogKiAuICAgICAgICAgICAgcHJpbnRUZXh0UmFuZ2Uoc3RyLCBzdGFydCwgZW5kICk7CiAqIC4gICAgICAgIH0KICogLiAgIH0KICogPC9wcmU+CiAqIFByaW50IGVhY2ggZWxlbWVudCBpbiByZXZlcnNlIG9yZGVyOgogKiA8cHJlPgogKiAuICAgdm9pZCBwcmludEVhY2hCYWNrd2FyZCggVUJyZWFrSXRlcmF0b3IqIGJvdW5kYXJ5LCBVQ2hhciogc3RyKSB7CiAqIC4gICAgICBVVGV4dE9mZnNldCBzdGFydDsKICogLiAgICAgIFVUZXh0T2Zmc2V0IGVuZCA9IHVicmtfbGFzdChib3VuZGFyeSk7CiAqIC4gICAgICBmb3IgKHN0YXJ0ID0gdWJya19wcmV2aW91cyhib3VuZGFyeSk7IHN0YXJ0ICE9IFVCUktfRE9ORTsgIGVuZCA9IHN0YXJ0LCBzdGFydCA9dWJya19wcmV2aW91cyhib3VuZGFyeSkpIHsKICogLiAgICAgICAgICAgIHByaW50VGV4dFJhbmdlKCBzdHIsIHN0YXJ0LCBlbmQgKTsKICogLiAgICAgICAgfQogKiAuICAgfQogKiA8L3ByZT4KICogUHJpbnQgZmlyc3QgZWxlbWVudAogKiA8cHJlPgogKiAuICAgdm9pZCBwcmludEZpcnN0KFVCcmVha0l0ZXJhdG9yKiBib3VuZGFyeSwgVUNoYXIqIHN0cikgewogKiAuICAgICAgIFVUZXh0T2Zmc2V0IGVuZDsKICogLiAgICAgICBVVGV4dE9mZnNldCBzdGFydCA9IHVicmtfZmlyc3QoYm91bmRhcnkpOwogKiAuICAgICAgIGVuZCA9IHVicmtfbmV4dChib3VuZGFyeSk7CiAqIC4gICAgICAgcHJpbnRUZXh0UmFuZ2UoIHN0ciwgc3RhcnQsIGVuZCApOwogKiAuICAgfQogKiA8L3ByZT4KICogUHJpbnQgbGFzdCBlbGVtZW50CiAqIDxwcmU+CiAqIC4gICB2b2lkIHByaW50TGFzdChVQnJlYWtJdGVyYXRvciogYm91bmRhcnksIFVDaGFyKiBzdHIpIHsKICogLiAgICAgICBVVGV4dE9mZnNldCBzdGFydDsKICogLiAgICAgICBVVGV4dE9mZnNldCBlbmQgPSB1YnJrX2xhc3QoYm91bmRhcnkpOwogKiAuICAgICAgIHN0YXJ0ID0gdWJya19wcmV2aW91cyhib3VuZGFyeSk7CiAqIC4gICAgICAgcHJpbnRUZXh0UmFuZ2Uoc3RyLCBzdGFydCwgZW5kICk7CiAqIC4gICB9CiAqIDwvcHJlPgogKiBQcmludCB0aGUgZWxlbWVudCBhdCBhIHNwZWNpZmllZCBwb3NpdGlvbgogKiA8cHJlPgogKiAuICAgdm9pZCBwcmludEF0KFVCcmVha0l0ZXJhdG9yKiBib3VuZGFyeSwgVVRleHRPZmZzZXQgcG9zICwgVUNoYXIqIHN0cikgewogKiAuICAgICAgIFVUZXh0T2Zmc2V0IHN0YXJ0OwogKiAuICAgICAgIFVUZXh0T2Zmc2V0IGVuZCA9IHVicmtfZm9sbG93aW5nKGJvdW5kYXJ5LCBwb3MpOwogKiAuICAgICAgIHN0YXJ0ID0gdWJya19wcmV2aW91cyhib3VuZGFyeSk7CiAqIC4gICAgICAgcHJpbnRUZXh0UmFuZ2Uoc3RyLCBzdGFydCwgZW5kICk7CiAqIC4gICB9CiAqIDwvcHJlPgogKiBDcmVhdGluZyBhbmQgdXNpbmcgdGV4dCBib3VuZGFyaWVzCiAqIDxwcmU+CiAqIC4gICAgICB2b2lkIEJyZWFrSXRlcmF0b3JfRXhhbXBsZSggdm9pZCApIHsKICogLiAgICAgICAgICBVQnJlYWtJdGVyYXRvciogYm91bmRhcnk7CiAqIC4gICAgICAgICAgVUNoYXIgKnN0cmluZ1RvRXhhbWluZTsKICogLiAgICAgICAgICBzdHJpbmdUb0V4YW1pbmU9KFVDaGFyKiltYWxsb2Moc2l6ZW9mKFVDaGFyKSAqIChzdHJsZW4oIkFhYSBiYmIgY2NjLiBEZGQgZWVlIGZmZi4iKSsxKSApOwogKiAuICAgICAgICAgIHVfdWFzdHJjcHkoc3RyaW5nVG9FeGFtaW5lLCAiQWFhIGJiYiBjY2MuIERkZCBlZWUgZmZmLiIpOwogKiAuICAgICAgICAgIHByaW50ZigiRXhhbWluaW5nOiAiQWFhIGJiYiBjY2MuIERkZCBlZWUgZmZmLiIpOwogKiAuCiAqIC4gICAgICAgICAgLy9wcmludCBlYWNoIHNlbnRlbmNlIGluIGZvcndhcmQgYW5kIHJldmVyc2Ugb3JkZXIKICogLiAgICAgICAgICBib3VuZGFyeSA9IHVicmtfb3BlbihVQlJLX1NFTlRFTkNFLCAiZW5fdXMiLCBzdHJpbmdUb0V4YW1pbmUsIHVfc3RybGVuKHN0cmluZ1RvRXhhbWluZSksICZzdGF0dXMpOwogKiAuICAgICAgICAgIHByaW50ZigiLS0tLS0gZm9yd2FyZDogLS0tLS0tLS0tLS1cbiIpOyAKICogLiAgICAgICAgICBwcmludEVhY2hGb3J3YXJkKGJvdW5kYXJ5LCBzdHJpbmdUb0V4YW1pbmUpOwogKiAuICAgICAgICAgIHByaW50ZigiLS0tLS0gYmFja3dhcmQ6IC0tLS0tLS0tLS1cbiIpOwogKiAuICAgICAgICAgIHByaW50RWFjaEJhY2t3YXJkKGJvdW5kYXJ5LCBzdHJpbmdUb0V4YW1pbmUpOwogKiAuICAgICAgICAgIHVicmtfY2xvc2UoYm91bmRhcnkpOwogKiAuCiAqIC4gICAgICAgICAgLy9wcmludCBlYWNoIHdvcmQgaW4gb3JkZXIKICogLiAgICAgICAgICBib3VuZGFyeSA9IHVicmtfb3BlbihVQlJLX1dPUkQsICJlbl91cyIsIHN0cmluZ1RvRXhhbWluZSwgdV9zdHJsZW4oc3RyaW5nVG9FeGFtaW5lKSwgJnN0YXR1cyk7CiAqIC4gICAgICAgICAgcHJpbnRmKCItLS0tLSBmb3J3YXJkOiAtLS0tLS0tLS0tLVxuIik7IAogKiAuICAgICAgICAgIHByaW50RWFjaEZvcndhcmQoYm91bmRhcnksIHN0cmluZ1RvRXhhbWluZSk7CiAqIC4gICAgICAgICAgcHJpbnRmKCItLS0tLSBiYWNrd2FyZDogLS0tLS0tLS0tLVxuIik7CiAqIC4gICAgICAgICAgcHJpbnRFYWNoQmFja3dhcmQoYm91bmRhcnksIHN0cmluZ1RvRXhhbWluZSk7CiAqIC4gICAgICAgICAgLy9wcmludCBmaXJzdCBlbGVtZW50CiAqIC4gICAgICAgICAgcHJpbnRmKCItLS0tLSBmaXJzdDogLS0tLS0tLS0tLS0tLVxuIik7CiAqIC4gICAgICAgICAgcHJpbnRGaXJzdChib3VuZGFyeSwgc3RyaW5nVG9FeGFtaW5lKTsKICogLiAgICAgICAgICAvL3ByaW50IGxhc3QgZWxlbWVudAogKiAuICAgICAgICAgIHByaW50ZigiLS0tLS0gbGFzdDogLS0tLS0tLS0tLS0tLS1cbiIpOwogKiAuICAgICAgICAgIHByaW50TGFzdChib3VuZGFyeSwgc3RyaW5nVG9FeGFtaW5lKTsKICogLiAgICAgICAgICAvL3ByaW50IHdvcmQgYXQgY2hhcnBvcyAxMAogKiAuICAgICAgICAgIHByaW50ZigiLS0tLS0gYXQgcG9zIDEwOiAtLS0tLS0tLS1cbiIpOwogKiAuICAgICAgICAgIHByaW50QXQoYm91bmRhcnksIDEwICwgc3RyaW5nVG9FeGFtaW5lKTsKICogLgogKiAuICAgICAgICAgIHVicmtfY2xvc2UoYm91bmRhcnkpOwogKiAuICAgICAgfQogKiA8L3ByZT4KICovCgovKiogCiAqIEEgdGV4dC1icmVhayBpdGVyYXRvci4KICogIEZvciB1c2FnZSBpbiBDIHByb2dyYW1zLgogKi8KdHlwZWRlZiB2b2lkKiBVQnJlYWtJdGVyYXRvcjsKCi8qKiBUaGUgcG9zc2libGUgdHlwZXMgb2YgdGV4dCBib3VuZGFyaWVzLiAqLwplbnVtIFVCcmVha0l0ZXJhdG9yVHlwZSB7CiAgLyoqIENoYXJhY3RlciBicmVha3MgKi8KICBVQlJLX0NIQVJBQ1RFUiwKICAvKiogV29yZCBicmVha3MgKi8KICBVQlJLX1dPUkQsCiAgLyoqIExpbmUgYnJlYWtzICovCiAgVUJSS19MSU5FLAogIC8qKiBTZW50ZW5jZSBicmVha3MgKi8KICBVQlJLX1NFTlRFTkNFCn07CnR5cGVkZWYgZW51bSBVQnJlYWtJdGVyYXRvclR5cGUgVUJyZWFrSXRlcmF0b3JUeXBlOwoKLyoqIFZhbHVlIGluZGljYXRpbmcgYWxsIHRleHQgYm91bmRhcmllcyBoYXZlIGJlZW4gcmV0dXJuZWQuIAogKgogKi8KI2RlZmluZSBVQlJLX0RPTkUgKChVVGV4dE9mZnNldCkgLTEpCgovKioKICogT3BlbiBhIG5ldyBVQnJlYWtJdGVyYXRvciBmb3IgbG9jYXRpbmcgdGV4dCBib3VuZGFyaWVzIGZvciBhIHNwZWNpZmllZCBsb2NhbGUuCiAqIEEgVUJyZWFrSXRlcmF0b3IgbWF5IGJlIHVzZWQgZm9yIGRldGVjdGluZyBjaGFyYWN0ZXIsIGxpbmUsIHdvcmQsIAogKiBhbmQgc2VudGVuY2UgYnJlYWtzIGluIHRleHQuCiAqIEBwYXJhbSB0eXBlIFRoZSB0eXBlIG9mIFVCcmVha0l0ZXJhdG9yIHRvIG9wZW46IG9uZSBvZiBVQlJLX0NIQVJBQ1RFUiwgVUJSS19XT1JELAogKiBVQlJLX0xJTkUsIFVCUktfU0VOVEVOQ0UKICogQHBhcmFtIGxvY2FsZSBUaGUgbG9jYWxlIHNwZWNpZnlpbmcgdGhlIHRleHQtYnJlYWtpbmcgY29udmVudGlvbnMuCiAqIEBwYXJhbSB0ZXh0IFRoZSB0ZXh0IHRvIGJlIGl0ZXJhdGVkIG92ZXIuCiAqIEBwYXJhbSB0ZXh0TGVuZ3RoIFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiB0ZXh0LCBvciAtMSBpZiBudWxsLXRlcm1pbmF0ZWQuCiAqIEBwYXJhbSBzdGF0dXMgQSBVRXJyb3JDb2RlIHRvIHJlY2VpdmUgYW55IGVycm9ycy4KICogQHJldHVybiBBIFVCcmVha0l0ZXJhdG9yIGZvciB0aGUgc3BlY2lmaWVkIGxvY2FsZS4KICogQHNlZSB1YnJrX29wZW5SdWxlcwogKiBAc3RhYmxlCiAqLwpVX0NBUEkgVUJyZWFrSXRlcmF0b3IqCnVicmtfb3BlbihVQnJlYWtJdGVyYXRvclR5cGUgdHlwZSwKICAgICAgY29uc3QgY2hhciAqbG9jYWxlLAogICAgICBjb25zdCBVQ2hhciAqdGV4dCwKICAgICAgaW50MzJfdCB0ZXh0TGVuZ3RoLAogICAgICBVRXJyb3JDb2RlICpzdGF0dXMpOwoKLyoqCiAqIE9wZW4gYSBuZXcgVUJyZWFrSXRlcmF0b3IgZm9yIGxvY2F0aW5nIHRleHQgYm91bmRhcmllcyB1c2luZyBzcGVjaWZpZWQgYnJlYWtpbmcgcnVsZXMuCiAqIFRoZSBydWxlIHN5bnRheCBpcyAuLi4gKFRCRCkKICogQHBhcmFtIHJ1bGVzIEEgc2V0IG9mIHJ1bGVzIHNwZWNpZnlpbmcgdGhlIHRleHQgYnJlYWtpbmcgY29udmVudGlvbnMuCiAqIEBwYXJhbSBydWxlc0xlbmd0aCBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gcnVsZXMsIG9yIC0xIGlmIG51bGwtdGVybWluYXRlZC4KICogQHBhcmFtIHRleHQgVGhlIHRleHQgdG8gYmUgaXRlcmF0ZWQgb3Zlci4KICogQHBhcmFtIHRleHRMZW5ndGggVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIHRleHQsIG9yIC0xIGlmIG51bGwtdGVybWluYXRlZC4KICogQHBhcmFtIHN0YXR1cyBBIFVFcnJvckNvZGUgdG8gcmVjZWl2ZSBhbnkgZXJyb3JzLgogKiBAcmV0dXJuIEEgVUJyZWFrSXRlcmF0b3IgZm9yIHRoZSBzcGVjaWZpZWQgcnVsZXMuCiAqIEBzZWUgdWJya19vcGVuCiAqIEBzdGFibGUKICovClVfQ0FQSSBVQnJlYWtJdGVyYXRvcioKdWJya19vcGVuUnVsZXMoY29uc3QgVUNoYXIgKnJ1bGVzLAogICAgICAgICAgIGludDMyX3QgcnVsZXNMZW5ndGgsCiAgICAgICAgICAgY29uc3QgVUNoYXIgKnRleHQsCiAgICAgICAgICAgaW50MzJfdCB0ZXh0TGVuZ3RoLAogICAgICAgICAgIFVFcnJvckNvZGUgKnN0YXR1cyk7CgovKioKKiBDbG9zZSBhIFVCcmVha0l0ZXJhdG9yLgoqIE9uY2UgY2xvc2VkLCBhIFVCcmVha0l0ZXJhdG9yIG1heSBubyBsb25nZXIgYmUgdXNlZC4KKiBAcGFyYW0gYmkgVGhlIGJyZWFrIGl0ZXJhdG9yIHRvIGNsb3NlLgogKiBAc3RhYmxlCiovClVfQ0FQSSB2b2lkCnVicmtfY2xvc2UoVUJyZWFrSXRlcmF0b3IgKmJpKTsKCi8qKgogKiBTZXRzIGFuIGV4aXN0aW5nIGl0ZXJhdG9yIHRvIHBvaW50IHRvIGEgbmV3IHBpZWNlIG9mIHRleHQKICogQHN0YWJsZQogKi8KVV9DQVBJIHZvaWQKdWJya19zZXRUZXh0KFVCcmVha0l0ZXJhdG9yKiBiaSwKICAgICAgICAgICAgIGNvbnN0IFVDaGFyKiAgICB0ZXh0LAogICAgICAgICAgICAgaW50MzJfdCAgICAgICAgIHRleHRMZW5ndGgsCiAgICAgICAgICAgICBVRXJyb3JDb2RlKiAgICAgc3RhdHVzKTsKCi8qKgogKiBEZXRlcm1pbmUgdGhlIG1vc3QgcmVjZW50bHktcmV0dXJuZWQgdGV4dCBib3VuZGFyeS4KICogCiAqIEBwYXJhbSBiaSBUaGUgYnJlYWsgaXRlcmF0b3IgdG8gdXNlLgogKiBAcmV0dXJuIFRoZSBjaGFyYWN0ZXIgaW5kZXggbW9zdCByZWNlbnRseSByZXR1cm5lZCBieSBcUmVme3VicmtfbmV4dH0sIFxSZWZ7dWJya19wcmV2aW91c30sIAogKiBcUmVme3VicmtfZmlyc3R9LCBvciBcUmVme3VicmtfbGFzdH0uCiAqIEBzdGFibGUKICovClVfQ0FQSSBVVGV4dE9mZnNldAp1YnJrX2N1cnJlbnQoY29uc3QgVUJyZWFrSXRlcmF0b3IgKmJpKTsKCi8qKgogKiBEZXRlcm1pbmUgdGhlIHRleHQgYm91bmRhcnkgZm9sbG93aW5nIHRoZSBjdXJyZW50IHRleHQgYm91bmRhcnkuCiAqIAogKiBAcGFyYW0gYmkgVGhlIGJyZWFrIGl0ZXJhdG9yIHRvIHVzZS4KICogQHJldHVybiBUaGUgY2hhcmFjdGVyIGluZGV4IG9mIHRoZSBuZXh0IHRleHQgYm91bmRhcnksIG9yIFVCUktfRE9ORQogKiBpZiBhbGwgdGV4dCBib3VuZGFyaWVzIGhhdmUgYmVlbiByZXR1cm5lZC4KICogQHNlZSB1YnJrX3ByZXZpb3VzCiAqIEBzdGFibGUKICovClVfQ0FQSSBVVGV4dE9mZnNldAp1YnJrX25leHQoVUJyZWFrSXRlcmF0b3IgKmJpKTsKCi8qKgogKiBEZXRlcm1pbmUgdGhlIHRleHQgYm91bmRhcnkgcHJlY2VkaW5nIHRoZSBjdXJyZW50IHRleHQgYm91bmRhcnkuCiAqCiAqIEBwYXJhbSBiaSBUaGUgYnJlYWsgaXRlcmF0b3IgdG8gdXNlLgogKiBAcmV0dXJuIFRoZSBjaGFyYWN0ZXIgaW5kZXggb2YgdGhlIHByZWNlZGluZyB0ZXh0IGJvdW5kYXJ5LCBvciBVQlJLX0RPTkUKICogaWYgYWxsIHRleHQgYm91bmRhcmllcyBoYXZlIGJlZW4gcmV0dXJuZWQuCiAqIEBzZWUgdWJya19uZXh0CiAqIEBzdGFibGUKICovClVfQ0FQSSBVVGV4dE9mZnNldAp1YnJrX3ByZXZpb3VzKFVCcmVha0l0ZXJhdG9yICpiaSk7CgovKioKICogRGV0ZXJtaW5lIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIGluIHRoZSB0ZXh0IGJlaW5nIHNjYW5uZWQuCiAqIFRoaXMgaXMgbm90IGFsd2F5cyB0aGUgc2FtZSBhcyBpbmRleCAwIG9mIHRoZSB0ZXh0LgogKiBAcGFyYW0gYmkgVGhlIGJyZWFrIGl0ZXJhdG9yIHRvIHVzZS4KICogQHJldHVybiBUaGUgY2hhcmFjdGVyIGluZGV4IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaW4gdGhlIHRleHQgYmVpbmcgc2Nhbm5lZC4KICogQHNlZSB1YnJrX2xhc3QKICogQHN0YWJsZQogKi8KVV9DQVBJIFVUZXh0T2Zmc2V0CnVicmtfZmlyc3QoVUJyZWFrSXRlcmF0b3IgKmJpKTsKCi8qKgogKiBEZXRlcm1pbmUgdGhlIGluZGV4IGltbWVkaWF0ZWx5IDxFTT5iZXlvbmQ8L0VNPiB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIHRleHQgYmVpbmcKICogc2Nhbm5lZC4KICogVGhpcyBpcyBub3QgdGhlIHNhbWUgYXMgdGhlIGxhc3QgY2hhcmFjdGVyLgogKiBAcGFyYW0gYmkgVGhlIGJyZWFrIGl0ZXJhdG9yIHRvIHVzZS4KICogQHJldHVybiBUaGUgY2hhcmFjdGVyIG9mZnNldCBpbW1lZGlhdGVseSA8RU0+YmV5b25kPC9FTT4gdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZQogKiB0ZXh0IGJlaW5nIHNjYW5uZWQuCiAqIEBzZWUgdWJya19maXJzdAogKiBAc3RhYmxlCiAqLwpVX0NBUEkgVVRleHRPZmZzZXQKdWJya19sYXN0KFVCcmVha0l0ZXJhdG9yICpiaSk7CgovKioKICogRGV0ZXJtaW5lIHRoZSB0ZXh0IGJvdW5kYXJ5IHByZWNlZGluZyB0aGUgc3BlY2lmaWVkIG9mZnNldC4KICogVGhlIHZhbHVlIHJldHVybmVkIGlzIGFsd2F5cyBzbWFsbGVyIHRoYW4gb2Zmc2V0LCBvciBVQlJLX0RPTkUuCiAqIEBwYXJhbSBiaSBUaGUgYnJlYWsgaXRlcmF0b3IgdG8gdXNlLgogKiBAcGFyYW0gb2Zmc2V0IFRoZSBvZmZzZXQgdG8gYmVnaW4gc2Nhbm5pbmcuCiAqIEByZXR1cm4gVGhlIHRleHQgYm91bmRhcnkgcHJlY2VkaW5nIG9mZnNldCwgb3IgVUJSS19ET05FLgogKiBAc2VlIHVicmtfZm9sbG93aW5nCiAqIEBzdGFibGUKICovClVfQ0FQSSBVVGV4dE9mZnNldAp1YnJrX3ByZWNlZGluZyhVQnJlYWtJdGVyYXRvciAqYmksCiAgICAgICAgICAgVVRleHRPZmZzZXQgb2Zmc2V0KTsKCi8qKgogKiBEZXRlcm1pbmUgdGhlIHRleHQgYm91bmRhcnkgZm9sbG93aW5nIHRoZSBzcGVjaWZpZWQgb2Zmc2V0LgogKiBUaGUgdmFsdWUgcmV0dXJuZWQgaXMgYWx3YXlzIGdyZWF0ZXIgdGhhbiBvZmZzZXQsIG9yIFVCUktfRE9ORS4KICogQHBhcmFtIGJpIFRoZSBicmVhayBpdGVyYXRvciB0byB1c2UuCiAqIEBwYXJhbSBvZmZzZXQgVGhlIG9mZnNldCB0byBiZWdpbiBzY2FubmluZy4KICogQHJldHVybiBUaGUgdGV4dCBib3VuZGFyeSBmb2xsb3dpbmcgb2Zmc2V0LCBvciBVQlJLX0RPTkUuCiAqIEBzZWUgdWJya19wcmVjZWRpbmcKICogQHN0YWJsZQogKi8KVV9DQVBJIFVUZXh0T2Zmc2V0CnVicmtfZm9sbG93aW5nKFVCcmVha0l0ZXJhdG9yICpiaSwKICAgICAgICAgICBVVGV4dE9mZnNldCBvZmZzZXQpOwoKLyoqCiogR2V0IGEgbG9jYWxlIGZvciB3aGljaCB0ZXh0IGJyZWFraW5nIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZS4KKiBBIFVCcmVha0l0ZXJhdG9yIGluIGEgbG9jYWxlIHJldHVybmVkIGJ5IHRoaXMgZnVuY3Rpb24gd2lsbCBwZXJmb3JtIHRoZSBjb3JyZWN0CiogdGV4dCBicmVha2luZyBmb3IgdGhlIGxvY2FsZS4KKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IG9mIHRoZSBkZXNpcmVkIGxvY2FsZS4KKiBAcmV0dXJuIEEgbG9jYWxlIGZvciB3aGljaCBudW1iZXIgdGV4dCBicmVha2luZyBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUsIG9yIDAgaWYgbm9uZS4KKiBAc2VlIHVicmtfY291bnRBdmFpbGFibGUKKiBAc3RhYmxlCiovClVfQ0FQSSBjb25zdCBjaGFyKgp1YnJrX2dldEF2YWlsYWJsZShpbnQzMl90IGluZGV4KTsKCi8qKgoqIERldGVybWluZSBob3cgbWFueSBsb2NhbGVzIGhhdmUgdGV4dCBicmVha2luZyBpbmZvcm1hdGlvbiBhdmFpbGFibGUuCiogVGhpcyBmdW5jdGlvbiBpcyBtb3N0IHVzZWZ1bCBhcyBkZXRlcm1pbmluZyB0aGUgbG9vcCBlbmRpbmcgY29uZGl0aW9uIGZvcgoqIGNhbGxzIHRvIFxSZWZ7dWJya19nZXRBdmFpbGFibGV9LgoqIEByZXR1cm4gVGhlIG51bWJlciBvZiBsb2NhbGVzIGZvciB3aGljaCB0ZXh0IGJyZWFraW5nIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZS4KKiBAc2VlIHVicmtfZ2V0QXZhaWxhYmxlCiogQHN0YWJsZQoqLwpVX0NBUEkgaW50MzJfdAp1YnJrX2NvdW50QXZhaWxhYmxlKHZvaWQpOwoKI2VuZGlmCg==