Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1w58mB-002wCR-2L for pgsql-hackers@arkaria.postgresql.org; Tue, 24 Mar 2026 20:55:00 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1w58mA-008vEq-0i for pgsql-hackers@arkaria.postgresql.org; Tue, 24 Mar 2026 20:54:58 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1w58m9-008vEi-1j for pgsql-hackers@lists.postgresql.org; Tue, 24 Mar 2026 20:54:58 +0000 Received: from mail-ed1-x532.google.com ([2a00:1450:4864:20::532]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1w58m7-00000000qvf-35W8 for pgsql-hackers@lists.postgresql.org; Tue, 24 Mar 2026 20:54:57 +0000 Received: by mail-ed1-x532.google.com with SMTP id 4fb4d7f45d1cf-66132b22182so2334392a12.2 for ; Tue, 24 Mar 2026 13:54:55 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1774385694; cv=none; d=google.com; s=arc-20240605; b=Z5kmDaiIZNn9uApzZd8yBe6IbBgjBCySNQhFW9nqMUSW07nGnUURIEt/WQVcdK0DKl YtdQZckmpwQRhCrORZdYH47HzNpuPKnGwZACa4oubvC1QX9eKjb++KoE/VSiKntR0oOF JXKof/3A3VHp4/4Xd8PhouK7GInF+7fNR752J4dmZvvLcniUPPbVlo34IFUHfXzxzOI6 w9AKkRJo61gJgA3JQe5saDAHYxFzKCCoNitxDN53UYPDXsAQZKEM10EeHSqwo5ZjdN1V 1O9yUh6rgk0hQB1mkGNhUgq5geZQvfMSLU06/BcwWMJBHbxeIY12QhOAhtfQGVRwfGdD Es/Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:dkim-signature; bh=RGep6VUWfPwtpivVpcLfgSAglOEgGhqbXt+eisTiRLM=; fh=+DZqwQRJU2dBIaQLhpB6v8BC//eitt2VErqhrTDNIXs=; b=Db8SQGpWH5hMgK/rRzpJ0AyuBwrrczMNXiYQ4ruQP0eYEeqedcEtxgvzO0CxnjIfu/ 1iPtyM2SkoTYuUw8v8ITD2wJMd5rdBnGt7/DTOmg9gM9kxDJWrjetzPWC47XCQIWbfjN SsEQwepevpP6l74Y1vXjXsvMFSgSQwmrrOg8zX6sVqENoEeu1MB0fyK8KR4ayIcko6x5 eG/cD7tYdy0DzriK1Hu6XcGorwujZYqUFFwSbjKDaE3OW29M38zaudXhsC92sMH/ntLS leJJPZPqrZ3VbHPtZC0DaJUK9Cg9GuPAR54BdFJhSejY9rM3zl1/aI2icfgUJ1ajyS+c eCnw==; darn=lists.postgresql.org ARC-Authentication-Results: i=1; mx.google.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1774385694; x=1774990494; darn=lists.postgresql.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=RGep6VUWfPwtpivVpcLfgSAglOEgGhqbXt+eisTiRLM=; b=lElc3hsVjBNidk1Sbk3qfHW69+lvbK9qaB5fsv46p7QGeZH32k5DPYSKXKBwC7WqDj /2HwPTFnYUtGSrHPftrTOvL77cXsGDL2vwLNRVJBnPtJKDoUH++PCihJvaTEbYd0r/4V oOF0Cb7lt1YXLHm/rSIsnxy6Ww97obrB8B1ccUFkBfsp3Vl9PenI+iG0NBCTFql72ybX yNcKWbyz1576X6U+omJGh86DXw39iXT5GQ5G3nLZiOQzLX6duQLnd6qunsEbqducAspE uzaEzItE4CNkIICt26bSr7tyPNxVbPY24Vn40jyFtgwELqknH4qPsWpIYtWiwURIWoNd sSzQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774385694; x=1774990494; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=RGep6VUWfPwtpivVpcLfgSAglOEgGhqbXt+eisTiRLM=; b=awkiZFI34xB1QZkIR69dgHozftXv+M8FTDCaSsfAHtzjWeojS/5NCCFIODy1d4h1Us taIr5TJc79WVw6GtdB3C1uPWTWIB99fkXnAAduBcWmCiy4G70KTYeM+4dsIO6DtXjv+1 ZV2NGwCZmrjekRWDulFRId/+hM7g2KINYL1bHDxAvyYA3mu7YujbSHChTHsScHZgkW4z anYZ0jIeX09w/xJo8ecivfB1r803oQ/2vewqcBt0cgaYM53ot6Y2cM0iqTox3FSiWiRx XIZMTyRlQV5FJXYNZm4xRQOq8tvVDVrJkt/0VC3i1rf7xMSXASIq/lE9oydGkXFevWTO e2RQ== X-Forwarded-Encrypted: i=1; AJvYcCX4dVMSb4bdsPbXtbio/1gL4Iyeov7DHyV6ICLcBrirLflrP7UyF5zQESR4TNmLYyEebs71Vu0i1HHzg7tB@lists.postgresql.org X-Gm-Message-State: AOJu0YzfeyCQkRqPAV4bjY3bBdg0BlaPeCSUmqc0qQE0GJIzcWnAPuva Vzz26M80J2kKkOnCk/4UQdumjGvOUBIx9+OhRi7ucYZAXqKtgFdgnkG/4owL2K4Aqn9ZZFjbx4W 33DSpzG9n8WsVul3syqPdKYTpa/C4il4= X-Gm-Gg: ATEYQzxyfTUbEwwzL2bZzjS5bZHqR08hlqIQR56esiiQ1Xx2Dy2sCHmqnMEYjf9Lfvn 501XQ0WlGlF01XpAgTMDc1sGZDn9e8NIcvGtS8/9MWhqxDoiUVhm65YIPSGuXRHIFWX9sM1Nwn0 +BqlceFvmLxij/Wqgz+aqr2nSTodFcZX3TbWkYH7FwjItyj31ZZGDRRr/an5uyuN959fefCHzpQ AkSOBBq+dBgdve46w7bPFz6mAKuRj3vPjlyj+Yvc/ZqGHXbLsoCYRT9zcqcbKQKJdRioO+rWv/p dlwwLw== X-Received: by 2002:a05:6402:5207:b0:660:e00f:3228 with SMTP id 4fb4d7f45d1cf-66a82709918mr501079a12.30.1774385694206; Tue, 24 Mar 2026 13:54:54 -0700 (PDT) MIME-Version: 1.0 References: <2155281.1767900170@sss.pgh.pa.us> <431484.1768433414@sss.pgh.pa.us> In-Reply-To: From: Sami Imseih Date: Tue, 24 Mar 2026 15:54:41 -0500 X-Gm-Features: AQROBzBbIqoILZBX-pV86cGpmRaL9-B2is0MzoHJXiZFjx5gMD1jIO2yC1t3gZo Message-ID: Subject: Re: Proposal to allow setting cursor options on Portals To: Dave Cramer Cc: Hannu Krosing , Robert Haas , Tom Lane , Jelte Fennema-Nio , Jacob Champion , PostgreSQL Hackers , Heikki Linnakangas Content-Type: multipart/mixed; boundary="000000000000ffa1b3064dcb5c4d" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000ffa1b3064dcb5c4d Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable > Well there are currently ways to name a portal with V3 so named portal do= esn't make sense. > > _pq_.cursor would be fine. I spent some time today on this, and implemented this as a new protocol extension called _pq_.protocol_cursor, and the libpq option will also have the same name. Maybe someone else has a better name, but I like this as it differentiates from a sql-level cursor. Maybe someone has a better suggestion. All the cursor options can be passed, though CURSOR_OPT_BINARY is irrelevant in the extended query protocol as noted here [1]. Binary output = is controlled by the result format codes on the FETCH instead. So, CURSOR_OPT_BINARY can be passed as a cursor option, but will be silently ignored. I added a new test module libpq_protocol_cursor that expands the tests to cover all options, except for cursor sensitivity. Also, there are tests for multiple flags, enabling/disabling the extension and unnamed portal being used ( which should not be allowed ). A few other comments to earlier points: > Also, should there also be an API such `PQholdablePortalEnabled` which > takes a connection and I did not implement this and instead rely on if (cursorOptions !=3D 0 && !conn->protocol_cursor_enabled) to reject the usage of the API. So, if the API is called with cursor options but protocol_cursor is not enabled, we reject the attempt. So, I am not sure this Enabled() API has any value after thinking about it a bit mor= e. > # 5. Replace hex with constants defined in libpq-fe.h which mirror parsen= odes.h > for example 0x0020 =E2=86=92 PQ_CURSOR_OPT_HOLD, etc. Also, did not implement this since as mentioned earlier, I am not sure how to keep these in sync with core. The docs do mention that parsenodes.h is to be referenced for the bitmasks that are defined as CURSOR_OPT_*. That may be good enough. See v3 attached. [1] https://www.postgresql.org/docs/18/protocol-flow.html#PROTOCOL-FLOW-EXT= -QUERY --000000000000ffa1b3064dcb5c4d Content-Type: application/octet-stream; name="v3-0001-Add-_pq_.cursor-protocol-extension-for-cursor-opt.patch" Content-Disposition: attachment; filename="v3-0001-Add-_pq_.cursor-protocol-extension-for-cursor-opt.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mn53f4700 RnJvbSA5NDM5NGUwMmVkMWE1NDJjMmNkYjIwNzg0ZDk4OGVlNzY3MWUzOTA3IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBEYXZlIENyYW1lciA8ZGF2ZWNyYW1lckBnbWFpbC5jb20+CkRh dGU6IEZyaSwgNSBEZWMgMjAyNSAxODoyMDoyMyAtMDUwMApTdWJqZWN0OiBbUEFUQ0ggdjMgMS8x XSBBZGQgX3BxXy5jdXJzb3IgcHJvdG9jb2wgZXh0ZW5zaW9uIGZvciBjdXJzb3Igb3B0aW9ucwoK QWRkIGEgcHJvdG9jb2wgZXh0ZW5zaW9uLCBfcHFfLmN1cnNvciwgdGhhdCBhbGxvd3MgY2xpZW50 cwp0byBwYXNzIENVUlNPUl9PUFRfKiBmbGFncyBpbiBCaW5kIG1lc3NhZ2VzLCBlbmFibGluZyBI T0xELApTQ1JPTEwsIGFuZCBOT19TQ1JPTEwgb24gbmFtZWQgcG9ydGFscyB3aXRob3V0IGJ1bXBp bmcgdGhlCnByb3RvY29sIHZlcnNpb24uIFRoZSBleHRlbnNpb24gYXBwZW5kcyBhbiBvcHRpb25h bCBJbnQzMgpmaWVsZCB0byB0aGUgQmluZCBtZXNzYWdlIHdoZW4gbmVnb3RpYXRlZCBkdXJpbmcg Y29ubmVjdGlvbgpzdGFydHVwLgoKQWRkIFBRc2VuZEJpbmRXaXRoQ3Vyc29yT3B0aW9ucygpIHRv IGxpYnBxLCB3aGljaCBzZW5kcwpCaW5kK0Rlc2NyaWJlIHRvIGNyZWF0ZSBhIG5hbWVkIHBvcnRh bCB3aXRoIGN1cnNvciBvcHRpb25zLgpOb24temVybyBvcHRpb25zIHJlcXVpcmUgdGhlIGV4dGVu c2lvbjsgemVybyBvcHRpb25zIGFsd2F5cwpzdWNjZWVkLiBUaGUgY3Vyc29yX3Byb3RvY29sIGNv bm5lY3Rpb24gcGFyYW1ldGVyIGNvbnRyb2xzCm5lZ290aWF0aW9uLgoKQWxzbywgYSBuZXcgdGVz dCBtb2R1bGUgaXMgYWRkZWQuCi0tLQogZG9jL3NyYy9zZ21sL2xpYnBxLnNnbWwgICAgICAgICAg ICAgICAgICAgICAgIHwgIDYzICstCiBkb2Mvc3JjL3NnbWwvcHJvdG9jb2wuc2dtbCAgICAgICAg ICAgICAgICAgICAgfCAgMzEgKy0KIHNyYy9iYWNrZW5kL3Rjb3AvYmFja2VuZF9zdGFydHVwLmMg ICAgICAgICAgICB8ICAyMSArLQogc3JjL2JhY2tlbmQvdGNvcC9wb3N0Z3Jlcy5jICAgICAgICAg ICAgICAgICAgIHwgICA0ICsKIHNyYy9pbmNsdWRlL2xpYnBxL2xpYnBxLWJlLmggICAgICAgICAg ICAgICAgICB8ICAgMSArCiBzcmMvaW50ZXJmYWNlcy9saWJwcS9leHBvcnRzLnR4dCAgICAgICAg ICAgICAgfCAgIDEgKwogc3JjL2ludGVyZmFjZXMvbGlicHEvZmUtY29ubmVjdC5jICAgICAgICAg ICAgIHwgIDExICsKIHNyYy9pbnRlcmZhY2VzL2xpYnBxL2ZlLWV4ZWMuYyAgICAgICAgICAgICAg ICB8IDEzMSArKysKIHNyYy9pbnRlcmZhY2VzL2xpYnBxL2ZlLXByb3RvY29sMy5jICAgICAgICAg ICB8ICAxNCArCiBzcmMvaW50ZXJmYWNlcy9saWJwcS9saWJwcS1mZS5oICAgICAgICAgICAgICAg fCAgIDQgKwogc3JjL2ludGVyZmFjZXMvbGlicHEvbGlicHEtaW50LmggICAgICAgICAgICAgIHwg ICAyICsKIHNyYy90ZXN0L21vZHVsZXMvTWFrZWZpbGUgICAgICAgICAgICAgICAgICAgICB8ICAg MSArCiAuLi4vbW9kdWxlcy9saWJwcV9wcm90b2NvbF9jdXJzb3IvLmdpdGlnbm9yZSAgfCAgIDUg KwogLi4uL21vZHVsZXMvbGlicHFfcHJvdG9jb2xfY3Vyc29yL01ha2VmaWxlICAgIHwgIDI1ICsK IC4uLi9saWJwcV9wcm90b2NvbF9jdXJzb3IuYyAgICAgICAgICAgICAgICAgICB8IDc5OSArKysr KysrKysrKysrKysrKysKIC4uLi9tb2R1bGVzL2xpYnBxX3Byb3RvY29sX2N1cnNvci9tZXNvbi5i dWlsZCB8ICAzMiArCiAuLi4vdC8wMDFfbGlicHFfcHJvdG9jb2xfY3Vyc29yLnBsICAgICAgICAg ICAgfCAgNDIgKwogc3JjL3Rlc3QvbW9kdWxlcy9tZXNvbi5idWlsZCAgICAgICAgICAgICAgICAg IHwgICAxICsKIDE4IGZpbGVzIGNoYW5nZWQsIDExNzcgaW5zZXJ0aW9ucygrKSwgMTEgZGVsZXRp b25zKC0pCiBjcmVhdGUgbW9kZSAxMDA2NDQgc3JjL3Rlc3QvbW9kdWxlcy9saWJwcV9wcm90b2Nv bF9jdXJzb3IvLmdpdGlnbm9yZQogY3JlYXRlIG1vZGUgMTAwNjQ0IHNyYy90ZXN0L21vZHVsZXMv bGlicHFfcHJvdG9jb2xfY3Vyc29yL01ha2VmaWxlCiBjcmVhdGUgbW9kZSAxMDA2NDQgc3JjL3Rl c3QvbW9kdWxlcy9saWJwcV9wcm90b2NvbF9jdXJzb3IvbGlicHFfcHJvdG9jb2xfY3Vyc29yLmMK IGNyZWF0ZSBtb2RlIDEwMDY0NCBzcmMvdGVzdC9tb2R1bGVzL2xpYnBxX3Byb3RvY29sX2N1cnNv ci9tZXNvbi5idWlsZAogY3JlYXRlIG1vZGUgMTAwNjQ0IHNyYy90ZXN0L21vZHVsZXMvbGlicHFf cHJvdG9jb2xfY3Vyc29yL3QvMDAxX2xpYnBxX3Byb3RvY29sX2N1cnNvci5wbAoKZGlmZiAtLWdp dCBhL2RvYy9zcmMvc2dtbC9saWJwcS5zZ21sIGIvZG9jL3NyYy9zZ21sL2xpYnBxLnNnbWwKaW5k ZXggNmRiODIzODA4ZmMuLjI5YTcxY2Q3YzA2IDEwMDY0NAotLS0gYS9kb2Mvc3JjL3NnbWwvbGli cHEuc2dtbAorKysgYi9kb2Mvc3JjL3NnbWwvbGlicHEuc2dtbApAQCAtNTMzMSw4ICs1MzMxLDkg QEAgdW5zaWduZWQgY2hhciAqUFF1bmVzY2FwZUJ5dGVhKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmZy b20sIHNpemVfdCAqdG9fbGVuZ3RoKTsKICAgIDx4cmVmIGxpbmtlbmQ9ImxpYnBxLVBRc2VuZFF1 ZXJ5UHJlcGFyZWQiLz4sCiAgICA8eHJlZiBsaW5rZW5kPSJsaWJwcS1QUXNlbmREZXNjcmliZVBy ZXBhcmVkIi8+LAogICAgPHhyZWYgbGlua2VuZD0ibGlicHEtUFFzZW5kRGVzY3JpYmVQb3J0YWwi Lz4sCi0gICA8eHJlZiBsaW5rZW5kPSJsaWJwcS1QUXNlbmRDbG9zZVByZXBhcmVkIi8+LCBhbmQK LSAgIDx4cmVmIGxpbmtlbmQ9ImxpYnBxLVBRc2VuZENsb3NlUG9ydGFsIi8+LAorICAgPHhyZWYg bGlua2VuZD0ibGlicHEtUFFzZW5kQ2xvc2VQcmVwYXJlZCIvPiwKKyAgIDx4cmVmIGxpbmtlbmQ9 ImxpYnBxLVBRc2VuZENsb3NlUG9ydGFsIi8+LCBhbmQKKyAgIDx4cmVmIGxpbmtlbmQ9ImxpYnBx LVBRc2VuZEJpbmRXaXRoQ3Vyc29yT3B0aW9ucyIvPiwKICAgIHdoaWNoIGNhbiBiZSB1c2VkIHdp dGggPHhyZWYgbGlua2VuZD0ibGlicHEtUFFnZXRSZXN1bHQiLz4gdG8gZHVwbGljYXRlCiAgICB0 aGUgZnVuY3Rpb25hbGl0eSBvZgogICAgPHhyZWYgbGlua2VuZD0ibGlicHEtUFFleGVjUGFyYW1z Ii8+LApAQCAtNTUzMCw2ICs1NTMxLDU4IEBAIGludCBQUXNlbmRDbG9zZVBvcnRhbChQR2Nvbm4g KmNvbm4sIGNvbnN0IGNoYXIgKnBvcnRhbE5hbWUpOwogICAgICA8L2xpc3RpdGVtPgogICAgIDwv dmFybGlzdGVudHJ5PgogCisgICAgPHZhcmxpc3RlbnRyeSBpZD0ibGlicHEtUFFzZW5kQmluZFdp dGhDdXJzb3JPcHRpb25zIj4KKyAgICAgPHRlcm0+PGZ1bmN0aW9uPlBRc2VuZEJpbmRXaXRoQ3Vy c29yT3B0aW9uczwvZnVuY3Rpb24+PGluZGV4dGVybT48cHJpbWFyeT5QUXNlbmRCaW5kV2l0aEN1 cnNvck9wdGlvbnM8L3ByaW1hcnk+PC9pbmRleHRlcm0+PC90ZXJtPgorCisgICAgIDxsaXN0aXRl bT4KKyAgICAgIDxwYXJhPgorICAgICAgIENyZWF0ZXMgYSBuYW1lZCBwb3J0YWwgZnJvbSBhIHBy ZXZpb3VzbHkgcHJlcGFyZWQgc3RhdGVtZW50LCB3aXRoCisgICAgICAgdGhlIHNwZWNpZmllZCBj dXJzb3Igb3B0aW9ucyBhcHBsaWVkLgorPHN5bm9wc2lzPgoraW50IFBRc2VuZEJpbmRXaXRoQ3Vy c29yT3B0aW9ucyhQR2Nvbm4gKmNvbm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IGNvbnN0IGNoYXIgKnN0bXROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBp bnQgblBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAq Y29uc3QgKnBhcmFtVmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25z dCBpbnQgKnBhcmFtTGVuZ3RocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29u c3QgaW50ICpwYXJhbUZvcm1hdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlu dCByZXN1bHRGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNo YXIgKnBvcnRhbE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjdXJz b3JPcHRpb25zKTsKKzwvc3lub3BzaXM+CisgICAgICA8L3BhcmE+CisKKyAgICAgIDxwYXJhPgor ICAgICAgIFRoZSA8bGl0ZXJhbD5jdXJzb3JPcHRpb25zPC9saXRlcmFsPiBwYXJhbWV0ZXIgaXMg YSBiaXRtYXNrIG9mCisgICAgICAgPHN5bWJvbD5DVVJTT1JfT1BUXyo8L3N5bWJvbD4gZmxhZ3Mg ZGVmaW5lZCBpbgorICAgICAgIDxmaWxlbmFtZT5zcmMvaW5jbHVkZS9ub2Rlcy9wYXJzZW5vZGVz Lmg8L2ZpbGVuYW1lPi4KKyAgICAgICBOb3RlIHRoYXQgPHN5bWJvbD5DVVJTT1JfT1BUX0JJTkFS WTwvc3ltYm9sPiBoYXMgbm8gZWZmZWN0IGhlcmU7CisgICAgICAgYmluYXJ5IG91dHB1dCBpcyBj b250cm9sbGVkIGJ5IDxsaXRlcmFsPnJlc3VsdEZvcm1hdDwvbGl0ZXJhbD4gb24KKyAgICAgICB0 aGUgc3Vic2VxdWVudCBGRVRDSCBjYWxsIGluc3RlYWQuCisgICAgICA8L3BhcmE+CisKKyAgICAg IDxwYXJhPgorICAgICAgIFRoZSA8bGl0ZXJhbD5wb3J0YWxOYW1lPC9saXRlcmFsPiBtdXN0IGJl IGEgbm9uLWVtcHR5IHN0cmluZzsKKyAgICAgICB1bm5hbWVkIHBvcnRhbHMgYXJlIHJlamVjdGVk LiAgVGhlIGZ1bmN0aW9uIHNlbmRzIGEgQmluZCBtZXNzYWdlCisgICAgICAgdG8gY3JlYXRlIHRo ZSBwb3J0YWwgYnV0IGRvZXMgbm90IGV4ZWN1dGUgaXQuICBUaGUgcG9ydGFsIGNhbgorICAgICAg IGxhdGVyIGJlIG9wZXJhdGVkIG9uIHdpdGggY3Vyc29yIGNvbW1hbmRzIHN1Y2ggYXMgRkVUQ0gs IE1PVkUsCisgICAgICAgYW5kIENMT1NFLgorICAgICAgIFJldHVybnMgMSBvbiBzdWNjZXNzLCAw IG9uIGZhaWx1cmUuCisgICAgICA8L3BhcmE+CisKKyAgICAgIDxwYXJhPgorICAgICAgIFRoZSA8 bGl0ZXJhbD5fcHFfLnByb3RvY29sX2N1cnNvcjwvbGl0ZXJhbD4gcHJvdG9jb2wgZXh0ZW5zaW9u IG11c3QgaGF2ZQorICAgICAgIGJlZW4gc3VjY2Vzc2Z1bGx5IG5lZ290aWF0ZWQgZHVyaW5nIGNv bm5lY3Rpb24gc3RhcnR1cCBmb3IgY3Vyc29yCisgICAgICAgb3B0aW9ucyB0byB0YWtlIGVmZmVj dC4gIFRoaXMgaXMgZW5hYmxlZCBieSBzZXR0aW5nIHRoZQorICAgICAgIDxsaXRlcmFsPnByb3Rv Y29sX2N1cnNvcjwvbGl0ZXJhbD4gY29ubmVjdGlvbiBwYXJhbWV0ZXIgdG8KKyAgICAgICA8bGl0 ZXJhbD4xPC9saXRlcmFsPi4gIElmIHRoZSBleHRlbnNpb24gd2FzIG5vdCBuZWdvdGlhdGVkIGFu ZAorICAgICAgIDxsaXRlcmFsPmN1cnNvck9wdGlvbnM8L2xpdGVyYWw+IGlzIG5vbi16ZXJvLCB0 aGUgZnVuY3Rpb24KKyAgICAgICByZXR1cm5zIDAuICBQYXNzaW5nIDxsaXRlcmFsPmN1cnNvck9w dGlvbnM8L2xpdGVyYWw+IGFzIDAgaXMKKyAgICAgICBhbHdheXMgcGVybWl0dGVkIGFuZCBjcmVh dGVzIGEgbmFtZWQgcG9ydGFsIHdpdGhvdXQgYW55IGN1cnNvcgorICAgICAgIG9wdGlvbnMsIHJl Z2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgZXh0ZW5zaW9uIHdhcyBuZWdvdGlhdGVkLgorICAgICAg PC9wYXJhPgorICAgICA8L2xpc3RpdGVtPgorICAgIDwvdmFybGlzdGVudHJ5PgorCiAgICAgPHZh cmxpc3RlbnRyeSBpZD0ibGlicHEtUFFnZXRSZXN1bHQiPgogICAgICA8dGVybT48ZnVuY3Rpb24+ UFFnZXRSZXN1bHQ8L2Z1bmN0aW9uPjxpbmRleHRlcm0+PHByaW1hcnk+UFFnZXRSZXN1bHQ8L3By aW1hcnk+PC9pbmRleHRlcm0+PC90ZXJtPgogCkBAIC01NTQ0LDYgKzU1OTcsNyBAQCBpbnQgUFFz ZW5kQ2xvc2VQb3J0YWwoUEdjb25uICpjb25uLCBjb25zdCBjaGFyICpwb3J0YWxOYW1lKTsKICAg ICAgICA8eHJlZiBsaW5rZW5kPSJsaWJwcS1QUXNlbmREZXNjcmliZVBvcnRhbCIvPiwKICAgICAg ICA8eHJlZiBsaW5rZW5kPSJsaWJwcS1QUXNlbmRDbG9zZVByZXBhcmVkIi8+LAogICAgICAgIDx4 cmVmIGxpbmtlbmQ9ImxpYnBxLVBRc2VuZENsb3NlUG9ydGFsIi8+LAorICAgICAgIDx4cmVmIGxp bmtlbmQ9ImxpYnBxLVBRc2VuZEJpbmRXaXRoQ3Vyc29yT3B0aW9ucyIvPiwKICAgICAgICA8eHJl ZiBsaW5rZW5kPSJsaWJwcS1QUXNlbmRQaXBlbGluZVN5bmMiLz4sIG9yCiAgICAgICAgPHhyZWYg bGlua2VuZD0ibGlicHEtUFFwaXBlbGluZVN5bmMiLz4KICAgICAgICBjYWxsLCBhbmQgcmV0dXJu cyBpdC4KQEAgLTU5MjAsOCArNTk3NCw5IEBAIGludCBQUWZsdXNoKFBHY29ubiAqY29ubik7CiAg ICAgIFRoZSBmdW5jdGlvbnMgPHhyZWYgbGlua2VuZD0ibGlicHEtUFFzZW5kUHJlcGFyZSIvPiwK ICAgICAgPHhyZWYgbGlua2VuZD0ibGlicHEtUFFzZW5kRGVzY3JpYmVQcmVwYXJlZCIvPiwKICAg ICAgPHhyZWYgbGlua2VuZD0ibGlicHEtUFFzZW5kRGVzY3JpYmVQb3J0YWwiLz4sCi0gICAgIDx4 cmVmIGxpbmtlbmQ9ImxpYnBxLVBRc2VuZENsb3NlUHJlcGFyZWQiLz4sIGFuZAotICAgICA8eHJl ZiBsaW5rZW5kPSJsaWJwcS1QUXNlbmRDbG9zZVBvcnRhbCIvPiBhbHNvIHdvcmsgaW4gcGlwZWxp bmUgbW9kZS4KKyAgICAgPHhyZWYgbGlua2VuZD0ibGlicHEtUFFzZW5kQ2xvc2VQcmVwYXJlZCIv PiwKKyAgICAgPHhyZWYgbGlua2VuZD0ibGlicHEtUFFzZW5kQ2xvc2VQb3J0YWwiLz4sIGFuZAor ICAgICA8eHJlZiBsaW5rZW5kPSJsaWJwcS1QUXNlbmRCaW5kV2l0aEN1cnNvck9wdGlvbnMiLz4g YWxzbyB3b3JrIGluIHBpcGVsaW5lIG1vZGUuCiAgICAgIFJlc3VsdCBwcm9jZXNzaW5nIGlzIGRl c2NyaWJlZCBiZWxvdy4KICAgICA8L3BhcmE+CiAKZGlmZiAtLWdpdCBhL2RvYy9zcmMvc2dtbC9w cm90b2NvbC5zZ21sIGIvZG9jL3NyYy9zZ21sL3Byb3RvY29sLnNnbWwKaW5kZXggNDlmODE2NzY3 MTIuLjA3ZmQyYjNiNjU5IDEwMDY0NAotLS0gYS9kb2Mvc3JjL3NnbWwvcHJvdG9jb2wuc2dtbAor KysgYi9kb2Mvc3JjL3NnbWwvcHJvdG9jb2wuc2dtbApAQCAtMzQ2LDkgKzM0NiwxNCBAQAogCiAg ICAgIDx0Ym9keT4KICAgICAgIDxyb3c+Ci0gICAgICAgPGVudHJ5IG5hbWVzdD0ibGFzdCIgYWxp Z249ImNlbnRlciIgdmFsaWduPSJtaWRkbGUiPgotICAgICAgICA8ZW1waGFzaXM+KE5vIHN1cHBv cnRlZCBwcm90b2NvbCBleHRlbnNpb25zIGFyZSBjdXJyZW50bHkgZGVmaW5lZC4pPC9lbXBoYXNp cz4KLSAgICAgICA8L2VudHJ5PgorICAgICAgPGVudHJ5PjxsaXRlcmFsPl9wcV8ucHJvdG9jb2xf Y3Vyc29yPC9saXRlcmFsPjwvZW50cnk+CisgICAgICA8ZW50cnk+PGxpdGVyYWw+dHJ1ZTwvbGl0 ZXJhbD48L2VudHJ5PgorICAgICAgPGVudHJ5PlBvc3RncmVTUUwgMTkgYW5kIGxhdGVyPC9lbnRy eT4KKyAgICAgIDxlbnRyeT5FbmFibGVzIGN1cnNvciBvcHRpb25zIGluIHRoZSBCaW5kIG1lc3Nh Z2UuCisgICAgICAgIFdoZW4gc2V0IHRvIDxsaXRlcmFsPnRydWU8L2xpdGVyYWw+LCB0aGUgQmlu ZCBtZXNzYWdlIG1heSBpbmNsdWRlCisgICAgICAgIGFuIG9wdGlvbmFsIGN1cnNvciBvcHRpb25z IGZpZWxkIHRvIGNvbnRyb2wgcG9ydGFsIGJlaGF2aW9yLgorICAgICAgICBTZWUgPHhyZWYgbGlu a2VuZD0icHJvdG9jb2wtbWVzc2FnZS1mb3JtYXRzLUJpbmQiLz4gZm9yIGRldGFpbHMuCisgICAg ICA8L2VudHJ5PgogICAgICAgPC9yb3c+CiAgICAgIDwvdGJvZHk+CiAgICAgPC90Z3JvdXA+CkBA IC0xMTAxLDYgKzExMDYsOSBAQCBTRUxDVCAxLzA7PCEtLSB0aGlzIHR5cG8gaXMgaW50ZW50aW9u YWwgLS0+CiAgICAgcGFzcyBOVUxMIHZhbHVlcyBmb3IgdGhlbSBpbiB0aGUgQmluZCBtZXNzYWdl LikKICAgICBCaW5kIGFsc28gc3BlY2lmaWVzIHRoZSBmb3JtYXQgdG8gdXNlIGZvciBhbnkgZGF0 YSByZXR1cm5lZAogICAgIGJ5IHRoZSBxdWVyeTsgdGhlIGZvcm1hdCBjYW4gYmUgc3BlY2lmaWVk IG92ZXJhbGwsIG9yIHBlci1jb2x1bW4uCisgICAgSWYgdGhlIDxsaXRlcmFsPl9wcV8ucHJvdG9j b2xfY3Vyc29yPC9saXRlcmFsPiBwcm90b2NvbCBvcHRpb24gaXMgZW5hYmxlZCwKKyAgICBCaW5k IGNhbiBvcHRpb25hbGx5IGluY2x1ZGUgY3Vyc29yIG9wdGlvbnMgdG8gY29udHJvbCBwb3J0YWwg YmVoYXZpb3IsCisgICAgc3VjaCBhcyBjcmVhdGluZyBzY3JvbGxhYmxlIG9yIGhvbGRhYmxlIGN1 cnNvcnMuCiAgICAgVGhlIHJlc3BvbnNlIGlzIGVpdGhlciBCaW5kQ29tcGxldGUgb3IgRXJyb3JS ZXNwb25zZS4KICAgIDwvcGFyYT4KIApAQCAtNDQxMSw2ICs0NDE5LDIzIEBAIHBzcWwgImRibmFt ZT1wb3N0Z3JlcyByZXBsaWNhdGlvbj1kYXRhYmFzZSIgLWMgIklERU5USUZZX1NZU1RFTTsiCiAg ICAgICAgIDwvcGFyYT4KICAgICAgICA8L2xpc3RpdGVtPgogICAgICAgPC92YXJsaXN0ZW50cnk+ CisKKyAgICAgIDx2YXJsaXN0ZW50cnk+CisgICAgICAgPHRlcm0+SW50MzIgKG9wdGlvbmFsKTwv dGVybT4KKyAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgQ3Vyc29y IG9wdGlvbnMsIG9ubHkgcHJlc2VudCBpZiA8bGl0ZXJhbD5fcHFfLnByb3RvY29sX2N1cnNvcjwv bGl0ZXJhbD4KKyAgICAgICAgIGlzIGVuYWJsZWQuICBBIGJpdG1hc2sgb2YgZmxhZ3MgdGhhdCBj b250cm9sIHRoZSBiZWhhdmlvciBvZgorICAgICAgICAgdGhlIHBvcnRhbCBiZWluZyBjcmVhdGVk LiAgVGhlIHN1cHBvcnRlZCBmbGFncyBhcmUgZGVmaW5lZCBhcworICAgICAgICAgPHN5bWJvbD5D VVJTT1JfT1BUXyo8L3N5bWJvbD4gaW4KKyAgICAgICAgIDxmaWxlbmFtZT5zcmMvaW5jbHVkZS9u b2Rlcy9wYXJzZW5vZGVzLmg8L2ZpbGVuYW1lPi4KKyAgICAgICAgIE5vdGUgdGhhdCA8c3ltYm9s PkNVUlNPUl9PUFRfQklOQVJZPC9zeW1ib2w+IGhhcyBubyBlZmZlY3QgaGVyZTsKKyAgICAgICAg IGJpbmFyeSBvdXRwdXQgaXMgY29udHJvbGxlZCBieSB0aGUgcmVzdWx0IGZvcm1hdCBjb2RlcyBp biB0aGUKKyAgICAgICAgIEJpbmQgbWVzc2FnZSBpdHNlbGYuCisgICAgICAgICBJZiB0aGlzIGZp ZWxkIGlzIG5vdCBwcmVzZW50LCBubyBjdXJzb3Igb3B0aW9ucyBhcmUgYXBwbGllZC4KKyAgICAg ICAgPC9wYXJhPgorICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICA8L3Zhcmxpc3RlbnRyeT4KICAg ICAgPC92YXJpYWJsZWxpc3Q+CiAgICAgPC9saXN0aXRlbT4KICAgIDwvdmFybGlzdGVudHJ5Pgpk aWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvdGNvcC9iYWNrZW5kX3N0YXJ0dXAuYyBiL3NyYy9iYWNr ZW5kL3Rjb3AvYmFja2VuZF9zdGFydHVwLmMKaW5kZXggNWFiZjI3NmM4OTguLjc5MmQ2OTUxNWMw IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC90Y29wL2JhY2tlbmRfc3RhcnR1cC5jCisrKyBiL3Ny Yy9iYWNrZW5kL3Rjb3AvYmFja2VuZF9zdGFydHVwLmMKQEAgLTc3OSwxMSArNzc5LDI0IEBAIFBy b2Nlc3NTdGFydHVwUGFja2V0KFBvcnQgKnBvcnQsIGJvb2wgc3NsX2RvbmUsIGJvb2wgZ3NzX2Rv bmUpCiAJCQl7CiAJCQkJLyoKIAkJCQkgKiBBbnkgb3B0aW9uIGJlZ2lubmluZyB3aXRoIF9wcV8u IGlzIHJlc2VydmVkIGZvciB1c2UgYXMgYQotCQkJCSAqIHByb3RvY29sLWxldmVsIG9wdGlvbiwg YnV0IGF0IHByZXNlbnQgbm8gc3VjaCBvcHRpb25zIGFyZQotCQkJCSAqIGRlZmluZWQuCisJCQkJ ICogcHJvdG9jb2wtbGV2ZWwgb3B0aW9uLgogCQkJCSAqLwotCQkJCXVucmVjb2duaXplZF9wcm90 b2NvbF9vcHRpb25zID0KLQkJCQkJbGFwcGVuZCh1bnJlY29nbml6ZWRfcHJvdG9jb2xfb3B0aW9u cywgcHN0cmR1cChuYW1lcHRyKSk7CisJCQkJaWYgKHN0cmNtcChuYW1lcHRyLCAiX3BxXy5wcm90 b2NvbF9jdXJzb3IiKSA9PSAwKQorCQkJCXsKKwkJCQkJLyogRW5hYmxlIGN1cnNvciBvcHRpb25z IHN1cHBvcnQgdmlhIEJpbmQgbWVzc2FnZSAqLworCQkJCQlpZiAoIXBhcnNlX2Jvb2wodmFscHRy LCAmcG9ydC0+cHJvdG9jb2xfY3Vyc29yX2VuYWJsZWQpKQorCQkJCQkJZXJlcG9ydChGQVRBTCwK KwkJCQkJCQkJKGVycmNvZGUoRVJSQ09ERV9JTlZBTElEX1BBUkFNRVRFUl9WQUxVRSksCisJCQkJ CQkJCSBlcnJtc2coImludmFsaWQgdmFsdWUgZm9yIHBhcmFtZXRlciBcIiVzXCI6IFwiJXNcIiIs CisJCQkJCQkJCQkJIl9wcV8ucHJvdG9jb2xfY3Vyc29yIiwKKwkJCQkJCQkJCQl2YWxwdHIpKSk7 CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCS8qIFVucmVjb2duaXplZCBwcm90b2NvbCBv cHRpb24gKi8KKwkJCQkJdW5yZWNvZ25pemVkX3Byb3RvY29sX29wdGlvbnMgPQorCQkJCQkJbGFw cGVuZCh1bnJlY29nbml6ZWRfcHJvdG9jb2xfb3B0aW9ucywgcHN0cmR1cChuYW1lcHRyKSk7CisJ CQkJfQogCQkJfQogCQkJZWxzZQogCQkJewpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvdGNvcC9w b3N0Z3Jlcy5jIGIvc3JjL2JhY2tlbmQvdGNvcC9wb3N0Z3Jlcy5jCmluZGV4IGIzNTYzMTEzMjE5 Li40MzQ3ZjFkMmZmOSAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvdGNvcC9wb3N0Z3Jlcy5jCisr KyBiL3NyYy9iYWNrZW5kL3Rjb3AvcG9zdGdyZXMuYwpAQCAtMjAxMCw2ICsyMDEwLDEwIEBAIGV4 ZWNfYmluZF9tZXNzYWdlKFN0cmluZ0luZm8gaW5wdXRfbWVzc2FnZSkKIAkJCXJmb3JtYXRzW2ld ID0gcHFfZ2V0bXNnaW50KGlucHV0X21lc3NhZ2UsIDIpOwogCX0KIAorCS8qIEdldCBjdXJzb3Ig b3B0aW9ucyBpZiBwcmVzZW50IChfcHFfLnByb3RvY29sX2N1cnNvciBlbmFibGVkKSAqLworCWlm IChNeVByb2NQb3J0LT5wcm90b2NvbF9jdXJzb3JfZW5hYmxlZCAmJgorCQlpbnB1dF9tZXNzYWdl LT5jdXJzb3IgPCBpbnB1dF9tZXNzYWdlLT5sZW4pCisJCXBvcnRhbC0+Y3Vyc29yT3B0aW9ucyA9 IHBxX2dldG1zZ2ludChpbnB1dF9tZXNzYWdlLCA0KTsKIAlwcV9nZXRtc2dlbmQoaW5wdXRfbWVz c2FnZSk7CiAKIAkvKgpkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvbGlicHEvbGlicHEtYmUuaCBi L3NyYy9pbmNsdWRlL2xpYnBxL2xpYnBxLWJlLmgKaW5kZXggOTIxYjJkYWE0ZmYuLjgzMzBmNDBm MmI4IDEwMDY0NAotLS0gYS9zcmMvaW5jbHVkZS9saWJwcS9saWJwcS1iZS5oCisrKyBiL3NyYy9p bmNsdWRlL2xpYnBxL2xpYnBxLWJlLmgKQEAgLTE1MSw2ICsxNTEsNyBAQCB0eXBlZGVmIHN0cnVj dCBQb3J0CiAJY2hhcgkgICAqdXNlcl9uYW1lOwogCWNoYXIJICAgKmNtZGxpbmVfb3B0aW9uczsK IAlMaXN0CSAgICpndWNfb3B0aW9uczsKKwlib29sCQlwcm90b2NvbF9jdXJzb3JfZW5hYmxlZDsJ LyogX3BxXy5wcm90b2NvbF9jdXJzb3Igb3B0aW9uICovCiAKIAkvKgogCSAqIFRoZSBzdGFydHVw IHBhY2tldCBhcHBsaWNhdGlvbiBuYW1lLCBvbmx5IHVzZWQgaGVyZSBmb3IgdGhlICJjb25uZWN0 aW9uCmRpZmYgLS1naXQgYS9zcmMvaW50ZXJmYWNlcy9saWJwcS9leHBvcnRzLnR4dCBiL3NyYy9p bnRlcmZhY2VzL2xpYnBxL2V4cG9ydHMudHh0CmluZGV4IDFlM2Q1YmQ1ODY3Li42NDY0Y2U4YmQ1 MSAxMDA2NDQKLS0tIGEvc3JjL2ludGVyZmFjZXMvbGlicHEvZXhwb3J0cy50eHQKKysrIGIvc3Jj L2ludGVyZmFjZXMvbGlicHEvZXhwb3J0cy50eHQKQEAgLTIxMSwzICsyMTEsNCBAQCBQUWRlZmF1 bHRBdXRoRGF0YUhvb2sgICAgIDIwOAogUFFmdWxsUHJvdG9jb2xWZXJzaW9uICAgICAyMDkKIGFw cGVuZFBRRXhwQnVmZmVyVkEgICAgICAgMjEwCiBQUWdldFRocmVhZExvY2sgICAgICAgICAgIDIx MQorUFFzZW5kQmluZFdpdGhDdXJzb3JPcHRpb25zIDIxMgpkaWZmIC0tZ2l0IGEvc3JjL2ludGVy ZmFjZXMvbGlicHEvZmUtY29ubmVjdC5jIGIvc3JjL2ludGVyZmFjZXMvbGlicHEvZmUtY29ubmVj dC5jCmluZGV4IGRiOWI0YzhlZGJmLi5mZWZmMTUwNzQwOCAxMDA2NDQKLS0tIGEvc3JjL2ludGVy ZmFjZXMvbGlicHEvZmUtY29ubmVjdC5jCisrKyBiL3NyYy9pbnRlcmZhY2VzL2xpYnBxL2ZlLWNv bm5lY3QuYwpAQCAtNDE3LDYgKzQxNywxMCBAQCBzdGF0aWMgY29uc3QgaW50ZXJuYWxQUWNvbm5p bmZvT3B0aW9uIFBRY29ubmluZm9PcHRpb25zW10gPSB7CiAJCSJTU0wtS2V5LUxvZy1GaWxlIiwg IkQiLCA2NCwKIAlvZmZzZXRvZihzdHJ1Y3QgcGdfY29ubiwgc3Nsa2V5bG9nZmlsZSl9LAogCisJ eyJwcm90b2NvbF9jdXJzb3IiLCBOVUxMLCAiMCIsIE5VTEwsCisJCSJQcm90b2NvbC1DdXJzb3Ii LCAiIiwgMSwKKwlvZmZzZXRvZihzdHJ1Y3QgcGdfY29ubiwgcHJvdG9jb2xfY3Vyc29yKX0sCisK IAkvKiBUZXJtaW5hdGluZyBlbnRyeSAtLS0gTVVTVCBCRSBMQVNUICovCiAJe05VTEwsIE5VTEws IE5VTEwsIE5VTEwsCiAJTlVMTCwgTlVMTCwgMH0KQEAgLTM3MzIsNiArMzczNiwxMyBAQCBrZWVw X2dvaW5nOgkJCQkJCS8qIFdlIHdpbGwgY29tZSBiYWNrIHRvIGhlcmUgdW50aWwgdGhlcmUgaXMK IAkJCQkgKiBwcm9jZWVkIHdpdGhvdXQuCiAJCQkJICovCiAKKwkJCQkvKgorCQkJCSAqIFNldCBw cm90b2NvbF9jdXJzb3JfZW5hYmxlZCBmbGFnIGJhc2VkIG9uIGNvbm5lY3Rpb24KKwkJCQkgKiBw YXJhbWV0ZXIKKwkJCQkgKi8KKwkJCQlpZiAoY29ubi0+cHJvdG9jb2xfY3Vyc29yICYmIGNvbm4t PnByb3RvY29sX2N1cnNvclswXSA9PSAnMScpCisJCQkJCWNvbm4tPnByb3RvY29sX2N1cnNvcl9l bmFibGVkID0gdHJ1ZTsKKwogCQkJCS8qIEJ1aWxkIHRoZSBzdGFydHVwIHBhY2tldC4gKi8KIAkJ CQlzdGFydHBhY2tldCA9IHBxQnVpbGRTdGFydHVwUGFja2V0Myhjb25uLCAmcGFja2V0bGVuLAog CQkJCQkJCQkJCQkJCUVudmlyb25tZW50T3B0aW9ucyk7CmRpZmYgLS1naXQgYS9zcmMvaW50ZXJm YWNlcy9saWJwcS9mZS1leGVjLmMgYi9zcmMvaW50ZXJmYWNlcy9saWJwcS9mZS1leGVjLmMKaW5k ZXggMjAzZDM4OGJkYmYuLjJjNzJkZTJiYWVmIDEwMDY0NAotLS0gYS9zcmMvaW50ZXJmYWNlcy9s aWJwcS9mZS1leGVjLmMKKysrIGIvc3JjL2ludGVyZmFjZXMvbGlicHEvZmUtZXhlYy5jCkBAIC0x NjgyLDYgKzE2ODIsMTM3IEBAIFBRc2VuZFF1ZXJ5UHJlcGFyZWQoUEdjb25uICpjb25uLAogCQkJ CQkJICAgcmVzdWx0Rm9ybWF0KTsKIH0KIAorLyoKKyAqIFBRc2VuZEJpbmRXaXRoQ3Vyc29yT3B0 aW9ucworICoJCVNlbmQgYSBCaW5kIG1lc3NhZ2Ugd2l0aCBjdXJzb3Igb3B0aW9ucywgZm9sbG93 ZWQgYnkgRGVzY3JpYmUsIGJ1dCBub3QKKyAqCQlFeGVjdXRlLiBUaGlzIGNyZWF0ZXMgYSBuYW1l ZCBwb3J0YWwgd2l0aCB0aGUgc3BlY2lmaWVkIGN1cnNvciBvcHRpb25zCisgKgkJKENVUlNPUl9P UFRfKiBmcm9tIHNyYy9pbmNsdWRlL25vZGVzL3BhcnNlbm9kZXMuaCkgdGhhdCBjYW4gYmUgZmV0 Y2hlZAorICoJCWZyb20gbGF0ZXIuCisgKgorICoJCU5vbi16ZXJvIGN1cnNvck9wdGlvbnMgcmVx dWlyZSB0aGUgX3BxXy5wcm90b2NvbF9jdXJzb3IgcHJvdG9jb2wgZXh0ZW5zaW9uOworICoJCXJl dHVybnMgMCBpZiB0aGUgZXh0ZW5zaW9uIHdhcyBub3QgbmVnb3RpYXRlZC4gIFBhc3NpbmcgY3Vy c29yT3B0aW9ucworICoJCWFzIDAgYWx3YXlzIHN1Y2NlZWRzIGFuZCBjcmVhdGVzIGEgcGxhaW4g bmFtZWQgcG9ydGFsLgorICoKKyAqCQlOb3RlOiBDVVJTT1JfT1BUX0JJTkFSWSBoYXMgbm8gZWZm ZWN0IGhlcmU7IGJpbmFyeSBvdXRwdXQgaXMgY29udHJvbGxlZAorICoJCWJ5IHRoZSByZXN1bHRG b3JtYXQgcGFyYW1ldGVyIG9uIHRoZSBzdWJzZXF1ZW50IEZFVENIIGNhbGwuCisgKi8KK2ludAor UFFzZW5kQmluZFdpdGhDdXJzb3JPcHRpb25zKFBHY29ubiAqY29ubiwKKwkJCQkJCQljb25zdCBj aGFyICpzdG10TmFtZSwKKwkJCQkJCQlpbnQgblBhcmFtcywKKwkJCQkJCQljb25zdCBjaGFyICpj b25zdCAqcGFyYW1WYWx1ZXMsCisJCQkJCQkJY29uc3QgaW50ICpwYXJhbUxlbmd0aHMsCisJCQkJ CQkJY29uc3QgaW50ICpwYXJhbUZvcm1hdHMsCisJCQkJCQkJaW50IHJlc3VsdEZvcm1hdCwKKwkJ CQkJCQljb25zdCBjaGFyICpwb3J0YWxOYW1lLAorCQkJCQkJCWludCBjdXJzb3JPcHRpb25zKQor eworCVBHY21kUXVldWVFbnRyeSAqZW50cnk7CisKKwlpZiAoIVBRc2VuZFF1ZXJ5U3RhcnQoY29u biwgdHJ1ZSkpCisJCXJldHVybiAwOworCisJaWYgKCFzdG10TmFtZSkKKwl7CisJCWxpYnBxX2Fw cGVuZF9jb25uX2Vycm9yKGNvbm4sICJzdGF0ZW1lbnQgbmFtZSBpcyBhIG51bGwgcG9pbnRlciIp OworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIXBvcnRhbE5hbWUgfHwgcG9ydGFsTmFtZVswXSA9 PSAnXDAnKQorCXsKKwkJbGlicHFfYXBwZW5kX2Nvbm5fZXJyb3IoY29ubiwgImEgbmFtZWQgcG9y dGFsIGlzIHJlcXVpcmVkIik7CisJCXJldHVybiAwOworCX0KKworCWlmIChjdXJzb3JPcHRpb25z ICE9IDAgJiYgIWNvbm4tPnByb3RvY29sX2N1cnNvcl9lbmFibGVkKQorCXsKKwkJbGlicHFfYXBw ZW5kX2Nvbm5fZXJyb3IoY29ubiwKKwkJCQkJCQkJImN1cnNvciBvcHRpb25zIHJlcXVpcmUgdGhl IF9wcV8ucHJvdG9jb2xfY3Vyc29yIHByb3RvY29sIGV4dGVuc2lvbiIpOworCQlyZXR1cm4gMDsK Kwl9CisKKwllbnRyeSA9IHBxQWxsb2NDbWRRdWV1ZUVudHJ5KGNvbm4pOworCWlmIChlbnRyeSA9 PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCWlmIChwcVB1dE1zZ1N0YXJ0KFBxTXNnX0JpbmQsIGNv bm4pIDwgMCB8fAorCQlwcVB1dHMocG9ydGFsTmFtZSA/IHBvcnRhbE5hbWUgOiAiIiwgY29ubikg PCAwIHx8CisJCXBxUHV0cyhzdG10TmFtZSwgY29ubikgPCAwKQorCQlnb3RvIHNlbmRGYWlsZWQ7 CisKKwlpZiAoblBhcmFtcyA+IDAgJiYgcGFyYW1Gb3JtYXRzKQorCXsKKwkJaWYgKHBxUHV0SW50 KG5QYXJhbXMsIDIsIGNvbm4pIDwgMCkKKwkJCWdvdG8gc2VuZEZhaWxlZDsKKwkJZm9yIChpbnQg aSA9IDA7IGkgPCBuUGFyYW1zOyBpKyspCisJCQlpZiAocHFQdXRJbnQocGFyYW1Gb3JtYXRzW2ld LCAyLCBjb25uKSA8IDApCisJCQkJZ290byBzZW5kRmFpbGVkOworCX0KKwllbHNlIGlmIChwcVB1 dEludCgwLCAyLCBjb25uKSA8IDApCisJCWdvdG8gc2VuZEZhaWxlZDsKKworCWlmIChwcVB1dElu dChuUGFyYW1zLCAyLCBjb25uKSA8IDApCisJCWdvdG8gc2VuZEZhaWxlZDsKKworCWZvciAoaW50 IGkgPSAwOyBpIDwgblBhcmFtczsgaSsrKQorCXsKKwkJaWYgKHBhcmFtVmFsdWVzICYmIHBhcmFt VmFsdWVzW2ldKQorCQl7CisJCQlpbnQJCQlsZW4gPSBwYXJhbUxlbmd0aHMgPyBwYXJhbUxlbmd0 aHNbaV0gOiBzdHJsZW4ocGFyYW1WYWx1ZXNbaV0pOworCisJCQlpZiAocHFQdXRJbnQobGVuLCA0 LCBjb25uKSA8IDAgfHwKKwkJCQlwcVB1dG5jaGFyKHBhcmFtVmFsdWVzW2ldLCBsZW4sIGNvbm4p IDwgMCkKKwkJCQlnb3RvIHNlbmRGYWlsZWQ7CisJCX0KKwkJZWxzZSBpZiAocHFQdXRJbnQoLTEs IDQsIGNvbm4pIDwgMCkKKwkJCWdvdG8gc2VuZEZhaWxlZDsKKwl9CisKKwlpZiAocHFQdXRJbnQo MSwgMiwgY29ubikgPCAwIHx8CisJCXBxUHV0SW50KHJlc3VsdEZvcm1hdCwgMiwgY29ubikgPCAw KQorCQlnb3RvIHNlbmRGYWlsZWQ7CisKKwkvKiBTZW5kIGN1cnNvciBvcHRpb25zIGlmIF9wcV8u cHJvdG9jb2xfY3Vyc29yIGVuYWJsZWQgKi8KKwlpZiAoY29ubi0+cHJvdG9jb2xfY3Vyc29yX2Vu YWJsZWQpCisJeworCQlpZiAocHFQdXRJbnQoY3Vyc29yT3B0aW9ucywgNCwgY29ubikgPCAwKQor CQkJZ290byBzZW5kRmFpbGVkOworCX0KKworCWlmIChwcVB1dE1zZ0VuZChjb25uKSA8IDApCisJ CWdvdG8gc2VuZEZhaWxlZDsKKworCWlmIChwcVB1dE1zZ1N0YXJ0KFBxTXNnX0Rlc2NyaWJlLCBj b25uKSA8IDAgfHwKKwkJcHFQdXRjKCdQJywgY29ubikgPCAwIHx8CisJCXBxUHV0cyhwb3J0YWxO YW1lID8gcG9ydGFsTmFtZSA6ICIiLCBjb25uKSA8IDAgfHwKKwkJcHFQdXRNc2dFbmQoY29ubikg PCAwKQorCQlnb3RvIHNlbmRGYWlsZWQ7CisKKwkvKiBObyBFeGVjdXRlIG1lc3NhZ2UgLSBwb3J0 YWwgaXMgY3JlYXRlZCBidXQgbm90IGV4ZWN1dGVkICovCisKKwlpZiAoY29ubi0+cGlwZWxpbmVT dGF0dXMgPT0gUFFfUElQRUxJTkVfT0ZGKQorCXsKKwkJaWYgKHBxUHV0TXNnU3RhcnQoUHFNc2df U3luYywgY29ubikgPCAwIHx8CisJCQlwcVB1dE1zZ0VuZChjb25uKSA8IDApCisJCQlnb3RvIHNl bmRGYWlsZWQ7CisJfQorCisJZW50cnktPnF1ZXJ5Y2xhc3MgPSBQR1FVRVJZX0RFU0NSSUJFOwor CisJaWYgKHBxUGlwZWxpbmVGbHVzaChjb25uKSA8IDApCisJCWdvdG8gc2VuZEZhaWxlZDsKKwor CS8qIE9LLCBpdCdzIGxhdW5jaGVkISAqLworCXBxQXBwZW5kQ21kUXVldWVFbnRyeShjb25uLCBl bnRyeSk7CisKKwljb25uLT5hc3luY1N0YXR1cyA9IFBHQVNZTkNfQlVTWTsKKwlyZXR1cm4gMTsK Kworc2VuZEZhaWxlZDoKKwlwcVJlY3ljbGVDbWRRdWV1ZUVudHJ5KGNvbm4sIGVudHJ5KTsKKwly ZXR1cm4gMDsKK30KKwogLyoKICAqIFBRc2VuZFF1ZXJ5U3RhcnQKICAqCUNvbW1vbiBzdGFydHVw IGNvZGUgZm9yIFBRc2VuZFF1ZXJ5IGFuZCBzaWJsaW5nIHJvdXRpbmVzCmRpZmYgLS1naXQgYS9z cmMvaW50ZXJmYWNlcy9saWJwcS9mZS1wcm90b2NvbDMuYyBiL3NyYy9pbnRlcmZhY2VzL2xpYnBx L2ZlLXByb3RvY29sMy5jCmluZGV4IDhjMWZkYTVjYWYwLi5iMmFiM2YyMjYzYSAxMDA2NDQKLS0t IGEvc3JjL2ludGVyZmFjZXMvbGlicHEvZmUtcHJvdG9jb2wzLmMKKysrIGIvc3JjL2ludGVyZmFj ZXMvbGlicHEvZmUtcHJvdG9jb2wzLmMKQEAgLTE1NDQsNiArMTU0NCwxNiBAQCBwcUdldE5lZ290 aWF0ZVByb3RvY29sVmVyc2lvbjMoUEdjb25uICpjb25uKQogCQkJc3RyY21wKGNvbm4tPndvcmtC dWZmZXIuZGF0YSwgIl9wcV8udGVzdF9wcm90b2NvbF9uZWdvdGlhdGlvbiIpID09IDApCiAJCXsK IAkJCWZvdW5kX3Rlc3RfcHJvdG9jb2xfbmVnb3RpYXRpb24gPSB0cnVlOworCQkJY29udGludWU7 CisJCX0KKworCQkvKgorCQkgKiBIYW5kbGUgcmVqZWN0ZWQgcHJvdG9jb2wgZXh0ZW5zaW9ucyB3 ZSByZXF1ZXN0ZWQuIERpc2FibGUgdGhlCisJCSAqIGNvcnJlc3BvbmRpbmcgZmVhdHVyZSBzbyB0 aGUgY2xpZW50IGRvZXNuJ3QgdHJ5IHRvIHVzZSBpdC4KKwkJICovCisJCWlmIChzdHJjbXAoY29u bi0+d29ya0J1ZmZlci5kYXRhLCAiX3BxXy5wcm90b2NvbF9jdXJzb3IiKSA9PSAwKQorCQl7CisJ CQljb25uLT5wcm90b2NvbF9jdXJzb3JfZW5hYmxlZCA9IGZhbHNlOwogCQl9CiAJCWVsc2UKIAkJ ewpAQCAtMjUyMSw2ICsyNTMxLDEwIEBAIGJ1aWxkX3N0YXJ0dXBfcGFja2V0KGNvbnN0IFBHY29u biAqY29ubiwgY2hhciAqcGFja2V0LAogCWlmIChjb25uLT5wdmVyc2lvbiA9PSBQR19QUk9UT0NP TF9HUkVBU0UpCiAJCUFERF9TVEFSVFVQX09QVElPTigiX3BxXy50ZXN0X3Byb3RvY29sX25lZ290 aWF0aW9uIiwgIiIpOwogCisJLyogQWRkIF9wcV8ucHJvdG9jb2xfY3Vyc29yIG9wdGlvbiBpZiBl bmFibGVkICovCisJaWYgKGNvbm4tPnByb3RvY29sX2N1cnNvciAmJiBjb25uLT5wcm90b2NvbF9j dXJzb3JbMF0gPT0gJzEnKQorCQlBRERfU1RBUlRVUF9PUFRJT04oIl9wcV8ucHJvdG9jb2xfY3Vy c29yIiwgInRydWUiKTsKKwogCS8qIEFkZCBhbnkgZW52aXJvbm1lbnQtZHJpdmVuIEdVQyBzZXR0 aW5ncyBuZWVkZWQgKi8KIAlmb3IgKG5leHRfZW8gPSBvcHRpb25zOyBuZXh0X2VvLT5lbnZOYW1l OyBuZXh0X2VvKyspCiAJewpkaWZmIC0tZ2l0IGEvc3JjL2ludGVyZmFjZXMvbGlicHEvbGlicHEt ZmUuaCBiL3NyYy9pbnRlcmZhY2VzL2xpYnBxL2xpYnBxLWZlLmgKaW5kZXggZjA2ZTdhOTcyYzMu LjE2YWRkMjI2YTZmIDEwMDY0NAotLS0gYS9zcmMvaW50ZXJmYWNlcy9saWJwcS9saWJwcS1mZS5o CisrKyBiL3NyYy9pbnRlcmZhY2VzL2xpYnBxL2xpYnBxLWZlLmgKQEAgLTUzNSw2ICs1MzUsMTAg QEAgZXh0ZXJuIGludAlQUXNlbmRRdWVyeVByZXBhcmVkKFBHY29ubiAqY29ubiwKIAkJCQkJCQkJ Y29uc3QgaW50ICpwYXJhbUxlbmd0aHMsCiAJCQkJCQkJCWNvbnN0IGludCAqcGFyYW1Gb3JtYXRz LAogCQkJCQkJCQlpbnQgcmVzdWx0Rm9ybWF0KTsKK2V4dGVybiBpbnQJUFFzZW5kQmluZFdpdGhD dXJzb3JPcHRpb25zKFBHY29ubiAqY29ubiwgY29uc3QgY2hhciAqc3RtdE5hbWUsCisJCQkJCQkJ CQkJaW50IG5QYXJhbXMsIGNvbnN0IGNoYXIgKmNvbnN0ICpwYXJhbVZhbHVlcywKKwkJCQkJCQkJ CQljb25zdCBpbnQgKnBhcmFtTGVuZ3RocywgY29uc3QgaW50ICpwYXJhbUZvcm1hdHMsCisJCQkJ CQkJCQkJaW50IHJlc3VsdEZvcm1hdCwgY29uc3QgY2hhciAqcG9ydGFsTmFtZSwgaW50IGN1cnNv ck9wdGlvbnMpOwogZXh0ZXJuIGludAlQUXNldFNpbmdsZVJvd01vZGUoUEdjb25uICpjb25uKTsK IGV4dGVybiBpbnQJUFFzZXRDaHVua2VkUm93c01vZGUoUEdjb25uICpjb25uLCBpbnQgY2h1bmtT aXplKTsKIGV4dGVybiBQR3Jlc3VsdCAqUFFnZXRSZXN1bHQoUEdjb25uICpjb25uKTsKZGlmZiAt LWdpdCBhL3NyYy9pbnRlcmZhY2VzL2xpYnBxL2xpYnBxLWludC5oIGIvc3JjL2ludGVyZmFjZXMv bGlicHEvbGlicHEtaW50LmgKaW5kZXggYmQ3ZWI1OWY1ZjguLmY3ZTE5ODA5ODFmIDEwMDY0NAot LS0gYS9zcmMvaW50ZXJmYWNlcy9saWJwcS9saWJwcS1pbnQuaAorKysgYi9zcmMvaW50ZXJmYWNl cy9saWJwcS9saWJwcS1pbnQuaApAQCAtNDMwLDYgKzQzMCw3IEBAIHN0cnVjdCBwZ19jb25uCiAJ Y2hhcgkgICAqc2NyYW1fY2xpZW50X2tleTsJLyogYmFzZTY0LWVuY29kZWQgU0NSQU0gY2xpZW50 IGtleSAqLwogCWNoYXIJICAgKnNjcmFtX3NlcnZlcl9rZXk7CS8qIGJhc2U2NC1lbmNvZGVkIFND UkFNIHNlcnZlciBrZXkgKi8KIAljaGFyCSAgICpzc2xrZXlsb2dmaWxlOwkvKiB3aGVyZSBzaG91 bGQgdGhlIGNsaWVudCB3cml0ZSBzc2wga2V5bG9ncyAqLworCWNoYXIJICAgKnByb3RvY29sX2N1 cnNvcjsJLyogZW5hYmxlIF9wcV8ucHJvdG9jb2xfY3Vyc29yIG9wdGlvbiAqLwogCiAJYm9vbAkJ Y2FuY2VsUmVxdWVzdDsJLyogdHJ1ZSBpZiB0aGlzIGNvbm5lY3Rpb24gaXMgdXNlZCB0byBzZW5k IGEKIAkJCQkJCQkJICogY2FuY2VsIHJlcXVlc3QsIGluc3RlYWQgb2YgYmVpbmcgYSBub3JtYWwK QEAgLTUwNCw2ICs1MDUsNyBAQCBzdHJ1Y3QgcGdfY29ubgogCWludAkJCXN2ZXJzaW9uOwkJLyog c2VydmVyIHZlcnNpb24sIGUuZy4gNzA0MDEgZm9yIDcuNC4xICovCiAJYm9vbAkJcHZlcnNpb25f bmVnb3RpYXRlZDsJLyogdHJ1ZSBpZiBOZWdvdGlhdGVQcm90b2NvbFZlcnNpb24KIAkJCQkJCQkJ CQkgKiB3YXMgcmVjZWl2ZWQgKi8KKwlib29sCQlwcm90b2NvbF9jdXJzb3JfZW5hYmxlZDsJLyog X3BxXy5wcm90b2NvbF9jdXJzb3Igb3B0aW9uICovCiAJYm9vbAkJYXV0aF9yZXFfcmVjZWl2ZWQ7 CS8qIHRydWUgaWYgYW55IHR5cGUgb2YgYXV0aCByZXEgcmVjZWl2ZWQgKi8KIAlib29sCQlwYXNz d29yZF9uZWVkZWQ7CS8qIHRydWUgaWYgc2VydmVyIGRlbWFuZGVkIGEgcGFzc3dvcmQgKi8KIAli b29sCQlnc3NhcGlfdXNlZDsJLyogdHJ1ZSBpZiBhdXRoZW50aWNhdGVkIHZpYSBnc3NhcGkgKi8K ZGlmZiAtLWdpdCBhL3NyYy90ZXN0L21vZHVsZXMvTWFrZWZpbGUgYi9zcmMvdGVzdC9tb2R1bGVz L01ha2VmaWxlCmluZGV4IDI4Y2UzYjM1ZWRhLi4zNTdmYjk3ZWE4ZiAxMDA2NDQKLS0tIGEvc3Jj L3Rlc3QvbW9kdWxlcy9NYWtlZmlsZQorKysgYi9zcmMvdGVzdC9tb2R1bGVzL01ha2VmaWxlCkBA IC0xMSw2ICsxMSw3IEBAIFNVQkRJUlMgPSBcCiAJCSAgZHVtbXlfaW5kZXhfYW0gXAogCQkgIGR1 bW15X3NlY2xhYmVsIFwKIAkJICBpbmRleCBcCisJCSAgbGlicHFfcHJvdG9jb2xfY3Vyc29yIFwK IAkJICBsaWJwcV9waXBlbGluZSBcCiAJCSAgb2F1dGhfdmFsaWRhdG9yIFwKIAkJICBwbHNhbXBs ZSBcCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9tb2R1bGVzL2xpYnBxX3Byb3RvY29sX2N1cnNvci8u Z2l0aWdub3JlIGIvc3JjL3Rlc3QvbW9kdWxlcy9saWJwcV9wcm90b2NvbF9jdXJzb3IvLmdpdGln bm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uOGY1NWFkMTc2YmYK LS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9tb2R1bGVzL2xpYnBxX3Byb3RvY29sX2N1cnNv ci8uZ2l0aWdub3JlCkBAIC0wLDAgKzEsNSBAQAorIyBHZW5lcmF0ZWQgc3ViZGlyZWN0b3JpZXMK Ky9sb2cvCisvcmVzdWx0cy8KKy90bXBfY2hlY2svCisvbGlicHFfcHJvdG9jb2xfY3Vyc29yCmRp ZmYgLS1naXQgYS9zcmMvdGVzdC9tb2R1bGVzL2xpYnBxX3Byb3RvY29sX2N1cnNvci9NYWtlZmls ZSBiL3NyYy90ZXN0L21vZHVsZXMvbGlicHFfcHJvdG9jb2xfY3Vyc29yL01ha2VmaWxlCm5ldyBm aWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwLi4xZmEwMGFmMTUzMAotLS0gL2Rldi9u dWxsCisrKyBiL3NyYy90ZXN0L21vZHVsZXMvbGlicHFfcHJvdG9jb2xfY3Vyc29yL01ha2VmaWxl CkBAIC0wLDAgKzEsMjUgQEAKKyMgc3JjL3Rlc3QvbW9kdWxlcy9saWJwcV9wcm90b2NvbF9jdXJz b3IvTWFrZWZpbGUKKworUEdGSUxFREVTQyA9ICJsaWJwcV9wcm90b2NvbF9jdXJzb3IgLSB0ZXN0 IHByb2dyYW0gZm9yIGV4dGVuZGVkIHF1ZXJ5IHByb3RvY29sIGN1cnNvcnMiCitQR0FQUElDT04g PSB3aW4zMgorCitQUk9HUkFNID0gbGlicHFfcHJvdG9jb2xfY3Vyc29yCitPQkpTID0gJChXSU4z MlJFUykgbGlicHFfcHJvdG9jb2xfY3Vyc29yLm8KKworTk9fSU5TVEFMTCA9IDEKKworUEdfQ1BQ RkxBR1MgPSAtSSQobGlicHFfc3JjZGlyKQorUEdfTElCU19JTlRFUk5BTCArPSAkKGxpYnBxX3Bn cG9ydCkKKworVEFQX1RFU1RTID0gMQorCitpZmRlZiBVU0VfUEdYUworUEdfQ09ORklHID0gcGdf Y29uZmlnCitQR1hTIDo9ICQoc2hlbGwgJChQR19DT05GSUcpIC0tcGd4cykKK2luY2x1ZGUgJChQ R1hTKQorZWxzZQorc3ViZGlyID0gc3JjL3Rlc3QvbW9kdWxlcy9saWJwcV9wcm90b2NvbF9jdXJz b3IKK3RvcF9idWlsZGRpciA9IC4uLy4uLy4uLy4uCitpbmNsdWRlICQodG9wX2J1aWxkZGlyKS9z cmMvTWFrZWZpbGUuZ2xvYmFsCitpbmNsdWRlICQodG9wX3NyY2RpcikvY29udHJpYi9jb250cmli LWdsb2JhbC5taworZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L21vZHVsZXMvbGlicHFfcHJv dG9jb2xfY3Vyc29yL2xpYnBxX3Byb3RvY29sX2N1cnNvci5jIGIvc3JjL3Rlc3QvbW9kdWxlcy9s aWJwcV9wcm90b2NvbF9jdXJzb3IvbGlicHFfcHJvdG9jb2xfY3Vyc29yLmMKbmV3IGZpbGUgbW9k ZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLjMzZTdkMjFlNTk2Ci0tLSAvZGV2L251bGwKKysr IGIvc3JjL3Rlc3QvbW9kdWxlcy9saWJwcV9wcm90b2NvbF9jdXJzb3IvbGlicHFfcHJvdG9jb2xf Y3Vyc29yLmMKQEAgLTAsMCArMSw3OTkgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIGxp YnBxX3Byb3RvY29sX2N1cnNvci5jCisgKgkJVGVzdHMgZm9yIGV4dGVuZGVkIHF1ZXJ5IHByb3Rv Y29sIGN1cnNvciBvcHRpb25zIHZpYQorICoJCVBRc2VuZEJpbmRXaXRoQ3Vyc29yT3B0aW9ucyAo X3BxXy5wcm90b2NvbF9jdXJzb3IgcHJvdG9jb2wgZXh0ZW5zaW9uKS4KKyAqCisgKiBDb3B5cmln aHQgKGMpIDIwMjQtMjAyNiwgUG9zdGdyZVNRTCBHbG9iYWwgRGV2ZWxvcG1lbnQgR3JvdXAKKyAq CisgKiBJREVOVElGSUNBVElPTgorICoJCXNyYy90ZXN0L21vZHVsZXMvbGlicHFfcHJvdG9jb2xf Y3Vyc29yL2xpYnBxX3Byb3RvY29sX2N1cnNvci5jCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisg Ki8KKworI2luY2x1ZGUgInBvc3RncmVzX2ZlLmgiCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKwor I2luY2x1ZGUgImxpYnBxLWZlLmgiCisjaW5jbHVkZSAicGdfZ2V0b3B0LmgiCisjaW5jbHVkZSAi cG9ydC9wZ19ic3dhcC5oIgorCisvKgorICogQ3Vyc29yIG9wdGlvbiBmbGFncyBmcm9tIHNyYy9p bmNsdWRlL25vZGVzL3BhcnNlbm9kZXMuaC4KKyAqIER1cGxpY2F0ZWQgaGVyZSBiZWNhdXNlIGZy b250ZW5kIGNvZGUgY2Fubm90IGluY2x1ZGUgc2VydmVyIGhlYWRlcnMuCisgKi8KKyNkZWZpbmUg Q1VSU09SX09QVF9TQ1JPTEwJCTB4MDAwMgorI2RlZmluZSBDVVJTT1JfT1BUX05PX1NDUk9MTAkw eDAwMDQKKyNkZWZpbmUgQ1VSU09SX09QVF9IT0xECQkJMHgwMDIwCisKK3N0YXRpYyBjb25zdCBj aGFyICpjb25zdCBwcm9nbmFtZSA9ICJsaWJwcV9wcm90b2NvbF9jdXJzb3IiOworCitzdGF0aWMg dm9pZCBleGl0X25pY2VseShQR2Nvbm4gKmNvbm4pOworcGdfbm9yZXR1cm4gc3RhdGljIHZvaWQg cGdfZmF0YWxfaW1wbChpbnQgbGluZSwgY29uc3QgY2hhciAqZm10LC4uLikKKwkJCXBnX2F0dHJp YnV0ZV9wcmludGYoMiwgMyk7CisKK3N0YXRpYyB2b2lkCitleGl0X25pY2VseShQR2Nvbm4gKmNv bm4pCit7CisJUFFmaW5pc2goY29ubik7CisJZXhpdCgxKTsKK30KKworLyoKKyAqIFRoZSBmb2xs b3dpbmcgZmV3IGZ1bmN0aW9ucyBhcmUgd3JhcHBlZCBpbiBtYWNyb3MgdG8gbWFrZSB0aGUgcmVw b3J0ZWQgbGluZQorICogbnVtYmVyIGluIGFuIGVycm9yIG1hdGNoIHRoZSBsaW5lIG51bWJlciBv ZiB0aGUgaW52b2NhdGlvbi4KKyAqLworCisvKgorICogUHJpbnQgYW4gZXJyb3IgdG8gc3RkZXJy IGFuZCB0ZXJtaW5hdGUgdGhlIHByb2dyYW0uCisgKi8KKyNkZWZpbmUgcGdfZmF0YWwoLi4uKSBw Z19mYXRhbF9pbXBsKF9fTElORV9fLCBfX1ZBX0FSR1NfXykKK3BnX25vcmV0dXJuIHN0YXRpYyB2 b2lkCitwZ19mYXRhbF9pbXBsKGludCBsaW5lLCBjb25zdCBjaGFyICpmbXQsLi4uKQoreworCXZh X2xpc3QJCWFyZ3M7CisKKwlmZmx1c2goc3Rkb3V0KTsKKworCWZwcmludGYoc3RkZXJyLCAiXG4l czolZDogIiwgcHJvZ25hbWUsIGxpbmUpOworCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisJdmZwcmlu dGYoc3RkZXJyLCBmbXQsIGFyZ3MpOworCXZhX2VuZChhcmdzKTsKKwlBc3NlcnQoZm10W3N0cmxl bihmbXQpIC0gMV0gIT0gJ1xuJyk7CisJZnByaW50ZihzdGRlcnIsICJcbiIpOworCWV4aXQoMSk7 Cit9CisKKy8qCisgKiBDaGVjayB0aGF0IGxpYnBxIG5leHQgcmV0dXJucyBhIFBHcmVzdWx0IHdp dGggdGhlIHNwZWNpZmllZCBzdGF0dXMsCisgKiByZXR1cm5pbmcgdGhlIFBHcmVzdWx0IHNvIHRo YXQgY2FsbGVyIGNhbiBwZXJmb3JtIGFkZGl0aW9uYWwgY2hlY2tzLgorICovCisjZGVmaW5lIGNv bmZpcm1fcmVzdWx0X3N0YXR1cyhjb25uLCBzdGF0dXMpIGNvbmZpcm1fcmVzdWx0X3N0YXR1c19p bXBsKF9fTElORV9fLCBjb25uLCBzdGF0dXMpCitzdGF0aWMgUEdyZXN1bHQgKgorY29uZmlybV9y ZXN1bHRfc3RhdHVzX2ltcGwoaW50IGxpbmUsIFBHY29ubiAqY29ubiwgRXhlY1N0YXR1c1R5cGUg c3RhdHVzKQoreworCVBHcmVzdWx0ICAgKnJlczsKKworCXJlcyA9IFBRZ2V0UmVzdWx0KGNvbm4p OworCWlmIChyZXMgPT0gTlVMTCkKKwkJcGdfZmF0YWxfaW1wbChsaW5lLCAiUFFnZXRSZXN1bHQg cmV0dXJuZWQgbnVsbCB1bmV4cGVjdGVkbHk6ICVzIiwKKwkJCQkJICBQUWVycm9yTWVzc2FnZShj b25uKSk7CisJaWYgKFBRcmVzdWx0U3RhdHVzKHJlcykgIT0gc3RhdHVzKQorCQlwZ19mYXRhbF9p bXBsKGxpbmUsICJQUWdldFJlc3VsdCByZXR1cm5lZCBzdGF0dXMgJXMsIGV4cGVjdGVkICVzOiAl cyIsCisJCQkJCSAgUFFyZXNTdGF0dXMoUFFyZXN1bHRTdGF0dXMocmVzKSksCisJCQkJCSAgUFFy ZXNTdGF0dXMoc3RhdHVzKSwKKwkJCQkJICBQUWVycm9yTWVzc2FnZShjb25uKSk7CisJcmV0dXJu IHJlczsKK30KKworLyoKKyAqIENoZWNrIHRoYXQgbGlicHEgbmV4dCByZXR1cm5zIGEgUEdyZXN1 bHQgd2l0aCB0aGUgc3BlY2lmaWVkIHN0YXR1cywKKyAqIHRoZW4gZnJlZSB0aGUgUEdyZXN1bHQu CisgKi8KKyNkZWZpbmUgY29uc3VtZV9yZXN1bHRfc3RhdHVzKGNvbm4sIHN0YXR1cykgY29uc3Vt ZV9yZXN1bHRfc3RhdHVzX2ltcGwoX19MSU5FX18sIGNvbm4sIHN0YXR1cykKK3N0YXRpYyB2b2lk Citjb25zdW1lX3Jlc3VsdF9zdGF0dXNfaW1wbChpbnQgbGluZSwgUEdjb25uICpjb25uLCBFeGVj U3RhdHVzVHlwZSBzdGF0dXMpCit7CisJUEdyZXN1bHQgICAqcmVzOworCisJcmVzID0gY29uZmly bV9yZXN1bHRfc3RhdHVzX2ltcGwobGluZSwgY29ubiwgc3RhdHVzKTsKKwlQUWNsZWFyKHJlcyk7 Cit9CisKKy8qCisgKiBDaGVjayB0aGF0IGxpYnBxIG5leHQgcmV0dXJucyBhIG51bGwgUEdyZXN1 bHQuCisgKi8KKyNkZWZpbmUgY29uc3VtZV9udWxsX3Jlc3VsdChjb25uKSBjb25zdW1lX251bGxf cmVzdWx0X2ltcGwoX19MSU5FX18sIGNvbm4pCitzdGF0aWMgdm9pZAorY29uc3VtZV9udWxsX3Jl c3VsdF9pbXBsKGludCBsaW5lLCBQR2Nvbm4gKmNvbm4pCit7CisJUEdyZXN1bHQgICAqcmVzOwor CisJcmVzID0gUFFnZXRSZXN1bHQoY29ubik7CisJaWYgKHJlcyAhPSBOVUxMKQorCQlwZ19mYXRh bF9pbXBsKGxpbmUsICJleHBlY3RlZCBOVUxMIFBHcmVzdWx0LCBnb3QgJXM6ICVzIiwKKwkJCQkJ ICBQUXJlc1N0YXR1cyhQUXJlc3VsdFN0YXR1cyhyZXMpKSwKKwkJCQkJICBQUWVycm9yTWVzc2Fn ZShjb25uKSk7Cit9CisKKy8qCisgKiBUZXN0IGhvbGRhYmxlIGN1cnNvcjogY3JlYXRlIGEgcG9y dGFsIHdpdGggQ1VSU09SX09QVF9IT0xEIHZpYSBCaW5kLAorICogY29tbWl0IHRoZSB0cmFuc2Fj dGlvbiwgdGhlbiBGRVRDSCBmcm9tIHRoZSBzdXJ2aXZpbmcgcG9ydGFsLgorICovCitzdGF0aWMg dm9pZAordGVzdF9ob2xkYWJsZV9jdXJzb3IoUEdjb25uICpjb25uKQoreworCVBHcmVzdWx0ICAg KnJlczsKKworCWZwcmludGYoc3RkZXJyLCAidGVzdF9ob2xkYWJsZV9jdXJzb3IuLi4gIik7CisK KwlyZXMgPSBQUWV4ZWMoY29ubiwgIkJFR0lOIik7CisJaWYgKFBRcmVzdWx0U3RhdHVzKHJlcykg IT0gUEdSRVNfQ09NTUFORF9PSykKKwkJcGdfZmF0YWwoIkJFR0lOIGZhaWxlZDogJXMiLCBQUWVy cm9yTWVzc2FnZShjb25uKSk7CisJUFFjbGVhcihyZXMpOworCisJcmVzID0gUFFleGVjKGNvbm4s ICJDUkVBVEUgVEVNUCBUQUJMRSBJRiBOT1QgRVhJU1RTIGhvbGRhYmxlX3Rlc3QoaWQgaW50KSIp OworCWlmIChQUXJlc3VsdFN0YXR1cyhyZXMpICE9IFBHUkVTX0NPTU1BTkRfT0spCisJCXBnX2Zh dGFsKCJDUkVBVEUgVEFCTEUgZmFpbGVkOiAlcyIsIFBRZXJyb3JNZXNzYWdlKGNvbm4pKTsKKwlQ UWNsZWFyKHJlcyk7CisKKwlyZXMgPSBQUWV4ZWMoY29ubiwgIklOU0VSVCBJTlRPIGhvbGRhYmxl X3Rlc3QgVkFMVUVTICgxKSwgKDIpLCAoMykiKTsKKwlpZiAoUFFyZXN1bHRTdGF0dXMocmVzKSAh PSBQR1JFU19DT01NQU5EX09LKQorCQlwZ19mYXRhbCgiSU5TRVJUIGZhaWxlZDogJXMiLCBQUWVy cm9yTWVzc2FnZShjb25uKSk7CisJUFFjbGVhcihyZXMpOworCisJcmVzID0gUFFwcmVwYXJlKGNv bm4sICJob2xkc3RtdCIsICJTRUxFQ1QgKiBGUk9NIGhvbGRhYmxlX3Rlc3QiLCAwLCBOVUxMKTsK KwlpZiAoUFFyZXN1bHRTdGF0dXMocmVzKSAhPSBQR1JFU19DT01NQU5EX09LKQorCQlwZ19mYXRh bCgiUFJFUEFSRSBmYWlsZWQ6ICVzIiwgUFFlcnJvck1lc3NhZ2UoY29ubikpOworCVBRY2xlYXIo cmVzKTsKKworCWlmIChQUWVudGVyUGlwZWxpbmVNb2RlKGNvbm4pICE9IDEpCisJCXBnX2ZhdGFs KCJmYWlsZWQgdG8gZW50ZXIgcGlwZWxpbmUgbW9kZTogJXMiLCBQUWVycm9yTWVzc2FnZShjb25u KSk7CisKKwlpZiAoUFFzZW5kQmluZFdpdGhDdXJzb3JPcHRpb25zKGNvbm4sICJob2xkc3RtdCIs IDAsIE5VTEwsIE5VTEwsIE5VTEwsIDAsCisJCQkJCQkJCQkiaG9sZHBvcnRhbCIsIENVUlNPUl9P UFRfSE9MRCkgIT0gMSkKKwkJcGdfZmF0YWwoIlBRc2VuZEJpbmRXaXRoQ3Vyc29yT3B0aW9ucyBm YWlsZWQ6ICVzIiwgUFFlcnJvck1lc3NhZ2UoY29ubikpOworCisJaWYgKFBRc2VuZFF1ZXJ5UGFy YW1zKGNvbm4sICJDT01NSVQiLCAwLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAwKSAhPSAxKQor CQlwZ19mYXRhbCgiQ09NTUlUIGZhaWxlZDogJXMiLCBQUWVycm9yTWVzc2FnZShjb25uKSk7CisK KwlpZiAoUFFzZW5kUXVlcnlQYXJhbXMoY29ubiwgIkZFVENIIEFMTCBGUk9NIGhvbGRwb3J0YWwi LCAwLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAwKSAhPSAxKQorCQlwZ19mYXRhbCgiRkVUQ0gg ZmFpbGVkOiAlcyIsIFBRZXJyb3JNZXNzYWdlKGNvbm4pKTsKKworCWlmIChQUXNlbmRDbG9zZVBv cnRhbChjb25uLCAiaG9sZHBvcnRhbCIpICE9IDEpCisJCXBnX2ZhdGFsKCJQUXNlbmRDbG9zZVBv cnRhbCBmYWlsZWQ6ICVzIiwgUFFlcnJvck1lc3NhZ2UoY29ubikpOworCisJaWYgKFBRcGlwZWxp bmVTeW5jKGNvbm4pICE9IDEpCisJCXBnX2ZhdGFsKCJwaXBlbGluZSBzeW5jIGZhaWxlZDogJXMi LCBQUWVycm9yTWVzc2FnZShjb25uKSk7CisKKwkvKiBCaW5kK0Rlc2NyaWJlIHJlc3VsdCAoUm93 RGVzY3JpcHRpb24gbWV0YWRhdGEpICovCisJcmVzID0gY29uZmlybV9yZXN1bHRfc3RhdHVzKGNv bm4sIFBHUkVTX0NPTU1BTkRfT0spOworCWlmIChQUW5maWVsZHMocmVzKSAhPSAxKQorCQlwZ19m YXRhbCgiZXhwZWN0ZWQgMSBmaWVsZCwgZ290ICVkIiwgUFFuZmllbGRzKHJlcykpOworCVBRY2xl YXIocmVzKTsKKwljb25zdW1lX251bGxfcmVzdWx0KGNvbm4pOworCisJLyogQ09NTUlUIHJlc3Vs dCAqLworCWNvbnN1bWVfcmVzdWx0X3N0YXR1cyhjb25uLCBQR1JFU19DT01NQU5EX09LKTsKKwlj b25zdW1lX251bGxfcmVzdWx0KGNvbm4pOworCisJLyogRkVUQ0ggYWZ0ZXIgY29tbWl0ICovCisJ cmVzID0gY29uZmlybV9yZXN1bHRfc3RhdHVzKGNvbm4sIFBHUkVTX1RVUExFU19PSyk7CisJaWYg KFBRbnR1cGxlcyhyZXMpICE9IDMpCisJCXBnX2ZhdGFsKCJleHBlY3RlZCAzIHJvd3MgYWZ0ZXIg Y29tbWl0LCBnb3QgJWQiLCBQUW50dXBsZXMocmVzKSk7CisJUFFjbGVhcihyZXMpOworCWNvbnN1 bWVfbnVsbF9yZXN1bHQoY29ubik7CisKKwkvKiBDTE9TRSAqLworCWNvbnN1bWVfcmVzdWx0X3N0 YXR1cyhjb25uLCBQR1JFU19DT01NQU5EX09LKTsKKwljb25zdW1lX251bGxfcmVzdWx0KGNvbm4p OworCisJY29uc3VtZV9yZXN1bHRfc3RhdHVzKGNvbm4sIFBHUkVTX1BJUEVMSU5FX1NZTkMpOwor CWNvbnN1bWVfbnVsbF9yZXN1bHQoY29ubik7CisKKwlpZiAoUFFleGl0UGlwZWxpbmVNb2RlKGNv bm4pICE9IDEpCisJCXBnX2ZhdGFsKCJmYWlsZWQgdG8gZXhpdCBwaXBlbGluZSBtb2RlOiAlcyIs IFBRZXJyb3JNZXNzYWdlKGNvbm4pKTsKKworCWZwcmludGYoc3RkZXJyLCAib2tcbiIpOworfQor CisvKgorICogVGVzdCBiaW5hcnkgY3Vyc29yOiBjcmVhdGUgYSBwb3J0YWwgd2l0aCBDVVJTT1Jf T1BUX0JJTkFSWSBhbmQgdmVyaWZ5CisgKiByZXN1bHRzIGNvbWUgYmFjayBpbiBiaW5hcnkgZm9y bWF0LgorICovCitzdGF0aWMgdm9pZAordGVzdF9iaW5hcnlfY3Vyc29yKFBHY29ubiAqY29ubikK K3sKKwlQR3Jlc3VsdCAgICpyZXM7CisKKwlmcHJpbnRmKHN0ZGVyciwgInRlc3RfYmluYXJ5X2N1 cnNvci4uLiAiKTsKKworCXJlcyA9IFBRZXhlYyhjb25uLCAiQkVHSU4iKTsKKwlpZiAoUFFyZXN1 bHRTdGF0dXMocmVzKSAhPSBQR1JFU19DT01NQU5EX09LKQorCQlwZ19mYXRhbCgiQkVHSU4gZmFp bGVkOiAlcyIsIFBRZXJyb3JNZXNzYWdlKGNvbm4pKTsKKwlQUWNsZWFyKHJlcyk7CisKKwlyZXMg PSBQUXByZXBhcmUoY29ubiwgImJpbnN0bXQiLCAiU0VMRUNUIDQyOjppbnQ0IiwgMCwgTlVMTCk7 CisJaWYgKFBRcmVzdWx0U3RhdHVzKHJlcykgIT0gUEdSRVNfQ09NTUFORF9PSykKKwkJcGdfZmF0 YWwoIlBSRVBBUkUgZmFpbGVkOiAlcyIsIFBRZXJyb3JNZXNzYWdlKGNvbm4pKTsKKwlQUWNsZWFy KHJlcyk7CisKKwlpZiAoUFFlbnRlclBpcGVsaW5lTW9kZShjb25uKSAhPSAxKQorCQlwZ19mYXRh bCgiZmFpbGVkIHRvIGVudGVyIHBpcGVsaW5lIG1vZGU6ICVzIiwgUFFlcnJvck1lc3NhZ2UoY29u bikpOworCisJLyoKKwkgKiBDcmVhdGUgcG9ydGFsIHdpdGhvdXQgY3Vyc29yIG9wdGlvbnMg4oCU IGJpbmFyeSBvdXRwdXQgaXMgY29udHJvbGxlZCBieQorCSAqIHJlc3VsdEZvcm1hdCBvbiB0aGUg RkVUQ0gsIG5vdCBieSBDVVJTT1JfT1BUX0JJTkFSWS4KKwkgKi8KKwlpZiAoUFFzZW5kQmluZFdp dGhDdXJzb3JPcHRpb25zKGNvbm4sICJiaW5zdG10IiwgMCwgTlVMTCwgTlVMTCwgTlVMTCwgMCwK KwkJCQkJCQkJCSJiaW5wb3J0YWwiLCAwKSAhPSAxKQorCQlwZ19mYXRhbCgiUFFzZW5kQmluZFdp dGhDdXJzb3JPcHRpb25zIGZhaWxlZDogJXMiLCBQUWVycm9yTWVzc2FnZShjb25uKSk7CisKKwkv KiBGRVRDSCB3aXRoIHJlc3VsdEZvcm1hdD0xIHRvIHJlcXVlc3QgYmluYXJ5IG91dHB1dCAqLwor CWlmIChQUXNlbmRRdWVyeVBhcmFtcyhjb25uLCAiRkVUQ0ggQUxMIEZST00gYmlucG9ydGFsIiwg MCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgMSkgIT0gMSkKKwkJcGdfZmF0YWwoIkZFVENIIGZh aWxlZDogJXMiLCBQUWVycm9yTWVzc2FnZShjb25uKSk7CisKKwlpZiAoUFFzZW5kQ2xvc2VQb3J0 YWwoY29ubiwgImJpbnBvcnRhbCIpICE9IDEpCisJCXBnX2ZhdGFsKCJQUXNlbmRDbG9zZVBvcnRh bCBmYWlsZWQ6ICVzIiwgUFFlcnJvck1lc3NhZ2UoY29ubikpOworCisJaWYgKFBRc2VuZFF1ZXJ5 UGFyYW1zKGNvbm4sICJDT01NSVQiLCAwLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAwKSAhPSAx KQorCQlwZ19mYXRhbCgiQ09NTUlUIGZhaWxlZDogJXMiLCBQUWVycm9yTWVzc2FnZShjb25uKSk7 CisKKwlpZiAoUFFwaXBlbGluZVN5bmMoY29ubikgIT0gMSkKKwkJcGdfZmF0YWwoInBpcGVsaW5l IHN5bmMgZmFpbGVkOiAlcyIsIFBRZXJyb3JNZXNzYWdlKGNvbm4pKTsKKworCS8qIEJpbmQrRGVz Y3JpYmUgcmVzdWx0IChSb3dEZXNjcmlwdGlvbiBtZXRhZGF0YSkgKi8KKwlyZXMgPSBjb25maXJt X3Jlc3VsdF9zdGF0dXMoY29ubiwgUEdSRVNfQ09NTUFORF9PSyk7CisJaWYgKFBRbmZpZWxkcyhy ZXMpICE9IDEpCisJCXBnX2ZhdGFsKCJleHBlY3RlZCAxIGZpZWxkLCBnb3QgJWQiLCBQUW5maWVs ZHMocmVzKSk7CisJUFFjbGVhcihyZXMpOworCWNvbnN1bWVfbnVsbF9yZXN1bHQoY29ubik7CisK KwkvKiBGRVRDSCByZXN1bHQgKi8KKwlyZXMgPSBjb25maXJtX3Jlc3VsdF9zdGF0dXMoY29ubiwg UEdSRVNfVFVQTEVTX09LKTsKKwlpZiAoUFFudHVwbGVzKHJlcykgIT0gMSkKKwkJcGdfZmF0YWwo ImV4cGVjdGVkIDEgcm93LCBnb3QgJWQiLCBQUW50dXBsZXMocmVzKSk7CisJaWYgKFBRZmZvcm1h dChyZXMsIDApICE9IDEpCisJCXBnX2ZhdGFsKCJleHBlY3RlZCBiaW5hcnkgZm9ybWF0ICgxKSwg Z290ICVkIiwgUFFmZm9ybWF0KHJlcywgMCkpOworCWlmIChQUWdldGxlbmd0aChyZXMsIDAsIDAp ICE9IDQpCisJCXBnX2ZhdGFsKCJleHBlY3RlZCA0LWJ5dGUgaW50NCwgZ290ICVkIGJ5dGVzIiwg UFFnZXRsZW5ndGgocmVzLCAwLCAwKSk7CisJeworCQlpbnQzMgkJdmFsOworCisJCW1lbWNweSgm dmFsLCBQUWdldHZhbHVlKHJlcywgMCwgMCksIDQpOworCQl2YWwgPSAoaW50MzIpIHBnX250b2gz Mih2YWwpOworCQlpZiAodmFsICE9IDQyKQorCQkJcGdfZmF0YWwoImV4cGVjdGVkIHZhbHVlIDQy LCBnb3QgJWQiLCB2YWwpOworCX0KKwlQUWNsZWFyKHJlcyk7CisJY29uc3VtZV9udWxsX3Jlc3Vs dChjb25uKTsKKworCS8qIENMT1NFICovCisJY29uc3VtZV9yZXN1bHRfc3RhdHVzKGNvbm4sIFBH UkVTX0NPTU1BTkRfT0spOworCWNvbnN1bWVfbnVsbF9yZXN1bHQoY29ubik7CisKKwkvKiBDT01N SVQgKi8KKwljb25zdW1lX3Jlc3VsdF9zdGF0dXMoY29ubiwgUEdSRVNfQ09NTUFORF9PSyk7CisJ Y29uc3VtZV9udWxsX3Jlc3VsdChjb25uKTsKKworCWNvbnN1bWVfcmVzdWx0X3N0YXR1cyhjb25u LCBQR1JFU19QSVBFTElORV9TWU5DKTsKKwljb25zdW1lX251bGxfcmVzdWx0KGNvbm4pOworCisJ aWYgKFBRZXhpdFBpcGVsaW5lTW9kZShjb25uKSAhPSAxKQorCQlwZ19mYXRhbCgiZmFpbGVkIHRv IGV4aXQgcGlwZWxpbmUgbW9kZTogJXMiLCBQUWVycm9yTWVzc2FnZShjb25uKSk7CisKKwlmcHJp bnRmKHN0ZGVyciwgIm9rXG4iKTsKK30KKworLyoKKyAqIFRlc3Qgc2Nyb2xsIGN1cnNvcjogY3Jl YXRlIGEgcG9ydGFsIHdpdGggQ1VSU09SX09QVF9TQ1JPTEwgYW5kIHZlcmlmeQorICogYmFja3dh cmQgZmV0Y2hpbmcgd29ya3MuCisgKi8KK3N0YXRpYyB2b2lkCit0ZXN0X3Njcm9sbF9jdXJzb3Io UEdjb25uICpjb25uKQoreworCVBHcmVzdWx0ICAgKnJlczsKKworCWZwcmludGYoc3RkZXJyLCAi dGVzdF9zY3JvbGxfY3Vyc29yLi4uICIpOworCisJcmVzID0gUFFleGVjKGNvbm4sICJCRUdJTiIp OworCWlmIChQUXJlc3VsdFN0YXR1cyhyZXMpICE9IFBHUkVTX0NPTU1BTkRfT0spCisJCXBnX2Zh dGFsKCJCRUdJTiBmYWlsZWQ6ICVzIiwgUFFlcnJvck1lc3NhZ2UoY29ubikpOworCVBRY2xlYXIo cmVzKTsKKworCXJlcyA9IFBRZXhlYyhjb25uLCAiQ1JFQVRFIFRFTVAgVEFCTEUgSUYgTk9UIEVY SVNUUyBzY3JvbGxfdGVzdChpZCBpbnQpIik7CisJaWYgKFBRcmVzdWx0U3RhdHVzKHJlcykgIT0g UEdSRVNfQ09NTUFORF9PSykKKwkJcGdfZmF0YWwoIkNSRUFURSBUQUJMRSBmYWlsZWQ6ICVzIiwg UFFlcnJvck1lc3NhZ2UoY29ubikpOworCVBRY2xlYXIocmVzKTsKKworCXJlcyA9IFBRZXhlYyhj b25uLCAiSU5TRVJUIElOVE8gc2Nyb2xsX3Rlc3QgVkFMVUVTICgxKSwgKDIpLCAoMykiKTsKKwlp ZiAoUFFyZXN1bHRTdGF0dXMocmVzKSAhPSBQR1JFU19DT01NQU5EX09LKQorCQlwZ19mYXRhbCgi SU5TRVJUIGZhaWxlZDogJXMiLCBQUWVycm9yTWVzc2FnZShjb25uKSk7CisJUFFjbGVhcihyZXMp OworCisJcmVzID0gUFFwcmVwYXJlKGNvbm4sICJzY3JvbGxzdG10IiwgIlNFTEVDVCAqIEZST00g c2Nyb2xsX3Rlc3QgT1JERVIgQlkgaWQiLCAwLCBOVUxMKTsKKwlpZiAoUFFyZXN1bHRTdGF0dXMo cmVzKSAhPSBQR1JFU19DT01NQU5EX09LKQorCQlwZ19mYXRhbCgiUFJFUEFSRSBmYWlsZWQ6ICVz IiwgUFFlcnJvck1lc3NhZ2UoY29ubikpOworCVBRY2xlYXIocmVzKTsKKworCWlmIChQUWVudGVy UGlwZWxpbmVNb2RlKGNvbm4pICE9IDEpCisJCXBnX2ZhdGFsKCJmYWlsZWQgdG8gZW50ZXIgcGlw ZWxpbmUgbW9kZTogJXMiLCBQUWVycm9yTWVzc2FnZShjb25uKSk7CisKKwlpZiAoUFFzZW5kQmlu ZFdpdGhDdXJzb3JPcHRpb25zKGNvbm4sICJzY3JvbGxzdG10IiwgMCwgTlVMTCwgTlVMTCwgTlVM TCwgMCwKKwkJCQkJCQkJCSJzY3JvbGxwb3J0YWwiLCBDVVJTT1JfT1BUX1NDUk9MTCkgIT0gMSkK KwkJcGdfZmF0YWwoIlBRc2VuZEJpbmRXaXRoQ3Vyc29yT3B0aW9ucyBmYWlsZWQ6ICVzIiwgUFFl cnJvck1lc3NhZ2UoY29ubikpOworCisJLyogRmV0Y2ggZm9yd2FyZCB0aGVuIGJhY2t3YXJkICov CisJaWYgKFBRc2VuZFF1ZXJ5UGFyYW1zKGNvbm4sICJGRVRDSCAyIEZST00gc2Nyb2xscG9ydGFs IiwgMCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgMCkgIT0gMSkKKwkJcGdfZmF0YWwoIkZFVENI IGZvcndhcmQgZmFpbGVkOiAlcyIsIFBRZXJyb3JNZXNzYWdlKGNvbm4pKTsKKworCWlmIChQUXNl bmRRdWVyeVBhcmFtcyhjb25uLCAiRkVUQ0ggQkFDS1dBUkQgMSBGUk9NIHNjcm9sbHBvcnRhbCIs IDAsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIDApICE9IDEpCisJCXBnX2ZhdGFsKCJGRVRDSCBi YWNrd2FyZCBmYWlsZWQ6ICVzIiwgUFFlcnJvck1lc3NhZ2UoY29ubikpOworCisJaWYgKFBRc2Vu ZENsb3NlUG9ydGFsKGNvbm4sICJzY3JvbGxwb3J0YWwiKSAhPSAxKQorCQlwZ19mYXRhbCgiUFFz ZW5kQ2xvc2VQb3J0YWwgZmFpbGVkOiAlcyIsIFBRZXJyb3JNZXNzYWdlKGNvbm4pKTsKKworCWlm IChQUXNlbmRRdWVyeVBhcmFtcyhjb25uLCAiQ09NTUlUIiwgMCwgTlVMTCwgTlVMTCwgTlVMTCwg TlVMTCwgMCkgIT0gMSkKKwkJcGdfZmF0YWwoIkNPTU1JVCBmYWlsZWQ6ICVzIiwgUFFlcnJvck1l c3NhZ2UoY29ubikpOworCisJaWYgKFBRcGlwZWxpbmVTeW5jKGNvbm4pICE9IDEpCisJCXBnX2Zh dGFsKCJwaXBlbGluZSBzeW5jIGZhaWxlZDogJXMiLCBQUWVycm9yTWVzc2FnZShjb25uKSk7CisK KwkvKiBCaW5kK0Rlc2NyaWJlIHJlc3VsdCAoUm93RGVzY3JpcHRpb24gbWV0YWRhdGEpICovCisJ cmVzID0gY29uZmlybV9yZXN1bHRfc3RhdHVzKGNvbm4sIFBHUkVTX0NPTU1BTkRfT0spOworCWlm IChQUW5maWVsZHMocmVzKSAhPSAxKQorCQlwZ19mYXRhbCgiZXhwZWN0ZWQgMSBmaWVsZCwgZ290 ICVkIiwgUFFuZmllbGRzKHJlcykpOworCVBRY2xlYXIocmVzKTsKKwljb25zdW1lX251bGxfcmVz dWx0KGNvbm4pOworCisJLyogRkVUQ0ggZm9yd2FyZCAyICovCisJcmVzID0gY29uZmlybV9yZXN1 bHRfc3RhdHVzKGNvbm4sIFBHUkVTX1RVUExFU19PSyk7CisJaWYgKFBRbnR1cGxlcyhyZXMpICE9 IDIpCisJCXBnX2ZhdGFsKCJleHBlY3RlZCAyIHJvd3MgZnJvbSBmb3J3YXJkIGZldGNoLCBnb3Qg JWQiLCBQUW50dXBsZXMocmVzKSk7CisJUFFjbGVhcihyZXMpOworCWNvbnN1bWVfbnVsbF9yZXN1 bHQoY29ubik7CisKKwkvKiBGRVRDSCBiYWNrd2FyZCAxIC0gc2hvdWxkIGdldCByb3cgd2l0aCBp ZD0xICovCisJcmVzID0gY29uZmlybV9yZXN1bHRfc3RhdHVzKGNvbm4sIFBHUkVTX1RVUExFU19P Syk7CisJaWYgKFBRbnR1cGxlcyhyZXMpICE9IDEpCisJCXBnX2ZhdGFsKCJleHBlY3RlZCAxIHJv dyBmcm9tIGJhY2t3YXJkIGZldGNoLCBnb3QgJWQiLCBQUW50dXBsZXMocmVzKSk7CisJaWYgKHN0 cmNtcChQUWdldHZhbHVlKHJlcywgMCwgMCksICIxIikgIT0gMCkKKwkJcGdfZmF0YWwoImV4cGVj dGVkIHZhbHVlICcxJyBmcm9tIGJhY2t3YXJkIGZldGNoLCBnb3QgJyVzJyIsIFBRZ2V0dmFsdWUo cmVzLCAwLCAwKSk7CisJUFFjbGVhcihyZXMpOworCWNvbnN1bWVfbnVsbF9yZXN1bHQoY29ubik7 CisKKwkvKiBDTE9TRSAqLworCWNvbnN1bWVfcmVzdWx0X3N0YXR1cyhjb25uLCBQR1JFU19DT01N QU5EX09LKTsKKwljb25zdW1lX251bGxfcmVzdWx0KGNvbm4pOworCisJLyogQ09NTUlUICovCisJ Y29uc3VtZV9yZXN1bHRfc3RhdHVzKGNvbm4sIFBHUkVTX0NPTU1BTkRfT0spOworCWNvbnN1bWVf bnVsbF9yZXN1bHQoY29ubik7CisKKwljb25zdW1lX3Jlc3VsdF9zdGF0dXMoY29ubiwgUEdSRVNf UElQRUxJTkVfU1lOQyk7CisJY29uc3VtZV9udWxsX3Jlc3VsdChjb25uKTsKKworCWlmIChQUWV4 aXRQaXBlbGluZU1vZGUoY29ubikgIT0gMSkKKwkJcGdfZmF0YWwoImZhaWxlZCB0byBleGl0IHBp cGVsaW5lIG1vZGU6ICVzIiwgUFFlcnJvck1lc3NhZ2UoY29ubikpOworCisJZnByaW50ZihzdGRl cnIsICJva1xuIik7Cit9CisKKy8qCisgKiBUZXN0IG5vLXNjcm9sbCBjdXJzb3I6IGNyZWF0ZSBh IHBvcnRhbCB3aXRoIENVUlNPUl9PUFRfTk9fU0NST0xMIGFuZAorICogdmVyaWZ5IGJhY2t3YXJk IGZldGNoaW5nIGlzIHJlamVjdGVkLgorICovCitzdGF0aWMgdm9pZAordGVzdF9ub19zY3JvbGxf Y3Vyc29yKFBHY29ubiAqY29ubikKK3sKKwlQR3Jlc3VsdCAgICpyZXM7CisKKwlmcHJpbnRmKHN0 ZGVyciwgInRlc3Rfbm9fc2Nyb2xsX2N1cnNvci4uLiAiKTsKKworCXJlcyA9IFBRZXhlYyhjb25u LCAiQkVHSU4iKTsKKwlpZiAoUFFyZXN1bHRTdGF0dXMocmVzKSAhPSBQR1JFU19DT01NQU5EX09L KQorCQlwZ19mYXRhbCgiQkVHSU4gZmFpbGVkOiAlcyIsIFBRZXJyb3JNZXNzYWdlKGNvbm4pKTsK KwlQUWNsZWFyKHJlcyk7CisKKwlyZXMgPSBQUWV4ZWMoY29ubiwgIkNSRUFURSBURU1QIFRBQkxF IElGIE5PVCBFWElTVFMgbm9zY3JvbGxfdGVzdChpZCBpbnQpIik7CisJaWYgKFBRcmVzdWx0U3Rh dHVzKHJlcykgIT0gUEdSRVNfQ09NTUFORF9PSykKKwkJcGdfZmF0YWwoIkNSRUFURSBUQUJMRSBm YWlsZWQ6ICVzIiwgUFFlcnJvck1lc3NhZ2UoY29ubikpOworCVBRY2xlYXIocmVzKTsKKworCXJl cyA9IFBRZXhlYyhjb25uLCAiSU5TRVJUIElOVE8gbm9zY3JvbGxfdGVzdCBWQUxVRVMgKDEpLCAo MiksICgzKSIpOworCWlmIChQUXJlc3VsdFN0YXR1cyhyZXMpICE9IFBHUkVTX0NPTU1BTkRfT0sp CisJCXBnX2ZhdGFsKCJJTlNFUlQgZmFpbGVkOiAlcyIsIFBRZXJyb3JNZXNzYWdlKGNvbm4pKTsK KwlQUWNsZWFyKHJlcyk7CisKKwlyZXMgPSBQUXByZXBhcmUoY29ubiwgIm5vc2Nyb2xsc3RtdCIs ICJTRUxFQ1QgKiBGUk9NIG5vc2Nyb2xsX3Rlc3QgT1JERVIgQlkgaWQiLCAwLCBOVUxMKTsKKwlp ZiAoUFFyZXN1bHRTdGF0dXMocmVzKSAhPSBQR1JFU19DT01NQU5EX09LKQorCQlwZ19mYXRhbCgi UFJFUEFSRSBmYWlsZWQ6ICVzIiwgUFFlcnJvck1lc3NhZ2UoY29ubikpOworCVBRY2xlYXIocmVz KTsKKworCWlmIChQUWVudGVyUGlwZWxpbmVNb2RlKGNvbm4pICE9IDEpCisJCXBnX2ZhdGFsKCJm YWlsZWQgdG8gZW50ZXIgcGlwZWxpbmUgbW9kZTogJXMiLCBQUWVycm9yTWVzc2FnZShjb25uKSk7 CisKKwlpZiAoUFFzZW5kQmluZFdpdGhDdXJzb3JPcHRpb25zKGNvbm4sICJub3Njcm9sbHN0bXQi LCAwLCBOVUxMLCBOVUxMLCBOVUxMLCAwLAorCQkJCQkJCQkJIm5vc2Nyb2xscG9ydGFsIiwgQ1VS U09SX09QVF9OT19TQ1JPTEwpICE9IDEpCisJCXBnX2ZhdGFsKCJQUXNlbmRCaW5kV2l0aEN1cnNv ck9wdGlvbnMgZmFpbGVkOiAlcyIsIFBRZXJyb3JNZXNzYWdlKGNvbm4pKTsKKworCS8qIEZvcndh cmQgZmV0Y2ggc2hvdWxkIHdvcmsgKi8KKwlpZiAoUFFzZW5kUXVlcnlQYXJhbXMoY29ubiwgIkZF VENIIDEgRlJPTSBub3Njcm9sbHBvcnRhbCIsIDAsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIDAp ICE9IDEpCisJCXBnX2ZhdGFsKCJGRVRDSCBmb3J3YXJkIGZhaWxlZDogJXMiLCBQUWVycm9yTWVz c2FnZShjb25uKSk7CisKKwkvKiBCYWNrd2FyZCBmZXRjaCBzaG91bGQgZmFpbCAqLworCWlmIChQ UXNlbmRRdWVyeVBhcmFtcyhjb25uLCAiRkVUQ0ggQkFDS1dBUkQgMSBGUk9NIG5vc2Nyb2xscG9y dGFsIiwgMCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgMCkgIT0gMSkKKwkJcGdfZmF0YWwoIkZF VENIIGJhY2t3YXJkIHNlbmQgZmFpbGVkOiAlcyIsIFBRZXJyb3JNZXNzYWdlKGNvbm4pKTsKKwor CWlmIChQUXNlbmRDbG9zZVBvcnRhbChjb25uLCAibm9zY3JvbGxwb3J0YWwiKSAhPSAxKQorCQlw Z19mYXRhbCgiUFFzZW5kQ2xvc2VQb3J0YWwgZmFpbGVkOiAlcyIsIFBRZXJyb3JNZXNzYWdlKGNv bm4pKTsKKworCWlmIChQUXBpcGVsaW5lU3luYyhjb25uKSAhPSAxKQorCQlwZ19mYXRhbCgicGlw ZWxpbmUgc3luYyBmYWlsZWQ6ICVzIiwgUFFlcnJvck1lc3NhZ2UoY29ubikpOworCisJLyogQmlu ZCtEZXNjcmliZSByZXN1bHQgKFJvd0Rlc2NyaXB0aW9uIG1ldGFkYXRhKSAqLworCXJlcyA9IGNv bmZpcm1fcmVzdWx0X3N0YXR1cyhjb25uLCBQR1JFU19DT01NQU5EX09LKTsKKwlpZiAoUFFuZmll bGRzKHJlcykgIT0gMSkKKwkJcGdfZmF0YWwoImV4cGVjdGVkIDEgZmllbGQsIGdvdCAlZCIsIFBR bmZpZWxkcyhyZXMpKTsKKwlQUWNsZWFyKHJlcyk7CisJY29uc3VtZV9udWxsX3Jlc3VsdChjb25u KTsKKworCS8qIEZFVENIIGZvcndhcmQgMSAtIHNob3VsZCBzdWNjZWVkICovCisJcmVzID0gY29u ZmlybV9yZXN1bHRfc3RhdHVzKGNvbm4sIFBHUkVTX1RVUExFU19PSyk7CisJaWYgKFBRbnR1cGxl cyhyZXMpICE9IDEpCisJCXBnX2ZhdGFsKCJleHBlY3RlZCAxIHJvdyBmcm9tIGZvcndhcmQgZmV0 Y2gsIGdvdCAlZCIsIFBRbnR1cGxlcyhyZXMpKTsKKwlQUWNsZWFyKHJlcyk7CisJY29uc3VtZV9u dWxsX3Jlc3VsdChjb25uKTsKKworCS8qIEZFVENIIGJhY2t3YXJkIC0gc2hvdWxkIGZhaWwgKi8K Kwljb25zdW1lX3Jlc3VsdF9zdGF0dXMoY29ubiwgUEdSRVNfRkFUQUxfRVJST1IpOworCWNvbnN1 bWVfbnVsbF9yZXN1bHQoY29ubik7CisKKwkvKiBDTE9TRSAtIHBpcGVsaW5lIGlzIGFib3J0ZWQg YWZ0ZXIgdGhlIGVycm9yICovCisJY29uc3VtZV9yZXN1bHRfc3RhdHVzKGNvbm4sIFBHUkVTX1BJ UEVMSU5FX0FCT1JURUQpOworCWNvbnN1bWVfbnVsbF9yZXN1bHQoY29ubik7CisKKwkvKiBQaXBl bGluZSBzeW5jIHJlc2V0cyB0aGUgYWJvcnQgc3RhdGUgKi8KKwljb25zdW1lX3Jlc3VsdF9zdGF0 dXMoY29ubiwgUEdSRVNfUElQRUxJTkVfU1lOQyk7CisJY29uc3VtZV9udWxsX3Jlc3VsdChjb25u KTsKKworCWlmIChQUWV4aXRQaXBlbGluZU1vZGUoY29ubikgIT0gMSkKKwkJcGdfZmF0YWwoImZh aWxlZCB0byBleGl0IHBpcGVsaW5lIG1vZGU6ICVzIiwgUFFlcnJvck1lc3NhZ2UoY29ubikpOwor CisJLyogQ2xlYW4gdXA6IHJvbGxiYWNrIHRoZSBmYWlsZWQgdHJhbnNhY3Rpb24gKi8KKwlyZXMg PSBQUWV4ZWMoY29ubiwgIlJPTExCQUNLIik7CisJaWYgKFBRcmVzdWx0U3RhdHVzKHJlcykgIT0g UEdSRVNfQ09NTUFORF9PSykKKwkJcGdfZmF0YWwoIlJPTExCQUNLIGZhaWxlZDogJXMiLCBQUWVy cm9yTWVzc2FnZShjb25uKSk7CisJUFFjbGVhcihyZXMpOworCisJZnByaW50ZihzdGRlcnIsICJv a1xuIik7Cit9CisKKy8qCisgKiBUZXN0IGNvbWJpbmVkIGN1cnNvciBvcHRpb25zOiBjcmVhdGUg YSBob2xkYWJsZSArIHNjcm9sbGFibGUgcG9ydGFsLAorICogY29tbWl0IHRoZSB0cmFuc2FjdGlv biwgdGhlbiBmZXRjaCBiYWNrd2FyZCBmcm9tIHRoZSBzdXJ2aXZpbmcgcG9ydGFsLgorICovCitz dGF0aWMgdm9pZAordGVzdF9ob2xkX3Njcm9sbF9jdXJzb3IoUEdjb25uICpjb25uKQoreworCVBH cmVzdWx0ICAgKnJlczsKKworCWZwcmludGYoc3RkZXJyLCAidGVzdF9ob2xkX3Njcm9sbF9jdXJz b3IuLi4gIik7CisKKwlyZXMgPSBQUWV4ZWMoY29ubiwgIkJFR0lOIik7CisJaWYgKFBRcmVzdWx0 U3RhdHVzKHJlcykgIT0gUEdSRVNfQ09NTUFORF9PSykKKwkJcGdfZmF0YWwoIkJFR0lOIGZhaWxl ZDogJXMiLCBQUWVycm9yTWVzc2FnZShjb25uKSk7CisJUFFjbGVhcihyZXMpOworCisJcmVzID0g UFFleGVjKGNvbm4sICJDUkVBVEUgVEVNUCBUQUJMRSBJRiBOT1QgRVhJU1RTIGhvbGRzY3JvbGxf dGVzdChpZCBpbnQpIik7CisJaWYgKFBRcmVzdWx0U3RhdHVzKHJlcykgIT0gUEdSRVNfQ09NTUFO RF9PSykKKwkJcGdfZmF0YWwoIkNSRUFURSBUQUJMRSBmYWlsZWQ6ICVzIiwgUFFlcnJvck1lc3Nh Z2UoY29ubikpOworCVBRY2xlYXIocmVzKTsKKworCXJlcyA9IFBRZXhlYyhjb25uLCAiSU5TRVJU IElOVE8gaG9sZHNjcm9sbF90ZXN0IFZBTFVFUyAoMSksICgyKSwgKDMpIik7CisJaWYgKFBRcmVz dWx0U3RhdHVzKHJlcykgIT0gUEdSRVNfQ09NTUFORF9PSykKKwkJcGdfZmF0YWwoIklOU0VSVCBm YWlsZWQ6ICVzIiwgUFFlcnJvck1lc3NhZ2UoY29ubikpOworCVBRY2xlYXIocmVzKTsKKworCXJl cyA9IFBRcHJlcGFyZShjb25uLCAiaG9sZHNjcm9sbHN0bXQiLAorCQkJCQkiU0VMRUNUICogRlJP TSBob2xkc2Nyb2xsX3Rlc3QgT1JERVIgQlkgaWQiLCAwLCBOVUxMKTsKKwlpZiAoUFFyZXN1bHRT dGF0dXMocmVzKSAhPSBQR1JFU19DT01NQU5EX09LKQorCQlwZ19mYXRhbCgiUFJFUEFSRSBmYWls ZWQ6ICVzIiwgUFFlcnJvck1lc3NhZ2UoY29ubikpOworCVBRY2xlYXIocmVzKTsKKworCWlmIChQ UWVudGVyUGlwZWxpbmVNb2RlKGNvbm4pICE9IDEpCisJCXBnX2ZhdGFsKCJmYWlsZWQgdG8gZW50 ZXIgcGlwZWxpbmUgbW9kZTogJXMiLCBQUWVycm9yTWVzc2FnZShjb25uKSk7CisKKwkvKiBDb21i aW5lIEhPTEQgYW5kIFNDUk9MTCBvcHRpb25zICovCisJaWYgKFBRc2VuZEJpbmRXaXRoQ3Vyc29y T3B0aW9ucyhjb25uLCAiaG9sZHNjcm9sbHN0bXQiLCAwLCBOVUxMLCBOVUxMLCBOVUxMLCAwLAor CQkJCQkJCQkJImhvbGRzY3JvbGxwb3J0YWwiLAorCQkJCQkJCQkJQ1VSU09SX09QVF9IT0xEIHwg Q1VSU09SX09QVF9TQ1JPTEwpICE9IDEpCisJCXBnX2ZhdGFsKCJQUXNlbmRCaW5kV2l0aEN1cnNv ck9wdGlvbnMgZmFpbGVkOiAlcyIsIFBRZXJyb3JNZXNzYWdlKGNvbm4pKTsKKworCWlmIChQUXNl bmRRdWVyeVBhcmFtcyhjb25uLCAiQ09NTUlUIiwgMCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwg MCkgIT0gMSkKKwkJcGdfZmF0YWwoIkNPTU1JVCBmYWlsZWQ6ICVzIiwgUFFlcnJvck1lc3NhZ2Uo Y29ubikpOworCisJLyogRmV0Y2ggZm9yd2FyZCBhZnRlciBjb21taXQg4oCUIGhvbGRhYmxlIGtl ZXBzIHRoZSBwb3J0YWwgYWxpdmUgKi8KKwlpZiAoUFFzZW5kUXVlcnlQYXJhbXMoY29ubiwgIkZF VENIIDIgRlJPTSBob2xkc2Nyb2xscG9ydGFsIiwKKwkJCQkJCSAgMCwgTlVMTCwgTlVMTCwgTlVM TCwgTlVMTCwgMCkgIT0gMSkKKwkJcGdfZmF0YWwoIkZFVENIIGZvcndhcmQgZmFpbGVkOiAlcyIs IFBRZXJyb3JNZXNzYWdlKGNvbm4pKTsKKworCS8qIEZldGNoIGJhY2t3YXJkIOKAlCBzY3JvbGwg b3B0aW9uIGFsbG93cyB0aGlzICovCisJaWYgKFBRc2VuZFF1ZXJ5UGFyYW1zKGNvbm4sICJGRVRD SCBCQUNLV0FSRCAxIEZST00gaG9sZHNjcm9sbHBvcnRhbCIsCisJCQkJCQkgIDAsIE5VTEwsIE5V TEwsIE5VTEwsIE5VTEwsIDApICE9IDEpCisJCXBnX2ZhdGFsKCJGRVRDSCBiYWNrd2FyZCBmYWls ZWQ6ICVzIiwgUFFlcnJvck1lc3NhZ2UoY29ubikpOworCisJaWYgKFBRc2VuZENsb3NlUG9ydGFs KGNvbm4sICJob2xkc2Nyb2xscG9ydGFsIikgIT0gMSkKKwkJcGdfZmF0YWwoIlBRc2VuZENsb3Nl UG9ydGFsIGZhaWxlZDogJXMiLCBQUWVycm9yTWVzc2FnZShjb25uKSk7CisKKwlpZiAoUFFwaXBl bGluZVN5bmMoY29ubikgIT0gMSkKKwkJcGdfZmF0YWwoInBpcGVsaW5lIHN5bmMgZmFpbGVkOiAl cyIsIFBRZXJyb3JNZXNzYWdlKGNvbm4pKTsKKworCS8qIEJpbmQrRGVzY3JpYmUgcmVzdWx0IChS b3dEZXNjcmlwdGlvbiBtZXRhZGF0YSkgKi8KKwlyZXMgPSBjb25maXJtX3Jlc3VsdF9zdGF0dXMo Y29ubiwgUEdSRVNfQ09NTUFORF9PSyk7CisJaWYgKFBRbmZpZWxkcyhyZXMpICE9IDEpCisJCXBn X2ZhdGFsKCJleHBlY3RlZCAxIGZpZWxkLCBnb3QgJWQiLCBQUW5maWVsZHMocmVzKSk7CisJUFFj bGVhcihyZXMpOworCWNvbnN1bWVfbnVsbF9yZXN1bHQoY29ubik7CisKKwkvKiBDT01NSVQgKi8K Kwljb25zdW1lX3Jlc3VsdF9zdGF0dXMoY29ubiwgUEdSRVNfQ09NTUFORF9PSyk7CisJY29uc3Vt ZV9udWxsX3Jlc3VsdChjb25uKTsKKworCS8qIEZFVENIIGZvcndhcmQgMiAqLworCXJlcyA9IGNv bmZpcm1fcmVzdWx0X3N0YXR1cyhjb25uLCBQR1JFU19UVVBMRVNfT0spOworCWlmIChQUW50dXBs ZXMocmVzKSAhPSAyKQorCQlwZ19mYXRhbCgiZXhwZWN0ZWQgMiByb3dzIGZyb20gZm9yd2FyZCBm ZXRjaCwgZ290ICVkIiwgUFFudHVwbGVzKHJlcykpOworCVBRY2xlYXIocmVzKTsKKwljb25zdW1l X251bGxfcmVzdWx0KGNvbm4pOworCisJLyogRkVUQ0ggYmFja3dhcmQgMSDigJQgc2hvdWxkIGdl dCByb3cgd2l0aCBpZD0xICovCisJcmVzID0gY29uZmlybV9yZXN1bHRfc3RhdHVzKGNvbm4sIFBH UkVTX1RVUExFU19PSyk7CisJaWYgKFBRbnR1cGxlcyhyZXMpICE9IDEpCisJCXBnX2ZhdGFsKCJl eHBlY3RlZCAxIHJvdyBmcm9tIGJhY2t3YXJkIGZldGNoLCBnb3QgJWQiLCBQUW50dXBsZXMocmVz KSk7CisJaWYgKHN0cmNtcChQUWdldHZhbHVlKHJlcywgMCwgMCksICIxIikgIT0gMCkKKwkJcGdf ZmF0YWwoImV4cGVjdGVkIHZhbHVlICcxJyBmcm9tIGJhY2t3YXJkIGZldGNoLCBnb3QgJyVzJyIs CisJCQkJIFBRZ2V0dmFsdWUocmVzLCAwLCAwKSk7CisJUFFjbGVhcihyZXMpOworCWNvbnN1bWVf bnVsbF9yZXN1bHQoY29ubik7CisKKwkvKiBDTE9TRSAqLworCWNvbnN1bWVfcmVzdWx0X3N0YXR1 cyhjb25uLCBQR1JFU19DT01NQU5EX09LKTsKKwljb25zdW1lX251bGxfcmVzdWx0KGNvbm4pOwor CisJY29uc3VtZV9yZXN1bHRfc3RhdHVzKGNvbm4sIFBHUkVTX1BJUEVMSU5FX1NZTkMpOworCWNv bnN1bWVfbnVsbF9yZXN1bHQoY29ubik7CisKKwlpZiAoUFFleGl0UGlwZWxpbmVNb2RlKGNvbm4p ICE9IDEpCisJCXBnX2ZhdGFsKCJmYWlsZWQgdG8gZXhpdCBwaXBlbGluZSBtb2RlOiAlcyIsIFBR ZXJyb3JNZXNzYWdlKGNvbm4pKTsKKworCWZwcmludGYoc3RkZXJyLCAib2tcbiIpOworfQorCisv KgorICogVGVzdCB0aGF0IGN1cnNvciBvcHRpb25zIG9uIGEgRE1MIHN0YXRlbWVudCBhcmUgaGFy bWxlc3NseSBpZ25vcmVkLgorICogVGhlIHBvcnRhbCBnZXRzIGN1cnNvck9wdGlvbnMgc2V0LCBi dXQgc2luY2UgaXQncyBub3QgYSBERUNMQVJFIENVUlNPUiwKKyAqIHRoZSBvcHRpb25zIGhhdmUg bm8gZWZmZWN0LgorICovCitzdGF0aWMgdm9pZAordGVzdF9kbWxfd2l0aF9jdXJzb3Jfb3B0aW9u cyhQR2Nvbm4gKmNvbm4pCit7CisJUEdyZXN1bHQgICAqcmVzOworCisJZnByaW50ZihzdGRlcnIs ICJ0ZXN0X2RtbF93aXRoX2N1cnNvcl9vcHRpb25zLi4uICIpOworCisJcmVzID0gUFFleGVjKGNv bm4sICJDUkVBVEUgVEVNUCBUQUJMRSBJRiBOT1QgRVhJU1RTIGRtbF90ZXN0KGlkIGludCkiKTsK KwlpZiAoUFFyZXN1bHRTdGF0dXMocmVzKSAhPSBQR1JFU19DT01NQU5EX09LKQorCQlwZ19mYXRh bCgiQ1JFQVRFIFRBQkxFIGZhaWxlZDogJXMiLCBQUWVycm9yTWVzc2FnZShjb25uKSk7CisJUFFj bGVhcihyZXMpOworCisJcmVzID0gUFFwcmVwYXJlKGNvbm4sICJkbWxzdG10IiwKKwkJCQkJIklO U0VSVCBJTlRPIGRtbF90ZXN0IFZBTFVFUyAoMSksICgyKSwgKDMpIiwgMCwgTlVMTCk7CisJaWYg KFBRcmVzdWx0U3RhdHVzKHJlcykgIT0gUEdSRVNfQ09NTUFORF9PSykKKwkJcGdfZmF0YWwoIlBS RVBBUkUgZmFpbGVkOiAlcyIsIFBRZXJyb3JNZXNzYWdlKGNvbm4pKTsKKwlQUWNsZWFyKHJlcyk7 CisKKwlpZiAoUFFlbnRlclBpcGVsaW5lTW9kZShjb25uKSAhPSAxKQorCQlwZ19mYXRhbCgiZmFp bGVkIHRvIGVudGVyIHBpcGVsaW5lIG1vZGU6ICVzIiwgUFFlcnJvck1lc3NhZ2UoY29ubikpOwor CisJLyogUGFzcyBTQ1JPTEwgb3B0aW9uIG9uIGEgRE1MIOKAlCBzaG91bGQgYmUgc2lsZW50bHkg aWdub3JlZCAqLworCWlmIChQUXNlbmRCaW5kV2l0aEN1cnNvck9wdGlvbnMoY29ubiwgImRtbHN0 bXQiLCAwLCBOVUxMLCBOVUxMLCBOVUxMLCAwLAorCQkJCQkJCQkJImRtbHBvcnRhbCIsIENVUlNP Ul9PUFRfU0NST0xMKSAhPSAxKQorCQlwZ19mYXRhbCgiUFFzZW5kQmluZFdpdGhDdXJzb3JPcHRp b25zIGZhaWxlZDogJXMiLCBQUWVycm9yTWVzc2FnZShjb25uKSk7CisKKwlpZiAoUFFwaXBlbGlu ZVN5bmMoY29ubikgIT0gMSkKKwkJcGdfZmF0YWwoInBpcGVsaW5lIHN5bmMgZmFpbGVkOiAlcyIs IFBRZXJyb3JNZXNzYWdlKGNvbm4pKTsKKworCS8qIEJpbmQrRGVzY3JpYmUgcmVzdWx0ICovCisJ cmVzID0gY29uZmlybV9yZXN1bHRfc3RhdHVzKGNvbm4sIFBHUkVTX0NPTU1BTkRfT0spOworCVBR Y2xlYXIocmVzKTsKKwljb25zdW1lX251bGxfcmVzdWx0KGNvbm4pOworCisJY29uc3VtZV9yZXN1 bHRfc3RhdHVzKGNvbm4sIFBHUkVTX1BJUEVMSU5FX1NZTkMpOworCWNvbnN1bWVfbnVsbF9yZXN1 bHQoY29ubik7CisKKwlpZiAoUFFleGl0UGlwZWxpbmVNb2RlKGNvbm4pICE9IDEpCisJCXBnX2Zh dGFsKCJmYWlsZWQgdG8gZXhpdCBwaXBlbGluZSBtb2RlOiAlcyIsIFBRZXJyb3JNZXNzYWdlKGNv bm4pKTsKKworCS8qIFZlcmlmeSB0aGUgSU5TRVJUIGRpZG4ndCBhY3R1YWxseSBleGVjdXRlIChC aW5kK0Rlc2NyaWJlIG9ubHkpICovCisJcmVzID0gUFFleGVjKGNvbm4sICJTRUxFQ1QgY291bnQo KikgRlJPTSBkbWxfdGVzdCIpOworCWlmIChQUXJlc3VsdFN0YXR1cyhyZXMpICE9IFBHUkVTX1RV UExFU19PSykKKwkJcGdfZmF0YWwoIlNFTEVDVCBjb3VudCBmYWlsZWQ6ICVzIiwgUFFlcnJvck1l c3NhZ2UoY29ubikpOworCWlmIChzdHJjbXAoUFFnZXR2YWx1ZShyZXMsIDAsIDApLCAiMCIpICE9 IDApCisJCXBnX2ZhdGFsKCJleHBlY3RlZCAwIHJvd3MgKEJpbmQrRGVzY3JpYmUgZG9lc24ndCBl eGVjdXRlKSwgZ290ICVzIiwKKwkJCQkgUFFnZXR2YWx1ZShyZXMsIDAsIDApKTsKKwlQUWNsZWFy KHJlcyk7CisKKwlmcHJpbnRmKHN0ZGVyciwgIm9rXG4iKTsKK30KKworLyoKKyAqIFRlc3QgY2xp ZW50LXNpZGUgdmFsaWRhdGlvbjogUFFzZW5kQmluZFdpdGhDdXJzb3JPcHRpb25zIHNob3VsZCBy ZWplY3QKKyAqIGFuIHVubmFtZWQgKGVtcHR5KSBwb3J0YWwuCisgKi8KK3N0YXRpYyB2b2lkCit0 ZXN0X3VubmFtZWRfcG9ydGFsX3JlamVjdGVkKFBHY29ubiAqY29ubikKK3sKKwlQR3Jlc3VsdCAg ICpyZXM7CisKKwlmcHJpbnRmKHN0ZGVyciwgInRlc3RfdW5uYW1lZF9wb3J0YWxfcmVqZWN0ZWQu Li4gIik7CisKKwlyZXMgPSBQUXByZXBhcmUoY29ubiwgInJlamVjdHN0bXQiLCAiU0VMRUNUIDEi LCAwLCBOVUxMKTsKKwlpZiAoUFFyZXN1bHRTdGF0dXMocmVzKSAhPSBQR1JFU19DT01NQU5EX09L KQorCQlwZ19mYXRhbCgiUFJFUEFSRSBmYWlsZWQ6ICVzIiwgUFFlcnJvck1lc3NhZ2UoY29ubikp OworCVBRY2xlYXIocmVzKTsKKworCWlmIChQUWVudGVyUGlwZWxpbmVNb2RlKGNvbm4pICE9IDEp CisJCXBnX2ZhdGFsKCJmYWlsZWQgdG8gZW50ZXIgcGlwZWxpbmUgbW9kZTogJXMiLCBQUWVycm9y TWVzc2FnZShjb25uKSk7CisKKwkvKiBFbXB0eSBwb3J0YWwgbmFtZSBzaG91bGQgYmUgcmVqZWN0 ZWQgY2xpZW50LXNpZGUgKi8KKwlpZiAoUFFzZW5kQmluZFdpdGhDdXJzb3JPcHRpb25zKGNvbm4s ICJyZWplY3RzdG10IiwgMCwgTlVMTCwgTlVMTCwgTlVMTCwgMCwKKwkJCQkJCQkJCSIiLCBDVVJT T1JfT1BUX0hPTEQpICE9IDApCisJCXBnX2ZhdGFsKCJleHBlY3RlZCBQUXNlbmRCaW5kV2l0aEN1 cnNvck9wdGlvbnMgdG8gcmVqZWN0IGVtcHR5IHBvcnRhbCBuYW1lIik7CisKKwkvKiBOVUxMIHBv cnRhbCBuYW1lIHNob3VsZCBhbHNvIGJlIHJlamVjdGVkICovCisJaWYgKFBRc2VuZEJpbmRXaXRo Q3Vyc29yT3B0aW9ucyhjb25uLCAicmVqZWN0c3RtdCIsIDAsIE5VTEwsIE5VTEwsIE5VTEwsIDAs CisJCQkJCQkJCQlOVUxMLCBDVVJTT1JfT1BUX0hPTEQpICE9IDApCisJCXBnX2ZhdGFsKCJleHBl Y3RlZCBQUXNlbmRCaW5kV2l0aEN1cnNvck9wdGlvbnMgdG8gcmVqZWN0IE5VTEwgcG9ydGFsIG5h bWUiKTsKKworCWlmIChQUWV4aXRQaXBlbGluZU1vZGUoY29ubikgIT0gMSkKKwkJcGdfZmF0YWwo ImZhaWxlZCB0byBleGl0IHBpcGVsaW5lIG1vZGU6ICVzIiwgUFFlcnJvck1lc3NhZ2UoY29ubikp OworCisJZnByaW50ZihzdGRlcnIsICJva1xuIik7Cit9CisKKy8qCisgKiBUZXN0IHRoYXQgY3Vy c29yIG9wdGlvbnMgYXJlIHJlamVjdGVkIHdoZW4gX3BxXy5wcm90b2NvbF9jdXJzb3IgaXMgbm90 IG5lZ290aWF0ZWQuCisgKiBIT0xEIGlzIHJlcXVlc3RlZCBidXQgdGhlIGV4dGVuc2lvbiBpcyBk aXNhYmxlZCwgc28gdGhlIEFQSSBjYWxsIGl0c2VsZgorICogcmV0dXJucyAwLgorICovCitzdGF0 aWMgdm9pZAordGVzdF9jdXJzb3Jfb3B0aW9uc193aXRob3V0X2V4dGVuc2lvbihQR2Nvbm4gKmNv bm4pCit7CisJUEdyZXN1bHQgICAqcmVzOworCisJZnByaW50ZihzdGRlcnIsICJ0ZXN0X2N1cnNv cl9vcHRpb25zX3dpdGhvdXRfZXh0ZW5zaW9uLi4uICIpOworCisJcmVzID0gUFFwcmVwYXJlKGNv bm4sICJub2V4dHN0bXQiLCAiU0VMRUNUIDEiLCAwLCBOVUxMKTsKKwlpZiAoUFFyZXN1bHRTdGF0 dXMocmVzKSAhPSBQR1JFU19DT01NQU5EX09LKQorCQlwZ19mYXRhbCgiUFJFUEFSRSBmYWlsZWQ6 ICVzIiwgUFFlcnJvck1lc3NhZ2UoY29ubikpOworCVBRY2xlYXIocmVzKTsKKworCWlmIChQUWVu dGVyUGlwZWxpbmVNb2RlKGNvbm4pICE9IDEpCisJCXBnX2ZhdGFsKCJmYWlsZWQgdG8gZW50ZXIg cGlwZWxpbmUgbW9kZTogJXMiLCBQUWVycm9yTWVzc2FnZShjb25uKSk7CisKKwkvKiBOb24temVy byBjdXJzb3JPcHRpb25zIHNob3VsZCBiZSByZWplY3RlZCB3aGVuIGV4dGVuc2lvbiBpcyBkaXNh YmxlZCAqLworCWlmIChQUXNlbmRCaW5kV2l0aEN1cnNvck9wdGlvbnMoY29ubiwgIm5vZXh0c3Rt dCIsIDAsIE5VTEwsIE5VTEwsIE5VTEwsIDAsCisJCQkJCQkJCQkibm9leHRwb3J0YWwiLCBDVVJT T1JfT1BUX0hPTEQpICE9IDApCisJCXBnX2ZhdGFsKCJleHBlY3RlZCBQUXNlbmRCaW5kV2l0aEN1 cnNvck9wdGlvbnMgdG8gcmVqZWN0IGN1cnNvciBvcHRpb25zIik7CisKKwkvKiBaZXJvIGN1cnNv ck9wdGlvbnMgc2hvdWxkIHN0aWxsIHN1Y2NlZWQgKi8KKwlpZiAoUFFzZW5kQmluZFdpdGhDdXJz b3JPcHRpb25zKGNvbm4sICJub2V4dHN0bXQiLCAwLCBOVUxMLCBOVUxMLCBOVUxMLCAwLAorCQkJ CQkJCQkJIm5vZXh0cG9ydGFsIiwgMCkgIT0gMSkKKwkJcGdfZmF0YWwoIlBRc2VuZEJpbmRXaXRo Q3Vyc29yT3B0aW9ucyB3aXRoIHplcm8gb3B0aW9ucyBmYWlsZWQ6ICVzIiwKKwkJCQkgUFFlcnJv ck1lc3NhZ2UoY29ubikpOworCisJaWYgKFBRcGlwZWxpbmVTeW5jKGNvbm4pICE9IDEpCisJCXBn X2ZhdGFsKCJwaXBlbGluZSBzeW5jIGZhaWxlZDogJXMiLCBQUWVycm9yTWVzc2FnZShjb25uKSk7 CisKKwkvKiBCaW5kK0Rlc2NyaWJlIHJlc3VsdCAqLworCXJlcyA9IGNvbmZpcm1fcmVzdWx0X3N0 YXR1cyhjb25uLCBQR1JFU19DT01NQU5EX09LKTsKKwlQUWNsZWFyKHJlcyk7CisJY29uc3VtZV9u dWxsX3Jlc3VsdChjb25uKTsKKworCWNvbnN1bWVfcmVzdWx0X3N0YXR1cyhjb25uLCBQR1JFU19Q SVBFTElORV9TWU5DKTsKKwljb25zdW1lX251bGxfcmVzdWx0KGNvbm4pOworCisJaWYgKFBRZXhp dFBpcGVsaW5lTW9kZShjb25uKSAhPSAxKQorCQlwZ19mYXRhbCgiZmFpbGVkIHRvIGV4aXQgcGlw ZWxpbmUgbW9kZTogJXMiLCBQUWVycm9yTWVzc2FnZShjb25uKSk7CisKKwlmcHJpbnRmKHN0ZGVy ciwgIm9rXG4iKTsKK30KKworc3RhdGljIHZvaWQKK3VzYWdlKGNvbnN0IGNoYXIgKnByb2duYW1l KQoreworCWZwcmludGYoc3RkZXJyLCAiJXMgdGVzdHMgZXh0ZW5kZWQgcXVlcnkgcHJvdG9jb2wg Y3Vyc29yIG9wdGlvbnMuXG5cbiIsIHByb2duYW1lKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlVzYWdl OlxuIik7CisJZnByaW50ZihzdGRlcnIsICIgICVzIHRlc3RzXG4iLCBwcm9nbmFtZSk7CisJZnBy aW50ZihzdGRlcnIsICIgICVzIFRFU1ROQU1FIFtDT05OSU5GT11cbiIsIHByb2duYW1lKTsKK30K Kworc3RhdGljIHZvaWQKK3ByaW50X3Rlc3RfbGlzdCh2b2lkKQoreworCXByaW50ZigiYmluYXJ5 X2N1cnNvclxuIik7CisJcHJpbnRmKCJkbWxfd2l0aF9jdXJzb3Jfb3B0aW9uc1xuIik7CisJcHJp bnRmKCJob2xkX3Njcm9sbF9jdXJzb3JcbiIpOworCXByaW50ZigiaG9sZGFibGVfY3Vyc29yXG4i KTsKKwlwcmludGYoIm5vX3Njcm9sbF9jdXJzb3JcbiIpOworCXByaW50Zigic2Nyb2xsX2N1cnNv clxuIik7CisJcHJpbnRmKCJ1bm5hbWVkX3BvcnRhbF9yZWplY3RlZFxuIik7CisJcHJpbnRmKCJj dXJzb3Jfb3B0aW9uc193aXRob3V0X2V4dGVuc2lvblxuIik7Cit9CisKK2ludAorbWFpbihpbnQg YXJnYywgY2hhciAqKmFyZ3YpCit7CisJY29uc3QgY2hhciAqY29ubmluZm8gPSAiIjsKKwlQR2Nv bm4JICAgKmNvbm47CisJY2hhcgkgICAqdGVzdG5hbWU7CisJUEdyZXN1bHQgICAqcmVzOworCisJ aWYgKGFyZ2MgPCAyKQorCXsKKwkJdXNhZ2UoYXJndlswXSk7CisJCWV4aXQoMSk7CisJfQorCisJ dGVzdG5hbWUgPSBhcmd2WzFdOworCisJaWYgKHN0cmNtcCh0ZXN0bmFtZSwgInRlc3RzIikgPT0g MCkKKwl7CisJCXByaW50X3Rlc3RfbGlzdCgpOworCQlleGl0KDApOworCX0KKworCWlmIChhcmdj ID4gMikKKwkJY29ubmluZm8gPSBhcmd2WzJdOworCisJY29ubiA9IFBRY29ubmVjdGRiKGNvbm5p bmZvKTsKKwlpZiAoUFFzdGF0dXMoY29ubikgIT0gQ09OTkVDVElPTl9PSykKKwl7CisJCWZwcmlu dGYoc3RkZXJyLCAiQ29ubmVjdGlvbiB0byBkYXRhYmFzZSBmYWlsZWQ6ICVzXG4iLAorCQkJCVBR ZXJyb3JNZXNzYWdlKGNvbm4pKTsKKwkJZXhpdF9uaWNlbHkoY29ubik7CisJfQorCisJcmVzID0g UFFleGVjKGNvbm4sICJTRVQgbGNfbWVzc2FnZXMgVE8gXCJDXCIiKTsKKwlpZiAoUFFyZXN1bHRT dGF0dXMocmVzKSAhPSBQR1JFU19DT01NQU5EX09LKQorCQlwZ19mYXRhbCgiZmFpbGVkIHRvIHNl dCBcImxjX21lc3NhZ2VzXCI6ICVzIiwgUFFlcnJvck1lc3NhZ2UoY29ubikpOworCVBRY2xlYXIo cmVzKTsKKworCWlmIChzdHJjbXAodGVzdG5hbWUsICJiaW5hcnlfY3Vyc29yIikgPT0gMCkKKwkJ dGVzdF9iaW5hcnlfY3Vyc29yKGNvbm4pOworCWVsc2UgaWYgKHN0cmNtcCh0ZXN0bmFtZSwgImN1 cnNvcl9vcHRpb25zX3dpdGhvdXRfZXh0ZW5zaW9uIikgPT0gMCkKKwkJdGVzdF9jdXJzb3Jfb3B0 aW9uc193aXRob3V0X2V4dGVuc2lvbihjb25uKTsKKwllbHNlIGlmIChzdHJjbXAodGVzdG5hbWUs ICJkbWxfd2l0aF9jdXJzb3Jfb3B0aW9ucyIpID09IDApCisJCXRlc3RfZG1sX3dpdGhfY3Vyc29y X29wdGlvbnMoY29ubik7CisJZWxzZSBpZiAoc3RyY21wKHRlc3RuYW1lLCAiaG9sZF9zY3JvbGxf Y3Vyc29yIikgPT0gMCkKKwkJdGVzdF9ob2xkX3Njcm9sbF9jdXJzb3IoY29ubik7CisJZWxzZSBp ZiAoc3RyY21wKHRlc3RuYW1lLCAiaG9sZGFibGVfY3Vyc29yIikgPT0gMCkKKwkJdGVzdF9ob2xk YWJsZV9jdXJzb3IoY29ubik7CisJZWxzZSBpZiAoc3RyY21wKHRlc3RuYW1lLCAibm9fc2Nyb2xs X2N1cnNvciIpID09IDApCisJCXRlc3Rfbm9fc2Nyb2xsX2N1cnNvcihjb25uKTsKKwllbHNlIGlm IChzdHJjbXAodGVzdG5hbWUsICJzY3JvbGxfY3Vyc29yIikgPT0gMCkKKwkJdGVzdF9zY3JvbGxf Y3Vyc29yKGNvbm4pOworCWVsc2UgaWYgKHN0cmNtcCh0ZXN0bmFtZSwgInVubmFtZWRfcG9ydGFs X3JlamVjdGVkIikgPT0gMCkKKwkJdGVzdF91bm5hbWVkX3BvcnRhbF9yZWplY3RlZChjb25uKTsK KwllbHNlCisJeworCQlmcHJpbnRmKHN0ZGVyciwgIlwiJXNcIiBpcyBub3QgYSByZWNvZ25pemVk IHRlc3QgbmFtZVxuIiwgdGVzdG5hbWUpOworCQlleGl0KDEpOworCX0KKworCVBRZmluaXNoKGNv bm4pOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvbW9kdWxlcy9saWJwcV9w cm90b2NvbF9jdXJzb3IvbWVzb24uYnVpbGQgYi9zcmMvdGVzdC9tb2R1bGVzL2xpYnBxX3Byb3Rv Y29sX2N1cnNvci9tZXNvbi5idWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAw MDAwMC4uY2M3NjI0MDEyY2IKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9tb2R1bGVzL2xp YnBxX3Byb3RvY29sX2N1cnNvci9tZXNvbi5idWlsZApAQCAtMCwwICsxLDMyIEBACisjIENvcHly aWdodCAoYykgMjAyMi0yMDI2LCBQb3N0Z3JlU1FMIEdsb2JhbCBEZXZlbG9wbWVudCBHcm91cAor CitsaWJwcV9wcm90b2NvbF9jdXJzb3Jfc291cmNlcyA9IGZpbGVzKAorICAnbGlicHFfcHJvdG9j b2xfY3Vyc29yLmMnLAorKQorCitpZiBob3N0X3N5c3RlbSA9PSAnd2luZG93cycKKyAgbGlicHFf cHJvdG9jb2xfY3Vyc29yX3NvdXJjZXMgKz0gcmNfYmluX2dlbi5wcm9jZXNzKHdpbjMydmVyX3Jj LCBleHRyYV9hcmdzOiBbCisgICAgJy0tTkFNRScsICdsaWJwcV9wcm90b2NvbF9jdXJzb3InLAor ICAgICctLUZJTEVERVNDJywgJ2xpYnBxX3Byb3RvY29sX2N1cnNvciAtIHRlc3QgcHJvZ3JhbSBm b3IgZXh0ZW5kZWQgcXVlcnkgcHJvdG9jb2wgY3Vyc29ycycsXSkKK2VuZGlmCisKK2xpYnBxX3By b3RvY29sX2N1cnNvciA9IGV4ZWN1dGFibGUoJ2xpYnBxX3Byb3RvY29sX2N1cnNvcicsCisgIGxp YnBxX3Byb3RvY29sX2N1cnNvcl9zb3VyY2VzLAorICBkZXBlbmRlbmNpZXM6IFtmcm9udGVuZF9j b2RlLCBsaWJwcV0sCisgIGt3YXJnczogZGVmYXVsdF9iaW5fYXJncyArIHsKKyAgICAnaW5zdGFs bCc6IGZhbHNlLAorICB9LAorKQordGVzdHByZXBfdGFyZ2V0cyArPSBsaWJwcV9wcm90b2NvbF9j dXJzb3IKKwordGVzdHMgKz0geworICAnbmFtZSc6ICdsaWJwcV9wcm90b2NvbF9jdXJzb3InLAor ICAnc2QnOiBtZXNvbi5jdXJyZW50X3NvdXJjZV9kaXIoKSwKKyAgJ2JkJzogbWVzb24uY3VycmVu dF9idWlsZF9kaXIoKSwKKyAgJ3RhcCc6IHsKKyAgICAndGVzdHMnOiBbCisgICAgICAndC8wMDFf bGlicHFfcHJvdG9jb2xfY3Vyc29yLnBsJywKKyAgICBdLAorICAgICdkZXBzJzogW2xpYnBxX3By b3RvY29sX2N1cnNvcl0sCisgIH0sCit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9tb2R1bGVzL2xp YnBxX3Byb3RvY29sX2N1cnNvci90LzAwMV9saWJwcV9wcm90b2NvbF9jdXJzb3IucGwgYi9zcmMv dGVzdC9tb2R1bGVzL2xpYnBxX3Byb3RvY29sX2N1cnNvci90LzAwMV9saWJwcV9wcm90b2NvbF9j dXJzb3IucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLjg2MDYzMWM4 OTQ3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvbW9kdWxlcy9saWJwcV9wcm90b2NvbF9j dXJzb3IvdC8wMDFfbGlicHFfcHJvdG9jb2xfY3Vyc29yLnBsCkBAIC0wLDAgKzEsNDIgQEAKKyMg Q29weXJpZ2h0IChjKSAyMDI0LTIwMjYsIFBvc3RncmVTUUwgR2xvYmFsIERldmVsb3BtZW50IEdy b3VwCisKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3MgRkFUQUwgPT4gJ2FsbCc7CisKK3VzZSBQ b3N0Z3JlU1FMOjpUZXN0OjpDbHVzdGVyOwordXNlIFBvc3RncmVTUUw6OlRlc3Q6OlV0aWxzOwor dXNlIFRlc3Q6Ok1vcmU7CisKK215ICRub2RlID0gUG9zdGdyZVNRTDo6VGVzdDo6Q2x1c3Rlci0+ bmV3KCdtYWluJyk7Ciskbm9kZS0+aW5pdDsKKyRub2RlLT5zdGFydDsKKworbXkgKCRvdXQsICRl cnIpID0gcnVuX2NvbW1hbmQoWydsaWJwcV9wcm90b2NvbF9jdXJzb3InLCAndGVzdHMnXSk7Citk aWUgIm9vcHM6ICRlcnIiIHVubGVzcyAkZXJyIGVxICcnOworbXkgQHRlc3RzID0gc3BsaXQoL1xz Ky8sICRvdXQpOworCitmb3IgbXkgJHRlc3RuYW1lIChAdGVzdHMpCit7CisJIyBjdXJzb3Jfb3B0 aW9uc193aXRob3V0X2V4dGVuc2lvbiBtdXN0IHJ1biB3aXRob3V0IHByb3RvY29sX2N1cnNvciBl bmFibGVkCisJbXkgJGNvbm5zdHIgPSAkbm9kZS0+Y29ubnN0cigncG9zdGdyZXMnKTsKKwlpZiAo JHRlc3RuYW1lIGVxICdjdXJzb3Jfb3B0aW9uc193aXRob3V0X2V4dGVuc2lvbicpCisJeworCQkk Y29ubnN0ciAuPSAiIHByb3RvY29sX2N1cnNvcj0wIjsKKwl9CisJZWxzZQorCXsKKwkJJGNvbm5z dHIgLj0gIiBwcm90b2NvbF9jdXJzb3I9MSBtYXhfcHJvdG9jb2xfdmVyc2lvbj1sYXRlc3QiOwor CX0KKworCSRub2RlLT5jb21tYW5kX29rKAorCQlbCisJCQknbGlicHFfcHJvdG9jb2xfY3Vyc29y JywKKwkJCSR0ZXN0bmFtZSwKKwkJCSRjb25uc3RyCisJCV0sCisJCSJsaWJwcV9wcm90b2NvbF9j dXJzb3IgJHRlc3RuYW1lIik7Cit9CisKKyRub2RlLT5zdG9wKCdmYXN0Jyk7CisKK2RvbmVfdGVz dGluZygpOwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvbW9kdWxlcy9tZXNvbi5idWlsZCBiL3NyYy90 ZXN0L21vZHVsZXMvbWVzb24uYnVpbGQKaW5kZXggM2FjMjkxNjU2YzEuLjU2MjdhMjc0MTY0IDEw MDY0NAotLS0gYS9zcmMvdGVzdC9tb2R1bGVzL21lc29uLmJ1aWxkCisrKyBiL3NyYy90ZXN0L21v ZHVsZXMvbWVzb24uYnVpbGQKQEAgLTksNiArOSw3IEBAIHN1YmRpcignZ2luJykKIHN1YmRpcign aW5kZXgnKQogc3ViZGlyKCdpbmplY3Rpb25fcG9pbnRzJykKIHN1YmRpcignbGRhcF9wYXNzd29y ZF9mdW5jJykKK3N1YmRpcignbGlicHFfcHJvdG9jb2xfY3Vyc29yJykKIHN1YmRpcignbGlicHFf cGlwZWxpbmUnKQogc3ViZGlyKCduYnRyZWUnKQogc3ViZGlyKCdvYXV0aF92YWxpZGF0b3InKQot LSAKMi40Ny4zCgo= --000000000000ffa1b3064dcb5c4d--