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 1wAtFp-000XLL-1a for pgsql-hackers@arkaria.postgresql.org; Thu, 09 Apr 2026 17:33:22 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1wAtFn-006o2t-1R for pgsql-hackers@arkaria.postgresql.org; Thu, 09 Apr 2026 17:33:20 +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 1wAtFm-006o2k-2I for pgsql-hackers@lists.postgresql.org; Thu, 09 Apr 2026 17:33:20 +0000 Received: from mail-qk1-x72f.google.com ([2607:f8b0:4864:20::72f]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1wAtFl-00000000CLz-1QdV for pgsql-hackers@lists.postgresql.org; Thu, 09 Apr 2026 17:33:18 +0000 Received: by mail-qk1-x72f.google.com with SMTP id af79cd13be357-8d4b31f1df6so15910385a.0 for ; Thu, 09 Apr 2026 10:33:17 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1775755996; cv=none; d=google.com; s=arc-20240605; b=M3b59CMuUQw4kjKZFoJM+RmZ7w8/C4/d5tjK1hjkUsRLHW71EarWR7N7Kry7or85pb WDx7WGlO+Y0OKVQTcw32pEey7msOgIQTePaq7CZZb+tqHUDT/UPVS+2o3ER3T4VeLrXI 0WJfcCe6Xl42UuCgqHDlGpwpefTz+EA4YJTf9sephZLIlS9b8MYse5GbiMt47bcW7nKo GKg1OCARaFgzvezm84bf1A8fdfUWDioztQVB5U1YdgmtHEmHksAVkZFOFjfyO0tmJh/b 3ql5Kq7O82f289Qdm86MYire6zMEwDL8fTmfjmYVT87wztVaGXrjoo7v1PvR4itaVA3y pynw== 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=4ygMm+5xoFPJEYclnodD+Q+/4JiZLJDgvGychTho8qo=; fh=Z+ut1I7vD7jEynComERW53U6C/xvzX28aYvKh6S1AIs=; b=AeTKOrlNdC0Y9yUwBI77Go5YB8nklYJagGDiveYrganptBaisElbJajwR5ftMVM2rk dPNhwT9CHNi1HThke3VGJ+G8C8C2NAUI3lX9BwNTRuir51nUDHSTOKQ6je7C5FImLJgZ lYgbqNPKWen2MDVx/8uBHutlBByx6X+Ri5ue/Nh+akhbtt3KGN2YT+gvx3CX3DrGxwfp q/fwMfvN0VRbtgIMJFBta7fM1ukh1jUTIHteyI0pbNp+ynZn4V+AOx+sKZd1U/tHmVQy ixenUDgQ4Yn71D1AqqefdD0OXcjTNv+PgP626G0wqcf+JuXnWF+upAMDpZ33T9envJMy Iy5Q==; 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=1775755996; x=1776360796; 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=4ygMm+5xoFPJEYclnodD+Q+/4JiZLJDgvGychTho8qo=; b=ZlyxWapim9xR012bkKlorHG3jPdWU2xm7/4h2ATREoAWPDIbW4atxmrtZusgc7uM+d 9k+DfEMpaB+y9x6FOfP6KRgaNvH8M+gCb/GIdNGb9gH88dbS7MCVCoq9Zsfkhu6e23HH acghYNTV1dFsh8pgsizpD52M3F+Lyta9OPjHvQxcm3leLzrLH7Nc+/Y2HI7gH+YbyxMA TEvw21pHJo+xLJve9ydXVkTBRVK7ifL0MWwfMqJrjAQn6GFz7au2e5/dmkll/BhQhkof 1uJwIoviULnPDffwDOcB9tgJHnDrOZpN6Z0RW4dUr5xAk7f2aiyADuYfgApuUL89ELr/ ZmGQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775755996; x=1776360796; 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=4ygMm+5xoFPJEYclnodD+Q+/4JiZLJDgvGychTho8qo=; b=LaHBcfB1k1W+q8O6N7YeWYYczlowtfzz5eWbdf0XqxczIzrlOTzxBlNG847KMTfyhe Npey5xdwSSzwaQJBRxrbvHhX40jwkQ3p+d5h2j83DagI27DeQ9sTQJoxu8YdrdvSThtH uH54n2SiuEYj5QUhukq67FjGIxsI0vDxAGRgvafLwmGx3dQW+QmfB0XwD8iTTerznEwX GFsFxMcbxUBggTXlVoF0/xzJTOFhuA+mxZrEmJyUynds6+h6DUv62nxhFELmfXOwnfPJ cpUpPNNgHGoWFNqWc0C/xnPj6qlgSNqT0a9t9BkYP8dcES73bkN+dcrAJb+7MSCweMRE zd3g== X-Gm-Message-State: AOJu0YzXJzo8IcnSZLkD2sj4XX4CSQZD+2OkvyUF4dKpmNF+prZ1+K/u n0lFriQyZ+tA5EEkBe871VOGPWfRPCqPI2bvFULy3wqiEV5TU3Y4Pww8ITyPlSgDhGGGulK9H8+ slDVvWmAFgs/8O1xJg8nwIWENPBdzdFs= X-Gm-Gg: AeBDievyCS6RqaeIRIZ46MRNVRUYdbyomW9jMvZY//oGivz/O3ZkWG5fqgHlRD/sdOk zurenLtJcgI9MTsv0EA0QvwZJa/EwlEes5eXUUN7kMyCItBJGBNVhwmDfeFoJo+CzZSkZyhIue6 y7I7QR17dFtf4Jf1ZT07PozmiMchU2aRt9Pf5R6cHYUH0v2BR2qk4DzCZXaHt4Dy51a+Ae19zWy ViRY+GdnRHdK+GxHm8mcOWYtCRMeh2PCDS293YmqF7eUNAcdrNQfTSWnQ1y3gTF8Ahn5NZZ/NOd Yv4i22k= X-Received: by 2002:a05:620a:7103:b0:8cf:d5ca:adde with SMTP id af79cd13be357-8d41bcd66b4mr2660185185a.8.1775755996178; Thu, 09 Apr 2026 10:33:16 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: From: Adam Brusselback Date: Thu, 9 Apr 2026 13:32:59 -0400 X-Gm-Features: AQROBzCxSRNy6WDq6Lp1ZZXSlqp-z86ufyMuFMoaUSesxOMUPLyW26JZ6WGFmNE Message-ID: Subject: Re: [Patch] Add WHERE clause support to REFRESH MATERIALIZED VIEW To: Dharin Shah Cc: PostgreSQL Hackers Content-Type: multipart/mixed; boundary="0000000000005c7deb064f0a690d" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --0000000000005c7deb064f0a690d Content-Type: multipart/alternative; boundary="0000000000005c7deb064f0a690b" --0000000000005c7deb064f0a690b Content-Type: text/plain; charset="UTF-8" Hi Dharin, Attached is an updated patch addressing your review comments and fixing the concurrency model for the non-concurrent path. Regarding the items you brought up: 1. Fixed the indnatts vs indnkeyatts issue for generating the ON CONFLICT target. 2. Removed the incorrect regression test comment regarding subqueries. Regarding the concurrency gap and safety model: In my last email, I mentioned planning to use transaction-level advisory locks to fix the consistency gap. After prototyping it, I had to abandon that approach. Testing revealed that it falls over at scale, quickly hitting `max_locks_per_transaction` limits and causing issues with bulk operations. I worked on this for a while before deciding it wasn't workable. Instead, I went a different direction. The non-concurrent partial refresh now uses a different two-step strategy: 1. It first executes a `SELECT FROM mv WHERE ... FOR UPDATE` to lock existing rows matching the predicate. This serializes concurrent partial refreshes on overlapping rows while allowing non-overlapping refreshes to proceed in parallel. 2. It then executes a single CTE that evaluates the underlying query, upserts the results into the matview, and deletes rows that no longer match the predicate via an anti-join. In my testing, this approach had similar performance to the original implementation, but hasn't exhibited the same correctness issues. Thanks, Adam Brusselback --0000000000005c7deb064f0a690b Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
Hi Dhar= in,

Attached is an updated patch addressing your review comments and= fixing the concurrency model for the non-concurrent path.

Regarding= the items you brought up:
1. Fixed the indnatts vs indnkeyatts issue fo= r generating the ON CONFLICT target.
2. Removed the incorrect regression= test comment regarding subqueries.

Regarding the concurrency gap an= d safety model:
In my last email, I mentioned planning to use transacti= on-level advisory locks to fix the consistency gap. After prototyping it, I= had to abandon that approach. Testing revealed that it falls over at scale= , quickly hitting `max_locks_per_transaction` limits and causing issues wit= h bulk operations. I worked on this for a while before deciding it wasn'= ;t workable.

Instead, I went a different direction. The non-concurre= nt partial refresh now uses a different two-step strategy:

1. It fir= st executes a `SELECT FROM mv WHERE ... FOR UPDATE` to lock existing rows m= atching the predicate. This serializes concurrent partial refreshes on over= lapping rows while allowing non-overlapping refreshes to proceed in paralle= l.
2. It then executes a single CTE that evaluates the underlying query,= upserts the results into the matview, and deletes rows that no longer matc= h the predicate via an anti-join.

In my testing, this approach had s= imilar performance to the original implementation, but hasn't exhibited= the same correctness issues.

Thanks,
Adam Brusselback
--0000000000005c7deb064f0a690b-- --0000000000005c7deb064f0a690d Content-Type: application/x-patch; name="v2-0001-implement_mat_view_where.patch" Content-Disposition: attachment; filename="v2-0001-implement_mat_view_where.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mnrr6hso0 RnJvbSAyYTJkN2JhNGEzYzY4ZDY0NzE3NTc3ZTQ3ZTRkZmQ2ZjcyNGU2MjBhIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBBZGFtIEJydXNzZWxiYWNrIDxhZGFtYnJ1c3NlbGJhY2tAZ21h aWwuY29tPgpEYXRlOiBUaHUsIDkgQXByIDIwMjYgMTM6MTY6MzQgLTA0MDAKU3ViamVjdDogW1BB VENIIHYyXSBBZGQgc3VwcG9ydCBmb3IgcGFydGlhbCBtYXR2aWV3IHJlZnJlc2ggdXNpbmcgUkVG UkVTSAogTUFURVJJQUxJWkVEIFZJRVcgLi4uIFdIRVJFIC4uLmAKCi0tLQogLi4uL3NnbWwvcmVm L3JlZnJlc2hfbWF0ZXJpYWxpemVkX3ZpZXcuc2dtbCAgIHwgIDQ0ICstCiBzcmMvYmFja2VuZC9j b21tYW5kcy9jcmVhdGVhcy5jICAgICAgICAgICAgICAgfCAgIDQgKy0KIHNyYy9iYWNrZW5kL2Nv bW1hbmRzL21hdHZpZXcuYyAgICAgICAgICAgICAgICB8IDgxMyArKysrKysrKysrKysrKysrLS0K IHNyYy9iYWNrZW5kL2V4ZWN1dG9yL2V4ZWNNYWluLmMgICAgICAgICAgICAgICB8ICAgMyArLQog c3JjL2JhY2tlbmQvcGFyc2VyL2dyYW0ueSAgICAgICAgICAgICAgICAgICAgIHwgIDE0ICstCiBz cmMvYmFja2VuZC90Y29wL3V0aWxpdHkuYyAgICAgICAgICAgICAgICAgICAgfCAgIDIgKy0KIHNy Yy9pbmNsdWRlL2NvbW1hbmRzL21hdHZpZXcuaCAgICAgICAgICAgICAgICB8ICAgNiArLQogc3Jj L2luY2x1ZGUvbm9kZXMvcGFyc2Vub2Rlcy5oICAgICAgICAgICAgICAgIHwgICAxICsKIHNyYy90 ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvbWF0dmlld193aGVyZS5vdXQgICB8IDM0NCArKysrKysrKwog c3JjL3Rlc3QvcmVncmVzcy9wYXJhbGxlbF9zY2hlZHVsZSAgICAgICAgICAgIHwgICA1ICsKIHNy Yy90ZXN0L3JlZ3Jlc3Mvc3FsL21hdHZpZXdfd2hlcmUuc3FsICAgICAgICB8IDMwMiArKysrKysr CiAxMSBmaWxlcyBjaGFuZ2VkLCAxNDY4IGluc2VydGlvbnMoKyksIDcwIGRlbGV0aW9ucygtKQog Y3JlYXRlIG1vZGUgMTAwNjQ0IHNyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvbWF0dmlld193aGVy ZS5vdXQKIGNyZWF0ZSBtb2RlIDEwMDY0NCBzcmMvdGVzdC9yZWdyZXNzL3NxbC9tYXR2aWV3X3do ZXJlLnNxbAoKZGlmZiAtLWdpdCBhL2RvYy9zcmMvc2dtbC9yZWYvcmVmcmVzaF9tYXRlcmlhbGl6 ZWRfdmlldy5zZ21sIGIvZG9jL3NyYy9zZ21sL3JlZi9yZWZyZXNoX21hdGVyaWFsaXplZF92aWV3 LnNnbWwKaW5kZXggOGVkNDNhZGU4MDMuLmNhODEyZGRjZGY4IDEwMDY0NAotLS0gYS9kb2Mvc3Jj L3NnbWwvcmVmL3JlZnJlc2hfbWF0ZXJpYWxpemVkX3ZpZXcuc2dtbAorKysgYi9kb2Mvc3JjL3Nn bWwvcmVmL3JlZnJlc2hfbWF0ZXJpYWxpemVkX3ZpZXcuc2dtbApAQCAtMjIsNyArMjIsNyBAQCBQ b3N0Z3JlU1FMIGRvY3VtZW50YXRpb24KICA8cmVmc3lub3BzaXNkaXY+CiA8c3lub3BzaXM+CiBS RUZSRVNIIE1BVEVSSUFMSVpFRCBWSUVXIFsgQ09OQ1VSUkVOVExZIF0gPHJlcGxhY2VhYmxlIGNs YXNzPSJwYXJhbWV0ZXIiPm5hbWU8L3JlcGxhY2VhYmxlPgotICAgIFsgV0lUSCBbIE5PIF0gREFU QSBdCisgICAgWyBXSVRIIFsgTk8gXSBEQVRBIF0gWyBXSEVSRSA8cmVwbGFjZWFibGUgY2xhc3M9 InBhcmFtZXRlciI+Y29uZGl0aW9uPC9yZXBsYWNlYWJsZT4gXQogPC9zeW5vcHNpcz4KICA8L3Jl ZnN5bm9wc2lzZGl2PgogCkBAIC00NCw2ICs0NCwxNSBAQCBSRUZSRVNIIE1BVEVSSUFMSVpFRCBW SUVXIFsgQ09OQ1VSUkVOVExZIF0gPHJlcGxhY2VhYmxlIGNsYXNzPSJwYXJhbWV0ZXIiPm5hbWU8 LwogICAgPGxpdGVyYWw+Q09OQ1VSUkVOVExZPC9saXRlcmFsPiBhbmQgPGxpdGVyYWw+V0lUSCBO TyBEQVRBPC9saXRlcmFsPiBtYXkgbm90CiAgICBiZSBzcGVjaWZpZWQgdG9nZXRoZXIuCiAgIDwv cGFyYT4KKyAgPHBhcmE+CisgICBJZiBhIDxsaXRlcmFsPldIRVJFPC9saXRlcmFsPiBjbGF1c2Ug aXMgc3BlY2lmaWVkLCBvbmx5IHRoZSByb3dzIG1hdGNoaW5nCisgICB0aGUgPHJlcGxhY2VhYmxl IGNsYXNzPSJwYXJhbWV0ZXIiPmNvbmRpdGlvbjwvcmVwbGFjZWFibGU+IGFyZSB1cGRhdGVkLgor ICAgUm93cyBpbiB0aGUgbWF0ZXJpYWxpemVkIHZpZXcgdGhhdCBtYXRjaCB0aGUgY29uZGl0aW9u IGJ1dCBhcmUgbm8gbG9uZ2VyCisgICBwcmVzZW50IGluIHRoZSB1bmRlcmx5aW5nIGJhc2UgdGFi bGVzIChvciBubyBsb25nZXIgbWF0Y2ggdGhlIHF1ZXJ5IGRlZmluaXRpb24pCisgICBhcmUgZGVs ZXRlZC4gTmV3IHJvd3MgZnJvbSB0aGUgYmFzZSB0YWJsZXMgdGhhdCBtYXRjaCB0aGUgY29uZGl0 aW9uIGFyZSBpbnNlcnRlZC4KKyAgIFJvd3MgaW4gdGhlIG1hdGVyaWFsaXplZCB2aWV3IHRoYXQg ZG8gbm90IG1hdGNoIHRoZSBjb25kaXRpb24gYXJlIGxlZnQgdW5jaGFuZ2VkLgorICAgVGhlIDxs aXRlcmFsPldIRVJFPC9saXRlcmFsPiBjbGF1c2UgY2Fubm90IGJlIHVzZWQgd2l0aCA8bGl0ZXJh bD5XSVRIIE5PIERBVEE8L2xpdGVyYWw+LgorICA8L3BhcmE+CiAgPC9yZWZzZWN0MT4KIAogIDxy ZWZzZWN0MT4KQEAgLTg3LDYgKzk2LDI5IEBAIFJFRlJFU0ggTUFURVJJQUxJWkVEIFZJRVcgWyBD T05DVVJSRU5UTFkgXSA8cmVwbGFjZWFibGUgY2xhc3M9InBhcmFtZXRlciI+bmFtZTwvCiAgICAg IDwvcGFyYT4KICAgICA8L2xpc3RpdGVtPgogICAgPC92YXJsaXN0ZW50cnk+CisKKyAgIDx2YXJs aXN0ZW50cnk+CisgICAgPHRlcm0+PGxpdGVyYWw+V0hFUkU8L2xpdGVyYWw+IDxyZXBsYWNlYWJs ZSBjbGFzcz0icGFyYW1ldGVyIj5jb25kaXRpb248L3JlcGxhY2VhYmxlPjwvdGVybT4KKyAgICA8 bGlzdGl0ZW0+CisgICAgIDxwYXJhPgorICAgICAgQSA8bGl0ZXJhbD5XSEVSRTwvbGl0ZXJhbD4g Y2xhdXNlIHNwZWNpZnlpbmcgYSBjb25kaXRpb24gdGhhdCBkZXRlcm1pbmVzCisgICAgICB3aGlj aCByb3dzIHRvIHJlZnJlc2guIFRoZSBjb25kaXRpb24gYXBwbGllcyB0byBib3RoIHRoZSBleGlz dGluZyBkYXRhCisgICAgICBpbiB0aGUgbWF0ZXJpYWxpemVkIHZpZXcgYW5kIHRoZSBuZXcgZGF0 YSBnZW5lcmF0ZWQgYnkgdGhlIHZpZXcncyBkZWZpbmluZyBxdWVyeS4KKyAgICAgPC9wYXJhPgor ICAgICA8cGFyYT4KKyAgICAgIFdoZW4gYSA8bGl0ZXJhbD5XSEVSRTwvbGl0ZXJhbD4gY2xhdXNl IGlzIHVzZWQgd2l0aG91dAorICAgICAgPGxpdGVyYWw+Q09OQ1VSUkVOVExZPC9saXRlcmFsPiwg dGhlIG9wZXJhdGlvbiByZXF1aXJlcyBhCisgICAgICA8bGl0ZXJhbD5ST1cgRVhDTFVTSVZFPC9s aXRlcmFsPiBsb2NrLCB3aGljaCBhbGxvd3MgY29uY3VycmVudCByZWFkcyBvbiB0aGUKKyAgICAg IG1hdGVyaWFsaXplZCB2aWV3IGJ1dCBibG9ja3Mgb3RoZXIgbW9kaWZpY2F0aW9uIGNvbW1hbmRz LiBUaGlzIGlzIGEgbG93ZXIKKyAgICAgIGxvY2sgbGV2ZWwgdGhhbiB0aGUgPGxpdGVyYWw+QUND RVNTIEVYQ0xVU0lWRTwvbGl0ZXJhbD4gbG9jayByZXF1aXJlZCBieSBhCisgICAgICBmdWxsIHJl ZnJlc2guCisgICAgIDwvcGFyYT4KKyAgICAgPHBhcmE+CisgICAgICBUaGUgPGxpdGVyYWw+V0hF UkU8L2xpdGVyYWw+IGNsYXVzZSBjYW5ub3QgY29udGFpbiB2b2xhdGlsZSBmdW5jdGlvbnMgb3IK KyAgICAgIGFnZ3JlZ2F0ZXMuIFRoZSBtYXRlcmlhbGl6ZWQgdmlldyBtdXN0IGJlIGFscmVhZHkg cG9wdWxhdGVkIHRvIHVzZSB0aGlzIG9wdGlvbi4KKyAgICAgPC9wYXJhPgorICAgIDwvbGlzdGl0 ZW0+CisgICA8L3Zhcmxpc3RlbnRyeT4KICAgPC92YXJpYWJsZWxpc3Q+CiAgPC9yZWZzZWN0MT4K IApAQCAtMTI1LDcgKzE1NywxNyBAQCBSRUZSRVNIIE1BVEVSSUFMSVpFRCBWSUVXIG9yZGVyX3N1 bW1hcnk7CiAgICBzdGF0ZToKIDxwcm9ncmFtbGlzdGluZz4KIFJFRlJFU0ggTUFURVJJQUxJWkVE IFZJRVcgYW5udWFsX3N0YXRpc3RpY3NfYmFzaXMgV0lUSCBOTyBEQVRBOworPC9wcm9ncmFtbGlz dGluZz4KKyAgPC9wYXJhPgorCisgIDxwYXJhPgorICAgVGhpcyBjb21tYW5kIHdpbGwgdXBkYXRl IG9ubHkgdGhlIHJvd3MgaW4gdGhlIG1hdGVyaWFsaXplZCB2aWV3CisgICA8bGl0ZXJhbD5vcmRl cl9zdW1tYXJ5PC9saXRlcmFsPiB3aGVyZSB0aGUgPGxpdGVyYWw+b3JkZXJfZGF0ZTwvbGl0ZXJh bD4KKyAgIGlzIGluIHRoZSB5ZWFyIDIwMjQ6Cis8cHJvZ3JhbWxpc3Rpbmc+CitSRUZSRVNIIE1B VEVSSUFMSVpFRCBWSUVXIG9yZGVyX3N1bW1hcnkgV0hFUkUgb3JkZXJfZGF0ZSA+PSAnMjAyNC0w MS0wMScgQU5EIG9yZGVyX2RhdGUgJmx0OyAnMjAyNS0wMS0wMSc7CiA8L3Byb2dyYW1saXN0aW5n PjwvcGFyYT4KKwogIDwvcmVmc2VjdDE+CiAKICA8cmVmc2VjdDE+CmRpZmYgLS1naXQgYS9zcmMv YmFja2VuZC9jb21tYW5kcy9jcmVhdGVhcy5jIGIvc3JjL2JhY2tlbmQvY29tbWFuZHMvY3JlYXRl YXMuYwppbmRleCA2ZGJiODMxY2E4OS4uNTAxNTU2MmRhZTcgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNr ZW5kL2NvbW1hbmRzL2NyZWF0ZWFzLmMKKysrIGIvc3JjL2JhY2tlbmQvY29tbWFuZHMvY3JlYXRl YXMuYwpAQCAtMjkzLDggKzI5Myw4IEBAIEV4ZWNDcmVhdGVUYWJsZUFzKFBhcnNlU3RhdGUgKnBz dGF0ZSwgQ3JlYXRlVGFibGVBc1N0bXQgKnN0bXQsCiAJCSAqIHJlZHVjZXMgdGhlIGNoYW5jZSB0 aGF0IGEgc3Vic2VxdWVudCByZWZyZXNoIHdpbGwgZmFpbC4KIAkJICovCiAJCWlmIChkb19yZWZy ZXNoKQotCQkJUmVmcmVzaE1hdFZpZXdCeU9pZChhZGRyZXNzLm9iamVjdElkLCB0cnVlLCBmYWxz ZSwgZmFsc2UsCi0JCQkJCQkJCXBzdGF0ZS0+cF9zb3VyY2V0ZXh0LCBxYyk7CisJCQlSZWZyZXNo TWF0Vmlld0J5T2lkKGFkZHJlc3Mub2JqZWN0SWQsIHRydWUsIGZhbHNlLCBmYWxzZSwgTlVMTCwK KwkJCQkJCQkJcHN0YXRlLT5wX3NvdXJjZXRleHQsIHBhcmFtcywgcWMpOwogCiAJfQogCWVsc2UK ZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2NvbW1hbmRzL21hdHZpZXcuYyBiL3NyYy9iYWNrZW5k L2NvbW1hbmRzL21hdHZpZXcuYwppbmRleCBmN2Q4MDA3Zjc5Ni4uMWRjNzM1OGZhNTIgMTAwNjQ0 Ci0tLSBhL3NyYy9iYWNrZW5kL2NvbW1hbmRzL21hdHZpZXcuYworKysgYi9zcmMvYmFja2VuZC9j b21tYW5kcy9tYXR2aWV3LmMKQEAgLTMyLDEyICszMiwyMCBAQAogI2luY2x1ZGUgImV4ZWN1dG9y L3NwaS5oIgogI2luY2x1ZGUgIm1pc2NhZG1pbi5oIgogI2luY2x1ZGUgInBnc3RhdC5oIgorI2lu Y2x1ZGUgIm9wdGltaXplci9vcHRpbWl6ZXIuaCIKKyNpbmNsdWRlICJwYXJzZXIvcGFyc2VfY2xh dXNlLmgiCisjaW5jbHVkZSAicGFyc2VyL3BhcnNlX2NvZXJjZS5oIgorI2luY2x1ZGUgInBhcnNl ci9wYXJzZV9leHByLmgiCisjaW5jbHVkZSAicGFyc2VyL3BhcnNlX3JlbGF0aW9uLmgiCiAjaW5j bHVkZSAicmV3cml0ZS9yZXdyaXRlSGFuZGxlci5oIgogI2luY2x1ZGUgInN0b3JhZ2UvbG1nci5o IgogI2luY2x1ZGUgInRjb3AvdGNvcHByb3QuaCIKICNpbmNsdWRlICJ1dGlscy9idWlsdGlucy5o IgorI2luY2x1ZGUgInV0aWxzL2hzZWFyY2guaCIKICNpbmNsdWRlICJ1dGlscy9sc3lzY2FjaGUu aCIKKyNpbmNsdWRlICJ1dGlscy9tZW11dGlscy5oIgogI2luY2x1ZGUgInV0aWxzL3JlbC5oIgor I2luY2x1ZGUgInV0aWxzL3J1bGV1dGlscy5oIgogI2luY2x1ZGUgInV0aWxzL3NuYXBtZ3IuaCIK ICNpbmNsdWRlICJ1dGlscy9zeXNjYWNoZS5oIgogCkBAIC01Myw2ICs2MSwyOCBAQCB0eXBlZGVm IHN0cnVjdAogCUJ1bGtJbnNlcnRTdGF0ZSBiaXN0YXRlOwkvKiBidWxrIGluc2VydCBzdGF0ZSAq LwogfSBEUl90cmFuc2llbnRyZWw7CiAKKy8qCisgKiBTZXNzaW9uLWxldmVsIGNhY2hlIGZvciBQ YXJ0aWFsIFJlZnJlc2ggcGxhbnMuCisgKiBXZSBjYWNoZSB0aGUgcHJlcGFyZWQgU1BJIHBsYW5z IGZvciBib3RoIHRoZSByb3ctbG9ja2luZyBhbmQgcmVmcmVzaCBzdGVwcworICogYXZvaWRpbmcg ZXhwZW5zaXZlIGNhbGxzIChwZ19nZXRfdmlld2RlZikgYW5kIHBhcnNpbmcgb24gZXZlcnkgZXhl Y3V0aW9uLgorICovCit0eXBlZGVmIHN0cnVjdCBNYXRWaWV3UGFydGlhbFJlZnJlc2hDYWNoZQor eworCU9pZAkJCW1hdHZpZXdPaWQ7CQkvKiBIYXNoIEtleSAqLworCisJLyogVmFsaWRhdGlvbiBm aWVsZHMgKi8KKwlPaWQJCQl1bmlxdWVJbmRleE9pZDsgLyogVGhlIHVuaXF1ZSBpbmRleCB1c2Vk IGZvciBjb25mbGljdAorCQkJCQkJCQkgKiByZXNvbHV0aW9uICovCisJY2hhcgkgICAqd2hlcmVD bGF1c2VTdHI7IC8qIFRoZSBXSEVSRSBjbGF1c2Ugc3RyaW5nIHVzZWQgdG8gYnVpbGQgdGhlCisJ CQkJCQkJCSAqIHBsYW5zICovCisKKwkvKiBUaGUgY2FjaGVkIHBsYW5zICovCisJU1BJUGxhblB0 cglsb2NrUGxhbjsJCS8qIFNFTEVDVCBGT1IgVVBEQVRFICovCisJU1BJUGxhblB0cglyZWZyZXNo UGxhbjsJLyogRnVzZWQgQ1RFOiBFdmFsdWF0ZSAtPiBVcHNlcnQgLT4gRGVsZXRlICovCit9CQkJ TWF0Vmlld1BhcnRpYWxSZWZyZXNoQ2FjaGU7CisKK3N0YXRpYyBIVEFCICpNYXRWaWV3UmVmcmVz aENhY2hlID0gTlVMTDsKKwogc3RhdGljIGludAltYXR2aWV3X21haW50ZW5hbmNlX2RlcHRoID0g MDsKIAogc3RhdGljIHZvaWQgdHJhbnNpZW50cmVsX3N0YXJ0dXAoRGVzdFJlY2VpdmVyICpzZWxm LCBpbnQgb3BlcmF0aW9uLCBUdXBsZURlc2MgdHlwZWluZm8pOwpAQCAtNjIsMTEgKzkyLDE5IEBA IHN0YXRpYyB2b2lkIHRyYW5zaWVudHJlbF9kZXN0cm95KERlc3RSZWNlaXZlciAqc2VsZik7CiBz dGF0aWMgdWludDY0IHJlZnJlc2hfbWF0dmlld19kYXRhZmlsbChEZXN0UmVjZWl2ZXIgKmRlc3Qs IFF1ZXJ5ICpxdWVyeSwKIAkJCQkJCQkJCSAgIGNvbnN0IGNoYXIgKnF1ZXJ5U3RyaW5nLCBib29s IGlzX2NyZWF0ZSk7CiBzdGF0aWMgdm9pZCByZWZyZXNoX2J5X21hdGNoX21lcmdlKE9pZCBtYXR2 aWV3T2lkLCBPaWQgdGVtcE9pZCwgT2lkIHJlbG93bmVyLAotCQkJCQkJCQkgICBpbnQgc2F2ZV9z ZWNfY29udGV4dCk7CisJCQkJCQkJCSAgIGludCBzYXZlX3NlY19jb250ZXh0LCBjaGFyICp3aGVy ZUNsYXVzZVN0ciwKKwkJCQkJCQkJICAgUGFyYW1MaXN0SW5mbyBwYXJhbXMpOworc3RhdGljIHVp bnQ2NCByZWZyZXNoX2J5X2RpcmVjdF9tb2RpZmljYXRpb24oT2lkIG1hdHZpZXdPaWQsIE9pZCBy ZWxvd25lciwKKwkJCQkJCQkJCQkJIGludCBzYXZlX3NlY19jb250ZXh0LCBjaGFyICp3aGVyZUNs YXVzZVN0ciwKKwkJCQkJCQkJCQkJIFBhcmFtTGlzdEluZm8gcGFyYW1zKTsKIHN0YXRpYyB2b2lk IHJlZnJlc2hfYnlfaGVhcF9zd2FwKE9pZCBtYXR2aWV3T2lkLCBPaWQgT0lETmV3SGVhcCwgY2hh ciByZWxwZXJzaXN0ZW5jZSk7CiBzdGF0aWMgYm9vbCBpc191c2FibGVfdW5pcXVlX2luZGV4KFJl bGF0aW9uIGluZGV4UmVsKTsKIHN0YXRpYyB2b2lkIE9wZW5NYXRWaWV3SW5jcmVtZW50YWxNYWlu dGVuYW5jZSh2b2lkKTsKIHN0YXRpYyB2b2lkIENsb3NlTWF0Vmlld0luY3JlbWVudGFsTWFpbnRl bmFuY2Uodm9pZCk7CitzdGF0aWMgaW50CW1hdHZpZXdfZXhlY3V0ZV9zcGkoY29uc3QgY2hhciAq Y29tbWFuZCwgUGFyYW1MaXN0SW5mbyBwYXJhbXMsIGJvb2wgcmVhZF9vbmx5KTsKK3N0YXRpYyBp bnQJbWF0dmlld19leGVjdXRlX3NwaV9wbGFuKFNQSVBsYW5QdHIgcGxhbiwgUGFyYW1MaXN0SW5m byBwYXJhbXMsIGJvb2wgcmVhZF9vbmx5KTsKK3N0YXRpYyBjaGFyICpnZXRfbWF0dmlld192aWV3 X3F1ZXJ5KE9pZCBtYXR2aWV3T2lkKTsKK3N0YXRpYyB2b2lkIEluaXRNYXRWaWV3Q2FjaGUodm9p ZCk7CiAKIC8qCiAgKiBTZXRNYXRWaWV3UG9wdWxhdGVkU3RhdGUKQEAgLTc5LDkgKzExNywxNyBA QCBTZXRNYXRWaWV3UG9wdWxhdGVkU3RhdGUoUmVsYXRpb24gcmVsYXRpb24sIGJvb2wgbmV3c3Rh dGUpCiB7CiAJUmVsYXRpb24JcGdyZWw7CiAJSGVhcFR1cGxlCXR1cGxlOworCUZvcm1fcGdfY2xh c3MgY2xhc3NGb3JtOwogCiAJQXNzZXJ0KHJlbGF0aW9uLT5yZF9yZWwtPnJlbGtpbmQgPT0gUkVM S0lORF9NQVRWSUVXKTsKIAorCS8qCisJICogSWYgdGhlIHN0YXRlIG1hdGNoZXMsIGRvIG5vdGhp bmcuIFRoaXMgcHJldmVudHMgY2FjaGUgaW52YWxpZGF0aW9uCisJICogc3Rvcm1zIHdoZW4gZG9p bmcgZnJlcXVlbnQgcGFydGlhbCByZWZyZXNoZXMgdmlhIHRyaWdnZXJzLgorCSAqLworCWlmIChy ZWxhdGlvbi0+cmRfcmVsLT5yZWxpc3BvcHVsYXRlZCA9PSBuZXdzdGF0ZSkKKwkJcmV0dXJuOwor CiAJLyoKIAkgKiBVcGRhdGUgcmVsYXRpb24ncyBwZ19jbGFzcyBlbnRyeS4gIENydWNpYWwgc2lk ZS1lZmZlY3Q6IG90aGVyIGJhY2tlbmRzCiAJICogKGFuZCB0aGlzIG9uZSB0b28hKSBhcmUgc2Vu dCBTSSBtZXNzYWdlIHRvIG1ha2UgdGhlbSByZWJ1aWxkIHJlbGNhY2hlCkBAIC05NCw5ICsxNDAs MTMgQEAgU2V0TWF0Vmlld1BvcHVsYXRlZFN0YXRlKFJlbGF0aW9uIHJlbGF0aW9uLCBib29sIG5l d3N0YXRlKQogCQllbG9nKEVSUk9SLCAiY2FjaGUgbG9va3VwIGZhaWxlZCBmb3IgcmVsYXRpb24g JXUiLAogCQkJIFJlbGF0aW9uR2V0UmVsaWQocmVsYXRpb24pKTsKIAotCSgoRm9ybV9wZ19jbGFz cykgR0VUU1RSVUNUKHR1cGxlKSktPnJlbGlzcG9wdWxhdGVkID0gbmV3c3RhdGU7CisJY2xhc3NG b3JtID0gKEZvcm1fcGdfY2xhc3MpIEdFVFNUUlVDVCh0dXBsZSk7CiAKLQlDYXRhbG9nVHVwbGVV cGRhdGUocGdyZWwsICZ0dXBsZS0+dF9zZWxmLCB0dXBsZSk7CisJaWYgKGNsYXNzRm9ybS0+cmVs aXNwb3B1bGF0ZWQgIT0gbmV3c3RhdGUpCisJeworCQljbGFzc0Zvcm0tPnJlbGlzcG9wdWxhdGVk ID0gbmV3c3RhdGU7CisJCUNhdGFsb2dUdXBsZVVwZGF0ZShwZ3JlbCwgJnR1cGxlLT50X3NlbGYs IHR1cGxlKTsKKwl9CiAKIAloZWFwX2ZyZWV0dXBsZSh0dXBsZSk7CiAJdGFibGVfY2xvc2UocGdy ZWwsIFJvd0V4Y2x1c2l2ZUxvY2spOwpAQCAtMTA4LDIzICsxNTgsMTgzIEBAIFNldE1hdFZpZXdQ b3B1bGF0ZWRTdGF0ZShSZWxhdGlvbiByZWxhdGlvbiwgYm9vbCBuZXdzdGF0ZSkKIAlDb21tYW5k Q291bnRlckluY3JlbWVudCgpOwogfQogCisvKgorICogSG9vayB0byBhbGxvdyBwYXJhbWV0ZXJz IChlLmcuICQxKSBpbiB0aGUgV0hFUkUgY2xhdXNlLgorICovCitzdGF0aWMgTm9kZSAqCityZWZy ZXNoX3BhcmFtcmVmX2hvb2soUGFyc2VTdGF0ZSAqcHN0YXRlLCBQYXJhbVJlZiAqcHJlZikKK3sK KwlQYXJhbUxpc3RJbmZvIHBhcmFtcyA9IChQYXJhbUxpc3RJbmZvKSBwc3RhdGUtPnBfcmVmX2hv b2tfc3RhdGU7CisJUGFyYW0JICAgKnBhcmFtOworCisJcGFyYW0gPSBtYWtlTm9kZShQYXJhbSk7 CisJcGFyYW0tPnBhcmFta2luZCA9IFBBUkFNX0VYVEVSTjsKKwlwYXJhbS0+cGFyYW1pZCA9IHBy ZWYtPm51bWJlcjsKKwlwYXJhbS0+cGFyYW10eXBlID0gVU5LTk9XTk9JRDsKKwlwYXJhbS0+cGFy YW10eXBtb2QgPSAtMTsKKwlwYXJhbS0+cGFyYW1jb2xsaWQgPSBJbnZhbGlkT2lkOworCXBhcmFt LT5sb2NhdGlvbiA9IHByZWYtPmxvY2F0aW9uOworCisJaWYgKHBhcmFtcyAmJiBwcmVmLT5udW1i ZXIgPiAwICYmIHByZWYtPm51bWJlciA8PSBwYXJhbXMtPm51bVBhcmFtcykKKwl7CisJCU9pZAkJ CXB0eXBlID0gcGFyYW1zLT5wYXJhbXNbcHJlZi0+bnVtYmVyIC0gMV0ucHR5cGU7CisKKwkJaWYg KE9pZElzVmFsaWQocHR5cGUpKQorCQkJcGFyYW0tPnBhcmFtdHlwZSA9IHB0eXBlOworCX0KKwor CXJldHVybiAoTm9kZSAqKSBwYXJhbTsKK30KKworLyoKKyAqIFRyYW5zZm9ybSB0aGUgV0hFUkUg Y2xhdXNlIGZvciBSRUZSRVNIIE1BVEVSSUFMSVpFRCBWSUVXLgorICovCitzdGF0aWMgTm9kZSAq Cit0cmFuc2Zvcm1SZWZyZXNoV2hlcmVDbGF1c2UoT2lkIHJlbGlkLCBOb2RlICp3aGVyZUNsYXVz ZSwgUGFyYW1MaXN0SW5mbyBwYXJhbXMpCit7CisJUGFyc2VTdGF0ZSAqcHN0YXRlID0gbWFrZV9w YXJzZXN0YXRlKE5VTEwpOworCVJlbGF0aW9uCXJlbCA9IHRhYmxlX29wZW4ocmVsaWQsIE5vTG9j ayk7CisJUGFyc2VOYW1lc3BhY2VJdGVtICpuc2l0ZW07CisJTm9kZQkgICAqcmVzdWx0OworCisJ cHN0YXRlLT5wX3BhcmFtcmVmX2hvb2sgPSByZWZyZXNoX3BhcmFtcmVmX2hvb2s7CisJcHN0YXRl LT5wX3JlZl9ob29rX3N0YXRlID0gKHZvaWQgKikgcGFyYW1zOworCisJbnNpdGVtID0gYWRkUmFu Z2VUYWJsZUVudHJ5Rm9yUmVsYXRpb24ocHN0YXRlLCByZWwsIEFjY2Vzc1NoYXJlTG9jaywgTlVM TCwgZmFsc2UsIHRydWUpOworCWFkZE5TSXRlbVRvUXVlcnkocHN0YXRlLCBuc2l0ZW0sIGZhbHNl LCB0cnVlLCB0cnVlKTsKKworCXJlc3VsdCA9IHRyYW5zZm9ybUV4cHIocHN0YXRlLCB3aGVyZUNs YXVzZSwgRVhQUl9LSU5EX1dIRVJFKTsKKwlyZXN1bHQgPSBjb2VyY2VfdG9fYm9vbGVhbihwc3Rh dGUsIHJlc3VsdCwgIldIRVJFIik7CisKKwlpZiAoY29udGFpbl92b2xhdGlsZV9mdW5jdGlvbnMo cmVzdWx0KSkKKwkJZXJlcG9ydChFUlJPUiwKKwkJCQkoZXJyY29kZShFUlJDT0RFX0ZFQVRVUkVf Tk9UX1NVUFBPUlRFRCksCisJCQkJIGVycm1zZygiV0hFUkUgY2xhdXNlIGluIFJFRlJFU0ggTUFU RVJJQUxJWkVEIFZJRVcgY2Fubm90IGNvbnRhaW4gdm9sYXRpbGUgZnVuY3Rpb25zIikpKTsKKwor CWlmIChwc3RhdGUtPnBfaGFzQWdncykKKwkJZXJlcG9ydChFUlJPUiwKKwkJCQkoZXJyY29kZShF UlJDT0RFX0dST1VQSU5HX0VSUk9SKSwKKwkJCQkgZXJybXNnKCJXSEVSRSBjbGF1c2UgaW4gUkVG UkVTSCBNQVRFUklBTElaRUQgVklFVyBjYW5ub3QgY29udGFpbiBhZ2dyZWdhdGVzIikpKTsKKwor CXRhYmxlX2Nsb3NlKHJlbCwgTm9Mb2NrKTsKKwlmcmVlX3BhcnNlc3RhdGUocHN0YXRlKTsKKwor CXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBjaGFyICoKK2RlcGFyc2VSZWZyZXNoV2hlcmVD bGF1c2UoT2lkIHJlbGlkLCBOb2RlICp3aGVyZUNsYXVzZSkKK3sKKwlyZXR1cm4gVGV4dERhdHVt R2V0Q1N0cmluZyhEaXJlY3RGdW5jdGlvbkNhbGwyKHBnX2dldF9leHByLAorCQkJCQkJCQkJCQkJ ICAgQ1N0cmluZ0dldFRleHREYXR1bShub2RlVG9TdHJpbmcod2hlcmVDbGF1c2UpKSwKKwkJCQkJ CQkJCQkJCSAgIE9iamVjdElkR2V0RGF0dW0ocmVsaWQpKSk7Cit9CisKKy8qCisgKiBIZWxwZXIg dG8gZXhlY3V0ZSBTUEkgY29tbWFuZHMgd2l0aCBvcHRpb25hbCBwYXJhbWV0ZXJzLgorICovCitz dGF0aWMgaW50CittYXR2aWV3X2V4ZWN1dGVfc3BpKGNvbnN0IGNoYXIgKmNvbW1hbmQsIFBhcmFt TGlzdEluZm8gcGFyYW1zLCBib29sIHJlYWRfb25seSkKK3sKKwlpZiAocGFyYW1zICYmIHBhcmFt cy0+bnVtUGFyYW1zID4gMCkKKwl7CisJCU9pZAkJICAgKmFyZ3R5cGVzOworCQlEYXR1bQkgICAq YXJndmFsdWVzOworCQljaGFyCSAgICpudWxsczsKKwkJaW50CQkJaTsKKwkJaW50CQkJcmVzOwor CisJCWFyZ3R5cGVzID0gKE9pZCAqKSBwYWxsb2MocGFyYW1zLT5udW1QYXJhbXMgKiBzaXplb2Yo T2lkKSk7CisJCWFyZ3ZhbHVlcyA9IChEYXR1bSAqKSBwYWxsb2MocGFyYW1zLT5udW1QYXJhbXMg KiBzaXplb2YoRGF0dW0pKTsKKwkJbnVsbHMgPSAoY2hhciAqKSBwYWxsb2MocGFyYW1zLT5udW1Q YXJhbXMgKiBzaXplb2YoY2hhcikpOworCisJCWZvciAoaSA9IDA7IGkgPCBwYXJhbXMtPm51bVBh cmFtczsgaSsrKQorCQl7CisJCQlQYXJhbUV4dGVybkRhdGEgKnBybSA9ICZwYXJhbXMtPnBhcmFt c1tpXTsKKworCQkJYXJndHlwZXNbaV0gPSBwcm0tPnB0eXBlOworCQkJYXJndmFsdWVzW2ldID0g cHJtLT52YWx1ZTsKKwkJCW51bGxzW2ldID0gcHJtLT5pc251bGwgPyAnbicgOiAnICc7CisJCX0K KworCQlyZXMgPSBTUElfZXhlY3V0ZV93aXRoX2FyZ3MoY29tbWFuZCwgcGFyYW1zLT5udW1QYXJh bXMsIGFyZ3R5cGVzLAorCQkJCQkJCQkJYXJndmFsdWVzLCBudWxscywgcmVhZF9vbmx5LCAwKTsK KworCQlwZnJlZShhcmd0eXBlcyk7CisJCXBmcmVlKGFyZ3ZhbHVlcyk7CisJCXBmcmVlKG51bGxz KTsKKworCQlyZXR1cm4gcmVzOworCX0KKwllbHNlCisJeworCQlyZXR1cm4gU1BJX2V4ZWMoY29t bWFuZCwgMCk7CisJfQorfQorCisvKgorICogSGVscGVyIHRvIGV4ZWN1dGUgUHJlcGFyZWQgU1BJ IFBsYW5zIHdpdGggb3B0aW9uYWwgcGFyYW1ldGVycy4KKyAqLworc3RhdGljIGludAorbWF0dmll d19leGVjdXRlX3NwaV9wbGFuKFNQSVBsYW5QdHIgcGxhbiwgUGFyYW1MaXN0SW5mbyBwYXJhbXMs IGJvb2wgcmVhZF9vbmx5KQoreworCWlmIChwYXJhbXMgJiYgcGFyYW1zLT5udW1QYXJhbXMgPiAw KQorCXsKKwkJRGF0dW0JICAgKmFyZ3ZhbHVlczsKKwkJY2hhcgkgICAqbnVsbHM7CisJCWludAkJ CWk7CisJCWludAkJCXJlczsKKworCQlhcmd2YWx1ZXMgPSAoRGF0dW0gKikgcGFsbG9jKHBhcmFt cy0+bnVtUGFyYW1zICogc2l6ZW9mKERhdHVtKSk7CisJCW51bGxzID0gKGNoYXIgKikgcGFsbG9j KHBhcmFtcy0+bnVtUGFyYW1zICogc2l6ZW9mKGNoYXIpKTsKKworCQlmb3IgKGkgPSAwOyBpIDwg cGFyYW1zLT5udW1QYXJhbXM7IGkrKykKKwkJeworCQkJUGFyYW1FeHRlcm5EYXRhICpwcm0gPSAm cGFyYW1zLT5wYXJhbXNbaV07CisKKwkJCWFyZ3ZhbHVlc1tpXSA9IHBybS0+dmFsdWU7CisJCQlu dWxsc1tpXSA9IHBybS0+aXNudWxsID8gJ24nIDogJyAnOworCQl9CisKKwkJcmVzID0gU1BJX2V4 ZWN1dGVfcGxhbihwbGFuLCBhcmd2YWx1ZXMsIG51bGxzLCByZWFkX29ubHksIDApOworCisJCXBm cmVlKGFyZ3ZhbHVlcyk7CisJCXBmcmVlKG51bGxzKTsKKworCQlyZXR1cm4gcmVzOworCX0KKwll bHNlCisJeworCQlyZXR1cm4gU1BJX2V4ZWN1dGVfcGxhbihwbGFuLCBOVUxMLCBOVUxMLCByZWFk X29ubHksIDApOworCX0KK30KKwogLyoKICAqIEV4ZWNSZWZyZXNoTWF0VmlldyAtLSBleGVjdXRl IGEgUkVGUkVTSCBNQVRFUklBTElaRUQgVklFVyBjb21tYW5kCiAgKgotICogSWYgV0lUSCBOTyBE QVRBIHdhcyBzcGVjaWZpZWQsIHRoaXMgaXMgZWZmZWN0aXZlbHkgbGlrZSBhIFRSVU5DQVRFOwot ICogb3RoZXJ3aXNlIGl0IGlzIGxpa2UgYSBUUlVOQ0FURSBmb2xsb3dlZCBieSBhbiBJTlNFUlQg dXNpbmcgdGhlIFNFTEVDVAotICogc3RhdGVtZW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgbWF0ZXJp YWxpemVkIHZpZXcuICBUaGUgc3RhdGVtZW50IG5vZGUncwotICogc2tpcERhdGEgZmllbGQgc2hv d3Mgd2hldGhlciB0aGUgY2xhdXNlIHdhcyB1c2VkLgorICogVGhpcyBpcyB0aGUgZW50cnkgcG9p bnQgZm9yIFJFRlJFU0ggTUFURVJJQUxJWkVEIFZJRVcuICBJdCBoYW5kbGVzOgorICoKKyAqIC0g V0lUSCBOTyBEQVRBOiBlZmZlY3RpdmVseSBsaWtlIGEgVFJVTkNBVEUuCisgKiAtIENPTkNVUlJF TlRMWTogZGlmZi1iYXNlZCByZWZyZXNoIGFsbG93aW5nIGNvbmN1cnJlbnQgcmVhZHMuCisgKiAt IFdIRVJFIGNsYXVzZTogcGFydGlhbCByZWZyZXNoIG9mIGEgc3Vic2V0IG9mIHJvd3MuCisgKiAt IERlZmF1bHQ6IGZ1bGwgcmVidWlsZCB2aWEgaGVhcCBzd2FwLgorICoKKyAqIFRoZSBzdGF0ZW1l bnQgbm9kZSdzIHNraXBEYXRhIGZpZWxkIHNob3dzIHdoZXRoZXIgV0lUSCBOTyBEQVRBIHdhcyB1 c2VkLgogICovCiBPYmplY3RBZGRyZXNzCiBFeGVjUmVmcmVzaE1hdFZpZXcoUmVmcmVzaE1hdFZp ZXdTdG10ICpzdG10LCBjb25zdCBjaGFyICpxdWVyeVN0cmluZywKLQkJCQkgICBRdWVyeUNvbXBs ZXRpb24gKnFjKQorCQkJCSAgIFBhcmFtTGlzdEluZm8gcGFyYW1zLCBRdWVyeUNvbXBsZXRpb24g KnFjKQogewogCU9pZAkJCW1hdHZpZXdPaWQ7CiAJTE9DS01PREUJbG9ja21vZGU7CiAKIAkvKiBE ZXRlcm1pbmUgc3RyZW5ndGggb2YgbG9jayBuZWVkZWQuICovCi0JbG9ja21vZGUgPSBzdG10LT5j b25jdXJyZW50ID8gRXhjbHVzaXZlTG9jayA6IEFjY2Vzc0V4Y2x1c2l2ZUxvY2s7CisJaWYgKHN0 bXQtPmNvbmN1cnJlbnQpCisJCWxvY2ttb2RlID0gRXhjbHVzaXZlTG9jazsKKwllbHNlIGlmIChz dG10LT53aGVyZUNsYXVzZSkKKwkJbG9ja21vZGUgPSBSb3dFeGNsdXNpdmVMb2NrOworCWVsc2UK KwkJbG9ja21vZGUgPSBBY2Nlc3NFeGNsdXNpdmVMb2NrOwogCiAJLyoKIAkgKiBHZXQgYSBsb2Nr IHVudGlsIGVuZCBvZiB0cmFuc2FjdGlvbi4KQEAgLTEzNSwyNCArMzQ1LDQwIEBAIEV4ZWNSZWZy ZXNoTWF0VmlldyhSZWZyZXNoTWF0Vmlld1N0bXQgKnN0bXQsIGNvbnN0IGNoYXIgKnF1ZXJ5U3Ry aW5nLAogCQkJCQkJCQkJCSAgTlVMTCk7CiAKIAlyZXR1cm4gUmVmcmVzaE1hdFZpZXdCeU9pZCht YXR2aWV3T2lkLCBmYWxzZSwgc3RtdC0+c2tpcERhdGEsCi0JCQkJCQkJICAgc3RtdC0+Y29uY3Vy cmVudCwgcXVlcnlTdHJpbmcsIHFjKTsKKwkJCQkJCQkgICBzdG10LT5jb25jdXJyZW50LCBzdG10 LT53aGVyZUNsYXVzZSwKKwkJCQkJCQkgICBxdWVyeVN0cmluZywgcGFyYW1zLCBxYyk7CiB9CiAK IC8qCiAgKiBSZWZyZXNoTWF0Vmlld0J5T2lkIC0tIHJlZnJlc2ggbWF0ZXJpYWxpemVkIHZpZXcg YnkgT0lECiAgKgotICogVGhpcyByZWZyZXNoZXMgdGhlIG1hdGVyaWFsaXplZCB2aWV3IGJ5IGNy ZWF0aW5nIGEgbmV3IHRhYmxlIGFuZCBzd2FwcGluZwotICogdGhlIHJlbGZpbGVudW1iZXJzIG9m IHRoZSBuZXcgdGFibGUgYW5kIHRoZSBvbGQgbWF0ZXJpYWxpemVkIHZpZXcsIHNvIHRoZSBPSUQK LSAqIG9mIHRoZSBvcmlnaW5hbCBtYXRlcmlhbGl6ZWQgdmlldyBpcyBwcmVzZXJ2ZWQuIFRodXMg d2UgZG8gbm90IGxvc2UgR1JBTlQKLSAqIG5vciByZWZlcmVuY2VzIHRvIHRoaXMgbWF0ZXJpYWxp emVkIHZpZXcuCisgKiBUaGlzIHJlZnJlc2hlcyBhIG1hdGVyaWFsaXplZCB2aWV3IHVzaW5nIG9u ZSBvZiB0aHJlZSBzdHJhdGVnaWVzOgorICoKKyAqIDEuIFBhcnRpYWwgbm9uLWNvbmN1cnJlbnQg KFdIRVJFIGNsYXVzZSwgbm8gQ09OQ1VSUkVOVExZKToKKyAqIERpcmVjdGx5IG1vZGlmaWVzIHRo ZSBtYXR2aWV3IGluLXBsYWNlIHVzaW5nIGEgdHdvLXN0ZXAgYXBwcm9hY2gKKyAqIChTRUxFQ1Qg Rk9SIFVQREFURSBmb2xsb3dlZCBieSBhIENURSB1cHNlcnQvZGVsZXRlKS4KKyAqIFVzZXMgUm93 RXhjbHVzaXZlTG9jaywgYWxsb3dpbmcgY29uY3VycmVudCByZWFkcyBhbmQgY29uY3VycmVudCB3 cml0ZXMKKyAqIHRvIG5vbi1vdmVybGFwcGluZyByb3dzLiBPdmVybGFwcGluZyB3cml0ZXMgYXJl IHNlcmlhbGl6ZWQgYnkgcm93IGxvY2tzLgorICoKKyAqIDIuIENvbmN1cnJlbnQgKENPTkNVUlJF TlRMWSwgd2l0aCBvciB3aXRob3V0IFdIRVJFIGNsYXVzZSk6CisgKiBDcmVhdGVzIGEgdGVtcG9y YXJ5IHRhYmxlIHdpdGggbmV3IGRhdGEsIGNvbXB1dGVzIGEgZGlmZiBhZ2FpbnN0CisgKiB0aGUg ZXhpc3RpbmcgbWF0dmlldywgYW5kIGFwcGxpZXMgY2hhbmdlcy4gVXNlcyBFeGNsdXNpdmVMb2Nr LAorICogYWxsb3dpbmcgY29uY3VycmVudCByZWFkcyB0aHJvdWdob3V0IHRoZSBvcGVyYXRpb24g YnV0IGJsb2NraW5nIGFsbAorICogY29uY3VycmVudCB3cml0ZXMuCisgKgorICogMy4gRnVsbCBy ZWJ1aWxkIChkZWZhdWx0LCBubyBXSEVSRSwgbm8gQ09OQ1VSUkVOVExZKToKKyAqIENyZWF0ZXMg YSBuZXcgaGVhcCwgcG9wdWxhdGVzIGl0LCBhbmQgc3dhcHMgcmVsZmlsZW51bWJlcnMuCisgKiBV c2VzIEFjY2Vzc0V4Y2x1c2l2ZUxvY2ssIGJsb2NraW5nIGFsbCBjb25jdXJyZW50IGFjY2Vzcy4K KyAqIFRoZSBPSUQgb2YgdGhlIG9yaWdpbmFsIG1hdGVyaWFsaXplZCB2aWV3IGlzIHByZXNlcnZl ZCwgc28gd2UKKyAqIGRvIG5vdCBsb3NlIEdSQU5UIG5vciByZWZlcmVuY2VzIHRvIHRoaXMgbWF0 ZXJpYWxpemVkIHZpZXcuCiAgKgogICogSWYgc2tpcERhdGEgaXMgdHJ1ZSwgdGhpcyBpcyBlZmZl Y3RpdmVseSBsaWtlIGEgVFJVTkNBVEU7IG90aGVyd2lzZSBpdCBpcwogICogbGlrZSBhIFRSVU5D QVRFIGZvbGxvd2VkIGJ5IGFuIElOU0VSVCB1c2luZyB0aGUgU0VMRUNUIHN0YXRlbWVudCBhc3Nv Y2lhdGVkCiAgKiB3aXRoIHRoZSBtYXRlcmlhbGl6ZWQgdmlldy4KICAqCi0gKiBJbmRleGVzIGFy ZSByZWJ1aWx0IHRvbywgdmlhIFJFSU5ERVguIFNpbmNlIHdlIGFyZSBlZmZlY3RpdmVseSBidWxr LWxvYWRpbmcKLSAqIHRoZSBuZXcgaGVhcCwgaXQncyBiZXR0ZXIgdG8gY3JlYXRlIHRoZSBpbmRl eGVzIGFmdGVyd2FyZHMgdGhhbiB0byBmaWxsIHRoZW0KLSAqIGluY3JlbWVudGFsbHkgd2hpbGUg d2UgbG9hZC4KKyAqIEZvciBmdWxsIHJlYnVpbGQsIGluZGV4ZXMgYXJlIHJlYnVpbHQgdG9vLCB2 aWEgUkVJTkRFWC4gIFNpbmNlIHdlIGFyZQorICogZWZmZWN0aXZlbHkgYnVsay1sb2FkaW5nIHRo ZSBuZXcgaGVhcCwgaXQncyBiZXR0ZXIgdG8gY3JlYXRlIHRoZSBpbmRleGVzCisgKiBhZnRlcndh cmRzIHRoYW4gdG8gZmlsbCB0aGVtIGluY3JlbWVudGFsbHkgd2hpbGUgd2UgbG9hZC4KICAqCiAg KiBUaGUgbWF0dmlldydzICJwb3B1bGF0ZWQiIHN0YXRlIGlzIGNoYW5nZWQgYmFzZWQgb24gd2hl dGhlciB0aGUgY29udGVudHMKICAqIHJlZmxlY3QgdGhlIHJlc3VsdCBzZXQgb2YgdGhlIG1hdGVy aWFsaXplZCB2aWV3J3MgcXVlcnkuCkBAIC0xNjIsMjIgKzM4OCwyMiBAQCBFeGVjUmVmcmVzaE1h dFZpZXcoUmVmcmVzaE1hdFZpZXdTdG10ICpzdG10LCBjb25zdCBjaGFyICpxdWVyeVN0cmluZywK ICAqLwogT2JqZWN0QWRkcmVzcwogUmVmcmVzaE1hdFZpZXdCeU9pZChPaWQgbWF0dmlld09pZCwg Ym9vbCBpc19jcmVhdGUsIGJvb2wgc2tpcERhdGEsCi0JCQkJCWJvb2wgY29uY3VycmVudCwgY29u c3QgY2hhciAqcXVlcnlTdHJpbmcsCisJCQkJCWJvb2wgY29uY3VycmVudCwgTm9kZSAqd2hlcmVD bGF1c2UsCisJCQkJCWNvbnN0IGNoYXIgKnF1ZXJ5U3RyaW5nLCBQYXJhbUxpc3RJbmZvIHBhcmFt cywKIAkJCQkJUXVlcnlDb21wbGV0aW9uICpxYykKIHsKIAlSZWxhdGlvbgltYXR2aWV3UmVsOwog CVJld3JpdGVSdWxlICpydWxlOwogCUxpc3QJICAgKmFjdGlvbnM7CiAJUXVlcnkJICAgKmRhdGFR dWVyeTsKLQlPaWQJCQl0YWJsZVNwYWNlOwogCU9pZAkJCXJlbG93bmVyOwotCU9pZAkJCU9JRE5l d0hlYXA7CiAJdWludDY0CQlwcm9jZXNzZWQgPSAwOwotCWNoYXIJCXJlbHBlcnNpc3RlbmNlOwog CU9pZAkJCXNhdmVfdXNlcmlkOwogCWludAkJCXNhdmVfc2VjX2NvbnRleHQ7CiAJaW50CQkJc2F2 ZV9uZXN0bGV2ZWw7CiAJT2JqZWN0QWRkcmVzcyBhZGRyZXNzOworCU5vZGUJICAgKnF1YWwgPSBO VUxMOworCWNoYXIJICAgKnF1YWxfc3RyID0gTlVMTDsKIAogCW1hdHZpZXdSZWwgPSB0YWJsZV9v cGVuKG1hdHZpZXdPaWQsIE5vTG9jayk7CiAJcmVsb3duZXIgPSBtYXR2aWV3UmVsLT5yZF9yZWwt PnJlbG93bmVyOwpAQCAtMjA2LDcgKzQzMiwxMSBAQCBSZWZyZXNoTWF0Vmlld0J5T2lkKE9pZCBt YXR2aWV3T2lkLCBib29sIGlzX2NyZWF0ZSwgYm9vbCBza2lwRGF0YSwKIAkJCQkoZXJyY29kZShF UlJDT0RFX0ZFQVRVUkVfTk9UX1NVUFBPUlRFRCksCiAJCQkJIGVycm1zZygiQ09OQ1VSUkVOVExZ IGNhbm5vdCBiZSB1c2VkIHdoZW4gdGhlIG1hdGVyaWFsaXplZCB2aWV3IGlzIG5vdCBwb3B1bGF0 ZWQiKSkpOwogCi0JLyogQ2hlY2sgdGhhdCBjb25mbGljdGluZyBvcHRpb25zIGhhdmUgbm90IGJl ZW4gc3BlY2lmaWVkLiAqLworCWlmICh3aGVyZUNsYXVzZSAmJiAhUmVsYXRpb25Jc1BvcHVsYXRl ZChtYXR2aWV3UmVsKSkKKwkJZXJlcG9ydChFUlJPUiwKKwkJCQkoZXJyY29kZShFUlJDT0RFX0ZF QVRVUkVfTk9UX1NVUFBPUlRFRCksCisJCQkJIGVycm1zZygiV0hFUkUgY2xhdXNlIGNhbm5vdCBi ZSB1c2VkIHdoZW4gdGhlIG1hdGVyaWFsaXplZCB2aWV3IGlzIG5vdCBwb3B1bGF0ZWQiKSkpOwor CiAJaWYgKGNvbmN1cnJlbnQgJiYgc2tpcERhdGEpCiAJCWVyZXBvcnQoRVJST1IsCiAJCQkJKGVy cmNvZGUoRVJSQ09ERV9TWU5UQVhfRVJST1IpLApAQCAtMjQwLDYgKzQ3MCwxMiBAQCBSZWZyZXNo TWF0Vmlld0J5T2lkKE9pZCBtYXR2aWV3T2lkLCBib29sIGlzX2NyZWF0ZSwgYm9vbCBza2lwRGF0 YSwKIAkJCSAidGhlIHJ1bGUgZm9yIG1hdGVyaWFsaXplZCB2aWV3IFwiJXNcIiBpcyBub3QgYSBz aW5nbGUgYWN0aW9uIiwKIAkJCSBSZWxhdGlvbkdldFJlbGF0aW9uTmFtZShtYXR2aWV3UmVsKSk7 CiAKKwlpZiAod2hlcmVDbGF1c2UpCisJeworCQlxdWFsID0gdHJhbnNmb3JtUmVmcmVzaFdoZXJl Q2xhdXNlKG1hdHZpZXdPaWQsIHdoZXJlQ2xhdXNlLCBwYXJhbXMpOworCQlxdWFsX3N0ciA9IGRl cGFyc2VSZWZyZXNoV2hlcmVDbGF1c2UobWF0dmlld09pZCwgcXVhbCk7CisJfQorCiAJLyoKIAkg KiBDaGVjayB0aGF0IHRoZXJlIGlzIGEgdW5pcXVlIGluZGV4IHdpdGggbm8gV0hFUkUgY2xhdXNl IG9uIG9uZSBvciBtb3JlCiAJICogY29sdW1ucyBvZiB0aGUgbWF0ZXJpYWxpemVkIHZpZXcgaWYg Q09OQ1VSUkVOVExZIGlzIHNwZWNpZmllZC4KQEAgLTI5OCw0NyArNTM0LDgzIEBAIFJlZnJlc2hN YXRWaWV3QnlPaWQoT2lkIG1hdHZpZXdPaWQsIGJvb2wgaXNfY3JlYXRlLCBib29sIHNraXBEYXRh LAogCSAqLwogCVNldE1hdFZpZXdQb3B1bGF0ZWRTdGF0ZShtYXR2aWV3UmVsLCAhc2tpcERhdGEp OwogCi0JLyogQ29uY3VycmVudCByZWZyZXNoIGJ1aWxkcyBuZXcgZGF0YSBpbiB0ZW1wIHRhYmxl c3BhY2UsIGFuZCBkb2VzIGRpZmYuICovCi0JaWYgKGNvbmN1cnJlbnQpCi0JewotCQl0YWJsZVNw YWNlID0gR2V0RGVmYXVsdFRhYmxlc3BhY2UoUkVMUEVSU0lTVEVOQ0VfVEVNUCwgZmFsc2UpOwot CQlyZWxwZXJzaXN0ZW5jZSA9IFJFTFBFUlNJU1RFTkNFX1RFTVA7Ci0JfQotCWVsc2UKKwkvKgor CSAqIFNUUkFURUdZIDE6IFBBUlRJQUwgTk9OLUNPTkNVUlJFTlQKKwkgKi8KKwlpZiAocXVhbCAm JiAhY29uY3VycmVudCAmJiAhc2tpcERhdGEpCiAJewotCQl0YWJsZVNwYWNlID0gbWF0dmlld1Jl bC0+cmRfcmVsLT5yZWx0YWJsZXNwYWNlOwotCQlyZWxwZXJzaXN0ZW5jZSA9IG1hdHZpZXdSZWwt PnJkX3JlbC0+cmVscGVyc2lzdGVuY2U7CisJCXByb2Nlc3NlZCA9IHJlZnJlc2hfYnlfZGlyZWN0 X21vZGlmaWNhdGlvbihtYXR2aWV3T2lkLCByZWxvd25lciwKKwkJCQkJCQkJCQkJCSAgIHNhdmVf c2VjX2NvbnRleHQsIHF1YWxfc3RyLAorCQkJCQkJCQkJCQkJICAgcGFyYW1zKTsKIAl9CiAKIAkv KgotCSAqIENyZWF0ZSB0aGUgdHJhbnNpZW50IHRhYmxlIHRoYXQgd2lsbCByZWNlaXZlIHRoZSBy ZWdlbmVyYXRlZCBkYXRhLiBMb2NrCi0JICogaXQgYWdhaW5zdCBhY2Nlc3MgYnkgYW55IG90aGVy IHByb2Nlc3MgdW50aWwgY29tbWl0IChieSB3aGljaCB0aW1lIGl0Ci0JICogd2lsbCBiZSBnb25l KS4KKwkgKiBTVFJBVEVHWSAyOiBDT05DVVJSRU5UIChQQVJUSUFMIG9yIEZVTEwpCiAJICovCi0J T0lETmV3SGVhcCA9IG1ha2VfbmV3X2hlYXAobWF0dmlld09pZCwgdGFibGVTcGFjZSwKLQkJCQkJ CQkgICBtYXR2aWV3UmVsLT5yZF9yZWwtPnJlbGFtLAotCQkJCQkJCSAgIHJlbHBlcnNpc3RlbmNl LCBFeGNsdXNpdmVMb2NrKTsKLQlBc3NlcnQoQ2hlY2tSZWxhdGlvbk9pZExvY2tlZEJ5TWUoT0lE TmV3SGVhcCwgQWNjZXNzRXhjbHVzaXZlTG9jaywgZmFsc2UpKTsKLQotCS8qIEdlbmVyYXRlIHRo ZSBkYXRhLCBpZiB3YW50ZWQuICovCi0JaWYgKCFza2lwRGF0YSkKKwllbHNlIGlmIChjb25jdXJy ZW50KQogCXsKLQkJRGVzdFJlY2VpdmVyICpkZXN0OworCQlPaWQJCQl0YWJsZVNwYWNlOworCQlj aGFyCQlyZWxwZXJzaXN0ZW5jZTsKKwkJT2lkCQkJT0lETmV3SGVhcDsKKwkJaW50CQkJb2xkX2Rl cHRoID0gbWF0dmlld19tYWludGVuYW5jZV9kZXB0aDsKIAotCQlkZXN0ID0gQ3JlYXRlVHJhbnNp ZW50UmVsRGVzdFJlY2VpdmVyKE9JRE5ld0hlYXApOwotCQlwcm9jZXNzZWQgPSByZWZyZXNoX21h dHZpZXdfZGF0YWZpbGwoZGVzdCwgZGF0YVF1ZXJ5LCBxdWVyeVN0cmluZywKLQkJCQkJCQkJCQkJ IGlzX2NyZWF0ZSk7Ci0JfQorCQl0YWJsZVNwYWNlID0gR2V0RGVmYXVsdFRhYmxlc3BhY2UoUkVM UEVSU0lTVEVOQ0VfVEVNUCwgZmFsc2UpOworCQlyZWxwZXJzaXN0ZW5jZSA9IFJFTFBFUlNJU1RF TkNFX1RFTVA7CiAKLQkvKiBNYWtlIHRoZSBtYXR2aWV3IG1hdGNoIHRoZSBuZXdseSBnZW5lcmF0 ZWQgZGF0YS4gKi8KLQlpZiAoY29uY3VycmVudCkKLQl7Ci0JCWludAkJCW9sZF9kZXB0aCA9IG1h dHZpZXdfbWFpbnRlbmFuY2VfZGVwdGg7CisJCS8qCisJCSAqIENyZWF0ZSB0aGUgdHJhbnNpZW50 IHRhYmxlIHRoYXQgd2lsbCByZWNlaXZlIHRoZSByZWdlbmVyYXRlZCBkYXRhLgorCQkgKiBMb2Nr IGl0IGFnYWluc3QgYWNjZXNzIGJ5IGFueSBvdGhlciBwcm9jZXNzIHVudGlsIGNvbW1pdCAoYnkg d2hpY2gKKwkJICogdGltZSBpdCB3aWxsIGJlIGdvbmUpLgorCQkgKi8KKwkJT0lETmV3SGVhcCA9 IG1ha2VfbmV3X2hlYXAobWF0dmlld09pZCwgdGFibGVTcGFjZSwKKwkJCQkJCQkJICAgbWF0dmll d1JlbC0+cmRfcmVsLT5yZWxhbSwKKwkJCQkJCQkJICAgcmVscGVyc2lzdGVuY2UsIEV4Y2x1c2l2 ZUxvY2spOworCQlBc3NlcnQoQ2hlY2tSZWxhdGlvbk9pZExvY2tlZEJ5TWUoT0lETmV3SGVhcCwg QWNjZXNzRXhjbHVzaXZlTG9jaywgZmFsc2UpKTsKKworCQkvKiBHZW5lcmF0ZSB0aGUgZGF0YSwg aWYgd2FudGVkLiAqLworCQlpZiAoIXNraXBEYXRhKQorCQl7CisJCQlpZiAocXVhbF9zdHIpCisJ CQl7CisJCQkJU3RyaW5nSW5mb0RhdGEgYnVmOworCQkJCWNoYXIJICAgKnZpZXdfc3FsID0gZ2V0 X21hdHZpZXdfdmlld19xdWVyeShtYXR2aWV3T2lkKTsKKwkJCQljaGFyCSAgICp0cmFuc2llbnRf bmFtZTsKKwkJCQlSZWxhdGlvbgl0cmFuc2llbnRSZWwgPSB0YWJsZV9vcGVuKE9JRE5ld0hlYXAs IE5vTG9jayk7CisKKwkJCQl0cmFuc2llbnRfbmFtZSA9IHF1b3RlX3F1YWxpZmllZF9pZGVudGlm aWVyKGdldF9uYW1lc3BhY2VfbmFtZShSZWxhdGlvbkdldE5hbWVzcGFjZSh0cmFuc2llbnRSZWwp KSwKKwkJCQkJCQkJCQkJCQkJCVJlbGF0aW9uR2V0UmVsYXRpb25OYW1lKHRyYW5zaWVudFJlbCkp OworCQkJCXRhYmxlX2Nsb3NlKHRyYW5zaWVudFJlbCwgTm9Mb2NrKTsKKworCQkJCS8qCisJCQkJ ICogSW5pdCBidWZmZXIgYmVmb3JlIFNQSSBjb25uZWN0aW9uIHRvIGF2b2lkIGRvdWJsZSBmcmVl CisJCQkJICogaXNzdWVzIG9uIGNvbnRleHQgZGVzdHJveQorCQkJCSAqLworCQkJCWluaXRTdHJp bmdJbmZvKCZidWYpOworCQkJCWFwcGVuZFN0cmluZ0luZm8oJmJ1ZiwgIklOU0VSVCBJTlRPICVz IFNFTEVDVCAqIEZST00gKCVzKSBfbXZfcSBXSEVSRSAlcyIsCisJCQkJCQkJCSB0cmFuc2llbnRf bmFtZSwgdmlld19zcWwsIHF1YWxfc3RyKTsKKworCQkJCVNQSV9jb25uZWN0KCk7CisJCQkJaWYg KG1hdHZpZXdfZXhlY3V0ZV9zcGkoYnVmLmRhdGEsIHBhcmFtcywgZmFsc2UpICE9IFNQSV9PS19J TlNFUlQpCisJCQkJCWVsb2coRVJST1IsICJTUElfZXhlYyBmYWlsZWQ6ICVzIiwgYnVmLmRhdGEp OworCQkJCXByb2Nlc3NlZCA9IFNQSV9wcm9jZXNzZWQ7CisJCQkJU1BJX2ZpbmlzaCgpOworCQkJ CXBmcmVlKHZpZXdfc3FsKTsKKwkJCQlwZnJlZSh0cmFuc2llbnRfbmFtZSk7CisJCQkJcGZyZWUo YnVmLmRhdGEpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCURlc3RSZWNlaXZlciAqZGVzdDsK KworCQkJCWRlc3QgPSBDcmVhdGVUcmFuc2llbnRSZWxEZXN0UmVjZWl2ZXIoT0lETmV3SGVhcCk7 CisJCQkJcHJvY2Vzc2VkID0gcmVmcmVzaF9tYXR2aWV3X2RhdGFmaWxsKGRlc3QsIGRhdGFRdWVy eSwgcXVlcnlTdHJpbmcsIGlzX2NyZWF0ZSk7CisJCQl9CisJCX0KIAogCQlQR19UUlkoKTsKIAkJ ewogCQkJcmVmcmVzaF9ieV9tYXRjaF9tZXJnZShtYXR2aWV3T2lkLCBPSUROZXdIZWFwLCByZWxv d25lciwKLQkJCQkJCQkJICAgc2F2ZV9zZWNfY29udGV4dCk7CisJCQkJCQkJCSAgIHNhdmVfc2Vj X2NvbnRleHQsIHF1YWxfc3RyLCBwYXJhbXMpOwogCQl9CiAJCVBHX0NBVENIKCk7CiAJCXsKQEAg LTM0NiwxMCArNjE4LDM0IEBAIFJlZnJlc2hNYXRWaWV3QnlPaWQoT2lkIG1hdHZpZXdPaWQsIGJv b2wgaXNfY3JlYXRlLCBib29sIHNraXBEYXRhLAogCQkJUEdfUkVfVEhST1coKTsKIAkJfQogCQlQ R19FTkRfVFJZKCk7CisKIAkJQXNzZXJ0KG1hdHZpZXdfbWFpbnRlbmFuY2VfZGVwdGggPT0gb2xk X2RlcHRoKTsKIAl9CisKKwkvKgorCSAqIFNUUkFURUdZIDM6IEZVTEwgUkVCVUlMRAorCSAqLwog CWVsc2UKIAl7CisJCU9pZAkJCXRhYmxlU3BhY2U7CisJCWNoYXIJCXJlbHBlcnNpc3RlbmNlOwor CQlPaWQJCQlPSUROZXdIZWFwOworCisJCXRhYmxlU3BhY2UgPSBtYXR2aWV3UmVsLT5yZF9yZWwt PnJlbHRhYmxlc3BhY2U7CisJCXJlbHBlcnNpc3RlbmNlID0gbWF0dmlld1JlbC0+cmRfcmVsLT5y ZWxwZXJzaXN0ZW5jZTsKKworCQlPSUROZXdIZWFwID0gbWFrZV9uZXdfaGVhcChtYXR2aWV3T2lk LCB0YWJsZVNwYWNlLAorCQkJCQkJCQkgICBtYXR2aWV3UmVsLT5yZF9yZWwtPnJlbGFtLAorCQkJ CQkJCQkgICByZWxwZXJzaXN0ZW5jZSwgQWNjZXNzRXhjbHVzaXZlTG9jayk7CisKKwkJaWYgKCFz a2lwRGF0YSkKKwkJeworCQkJRGVzdFJlY2VpdmVyICpkZXN0OworCisJCQlkZXN0ID0gQ3JlYXRl VHJhbnNpZW50UmVsRGVzdFJlY2VpdmVyKE9JRE5ld0hlYXApOworCQkJcHJvY2Vzc2VkID0gcmVm cmVzaF9tYXR2aWV3X2RhdGFmaWxsKGRlc3QsIGRhdGFRdWVyeSwgcXVlcnlTdHJpbmcsIGlzX2Ny ZWF0ZSk7CisJCX0KKwogCQlyZWZyZXNoX2J5X2hlYXBfc3dhcChtYXR2aWV3T2lkLCBPSUROZXdI ZWFwLCByZWxwZXJzaXN0ZW5jZSk7CiAKIAkJLyoKQEAgLTU1NSw2ICs4NTEsMzU1IEBAIHRyYW5z aWVudHJlbF9kZXN0cm95KERlc3RSZWNlaXZlciAqc2VsZikKIAlwZnJlZShzZWxmKTsKIH0KIAor LyoKKyAqIGdldF9tYXR2aWV3X3ZpZXdfcXVlcnkKKyAqCisgKiBSZXRyaWV2ZSB0aGUgU1FMIGRl ZmluaXRpb24gb2YgYSBtYXRlcmlhbGl6ZWQgdmlldydzIHVuZGVybHlpbmcgcXVlcnkuCisgKiBS ZXR1cm5zIHRoZSBxdWVyeSB0ZXh0IHdpdGggdHJhaWxpbmcgc2VtaWNvbG9ucyBhbmQgd2hpdGVz cGFjZSByZW1vdmVkLgorICovCitzdGF0aWMgY2hhciAqCitnZXRfbWF0dmlld192aWV3X3F1ZXJ5 KE9pZCBtYXR2aWV3T2lkKQoreworCWNoYXIJICAgKnZpZXdfc3FsOworCisJdmlld19zcWwgPSBU ZXh0RGF0dW1HZXRDU3RyaW5nKERpcmVjdEZ1bmN0aW9uQ2FsbDIocGdfZ2V0X3ZpZXdkZWYsCisJ CQkJCQkJCQkJCQkJICAgT2JqZWN0SWRHZXREYXR1bShtYXR2aWV3T2lkKSwKKwkJCQkJCQkJCQkJ CQkgICBCb29sR2V0RGF0dW0oZmFsc2UpKSk7CisJaWYgKHZpZXdfc3FsKQorCXsKKwkJaW50CQkJ bGVuID0gc3RybGVuKHZpZXdfc3FsKTsKKworCQl3aGlsZSAobGVuID4gMCAmJiAodmlld19zcWxb bGVuIC0gMV0gPT0gJzsnIHx8IGlzc3BhY2UoKHVuc2lnbmVkIGNoYXIpIHZpZXdfc3FsW2xlbiAt IDFdKSkpCisJCQl2aWV3X3NxbFstLWxlbl0gPSAnXDAnOworCX0KKwlyZXR1cm4gdmlld19zcWw7 Cit9CisKK3N0YXRpYyB2b2lkCitJbml0TWF0Vmlld0NhY2hlKHZvaWQpCit7CisJSEFTSENUTAkJ Y3RsOworCisJbWVtc2V0KCZjdGwsIDAsIHNpemVvZihjdGwpKTsKKwljdGwua2V5c2l6ZSA9IHNp emVvZihPaWQpOworCWN0bC5lbnRyeXNpemUgPSBzaXplb2YoTWF0Vmlld1BhcnRpYWxSZWZyZXNo Q2FjaGUpOworCWN0bC5oY3h0ID0gQ2FjaGVNZW1vcnlDb250ZXh0OworCisJTWF0Vmlld1JlZnJl c2hDYWNoZSA9IGhhc2hfY3JlYXRlKCJNYXRWaWV3IFBhcnRpYWwgUmVmcmVzaCBDYWNoZSIsCisJ CQkJCQkJCQkgIDE2LAorCQkJCQkJCQkJICAmY3RsLAorCQkJCQkJCQkJICBIQVNIX0VMRU0gfCBI QVNIX0JMT0JTIHwgSEFTSF9DT05URVhUKTsKK30KKworLyoKKyAqIHJlZnJlc2hfYnlfZGlyZWN0 X21vZGlmaWNhdGlvbgorICoKKyAqIFRoaXMgbW9kaWZpZXMgdGhlIG1hdGVyaWFsaXplZCB2aWV3 IGluLXBsYWNlIHdpdGhvdXQgY3JlYXRpbmcgYSB0ZW1wb3JhcnkKKyAqIGhlYXAgb3Igc3dhcHBp bmcgcmVsZmlsZW51bWJlcnMuICBJdCByZXF1aXJlcyBhIHVzYWJsZSB1bmlxdWUgaW5kZXggb24g dGhlCisgKiBtYXR2aWV3IGZvciBjb25mbGljdCByZXNvbHV0aW9uLgorICoKKyAqIENvbmN1cnJl bmN5IGlzIGhhbmRsZWQgaW4gdHdvIHN0ZXBzLCBlYWNoIGV4ZWN1dGVkIGFzIGEgc2VwYXJhdGUg U1BJCisgKiBzdGF0ZW1lbnQ6CisgKgorICogMS4gTG9jayBleGlzdGluZyByb3dzIG1hdGNoaW5n IHRoZSBXSEVSRSBjbGF1c2UgdmlhIFNFTEVDVCBGT1IgVVBEQVRFLgorICogICAgVGhpcyBzZXJp YWxpemVzIGNvbmN1cnJlbnQgcGFydGlhbCByZWZyZXNoZXMgdGhhdCB0b3VjaCBvdmVybGFwcGlu ZworICogICAgcm93cyB3aGlsZSBhbGxvd2luZyBub24tb3ZlcmxhcHBpbmcgcmVmcmVzaGVzIHRv IHByb2NlZWQgaW4gcGFyYWxsZWwuCisgKgorICogMi4gRXhlY3V0ZSBhIHNpbmdsZSBDVEUgdGhh dCBldmFsdWF0ZXMgdGhlIHVuZGVybHlpbmcgcXVlcnksIHVwc2VydHMKKyAqICAgIHRoZSByZXN1 bHRzIGludG8gdGhlIG1hdHZpZXcsIGFuZCBkZWxldGVzIHJvd3MgdGhhdCBubyBsb25nZXIgbWF0 Y2gKKyAqICAgIHRoZSBwcmVkaWNhdGUgKHZpYSBhbnRpLWpvaW4gYWdhaW5zdCB0aGUgZnJlc2gg cXVlcnkgb3V0cHV0KS4KKyAqCisgKiBUbyBhdm9pZCByZWJ1aWxkaW5nIHRoZSBTUUwgYW5kIHJl LXByZXBhcmluZyB0aGUgU1BJIHBsYW5zIG9uIGV2ZXJ5IGNhbGwsCisgKiB3ZSBjYWNoZSBib3Ro IHBsYW5zIGluIGEgc2Vzc2lvbi1sZXZlbCBoYXNoIHRhYmxlIGtleWVkIGJ5IG1hdHZpZXcgT0lE LgorICoKKyAqIFJldHVybnMgdGhlIG51bWJlciBvZiByb3dzIHByb2Nlc3NlZCBieSB0aGUgcmVm cmVzaCBDVEUuCisgKi8KK3N0YXRpYyB1aW50NjQKK3JlZnJlc2hfYnlfZGlyZWN0X21vZGlmaWNh dGlvbihPaWQgbWF0dmlld09pZCwgT2lkIHJlbG93bmVyLAorCQkJCQkJCSAgIGludCBzYXZlX3Nl Y19jb250ZXh0LCBjaGFyICp3aGVyZUNsYXVzZVN0ciwKKwkJCQkJCQkgICBQYXJhbUxpc3RJbmZv IHBhcmFtcykKK3sKKwlSZWxhdGlvbgltYXR2aWV3UmVsOworCU9pZAkJCXVuaXF1ZUluZGV4T2lk ID0gSW52YWxpZE9pZDsKKwlMaXN0CSAgICppbmRleG9pZGxpc3Q7CisJTGlzdENlbGwgICAqbGM7 CisJTWF0Vmlld1BhcnRpYWxSZWZyZXNoQ2FjaGUgKmNhY2hlRW50cnk7CisJYm9vbAkJZm91bmQ7 CisJdWludDY0CQlyZXN1bHRfcHJvY2Vzc2VkID0gMDsKKworCW1hdHZpZXdSZWwgPSB0YWJsZV9v cGVuKG1hdHZpZXdPaWQsIE5vTG9jayk7CisKKwkvKiBGaW5kIGEgdXNhYmxlIHVuaXF1ZSBpbmRl eCwgcHJlZmVycmluZyB0aGUgcHJpbWFyeSBrZXkuICovCisJaW5kZXhvaWRsaXN0ID0gUmVsYXRp b25HZXRJbmRleExpc3QobWF0dmlld1JlbCk7CisJZm9yZWFjaChsYywgaW5kZXhvaWRsaXN0KQor CXsKKwkJT2lkCQkJaW5kZXhvaWQgPSBsZmlyc3Rfb2lkKGxjKTsKKwkJUmVsYXRpb24JaW5kZXhS ZWw7CisJCWJvb2wJCXVzYWJsZTsKKwkJYm9vbAkJaXNfcGs7CisKKwkJaW5kZXhSZWwgPSBpbmRl eF9vcGVuKGluZGV4b2lkLCBBY2Nlc3NTaGFyZUxvY2spOworCQl1c2FibGUgPSBpc191c2FibGVf dW5pcXVlX2luZGV4KGluZGV4UmVsKTsKKwkJaXNfcGsgPSBpbmRleFJlbC0+cmRfaW5kZXgtPmlu ZGlzcHJpbWFyeTsKKwkJaW5kZXhfY2xvc2UoaW5kZXhSZWwsIEFjY2Vzc1NoYXJlTG9jayk7CisK KwkJaWYgKHVzYWJsZSkKKwkJeworCQkJaWYgKGlzX3BrKQorCQkJeworCQkJCXVuaXF1ZUluZGV4 T2lkID0gaW5kZXhvaWQ7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoIU9pZElzVmFsaWQodW5p cXVlSW5kZXhPaWQpKQorCQkJCXVuaXF1ZUluZGV4T2lkID0gaW5kZXhvaWQ7CisJCX0KKwl9CisJ bGlzdF9mcmVlKGluZGV4b2lkbGlzdCk7CisKKwlpZiAoIU9pZElzVmFsaWQodW5pcXVlSW5kZXhP aWQpKQorCQllcmVwb3J0KEVSUk9SLAorCQkJCShlcnJjb2RlKEVSUkNPREVfT0JKRUNUX05PVF9J Tl9QUkVSRVFVSVNJVEVfU1RBVEUpLAorCQkJCSBlcnJtc2coImNhbm5vdCBwZXJmb3JtIHBhcnRp YWwgcmVmcmVzaCBvbiBtYXRlcmlhbGl6ZWQgdmlldyBcIiVzXCIiLAorCQkJCQkJUmVsYXRpb25H ZXRSZWxhdGlvbk5hbWUobWF0dmlld1JlbCkpLAorCQkJCSBlcnJkZXRhaWwoIlBhcnRpYWwgcmVm cmVzaCByZXF1aXJlcyBhIHVzYWJsZSB1bmlxdWUgaW5kZXggdG8gcGVyZm9ybSBhbiBVUFNFUlQg b3BlcmF0aW9uLiIpKSk7CisKKwkvKiBMb29rIHVwIG9yIGNyZWF0ZSBhIHBsYW4gY2FjaGUgZW50 cnkgZm9yIHRoaXMgbWF0dmlldy4gKi8KKwlpZiAoIU1hdFZpZXdSZWZyZXNoQ2FjaGUpCisJCUlu aXRNYXRWaWV3Q2FjaGUoKTsKKworCWNhY2hlRW50cnkgPSAoTWF0Vmlld1BhcnRpYWxSZWZyZXNo Q2FjaGUgKikgaGFzaF9zZWFyY2goTWF0Vmlld1JlZnJlc2hDYWNoZSwKKwkJCQkJCQkJCQkJCQkJ CSZtYXR2aWV3T2lkLAorCQkJCQkJCQkJCQkJCQkJSEFTSF9FTlRFUiwKKwkJCQkJCQkJCQkJCQkJ CSZmb3VuZCk7CisKKwkvKgorCSAqIFdlIGhhdmUgYSBjYWNoZSBoaXQgT05MWSBpZiB0aGUgZW50 cnkgZXhpc3RzLCB0aGUgdW5pcXVlIGluZGV4IG1hdGNoZXMsCisJICogYW5kIHRoZSBXSEVSRSBj bGF1c2Ugc3RyaW5nIHBlcmZlY3RseSBtYXRjaGVzLiAgV2UgYWxzbyBlbnN1cmUKKwkgKiB3aGVy ZUNsYXVzZVN0ciBpcyBub3QgTlVMTCB0byBwcmV2ZW50IGEgc3RyY21wIHNlZ2ZhdWx0IGlmIGEg cHJldmlvdXMKKwkgKiBjb21waWxhdGlvbiBmYWlsZWQgbWlkd2F5LgorCSAqLworCWlmIChmb3Vu ZCAmJgorCQljYWNoZUVudHJ5LT51bmlxdWVJbmRleE9pZCA9PSB1bmlxdWVJbmRleE9pZCAmJgor CQljYWNoZUVudHJ5LT53aGVyZUNsYXVzZVN0ciAhPSBOVUxMICYmCisJCXdoZXJlQ2xhdXNlU3Ry ICE9IE5VTEwgJiYKKwkJc3RyY21wKGNhY2hlRW50cnktPndoZXJlQ2xhdXNlU3RyLCB3aGVyZUNs YXVzZVN0cikgPT0gMCkKKwl7CisJCS8qIENhY2hlIGlzIHZhbGlkLiAgRG8gbm90aGluZy4gKi8K Kwl9CisJZWxzZQorCXsKKwkJaWYgKGZvdW5kKQorCQl7CisJCQkvKiBJbmRleCBvciBXSEVSRSBj bGF1c2UgY2hhbmdlZDsgZGlzY2FyZCBzdGFsZSBwbGFucy4gKi8KKwkJCWlmIChjYWNoZUVudHJ5 LT5sb2NrUGxhbikKKwkJCQlTUElfZnJlZXBsYW4oY2FjaGVFbnRyeS0+bG9ja1BsYW4pOworCQkJ aWYgKGNhY2hlRW50cnktPnJlZnJlc2hQbGFuKQorCQkJCVNQSV9mcmVlcGxhbihjYWNoZUVudHJ5 LT5yZWZyZXNoUGxhbik7CisJCQlpZiAoY2FjaGVFbnRyeS0+d2hlcmVDbGF1c2VTdHIpCisJCQkJ cGZyZWUoY2FjaGVFbnRyeS0+d2hlcmVDbGF1c2VTdHIpOworCQl9CisKKwkJY2FjaGVFbnRyeS0+ bG9ja1BsYW4gPSBOVUxMOworCQljYWNoZUVudHJ5LT5yZWZyZXNoUGxhbiA9IE5VTEw7CisJCWNh Y2hlRW50cnktPndoZXJlQ2xhdXNlU3RyID0gTlVMTDsKKwl9CisKKwlPcGVuTWF0Vmlld0luY3Jl bWVudGFsTWFpbnRlbmFuY2UoKTsKKworCVNQSV9jb25uZWN0KCk7CisKKwkvKiBQcmVwYXJlIHBs YW5zIGlmIHdlIGRvbid0IGhhdmUgdmFsaWQgY2FjaGVkIG9uZXMuICovCisJaWYgKGNhY2hlRW50 cnktPmxvY2tQbGFuID09IE5VTEwgfHwgY2FjaGVFbnRyeS0+cmVmcmVzaFBsYW4gPT0gTlVMTCkK Kwl7CisJCVN0cmluZ0luZm9EYXRhIGJ1ZjsKKwkJY2hhcgkgICAqdmlld19zcWw7CisJCWNoYXIJ ICAgKm1hdHZpZXdfbmFtZTsKKwkJY29uc3QgY2hhciAqbWF0dmlld19hbGlhczsKKwkJT2lkCQkg ICAqYXJndHlwZXMgPSBOVUxMOworCQlpbnQJCQluYXJncyA9IDA7CisJCVJlbGF0aW9uCWluZGV4 UmVsOworCQlGb3JtX3BnX2luZGV4IGluZGV4U3RydWN0OworCQlUdXBsZURlc2MJdHVwZGVzYyA9 IG1hdHZpZXdSZWwtPnJkX2F0dDsKKwkJU3RyaW5nSW5mb0RhdGEgY29uZmxpY3RfY29sczsKKwkJ U3RyaW5nSW5mb0RhdGEgc2V0X2NsYXVzZTsKKwkJU3RyaW5nSW5mb0RhdGEgam9pbl9jbGF1c2U7 CisJCWJvb2wJCWZpcnN0OworCQlib29sCQloYXNfbm9uX2tleV9jb2xzID0gZmFsc2U7CisJCWlu dAkJCWk7CisJCU1lbW9yeUNvbnRleHQgb2xkY3h0OworCisJCW1hdHZpZXdfbmFtZSA9IHF1b3Rl X3F1YWxpZmllZF9pZGVudGlmaWVyKGdldF9uYW1lc3BhY2VfbmFtZShSZWxhdGlvbkdldE5hbWVz cGFjZShtYXR2aWV3UmVsKSksCisJCQkJCQkJCQkJCQkgIFJlbGF0aW9uR2V0UmVsYXRpb25OYW1l KG1hdHZpZXdSZWwpKTsKKwkJbWF0dmlld19hbGlhcyA9IHF1b3RlX2lkZW50aWZpZXIoUmVsYXRp b25HZXRSZWxhdGlvbk5hbWUobWF0dmlld1JlbCkpOworCQl2aWV3X3NxbCA9IGdldF9tYXR2aWV3 X3ZpZXdfcXVlcnkobWF0dmlld09pZCk7CisKKwkJaWYgKHBhcmFtcyAmJiBwYXJhbXMtPm51bVBh cmFtcyA+IDApCisJCXsKKwkJCW5hcmdzID0gcGFyYW1zLT5udW1QYXJhbXM7CisJCQlhcmd0eXBl cyA9IChPaWQgKikgcGFsbG9jKG5hcmdzICogc2l6ZW9mKE9pZCkpOworCQkJZm9yIChpID0gMDsg aSA8IG5hcmdzOyBpKyspCisJCQkJYXJndHlwZXNbaV0gPSBwYXJhbXMtPnBhcmFtc1tpXS5wdHlw ZTsKKwkJfQorCisJCS8qCisJCSAqIFByZXBhcmUgdGhlIHJvdy1sb2NraW5nIHN0YXRlbWVudC4g IFRoaXMgYWNxdWlyZXMgRk9SIFVQREFURSBsb2NrcworCQkgKiBvbiBtYXR2aWV3IHJvd3MgbWF0 Y2hpbmcgdGhlIFdIRVJFIGNsYXVzZSB0byBzZXJpYWxpemUgY29uY3VycmVudAorCQkgKiBwYXJ0 aWFsIHJlZnJlc2hlcyBvbiBvdmVybGFwcGluZyByb3dzLgorCQkgKi8KKwkJaW5pdFN0cmluZ0lu Zm8oJmJ1Zik7CisJCWFwcGVuZFN0cmluZ0luZm8oJmJ1ZiwgIlNFTEVDVCAxIEZST00gJXMgbXYg V0hFUkUgKCVzKSBGT1IgVVBEQVRFIiwKKwkJCQkJCSBtYXR2aWV3X25hbWUsIHdoZXJlQ2xhdXNl U3RyKTsKKworCQljYWNoZUVudHJ5LT5sb2NrUGxhbiA9IFNQSV9wcmVwYXJlKGJ1Zi5kYXRhLCBu YXJncywgYXJndHlwZXMpOworCQlpZiAoY2FjaGVFbnRyeS0+bG9ja1BsYW4gPT0gTlVMTCkKKwkJ CWVsb2coRVJST1IsICJTUElfcHJlcGFyZSBmYWlsZWQgZm9yIGxvY2sgYWNxdWlzaXRpb246ICVz IiwgYnVmLmRhdGEpOworCQlTUElfa2VlcHBsYW4oY2FjaGVFbnRyeS0+bG9ja1BsYW4pOworCisJ CS8qCisJCSAqIEJ1aWxkIHRoZSByZWZyZXNoIENURTogZXZhbHVhdGUgdGhlIHVuZGVybHlpbmcg cXVlcnkgd2l0aCB0aGUgV0hFUkUKKwkJICogcHJlZGljYXRlLCB1cHNlcnQgdGhlIHJlc3VsdHMs IGFuZCBkZWxldGUgbWF0dmlldyByb3dzIHRoYXQgbm8KKwkJICogbG9uZ2VyIGFwcGVhciBpbiB0 aGUgcXVlcnkgb3V0cHV0LgorCQkgKi8KKwkJaW5kZXhSZWwgPSBpbmRleF9vcGVuKHVuaXF1ZUlu ZGV4T2lkLCBBY2Nlc3NTaGFyZUxvY2spOworCQlpbmRleFN0cnVjdCA9IGluZGV4UmVsLT5yZF9p bmRleDsKKworCQlpbml0U3RyaW5nSW5mbygmY29uZmxpY3RfY29scyk7CisJCWluaXRTdHJpbmdJ bmZvKCZzZXRfY2xhdXNlKTsKKwkJaW5pdFN0cmluZ0luZm8oJmpvaW5fY2xhdXNlKTsKKworCQkv KiBCdWlsZCB0aGUgT04gQ09ORkxJQ1QgY29sdW1uIGxpc3QgYW5kIGFudGktam9pbiBjb25kaXRp b24uICovCisJCWZpcnN0ID0gdHJ1ZTsKKwkJZm9yIChpID0gMDsgaSA8IGluZGV4U3RydWN0LT5p bmRua2V5YXR0czsgaSsrKQorCQl7CisJCQlpbnQJCQlhdHRudW0gPSBpbmRleFN0cnVjdC0+aW5k a2V5LnZhbHVlc1tpXTsKKwkJCUZvcm1fcGdfYXR0cmlidXRlIGF0dHIgPSBUdXBsZURlc2NBdHRy KHR1cGRlc2MsIGF0dG51bSAtIDEpOworCQkJY29uc3QgY2hhciAqcXVvdGVkOworCisJCQlxdW90 ZWQgPSBxdW90ZV9pZGVudGlmaWVyKE5hbWVTdHIoYXR0ci0+YXR0bmFtZSkpOworCisJCQlpZiAo IWZpcnN0KQorCQkJeworCQkJCWFwcGVuZFN0cmluZ0luZm9TdHJpbmcoJmNvbmZsaWN0X2NvbHMs ICIsICIpOworCQkJCWFwcGVuZFN0cmluZ0luZm9TdHJpbmcoJmpvaW5fY2xhdXNlLCAiIEFORCAi KTsKKwkJCX0KKwkJCWZpcnN0ID0gZmFsc2U7CisKKwkJCWFwcGVuZFN0cmluZ0luZm9TdHJpbmco JmNvbmZsaWN0X2NvbHMsIHF1b3RlZCk7CisJCQlhcHBlbmRTdHJpbmdJbmZvKCZqb2luX2NsYXVz ZSwKKwkJCQkJCQkgIm5kLiVzIElTIE5PVCBESVNUSU5DVCBGUk9NIG12LiVzIiwKKwkJCQkJCQkg cXVvdGVkLCBxdW90ZWQpOworCQl9CisKKwkJLyogQnVpbGQgdGhlIERPIFVQREFURSBTRVQgY2xh dXNlIGZvciBub24ta2V5IGNvbHVtbnMuICovCisJCWZpcnN0ID0gdHJ1ZTsKKwkJZm9yIChpID0g MDsgaSA8IHR1cGRlc2MtPm5hdHRzOyBpKyspCisJCXsKKwkJCUZvcm1fcGdfYXR0cmlidXRlIGF0 dHIgPSBUdXBsZURlc2NBdHRyKHR1cGRlc2MsIGkpOworCQkJY29uc3QgY2hhciAqcXVvdGVkOwor CQkJYm9vbAkJaXNfa2V5ID0gZmFsc2U7CisJCQlpbnQJCQlqOworCisJCQlpZiAoYXR0ci0+YXR0 aXNkcm9wcGVkKQorCQkJCWNvbnRpbnVlOworCisJCQlmb3IgKGogPSAwOyBqIDwgaW5kZXhTdHJ1 Y3QtPmluZG5rZXlhdHRzOyBqKyspCisJCQl7CisJCQkJaWYgKGluZGV4U3RydWN0LT5pbmRrZXku dmFsdWVzW2pdID09IChpICsgMSkpCisJCQkJeworCQkJCQlpc19rZXkgPSB0cnVlOworCQkJCQli cmVhazsKKwkJCQl9CisJCQl9CisKKwkJCWlmIChpc19rZXkpCisJCQkJY29udGludWU7CisKKwkJ CWlmICghZmlyc3QpCisJCQkJYXBwZW5kU3RyaW5nSW5mb1N0cmluZygmc2V0X2NsYXVzZSwgIiwg Iik7CisJCQlmaXJzdCA9IGZhbHNlOworCQkJaGFzX25vbl9rZXlfY29scyA9IHRydWU7CisKKwkJ CXF1b3RlZCA9IHF1b3RlX2lkZW50aWZpZXIoTmFtZVN0cihhdHRyLT5hdHRuYW1lKSk7CisJCQlh cHBlbmRTdHJpbmdJbmZvKCZzZXRfY2xhdXNlLCAiJXMgPSBFWENMVURFRC4lcyIsIHF1b3RlZCwg cXVvdGVkKTsKKwkJfQorCisJCWluZGV4X2Nsb3NlKGluZGV4UmVsLCBOb0xvY2spOworCisJCXJl c2V0U3RyaW5nSW5mbygmYnVmKTsKKworCQlpZiAoaGFzX25vbl9rZXlfY29scykKKwkJeworCQkJ YXBwZW5kU3RyaW5nSW5mbygmYnVmLAorCQkJCQkJCSAiV0lUSCBuZXdfZGF0YSBBUyBNQVRFUklB TElaRUQgKCAiCisJCQkJCQkJICIgIFNFTEVDVCAqIEZST00gKCVzKSAlcyBXSEVSRSAoJXMpICIK KwkJCQkJCQkgIiksICIKKwkJCQkJCQkgInVwc2VydCBBUyAoICIKKwkJCQkJCQkgIiAgSU5TRVJU IElOVE8gJXMgU0VMRUNUICogRlJPTSBuZXdfZGF0YSAiCisJCQkJCQkJICIgIE9OIENPTkZMSUNU ICglcykgRE8gVVBEQVRFIFNFVCAlcyAiCisJCQkJCQkJICIpICIKKwkJCQkJCQkgIkRFTEVURSBG Uk9NICVzIG12IFdIRVJFICglcykgQU5EIE5PVCBFWElTVFMgKCAiCisJCQkJCQkJICIgIFNFTEVD VCAxIEZST00gbmV3X2RhdGEgbmQgV0hFUkUgJXMiCisJCQkJCQkJICIpIiwKKwkJCQkJCQkgdmll d19zcWwsIG1hdHZpZXdfYWxpYXMsIHdoZXJlQ2xhdXNlU3RyLAorCQkJCQkJCSBtYXR2aWV3X25h bWUsIGNvbmZsaWN0X2NvbHMuZGF0YSwgc2V0X2NsYXVzZS5kYXRhLAorCQkJCQkJCSBtYXR2aWV3 X25hbWUsIHdoZXJlQ2xhdXNlU3RyLCBqb2luX2NsYXVzZS5kYXRhKTsKKwkJfQorCQllbHNlCisJ CXsKKwkJCWFwcGVuZFN0cmluZ0luZm8oJmJ1ZiwKKwkJCQkJCQkgIldJVEggbmV3X2RhdGEgQVMg TUFURVJJQUxJWkVEICggIgorCQkJCQkJCSAiICBTRUxFQ1QgKiBGUk9NICglcykgJXMgV0hFUkUg KCVzKSAiCisJCQkJCQkJICIpLCAiCisJCQkJCQkJICJ1cHNlcnQgQVMgKCAiCisJCQkJCQkJICIg IElOU0VSVCBJTlRPICVzIFNFTEVDVCAqIEZST00gbmV3X2RhdGEgIgorCQkJCQkJCSAiICBPTiBD T05GTElDVCAoJXMpIERPIE5PVEhJTkcgIgorCQkJCQkJCSAiKSAiCisJCQkJCQkJICJERUxFVEUg RlJPTSAlcyBtdiBXSEVSRSAoJXMpIEFORCBOT1QgRVhJU1RTICggIgorCQkJCQkJCSAiICBTRUxF Q1QgMSBGUk9NIG5ld19kYXRhIG5kIFdIRVJFICVzIgorCQkJCQkJCSAiKSIsCisJCQkJCQkJIHZp ZXdfc3FsLCBtYXR2aWV3X2FsaWFzLCB3aGVyZUNsYXVzZVN0ciwKKwkJCQkJCQkgbWF0dmlld19u YW1lLCBjb25mbGljdF9jb2xzLmRhdGEsCisJCQkJCQkJIG1hdHZpZXdfbmFtZSwgd2hlcmVDbGF1 c2VTdHIsIGpvaW5fY2xhdXNlLmRhdGEpOworCQl9CisKKwkJY2FjaGVFbnRyeS0+cmVmcmVzaFBs YW4gPSBTUElfcHJlcGFyZShidWYuZGF0YSwgbmFyZ3MsIGFyZ3R5cGVzKTsKKwkJaWYgKGNhY2hl RW50cnktPnJlZnJlc2hQbGFuID09IE5VTEwpCisJCQllbG9nKEVSUk9SLCAiU1BJX3ByZXBhcmUg ZmFpbGVkIGZvciByZWZyZXNoIENURTogJXMiLCBidWYuZGF0YSk7CisJCVNQSV9rZWVwcGxhbihj YWNoZUVudHJ5LT5yZWZyZXNoUGxhbik7CisKKwkJLyogU2F2ZSBjYWNoZSBtZXRhZGF0YSBpbiBh IGxvbmctbGl2ZWQgY29udGV4dC4gKi8KKwkJb2xkY3h0ID0gTWVtb3J5Q29udGV4dFN3aXRjaFRv KENhY2hlTWVtb3J5Q29udGV4dCk7CisJCWNhY2hlRW50cnktPnVuaXF1ZUluZGV4T2lkID0gdW5p cXVlSW5kZXhPaWQ7CisJCWNhY2hlRW50cnktPndoZXJlQ2xhdXNlU3RyID0gcHN0cmR1cCh3aGVy ZUNsYXVzZVN0cik7CisJCU1lbW9yeUNvbnRleHRTd2l0Y2hUbyhvbGRjeHQpOworCisJCXBmcmVl KG1hdHZpZXdfbmFtZSk7CisJCXBmcmVlKHZpZXdfc3FsKTsKKwkJcGZyZWUoYnVmLmRhdGEpOwor CQlwZnJlZShjb25mbGljdF9jb2xzLmRhdGEpOworCQlwZnJlZShzZXRfY2xhdXNlLmRhdGEpOwor CQlwZnJlZShqb2luX2NsYXVzZS5kYXRhKTsKKwkJaWYgKGFyZ3R5cGVzICE9IE5VTEwpCisJCQlw ZnJlZShhcmd0eXBlcyk7CisJfQorCisKKwkvKiBFeGVjdXRlOiBsb2NrIG1hdGNoaW5nIHJvd3Ms IHRoZW4gcnVuIHRoZSByZWZyZXNoIENURS4gKi8KKwlpZiAobWF0dmlld19leGVjdXRlX3NwaV9w bGFuKGNhY2hlRW50cnktPmxvY2tQbGFuLCBwYXJhbXMsIGZhbHNlKSA8IDApCisJCWVsb2coRVJS T1IsICJTUElfZXhlY3V0ZV9wbGFuIGZhaWxlZCBkdXJpbmcgbG9jayBhY3F1aXNpdGlvbiIpOwor CisJaWYgKG1hdHZpZXdfZXhlY3V0ZV9zcGlfcGxhbihjYWNoZUVudHJ5LT5yZWZyZXNoUGxhbiwg cGFyYW1zLCBmYWxzZSkgPCAwKQorCQllbG9nKEVSUk9SLCAiU1BJX2V4ZWN1dGVfcGxhbiBmYWls ZWQgZHVyaW5nIHJlZnJlc2giKTsKKworCXJlc3VsdF9wcm9jZXNzZWQgPSBTUElfcHJvY2Vzc2Vk OworCisJU1BJX2ZpbmlzaCgpOworCUNsb3NlTWF0Vmlld0luY3JlbWVudGFsTWFpbnRlbmFuY2Uo KTsKKwl0YWJsZV9jbG9zZShtYXR2aWV3UmVsLCBOb0xvY2spOworCisJcmV0dXJuIHJlc3VsdF9w cm9jZXNzZWQ7Cit9CisKIC8qCiAgKiByZWZyZXNoX2J5X21hdGNoX21lcmdlCiAgKgpAQCAtNTcy LDYgKzEyMTcsMTAgQEAgdHJhbnNpZW50cmVsX2Rlc3Ryb3koRGVzdFJlY2VpdmVyICpzZWxmKQog ICogYXJlIGNvbnNpc3RlbnQgd2l0aCBkZWZhdWx0IGJlaGF2aW9yLiAgSWYgdGhlcmUgaXMgYXQg bGVhc3Qgb25lIFVOSVFVRQogICogaW5kZXggb24gdGhlIG1hdGVyaWFsaXplZCB2aWV3LCB3ZSBo YXZlIGV4YWN0bHkgdGhlIGd1YXJhbnRlZSB3ZSBuZWVkLgogICoKKyAqIElmIHdoZXJlQ2xhdXNl U3RyIGlzIHByb3ZpZGVkLCBvbmx5IHJvd3MgbWF0Y2hpbmcgdGhlIFdIRVJFIGNvbmRpdGlvbgor ICogaW4gdGhlIGV4aXN0aW5nIG1hdHZpZXcgYXJlIGNvbnNpZGVyZWQgZm9yIHRoZSBkaWZmIG9w ZXJhdGlvbiwgZW5hYmxpbmcKKyAqIHBhcnRpYWwgY29uY3VycmVudCByZWZyZXNoLgorICoKICAq IFRoZSB0ZW1wb3JhcnkgdGFibGUgdXNlZCB0byBob2xkIHRoZSBkaWZmIHJlc3VsdHMgY29udGFp bnMganVzdCB0aGUgVElEIG9mCiAgKiB0aGUgb2xkIHJlY29yZCAoaWYgbWF0Y2hlZCkgYW5kIHRo ZSBST1cgZnJvbSB0aGUgbmV3IHRhYmxlIGFzIGEgc2luZ2xlCiAgKiBjb2x1bW4gb2YgY29tcGxl eCByZWNvcmQgdHlwZSAoaWYgbWF0Y2hlZCkuCkBAIC01ODksNyArMTIzOCw4IEBAIHRyYW5zaWVu dHJlbF9kZXN0cm95KERlc3RSZWNlaXZlciAqc2VsZikKICAqLwogc3RhdGljIHZvaWQKIHJlZnJl c2hfYnlfbWF0Y2hfbWVyZ2UoT2lkIG1hdHZpZXdPaWQsIE9pZCB0ZW1wT2lkLCBPaWQgcmVsb3du ZXIsCi0JCQkJCSAgIGludCBzYXZlX3NlY19jb250ZXh0KQorCQkJCQkgICBpbnQgc2F2ZV9zZWNf Y29udGV4dCwgY2hhciAqd2hlcmVDbGF1c2VTdHIsCisJCQkJCSAgIFBhcmFtTGlzdEluZm8gcGFy YW1zKQogewogCVN0cmluZ0luZm9EYXRhIHF1ZXJ5YnVmOwogCVJlbGF0aW9uCW1hdHZpZXdSZWw7 CkBAIC03MDMsOCArMTM1MywxNSBAQCByZWZyZXNoX2J5X21hdGNoX21lcmdlKE9pZCBtYXR2aWV3 T2lkLCBPaWQgdGVtcE9pZCwgT2lkIHJlbG93bmVyLAogCWFwcGVuZFN0cmluZ0luZm8oJnF1ZXJ5 YnVmLAogCQkJCQkgIklOU0VSVCBJTlRPICVzICIKIAkJCQkJICJTRUxFQ1QgbXYuY3RpZCBBUyB0 aWQsIG5ld2RhdGEuKjo6JXMgQVMgbmV3ZGF0YSAiCi0JCQkJCSAiRlJPTSAlcyBtdiBGVUxMIEpP SU4gJXMgbmV3ZGF0YSBPTiAoIiwKLQkJCQkJIGRpZmZuYW1lLCB0ZW1wbmFtZSwgbWF0dmlld25h bWUsIHRlbXBuYW1lKTsKKwkJCQkJICJGUk9NICIsCisJCQkJCSBkaWZmbmFtZSwgdGVtcG5hbWUp OworCisJaWYgKHdoZXJlQ2xhdXNlU3RyKQorCQlhcHBlbmRTdHJpbmdJbmZvKCZxdWVyeWJ1Ziwg IihTRUxFQ1QgY3RpZCwgKiBGUk9NICVzIFdIRVJFICVzKSBtdiIsIG1hdHZpZXduYW1lLCB3aGVy ZUNsYXVzZVN0cik7CisJZWxzZQorCQlhcHBlbmRTdHJpbmdJbmZvKCZxdWVyeWJ1ZiwgIiVzIG12 IiwgbWF0dmlld25hbWUpOworCisJYXBwZW5kU3RyaW5nSW5mbygmcXVlcnlidWYsICIgRlVMTCBK T0lOICVzIG5ld2RhdGEgT04gKCIsIHRlbXBuYW1lKTsKIAogCS8qCiAJICogR2V0IHRoZSBsaXN0 IG9mIGluZGV4IE9JRHMgZm9yIHRoZSB0YWJsZSBmcm9tIHRoZSByZWxjYWNoZSwgYW5kIGxvb2sg dXAKQEAgLTgyNiwxMyArMTQ4Myw0MiBAQCByZWZyZXNoX2J5X21hdGNoX21lcmdlKE9pZCBtYXR2 aWV3T2lkLCBPaWQgdGVtcE9pZCwgT2lkIHJlbG93bmVyLAogCQkJCWVycm1zZygiY291bGQgbm90 IGZpbmQgc3VpdGFibGUgdW5pcXVlIGluZGV4IG9uIG1hdGVyaWFsaXplZCB2aWV3IFwiJXNcIiIs CiAJCQkJCSAgIFJlbGF0aW9uR2V0UmVsYXRpb25OYW1lKG1hdHZpZXdSZWwpKSk7CiAKLQlhcHBl bmRTdHJpbmdJbmZvU3RyaW5nKCZxdWVyeWJ1ZiwKLQkJCQkJCSAgICIgQU5EIG5ld2RhdGEuKiBP UEVSQVRPUihwZ19jYXRhbG9nLio9KSBtdi4qKSAiCi0JCQkJCQkgICAiV0hFUkUgbmV3ZGF0YS4q IElTIE5VTEwgT1IgbXYuKiBJUyBOVUxMICIKLQkJCQkJCSAgICJPUkRFUiBCWSB0aWQiKTsKKwlp ZiAod2hlcmVDbGF1c2VTdHIpCisJeworCQlTdHJpbmdJbmZvRGF0YSBjb2xzOworCQlpbnQJCQlp OworCQlib29sCQlmaXJzdCA9IHRydWU7CisKKwkJaW5pdFN0cmluZ0luZm8oJmNvbHMpOworCQlm b3IgKGkgPSAwOyBpIDwgcmVsbmF0dHM7IGkrKykKKwkJeworCQkJRm9ybV9wZ19hdHRyaWJ1dGUg YXR0ciA9IFR1cGxlRGVzY0F0dHIodHVwZGVzYywgaSk7CisKKwkJCWlmIChhdHRyLT5hdHRpc2Ry b3BwZWQpCisJCQkJY29udGludWU7CisJCQlpZiAoIWZpcnN0KQorCQkJCWFwcGVuZFN0cmluZ0lu Zm9TdHJpbmcoJmNvbHMsICIsICIpOworCQkJZmlyc3QgPSBmYWxzZTsKKwkJCWFwcGVuZFN0cmlu Z0luZm8oJmNvbHMsICJtdi4lcyIsIHF1b3RlX3F1YWxpZmllZF9pZGVudGlmaWVyKE5VTEwsIE5h bWVTdHIoYXR0ci0+YXR0bmFtZSkpKTsKKwkJfQorCisJCWFwcGVuZFN0cmluZ0luZm8oJnF1ZXJ5 YnVmLAorCQkJCQkJICIgQU5EIG5ld2RhdGEuKiBPUEVSQVRPUihwZ19jYXRhbG9nLio9KSBST1co JXMpKSAiCisJCQkJCQkgIldIRVJFIG5ld2RhdGEuKiBJUyBOVUxMIE9SIG12LmN0aWQgSVMgTlVM TCAiCisJCQkJCQkgIk9SREVSIEJZIHRpZCIsCisJCQkJCQkgY29scy5kYXRhKTsKKwkJcGZyZWUo Y29scy5kYXRhKTsKKwl9CisJZWxzZQorCXsKKwkJYXBwZW5kU3RyaW5nSW5mb1N0cmluZygmcXVl cnlidWYsCisJCQkJCQkJICAgIiBBTkQgbmV3ZGF0YS4qIE9QRVJBVE9SKHBnX2NhdGFsb2cuKj0p IG12LiopICIKKwkJCQkJCQkgICAiV0hFUkUgbmV3ZGF0YS4qIElTIE5VTEwgT1IgbXYuKiBJUyBO VUxMICIKKwkJCQkJCQkgICAiT1JERVIgQlkgdGlkIik7CisJfQogCiAJLyogUG9wdWxhdGUgdGhl IHRlbXBvcmFyeSAiZGlmZiIgdGFibGUuICovCi0JaWYgKFNQSV9leGVjKHF1ZXJ5YnVmLmRhdGEs IDApICE9IFNQSV9PS19JTlNFUlQpCisJaWYgKG1hdHZpZXdfZXhlY3V0ZV9zcGkocXVlcnlidWYu ZGF0YSwgcGFyYW1zLCBmYWxzZSkgIT0gU1BJX09LX0lOU0VSVCkKIAkJZWxvZyhFUlJPUiwgIlNQ SV9leGVjIGZhaWxlZDogJXMiLCBxdWVyeWJ1Zi5kYXRhKTsKIAogCS8qCkBAIC04OTgsNyArMTU4 NCw4IEBAIHJlZnJlc2hfYnlfaGVhcF9zd2FwKE9pZCBtYXR2aWV3T2lkLCBPaWQgT0lETmV3SGVh cCwgY2hhciByZWxwZXJzaXN0ZW5jZSkKIH0KIAogLyoKLSAqIENoZWNrIHdoZXRoZXIgc3BlY2lm aWVkIGluZGV4IGlzIHVzYWJsZSBmb3IgbWF0Y2ggbWVyZ2UuCisgKiBDaGVjayB3aGV0aGVyIHRo ZSBzcGVjaWZpZWQgaW5kZXggaXMgdXNhYmxlIGZvciByZWZyZXNoX2J5X21hdGNoX21lcmdlCisg KiAgb3IgcmVmcmVzaF9ieV9kaXJlY3RfbW9kaWZpY2F0aW9uLgogICovCiBzdGF0aWMgYm9vbAog aXNfdXNhYmxlX3VuaXF1ZV9pbmRleChSZWxhdGlvbiBpbmRleFJlbCkKQEAgLTk0Niw4ICsxNjMz LDEwIEBAIGlzX3VzYWJsZV91bmlxdWVfaW5kZXgoUmVsYXRpb24gaW5kZXhSZWwpCiAgKgogICog V2hpbGUgdGhlIGZ1bmN0aW9uIG5hbWVzIHJlZmxlY3QgdGhlIGZhY3QgdGhhdCB0aGVpciBtYWlu IGludGVuZGVkIHVzZSBpcwogICogaW5jcmVtZW50YWwgbWFpbnRlbmFuY2Ugb2YgbWF0ZXJpYWxp emVkIHZpZXdzIChpbiByZXNwb25zZSB0byBjaGFuZ2VzIHRvCi0gKiB0aGUgZGF0YSBpbiByZWZl cmVuY2VkIHJlbGF0aW9ucyksIHRoZXkgYXJlIGluaXRpYWxseSB1c2VkIHRvIGFsbG93IFJFRlJF U0gKLSAqIHdpdGhvdXQgYmxvY2tpbmcgY29uY3VycmVudCByZWFkcy4KKyAqIHRoZSBkYXRhIGlu IHJlZmVyZW5jZWQgcmVsYXRpb25zKSwgdGhleSBhcmUgY3VycmVudGx5IHVzZWQgdG8gYWxsb3c6 CisgKgorICogLSBSRUZSRVNIIENPTkNVUlJFTlRMWSB3aXRob3V0IGJsb2NraW5nIGNvbmN1cnJl bnQgcmVhZHMuCisgKiAtIFJFRlJFU0ggLi4uIFdIRVJFIC4uLiB3aGljaCBtb2RpZmllcyB0aGUg bWF0dmlldyBpbi1wbGFjZS4KICAqLwogYm9vbAogTWF0Vmlld0luY3JlbWVudGFsTWFpbnRlbmFu Y2VJc0VuYWJsZWQodm9pZCkKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2V4ZWN1dG9yL2V4ZWNN YWluLmMgYi9zcmMvYmFja2VuZC9leGVjdXRvci9leGVjTWFpbi5jCmluZGV4IDRiMzBmNzY4Njgw Li4zMzgwZjVlNjhlMSAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvZXhlY3V0b3IvZXhlY01haW4u YworKysgYi9zcmMvYmFja2VuZC9leGVjdXRvci9leGVjTWFpbi5jCkBAIC0xMjI5LDcgKzEyMjks OCBAQCBDaGVja1ZhbGlkUm93TWFya1JlbChSZWxhdGlvbiByZWwsIFJvd01hcmtUeXBlIG1hcmtU eXBlKQogCQkJYnJlYWs7CiAJCWNhc2UgUkVMS0lORF9NQVRWSUVXOgogCQkJLyogQWxsb3cgcmVm ZXJlbmNpbmcgYSBtYXR2aWV3LCBidXQgbm90IGFjdHVhbCBsb2NraW5nIGNsYXVzZXMgKi8KLQkJ CWlmIChtYXJrVHlwZSAhPSBST1dfTUFSS19SRUZFUkVOQ0UpCisJCQlpZiAobWFya1R5cGUgIT0g Uk9XX01BUktfUkVGRVJFTkNFICYmCisJCQkJIU1hdFZpZXdJbmNyZW1lbnRhbE1haW50ZW5hbmNl SXNFbmFibGVkKCkpCiAJCQkJZXJlcG9ydChFUlJPUiwKIAkJCQkJCShlcnJjb2RlKEVSUkNPREVf V1JPTkdfT0JKRUNUX1RZUEUpLAogCQkJCQkJIGVycm1zZygiY2Fubm90IGxvY2sgcm93cyBpbiBt YXRlcmlhbGl6ZWQgdmlldyBcIiVzXCIiLApkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvcGFyc2Vy L2dyYW0ueSBiL3NyYy9iYWNrZW5kL3BhcnNlci9ncmFtLnkKaW5kZXggMmQxYjE5ZDFmNTMuLmI1 ODc5NjdlYzE1IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9wYXJzZXIvZ3JhbS55CisrKyBiL3Ny Yy9iYWNrZW5kL3BhcnNlci9ncmFtLnkKQEAgLTMyNiw2ICszMjYsNyBAQCBzdGF0aWMgTm9kZSAq bWFrZVJlY3Vyc2l2ZVZpZXdTZWxlY3QoY2hhciAqcmVsbmFtZSwgTGlzdCAqYWxpYXNlcywgTm9k ZSAqcXVlcnkpOwogJXR5cGUgPHN0cj4JCQlvcHRfc2luZ2xlX25hbWUKICV0eXBlIDxsaXN0PgkJ b3B0X3F1YWxpZmllZF9uYW1lCiAldHlwZSA8Ym9vbGVhbj4JCW9wdF9jb25jdXJyZW50bHkgb3B0 X3VzaW5naW5kZXgKKyV0eXBlIDxub2RlPgkJb3B0X3JlZnJlc2hfd2hlcmVfY2xhdXNlCiAldHlw ZSA8ZGJlaGF2aW9yPglvcHRfZHJvcF9iZWhhdmlvcgogJXR5cGUgPGxpc3Q+CQlvcHRfdXRpbGl0 eV9vcHRpb25fbGlzdAogJXR5cGUgPGxpc3Q+CQlvcHRfd2FpdF93aXRoX2NsYXVzZQpAQCAtNTA5 NywxNyArNTA5OCwyOCBAQCBPcHROb0xvZzoJVU5MT0dHRUQJCQkJCXsgJCQgPSBSRUxQRVJTSVNU RU5DRV9VTkxPR0dFRDsgfQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBSZWZyZXNoTWF0Vmll d1N0bXQ6Ci0JCQlSRUZSRVNIIE1BVEVSSUFMSVpFRCBWSUVXIG9wdF9jb25jdXJyZW50bHkgcXVh bGlmaWVkX25hbWUgb3B0X3dpdGhfZGF0YQorCQkJUkVGUkVTSCBNQVRFUklBTElaRUQgVklFVyBv cHRfY29uY3VycmVudGx5IHF1YWxpZmllZF9uYW1lIG9wdF93aXRoX2RhdGEgb3B0X3JlZnJlc2hf d2hlcmVfY2xhdXNlCiAJCQkJewogCQkJCQlSZWZyZXNoTWF0Vmlld1N0bXQgKm4gPSBtYWtlTm9k ZShSZWZyZXNoTWF0Vmlld1N0bXQpOwogCiAJCQkJCW4tPmNvbmN1cnJlbnQgPSAkNDsKIAkJCQkJ bi0+cmVsYXRpb24gPSAkNTsKIAkJCQkJbi0+c2tpcERhdGEgPSAhKCQ2KTsKKwkJCQkJbi0+d2hl cmVDbGF1c2UgPSAkNzsKKworCQkJCQlpZiAobi0+c2tpcERhdGEgJiYgbi0+d2hlcmVDbGF1c2Up CisJCQkJCQllcmVwb3J0KEVSUk9SLAorCQkJCQkJCQkoZXJyY29kZShFUlJDT0RFX1NZTlRBWF9F UlJPUiksCisJCQkJCQkJCSBlcnJtc2coImNhbm5vdCBzcGVjaWZ5IFdIRVJFIGNsYXVzZSB3aXRo IFdJVEggTk8gREFUQSIpKSk7CiAJCQkJCSQkID0gKE5vZGUgKikgbjsKIAkJCQl9CiAJCTsKIAor b3B0X3JlZnJlc2hfd2hlcmVfY2xhdXNlOgorCQkJV0hFUkUgYV9leHByCQkJeyAkJCA9ICQyOyB9 CisJCQl8IC8qIGVtcHR5ICovCQkJeyAkJCA9IE5VTEw7IH0KKwkJOworCiAKIC8qKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKgogICoKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3Rjb3AvdXRpbGl0eS5jIGIv c3JjL2JhY2tlbmQvdGNvcC91dGlsaXR5LmMKaW5kZXggMWQzNGMxOTkxM2UuLjU2YWUzYmQyZjk0 IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC90Y29wL3V0aWxpdHkuYworKysgYi9zcmMvYmFja2Vu ZC90Y29wL3V0aWxpdHkuYwpAQCAtMTY5NCw3ICsxNjk0LDcgQEAgUHJvY2Vzc1V0aWxpdHlTbG93 KFBhcnNlU3RhdGUgKnBzdGF0ZSwKIAkJCQlQR19UUlkoMik7CiAJCQkJewogCQkJCQlhZGRyZXNz ID0gRXhlY1JlZnJlc2hNYXRWaWV3KChSZWZyZXNoTWF0Vmlld1N0bXQgKikgcGFyc2V0cmVlLAot CQkJCQkJCQkJCQkJIHF1ZXJ5U3RyaW5nLCBxYyk7CisJCQkJCQkJCQkJCQkgcXVlcnlTdHJpbmcs IHBhcmFtcywgcWMpOwogCQkJCX0KIAkJCQlQR19GSU5BTExZKDIpOwogCQkJCXsKZGlmZiAtLWdp dCBhL3NyYy9pbmNsdWRlL2NvbW1hbmRzL21hdHZpZXcuaCBiL3NyYy9pbmNsdWRlL2NvbW1hbmRz L21hdHZpZXcuaAppbmRleCA3MzhjNzMxYzFhOS4uZmY0NjU0MmQ2NmMgMTAwNjQ0Ci0tLSBhL3Ny Yy9pbmNsdWRlL2NvbW1hbmRzL21hdHZpZXcuaAorKysgYi9zcmMvaW5jbHVkZS9jb21tYW5kcy9t YXR2aWV3LmgKQEAgLTI0LDkgKzI0LDExIEBACiBleHRlcm4gdm9pZCBTZXRNYXRWaWV3UG9wdWxh dGVkU3RhdGUoUmVsYXRpb24gcmVsYXRpb24sIGJvb2wgbmV3c3RhdGUpOwogCiBleHRlcm4gT2Jq ZWN0QWRkcmVzcyBFeGVjUmVmcmVzaE1hdFZpZXcoUmVmcmVzaE1hdFZpZXdTdG10ICpzdG10LCBj b25zdCBjaGFyICpxdWVyeVN0cmluZywKLQkJCQkJCQkJCQlRdWVyeUNvbXBsZXRpb24gKnFjKTsK KwkJCQkJCQkJCQlQYXJhbUxpc3RJbmZvIHBhcmFtcywgUXVlcnlDb21wbGV0aW9uICpxYyk7CisK IGV4dGVybiBPYmplY3RBZGRyZXNzIFJlZnJlc2hNYXRWaWV3QnlPaWQoT2lkIG1hdHZpZXdPaWQs IGJvb2wgaXNfY3JlYXRlLCBib29sIHNraXBEYXRhLAotCQkJCQkJCQkJCSBib29sIGNvbmN1cnJl bnQsIGNvbnN0IGNoYXIgKnF1ZXJ5U3RyaW5nLAorCQkJCQkJCQkJCSBib29sIGNvbmN1cnJlbnQs IE5vZGUgKndoZXJlQ2xhdXNlLAorCQkJCQkJCQkJCSBjb25zdCBjaGFyICpxdWVyeVN0cmluZywg UGFyYW1MaXN0SW5mbyBwYXJhbXMsCiAJCQkJCQkJCQkJIFF1ZXJ5Q29tcGxldGlvbiAqcWMpOwog CiBleHRlcm4gRGVzdFJlY2VpdmVyICpDcmVhdGVUcmFuc2llbnRSZWxEZXN0UmVjZWl2ZXIoT2lk IHRyYW5zaWVudG9pZCk7CmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS9ub2Rlcy9wYXJzZW5vZGVz LmggYi9zcmMvaW5jbHVkZS9ub2Rlcy9wYXJzZW5vZGVzLmgKaW5kZXggOTEzNzdhNmNkZTMuLjNm YzA4OGZkMjYyIDEwMDY0NAotLS0gYS9zcmMvaW5jbHVkZS9ub2Rlcy9wYXJzZW5vZGVzLmgKKysr IGIvc3JjL2luY2x1ZGUvbm9kZXMvcGFyc2Vub2Rlcy5oCkBAIC00MTU5LDYgKzQxNTksNyBAQCB0 eXBlZGVmIHN0cnVjdCBSZWZyZXNoTWF0Vmlld1N0bXQKIAlib29sCQljb25jdXJyZW50OwkJLyog YWxsb3cgY29uY3VycmVudCBhY2Nlc3M/ICovCiAJYm9vbAkJc2tpcERhdGE7CQkvKiB0cnVlIGZv ciBXSVRIIE5PIERBVEEgKi8KIAlSYW5nZVZhciAgICpyZWxhdGlvbjsJCS8qIHJlbGF0aW9uIHRv IGluc2VydCBpbnRvICovCisJTm9kZQkgICAqd2hlcmVDbGF1c2U7CS8qIHF1YWxpZmljYXRpb24g Zm9yIHBhcnRpYWwgcmVmcmVzaCAqLwogfSBSZWZyZXNoTWF0Vmlld1N0bXQ7CiAKIC8qIC0tLS0t LS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQv bWF0dmlld193aGVyZS5vdXQgYi9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL21hdHZpZXdfd2hl cmUub3V0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwLi43NWIwMmU4NGE2 YQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvbWF0dmlld193 aGVyZS5vdXQKQEAgLTAsMCArMSwzNDQgQEAKKy0tCistLSBSRUZSRVNIIE1BVEVSSUFMSVpFRCBW SUVXIC4uLiBXSEVSRSAuLi4KKy0tCistLSBTZXR1cAorQ1JFQVRFIFRBQkxFIG12X2Jhc2VfYSAo aWQgaW50IHByaW1hcnkga2V5LCB2YWwgdGV4dCk7CitJTlNFUlQgSU5UTyBtdl9iYXNlX2EgVkFM VUVTICgxLCAnT25lJyksICgyLCAnVHdvJyksICgzLCAnVGhyZWUnKTsKK0NSRUFURSBNQVRFUklB TElaRUQgVklFVyBtdl90ZXN0X2EgQVMgU0VMRUNUICogRlJPTSBtdl9iYXNlX2E7CitDUkVBVEUg VU5JUVVFIElOREVYIE9OIG12X3Rlc3RfYShpZCk7CistLQorLS0gVGVzdCAxOiBTeW50YXggYW5k IEVycm9yIGhhbmRsaW5nCistLQorLS0gMS4xIFdJVEggTk8gREFUQSArIFdIRVJFIC0+IEVycm9y CitSRUZSRVNIIE1BVEVSSUFMSVpFRCBWSUVXIG12X3Rlc3RfYSBXSVRIIE5PIERBVEEgV0hFUkUg aWQgPSAxOworRVJST1I6ICBjYW5ub3Qgc3BlY2lmeSBXSEVSRSBjbGF1c2Ugd2l0aCBXSVRIIE5P IERBVEEKKy0tIDEuMiBVbnBvcHVsYXRlZCArIFdIRVJFIC0+IEVycm9yCitDUkVBVEUgTUFURVJJ QUxJWkVEIFZJRVcgbXZfdW5wb3AgQVMgU0VMRUNUICogRlJPTSBtdl9iYXNlX2EgV0lUSCBOTyBE QVRBOworUkVGUkVTSCBNQVRFUklBTElaRUQgVklFVyBtdl91bnBvcCBXSEVSRSBpZCA9IDE7CitF UlJPUjogIFdIRVJFIGNsYXVzZSBjYW5ub3QgYmUgdXNlZCB3aGVuIHRoZSBtYXRlcmlhbGl6ZWQg dmlldyBpcyBub3QgcG9wdWxhdGVkCitEUk9QIE1BVEVSSUFMSVpFRCBWSUVXIG12X3VucG9wOwor LS0gMS4zIFZvbGF0aWxlIGZ1bmN0aW9ucyAtPiBFcnJvcgorUkVGUkVTSCBNQVRFUklBTElaRUQg VklFVyBtdl90ZXN0X2EgV0hFUkUgcmFuZG9tKCkgPiAwLjU7CitFUlJPUjogIFdIRVJFIGNsYXVz ZSBpbiBSRUZSRVNIIE1BVEVSSUFMSVpFRCBWSUVXIGNhbm5vdCBjb250YWluIHZvbGF0aWxlIGZ1 bmN0aW9ucworLS0gMS40IEFnZ3JlZ2F0ZXMgLT4gRXJyb3IKK1JFRlJFU0ggTUFURVJJQUxJWkVE IFZJRVcgbXZfdGVzdF9hIFdIRVJFIGNvdW50KCopID4gMDsKK0VSUk9SOiAgYWdncmVnYXRlIGZ1 bmN0aW9ucyBhcmUgbm90IGFsbG93ZWQgaW4gV0hFUkUKKy0tCistLSBUZXN0IDI6IE5vbi1jb25j dXJyZW50IFBhcnRpYWwgUmVmcmVzaAorLS0KKy0tIE1vZGlmeSBiYXNlIGRhdGEKK1VQREFURSBt dl9iYXNlX2EgU0VUIHZhbCA9ICdPbmUgVXBkYXRlZCcgV0hFUkUgaWQgPSAxOworVVBEQVRFIG12 X2Jhc2VfYSBTRVQgdmFsID0gJ1R3byBVcGRhdGVkJyBXSEVSRSBpZCA9IDI7CistLSBSZWZyZXNo IG9ubHkgaWQ9MQorUkVGUkVTSCBNQVRFUklBTElaRUQgVklFVyBtdl90ZXN0X2EgV0hFUkUgaWQg PSAxOworLS0gVmVyaWZ5OiBpZD0xIHNob3VsZCBiZSB1cGRhdGVkLCBpZD0yIHNob3VsZCByZW1h aW4gc3RhbGUKK1NFTEVDVCAqIEZST00gbXZfdGVzdF9hIE9SREVSIEJZIGlkOworIGlkIHwgICAg IHZhbCAgICAgCistLS0tKy0tLS0tLS0tLS0tLS0KKyAgMSB8IE9uZSBVcGRhdGVkCisgIDIgfCBU d28KKyAgMyB8IFRocmVlCisoMyByb3dzKQorCistLSBSZWZyZXNoIGlkPTIKK1JFRlJFU0ggTUFU RVJJQUxJWkVEIFZJRVcgbXZfdGVzdF9hIFdIRVJFIGlkID0gMjsKK1NFTEVDVCAqIEZST00gbXZf dGVzdF9hIE9SREVSIEJZIGlkOworIGlkIHwgICAgIHZhbCAgICAgCistLS0tKy0tLS0tLS0tLS0t LS0KKyAgMSB8IE9uZSBVcGRhdGVkCisgIDIgfCBUd28gVXBkYXRlZAorICAzIHwgVGhyZWUKKygz IHJvd3MpCisKKy0tCistLSBUZXN0IDM6IENvbmN1cnJlbnQgUGFydGlhbCBSZWZyZXNoCistLQor LS0gTW9kaWZ5IGJhc2UgZGF0YQorVVBEQVRFIG12X2Jhc2VfYSBTRVQgdmFsID0gJ09uZSBDb25j dXJyZW50JyBXSEVSRSBpZCA9IDE7CitVUERBVEUgbXZfYmFzZV9hIFNFVCB2YWwgPSAnVHdvIENv bmN1cnJlbnQnIFdIRVJFIGlkID0gMjsKKy0tIFJlZnJlc2ggb25seSBpZD0xCitSRUZSRVNIIE1B VEVSSUFMSVpFRCBWSUVXIENPTkNVUlJFTlRMWSBtdl90ZXN0X2EgV0hFUkUgaWQgPSAxOworLS0g VmVyaWZ5OiBpZD0xIHVwZGF0ZWQsIGlkPTIgc3RhbGUKK1NFTEVDVCAqIEZST00gbXZfdGVzdF9h IE9SREVSIEJZIGlkOworIGlkIHwgICAgICB2YWwgICAgICAgCistLS0tKy0tLS0tLS0tLS0tLS0t LS0KKyAgMSB8IE9uZSBDb25jdXJyZW50CisgIDIgfCBUd28gVXBkYXRlZAorICAzIHwgVGhyZWUK KygzIHJvd3MpCisKKy0tIFJlZnJlc2ggaWQ9MgorUkVGUkVTSCBNQVRFUklBTElaRUQgVklFVyBD T05DVVJSRU5UTFkgbXZfdGVzdF9hIFdIRVJFIGlkID0gMjsKK1NFTEVDVCAqIEZST00gbXZfdGVz dF9hIE9SREVSIEJZIGlkOworIGlkIHwgICAgICB2YWwgICAgICAgCistLS0tKy0tLS0tLS0tLS0t LS0tLS0KKyAgMSB8IE9uZSBDb25jdXJyZW50CisgIDIgfCBUd28gQ29uY3VycmVudAorICAzIHwg VGhyZWUKKygzIHJvd3MpCisKKy0tIENsZWFudXAgVGVzdCAyLzMKK0RST1AgTUFURVJJQUxJWkVE IFZJRVcgbXZfdGVzdF9hOworRFJPUCBUQUJMRSBtdl9iYXNlX2E7CistLQorLS0gVGVzdCA0OiBK b2luIFZpZXcgKEludm9pY2Ugc3R5bGUpCistLQorQ1JFQVRFIFRBQkxFIGludm9pY2VzIChpZCBp bnQgcHJpbWFyeSBrZXksIHRvdGFsIG51bWVyaWMpOworQ1JFQVRFIFRBQkxFIGludm9pY2VfaXRl bXMgKGludl9pZCBpbnQgcmVmZXJlbmNlcyBpbnZvaWNlcyhpZCksIGFtb3VudCBudW1lcmljKTsK K0lOU0VSVCBJTlRPIGludm9pY2VzIFZBTFVFUyAoMSwgMCksICgyLCAwKTsKK0lOU0VSVCBJTlRP IGludm9pY2VfaXRlbXMgVkFMVUVTICgxLCAxMDApLCAoMSwgNTApLCAoMiwgMjAwKTsKK0NSRUFU RSBNQVRFUklBTElaRUQgVklFVyBtdl9pbnZvaWNlcyBBUworICBTRUxFQ1QgaS5pZCwgc3VtKGlp LmFtb3VudCkgYXMgY29tcHV0ZWRfdG90YWwKKyAgRlJPTSBpbnZvaWNlcyBpCisgIEpPSU4gaW52 b2ljZV9pdGVtcyBpaSBPTiBpLmlkID0gaWkuaW52X2lkCisgIEdST1VQIEJZIGkuaWQ7CitDUkVB VEUgVU5JUVVFIElOREVYIE9OIG12X2ludm9pY2VzKGlkKTsKK1NFTEVDVCAqIEZST00gbXZfaW52 b2ljZXMgT1JERVIgQlkgaWQ7CisgaWQgfCBjb21wdXRlZF90b3RhbCAKKy0tLS0rLS0tLS0tLS0t LS0tLS0tLQorICAxIHwgICAgICAgICAgICAxNTAKKyAgMiB8ICAgICAgICAgICAgMjAwCisoMiBy b3dzKQorCistLSBNb2RpZnkgaXRlbXMgZm9yIGludm9pY2UgMQorSU5TRVJUIElOVE8gaW52b2lj ZV9pdGVtcyBWQUxVRVMgKDEsIDI1KTsKKy0tIE1vZGlmeSBpdGVtcyBmb3IgaW52b2ljZSAyCitJ TlNFUlQgSU5UTyBpbnZvaWNlX2l0ZW1zIFZBTFVFUyAoMiwgNTApOworLS0gUmVmcmVzaCBvbmx5 IGludm9pY2UgMQorUkVGUkVTSCBNQVRFUklBTElaRUQgVklFVyBtdl9pbnZvaWNlcyBXSEVSRSBp ZCA9IDE7CistLSBWZXJpZnk6IEludm9pY2UgMSB1cGRhdGVkICgxNzUpLCBJbnZvaWNlIDIgc3Rh bGUgKDIwMCkKK1NFTEVDVCAqIEZST00gbXZfaW52b2ljZXMgT1JERVIgQlkgaWQ7CisgaWQgfCBj b21wdXRlZF90b3RhbCAKKy0tLS0rLS0tLS0tLS0tLS0tLS0tLQorICAxIHwgICAgICAgICAgICAx NzUKKyAgMiB8ICAgICAgICAgICAgMjAwCisoMiByb3dzKQorCistLSBSZWZyZXNoIGludm9pY2Ug MiBjb25jdXJyZW50bHkKK1JFRlJFU0ggTUFURVJJQUxJWkVEIFZJRVcgQ09OQ1VSUkVOVExZIG12 X2ludm9pY2VzIFdIRVJFIGlkID0gMjsKKy0tIFZlcmlmeTogSW52b2ljZSAyIHVwZGF0ZWQgKDI1 MCkKK1NFTEVDVCAqIEZST00gbXZfaW52b2ljZXMgT1JERVIgQlkgaWQ7CisgaWQgfCBjb21wdXRl ZF90b3RhbCAKKy0tLS0rLS0tLS0tLS0tLS0tLS0tLQorICAxIHwgICAgICAgICAgICAxNzUKKyAg MiB8ICAgICAgICAgICAgMjUwCisoMiByb3dzKQorCitEUk9QIE1BVEVSSUFMSVpFRCBWSUVXIG12 X2ludm9pY2VzOworRFJPUCBUQUJMRSBpbnZvaWNlX2l0ZW1zOworRFJPUCBUQUJMRSBpbnZvaWNl czsKKy0tCistLSBUZXN0IDU6IFJvd3MgZW50ZXJpbmcvbGVhdmluZyB2aWV3IHNjb3BlCistLQor Q1JFQVRFIFRBQkxFIGl0ZW1zIChpZCBpbnQsIHN0YXR1cyB0ZXh0LCB2YWwgaW50KTsKK0lOU0VS VCBJTlRPIGl0ZW1zIFZBTFVFUyAoMSwgJ2FjdGl2ZScsIDEwKSwgKDIsICdpbmFjdGl2ZScsIDIw KTsKK0NSRUFURSBNQVRFUklBTElaRUQgVklFVyBtdl9hY3RpdmVfaXRlbXMgQVMKKyAgU0VMRUNU ICogRlJPTSBpdGVtcyBXSEVSRSBzdGF0dXMgPSAnYWN0aXZlJzsKK0NSRUFURSBVTklRVUUgSU5E RVggT04gbXZfYWN0aXZlX2l0ZW1zKGlkKTsKK1NFTEVDVCAqIEZST00gbXZfYWN0aXZlX2l0ZW1z IE9SREVSIEJZIGlkOworIGlkIHwgc3RhdHVzIHwgdmFsIAorLS0tLSstLS0tLS0tLSstLS0tLQor ICAxIHwgYWN0aXZlIHwgIDEwCisoMSByb3cpCisKKy0tIENhc2UgQTogUm93IGNoYW5nZXMgc3Rh dHVzIGFjdGl2ZSAtPiBpbmFjdGl2ZSAoc2hvdWxkIGJlIHJlbW92ZWQpCitVUERBVEUgaXRlbXMg U0VUIHN0YXR1cyA9ICdpbmFjdGl2ZScgV0hFUkUgaWQgPSAxOworLS0gQWxzbyB1cGRhdGUgcm93 IDIgdG8gYWN0aXZlIChzaG91bGQgYmUgYWRkZWQpCitVUERBVEUgaXRlbXMgU0VUIHN0YXR1cyA9 ICdhY3RpdmUnIFdIRVJFIGlkID0gMjsKKy0tIFJlZnJlc2ggcGFydGlhbCBXSEVSRSBpZD0xCist LSBTaG91bGQgcmVtb3ZlIGlkPTEgYmVjYXVzZSBpdCBubyBsb25nZXIgbWF0Y2hlcyB2aWV3IGRl ZmluaXRpb24KK1JFRlJFU0ggTUFURVJJQUxJWkVEIFZJRVcgbXZfYWN0aXZlX2l0ZW1zIFdIRVJF IGlkID0gMTsKK1NFTEVDVCAqIEZST00gbXZfYWN0aXZlX2l0ZW1zIE9SREVSIEJZIGlkOworIGlk IHwgc3RhdHVzIHwgdmFsIAorLS0tLSstLS0tLS0tLSstLS0tLQorKDAgcm93cykKKworLS0gQ2Fz ZSBCOiBSZWZyZXNoIHRvIGFkZCByb3cgMiAod2hpY2ggaXMgbm93IGFjdGl2ZSkKK1JFRlJFU0gg TUFURVJJQUxJWkVEIFZJRVcgbXZfYWN0aXZlX2l0ZW1zIFdIRVJFIGlkID0gMjsKK1NFTEVDVCAq IEZST00gbXZfYWN0aXZlX2l0ZW1zIE9SREVSIEJZIGlkOworIGlkIHwgc3RhdHVzIHwgdmFsIAor LS0tLSstLS0tLS0tLSstLS0tLQorICAyIHwgYWN0aXZlIHwgIDIwCisoMSByb3cpCisKKy0tIENs ZWFudXAKK0RST1AgTUFURVJJQUxJWkVEIFZJRVcgbXZfYWN0aXZlX2l0ZW1zOworRFJPUCBUQUJM RSBpdGVtczsKKy0tCistLSBUZXN0IDY6IE9yZGVyIG9mIE9wZXJhdGlvbnMgKFZhbHVlIFN3YXAp CistLSBBZGRyZXNzZWQgc3BlY2lmaWMgd29ycnk6ICJUaGUgb3JkZXIgb2YgdHVwbGUgcHJvY2Vz c2luZyBtYXR0ZXJzIgorLS0KK0NSRUFURSBUQUJMRSBtdl9zd2FwX2Jhc2UgKGlkIGludCBwcmlt YXJ5IGtleSwgY29kZSB0ZXh0KTsKK0lOU0VSVCBJTlRPIG12X3N3YXBfYmFzZSBWQUxVRVMgKDEs ICdBJyksICgyLCAnQicpOworQ1JFQVRFIE1BVEVSSUFMSVpFRCBWSUVXIG12X3N3YXAgQVMgU0VM RUNUICogRlJPTSBtdl9zd2FwX2Jhc2U7CitDUkVBVEUgVU5JUVVFIElOREVYIE9OIG12X3N3YXAo Y29kZSk7IC0tIFVuaXF1ZSBJbmRleCBpcyBvbiBjb2RlLCBub3QgSUQKK1NFTEVDVCAqIEZST00g bXZfc3dhcCBPUkRFUiBCWSBpZDsKKyBpZCB8IGNvZGUgCistLS0tKy0tLS0tLQorICAxIHwgQQor ICAyIHwgQgorKDIgcm93cykKKworLS0gUGVyZm9ybSBhIHN3YXAgaW4gdGhlIGJhc2UgdGFibGUK Ky0tIDEgYmVjb21lcyBCLCAyIGJlY29tZXMgQQorQkVHSU47CitVUERBVEUgbXZfc3dhcF9iYXNl IFNFVCBjb2RlID0gJ1RFTVAnIFdIRVJFIGlkID0gMTsKK1VQREFURSBtdl9zd2FwX2Jhc2UgU0VU IGNvZGUgPSAnQScgV0hFUkUgaWQgPSAyOworVVBEQVRFIG12X3N3YXBfYmFzZSBTRVQgY29kZSA9 ICdCJyBXSEVSRSBpZCA9IDE7CitDT01NSVQ7CistLSBSZWZyZXNoIGJvdGggcm93cyBjb25jdXJy ZW50bHkuCistLSBJZiB0aGUgaW1wbGVtZW50YXRpb24gaW5zZXJ0cyAoMSwgJ0InKSBiZWZvcmUg ZGVsZXRpbmcgKDIsICdCJyksIHRoaXMgd2lsbCBmYWlsLgorLS0gSXQgcmVsaWVzIG9uIHRoZSBp bXBsZW1lbnRhdGlvbiBjb3JyZWN0bHkgaGFuZGxpbmcgdGhlIERlbGV0ZS9Mb2NrIHNldCBiZWZv cmUgdGhlIEluc2VydC9VcHNlcnQuCitSRUZSRVNIIE1BVEVSSUFMSVpFRCBWSUVXIENPTkNVUlJF TlRMWSBtdl9zd2FwIFdIRVJFIGlkIElOICgxLCAyKTsKK1NFTEVDVCAqIEZST00gbXZfc3dhcCBP UkRFUiBCWSBpZDsKKyBpZCB8IGNvZGUgCistLS0tKy0tLS0tLQorICAxIHwgQgorICAyIHwgQQor KDIgcm93cykKKworRFJPUCBNQVRFUklBTElaRUQgVklFVyBtdl9zd2FwOworRFJPUCBUQUJMRSBt dl9zd2FwX2Jhc2U7CistLQorLS0gVGVzdCA3OiBTY29wZSBEcmlmdCAvIENvbnN0cmFpbnQgVmlv bGF0aW9uCistLSBBZGRyZXNzZWQgc3BlY2lmaWMgd29ycnk6ICJJZiBXSEVSRSBwcmVkaWNhdGUg d291bGQgYmUgZGlmZmVyZW50Li4uIFVLIHZpb2xhdGlvbiBjb3VsZG4ndCBiZSBzb2x2ZWQiCist LQorQ1JFQVRFIFRBQkxFIG12X2RyaWZ0X2Jhc2UgKGlkIGludCBwcmltYXJ5IGtleSwgY2F0ZWdv cnlfaWQgaW50KTsKK0lOU0VSVCBJTlRPIG12X2RyaWZ0X2Jhc2UgVkFMVUVTICgxLCAxMDApLCAo MiwgMjAwKTsKK0NSRUFURSBNQVRFUklBTElaRUQgVklFVyBtdl9kcmlmdCBBUyBTRUxFQ1QgKiBG Uk9NIG12X2RyaWZ0X2Jhc2U7CistLSBLRVkgRklYOiBJbmRleCBvbiBJRCwgbm90IENhdGVnb3J5 LgorLS0gV2Ugd2FudCB0byB0ZXN0IHRoYXQgdGhlIFJlZnJlc2ggbG9naWMgZGV0ZWN0cyBJRCBj b25mbGljdHMgd2hlbiByb3dzIGRyaWZ0IGludG8gc2NvcGUsCistLSBub3QgdGhhdCBQb3N0Z3Jl cyBlbmZvcmNlcyB1bmlxdWUgaW5kZXhlcyBvbiBub24tdW5pcXVlIGRhdGEuCitDUkVBVEUgVU5J UVVFIElOREVYIE9OIG12X2RyaWZ0KGlkKTsKKy0tIFVwZGF0ZSBSb3cgMSB0byBjb2xsaWRlIHdp dGggUm93IDIncyBjYXRlZ29yeQorVVBEQVRFIG12X2RyaWZ0X2Jhc2UgU0VUIGNhdGVnb3J5X2lk ID0gMjAwIFdIRVJFIGlkID0gMTsKKy0tIEF0dGVtcHQgdG8gcmVmcmVzaCB1c2luZyB0aGUgTkVX IGNhdGVnb3J5IHZhbHVlIGFzIHRoZSBmaWx0ZXIuCistLSBUaGUgVmlldyBzdGlsbCBjb250YWlu cyAoMSwgMTAwKS4KKy0tIFRoZSBGaWx0ZXIgImNhdGVnb3J5X2lkID0gMjAwIiBzZWVzIHRoZSBO RVcgcm93ICgxLCAyMDApIGluIHRoZSBiYXNlIHRhYmxlLgorLS0gVGhlIEZpbHRlciAiY2F0ZWdv cnlfaWQgPSAyMDAiIGRvZXMgTk9UIHNlZSB0aGUgT0xEIHJvdyAoMSwgMTAwKSBpbiB0aGUgVmll dy4KKy0tIFJlc3VsdDogVGhlIHN5c3RlbSB0aGlua3MgKDEsIDIwMCkgaXMgYSBicmFuZCBuZXcg cm93IGFuZCB0cmllcyB0byBJTlNFUlQgaXQuCistLSBUaGlzIE1VU1QgZmFpbCB3aXRoIGEgVW5p cXVlIENvbnN0cmFpbnQgVmlvbGF0aW9uIG9uICdpZCcgYmVjYXVzZSAoMSwgMTAwKSB3YXMgbmV2 ZXIgZGVsZXRlZC4KK1xzZXQgVkVSQk9TSVRZIHRlcnNlCitSRUZSRVNIIE1BVEVSSUFMSVpFRCBW SUVXIENPTkNVUlJFTlRMWSBtdl9kcmlmdCBXSEVSRSBjYXRlZ29yeV9pZCA9IDIwMDsKK0VSUk9S OiAgZHVwbGljYXRlIGtleSB2YWx1ZSB2aW9sYXRlcyB1bmlxdWUgY29uc3RyYWludCAibXZfZHJp ZnRfaWRfaWR4IgorXHNldCBWRVJCT1NJVFkgZGVmYXVsdAorLS0gQ29ycmVjdCB1c2FnZTogU2Nv cGUgbXVzdCBpbmNsdWRlIEJPVEggdGhlIE9sZCBsb2NhdGlvbiAoMTAwKSBhbmQgTmV3IGxvY2F0 aW9uICgyMDApCistLSBzbyB0aGUgc3lzdGVtIHNlZXMgdGhlIHVwZGF0ZSBhcyBhbiB1cGRhdGUg KG9yIGRlbGV0ZStpbnNlcnQpLgorUkVGUkVTSCBNQVRFUklBTElaRUQgVklFVyBDT05DVVJSRU5U TFkgbXZfZHJpZnQgV0hFUkUgY2F0ZWdvcnlfaWQgSU4gKDEwMCwgMjAwKTsKK1NFTEVDVCAqIEZS T00gbXZfZHJpZnQgT1JERVIgQlkgaWQ7CisgaWQgfCBjYXRlZ29yeV9pZCAKKy0tLS0rLS0tLS0t LS0tLS0tLQorICAxIHwgICAgICAgICAyMDAKKyAgMiB8ICAgICAgICAgMjAwCisoMiByb3dzKQor CitEUk9QIE1BVEVSSUFMSVpFRCBWSUVXIG12X2RyaWZ0OworRFJPUCBUQUJMRSBtdl9kcmlmdF9i YXNlOworLS0KKy0tIFRlc3QgODogTXVsdGlwbGUgVW5pcXVlIEtleXMKKy0tIEFkZHJlc3NlZCBz cGVjaWZpYyB3b3JyeTogIndoYXQgaWYgd2UgaGF2ZSBtdWx0aXBsZSBVS3M/IgorLS0KK0NSRUFU RSBUQUJMRSBtdl9tdWx0aV91ayAoaWQgaW50IHByaW1hcnkga2V5LCBlbWFpbCB0ZXh0LCB1c2Vy bmFtZSB0ZXh0KTsKK0lOU0VSVCBJTlRPIG12X211bHRpX3VrIFZBTFVFUyAoMSwgJ2FAZXhhbXBs ZS5jb20nLCAndXNlcl9hJyk7CitDUkVBVEUgTUFURVJJQUxJWkVEIFZJRVcgbXZfbXVsdGkgQVMg U0VMRUNUICogRlJPTSBtdl9tdWx0aV91azsKK0NSRUFURSBVTklRVUUgSU5ERVggT04gbXZfbXVs dGkoZW1haWwpOworQ1JFQVRFIFVOSVFVRSBJTkRFWCBPTiBtdl9tdWx0aSh1c2VybmFtZSk7Cist LSBVcGRhdGUgYWxsIGNvbHVtbnMKK1VQREFURSBtdl9tdWx0aV91ayBTRVQgZW1haWwgPSAnYkBl eGFtcGxlLmNvbScsIHVzZXJuYW1lID0gJ3VzZXJfYicgV0hFUkUgaWQgPSAxOworLS0gUmVmcmVz aCBzaG91bGQgc3VjY2VlZCB1cGRhdGluZyBhbGwgdW5pcXVlIGluZGV4ZXMKK1JFRlJFU0ggTUFU RVJJQUxJWkVEIFZJRVcgQ09OQ1VSUkVOVExZIG12X211bHRpIFdIRVJFIGlkID0gMTsKK1NFTEVD VCAqIEZST00gbXZfbXVsdGk7CisgaWQgfCAgICAgZW1haWwgICAgIHwgdXNlcm5hbWUgCistLS0t Ky0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tCisgIDEgfCBiQGV4YW1wbGUuY29tIHwgdXNlcl9i CisoMSByb3cpCisKK0RST1AgTUFURVJJQUxJWkVEIFZJRVcgbXZfbXVsdGk7CitEUk9QIFRBQkxF IG12X211bHRpX3VrOworLS0KKy0tIFRlc3QgOTogVHJpZ2dlci1iYXNlZCBBdXRvbWF0aWMgTWFp bnRlbmFuY2UKKy0tIFVzZSBDYXNlOiBBdXRvbWF0aW5nIHRoZSBwYXJ0aWFsIHJlZnJlc2ggdmlh IHRyaWdnZXJzIHVzaW5nIEFycmF5cy4KKy0tCitDUkVBVEUgVEFCTEUgbXZfdHJpZ2dlcl9iYXNl IChpZCBpbnQgcHJpbWFyeSBrZXksIHZhbCB0ZXh0KTsKK0NSRUFURSBNQVRFUklBTElaRUQgVklF VyBtdl90cmlnZ2VyX3ZpZXcgQVMgU0VMRUNUICogRlJPTSBtdl90cmlnZ2VyX2Jhc2U7CitDUkVB VEUgVU5JUVVFIElOREVYIE9OIG12X3RyaWdnZXJfdmlldyhpZCk7CistLSBDcmVhdGUgYSBtYWlu dGFpbmVyIGZ1bmN0aW9uCitDUkVBVEUgT1IgUkVQTEFDRSBGVU5DVElPTiBtYWludGFpbl9tdl90 cmlnZ2VyX3ZpZXcoKSBSRVRVUk5TIFRSSUdHRVIgQVMgJCQKK0JFR0lOCisgICAgSUYgKFRHX09Q IElOICgnSU5TRVJUJywgJ1VQREFURScpKSBUSEVOCisgICAgICAgIEVYRUNVVEUgJ1JFRlJFU0gg TUFURVJJQUxJWkVEIFZJRVcgbXZfdHJpZ2dlcl92aWV3IFdIRVJFIGlkID0gQU5ZKCQxKTsnCisg ICAgICAgICAgICBVU0lORyAoU0VMRUNUIGFycmF5X2FnZyhpZCkgRlJPTSBuZXdfdGFibGUpOwor ICAgIEVORCBJRjsKKworICAgIElGIChUR19PUCBJTiAoJ0RFTEVURScpKSBUSEVOCisgICAgICAg IEVYRUNVVEUgJ1JFRlJFU0ggTUFURVJJQUxJWkVEIFZJRVcgbXZfdHJpZ2dlcl92aWV3IFdIRVJF IGlkID0gQU5ZKCQxKTsnCisgICAgICAgICAgICBVU0lORyAoU0VMRUNUIGFycmF5X2FnZyhpZCkg RlJPTSBvbGRfdGFibGUpOworICAgIEVORCBJRjsKKworICAgIFJFVFVSTiBOVUxMOworRU5EOwor JCQgTEFOR1VBR0UgcGxwZ3NxbCBWT0xBVElMRTsKKy0tIFRyaWdnZXIgZm9yIEluc2VydAorQ1JF QVRFIFRSSUdHRVIgdF9yZWZyZXNoX212X2lucworICAgIEFGVEVSIElOU0VSVCBPTiBtdl90cmln Z2VyX2Jhc2UKKyAgICBSRUZFUkVOQ0lORyBORVcgVEFCTEUgQVMgbmV3X3RhYmxlCisgICAgRk9S IEVBQ0ggU1RBVEVNRU5UCitFWEVDVVRFIEZVTkNUSU9OIG1haW50YWluX212X3RyaWdnZXJfdmll dygpOworLS0gVHJpZ2dlciBmb3IgVXBkYXRlCitDUkVBVEUgVFJJR0dFUiB0X3JlZnJlc2hfbXZf dXBkCisgICAgQUZURVIgVVBEQVRFIE9OIG12X3RyaWdnZXJfYmFzZQorICAgIFJFRkVSRU5DSU5H IE5FVyBUQUJMRSBBUyBuZXdfdGFibGUKKyAgICBGT1IgRUFDSCBTVEFURU1FTlQKK0VYRUNVVEUg RlVOQ1RJT04gbWFpbnRhaW5fbXZfdHJpZ2dlcl92aWV3KCk7CistLSBUcmlnZ2VyIGZvciBEZWxl dGUKK0NSRUFURSBUUklHR0VSIHRfcmVmcmVzaF9tdl9kZWwKKyAgICBBRlRFUiBERUxFVEUgT04g bXZfdHJpZ2dlcl9iYXNlCisgICAgUkVGRVJFTkNJTkcgT0xEIFRBQkxFIEFTIG9sZF90YWJsZQor ICAgIEZPUiBFQUNIIFNUQVRFTUVOVAorRVhFQ1VURSBGVU5DVElPTiBtYWludGFpbl9tdl90cmln Z2VyX3ZpZXcoKTsKKy0tIDEuIFRlc3QgSW5zZXJ0CitJTlNFUlQgSU5UTyBtdl90cmlnZ2VyX2Jh c2UgVkFMVUVTICgxLCAnQXV0by1JbnNlcnQnKSwgKDIsICdBdXRvLUluc2VydCcpOworU0VMRUNU ICogRlJPTSBtdl90cmlnZ2VyX3ZpZXcgT1JERVIgQlkgaWQ7CisgaWQgfCAgICAgdmFsICAgICAK Ky0tLS0rLS0tLS0tLS0tLS0tLQorICAxIHwgQXV0by1JbnNlcnQKKyAgMiB8IEF1dG8tSW5zZXJ0 CisoMiByb3dzKQorCistLSAyLiBUZXN0IFVwZGF0ZQorVVBEQVRFIG12X3RyaWdnZXJfYmFzZSBT RVQgdmFsID0gJ0F1dG8tVXBkYXRlJyBXSEVSRSBpZCA9IDE7CitTRUxFQ1QgKiBGUk9NIG12X3Ry aWdnZXJfdmlldyBPUkRFUiBCWSBpZDsKKyBpZCB8ICAgICB2YWwgICAgIAorLS0tLSstLS0tLS0t LS0tLS0tCisgIDEgfCBBdXRvLVVwZGF0ZQorICAyIHwgQXV0by1JbnNlcnQKKygyIHJvd3MpCisK Ky0tIDMuIFRlc3QgRGVsZXRlCitERUxFVEUgRlJPTSBtdl90cmlnZ2VyX2Jhc2UgV0hFUkUgaWQg PSAyOworU0VMRUNUICogRlJPTSBtdl90cmlnZ2VyX3ZpZXcgT1JERVIgQlkgaWQ7CisgaWQgfCAg ICAgdmFsICAgICAKKy0tLS0rLS0tLS0tLS0tLS0tLQorICAxIHwgQXV0by1VcGRhdGUKKygxIHJv dykKKworLS0gNC4gVmVyaWZ5IFRyYW5zYWN0aW9uIElzb2xhdGlvbgorLS0gRW5zdXJlIHRoYXQg aWYgdGhlIG1haW4gdHJhbnNhY3Rpb24gcm9sbHMgYmFjaywgdGhlIFJlZnJlc2ggYWxzbyByb2xs cyBiYWNrCitCRUdJTjsKK0lOU0VSVCBJTlRPIG12X3RyaWdnZXJfYmFzZSBWQUxVRVMgKDk5LCAn Um9sbGJhY2snKTsKK1NFTEVDVCAqIEZST00gbXZfdHJpZ2dlcl92aWV3IFdIRVJFIGlkID0gOTk7 IC0tIFNob3VsZCBzZWUgaXQKKyBpZCB8ICAgdmFsICAgIAorLS0tLSstLS0tLS0tLS0tCisgOTkg fCBSb2xsYmFjaworKDEgcm93KQorCitST0xMQkFDSzsKK1NFTEVDVCAqIEZST00gbXZfdHJpZ2dl cl92aWV3IFdIRVJFIGlkID0gOTk7IC0tIFNob3VsZCBOT1Qgc2VlIGl0CisgaWQgfCB2YWwgCist LS0tKy0tLS0tCisoMCByb3dzKQorCistLSBDbGVhbnVwCitEUk9QIE1BVEVSSUFMSVpFRCBWSUVX IG12X3RyaWdnZXJfdmlldzsKK0RST1AgVEFCTEUgbXZfdHJpZ2dlcl9iYXNlOworRFJPUCBGVU5D VElPTiBtYWludGFpbl9tdl90cmlnZ2VyX3ZpZXcoKTsKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3Jl Z3Jlc3MvcGFyYWxsZWxfc2NoZWR1bGUgYi9zcmMvdGVzdC9yZWdyZXNzL3BhcmFsbGVsX3NjaGVk dWxlCmluZGV4IGNjMzY1MzkzYmI3Li43Mzg0NDJkOWEzMiAxMDA2NDQKLS0tIGEvc3JjL3Rlc3Qv cmVncmVzcy9wYXJhbGxlbF9zY2hlZHVsZQorKysgYi9zcmMvdGVzdC9yZWdyZXNzL3BhcmFsbGVs X3NjaGVkdWxlCkBAIC02OCw2ICs2OCwxMSBAQCB0ZXN0OiBzZWxlY3RfaW50byBzZWxlY3RfZGlz dGluY3Qgc2VsZWN0X2Rpc3RpbmN0X29uIHNlbGVjdF9pbXBsaWNpdCBzZWxlY3RfaGF2aQogIyAt LS0tLS0tLS0tCiB0ZXN0OiBicmluIGdpbiBnaXN0IHNwZ2lzdCBwcml2aWxlZ2VzIGluaXRfcHJp dnMgc2VjdXJpdHlfbGFiZWwgY29sbGF0ZSBtYXR2aWV3IGxvY2sgcmVwbGljYV9pZGVudGl0eSBy b3dzZWN1cml0eSBvYmplY3RfYWRkcmVzcyB0YWJsZXNhbXBsZSBncm91cGluZ3NldHMgZHJvcF9v cGVyYXRvciBwYXNzd29yZCBpZGVudGl0eSBnZW5lcmF0ZWRfc3RvcmVkIGpvaW5faGFzaAogCisj IC0tLS0tLS0tLS0KKyMgQWRkaXRpb25hbCBNYXQgVmlldyB0ZXN0cworIyAtLS0tLS0tLS0tCit0 ZXN0OiBtYXR2aWV3X3doZXJlCisKICMgLS0tLS0tLS0tLQogIyBBZGRpdGlvbmFsIEJSSU4gdGVz dHMKICMgLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVncmVzcy9zcWwvbWF0dmll d193aGVyZS5zcWwgYi9zcmMvdGVzdC9yZWdyZXNzL3NxbC9tYXR2aWV3X3doZXJlLnNxbApuZXcg ZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uYzNmYWNlZWQyN2QKLS0tIC9kZXYv bnVsbAorKysgYi9zcmMvdGVzdC9yZWdyZXNzL3NxbC9tYXR2aWV3X3doZXJlLnNxbApAQCAtMCww ICsxLDMwMiBAQAorLS0KKy0tIFJFRlJFU0ggTUFURVJJQUxJWkVEIFZJRVcgLi4uIFdIRVJFIC4u LgorLS0KKworLS0gU2V0dXAKK0NSRUFURSBUQUJMRSBtdl9iYXNlX2EgKGlkIGludCBwcmltYXJ5 IGtleSwgdmFsIHRleHQpOworSU5TRVJUIElOVE8gbXZfYmFzZV9hIFZBTFVFUyAoMSwgJ09uZScp LCAoMiwgJ1R3bycpLCAoMywgJ1RocmVlJyk7CisKK0NSRUFURSBNQVRFUklBTElaRUQgVklFVyBt dl90ZXN0X2EgQVMgU0VMRUNUICogRlJPTSBtdl9iYXNlX2E7CitDUkVBVEUgVU5JUVVFIElOREVY IE9OIG12X3Rlc3RfYShpZCk7CisKKy0tCistLSBUZXN0IDE6IFN5bnRheCBhbmQgRXJyb3IgaGFu ZGxpbmcKKy0tCisKKy0tIDEuMSBXSVRIIE5PIERBVEEgKyBXSEVSRSAtPiBFcnJvcgorUkVGUkVT SCBNQVRFUklBTElaRUQgVklFVyBtdl90ZXN0X2EgV0lUSCBOTyBEQVRBIFdIRVJFIGlkID0gMTsK KworLS0gMS4yIFVucG9wdWxhdGVkICsgV0hFUkUgLT4gRXJyb3IKK0NSRUFURSBNQVRFUklBTEla RUQgVklFVyBtdl91bnBvcCBBUyBTRUxFQ1QgKiBGUk9NIG12X2Jhc2VfYSBXSVRIIE5PIERBVEE7 CitSRUZSRVNIIE1BVEVSSUFMSVpFRCBWSUVXIG12X3VucG9wIFdIRVJFIGlkID0gMTsKK0RST1Ag TUFURVJJQUxJWkVEIFZJRVcgbXZfdW5wb3A7CisKKy0tIDEuMyBWb2xhdGlsZSBmdW5jdGlvbnMg LT4gRXJyb3IKK1JFRlJFU0ggTUFURVJJQUxJWkVEIFZJRVcgbXZfdGVzdF9hIFdIRVJFIHJhbmRv bSgpID4gMC41OworCistLSAxLjQgQWdncmVnYXRlcyAtPiBFcnJvcgorUkVGUkVTSCBNQVRFUklB TElaRUQgVklFVyBtdl90ZXN0X2EgV0hFUkUgY291bnQoKikgPiAwOworCistLQorLS0gVGVzdCAy OiBOb24tY29uY3VycmVudCBQYXJ0aWFsIFJlZnJlc2gKKy0tCisKKy0tIE1vZGlmeSBiYXNlIGRh dGEKK1VQREFURSBtdl9iYXNlX2EgU0VUIHZhbCA9ICdPbmUgVXBkYXRlZCcgV0hFUkUgaWQgPSAx OworVVBEQVRFIG12X2Jhc2VfYSBTRVQgdmFsID0gJ1R3byBVcGRhdGVkJyBXSEVSRSBpZCA9IDI7 CisKKy0tIFJlZnJlc2ggb25seSBpZD0xCitSRUZSRVNIIE1BVEVSSUFMSVpFRCBWSUVXIG12X3Rl c3RfYSBXSEVSRSBpZCA9IDE7CisKKy0tIFZlcmlmeTogaWQ9MSBzaG91bGQgYmUgdXBkYXRlZCwg aWQ9MiBzaG91bGQgcmVtYWluIHN0YWxlCitTRUxFQ1QgKiBGUk9NIG12X3Rlc3RfYSBPUkRFUiBC WSBpZDsKKworLS0gUmVmcmVzaCBpZD0yCitSRUZSRVNIIE1BVEVSSUFMSVpFRCBWSUVXIG12X3Rl c3RfYSBXSEVSRSBpZCA9IDI7CitTRUxFQ1QgKiBGUk9NIG12X3Rlc3RfYSBPUkRFUiBCWSBpZDsK KworLS0KKy0tIFRlc3QgMzogQ29uY3VycmVudCBQYXJ0aWFsIFJlZnJlc2gKKy0tCisKKy0tIE1v ZGlmeSBiYXNlIGRhdGEKK1VQREFURSBtdl9iYXNlX2EgU0VUIHZhbCA9ICdPbmUgQ29uY3VycmVu dCcgV0hFUkUgaWQgPSAxOworVVBEQVRFIG12X2Jhc2VfYSBTRVQgdmFsID0gJ1R3byBDb25jdXJy ZW50JyBXSEVSRSBpZCA9IDI7CisKKy0tIFJlZnJlc2ggb25seSBpZD0xCitSRUZSRVNIIE1BVEVS SUFMSVpFRCBWSUVXIENPTkNVUlJFTlRMWSBtdl90ZXN0X2EgV0hFUkUgaWQgPSAxOworCistLSBW ZXJpZnk6IGlkPTEgdXBkYXRlZCwgaWQ9MiBzdGFsZQorU0VMRUNUICogRlJPTSBtdl90ZXN0X2Eg T1JERVIgQlkgaWQ7CisKKy0tIFJlZnJlc2ggaWQ9MgorUkVGUkVTSCBNQVRFUklBTElaRUQgVklF VyBDT05DVVJSRU5UTFkgbXZfdGVzdF9hIFdIRVJFIGlkID0gMjsKK1NFTEVDVCAqIEZST00gbXZf dGVzdF9hIE9SREVSIEJZIGlkOworCistLSBDbGVhbnVwIFRlc3QgMi8zCitEUk9QIE1BVEVSSUFM SVpFRCBWSUVXIG12X3Rlc3RfYTsKK0RST1AgVEFCTEUgbXZfYmFzZV9hOworCistLQorLS0gVGVz dCA0OiBKb2luIFZpZXcgKEludm9pY2Ugc3R5bGUpCistLQorCitDUkVBVEUgVEFCTEUgaW52b2lj ZXMgKGlkIGludCBwcmltYXJ5IGtleSwgdG90YWwgbnVtZXJpYyk7CitDUkVBVEUgVEFCTEUgaW52 b2ljZV9pdGVtcyAoaW52X2lkIGludCByZWZlcmVuY2VzIGludm9pY2VzKGlkKSwgYW1vdW50IG51 bWVyaWMpOworCitJTlNFUlQgSU5UTyBpbnZvaWNlcyBWQUxVRVMgKDEsIDApLCAoMiwgMCk7CitJ TlNFUlQgSU5UTyBpbnZvaWNlX2l0ZW1zIFZBTFVFUyAoMSwgMTAwKSwgKDEsIDUwKSwgKDIsIDIw MCk7CisKK0NSRUFURSBNQVRFUklBTElaRUQgVklFVyBtdl9pbnZvaWNlcyBBUworICBTRUxFQ1Qg aS5pZCwgc3VtKGlpLmFtb3VudCkgYXMgY29tcHV0ZWRfdG90YWwKKyAgRlJPTSBpbnZvaWNlcyBp CisgIEpPSU4gaW52b2ljZV9pdGVtcyBpaSBPTiBpLmlkID0gaWkuaW52X2lkCisgIEdST1VQIEJZ IGkuaWQ7CisKK0NSRUFURSBVTklRVUUgSU5ERVggT04gbXZfaW52b2ljZXMoaWQpOworCitTRUxF Q1QgKiBGUk9NIG12X2ludm9pY2VzIE9SREVSIEJZIGlkOworCistLSBNb2RpZnkgaXRlbXMgZm9y IGludm9pY2UgMQorSU5TRVJUIElOVE8gaW52b2ljZV9pdGVtcyBWQUxVRVMgKDEsIDI1KTsKKy0t IE1vZGlmeSBpdGVtcyBmb3IgaW52b2ljZSAyCitJTlNFUlQgSU5UTyBpbnZvaWNlX2l0ZW1zIFZB TFVFUyAoMiwgNTApOworCistLSBSZWZyZXNoIG9ubHkgaW52b2ljZSAxCitSRUZSRVNIIE1BVEVS SUFMSVpFRCBWSUVXIG12X2ludm9pY2VzIFdIRVJFIGlkID0gMTsKKworLS0gVmVyaWZ5OiBJbnZv aWNlIDEgdXBkYXRlZCAoMTc1KSwgSW52b2ljZSAyIHN0YWxlICgyMDApCitTRUxFQ1QgKiBGUk9N IG12X2ludm9pY2VzIE9SREVSIEJZIGlkOworCistLSBSZWZyZXNoIGludm9pY2UgMiBjb25jdXJy ZW50bHkKK1JFRlJFU0ggTUFURVJJQUxJWkVEIFZJRVcgQ09OQ1VSUkVOVExZIG12X2ludm9pY2Vz IFdIRVJFIGlkID0gMjsKKy0tIFZlcmlmeTogSW52b2ljZSAyIHVwZGF0ZWQgKDI1MCkKK1NFTEVD VCAqIEZST00gbXZfaW52b2ljZXMgT1JERVIgQlkgaWQ7CisKK0RST1AgTUFURVJJQUxJWkVEIFZJ RVcgbXZfaW52b2ljZXM7CitEUk9QIFRBQkxFIGludm9pY2VfaXRlbXM7CitEUk9QIFRBQkxFIGlu dm9pY2VzOworCistLQorLS0gVGVzdCA1OiBSb3dzIGVudGVyaW5nL2xlYXZpbmcgdmlldyBzY29w ZQorLS0KKworQ1JFQVRFIFRBQkxFIGl0ZW1zIChpZCBpbnQsIHN0YXR1cyB0ZXh0LCB2YWwgaW50 KTsKK0lOU0VSVCBJTlRPIGl0ZW1zIFZBTFVFUyAoMSwgJ2FjdGl2ZScsIDEwKSwgKDIsICdpbmFj dGl2ZScsIDIwKTsKKworQ1JFQVRFIE1BVEVSSUFMSVpFRCBWSUVXIG12X2FjdGl2ZV9pdGVtcyBB UworICBTRUxFQ1QgKiBGUk9NIGl0ZW1zIFdIRVJFIHN0YXR1cyA9ICdhY3RpdmUnOworCitDUkVB VEUgVU5JUVVFIElOREVYIE9OIG12X2FjdGl2ZV9pdGVtcyhpZCk7CisKK1NFTEVDVCAqIEZST00g bXZfYWN0aXZlX2l0ZW1zIE9SREVSIEJZIGlkOworCistLSBDYXNlIEE6IFJvdyBjaGFuZ2VzIHN0 YXR1cyBhY3RpdmUgLT4gaW5hY3RpdmUgKHNob3VsZCBiZSByZW1vdmVkKQorVVBEQVRFIGl0ZW1z IFNFVCBzdGF0dXMgPSAnaW5hY3RpdmUnIFdIRVJFIGlkID0gMTsKKy0tIEFsc28gdXBkYXRlIHJv dyAyIHRvIGFjdGl2ZSAoc2hvdWxkIGJlIGFkZGVkKQorVVBEQVRFIGl0ZW1zIFNFVCBzdGF0dXMg PSAnYWN0aXZlJyBXSEVSRSBpZCA9IDI7CisKKy0tIFJlZnJlc2ggcGFydGlhbCBXSEVSRSBpZD0x CistLSBTaG91bGQgcmVtb3ZlIGlkPTEgYmVjYXVzZSBpdCBubyBsb25nZXIgbWF0Y2hlcyB2aWV3 IGRlZmluaXRpb24KK1JFRlJFU0ggTUFURVJJQUxJWkVEIFZJRVcgbXZfYWN0aXZlX2l0ZW1zIFdI RVJFIGlkID0gMTsKK1NFTEVDVCAqIEZST00gbXZfYWN0aXZlX2l0ZW1zIE9SREVSIEJZIGlkOwor CistLSBDYXNlIEI6IFJlZnJlc2ggdG8gYWRkIHJvdyAyICh3aGljaCBpcyBub3cgYWN0aXZlKQor UkVGUkVTSCBNQVRFUklBTElaRUQgVklFVyBtdl9hY3RpdmVfaXRlbXMgV0hFUkUgaWQgPSAyOwor U0VMRUNUICogRlJPTSBtdl9hY3RpdmVfaXRlbXMgT1JERVIgQlkgaWQ7CisKKy0tIENsZWFudXAK K0RST1AgTUFURVJJQUxJWkVEIFZJRVcgbXZfYWN0aXZlX2l0ZW1zOworRFJPUCBUQUJMRSBpdGVt czsKKworLS0KKy0tIFRlc3QgNjogT3JkZXIgb2YgT3BlcmF0aW9ucyAoVmFsdWUgU3dhcCkKKy0t IEFkZHJlc3NlZCBzcGVjaWZpYyB3b3JyeTogIlRoZSBvcmRlciBvZiB0dXBsZSBwcm9jZXNzaW5n IG1hdHRlcnMiCistLQorCitDUkVBVEUgVEFCTEUgbXZfc3dhcF9iYXNlIChpZCBpbnQgcHJpbWFy eSBrZXksIGNvZGUgdGV4dCk7CitJTlNFUlQgSU5UTyBtdl9zd2FwX2Jhc2UgVkFMVUVTICgxLCAn QScpLCAoMiwgJ0InKTsKKworQ1JFQVRFIE1BVEVSSUFMSVpFRCBWSUVXIG12X3N3YXAgQVMgU0VM RUNUICogRlJPTSBtdl9zd2FwX2Jhc2U7CitDUkVBVEUgVU5JUVVFIElOREVYIE9OIG12X3N3YXAo Y29kZSk7IC0tIFVuaXF1ZSBJbmRleCBpcyBvbiBjb2RlLCBub3QgSUQKKworU0VMRUNUICogRlJP TSBtdl9zd2FwIE9SREVSIEJZIGlkOworCistLSBQZXJmb3JtIGEgc3dhcCBpbiB0aGUgYmFzZSB0 YWJsZQorLS0gMSBiZWNvbWVzIEIsIDIgYmVjb21lcyBBCitCRUdJTjsKK1VQREFURSBtdl9zd2Fw X2Jhc2UgU0VUIGNvZGUgPSAnVEVNUCcgV0hFUkUgaWQgPSAxOworVVBEQVRFIG12X3N3YXBfYmFz ZSBTRVQgY29kZSA9ICdBJyBXSEVSRSBpZCA9IDI7CitVUERBVEUgbXZfc3dhcF9iYXNlIFNFVCBj b2RlID0gJ0InIFdIRVJFIGlkID0gMTsKK0NPTU1JVDsKKworLS0gUmVmcmVzaCBib3RoIHJvd3Mg Y29uY3VycmVudGx5LgorLS0gSWYgdGhlIGltcGxlbWVudGF0aW9uIGluc2VydHMgKDEsICdCJykg YmVmb3JlIGRlbGV0aW5nICgyLCAnQicpLCB0aGlzIHdpbGwgZmFpbC4KKy0tIEl0IHJlbGllcyBv biB0aGUgaW1wbGVtZW50YXRpb24gY29ycmVjdGx5IGhhbmRsaW5nIHRoZSBEZWxldGUvTG9jayBz ZXQgYmVmb3JlIHRoZSBJbnNlcnQvVXBzZXJ0LgorUkVGUkVTSCBNQVRFUklBTElaRUQgVklFVyBD T05DVVJSRU5UTFkgbXZfc3dhcCBXSEVSRSBpZCBJTiAoMSwgMik7CisKK1NFTEVDVCAqIEZST00g bXZfc3dhcCBPUkRFUiBCWSBpZDsKKworRFJPUCBNQVRFUklBTElaRUQgVklFVyBtdl9zd2FwOwor RFJPUCBUQUJMRSBtdl9zd2FwX2Jhc2U7CisKKy0tCistLSBUZXN0IDc6IFNjb3BlIERyaWZ0IC8g Q29uc3RyYWludCBWaW9sYXRpb24KKy0tIEFkZHJlc3NlZCBzcGVjaWZpYyB3b3JyeTogIklmIFdI RVJFIHByZWRpY2F0ZSB3b3VsZCBiZSBkaWZmZXJlbnQuLi4gVUsgdmlvbGF0aW9uIGNvdWxkbid0 IGJlIHNvbHZlZCIKKy0tCisKK0NSRUFURSBUQUJMRSBtdl9kcmlmdF9iYXNlIChpZCBpbnQgcHJp bWFyeSBrZXksIGNhdGVnb3J5X2lkIGludCk7CitJTlNFUlQgSU5UTyBtdl9kcmlmdF9iYXNlIFZB TFVFUyAoMSwgMTAwKSwgKDIsIDIwMCk7CisKK0NSRUFURSBNQVRFUklBTElaRUQgVklFVyBtdl9k cmlmdCBBUyBTRUxFQ1QgKiBGUk9NIG12X2RyaWZ0X2Jhc2U7CistLSBLRVkgRklYOiBJbmRleCBv biBJRCwgbm90IENhdGVnb3J5LgorLS0gV2Ugd2FudCB0byB0ZXN0IHRoYXQgdGhlIFJlZnJlc2gg bG9naWMgZGV0ZWN0cyBJRCBjb25mbGljdHMgd2hlbiByb3dzIGRyaWZ0IGludG8gc2NvcGUsCist LSBub3QgdGhhdCBQb3N0Z3JlcyBlbmZvcmNlcyB1bmlxdWUgaW5kZXhlcyBvbiBub24tdW5pcXVl IGRhdGEuCitDUkVBVEUgVU5JUVVFIElOREVYIE9OIG12X2RyaWZ0KGlkKTsKKworLS0gVXBkYXRl IFJvdyAxIHRvIGNvbGxpZGUgd2l0aCBSb3cgMidzIGNhdGVnb3J5CitVUERBVEUgbXZfZHJpZnRf YmFzZSBTRVQgY2F0ZWdvcnlfaWQgPSAyMDAgV0hFUkUgaWQgPSAxOworCistLSBBdHRlbXB0IHRv IHJlZnJlc2ggdXNpbmcgdGhlIE5FVyBjYXRlZ29yeSB2YWx1ZSBhcyB0aGUgZmlsdGVyLgorLS0g VGhlIFZpZXcgc3RpbGwgY29udGFpbnMgKDEsIDEwMCkuCistLSBUaGUgRmlsdGVyICJjYXRlZ29y eV9pZCA9IDIwMCIgc2VlcyB0aGUgTkVXIHJvdyAoMSwgMjAwKSBpbiB0aGUgYmFzZSB0YWJsZS4K Ky0tIFRoZSBGaWx0ZXIgImNhdGVnb3J5X2lkID0gMjAwIiBkb2VzIE5PVCBzZWUgdGhlIE9MRCBy b3cgKDEsIDEwMCkgaW4gdGhlIFZpZXcuCistLSBSZXN1bHQ6IFRoZSBzeXN0ZW0gdGhpbmtzICgx LCAyMDApIGlzIGEgYnJhbmQgbmV3IHJvdyBhbmQgdHJpZXMgdG8gSU5TRVJUIGl0LgorLS0gVGhp cyBNVVNUIGZhaWwgd2l0aCBhIFVuaXF1ZSBDb25zdHJhaW50IFZpb2xhdGlvbiBvbiAnaWQnIGJl Y2F1c2UgKDEsIDEwMCkgd2FzIG5ldmVyIGRlbGV0ZWQuCitcc2V0IFZFUkJPU0lUWSB0ZXJzZQor UkVGUkVTSCBNQVRFUklBTElaRUQgVklFVyBDT05DVVJSRU5UTFkgbXZfZHJpZnQgV0hFUkUgY2F0 ZWdvcnlfaWQgPSAyMDA7Citcc2V0IFZFUkJPU0lUWSBkZWZhdWx0CisKKy0tIENvcnJlY3QgdXNh Z2U6IFNjb3BlIG11c3QgaW5jbHVkZSBCT1RIIHRoZSBPbGQgbG9jYXRpb24gKDEwMCkgYW5kIE5l dyBsb2NhdGlvbiAoMjAwKQorLS0gc28gdGhlIHN5c3RlbSBzZWVzIHRoZSB1cGRhdGUgYXMgYW4g dXBkYXRlIChvciBkZWxldGUraW5zZXJ0KS4KK1JFRlJFU0ggTUFURVJJQUxJWkVEIFZJRVcgQ09O Q1VSUkVOVExZIG12X2RyaWZ0IFdIRVJFIGNhdGVnb3J5X2lkIElOICgxMDAsIDIwMCk7CisKK1NF TEVDVCAqIEZST00gbXZfZHJpZnQgT1JERVIgQlkgaWQ7CisKK0RST1AgTUFURVJJQUxJWkVEIFZJ RVcgbXZfZHJpZnQ7CitEUk9QIFRBQkxFIG12X2RyaWZ0X2Jhc2U7CisKKy0tCistLSBUZXN0IDg6 IE11bHRpcGxlIFVuaXF1ZSBLZXlzCistLSBBZGRyZXNzZWQgc3BlY2lmaWMgd29ycnk6ICJ3aGF0 IGlmIHdlIGhhdmUgbXVsdGlwbGUgVUtzPyIKKy0tCisKK0NSRUFURSBUQUJMRSBtdl9tdWx0aV91 ayAoaWQgaW50IHByaW1hcnkga2V5LCBlbWFpbCB0ZXh0LCB1c2VybmFtZSB0ZXh0KTsKK0lOU0VS VCBJTlRPIG12X211bHRpX3VrIFZBTFVFUyAoMSwgJ2FAZXhhbXBsZS5jb20nLCAndXNlcl9hJyk7 CisKK0NSRUFURSBNQVRFUklBTElaRUQgVklFVyBtdl9tdWx0aSBBUyBTRUxFQ1QgKiBGUk9NIG12 X211bHRpX3VrOworQ1JFQVRFIFVOSVFVRSBJTkRFWCBPTiBtdl9tdWx0aShlbWFpbCk7CitDUkVB VEUgVU5JUVVFIElOREVYIE9OIG12X211bHRpKHVzZXJuYW1lKTsKKworLS0gVXBkYXRlIGFsbCBj b2x1bW5zCitVUERBVEUgbXZfbXVsdGlfdWsgU0VUIGVtYWlsID0gJ2JAZXhhbXBsZS5jb20nLCB1 c2VybmFtZSA9ICd1c2VyX2InIFdIRVJFIGlkID0gMTsKKworLS0gUmVmcmVzaCBzaG91bGQgc3Vj Y2VlZCB1cGRhdGluZyBhbGwgdW5pcXVlIGluZGV4ZXMKK1JFRlJFU0ggTUFURVJJQUxJWkVEIFZJ RVcgQ09OQ1VSUkVOVExZIG12X211bHRpIFdIRVJFIGlkID0gMTsKKworU0VMRUNUICogRlJPTSBt dl9tdWx0aTsKKworRFJPUCBNQVRFUklBTElaRUQgVklFVyBtdl9tdWx0aTsKK0RST1AgVEFCTEUg bXZfbXVsdGlfdWs7CisKKy0tCistLSBUZXN0IDk6IFRyaWdnZXItYmFzZWQgQXV0b21hdGljIE1h aW50ZW5hbmNlCistLSBVc2UgQ2FzZTogQXV0b21hdGluZyB0aGUgcGFydGlhbCByZWZyZXNoIHZp YSB0cmlnZ2VycyB1c2luZyBBcnJheXMuCistLQorCitDUkVBVEUgVEFCTEUgbXZfdHJpZ2dlcl9i YXNlIChpZCBpbnQgcHJpbWFyeSBrZXksIHZhbCB0ZXh0KTsKK0NSRUFURSBNQVRFUklBTElaRUQg VklFVyBtdl90cmlnZ2VyX3ZpZXcgQVMgU0VMRUNUICogRlJPTSBtdl90cmlnZ2VyX2Jhc2U7CitD UkVBVEUgVU5JUVVFIElOREVYIE9OIG12X3RyaWdnZXJfdmlldyhpZCk7CisKKy0tIENyZWF0ZSBh IG1haW50YWluZXIgZnVuY3Rpb24KK0NSRUFURSBPUiBSRVBMQUNFIEZVTkNUSU9OIG1haW50YWlu X212X3RyaWdnZXJfdmlldygpIFJFVFVSTlMgVFJJR0dFUiBBUyAkJAorQkVHSU4KKyAgICBJRiAo VEdfT1AgSU4gKCdJTlNFUlQnLCAnVVBEQVRFJykpIFRIRU4KKyAgICAgICAgRVhFQ1VURSAnUkVG UkVTSCBNQVRFUklBTElaRUQgVklFVyBtdl90cmlnZ2VyX3ZpZXcgV0hFUkUgaWQgPSBBTlkoJDEp OycKKyAgICAgICAgICAgIFVTSU5HIChTRUxFQ1QgYXJyYXlfYWdnKGlkKSBGUk9NIG5ld190YWJs ZSk7CisgICAgRU5EIElGOworCisgICAgSUYgKFRHX09QIElOICgnREVMRVRFJykpIFRIRU4KKyAg ICAgICAgRVhFQ1VURSAnUkVGUkVTSCBNQVRFUklBTElaRUQgVklFVyBtdl90cmlnZ2VyX3ZpZXcg V0hFUkUgaWQgPSBBTlkoJDEpOycKKyAgICAgICAgICAgIFVTSU5HIChTRUxFQ1QgYXJyYXlfYWdn KGlkKSBGUk9NIG9sZF90YWJsZSk7CisgICAgRU5EIElGOworCisgICAgUkVUVVJOIE5VTEw7CitF TkQ7CiskJCBMQU5HVUFHRSBwbHBnc3FsIFZPTEFUSUxFOworCistLSBUcmlnZ2VyIGZvciBJbnNl cnQKK0NSRUFURSBUUklHR0VSIHRfcmVmcmVzaF9tdl9pbnMKKyAgICBBRlRFUiBJTlNFUlQgT04g bXZfdHJpZ2dlcl9iYXNlCisgICAgUkVGRVJFTkNJTkcgTkVXIFRBQkxFIEFTIG5ld190YWJsZQor ICAgIEZPUiBFQUNIIFNUQVRFTUVOVAorRVhFQ1VURSBGVU5DVElPTiBtYWludGFpbl9tdl90cmln Z2VyX3ZpZXcoKTsKKworLS0gVHJpZ2dlciBmb3IgVXBkYXRlCitDUkVBVEUgVFJJR0dFUiB0X3Jl ZnJlc2hfbXZfdXBkCisgICAgQUZURVIgVVBEQVRFIE9OIG12X3RyaWdnZXJfYmFzZQorICAgIFJF RkVSRU5DSU5HIE5FVyBUQUJMRSBBUyBuZXdfdGFibGUKKyAgICBGT1IgRUFDSCBTVEFURU1FTlQK K0VYRUNVVEUgRlVOQ1RJT04gbWFpbnRhaW5fbXZfdHJpZ2dlcl92aWV3KCk7CisKKy0tIFRyaWdn ZXIgZm9yIERlbGV0ZQorQ1JFQVRFIFRSSUdHRVIgdF9yZWZyZXNoX212X2RlbAorICAgIEFGVEVS IERFTEVURSBPTiBtdl90cmlnZ2VyX2Jhc2UKKyAgICBSRUZFUkVOQ0lORyBPTEQgVEFCTEUgQVMg b2xkX3RhYmxlCisgICAgRk9SIEVBQ0ggU1RBVEVNRU5UCitFWEVDVVRFIEZVTkNUSU9OIG1haW50 YWluX212X3RyaWdnZXJfdmlldygpOworCistLSAxLiBUZXN0IEluc2VydAorSU5TRVJUIElOVE8g bXZfdHJpZ2dlcl9iYXNlIFZBTFVFUyAoMSwgJ0F1dG8tSW5zZXJ0JyksICgyLCAnQXV0by1JbnNl cnQnKTsKK1NFTEVDVCAqIEZST00gbXZfdHJpZ2dlcl92aWV3IE9SREVSIEJZIGlkOworCistLSAy LiBUZXN0IFVwZGF0ZQorVVBEQVRFIG12X3RyaWdnZXJfYmFzZSBTRVQgdmFsID0gJ0F1dG8tVXBk YXRlJyBXSEVSRSBpZCA9IDE7CitTRUxFQ1QgKiBGUk9NIG12X3RyaWdnZXJfdmlldyBPUkRFUiBC WSBpZDsKKworLS0gMy4gVGVzdCBEZWxldGUKK0RFTEVURSBGUk9NIG12X3RyaWdnZXJfYmFzZSBX SEVSRSBpZCA9IDI7CitTRUxFQ1QgKiBGUk9NIG12X3RyaWdnZXJfdmlldyBPUkRFUiBCWSBpZDsK KworLS0gNC4gVmVyaWZ5IFRyYW5zYWN0aW9uIElzb2xhdGlvbgorLS0gRW5zdXJlIHRoYXQgaWYg dGhlIG1haW4gdHJhbnNhY3Rpb24gcm9sbHMgYmFjaywgdGhlIFJlZnJlc2ggYWxzbyByb2xscyBi YWNrCitCRUdJTjsKK0lOU0VSVCBJTlRPIG12X3RyaWdnZXJfYmFzZSBWQUxVRVMgKDk5LCAnUm9s bGJhY2snKTsKK1NFTEVDVCAqIEZST00gbXZfdHJpZ2dlcl92aWV3IFdIRVJFIGlkID0gOTk7IC0t IFNob3VsZCBzZWUgaXQKK1JPTExCQUNLOworU0VMRUNUICogRlJPTSBtdl90cmlnZ2VyX3ZpZXcg V0hFUkUgaWQgPSA5OTsgLS0gU2hvdWxkIE5PVCBzZWUgaXQKKworLS0gQ2xlYW51cAorRFJPUCBN QVRFUklBTElaRUQgVklFVyBtdl90cmlnZ2VyX3ZpZXc7CitEUk9QIFRBQkxFIG12X3RyaWdnZXJf YmFzZTsKK0RST1AgRlVOQ1RJT04gbWFpbnRhaW5fbXZfdHJpZ2dlcl92aWV3KCk7Ci0tIAoyLjM0 LjEKCg== --0000000000005c7deb064f0a690d--