Received: from localhost (unknown [200.46.204.183]) by postgresql.org (Postfix) with ESMTP id 671B965014C for ; Wed, 3 Sep 2008 19:09:15 -0300 (ADT) Received: from postgresql.org ([200.46.204.86]) by localhost (mx1.hub.org [200.46.204.183]) (amavisd-maia, port 10024) with ESMTP id 35882-03-4 for ; Wed, 3 Sep 2008 19:09:11 -0300 (ADT) X-Greylist: from auto-whitelisted by SQLgrey-1.7.6 Received: from mail.esilo.com (web-qwest-sterling2.esilo.com [63.150.152.211]) by postgresql.org (Postfix) with ESMTP id E7D7264FF57 for ; Wed, 3 Sep 2008 19:09:05 -0300 (ADT) Received: from [10.0.0.2] (fwext-esilo-jupiter.esilo.com [64.135.45.146]) (authenticated bits=0) by mail.esilo.com (8.13.1/8.13.1) with ESMTP id m83M8sJx025764 for ; Wed, 3 Sep 2008 18:08:56 -0400 Message-ID: <48BF0B6D.6020006@esilo.com> Date: Wed, 03 Sep 2008 18:10:53 -0400 From: Andrew Chernow User-Agent: Thunderbird 2.0.0.16 (Windows/20080708) MIME-Version: 1.0 To: "Patches (PostgreSQL)" Subject: Re: libpq events patch References: <19342.1210776271@sss.pgh.pa.us> <482B1480.1070705@esilo.com> <482B2AC5.7000503@esilo.com> <482ECF62.7010901@esilo.com> <12200.1211242959@sss.pgh.pa.us> <48323593.4060302@esilo.com> <13642.1211251078@sss.pgh.pa.us> <48323F94.6010201@esilo.com> <48325386.2010506@esilo.com> <20080903001920.GT12610@alvh.no-ip.org> <48BE9AA0.1070606@esilo.com> <48BEBAC3.7060701@esilo.com> In-Reply-To: <48BEBAC3.7060701@esilo.com> Content-Type: multipart/mixed; boundary="------------010608020209070700060004" X-Virus-Scanned: Maia Mailguard 1.0.1 X-Spam-Status: No, hits=0 tagged_above=0 required=5 tests=none X-Spam-Level: X-Archive-Number: 200809/33 X-Sequence-Number: 7048 This is a multi-part message in MIME format. --------------010608020209070700060004 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Andrew Chernow wrote: > This is an updated version pf the libpqevents patch. See > > http://archives.postgresql.org/pgsql-hackers/2008-09/msg00153.php > > for details. The only change I didn't make yet is the event 'name'. I > have put it in and taken it out twice now, so a firm 'put it in there' > would be appreciated. > > Go here for libpqtypes using events. pgfoundry is still using the older > object hooks version. > > http://libpqtypes.esilo.com/libpqtypes-events.tar.gz > > Patch update again. This one includes an optional event name for debugging purposes. It also includes the changes made by Alvaro that I missed. PQregisterEventProc now takes a name argumet. If the name is NULL, the error message will identify the event procedure by its address ... "addr:%p". If its not NULL, error messages will indicate the provided name. I updated the styling in libpq-events.c and a couple places in fe-exec.c that Alvaro missed. -- Andrew Chernow eSilo, LLC every bit counts http://www.esilo.com/ --------------010608020209070700060004 Content-Type: text/plain; name="libpq-events.patch" Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="libpq-events.patch" SW5kZXg6IHNyYy9pbnRlcmZhY2VzL2xpYnBxL01ha2VmaWxlCj09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KUkNT IGZpbGU6IC9wcm9qZWN0cy9jdnNyb290L3Bnc3FsL3NyYy9pbnRlcmZhY2VzL2xpYnBxL01h a2VmaWxlLHYKcmV0cmlldmluZyByZXZpc2lvbiAxLjE2NgpkaWZmIC1DNiAtcjEuMTY2IE1h a2VmaWxlCioqKiBzcmMvaW50ZXJmYWNlcy9saWJwcS9NYWtlZmlsZQkxNiBBcHIgMjAwOCAx NDoxOTo1NiAtMDAwMAkxLjE2NgotLS0gc3JjL2ludGVyZmFjZXMvbGlicHEvTWFrZWZpbGUJ MyBTZXAgMjAwOCAyMTo1NTowNiAtMDAwMAoqKioqKioqKioqKioqKioKKioqIDI5LDQxICoq KioKICAjIHRoZSBvYmplY3QgZmlsZXMgZnJvbSBsaWJwZ3BvcnQsIHRoaXMgd291bGQgbm90 IGJlIHRydWUgb24gYWxsCiAgIyBwbGF0Zm9ybXMuCiAgTElCUyA6PSAkKExJQlM6LWxwZ3Bv cnQ9KQogIAogIE9CSlM9CWZlLWF1dGgubyBmZS1jb25uZWN0Lm8gZmUtZXhlYy5vIGZlLW1p c2MubyBmZS1wcmludC5vIGZlLWxvYmoubyBcCiAgCWZlLXByb3RvY29sMi5vIGZlLXByb3Rv Y29sMy5vIHBxZXhwYnVmZmVyLm8gcHFzaWduYWwubyBmZS1zZWN1cmUubyBcCiEgCW1kNS5v IGlwLm8gd2NoYXIubyBlbmNuYW1lcy5vIG5vYmxvY2subyBwZ3N0cmNhc2VjbXAubyB0aHJl YWQubyBcCiAgCSQoZmlsdGVyIGNyeXB0Lm8gZ2V0YWRkcmluZm8ubyBpbmV0X2F0b24ubyBv cGVuLm8gc25wcmludGYubyBzdHJlcnJvci5vIHN0cmxjcHkubyB3aW4zMmVycm9yLm8sICQo TElCT0JKUykpCiAgCiAgaWZlcSAoJChQT1JUTkFNRSksIGN5Z3dpbikKICBvdmVycmlkZSBz aGxpYiA9IGN5ZyQoTkFNRSkkKERMU1VGRklYKQogIGVuZGlmCiAgCi0tLSAyOSw0MSAtLS0t CiAgIyB0aGUgb2JqZWN0IGZpbGVzIGZyb20gbGlicGdwb3J0LCB0aGlzIHdvdWxkIG5vdCBi ZSB0cnVlIG9uIGFsbAogICMgcGxhdGZvcm1zLgogIExJQlMgOj0gJChMSUJTOi1scGdwb3J0 PSkKICAKICBPQkpTPQlmZS1hdXRoLm8gZmUtY29ubmVjdC5vIGZlLWV4ZWMubyBmZS1taXNj Lm8gZmUtcHJpbnQubyBmZS1sb2JqLm8gXAogIAlmZS1wcm90b2NvbDIubyBmZS1wcm90b2Nv bDMubyBwcWV4cGJ1ZmZlci5vIHBxc2lnbmFsLm8gZmUtc2VjdXJlLm8gXAohIAltZDUubyBp cC5vIHdjaGFyLm8gZW5jbmFtZXMubyBub2Jsb2NrLm8gcGdzdHJjYXNlY21wLm8gdGhyZWFk Lm8gbGlicHEtZXZlbnRzLm8gXAogIAkkKGZpbHRlciBjcnlwdC5vIGdldGFkZHJpbmZvLm8g aW5ldF9hdG9uLm8gb3Blbi5vIHNucHJpbnRmLm8gc3RyZXJyb3IubyBzdHJsY3B5Lm8gd2lu MzJlcnJvci5vLCAkKExJQk9CSlMpKQogIAogIGlmZXEgKCQoUE9SVE5BTUUpLCBjeWd3aW4p CiAgb3ZlcnJpZGUgc2hsaWIgPSBjeWckKE5BTUUpJChETFNVRkZJWCkKICBlbmRpZgogIAoq KioqKioqKioqKioqKioKKioqIDEwMywxMjMgKioqKgogIAogICQodG9wX2J1aWxkZGlyKS9z cmMvcG9ydC9wZ19jb25maWdfcGF0aHMuaDoKICAJJChNQUtFKSAtQyAkKHRvcF9idWlsZGRp cikvc3JjL3BvcnQgcGdfY29uZmlnX3BhdGhzLmgKICAKICBpbnN0YWxsOiBhbGwgaW5zdGFs bGRpcnMgaW5zdGFsbC1saWIKICAJJChJTlNUQUxMX0RBVEEpICQoc3JjZGlyKS9saWJwcS1m ZS5oICckKERFU1RESVIpJChpbmNsdWRlZGlyKScKICAJJChJTlNUQUxMX0RBVEEpICQoc3Jj ZGlyKS9saWJwcS1pbnQuaCAnJChERVNURElSKSQoaW5jbHVkZWRpcl9pbnRlcm5hbCknCiAg CSQoSU5TVEFMTF9EQVRBKSAkKHNyY2RpcikvcHFleHBidWZmZXIuaCAnJChERVNURElSKSQo aW5jbHVkZWRpcl9pbnRlcm5hbCknCiAgCSQoSU5TVEFMTF9EQVRBKSAkKHNyY2RpcikvcGdf c2VydmljZS5jb25mLnNhbXBsZSAnJChERVNURElSKSQoZGF0YWRpcikvcGdfc2VydmljZS5j b25mLnNhbXBsZScKICAKICBpbnN0YWxsZGlyczogaW5zdGFsbGRpcnMtbGliCiAgCSQobWtp bnN0YWxsZGlycykgJyQoREVTVERJUikkKGluY2x1ZGVkaXIpJyAnJChERVNURElSKSQoaW5j bHVkZWRpcl9pbnRlcm5hbCknCiAgCiAgdW5pbnN0YWxsOiB1bmluc3RhbGwtbGliCiEgCXJt IC1mICckKERFU1RESVIpJChpbmNsdWRlZGlyKS9saWJwcS1mZS5oJyAnJChERVNURElSKSQo aW5jbHVkZWRpcl9pbnRlcm5hbCkvbGlicHEtaW50LmgnICckKERFU1RESVIpJChpbmNsdWRl ZGlyX2ludGVybmFsKS9wcWV4cGJ1ZmZlci5oJyAnJChERVNURElSKSQoZGF0YWRpcikvcGdf c2VydmljZS5jb25mLnNhbXBsZScKICAKICBjbGVhbiBkaXN0Y2xlYW46IGNsZWFuLWxpYgog IAlybSAtZiAkKE9CSlMpIHBnX2NvbmZpZ19wYXRocy5oIGNyeXB0LmMgZ2V0YWRkcmluZm8u YyBpbmV0X2F0b24uYyBub2Jsb2NrLmMgb3Blbi5jIHBnc3RyY2FzZWNtcC5jIHNucHJpbnRm LmMgc3RyZXJyb3IuYyBzdHJsY3B5LmMgdGhyZWFkLmMgbWQ1LmMgaXAuYyBlbmNuYW1lcy5j IHdjaGFyLmMgd2luMzJlcnJvci5jIHBnc2xlZXAuYyBwdGhyZWFkLmggbGlicHEucmMKICAj IE1pZ2h0IGJlIGxlZnQgb3ZlciBmcm9tIGEgV2luMzIgY2xpZW50LW9ubHkgYnVpbGQKICAJ cm0gLWYgcGdfY29uZmlnX3BhdGhzLmgKICAKLS0tIDEwMywxMjQgLS0tLQogIAogICQodG9w X2J1aWxkZGlyKS9zcmMvcG9ydC9wZ19jb25maWdfcGF0aHMuaDoKICAJJChNQUtFKSAtQyAk KHRvcF9idWlsZGRpcikvc3JjL3BvcnQgcGdfY29uZmlnX3BhdGhzLmgKICAKICBpbnN0YWxs OiBhbGwgaW5zdGFsbGRpcnMgaW5zdGFsbC1saWIKICAJJChJTlNUQUxMX0RBVEEpICQoc3Jj ZGlyKS9saWJwcS1mZS5oICckKERFU1RESVIpJChpbmNsdWRlZGlyKScKKyAJJChJTlNUQUxM X0RBVEEpICQoc3JjZGlyKS9saWJwcS1ldmVudHMuaCAnJChERVNURElSKSQoaW5jbHVkZWRp ciknCiAgCSQoSU5TVEFMTF9EQVRBKSAkKHNyY2RpcikvbGlicHEtaW50LmggJyQoREVTVERJ UikkKGluY2x1ZGVkaXJfaW50ZXJuYWwpJwogIAkkKElOU1RBTExfREFUQSkgJChzcmNkaXIp L3BxZXhwYnVmZmVyLmggJyQoREVTVERJUikkKGluY2x1ZGVkaXJfaW50ZXJuYWwpJwogIAkk KElOU1RBTExfREFUQSkgJChzcmNkaXIpL3BnX3NlcnZpY2UuY29uZi5zYW1wbGUgJyQoREVT VERJUikkKGRhdGFkaXIpL3BnX3NlcnZpY2UuY29uZi5zYW1wbGUnCiAgCiAgaW5zdGFsbGRp cnM6IGluc3RhbGxkaXJzLWxpYgogIAkkKG1raW5zdGFsbGRpcnMpICckKERFU1RESVIpJChp bmNsdWRlZGlyKScgJyQoREVTVERJUikkKGluY2x1ZGVkaXJfaW50ZXJuYWwpJwogIAogIHVu aW5zdGFsbDogdW5pbnN0YWxsLWxpYgohIAlybSAtZiAnJChERVNURElSKSQoaW5jbHVkZWRp cikvbGlicHEtZmUuaCcgJyQoREVTVERJUikkKGluY2x1ZGVkaXIpL2xpYnBxLWV2ZW50cy5o JyAnJChERVNURElSKSQoaW5jbHVkZWRpcl9pbnRlcm5hbCkvbGlicHEtaW50LmgnICckKERF U1RESVIpJChpbmNsdWRlZGlyX2ludGVybmFsKS9wcWV4cGJ1ZmZlci5oJyAnJChERVNURElS KSQoZGF0YWRpcikvcGdfc2VydmljZS5jb25mLnNhbXBsZScKICAKICBjbGVhbiBkaXN0Y2xl YW46IGNsZWFuLWxpYgogIAlybSAtZiAkKE9CSlMpIHBnX2NvbmZpZ19wYXRocy5oIGNyeXB0 LmMgZ2V0YWRkcmluZm8uYyBpbmV0X2F0b24uYyBub2Jsb2NrLmMgb3Blbi5jIHBnc3RyY2Fz ZWNtcC5jIHNucHJpbnRmLmMgc3RyZXJyb3IuYyBzdHJsY3B5LmMgdGhyZWFkLmMgbWQ1LmMg aXAuYyBlbmNuYW1lcy5jIHdjaGFyLmMgd2luMzJlcnJvci5jIHBnc2xlZXAuYyBwdGhyZWFk LmggbGlicHEucmMKICAjIE1pZ2h0IGJlIGxlZnQgb3ZlciBmcm9tIGEgV2luMzIgY2xpZW50 LW9ubHkgYnVpbGQKICAJcm0gLWYgcGdfY29uZmlnX3BhdGhzLmgKICAKSW5kZXg6IHNyYy9p bnRlcmZhY2VzL2xpYnBxL2V4cG9ydHMudHh0Cj09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KUkNTIGZpbGU6IC9w cm9qZWN0cy9jdnNyb290L3Bnc3FsL3NyYy9pbnRlcmZhY2VzL2xpYnBxL2V4cG9ydHMudHh0 LHYKcmV0cmlldmluZyByZXZpc2lvbiAxLjE5CmRpZmYgLUM2IC1yMS4xOSBleHBvcnRzLnR4 dAoqKiogc3JjL2ludGVyZmFjZXMvbGlicHEvZXhwb3J0cy50eHQJMTkgTWFyIDIwMDggMDA6 Mzk6MzMgLTAwMDAJMS4xOQotLS0gc3JjL2ludGVyZmFjZXMvbGlicHEvZXhwb3J0cy50eHQJ MyBTZXAgMjAwOCAyMTo1NTowNiAtMDAwMAoqKioqKioqKioqKioqKioKKioqIDEzOCwxNDMg KioqKgotLS0gMTM4LDE1NCAtLS0tCiAgUFFzZW5kRGVzY3JpYmVQb3J0YWwgICAgICAxMzYK ICBsb190cnVuY2F0ZSAgICAgICAgICAgICAgIDEzNwogIFBRY29ubmVjdGlvblVzZWRQYXNz d29yZCAgMTM4CiAgcGdfdmFsaWRfc2VydmVyX2VuY29kaW5nX2lkIDEzOQogIFBRY29ubmVj dGlvbk5lZWRzUGFzc3dvcmQgMTQwCiAgbG9faW1wb3J0X3dpdGhfb2lkCQkgIDE0MQorIFBR Y29weVJlc3VsdCAgICAgICAgICAgICAgMTQyCisgUFFzZXRSZXN1bHRBdHRycyAgICAgICAg ICAxNDMKKyBQUXNldHZhbHVlICAgICAgICAgICAgICAgIDE0NAorIFBRcmVzdWx0QWxsb2Mg ICAgICAgICAgICAgMTQ1CisgUFFyZWdpc3RlckV2ZW50UHJvYyAgICAgICAxNDYKKyBQUWlu c3RhbmNlRGF0YSAgICAgICAgICAgIDE0NworIFBRc2V0SW5zdGFuY2VEYXRhICAgICAgICAg MTQ4CisgUFFyZXN1bHRJbnN0YW5jZURhdGEgICAgICAxNDkKKyBQUXJlc3VsdFNldEluc3Rh bmNlRGF0YSAgIDE1MAorIFBRcGFzc1Rocm91Z2hEYXRhICAgICAgICAgMTUxCisgUFFyZXN1 bHRQYXNzVGhyb3VnaERhdGEgICAxNTIKSW5kZXg6IHNyYy9pbnRlcmZhY2VzL2xpYnBxL2Zl LWNvbm5lY3QuYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09ClJDUyBmaWxlOiAvcHJvamVjdHMvY3Zzcm9vdC9w Z3NxbC9zcmMvaW50ZXJmYWNlcy9saWJwcS9mZS1jb25uZWN0LmMsdgpyZXRyaWV2aW5nIHJl dmlzaW9uIDEuMzU5CmRpZmYgLUM2IC1yMS4zNTkgZmUtY29ubmVjdC5jCioqKiBzcmMvaW50 ZXJmYWNlcy9saWJwcS9mZS1jb25uZWN0LmMJMjkgTWF5IDIwMDggMjI6MDI6NDQgLTAwMDAJ MS4zNTkKLS0tIHNyYy9pbnRlcmZhY2VzL2xpYnBxL2ZlLWNvbm5lY3QuYwkzIFNlcCAyMDA4 IDIxOjU1OjA2IC0wMDAwCioqKioqKioqKioqKioqKgoqKiogMTk3MSwxOTgyICoqKioKLS0t IDE5NzEsMjAwMiAtLS0tCiAgICogcmVsZWFzZSBkYXRhIHRoYXQgaXMgdG8gYmUgaGVsZCBm b3IgdGhlIGxpZmUgb2YgdGhlIFBHY29ubiBzdHJ1Y3R1cmUuCiAgICogSWYgYSB2YWx1ZSBv dWdodCB0byBiZSBjbGVhcmVkL2ZyZWVkIGR1cmluZyBQUXJlc2V0KCksIGRvIGl0IHRoZXJl IG5vdCBoZXJlLgogICAqLwogIHN0YXRpYyB2b2lkCiAgZnJlZVBHY29ubihQR2Nvbm4gKmNv bm4pCiAgeworIAlpbnQgaTsKKyAJUEdFdmVudENvbm5EZXN0cm95IGV2dDsKKyAKKyAJLyog TGV0IHRoZSBldmVudCBwcm9jcyBjbGVhbnVwIHRoZWlyIHN0YXRlIGRhdGEgKi8KKyAJZm9y IChpID0gMDsgaSA8IGNvbm4tPm5FdmVudHM7IGkrKykKKyAJeworIAkJZXZ0LmNvbm4gPSBj b25uOworIAkJKHZvaWQpY29ubi0+ZXZlbnRzW2ldLnByb2MoUEdFVlRfQ09OTkRFU1RST1ks ICZldnQpOworIAkJaWYgKGNvbm4tPmV2ZW50c1tpXS5uYW1lKQorIAkJCWZyZWUoY29ubi0+ ZXZlbnRzW2ldLm5hbWUpOworIAl9CisgCisgCS8qIGZyZWUgdGhlIFBHRXZlbnQgYXJyYXkg Ki8KKyAJaWYgKGNvbm4tPmV2ZW50cykKKyAJeworIAkJZnJlZShjb25uLT5ldmVudHMpOwor IAkJY29ubi0+ZXZlbnRzID0gTlVMTDsKKyAJCWNvbm4tPm5FdmVudHMgPSBjb25uLT5ldmVu dEFyclNpemUgPSAwOworIAl9CisgCiAgCWlmIChjb25uLT5wZ2hvc3QpCiAgCQlmcmVlKGNv bm4tPnBnaG9zdCk7CiAgCWlmIChjb25uLT5wZ2hvc3RhZGRyKQogIAkJZnJlZShjb25uLT5w Z2hvc3RhZGRyKTsKICAJaWYgKGNvbm4tPnBncG9ydCkKICAJCWZyZWUoY29ubi0+cGdwb3J0 KTsKKioqKioqKioqKioqKioqCioqKiAyMTUyLDIxNjUgKioqKgogIFBRcmVzZXQoUEdjb25u ICpjb25uKQogIHsKICAJaWYgKGNvbm4pCiAgCXsKICAJCWNsb3NlUEdjb25uKGNvbm4pOwog IAohIAkJaWYgKGNvbm5lY3REQlN0YXJ0KGNvbm4pKQohIAkJCSh2b2lkKSBjb25uZWN0REJD b21wbGV0ZShjb25uKTsKICAJfQogIH0KICAKICAKICAvKgogICAqIFBRcmVzZXRTdGFydDoK LS0tIDIxNzIsMjIwNyAtLS0tCiAgUFFyZXNldChQR2Nvbm4gKmNvbm4pCiAgewogIAlpZiAo Y29ubikKICAJewogIAkJY2xvc2VQR2Nvbm4oY29ubik7CiAgCiEgCQlpZiAoY29ubmVjdERC U3RhcnQoY29ubikgJiYgY29ubmVjdERCQ29tcGxldGUoY29ubikpCiEgCQl7CiEgCQkJaW50 IGk7CiEgCQkJUEdFdmVudENvbm5SZXNldCBldnQ7CiEgCiEgCQkJZm9yIChpID0gMDsgaSA8 IGNvbm4tPm5FdmVudHM7IGkrKykKISAJCQl7CiEgCQkJCWV2dC5jb25uID0gY29ubjsKISAK ISAJCQkJaWYgKCFjb25uLT5ldmVudHNbaV0ucHJvYyhQR0VWVF9DT05OUkVTRVQsICZldnQp KQohIAkJCQl7CiEgCQkJCQljb25uLT5zdGF0dXMgPSBDT05ORUNUSU9OX0JBRDsKISAJCQkJ CWlmIChjb25uLT5ldmVudHNbaV0ubmFtZSkKISAJCQkJCQlwcmludGZQUUV4cEJ1ZmZlcigm Y29ubi0+ZXJyb3JNZXNzYWdlLAohIAkJCQkJCQlsaWJwcV9nZXR0ZXh0KCJQR0V2ZW50UHJv YyBcIiVzXCIgZmFpbGVkIGR1cmluZyBQR0VWVF9DT05OUkVTRVQgZXZlbnRcbiIpLAohIAkJ CQkJCQljb25uLT5ldmVudHNbaV0ubmFtZSk7CiEgCQkJCQllbHNlCiEgCQkJCQkJcHJpbnRm UFFFeHBCdWZmZXIoJmNvbm4tPmVycm9yTWVzc2FnZSwKISAJCQkJCQkJbGlicHFfZ2V0dGV4 dCgiUEdFdmVudFByb2MgXCJhZGRyOiVwXCIgZmFpbGVkIGR1cmluZyBQR0VWVF9DT05OUkVT RVQgZXZlbnRcbiIpLAohIAkJCQkJCQljb25uLT5ldmVudHNbaV0ucHJvYyk7CiEgCQkJCQli cmVhazsKISAJCQkJfQohIAkJCX0KISAJCX0KICAJfQogIH0KICAKICAKICAvKgogICAqIFBR cmVzZXRTdGFydDoKKioqKioqKioqKioqKioqCioqKiAyMTg3LDIxOTkgKioqKgogICAqIGNs b3NlcyB0aGUgZXhpc3RpbmcgY29ubmVjdGlvbiBhbmQgbWFrZXMgYSBuZXcgb25lCiAgICov CiAgUG9zdGdyZXNQb2xsaW5nU3RhdHVzVHlwZQogIFBRcmVzZXRQb2xsKFBHY29ubiAqY29u bikKICB7CiAgCWlmIChjb25uKQohIAkJcmV0dXJuIFBRY29ubmVjdFBvbGwoY29ubik7CiAg CiAgCXJldHVybiBQR1JFU19QT0xMSU5HX0ZBSUxFRDsKICB9CiAgCiAgLyoKICAgKiBQUWNh bmNlbEdldDogZ2V0IGEgUEdjYW5jZWwgc3RydWN0dXJlIGNvcnJlc3BvbmRpbmcgdG8gYSBj b25uZWN0aW9uLgotLS0gMjIyOSwyMjcwIC0tLS0KICAgKiBjbG9zZXMgdGhlIGV4aXN0aW5n IGNvbm5lY3Rpb24gYW5kIG1ha2VzIGEgbmV3IG9uZQogICAqLwogIFBvc3RncmVzUG9sbGlu Z1N0YXR1c1R5cGUKICBQUXJlc2V0UG9sbChQR2Nvbm4gKmNvbm4pCiAgewogIAlpZiAoY29u bikKISAJewohIAkJUG9zdGdyZXNQb2xsaW5nU3RhdHVzVHlwZSBzdGF0dXMgPSBQUWNvbm5l Y3RQb2xsKGNvbm4pOwohIAohIAkJaWYgKHN0YXR1cyA9PSBQR1JFU19QT0xMSU5HX09LKQoh IAkJewohIAkJCWludCBpOwohIAkJCVBHRXZlbnRDb25uUmVzZXQgZXZ0OwohIAohIAkJCWZv ciAoaSA9IDA7IGkgPCBjb25uLT5uRXZlbnRzOyBpKyspCiEgCQkJewohIAkJCQlldnQuY29u biA9IGNvbm47CiEgCiEgCQkJCWlmICghY29ubi0+ZXZlbnRzW2ldLnByb2MoUEdFVlRfQ09O TlJFU0VULCAmZXZ0KSkKISAJCQkJewohIAkJCQkJY29ubi0+c3RhdHVzID0gQ09OTkVDVElP Tl9CQUQ7CiEgCQkJCQlpZiAoY29ubi0+ZXZlbnRzW2ldLm5hbWUpCiEgCQkJCQkJcHJpbnRm UFFFeHBCdWZmZXIoJmNvbm4tPmVycm9yTWVzc2FnZSwKISAJCQkJCQkJbGlicHFfZ2V0dGV4 dCgiUEdFdmVudFByb2MgXCIlc1wiIGZhaWxlZCBkdXJpbmcgUEdFVlRfQ09OTlJFU0VUIGV2 ZW50XG4iKSwKISAJCQkJCQkJY29ubi0+ZXZlbnRzW2ldLm5hbWUpOwohIAkJCQkJZWxzZQoh IAkJCQkJCXByaW50ZlBRRXhwQnVmZmVyKCZjb25uLT5lcnJvck1lc3NhZ2UsCiEgCQkJCQkJ CWxpYnBxX2dldHRleHQoIlBHRXZlbnRQcm9jIFwiYWRkcjolcFwiIGZhaWxlZCBkdXJpbmcg UEdFVlRfQ09OTlJFU0VUIGV2ZW50XG4iKSwKISAJCQkJCQkJY29ubi0+ZXZlbnRzW2ldLnBy b2MpOwohIAkJCQkJcmV0dXJuIFBHUkVTX1BPTExJTkdfRkFJTEVEOwohIAkJCQl9CiEgCQkJ fQohIAkJfQohIAohIAkJcmV0dXJuIHN0YXR1czsKISAJfQogIAogIAlyZXR1cm4gUEdSRVNf UE9MTElOR19GQUlMRUQ7CiAgfQogIAogIC8qCiAgICogUFFjYW5jZWxHZXQ6IGdldCBhIFBH Y2FuY2VsIHN0cnVjdHVyZSBjb3JyZXNwb25kaW5nIHRvIGEgY29ubmVjdGlvbi4KSW5kZXg6 IHNyYy9pbnRlcmZhY2VzL2xpYnBxL2ZlLWV4ZWMuYwo9PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJDUyBmaWxl OiAvcHJvamVjdHMvY3Zzcm9vdC9wZ3NxbC9zcmMvaW50ZXJmYWNlcy9saWJwcS9mZS1leGVj LmMsdgpyZXRyaWV2aW5nIHJldmlzaW9uIDEuMTk2CmRpZmYgLUM2IC1yMS4xOTYgZmUtZXhl Yy5jCioqKiBzcmMvaW50ZXJmYWNlcy9saWJwcS9mZS1leGVjLmMJMjMgSnVuIDIwMDggMjE6 MTA6NDkgLTAwMDAJMS4xOTYKLS0tIHNyYy9pbnRlcmZhY2VzL2xpYnBxL2ZlLWV4ZWMuYwkz IFNlcCAyMDA4IDIxOjU1OjA3IC0wMDAwCioqKioqKioqKioqKioqKgoqKiogNjAsNzIgKioq KgogIAkJCQlpbnQgcmVzdWx0Rm9ybWF0KTsKICBzdGF0aWMgdm9pZCBwYXJzZUlucHV0KFBH Y29ubiAqY29ubik7CiAgc3RhdGljIGJvb2wgUFFleGVjU3RhcnQoUEdjb25uICpjb25uKTsK ICBzdGF0aWMgUEdyZXN1bHQgKlBRZXhlY0ZpbmlzaChQR2Nvbm4gKmNvbm4pOwogIHN0YXRp YyBpbnQgUFFzZW5kRGVzY3JpYmUoUEdjb25uICpjb25uLCBjaGFyIGRlc2NfdHlwZSwKICAJ CQkgICBjb25zdCBjaGFyICpkZXNjX3RhcmdldCk7CiEgCiAgCiAgLyogLS0tLS0tLS0tLS0t LS0tLQogICAqIFNwYWNlIG1hbmFnZW1lbnQgZm9yIFBHcmVzdWx0LgogICAqCiAgICogRm9y bWVybHksIGxpYnBxIGRpZCBhIHNlcGFyYXRlIG1hbGxvYygpIGZvciBlYWNoIGZpZWxkIG9m IGVhY2ggdHVwbGUKICAgKiByZXR1cm5lZCBieSBhIHF1ZXJ5LiAgVGhpcyB3YXMgcmVtYXJr YWJseSBleHBlbnNpdmUgLS0tIG1hbGxvYy9mcmVlCi0tLSA2MCw3MiAtLS0tCiAgCQkJCWlu dCByZXN1bHRGb3JtYXQpOwogIHN0YXRpYyB2b2lkIHBhcnNlSW5wdXQoUEdjb25uICpjb25u KTsKICBzdGF0aWMgYm9vbCBQUWV4ZWNTdGFydChQR2Nvbm4gKmNvbm4pOwogIHN0YXRpYyBQ R3Jlc3VsdCAqUFFleGVjRmluaXNoKFBHY29ubiAqY29ubik7CiAgc3RhdGljIGludCBQUXNl bmREZXNjcmliZShQR2Nvbm4gKmNvbm4sIGNoYXIgZGVzY190eXBlLAogIAkJCSAgIGNvbnN0 IGNoYXIgKmRlc2NfdGFyZ2V0KTsKISBzdGF0aWMgaW50IGNoZWNrX2ZpZWxkX251bWJlcihj b25zdCBQR3Jlc3VsdCAqcmVzLCBpbnQgZmllbGRfbnVtKTsKICAKICAvKiAtLS0tLS0tLS0t LS0tLS0tCiAgICogU3BhY2UgbWFuYWdlbWVudCBmb3IgUEdyZXN1bHQuCiAgICoKICAgKiBG b3JtZXJseSwgbGlicHEgZGlkIGEgc2VwYXJhdGUgbWFsbG9jKCkgZm9yIGVhY2ggZmllbGQg b2YgZWFjaCB0dXBsZQogICAqIHJldHVybmVkIGJ5IGEgcXVlcnkuICBUaGlzIHdhcyByZW1h cmthYmx5IGV4cGVuc2l2ZSAtLS0gbWFsbG9jL2ZyZWUKKioqKioqKioqKioqKioqCioqKiAx MjEsMTQxICoqKioKLS0tIDEyMSwxNzEgLS0tLQogICNkZWZpbmUgUEdSRVNVTFRfREFUQV9C TE9DS1NJWkUJCTIwNDgKICAjZGVmaW5lIFBHUkVTVUxUX0FMSUdOX0JPVU5EQVJZCQlNQVhJ TVVNX0FMSUdOT0YJCS8qIGZyb20gY29uZmlndXJlICovCiAgI2RlZmluZSBQR1JFU1VMVF9C TE9DS19PVkVSSEVBRAkJTWF4KHNpemVvZihQR3Jlc3VsdF9kYXRhKSwgUEdSRVNVTFRfQUxJ R05fQk9VTkRBUlkpCiAgI2RlZmluZSBQR1JFU1VMVF9TRVBfQUxMT0NfVEhSRVNIT0xECShQ R1JFU1VMVF9EQVRBX0JMT0NLU0laRSAvIDIpCiAgCiAgCisgLyogRG9lcyBub3QgZHVwbGlj YXRlIHRoZSBldmVudCBpbnN0YW5jZSBkYXRhLCBzZXRzIHRoaXMgdG8gTlVMTCAqLworIHN0 YXRpYyBQR0V2ZW50ICoKKyBkdXBFdmVudHMoUEdFdmVudCAqZXZlbnRzLCBpbnQgY291bnQp CisgeworIAlpbnQgaTsKKyAJUEdFdmVudCAqbmV3RXZlbnRzOworIAorIAlpZiAoIWV2ZW50 cyB8fCBjb3VudCA8PSAwKQorIAkJcmV0dXJuIE5VTEw7CisgCisgCW5ld0V2ZW50cyA9IChQ R0V2ZW50ICopIG1hbGxvYyhjb3VudCAqIHNpemVvZihQR0V2ZW50KSk7CisgCWlmICghbmV3 RXZlbnRzKQorIAkJcmV0dXJuIE5VTEw7CisgCisgCW1lbWNweShuZXdFdmVudHMsIGV2ZW50 cywgY291bnQgKiBzaXplb2YoUEdFdmVudCkpOworIAorIAkvKiBOVUxMIG91dCB0aGUgZGF0 YSBwb2ludGVyIGFuZCBkZWVwIGNvcHkgbmFtZSAqLworIAlmb3IgKGkgPSAwOyBpIDwgY291 bnQ7IGkrKykKKyAJeworIAkJaWYgKG5ld0V2ZW50c1tpXS5uYW1lKQorIAkJCW5ld0V2ZW50 c1tpXS5uYW1lID0gc3RyZHVwKG5ld0V2ZW50c1tpXS5uYW1lKTsKKyAJCW5ld0V2ZW50c1tp XS5kYXRhID0gTlVMTDsKKyAJfQorIAorIAlyZXR1cm4gbmV3RXZlbnRzOworIH0KKyAKICAv KgogICAqIFBRbWFrZUVtcHR5UEdyZXN1bHQKICAgKgkgcmV0dXJucyBhIG5ld2x5IGFsbG9j YXRlZCwgaW5pdGlhbGl6ZWQgUEdyZXN1bHQgd2l0aCBnaXZlbiBzdGF0dXMuCiAgICoJIElm IGNvbm4gaXMgbm90IE5VTEwgYW5kIHN0YXR1cyBpbmRpY2F0ZXMgYW4gZXJyb3IsIHRoZSBj b25uJ3MKICAgKgkgZXJyb3JNZXNzYWdlIGlzIGNvcGllZC4KICAgKgogICAqIE5vdGUgdGhp cyBpcyBleHBvcnRlZCAtLS0geW91IHdvdWxkbid0IHRoaW5rIGFuIGFwcGxpY2F0aW9uIHdv dWxkIG5lZWQKICAgKiB0byBidWlsZCBpdHMgb3duIFBHcmVzdWx0cywgYnV0IHRoaXMgaGFz IHByb3ZlbiB1c2VmdWwgaW4gYm90aCBsaWJwZ3RjbAogICAqIGFuZCB0aGUgUGVybDUgaW50 ZXJmYWNlLCBzbyBtYXliZSBpdCdzIG5vdCBzbyB1bnJlYXNvbmFibGUuCisgICoKKyAgKiBV cGRhdGVkIEFwcmlsIDIwMDggLSBJZiBjb25uIGlzIG5vdCBOVUxMLCBldmVudCBzdGF0ZXMg d2lsbCBiZSBjb3BpZWQKKyAgKiBmcm9tIHRoZSBQR2Nvbm4gdG8gdGhlIGNyZWF0ZWQgUEdy ZXN1bHQuCiAgICovCiAgCiAgUEdyZXN1bHQgKgogIFBRbWFrZUVtcHR5UEdyZXN1bHQoUEdj b25uICpjb25uLCBFeGVjU3RhdHVzVHlwZSBzdGF0dXMpCiAgewogIAlQR3Jlc3VsdCAgICpy ZXN1bHQ7CioqKioqKioqKioqKioqKgoqKiogMTU3LDE3NSAqKioqCi0tLSAxODcsMjIwIC0t LS0KICAJcmVzdWx0LT5lcnJNc2cgPSBOVUxMOwogIAlyZXN1bHQtPmVyckZpZWxkcyA9IE5V TEw7CiAgCXJlc3VsdC0+bnVsbF9maWVsZFswXSA9ICdcMCc7CiAgCXJlc3VsdC0+Y3VyQmxv Y2sgPSBOVUxMOwogIAlyZXN1bHQtPmN1ck9mZnNldCA9IDA7CiAgCXJlc3VsdC0+c3BhY2VM ZWZ0ID0gMDsKKyAJcmVzdWx0LT5uRXZlbnRzID0gMDsKKyAJcmVzdWx0LT5ldmVudHMgPSBO VUxMOwogIAogIAlpZiAoY29ubikKICAJewogIAkJLyogY29weSBjb25uZWN0aW9uIGRhdGEg d2UgbWlnaHQgbmVlZCBmb3Igb3BlcmF0aW9ucyBvbiBQR3Jlc3VsdCAqLwogIAkJcmVzdWx0 LT5ub3RpY2VIb29rcyA9IGNvbm4tPm5vdGljZUhvb2tzOwogIAkJcmVzdWx0LT5jbGllbnRf ZW5jb2RpbmcgPSBjb25uLT5jbGllbnRfZW5jb2Rpbmc7CiAgCisgCQkvKiBjb3B5IGV2ZW50 cyBmcm9tIGNvbm5lY3Rpb24gKi8KKyAJCWlmIChjb25uLT5uRXZlbnRzID4gMCkKKyAJCXsK KyAJCQlyZXN1bHQtPmV2ZW50cyA9IGR1cEV2ZW50cyhjb25uLT5ldmVudHMsIGNvbm4tPm5F dmVudHMpOworIAkJCWlmICghcmVzdWx0LT5ldmVudHMpCisgCQkJeworIAkJCQlQUWNsZWFy KHJlc3VsdCk7CisgCQkJCXJldHVybiBOVUxMOworIAkJCX0KKyAKKyAJCQlyZXN1bHQtPm5F dmVudHMgPSBjb25uLT5uRXZlbnRzOworIAkJfQorIAogIAkJLyogY29uc2lkZXIgY29weWlu ZyBjb25uJ3MgZXJyb3JNZXNzYWdlICovCiAgCQlzd2l0Y2ggKHN0YXR1cykKICAJCXsKICAJ CQljYXNlIFBHUkVTX0VNUFRZX1FVRVJZOgogIAkJCWNhc2UgUEdSRVNfQ09NTUFORF9PSzoK ICAJCQljYXNlIFBHUkVTX1RVUExFU19PSzoKKioqKioqKioqKioqKioqCioqKiAxOTIsMjAz ICoqKioKLS0tIDIzNyw0OTYgLS0tLQogIAkJcmVzdWx0LT5jbGllbnRfZW5jb2RpbmcgPSBQ R19TUUxfQVNDSUk7CiAgCX0KICAKICAJcmV0dXJuIHJlc3VsdDsKICB9CiAgCisgLyogUFFz ZXRSZXN1bHRBdHRycworICAqIFNldCB0aGUgYXR0cmlidXRlcyBmb3IgYSBnaXZlbiByZXN1 bHQuICBUaGlzIGZ1bmN0aW9uIGZhaWxzIGlmIHRoZXJlIGFyZQorICAqIGFscmVhZHkgYXR0 cmlidXRlcyBjb250YWluZWQgaW4gdGhlIHByb3ZpZGVkIHJlc3VsdC4gIFRoZSBjYWxsIGlz CisgICogaWdub3JlZCBpZiBudW1BdHRyaWJ1dGVzIGlzIGlzIHplcm8gb3IgYXR0RGVzY3Mg aXMgTlVMTC4gIElmIHRoZQorICAqIGZ1bmN0aW9uIGZhaWxzLCBpdCByZXR1cm5zIHplcm8u ICBJZiB0aGUgZnVuY3Rpb24gc3VjY2VlZHMsIGl0CisgICogcmV0dXJucyBhIG5vbi16ZXJv IHZhbHVlLgorICAqLworIGludAorIFBRc2V0UmVzdWx0QXR0cnMoUEdyZXN1bHQgKnJlcywg aW50IG51bUF0dHJpYnV0ZXMsIFBHcmVzQXR0RGVzYyAqYXR0RGVzY3MpCisgeworIAlpbnQg aTsKKyAKKyAJLyogSWYgYXR0cnMgYWxyZWFkeSBleGlzdCwgdGhleSBjYW5ub3QgYmUgb3Zl cndyaXR0ZW4uICovCisgCWlmICghcmVzIHx8IHJlcy0+bnVtQXR0cmlidXRlcyA+IDApCisg CQlyZXR1cm4gRkFMU0U7CisgCisgCS8qIGlnbm9yZSByZXF1ZXN0ICovCisgCWlmIChudW1B dHRyaWJ1dGVzIDw9IDAgfHwgIWF0dERlc2NzKQorIAkJcmV0dXJuIFRSVUU7CisgCisgCXJl cy0+YXR0RGVzY3MgPSAoUEdyZXNBdHREZXNjICopIFBRcmVzdWx0QWxsb2MocmVzLAorIAkJ bnVtQXR0cmlidXRlcyAqIHNpemVvZihQR3Jlc0F0dERlc2MpKTsKKyAKKyAJaWYgKCFyZXMt PmF0dERlc2NzKQorIAkJcmV0dXJuIEZBTFNFOworIAorIAlyZXMtPm51bUF0dHJpYnV0ZXMg PSBudW1BdHRyaWJ1dGVzOworIAltZW1jcHkocmVzLT5hdHREZXNjcywgYXR0RGVzY3MsCisg CQludW1BdHRyaWJ1dGVzICogc2l6ZW9mKFBHcmVzQXR0RGVzYykpOworIAorIAkvKiByZXN1 bHRhbGxvYyB0aGUgYXR0cmlidXRlIG5hbWVzLiAgVGhlIGFib3ZlIG1lbWNweSBoYXMgdGhl IGF0dHIKKyAJICogbmFtZXMgcG9pbnRpbmcgYXQgdGhlIHNvdXJjZSByZXN1bHQncyBwcml2 YXRlIG1lbW9yeSAob3IgYXQgdGhlCisgCSAqIGNhbGxlcnMgcHJvdmlkZWQgYXR0RGVzY3Mg bWVtb3J5KS4KKyAJICovCisgCXJlcy0+YmluYXJ5ID0gMTsKKyAJZm9yIChpID0gMDsgaSA8 IHJlcy0+bnVtQXR0cmlidXRlczsgaSsrKQorIAl7CisgCQlpZiAocmVzLT5hdHREZXNjc1tp XS5uYW1lKQorIAkJCXJlcy0+YXR0RGVzY3NbaV0ubmFtZSA9IHBxUmVzdWx0U3RyZHVwKHJl cywgcmVzLT5hdHREZXNjc1tpXS5uYW1lKTsKKyAJCWVsc2UKKyAJCQlyZXMtPmF0dERlc2Nz W2ldLm5hbWUgPSByZXMtPm51bGxfZmllbGQ7CisgCisgCQlpZiAoIXJlcy0+YXR0RGVzY3Nb aV0ubmFtZSkKKyAJCQlyZXR1cm4gRkFMU0U7CisgCisgCQkvKiBBbHRob3VnaCBkZXByZWNh dGVkLCBiZWNhdXNlIHJlc3VsdHMgY2FuIGhhdmUgdGV4dCtiaW5hcnkgY29sdW1ucywKKyAJ CSAqIGl0cyBlYXN5IGVub3VnaCB0byBkZWR1Y2Ugc28gc2V0IGl0IGZvciBjb21wbGV0ZW5l c3MuCisgCQkgKi8KKyAJCWlmIChyZXMtPmF0dERlc2NzW2ldLmZvcm1hdCA9PSAwKQorIAkJ CXJlcy0+YmluYXJ5ID0gMDsKKyAJfQorIAorIAlyZXR1cm4gVFJVRTsKKyB9CisgCisgLyoK KyAgKiBQUWNvcHlSZXN1bHQKKyAgKiBSZXR1cm5zIGEgZGVlcCBjb3B5IG9mIHRoZSBwcm92 aWRlZCAnc3JjJyBQR3Jlc3VsdCwgd2hpY2ggY2Fubm90IGJlIE5VTEwuCisgICogVGhlICdv cHRpb25zJyBhcmd1bWVudCBjb250cm9scyB3aGljaCBwb3J0aW9ucyBvZiB0aGUgcmVzdWx0 IHdpbGwgb3Igd2lsbAorICAqIE5PVCBiZSBjb3BpZWQuICBUaGUgY3JlYXRlZCByZXN1bHQg aXMgYWx3YXlzIHB1dCBpbnRvIHRoZQorICAqIFBHUkVTX1RVUExFU19PSyBzdGF0dXMuICBU aGUgc291cmNlIHJlc3VsdCBlcnJvciBtZXNzYWdlIGlzIG5vdCBjb3BpZWQsCisgICogYWx0 aG91Z2ggY21kU3RhdHVzIGlzLgorICAqCisgICogVG8gc2V0IGN1c3RvbSBhdHRyaWJ1dGVz LCBzZWUgUFFzZXRSZXN1bHRBdHRycy4gIFRoYXQgZnVuY3Rpb24gcmVxdWlyZXMKKyAgKiB0 aGF0IHRoZXJlIGFyZSBubyBhdHRycyBjb250YWluZWQgaW4gdGhlIHJlc3VsdCwgc28gdG8g dXNlIHRoYXQKKyAgKiBmdW5jdGlvbiB5b3UgY2Fubm90IHVzZSB0aGUgUEdfQ09QWVJFU19B VFRSUyBvciBQR19DT1BZUkVTX1RVUExFUworICAqIG9wdGlvbnMgd2l0aCB0aGlzIGZ1bmN0 aW9uLgorICAqCisgICogT3B0aW9uczoKKyAgKiAgIFBHX0NPUFlSRVNfQVRUUlMgLSBDb3B5 IHRoZSBzb3VyY2UgcmVzdWx0J3MgYXR0cmlidXRlcworICAqCisgICogICBQR19DT1BZUkVT X1RVUExFUyAtIENvcHkgdGhlIHNvdXJjZSByZXN1bHQncyB0dXBsZXMuICBUaGlzIGltcGxp ZXMKKyAgKiAgIGNvcHlpbmcgdGhlIGF0dHJzLCBiZWluZyBob3cgdGhlIGF0dHJzIGFyZSBu ZWVkZWQgYnkgdGhlIHR1cGxlcy4KKyAgKgorICAqICAgUEdfQ09QWVJFU19FVkVOVFMgLSBD b3B5IHRoZSBzb3VyY2UgcmVzdWx0J3MgZXZlbnRzLgorICAqCisgICogICBQR19DT1BZUkVT X05PVElDRUhPT0tTIC0gQ29weSB0aGUgc291cmNlIHJlc3VsdCdzIG5vdGljZSBob29rcy4K KyAgKi8KKyAKKyBQR3Jlc3VsdCAqCisgUFFjb3B5UmVzdWx0KGNvbnN0IFBHcmVzdWx0ICpz cmMsIGludCBvcHRpb25zKQorIHsKKyAJaW50IGk7CisgCVBHcmVzdWx0ICpkZXN0OworIAlQ R0V2ZW50UmVzdWx0Q29weSBldnQ7CisgCisgCWlmICghc3JjKQorIAkJcmV0dXJuIE5VTEw7 CisgCisgCS8qIEF1dG9tYXRpY2FsbHkgdHVybiBvbiBhdHRycyBvcHRpb25zIGJlY2F1c2Ug eW91IGNhbid0IGNvcHkgdHVwbGVzCisgCSAqIHdpdGhvdXQgY29weWluZyB0aGUgYXR0cnMu ICBfVFVQTEVTIGltcGxpZXMgX0FUVFJTLgorIAkgKi8KKyAJaWYgKG9wdGlvbnMgJiBQR19D T1BZUkVTX1RVUExFUykKKyAJCW9wdGlvbnMgfD0gUEdfQ09QWVJFU19BVFRSUzsKKyAKKyAJ ZGVzdCA9IFBRbWFrZUVtcHR5UEdyZXN1bHQoKFBHY29ubiAqKU5VTEwsIFBHUkVTX1RVUExF U19PSyk7CisgCWlmICghZGVzdCkKKyAJCXJldHVybiBOVUxMOworIAorIAkvKiBhbHdheXMg Y29weSB0aGVzZSBvdmVyLiAgSXMgY21kU3RhdHVzIHVzZWZ1bCBoZXJlPyAqLworIAlkZXN0 LT5jbGllbnRfZW5jb2RpbmcgPSBzcmMtPmNsaWVudF9lbmNvZGluZzsKKyAJc3RyY3B5KGRl c3QtPmNtZFN0YXR1cywgc3JjLT5jbWRTdGF0dXMpOworIAorIAkvKiBXYW50cyB0byBjb3B5 IG5vdGljZSBob29rcyAqLworIAlpZiAob3B0aW9ucyAmIFBHX0NPUFlSRVNfTk9USUNFSE9P S1MpCisgCQlkZXN0LT5ub3RpY2VIb29rcyA9IHNyYy0+bm90aWNlSG9va3M7CisgCisgCS8q IFdhbnRzIGF0dHJzICovCisgCWlmICgob3B0aW9ucyAmIFBHX0NPUFlSRVNfQVRUUlMpICYm CisgCQkgIVBRc2V0UmVzdWx0QXR0cnMoZGVzdCwgc3JjLT5udW1BdHRyaWJ1dGVzLCBzcmMt PmF0dERlc2NzKSkKKyAJeworIAkJUFFjbGVhcihkZXN0KTsKKyAJCXJldHVybiBOVUxMOwor IAl9CisgCisgCS8qIFdhbnRzIHRvIGNvcHkgcmVzdWx0IHR1cGxlczogdXNlIFBRc2V0dmFs dWUoKS4gKi8KKyAJaWYgKChvcHRpb25zICYgUEdfQ09QWVJFU19UVVBMRVMpICYmIHNyYy0+ bnR1cHMgPiAwKQorIAl7CisgCQlpbnQgdHVwLCBmaWVsZDsKKyAJCWZvciAodHVwID0gMDsg dHVwIDwgc3JjLT5udHVwczsgdHVwKyspCisgCQkJZm9yIChmaWVsZCA9IDA7IGZpZWxkIDwg c3JjLT5udW1BdHRyaWJ1dGVzOyBmaWVsZCsrKQorIAkJCQlQUXNldHZhbHVlKGRlc3QsIHR1 cCwgZmllbGQsIHNyYy0+dHVwbGVzW3R1cF1bZmllbGRdLnZhbHVlLAorIAkJCQkJc3JjLT50 dXBsZXNbdHVwXVtmaWVsZF0ubGVuKTsKKyAJfQorIAorIAkvKiBXYW50cyB0byBjb3B5IFBH RXZlbnRzLiAqLworIAlpZiAoKG9wdGlvbnMgJiBQR19DT1BZUkVTX0VWRU5UUykgJiYgc3Jj LT5uRXZlbnRzID4gMCkKKyAJeworIAkJZGVzdC0+ZXZlbnRzID0gZHVwRXZlbnRzKHNyYy0+ ZXZlbnRzLCBzcmMtPm5FdmVudHMpOworIAkJaWYgKCFkZXN0LT5ldmVudHMpCisgCQl7Cisg CQkJUFFjbGVhcihkZXN0KTsKKyAJCQlyZXR1cm4gTlVMTDsKKyAJCX0KKyAKKyAJCWRlc3Qt Pm5FdmVudHMgPSBzcmMtPm5FdmVudHM7CisgCX0KKyAKKyAJLyogVHJpZ2dlciBQR0VWVF9S RVNVTFRDT1BZIGV2ZW50ICovCisgCWZvciAoaSA9IDA7IGkgPCBkZXN0LT5uRXZlbnRzOyBp KyspCisgCXsKKyAJCWV2dC5zcmMgPSBzcmM7CisgCQlldnQuZGVzdCA9IGRlc3Q7CisgCQlp ZiAoIWRlc3QtPmV2ZW50c1tpXS5wcm9jKFBHRVZUX1JFU1VMVENPUFksICZldnQpKQorIAkJ eworIAkJCVBRY2xlYXIoZGVzdCk7CisgCQkJcmV0dXJuIE5VTEw7CisgCQl9CisgCX0KKyAK KyAJcmV0dXJuIGRlc3Q7CisgfQorIAorIGludAorIFBRc2V0dmFsdWUoUEdyZXN1bHQgKnJl cywgaW50IHR1cF9udW0sIGludCBmaWVsZF9udW0sCisgCWNoYXIgKnZhbHVlLCBpbnQgbGVu KQorIHsKKyAJUEdyZXNBdHRWYWx1ZSAqYXR0dmFsOworIAorIAlpZiAoIWNoZWNrX2ZpZWxk X251bWJlcihyZXMsIGZpZWxkX251bSkpCisgCQlyZXR1cm4gRkFMU0U7CisgCisgCS8qIElu dmFsaWQgdHVwX251bSwgbXVzdCBiZSA8PSBudHVwcyAqLworIAlpZiAodHVwX251bSA+IHJl cy0+bnR1cHMpCisgCQlyZXR1cm4gRkFMU0U7CisgCisgCS8qIG5lZWQgdG8gZ3JvdyB0aGUg dHVwbGUgdGFibGUgKi8KKyAJaWYgKHJlcy0+bnR1cHMgPj0gcmVzLT50dXBBcnJTaXplKQor IAl7CisgCQlpbnQgbiA9IHJlcy0+dHVwQXJyU2l6ZSA/IHJlcy0+dHVwQXJyU2l6ZSAqIDIg OiAxMjg7CisgCQlQR3Jlc0F0dFZhbHVlICoqdHVwczsKKyAKKyAJCWlmIChyZXMtPnR1cGxl cykKKyAJCQl0dXBzID0gKFBHcmVzQXR0VmFsdWUgKiopIHJlYWxsb2MocmVzLT50dXBsZXMs IG4gKiBzaXplb2YoUEdyZXNBdHRWYWx1ZSAqKSk7CisgCQllbHNlCisgCQkJdHVwcyA9IChQ R3Jlc0F0dFZhbHVlICoqKSBtYWxsb2MobiAqIHNpemVvZihQR3Jlc0F0dFZhbHVlICopKTsK KyAKKyAJCWlmICghdHVwcykKKyAJCQlyZXR1cm4gRkFMU0U7CisgCisgCQltZW1zZXQodHVw cyArIHJlcy0+dHVwQXJyU2l6ZSwgMCwKKyAJCQkobiAtIHJlcy0+dHVwQXJyU2l6ZSkgKiBz aXplb2YoUEdyZXNBdHRWYWx1ZSAqKSk7CisgCQlyZXMtPnR1cGxlcyA9IHR1cHM7CisgCQly ZXMtPnR1cEFyclNpemUgPSBuOworIAl9CisgCisgCS8qIG5lZWQgdG8gYWxsb2NhdGUgYSBu ZXcgdHVwbGUgKi8KKyAJaWYgKHR1cF9udW0gPT0gcmVzLT5udHVwcyAmJiAhcmVzLT50dXBs ZXNbdHVwX251bV0pCisgCXsKKyAJCWludCBpOworIAkJUEdyZXNBdHRWYWx1ZSAqdHVwOwor IAorIAkJdHVwID0gKFBHcmVzQXR0VmFsdWUgKikgcHFSZXN1bHRBbGxvYyhyZXMsCisgCQkJ cmVzLT5udW1BdHRyaWJ1dGVzICogc2l6ZW9mKFBHcmVzQXR0VmFsdWUpLCBUUlVFKTsKKyAK KyAJCWlmICghdHVwKQorIAkJCXJldHVybiBGQUxTRTsKKyAKKyAJCS8qIGluaXRpYWxpemUg ZWFjaCBjb2x1bW4gdG8gTlVMTCAqLworIAkJZm9yIChpID0gMDsgaSA8IHJlcy0+bnVtQXR0 cmlidXRlczsgaSsrKQorIAkJeworIAkJCXR1cFtpXS5sZW4gPSBOVUxMX0xFTjsKKyAJCQl0 dXBbaV0udmFsdWUgPSByZXMtPm51bGxfZmllbGQ7CisgCQl9CisgCisgCQlyZXMtPnR1cGxl c1t0dXBfbnVtXSA9IHR1cDsKKyAJCXJlcy0+bnR1cHMrKzsKKyAJfQorIAorIAlhdHR2YWwg PSAmcmVzLT50dXBsZXNbdHVwX251bV1bZmllbGRfbnVtXTsKKyAKKyAJLyogT24gdG9wIG9m IE5VTExfTEVOLCB0cmVhdCBhIE5VTEwgdmFsdWUgYXMgYSBOVUxMIGZpZWxkICovCisgCWlm IChsZW4gPT0gTlVMTF9MRU4gfHwgdmFsdWUgPT0gTlVMTCkKKyAJeworIAkJYXR0dmFsLT5s ZW4gPSBOVUxMX0xFTjsKKyAJCWF0dHZhbC0+dmFsdWUgPSByZXMtPm51bGxfZmllbGQ7Cisg CX0KKyAJZWxzZQorIAl7CisgCQlpZiAobGVuIDwgMCkKKyAJCQlsZW4gPSAwOworIAorIAkJ aWYgKGxlbiA9PSAwKQorIAkJeworIAkJCWF0dHZhbC0+bGVuID0gMDsKKyAJCQlhdHR2YWwt PnZhbHVlID0gcmVzLT5udWxsX2ZpZWxkOworIAkJfQorIAkJZWxzZQorIAkJeworIAkJCWF0 dHZhbC0+dmFsdWUgPSAoY2hhciAqKSBQUXJlc3VsdEFsbG9jKHJlcywgbGVuICsgMSk7Cisg CQkJaWYgKCFhdHR2YWwtPnZhbHVlKQorIAkJCQlyZXR1cm4gRkFMU0U7CisgCisgCQkJYXR0 dmFsLT5sZW4gPSBsZW47CisgCQkJbWVtY3B5KGF0dHZhbC0+dmFsdWUsIHZhbHVlLCBsZW4p OworIAkJCWF0dHZhbC0+dmFsdWVbbGVuXSA9ICdcMCc7CisgCQl9CisgCX0KKyAKKyAJcmV0 dXJuIFRSVUU7CisgfQorIAorIHZvaWQgKgorIFBRcmVzdWx0QWxsb2MoUEdyZXN1bHQgKnJl cywgc2l6ZV90IG5CeXRlcykKKyB7CisgCXJldHVybiBwcVJlc3VsdEFsbG9jKHJlcywgbkJ5 dGVzLCBUUlVFKTsKKyB9CisgCiAgLyoKICAgKiBwcVJlc3VsdEFsbG9jIC0KICAgKgkJQWxs b2NhdGUgc3Vic2lkaWFyeSBzdG9yYWdlIGZvciBhIFBHcmVzdWx0LgogICAqCiAgICogbkJ5 dGVzIGlzIHRoZSBhbW91bnQgb2Ygc3BhY2UgbmVlZGVkIGZvciB0aGUgb2JqZWN0LgogICAq IElmIGlzQmluYXJ5IGlzIHRydWUsIHdlIGFzc3VtZSB0aGF0IHdlIG5lZWQgdG8gYWxpZ24g dGhlIG9iamVjdCBvbgoqKioqKioqKioqKioqKioKKioqIDM0OSwzNjUgKioqKgotLS0gNjQy LDY3NSAtLS0tCiAgICogUFFjbGVhciAtCiAgICoJICBmcmVlJ3MgdGhlIG1lbW9yeSBhc3Nv Y2lhdGVkIHdpdGggYSBQR3Jlc3VsdAogICAqLwogIHZvaWQKICBQUWNsZWFyKFBHcmVzdWx0 ICpyZXMpCiAgeworIAlpbnQgaTsKICAJUEdyZXN1bHRfZGF0YSAqYmxvY2s7CisgCVBHRXZl bnRSZXN1bHREZXN0cm95IGV2dDsKICAKICAJaWYgKCFyZXMpCiAgCQlyZXR1cm47CiAgCisg CWZvciAoaSA9IDA7IGkgPCByZXMtPm5FdmVudHM7IGkrKykKKyAJeworIAkJZXZ0LnJlc3Vs dCA9IHJlczsKKyAJCSh2b2lkKXJlcy0+ZXZlbnRzW2ldLnByb2MoUEdFVlRfUkVTVUxUREVT VFJPWSwgJmV2dCk7CisgCQlpZiAocmVzLT5ldmVudHNbaV0ubmFtZSkKKyAJCQlmcmVlKHJl cy0+ZXZlbnRzW2ldLm5hbWUpOworIAl9CisgCisgCWlmIChyZXMtPmV2ZW50cykKKyAJewor IAkJZnJlZShyZXMtPmV2ZW50cyk7CisgCQlyZXMtPmV2ZW50cyA9IE5VTEw7CisgCQlyZXMt Pm5FdmVudHMgPSAwOworIAl9CisgCiAgCS8qIEZyZWUgYWxsIHRoZSBzdWJzaWRpYXJ5IGJs b2NrcyAqLwogIAl3aGlsZSAoKGJsb2NrID0gcmVzLT5jdXJCbG9jaykgIT0gTlVMTCkKICAJ ewogIAkJcmVzLT5jdXJCbG9jayA9IGJsb2NrLT5uZXh0OwogIAkJZnJlZShibG9jayk7CiAg CX0KKioqKioqKioqKioqKioqCioqKiAxMTkyLDEyMDQgKioqKgogICAqCSAgbWVtb3J5KS4K ICAgKi8KICAKICBQR3Jlc3VsdCAqCiAgUFFnZXRSZXN1bHQoUEdjb25uICpjb25uKQogIHsK ISAJUEdyZXN1bHQgICAqcmVzOwogIAogIAlpZiAoIWNvbm4pCiAgCQlyZXR1cm4gTlVMTDsK ICAKICAJLyogUGFyc2UgYW55IGF2YWlsYWJsZSBkYXRhLCBpZiBvdXIgc3RhdGUgcGVybWl0 cy4gKi8KICAJcGFyc2VJbnB1dChjb25uKTsKLS0tIDE1MDIsMTUxNCAtLS0tCiAgICoJICBt ZW1vcnkpLgogICAqLwogIAogIFBHcmVzdWx0ICoKICBQUWdldFJlc3VsdChQR2Nvbm4gKmNv bm4pCiAgewohIAlQR3Jlc3VsdCAgICpyZXM9TlVMTDsKICAKICAJaWYgKCFjb25uKQogIAkJ cmV0dXJuIE5VTEw7CiAgCiAgCS8qIFBhcnNlIGFueSBhdmFpbGFibGUgZGF0YSwgaWYgb3Vy IHN0YXRlIHBlcm1pdHMuICovCiAgCXBhcnNlSW5wdXQoY29ubik7CioqKioqKioqKioqKioq KgoqKiogMTI2NywxMjc4ICoqKioKLS0tIDE1NzcsMTYyMSAtLS0tCiAgCQkJCQkJCSAgbGli cHFfZ2V0dGV4dCgidW5leHBlY3RlZCBhc3luY1N0YXR1czogJWRcbiIpLAogIAkJCQkJCQkg IChpbnQpIGNvbm4tPmFzeW5jU3RhdHVzKTsKICAJCQlyZXMgPSBQUW1ha2VFbXB0eVBHcmVz dWx0KGNvbm4sIFBHUkVTX0ZBVEFMX0VSUk9SKTsKICAJCQlicmVhazsKICAJfQogIAorIAlp ZiAocmVzICYmIHJlcy0+bkV2ZW50cyA+IDAgJiYKKyAJCShyZXMtPnJlc3VsdFN0YXR1cyA9 PSBQR1JFU19DT01NQU5EX09LIHx8CisgCQkgcmVzLT5yZXN1bHRTdGF0dXMgPT0gUEdSRVNf VFVQTEVTX09LIHx8CisgCQkgcmVzLT5yZXN1bHRTdGF0dXMgPT0gUEdSRVNfRU1QVFlfUVVF UlkpKQorIAl7CisgCQlpbnQgaTsKKyAJCVBHRXZlbnRSZXN1bHRDcmVhdGUgZXZ0OworIAor IAkJZm9yIChpID0gMDsgaSA8IHJlcy0+bkV2ZW50czsgaSsrKQorIAkJeworIAkJCWV2dC5j b25uID0gY29ubjsKKyAJCQlldnQucmVzdWx0ID0gcmVzOworIAorIAkJCWlmICghcmVzLT5l dmVudHNbaV0ucHJvYyhQR0VWVF9SRVNVTFRDUkVBVEUsICZldnQpKQorIAkJCXsKKyAJCQkJ Y2hhciBtc2dbMjU2XTsKKyAKKyAJCQkJaWYgKHJlcy0+ZXZlbnRzW2ldLm5hbWUpCisgCQkJ CQlzcHJpbnRmKG1zZywKKyAJCQkJCQkiUEdFdmVudFByb2MgXCIlc1wiIGZhaWxlZCBkdXJp bmcgUEdFVlRfUkVTVUxUQ1JFQVRFIGV2ZW50IiwKKyAJCQkJCQlyZXMtPmV2ZW50c1tpXS5u YW1lKTsKKyAJCQkJZWxzZQorIAkJCQkJc3ByaW50Zihtc2csCisgCQkJCQkJIlBHRXZlbnRQ cm9jIFwiYWRkcjolcFwiIGZhaWxlZCBkdXJpbmcgUEdFVlRfUkVTVUxUQ1JFQVRFIGV2ZW50 IiwKKyAJCQkJCQlyZXMtPmV2ZW50c1tpXS5wcm9jKTsKKyAKKyAJCQkJcHFTZXRSZXN1bHRF cnJvcihyZXMsIG1zZyk7CisgCQkJCXJlcy0+cmVzdWx0U3RhdHVzID0gUEdSRVNfRkFUQUxf RVJST1I7CisgCQkJCWJyZWFrOworIAkJCX0KKyAJCX0KKyAJfQorIAogIAlyZXR1cm4gcmVz OwogIH0KICAKICAKICAvKgogICAqIFBRZXhlYwpJbmRleDogc3JjL2ludGVyZmFjZXMvbGli cHEvbGlicHEtZmUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJDUyBmaWxlOiAvcHJvamVjdHMvY3Zzcm9v dC9wZ3NxbC9zcmMvaW50ZXJmYWNlcy9saWJwcS9saWJwcS1mZS5oLHYKcmV0cmlldmluZyBy ZXZpc2lvbiAxLjE0MgpkaWZmIC1DNiAtcjEuMTQyIGxpYnBxLWZlLmgKKioqIHNyYy9pbnRl cmZhY2VzL2xpYnBxL2xpYnBxLWZlLmgJMTkgTWFyIDIwMDggMDA6Mzk6MzMgLTAwMDAJMS4x NDIKLS0tIHNyYy9pbnRlcmZhY2VzL2xpYnBxL2xpYnBxLWZlLmgJMyBTZXAgMjAwOCAyMTo1 NTowNyAtMDAwMAoqKioqKioqKioqKioqKioKKioqIDI1LDM2ICoqKioKLS0tIDI1LDQ1IC0t LS0KICAvKgogICAqIHBvc3RncmVzX2V4dC5oIGRlZmluZXMgdGhlIGJhY2tlbmQncyBleHRl cm5hbGx5IHZpc2libGUgdHlwZXMsCiAgICogc3VjaCBhcyBPaWQuCiAgICovCiAgI2luY2x1 ZGUgInBvc3RncmVzX2V4dC5oIgogIAorIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisg ICogT3B0aW9ucyBmb3IgUFFjb3B5UmVzdWx0CisgICovCisgCisgI2RlZmluZSBQR19DT1BZ UkVTX0FUVFJTICAgICAgICAgIDB4MDEKKyAjZGVmaW5lIFBHX0NPUFlSRVNfVFVQTEVTICAg ICAgICAgMHgwMiAvKiBJbXBsaWVzIFBHX0NPUFlSRVNfQVRUUlMgKi8KKyAjZGVmaW5lIFBH X0NPUFlSRVNfRVZFTlRTICAgICAgICAgMHgwNAorICNkZWZpbmUgUEdfQ09QWVJFU19OT1RJ Q0VIT09LUyAgICAweDA4CisgCiAgLyogQXBwbGljYXRpb24tdmlzaWJsZSBlbnVtIHR5cGVz ICovCiAgCiAgdHlwZWRlZiBlbnVtCiAgewogIAkvKgogIAkgKiBBbHRob3VnaCBpdCBpcyBv a2F5IHRvIGFkZCB0byB0aGlzIGxpc3QsIHZhbHVlcyB3aGljaCBiZWNvbWUgdW51c2VkCioq KioqKioqKioqKioqKgoqKiogMTkwLDIwMSAqKioqCi0tLSAxOTksMjI1IC0tLS0KICAJCWlu dAkJICAgKnB0cjsJCS8qIGNhbid0IHVzZSB2b2lkIChkZWMgY29tcGlsZXIgYmFyZnMpCSAq LwogIAkJaW50CQkJaW50ZWdlcjsKICAJfQkJCXU7CiAgfSBQUUFyZ0Jsb2NrOwogIAogIC8q IC0tLS0tLS0tLS0tLS0tLS0KKyAgKiBQR3Jlc0F0dERlc2MgLS0gRGF0YSBhYm91dCBhIHNp bmdsZSBhdHRyaWJ1dGUgKGNvbHVtbikgb2YgYSBxdWVyeSByZXN1bHQKKyAgKiAtLS0tLS0t LS0tLS0tLS0tCisgICovCisgdHlwZWRlZiBzdHJ1Y3QgcGdyZXNBdHREZXNjCisgeworIAlj aGFyCSAgICpuYW1lOwkJCS8qIGNvbHVtbiBuYW1lICovCisgCU9pZAkJCXRhYmxlaWQ7CQkv KiBzb3VyY2UgdGFibGUsIGlmIGtub3duICovCisgCWludAkJCWNvbHVtbmlkOwkJLyogc291 cmNlIGNvbHVtbiwgaWYga25vd24gKi8KKyAJaW50CQkJZm9ybWF0OwkJCS8qIGZvcm1hdCBj b2RlIGZvciB2YWx1ZSAodGV4dC9iaW5hcnkpICovCisgCU9pZAkJCXR5cGlkOwkJCS8qIHR5 cGUgaWQgKi8KKyAJaW50CQkJdHlwbGVuOwkJCS8qIHR5cGUgc2l6ZSAqLworIAlpbnQJCQlh dHR0eXBtb2Q7ICAvKiB0eXBlLXNwZWNpZmljIG1vZGlmaWVyIGluZm8gKi8KKyB9IFBHcmVz QXR0RGVzYzsKKyAKKyAvKiAtLS0tLS0tLS0tLS0tLS0tCiAgICogRXhwb3J0ZWQgZnVuY3Rp b25zIG9mIGxpYnBxCiAgICogLS0tLS0tLS0tLS0tLS0tLQogICAqLwogIAogIC8qID09PQlp biBmZS1jb25uZWN0LmMgPT09ICovCiAgCioqKioqKioqKioqKioqKgoqKiogNDM0LDQ0NSAq KioqCi0tLSA0NTgsNDg5IC0tLS0KICAgKiBNYWtlIGFuIGVtcHR5IFBHcmVzdWx0IHdpdGgg Z2l2ZW4gc3RhdHVzIChzb21lIGFwcHMgZmluZCB0aGlzCiAgICogdXNlZnVsKS4gSWYgY29u biBpcyBub3QgTlVMTCBhbmQgc3RhdHVzIGluZGljYXRlcyBhbiBlcnJvciwgdGhlCiAgICog Y29ubidzIGVycm9yTWVzc2FnZSBpcyBjb3BpZWQuCiAgICovCiAgZXh0ZXJuIFBHcmVzdWx0 ICpQUW1ha2VFbXB0eVBHcmVzdWx0KFBHY29ubiAqY29ubiwgRXhlY1N0YXR1c1R5cGUgc3Rh dHVzKTsKICAKKyBleHRlcm4gUEdyZXN1bHQgKgorIFBRY29weVJlc3VsdChjb25zdCBQR3Jl c3VsdCAqc3JjLCBpbnQgb3B0aW9ucyk7CisgCisgZXh0ZXJuIGludAorIFBRc2V0UmVzdWx0 QXR0cnMoUEdyZXN1bHQgKnJlcywgaW50IG51bUF0dHJpYnV0ZXMsIFBHcmVzQXR0RGVzYyAq YXR0RGVzY3MpOworIAorIGV4dGVybiB2b2lkICoKKyBQUXJlc3VsdEFsbG9jKFBHcmVzdWx0 ICpyZXMsIHNpemVfdCBuQnl0ZXMpOworIAorIC8qCisgICogU2V0cyB0aGUgdmFsdWUgZm9y IGEgdHVwbGUgZmllbGQuICBUaGUgdHVwX251bSBtdXN0IGJlIGxlc3MgdGhhbiBvcgorICAq IGVxdWFsIHRvIFBRbnR1cGxlcyhyZXMpLiAgVGhpcyBmdW5jdGlvbiB3aWxsIGdlbmVyYXRl IHR1cGxlcyBhcyBuZWVkZWQuCisgICogQSBuZXcgdHVwbGUgaXMgZ2VuZXJhdGVkIHdoZW4g dHVwX251bSBlcXVhbHMgUFFudHVwbGVzKHJlcykgYW5kIHRoZXJlCisgICogYXJlIG5vIGZp ZWxkcyBkZWZpbmVkIGZvciB0aGF0IHR1cGxlLgorICAqCisgICogUmV0dXJucyBhIG5vbi16 ZXJvIHZhbHVlIGZvciBzdWNjZXNzIGFuZCB6ZXJvIGZvciBmYWlsdXJlLgorICAqLworIGV4 dGVybiBpbnQKKyBQUXNldHZhbHVlKFBHcmVzdWx0ICpyZXMsIGludCB0dXBfbnVtLCBpbnQg ZmllbGRfbnVtLCBjaGFyICp2YWx1ZSwgaW50IGxlbik7CisgCiAgCiAgLyogUXVvdGluZyBz dHJpbmdzIGJlZm9yZSBpbmNsdXNpb24gaW4gcXVlcmllcy4gKi8KICBleHRlcm4gc2l6ZV90 IFBRZXNjYXBlU3RyaW5nQ29ubihQR2Nvbm4gKmNvbm4sCiAgCQkJCSAgIGNoYXIgKnRvLCBj b25zdCBjaGFyICpmcm9tLCBzaXplX3QgbGVuZ3RoLAogIAkJCQkgICBpbnQgKmVycm9yKTsK ICBleHRlcm4gdW5zaWduZWQgY2hhciAqUFFlc2NhcGVCeXRlYUNvbm4oUEdjb25uICpjb25u LApJbmRleDogc3JjL2ludGVyZmFjZXMvbGlicHEvbGlicHEtaW50LmgKPT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PQpSQ1MgZmlsZTogL3Byb2plY3RzL2N2c3Jvb3QvcGdzcWwvc3JjL2ludGVyZmFjZXMvbGli cHEvbGlicHEtaW50LmgsdgpyZXRyaWV2aW5nIHJldmlzaW9uIDEuMTMxCmRpZmYgLUM2IC1y MS4xMzEgbGlicHEtaW50LmgKKioqIHNyYy9pbnRlcmZhY2VzL2xpYnBxL2xpYnBxLWludC5o CTI5IE1heSAyMDA4IDIyOjAyOjQ0IC0wMDAwCTEuMTMxCi0tLSBzcmMvaW50ZXJmYWNlcy9s aWJwcS9saWJwcS1pbnQuaAkzIFNlcCAyMDA4IDIxOjU1OjA3IC0wMDAwCioqKioqKioqKioq KioqKgoqKiogMTksMzAgKioqKgotLS0gMTksMzEgLS0tLQogIAogICNpZm5kZWYgTElCUFFf SU5UX0gKICAjZGVmaW5lIExJQlBRX0lOVF9ICiAgCiAgLyogV2UgYXNzdW1lIGxpYnBxLWZl LmggaGFzIGFscmVhZHkgYmVlbiBpbmNsdWRlZC4gKi8KICAjaW5jbHVkZSAicG9zdGdyZXNf ZmUuaCIKKyAjaW5jbHVkZSAibGlicHEtZXZlbnRzLmgiCiAgCiAgI2luY2x1ZGUgPHRpbWUu aD4KICAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAgI2lmbmRlZiBXSU4zMgogICNpbmNsdWRl IDxzeXMvdGltZS5oPgogICNlbmRpZgoqKioqKioqKioqKioqKioKKioqIDk3LDEyMSAqKioq CiAgdW5pb24gcGdyZXN1bHRfZGF0YQogIHsKICAJUEdyZXN1bHRfZGF0YSAqbmV4dDsJCS8q IGxpbmsgdG8gbmV4dCBibG9jaywgb3IgTlVMTCAqLwogIAljaGFyCQlzcGFjZVsxXTsJCS8q IGR1bW15IGZvciBhY2Nlc3NpbmcgYmxvY2sgYXMgYnl0ZXMgKi8KICB9OwogIAotIC8qIERh dGEgYWJvdXQgYSBzaW5nbGUgYXR0cmlidXRlIChjb2x1bW4pIG9mIGEgcXVlcnkgcmVzdWx0 ICovCi0gCi0gdHlwZWRlZiBzdHJ1Y3QgcGdyZXNBdHREZXNjCi0gewotIAljaGFyCSAgICpu YW1lOwkJCS8qIGNvbHVtbiBuYW1lICovCi0gCU9pZAkJCXRhYmxlaWQ7CQkvKiBzb3VyY2Ug dGFibGUsIGlmIGtub3duICovCi0gCWludAkJCWNvbHVtbmlkOwkJLyogc291cmNlIGNvbHVt biwgaWYga25vd24gKi8KLSAJaW50CQkJZm9ybWF0OwkJCS8qIGZvcm1hdCBjb2RlIGZvciB2 YWx1ZSAodGV4dC9iaW5hcnkpICovCi0gCU9pZAkJCXR5cGlkOwkJCS8qIHR5cGUgaWQgKi8K LSAJaW50CQkJdHlwbGVuOwkJCS8qIHR5cGUgc2l6ZSAqLwotIAlpbnQJCQlhdHR0eXBtb2Q7 CQkvKiB0eXBlLXNwZWNpZmljIG1vZGlmaWVyIGluZm8gKi8KLSB9IFBHcmVzQXR0RGVzYzsK LSAKICAvKiBEYXRhIGFib3V0IGEgc2luZ2xlIHBhcmFtZXRlciBvZiBhIHByZXBhcmVkIHN0 YXRlbWVudCAqLwogIHR5cGVkZWYgc3RydWN0IHBncmVzUGFyYW1EZXNjCiAgewogIAlPaWQJ CQl0eXBpZDsJCQkvKiB0eXBlIGlkICovCiAgfSBQR3Jlc1BhcmFtRGVzYzsKICAKLS0tIDk4 LDEwOSAtLS0tCioqKioqKioqKioqKioqKgoqKiogMTU5LDE3MCAqKioqCi0tLSAxNDcsMTY2 IC0tLS0KICAJUFFub3RpY2VSZWNlaXZlciBub3RpY2VSZWM7IC8qIG5vdGljZSBtZXNzYWdl IHJlY2VpdmVyICovCiAgCXZvaWQJICAgKm5vdGljZVJlY0FyZzsKICAJUFFub3RpY2VQcm9j ZXNzb3Igbm90aWNlUHJvYzsJCS8qIG5vdGljZSBtZXNzYWdlIHByb2Nlc3NvciAqLwogIAl2 b2lkCSAgICpub3RpY2VQcm9jQXJnOwogIH0gUEdOb3RpY2VIb29rczsKICAKKyB0eXBlZGVm IHN0cnVjdAorIHsKKyAJY2hhcgkgICAqbmFtZTsJLyogZm9yIGVycm9yIG1lc3NhZ2VzICov CisgCXZvaWQJICAgKnBhc3NUaHJvdWdoOyAvKiBwb2ludGVyIHN1cHBsaWVkIGJ5IHVzZXIg Ki8KKyAJdm9pZAkgICAqZGF0YTsgLyogc3RhdGUgKGluc3RhbmNlKSBkYXRhLCBvcHRpb25h bGx5IGdlbmVyYXRlZCBieSBldmVudCBwcm9jICovCisgCVBHRXZlbnRQcm9jIHByb2M7IC8q IHRoZSBmdW5jdGlvbiB0byBjYWxsIG9uIGV2ZW50cyAqLworIH0gUEdFdmVudDsKKyAKICBz dHJ1Y3QgcGdfcmVzdWx0CiAgewogIAlpbnQJCQludHVwczsKICAJaW50CQkJbnVtQXR0cmli dXRlczsKICAJUEdyZXNBdHREZXNjICphdHREZXNjczsKICAJUEdyZXNBdHRWYWx1ZSAqKnR1 cGxlczsJCS8qIGVhY2ggUEdyZXNUdXBsZSBpcyBhbiBhcnJheSBvZgoqKioqKioqKioqKioq KioKKioqIDE4MSwxOTIgKioqKgotLS0gMTc3LDE5MiAtLS0tCiAgCSAqIFRoZXNlIGZpZWxk cyBhcmUgY29waWVkIGZyb20gdGhlIG9yaWdpbmF0aW5nIFBHY29ubiwgc28gdGhhdCBvcGVy YXRpb25zCiAgCSAqIG9uIHRoZSBQR3Jlc3VsdCBkb24ndCBoYXZlIHRvIHJlZmVyZW5jZSB0 aGUgUEdjb25uLgogIAkgKi8KICAJUEdOb3RpY2VIb29rcyBub3RpY2VIb29rczsKICAJaW50 CQkJY2xpZW50X2VuY29kaW5nOwkvKiBlbmNvZGluZyBpZCAqLwogIAorIAkvKiByZWdpc3Rl cmVkIGV2ZW50cywgY29waWVkIGZyb20gY29ubiAqLworIAlpbnQgbkV2ZW50czsKKyAJUEdF dmVudCAqZXZlbnRzOworIAogIAkvKgogIAkgKiBFcnJvciBpbmZvcm1hdGlvbiAoYWxsIE5V TEwgaWYgbm90IGFuIGVycm9yIHJlc3VsdCkuICBlcnJNc2cgaXMgdGhlCiAgCSAqICJvdmVy YWxsIiBlcnJvciBtZXNzYWdlIHJldHVybmVkIGJ5IFBRcmVzdWx0RXJyb3JNZXNzYWdlLiAg SWYgd2UgaGF2ZQogIAkgKiBwZXItZmllbGQgaW5mbyB0aGVuIGl0IGlzIHN0b3JlZCBpbiBh IGxpbmtlZCBsaXN0LgogIAkgKi8KICAJY2hhcgkgICAqZXJyTXNnOwkJCS8qIGVycm9yIG1l c3NhZ2UsIG9yIE5VTEwgaWYgbm8gZXJyb3IgKi8KKioqKioqKioqKioqKioqCioqKiAzMDAs MzExICoqKioKLS0tIDMwMCwzMTYgLS0tLQogIAkvKiBPcHRpb25hbCBmaWxlIHRvIHdyaXRl IHRyYWNlIGluZm8gdG8gKi8KICAJRklMRQkgICAqUGZkZWJ1ZzsKICAKICAJLyogQ2FsbGJh Y2sgcHJvY2VkdXJlcyBmb3Igbm90aWNlIG1lc3NhZ2UgcHJvY2Vzc2luZyAqLwogIAlQR05v dGljZUhvb2tzIG5vdGljZUhvb2tzOwogIAorIAkvKiByZWdpc3RlcmVkIGV2ZW50cyB2aWEg UFFyZWdpc3RlckV2ZW50UHJvYyAqLworIAlpbnQgbkV2ZW50czsKKyAJaW50IGV2ZW50QXJy U2l6ZTsKKyAJUEdFdmVudCAqZXZlbnRzOworIAogIAkvKiBTdGF0dXMgaW5kaWNhdG9ycyAq LwogIAlDb25uU3RhdHVzVHlwZSBzdGF0dXM7CiAgCVBHQXN5bmNTdGF0dXNUeXBlIGFzeW5j U3RhdHVzOwogIAlQR1RyYW5zYWN0aW9uU3RhdHVzVHlwZSB4YWN0U3RhdHVzOyAvKiBuZXZl ciBjaGFuZ2VzIHRvIEFDVElWRSAqLwogIAlQR1F1ZXJ5Q2xhc3MgcXVlcnljbGFzczsKICAJ Y2hhcgkgICAqbGFzdF9xdWVyeTsJCS8qIGxhc3QgU1FMIGNvbW1hbmQsIG9yIE5VTEwgaWYg dW5rbm93biAqLwpJbmRleDogc3JjL2ludGVyZmFjZXMvbGlicHEvcHRocmVhZC13aW4zMi5j Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT0KUkNTIGZpbGU6IC9wcm9qZWN0cy9jdnNyb290L3Bnc3FsL3NyYy9p bnRlcmZhY2VzL2xpYnBxL3B0aHJlYWQtd2luMzIuYyx2CnJldHJpZXZpbmcgcmV2aXNpb24g MS4xNwpkaWZmIC1DNiAtcjEuMTcgcHRocmVhZC13aW4zMi5jCioqKiBzcmMvaW50ZXJmYWNl cy9saWJwcS9wdGhyZWFkLXdpbjMyLmMJMjEgTWF5IDIwMDggMTQ6MjA6NDggLTAwMDAJMS4x NwotLS0gc3JjL2ludGVyZmFjZXMvbGlicHEvcHRocmVhZC13aW4zMi5jCTMgU2VwIDIwMDgg MjE6NTU6MDcgLTAwMDAKKioqKioqKioqKioqKioqCioqKiAyLDE0ICoqKioKICAqCiAgKiBw dGhyZWFkLXdpbjMyLmMKICAqCSBwYXJ0aWFsIHB0aHJlYWQgaW1wbGVtZW50YXRpb24gZm9y IHdpbjMyCiAgKgogICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDgsIFBvc3RncmVTUUwgR2xv YmFsIERldmVsb3BtZW50IEdyb3VwCiAgKiBJREVOVElGSUNBVElPTgohICoJJFBvc3RncmVT UUw6IHBnc3FsL3NyYy9pbnRlcmZhY2VzL2xpYnBxL3B0aHJlYWQtd2luMzIuYyx2IDEuMTcg MjAwOC8wNS8yMSAxNDoyMDo0OCBtaGEgRXhwICQKICAqCiAgKi0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0KICAqLwogIAogICNpbmNsdWRlICJwb3N0Z3Jlc19mZS5oIgogIAotLS0gMiwxNCAtLS0t CiAgKgogICogcHRocmVhZC13aW4zMi5jCiAgKgkgcGFydGlhbCBwdGhyZWFkIGltcGxlbWVu dGF0aW9uIGZvciB3aW4zMgogICoKICAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA4LCBQb3N0 Z3JlU1FMIEdsb2JhbCBEZXZlbG9wbWVudCBHcm91cAogICogSURFTlRJRklDQVRJT04KISAq CSRQb3N0Z3JlU1FMOiBwZ3NxbC9zcmMvaW50ZXJmYWNlcy9saWJwcS9wdGhyZWFkLXdpbjMy LmMsdiAxLjE2IDIwMDgvMDUvMTYgMTg6MzA6NTMgbWhhIEV4cCAkCiAgKgogICotLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tCiAgKi8KICAKICAjaW5jbHVkZSAicG9zdGdyZXNfZmUuaCIKICAK --------------010608020209070700060004 Content-Type: application/x-compressed; name="libpq-events.tgz" Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="libpq-events.tgz" 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 +j+D66MYAKAAAA== --------------010608020209070700060004--