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 1w5v56-003lEp-07 for pgsql-hackers@arkaria.postgresql.org; Fri, 27 Mar 2026 00:29:44 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1w5v53-006mNC-10 for pgsql-hackers@arkaria.postgresql.org; Fri, 27 Mar 2026 00:29:41 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1w5v52-006mN4-35 for pgsql-hackers@lists.postgresql.org; Fri, 27 Mar 2026 00:29:41 +0000 Received: from mail-ua1-x932.google.com ([2607:f8b0:4864:20::932]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1w5v50-00000001NsR-2A3S for pgsql-hackers@lists.postgresql.org; Fri, 27 Mar 2026 00:29:40 +0000 Received: by mail-ua1-x932.google.com with SMTP id a1e0cc1a2514c-94ac3958788so957978241.0 for ; Thu, 26 Mar 2026 17:29:38 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1774571377; cv=none; d=google.com; s=arc-20240605; b=K3rWLrAGXm8G16kmkFUQA6kHpXyrOXW9fdqdkmfQ0lK9ldB3+TYfR3ZvPwHSiN03US UbgXtoJsQn31ILf0ggnb1aePTZo5p63I1HBxrXgDuHR/u1A1MrP2Ywxa/K8b3E4FNezW E3KOvGJS7cyUXDvqz+VmGDuDXIGF9JamWZTwcnZft4jopOBmgCxKwR1z7HojySz/DrBv u82OlJb657APEt9VmlkFScPqb9uobdKlixqXXgbKZh71uyAARZZf2B9CoT9jYUM7dK5L CHFlyAJx9QlVP4ayF3y2ok1mBu5fUx5bRpxCEw+HHtlXRWoRl8z/ktboTsrX1i3XnCsq SYjA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=to:subject:message-id:date:from:mime-version:dkim-signature; bh=HZuNf048wc19rKtkO5lIhZ9DdWidErNyZcaWdt0f1Hw=; fh=dxJXJbLzq9Nah1LUdsj4QTuQ3JoDScd0wp1YHY64NXM=; b=KTPRNPrpuRPdiQg/GTbryqXKH7qL+o6SVyV5J+yVMKlNY9iDx4eYbUnan8vUbaodHY V8maDQ3Sjgk7FUXnoPdZL1e4b9j4g93+mUxUfvycWDuA0gfiWeYIDHL6MppFsyA2uFdm vb+qMmrohz1eJFSFHA+MTFC7qHmSUe9hXiiiHX//ts2aFE0oljypeh7s4T/wj3i/3Kyu VzzmEfWywYxnIlUy7KsoBPvOS3P4xIpW4HyyVr4ZZVnzMFRex9y2iOLYqCWiD6q970eZ vVqhNMj/0F8upjUHvECAMolW4NgZ4egE66WyRiimMvZxWkm/4Y6JO7HWquxpOd7lHrez PNnA==; 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=1774571377; x=1775176177; darn=lists.postgresql.org; h=to:subject:message-id:date:from:mime-version:from:to:cc:subject :date:message-id:reply-to; bh=HZuNf048wc19rKtkO5lIhZ9DdWidErNyZcaWdt0f1Hw=; b=ez+wGz1OQpiKDvBpAEHRBzUR75q5dbaJEM0CTQ6w/XHDqxS0fyEonsGkYnEKldXqF/ k2sTWW8Masbj98Gb2uucvA0E9/mQO8LoWuTKqT98Ecdft0wFv5jGKpv5ZW95IsHzNEWr llglybCMj0j9Jh+Ygcup9lAQdC9RKfwojZHNO2rsOO+Wgb6J/35x3lE9ELe7VoGFlBvY H+Wvzj0Y+Vt6nokw1KNVyUPL7Qtk8seWbgCbwJeJ1a7CjS4rxkZE6SaBfbRRfFuj+2aI UtE0GeFSc2p9065IirBwExg1uwjrJt2gJSGh6j8//A8ML0HqASohX/9n3/Rm4OLVS3Hc MJlw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774571377; x=1775176177; h=to:subject:message-id:date:from:mime-version:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=HZuNf048wc19rKtkO5lIhZ9DdWidErNyZcaWdt0f1Hw=; b=WlEK+LsfKR22FCe9orclmpzmmAnGemrTFPUzu3ip5SyePsCA4bWJLSt0YPijUTOJPD agvgmzmawMUtFvGKDvsXJZhEhh1LN3b6iqm+q+xT9USJ0d/FzEt9ijU1bhOiWwy8DFx+ eLXIyVwpKFTiX7hsaYgKzzPW/Br1ALOb51+vfmxfawJzQq5ysH18VTtZtEfAVwYrMLAa 5inW6tzvl78F5+YqxhyMcefVE52C4dq+iV6YAi5PKaAPK/sPtqvgckF3r84aVbDca4VL YnXIJGwnccRLFlYwb0BvHblssgyDx6C6jmPKMnOQZqMHqhPWq//5t14XOC6xsvtWYU4f +EeQ== X-Gm-Message-State: AOJu0YxBW6KWiixO7X0mXSzbcfx2Nsvh9azrvjw+IxMgo261E0Jms5k0 fab/XrDwPUqOiz8sK9aD032GhEKYoFn4+c1vUtf4zbL9W4D65Dr+9q38LbfiJ/1rDTayFh0W2eG nophldqApvfcer6J49/okFjbTI6CG8AZpMecW X-Gm-Gg: ATEYQzycVCB5iW0V5oIkOSITA2HPFuuv0ISMvzg3Fa/v0Elz0tSuTIwQQb+mc06NSlh LqtX0rKWIScdf2eYIhQomJTYhgtl2z6aU2Wad5g+LCDVtwtBo7iauYTW9Toi4nXBwUpY4/KDXHh nFJHJm0l2N/YgkmYJ3y1upRWIsTCTpHd7NjMRHy2eIOO3bLrFu33NibW2NljV8p8TWR2MVc3ogi BSMwr9x979GD4Vopxy8Zg/EN8z2Geajjoor9Ty3cUFHzBW+jK+gYdwYFkCjd7QkbUbNLOKGRGtW iPiOuRZAtG7TNUvLKx3ocwSCGO1saerEe7Za6g== X-Received: by 2002:a05:6102:5087:b0:600:3b3e:681a with SMTP id ada2fe7eead31-604e4d73978mr1442978137.14.1774571376646; Thu, 26 Mar 2026 17:29:36 -0700 (PDT) MIME-Version: 1.0 From: SATYANARAYANA NARLAPURAM Date: Thu, 26 Mar 2026 17:29:25 -0700 X-Gm-Features: AQROBzA1GADj4GUUPGqiNhFKXKWhGCG4gPy8eM07NDlYckiZU41CK0oX8Yb3lAA Message-ID: Subject: =?UTF-8?Q?=5BProposal=5D_pg=5Fstat=5Fwal=5Frecords_=E2=80=93_per=2Drecord=2Dtype_W?= =?UTF-8?Q?AL_generation_statistics?= To: PostgreSQL Hackers Content-Type: multipart/mixed; boundary="00000000000088c4f3064df6985d" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --00000000000088c4f3064df6985d Content-Type: multipart/alternative; boundary="00000000000088c4f2064df6985b" --00000000000088c4f2064df6985b Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Hi Hackers, I'd like to propose a new system view, pg_stat_wal_records, that exposes per-resource-manager, per-record-type WAL generation counts. *Sample Output:* postgres=3D# SELECT * FROM pg_stat_wal_records ORDER BY count DESC LIMIT 10= ; resource_manager | record_type | count | stats_reset ------------------+----------------+--------+------------------------------= - Heap | INSERT | 500000 | 2026-03-26 22:15:00.12345+00 Transaction | COMMIT | 500000 | Btree | INSERT_LEAF | 53821 | Heap | HOT_UPDATE | 12744 | XLOG | FPI | 8923 | *The Gap:* Postgre already has pg_stat_wal for aggregate WAL volume (bytes, full-page images, buffers), and pg_walinspect (superuser access required) for post-hoc forensic analysis of individual WAL segments. But I don't see a lightweight, observability tool that answers in real time which record types are responsible for the WAL. Additionally, pg_walinspect runs against on-disk WAL files, which is expensive. This view will be useful for monitoring systems to poll cheaply. *Use cases:* WAL volume investigation: see which record types dominate WAL generation in real time without touching disk. Monitoring integration: Prometheus/Grafana can poll the view to track WAL composition over time and alert on anomalies. Replication tuning: identify whether WAL volume is dominated by data changes, index maintenance, FPIs, or vacuum activity to guide tuning. Extension debugging: custom WAL resource managers get visibility automatically. *Key design decisions* *Counting mechanism:* The counting mechanism is a single backend-local array increment in XLogInsert(): pgstat_pending_wal_records[rmid][(info >> 4) & 0x0F]++; This indexes into a uint64[256][16] array (32 KB per backend) using the rmgr ID and the 4-bit record-type subfield of the WAL info byte. Counters are flushed to shared memory via the standard pgstat infrastructure. I am using per-backend pending array instead of direct shared-memory writes. The counter is incremented in backend-local memory and flushed to shared memory by the existing pgstat flush cycle. Don't expect to see any contention in the hot path (please see perf results below). Fixed 256=C3=9716 matrix. All 256 possible rmgr IDs =C3=97 16 possible reco= rd types. This accommodates core resource managers and any custom WAL resource managers from extensions without configuration. The 32 KB per-backend cost is modest. Uses rm_identify() for human-readable names. The SRF calls each resource manager's rm_identify callback to translate the info byte into a readable record type name (for example INSERT, COMMIT, VACUUM, HOT_UPDATE). Added the reset functionality via pg_stat_reset_shared('wal_records'), consistent with the existing pattern for wal, bgwriter, archiver, etc. View skips zero-count entries, keeping output clean. *Performance overhead* Benchmarked with pgbench (scale 50, 16 clients, 16 threads, 30s, synchronous_commit=3Doff) on 64 vCPU machine with data and WAL on NVMe: *Configuration Avg TPS* With patch 42,266 Without patch 42,053 The overhead is within measurement noise (~0.5%). The increment hits a backend-local, L1-hot array and is dwarfed by XLogInsert's existing CRC, locking, and memcpy work. Attached a draft patch, please share your thoughts. Thanks, Satya --00000000000088c4f2064df6985b Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
Hi Hackers,

I'd like to propose a n= ew system view, pg_stat_wal_records, that exposes per-resource-manager, per= -record-type WAL generation counts.

Sample Outp= ut:
postgres=3D# SELECT * FROM pg_stat_wal_records ORDER BY count DE= SC LIMIT 10;
=C2=A0resource_manager | =C2=A0record_type =C2=A0 | count = =C2=A0| =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0stats_reset
------------------= +----------------+--------+-------------------------------
=C2=A0Heap = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 | INSERT =C2=A0 =C2=A0 =C2=A0 =C2= =A0 | 500000 | 2026-03-26 22:15:00.12345+00
=C2=A0Transaction =C2=A0 =C2= =A0 =C2=A0| COMMIT =C2=A0 =C2=A0 =C2=A0 =C2=A0 | 500000 |
=C2=A0Btree = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0| INSERT_LEAF =C2=A0 =C2=A0| =C2= =A053821 |
=C2=A0Heap =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 | HOT_UP= DATE =C2=A0 =C2=A0 | =C2=A012744 |
=C2=A0XLOG =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 | FPI =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0| =C2=A0 8= 923 |

The Gap:

Postgre alread= y has pg_stat_wal for aggregate WAL volume (bytes, full-page images, buffer= s), and pg_walinspect (superuser access required) for post-hoc forensic ana= lysis of individual WAL segments. But I don't see a lightweight, observ= ability tool that answers in real time which record types are responsible f= or the WAL. Additionally, pg_walinspect runs against on-disk WAL files, whi= ch is expensive. This view will be useful for monitoring systems to poll ch= eaply.

Use cases:
WAL volume investi= gation: see which record types dominate WAL generation in real time without= touching disk.
Monitoring integration: Prometheus/Grafana can poll the = view to track WAL composition over time and alert on anomalies.
Replicat= ion tuning: identify whether WAL volume is dominated by data changes, index= maintenance, FPIs, or vacuum activity to guide tuning.
Extension debugg= ing: custom WAL resource managers get visibility automatically.
<= br>
Key design decisions
Counting mechani= sm:
The counting mechanism is a single backend-local array in= crement in XLogInsert():
pgstat_pending_wal_records[rmid][(info >>= 4) & 0x0F]++;

This indexes into a uint64[256][16] array (32 KB = per backend) using the rmgr ID and the 4-bit record-type subfield of the WA= L info byte. Counters are flushed to shared memory via the standard pgstat = infrastructure.
I am using per-backend pending array instead of direct s= hared-memory writes. The counter is incremented in backend-local memory and= flushed to shared memory by the existing pgstat flush cycle. Don't exp= ect to see any contention in the hot path (please see perf results below).<= br>Fixed 256=C3=9716 matrix. All 256 possible rmgr IDs =C3=97 16 possible r= ecord types. This accommodates core resource managers and any custom WAL re= source managers from extensions without configuration. The 32 KB per-backen= d cost is modest. Uses rm_identify() for human-readable names. The SRF call= s each resource manager's rm_identify callback to translate the info by= te into a readable record type name (for example INSERT, COMMIT, VACUUM, HO= T_UPDATE). Added the reset functionality=C2=A0via pg_stat_reset_shared('= ;wal_records'), consistent with the existing pattern for wal, bgwriter,= archiver, etc.
View skips zero-count entries, keeping output clean.
=
Performance overhead
Benchmarked with pgbench (sca= le 50, 16 clients, 16 threads, 30s, synchronous_commit=3Doff) on 64 vCPU ma= chine with data and WAL on NVMe:

Configuration Avg TPS
Wit= h patch 42,266
Without patch 42,053
The overhead is within measuremen= t noise (~0.5%). The increment hits a backend-local, L1-hot array and is dw= arfed by XLogInsert's existing CRC, locking, and memcpy work.

Attached a draft patch, please share your thoughts.


Thanks,
Satya
--00000000000088c4f2064df6985b-- --00000000000088c4f3064df6985d Content-Type: application/octet-stream; name="v1-0001-pg-stat-wal-records.patch" Content-Disposition: attachment; filename="v1-0001-pg-stat-wal-records.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mn85rae10 ZGlmZiAtLWdpdCBhL2RvYy9zcmMvc2dtbC9tb25pdG9yaW5nLnNnbWwgYi9kb2Mvc3JjL3NnbWwv bW9uaXRvcmluZy5zZ21sCmluZGV4IGJiNzVlZDEuLmM4ZGQyNTcgMTAwNjQ0Ci0tLSBhL2RvYy9z cmMvc2dtbC9tb25pdG9yaW5nLnNnbWwKKysrIGIvZG9jL3NyYy9zZ21sL21vbml0b3Jpbmcuc2dt bApAQCAtNTUxLDYgKzU1MSwxNSBAQCBwb3N0Z3JlcyAgIDI3MDkzICAwLjAgIDAuMCAgMzAwOTYg IDI3NTIgPyAgICAgICAgU3MgICAxMTozNCAgIDA6MDAgcG9zdGdyZXM6IHNlcgogICAgICAgPC9l bnRyeT4KICAgICAgPC9yb3c+CiAKKyAgICAgPHJvdz4KKyAgICAgIDxlbnRyeT48c3RydWN0bmFt ZT5wZ19zdGF0X3dhbF9yZWNvcmRzPC9zdHJ1Y3RuYW1lPjxpbmRleHRlcm0+PHByaW1hcnk+cGdf c3RhdF93YWxfcmVjb3JkczwvcHJpbWFyeT48L2luZGV4dGVybT48L2VudHJ5PgorICAgICAgPGVu dHJ5Pk9uZSByb3cgcGVyIFdBTCByZWNvcmQgdHlwZSwgc2hvd2luZyBob3cgbWFueSBXQUwgcmVj b3JkcyBvZgorICAgICAgIGVhY2ggdHlwZSBoYXZlIGJlZW4gZ2VuZXJhdGVkLiBTZWUKKyAgICAg ICA8bGluayBsaW5rZW5kPSJtb25pdG9yaW5nLXBnLXN0YXQtd2FsLXJlY29yZHMtdmlldyI+Cisg ICAgICAgPHN0cnVjdG5hbWU+cGdfc3RhdF93YWxfcmVjb3Jkczwvc3RydWN0bmFtZT48L2xpbms+ IGZvciBkZXRhaWxzLgorICAgICAgPC9lbnRyeT4KKyAgICAgPC9yb3c+CisKICAgICAgPCEtLSBh bGwgInN0YXQiIGZvciBzY2hlbWEgb2JqZWN0cywgYnkgImltcG9ydGFuY2UiIC0tPgogCiAgICAg IDxyb3c+CkBAIC0zNjg5LDYgKzM2OTgsOTIgQEAgZGVzY3JpcHRpb24gfCBXYWl0aW5nIGZvciBh IG5ld2x5IGluaXRpYWxpemVkIFdBTCBmaWxlIHRvIHJlYWNoIGR1cmFibGUgc3RvcmFnZQogCiA8 L3NlY3QyPgogCisgPHNlY3QyIGlkPSJtb25pdG9yaW5nLXBnLXN0YXQtd2FsLXJlY29yZHMtdmll dyI+CisgIDx0aXRsZT48c3RydWN0bmFtZT5wZ19zdGF0X3dhbF9yZWNvcmRzPC9zdHJ1Y3RuYW1l PjwvdGl0bGU+CisKKyAgPGluZGV4dGVybT4KKyAgIDxwcmltYXJ5PnBnX3N0YXRfd2FsX3JlY29y ZHM8L3ByaW1hcnk+CisgIDwvaW5kZXh0ZXJtPgorCisgIDxwYXJhPgorICAgVGhlIDxzdHJ1Y3Ru YW1lPnBnX3N0YXRfd2FsX3JlY29yZHM8L3N0cnVjdG5hbWU+IHZpZXcgY29udGFpbnMgb25lIHJv dworICAgZm9yIGVhY2ggV0FMIHJlY29yZCB0eXBlIHRoYXQgaGFzIGJlZW4gZ2VuZXJhdGVkIHNp bmNlIHRoZSBsYXN0IHN0YXRpc3RpY3MKKyAgIHJlc2V0LiAgSXQgcHJvdmlkZXMgYSBicmVha2Rv d24gb2YgV0FMIGdlbmVyYXRpb24gYnkgcmVzb3VyY2UgbWFuYWdlciBhbmQKKyAgIHJlY29yZCB0 eXBlLCB3aGljaCBjYW4gYmUgdXNlZCB0byBpZGVudGlmeSB3aGljaCBvcGVyYXRpb25zIGFyZQor ICAgcmVzcG9uc2libGUgZm9yIFdBTCB2b2x1bWUuICBSZWNvcmQgdHlwZXMgd2l0aCBhIGNvdW50 IG9mIHplcm8gYXJlIG9taXR0ZWQuCisgIDwvcGFyYT4KKworICA8cGFyYT4KKyAgIFVubGlrZSA8 c3RydWN0bmFtZT5wZ19zdGF0X3dhbDwvc3RydWN0bmFtZT4sIHdoaWNoIHByb3ZpZGVzIGFnZ3Jl Z2F0ZQorICAgdG90YWxzLCB0aGlzIHZpZXcgc2hvd3MgdGhlIGNvbXBvc2l0aW9uIG9mIFdBTCB0 cmFmZmljLiAgVW5saWtlCisgICA8ZnVuY3Rpb24+cGdfZ2V0X3dhbF9zdGF0cygpPC9mdW5jdGlv bj4gZnJvbQorICAgPHhyZWYgbGlua2VuZD0icGd3YWxpbnNwZWN0Ii8+LCB0aGlzIHZpZXcgdHJh Y2tzIGxpdmUgY3VtdWxhdGl2ZQorICAgY291bnRlcnMgd2l0aG91dCBuZWVkaW5nIHRvIHJlYWQg V0FMIGZpbGVzIGZyb20gZGlzay4KKyAgPC9wYXJhPgorCisgIDx0YWJsZSBpZD0icGctc3RhdC13 YWwtcmVjb3Jkcy12aWV3IiB4cmVmbGFiZWw9InBnX3N0YXRfd2FsX3JlY29yZHMiPgorICAgPHRp dGxlPjxzdHJ1Y3RuYW1lPnBnX3N0YXRfd2FsX3JlY29yZHM8L3N0cnVjdG5hbWU+IFZpZXc8L3Rp dGxlPgorICAgPHRncm91cCBjb2xzPSIxIj4KKyAgICA8dGhlYWQ+CisgICAgIDxyb3c+CisgICAg ICA8ZW50cnkgcm9sZT0iY2F0YWxvZ190YWJsZV9lbnRyeSI+PHBhcmEgcm9sZT0iY29sdW1uX2Rl ZmluaXRpb24iPgorICAgICAgIENvbHVtbiBUeXBlCisgICAgICA8L3BhcmE+CisgICAgICA8cGFy YT4KKyAgICAgICBEZXNjcmlwdGlvbgorICAgICAgPC9wYXJhPjwvZW50cnk+CisgICAgIDwvcm93 PgorICAgIDwvdGhlYWQ+CisKKyAgICA8dGJvZHk+CisgICAgIDxyb3c+CisgICAgICA8ZW50cnkg cm9sZT0iY2F0YWxvZ190YWJsZV9lbnRyeSI+PHBhcmEgcm9sZT0iY29sdW1uX2RlZmluaXRpb24i PgorICAgICAgIDxzdHJ1Y3RmaWVsZD5yZXNvdXJjZV9tYW5hZ2VyPC9zdHJ1Y3RmaWVsZD4gPHR5 cGU+dGV4dDwvdHlwZT4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgIE5hbWUg b2YgdGhlIFdBTCByZXNvdXJjZSBtYW5hZ2VyIChlLmcuCisgICAgICAgPGxpdGVyYWw+SGVhcDwv bGl0ZXJhbD4sIDxsaXRlcmFsPkJ0cmVlPC9saXRlcmFsPiwKKyAgICAgICA8bGl0ZXJhbD5UcmFu c2FjdGlvbjwvbGl0ZXJhbD4sIDxsaXRlcmFsPlhMT0c8L2xpdGVyYWw+KS4KKyAgICAgIDwvcGFy YT48L2VudHJ5PgorICAgICA8L3Jvdz4KKworICAgICA8cm93PgorICAgICAgPGVudHJ5IHJvbGU9 ImNhdGFsb2dfdGFibGVfZW50cnkiPjxwYXJhIHJvbGU9ImNvbHVtbl9kZWZpbml0aW9uIj4KKyAg ICAgICA8c3RydWN0ZmllbGQ+cmVjb3JkX3R5cGU8L3N0cnVjdGZpZWxkPiA8dHlwZT50ZXh0PC90 eXBlPgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgTmFtZSBvZiB0aGUgV0FM IHJlY29yZCB0eXBlIHdpdGhpbiB0aGUgcmVzb3VyY2UgbWFuYWdlciAoZS5nLgorICAgICAgIDxs aXRlcmFsPklOU0VSVDwvbGl0ZXJhbD4sIDxsaXRlcmFsPkhPVF9VUERBVEU8L2xpdGVyYWw+LAor ICAgICAgIDxsaXRlcmFsPkNPTU1JVDwvbGl0ZXJhbD4sIDxsaXRlcmFsPklOU0VSVF9MRUFGPC9s aXRlcmFsPikuCisgICAgICAgVGhlc2UgbmFtZXMgYXJlIHByb3ZpZGVkIGJ5IGVhY2ggcmVzb3Vy Y2UgbWFuYWdlcidzCisgICAgICAgPGZ1bmN0aW9uPnJtX2lkZW50aWZ5PC9mdW5jdGlvbj4gY2Fs bGJhY2suCisgICAgICA8L3BhcmE+PC9lbnRyeT4KKyAgICAgPC9yb3c+CisKKyAgICAgPHJvdz4K KyAgICAgIDxlbnRyeSByb2xlPSJjYXRhbG9nX3RhYmxlX2VudHJ5Ij48cGFyYSByb2xlPSJjb2x1 bW5fZGVmaW5pdGlvbiI+CisgICAgICAgPHN0cnVjdGZpZWxkPmNvdW50PC9zdHJ1Y3RmaWVsZD4g PHR5cGU+YmlnaW50PC90eXBlPgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAg TnVtYmVyIG9mIFdBTCByZWNvcmRzIG9mIHRoaXMgdHlwZSBnZW5lcmF0ZWQgc2luY2UgdGhlIGxh c3QKKyAgICAgICBzdGF0aXN0aWNzIHJlc2V0LgorICAgICAgPC9wYXJhPjwvZW50cnk+CisgICAg IDwvcm93PgorCisgICAgIDxyb3c+CisgICAgICA8ZW50cnkgcm9sZT0iY2F0YWxvZ190YWJsZV9l bnRyeSI+PHBhcmEgcm9sZT0iY29sdW1uX2RlZmluaXRpb24iPgorICAgICAgIDxzdHJ1Y3RmaWVs ZD5zdGF0c19yZXNldDwvc3RydWN0ZmllbGQ+IDx0eXBlPnRpbWVzdGFtcCB3aXRoIHRpbWUgem9u ZTwvdHlwZT4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgIFRpbWUgYXQgd2hp Y2ggV0FMIHJlY29yZCBzdGF0aXN0aWNzIHdlcmUgbGFzdCByZXNldC4KKyAgICAgIDwvcGFyYT48 L2VudHJ5PgorICAgICA8L3Jvdz4KKyAgICA8L3Rib2R5PgorICAgPC90Z3JvdXA+CisgIDwvdGFi bGU+CisKKyA8L3NlY3QyPgorCiAgPHNlY3QyIGlkPSJtb25pdG9yaW5nLXBnLXN0YXQtZGF0YWJh c2UtdmlldyI+CiAgIDx0aXRsZT48c3RydWN0bmFtZT5wZ19zdGF0X2RhdGFiYXNlPC9zdHJ1Y3Ru YW1lPjwvdGl0bGU+CiAKQEAgLTU1MDAsNiArNTU5NSwxMiBAQCBkZXNjcmlwdGlvbiB8IFdhaXRp bmcgZm9yIGEgbmV3bHkgaW5pdGlhbGl6ZWQgV0FMIGZpbGUgdG8gcmVhY2ggZHVyYWJsZSBzdG9y YWdlCiAgICAgICAgICAgPHN0cnVjdG5hbWU+cGdfc3RhdF93YWw8L3N0cnVjdG5hbWU+IHZpZXcu CiAgICAgICAgICA8L3BhcmE+CiAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgIDxsaXN0aXRl bT4KKyAgICAgICAgIDxwYXJhPgorICAgICAgICAgIDxsaXRlcmFsPndhbF9yZWNvcmRzPC9saXRl cmFsPjogUmVzZXQgYWxsIHRoZSBjb3VudGVycyBzaG93biBpbiB0aGUKKyAgICAgICAgICA8c3Ry dWN0bmFtZT5wZ19zdGF0X3dhbF9yZWNvcmRzPC9zdHJ1Y3RuYW1lPiB2aWV3LgorICAgICAgICAg PC9wYXJhPgorICAgICAgICA8L2xpc3RpdGVtPgogICAgICAgICA8bGlzdGl0ZW0+CiAgICAgICAg ICA8cGFyYT4KICAgICAgICAgICA8bGl0ZXJhbD5OVUxMPC9saXRlcmFsPiBvciBub3Qgc3BlY2lm aWVkOiBBbGwgdGhlIGNvdW50ZXJzIGZyb20gdGhlCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9h Y2Nlc3MvdHJhbnNhbS94bG9naW5zZXJ0LmMgYi9zcmMvYmFja2VuZC9hY2Nlc3MvdHJhbnNhbS94 bG9naW5zZXJ0LmMKaW5kZXggZTRhODE5ZS4uZjI1NTZmNSAxMDA2NDQKLS0tIGEvc3JjL2JhY2tl bmQvYWNjZXNzL3RyYW5zYW0veGxvZ2luc2VydC5jCisrKyBiL3NyYy9iYWNrZW5kL2FjY2Vzcy90 cmFuc2FtL3hsb2dpbnNlcnQuYwpAQCAtMzYsNiArMzYsNyBAQAogI2luY2x1ZGUgImV4ZWN1dG9y L2luc3RydW1lbnQuaCIKICNpbmNsdWRlICJtaXNjYWRtaW4uaCIKICNpbmNsdWRlICJwZ190cmFj ZS5oIgorI2luY2x1ZGUgInBnc3RhdC5oIgogI2luY2x1ZGUgInJlcGxpY2F0aW9uL29yaWdpbi5o IgogI2luY2x1ZGUgInN0b3JhZ2UvYnVmbWdyLmgiCiAjaW5jbHVkZSAic3RvcmFnZS9wcm9jLmgi CkBAIC01MzEsNiArNTMyLDggQEAgWExvZ0luc2VydChSbWdySWQgcm1pZCwgdWludDggaW5mbykK IAkJCQkJCQkJICBmcGlfYnl0ZXMsIHRvcHhpZF9pbmNsdWRlZCk7CiAJfSB3aGlsZSAoIVhMb2dS ZWNQdHJJc1ZhbGlkKEVuZFBvcykpOwogCisJcGdzdGF0X2NvdW50X3dhbF9yZWNvcmQocm1pZCwg aW5mbyk7CisKIAlYTG9nUmVzZXRJbnNlcnRpb24oKTsKIAogCXJldHVybiBFbmRQb3M7CmRpZmYg LS1naXQgYS9zcmMvYmFja2VuZC9jYXRhbG9nL3N5c3RlbV92aWV3cy5zcWwgYi9zcmMvYmFja2Vu ZC9jYXRhbG9nL3N5c3RlbV92aWV3cy5zcWwKaW5kZXggZTU0MDE4MC4uYThiN2Q1YyAxMDA2NDQK LS0tIGEvc3JjL2JhY2tlbmQvY2F0YWxvZy9zeXN0ZW1fdmlld3Muc3FsCisrKyBiL3NyYy9iYWNr ZW5kL2NhdGFsb2cvc3lzdGVtX3ZpZXdzLnNxbApAQCAtMTI3NCw2ICsxMjc0LDE0IEBAIENSRUFU RSBWSUVXIHBnX3N0YXRfd2FsIEFTCiAgICAgICAgIHcuc3RhdHNfcmVzZXQKICAgICBGUk9NIHBn X3N0YXRfZ2V0X3dhbCgpIHc7CiAKK0NSRUFURSBWSUVXIHBnX3N0YXRfd2FsX3JlY29yZHMgQVMK KyAgICBTRUxFQ1QKKyAgICAgICAgdy5yZXNvdXJjZV9tYW5hZ2VyLAorICAgICAgICB3LnJlY29y ZF90eXBlLAorICAgICAgICB3LmNvdW50LAorICAgICAgICB3LnN0YXRzX3Jlc2V0CisgICAgRlJP TSBwZ19zdGF0X2dldF93YWxfcmVjb3JkcygpIHc7CisKIENSRUFURSBWSUVXIHBnX3N0YXRfcHJv Z3Jlc3NfYW5hbHl6ZSBBUwogICAgIFNFTEVDVAogICAgICAgICBTLnBpZCBBUyBwaWQsIFMuZGF0 aWQgQVMgZGF0aWQsIEQuZGF0bmFtZSBBUyBkYXRuYW1lLApkaWZmIC0tZ2l0IGEvc3JjL2JhY2tl bmQvdXRpbHMvYWN0aXZpdHkvbWVzb24uYnVpbGQgYi9zcmMvYmFja2VuZC91dGlscy9hY3Rpdml0 eS9tZXNvbi5idWlsZAppbmRleCAxYWE3ZWNlLi4yM2M2YzZjIDEwMDY0NAotLS0gYS9zcmMvYmFj a2VuZC91dGlscy9hY3Rpdml0eS9tZXNvbi5idWlsZAorKysgYi9zcmMvYmFja2VuZC91dGlscy9h Y3Rpdml0eS9tZXNvbi5idWlsZApAQCAtMTgsNiArMTgsNyBAQCBiYWNrZW5kX3NvdXJjZXMgKz0g ZmlsZXMoCiAgICdwZ3N0YXRfc2xydS5jJywKICAgJ3Bnc3RhdF9zdWJzY3JpcHRpb24uYycsCiAg ICdwZ3N0YXRfd2FsLmMnLAorICAncGdzdGF0X3dhbHJlY29yZHMuYycsCiAgICdwZ3N0YXRfeGFj dC5jJywKICkKIApkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvdXRpbHMvYWN0aXZpdHkvcGdzdGF0 LmMgYi9zcmMvYmFja2VuZC91dGlscy9hY3Rpdml0eS9wZ3N0YXQuYwppbmRleCBlYjhjY2JhLi5k ZGU0MWI4IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC91dGlscy9hY3Rpdml0eS9wZ3N0YXQuYwor KysgYi9zcmMvYmFja2VuZC91dGlscy9hY3Rpdml0eS9wZ3N0YXQuYwpAQCAtNTAwLDYgKzUwMCwy MyBAQCBzdGF0aWMgY29uc3QgUGdTdGF0X0tpbmRJbmZvIHBnc3RhdF9raW5kX2J1aWx0aW5faW5m b3NbUEdTVEFUX0tJTkRfQlVJTFRJTl9TSVpFXQogCQkucmVzZXRfYWxsX2NiID0gcGdzdGF0X3dh bF9yZXNldF9hbGxfY2IsCiAJCS5zbmFwc2hvdF9jYiA9IHBnc3RhdF93YWxfc25hcHNob3RfY2Is CiAJfSwKKworCVtQR1NUQVRfS0lORF9XQUxfUkVDT1JEU10gPSB7CisJCS5uYW1lID0gIndhbF9y ZWNvcmRzIiwKKworCQkuZml4ZWRfYW1vdW50ID0gdHJ1ZSwKKwkJLndyaXRlX3RvX2ZpbGUgPSB0 cnVlLAorCisJCS5zbmFwc2hvdF9jdGxfb2ZmID0gb2Zmc2V0b2YoUGdTdGF0X1NuYXBzaG90LCB3 YWxfcmVjb3JkcyksCisJCS5zaGFyZWRfY3RsX29mZiA9IG9mZnNldG9mKFBnU3RhdF9TaG1lbUNv bnRyb2wsIHdhbF9yZWNvcmRzKSwKKwkJLnNoYXJlZF9kYXRhX29mZiA9IG9mZnNldG9mKFBnU3Rh dFNoYXJlZF9XYWxSZWNvcmRzLCBzdGF0cyksCisJCS5zaGFyZWRfZGF0YV9sZW4gPSBzaXplb2Yo KChQZ1N0YXRTaGFyZWRfV2FsUmVjb3JkcyAqKSAwKS0+c3RhdHMpLAorCisJCS5mbHVzaF9zdGF0 aWNfY2IgPSBwZ3N0YXRfd2FscmVjb3Jkc19mbHVzaF9jYiwKKwkJLmluaXRfc2htZW1fY2IgPSBw Z3N0YXRfd2FscmVjb3Jkc19pbml0X3NobWVtX2NiLAorCQkucmVzZXRfYWxsX2NiID0gcGdzdGF0 X3dhbHJlY29yZHNfcmVzZXRfYWxsX2NiLAorCQkuc25hcHNob3RfY2IgPSBwZ3N0YXRfd2FscmVj b3Jkc19zbmFwc2hvdF9jYiwKKwl9LAogfTsKIAogLyoKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5k L3V0aWxzL2FkdC9wZ3N0YXRmdW5jcy5jIGIvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L3Bnc3RhdGZ1 bmNzLmMKaW5kZXggOTE4NWE4ZS4uNDk5NTFkMyAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvdXRp bHMvYWR0L3Bnc3RhdGZ1bmNzLmMKKysrIGIvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L3Bnc3RhdGZ1 bmNzLmMKQEAgLTE2LDYgKzE2LDcgQEAKIAogI2luY2x1ZGUgImFjY2Vzcy9odHVwX2RldGFpbHMu aCIKICNpbmNsdWRlICJhY2Nlc3MveGxvZy5oIgorI2luY2x1ZGUgImFjY2Vzcy94bG9nX2ludGVy bmFsLmgiCiAjaW5jbHVkZSAiYWNjZXNzL3hsb2dwcmVmZXRjaGVyLmgiCiAjaW5jbHVkZSAiY2F0 YWxvZy9jYXRhbG9nLmgiCiAjaW5jbHVkZSAiY2F0YWxvZy9wZ19hdXRoaWQuaCIKQEAgLTE3NDEs NiArMTc0Miw3NSBAQCBwZ19zdGF0X2dldF93YWwoUEdfRlVOQ1RJT05fQVJHUykKIAkJCQkJCQkJ CXdhbF9zdGF0cy0+c3RhdF9yZXNldF90aW1lc3RhbXApKTsKIH0KIAorLyoKKyAqIFJldHVybnMg cGVyLXJlc291cmNlLW1hbmFnZXIgV0FMIHJlY29yZCB0eXBlIHN0YXRpc3RpY3MuCisgKi8KK0Rh dHVtCitwZ19zdGF0X2dldF93YWxfcmVjb3JkcyhQR19GVU5DVElPTl9BUkdTKQoreworI2RlZmlu ZSBQR19TVEFUX0dFVF9XQUxfUkVDT1JEU19DT0xTCTQKKwlSZXR1cm5TZXRJbmZvICpyc2luZm87 CisJUGdTdGF0X1dhbFJlY29yZFN0YXRzICpzdGF0czsKKworCUluaXRNYXRlcmlhbGl6ZWRTUkYo ZmNpbmZvLCAwKTsKKwlyc2luZm8gPSAoUmV0dXJuU2V0SW5mbyAqKSBmY2luZm8tPnJlc3VsdGlu Zm87CisKKwlzdGF0cyA9IHBnc3RhdF9mZXRjaF9zdGF0X3dhbF9yZWNvcmRzKCk7CisKKwlmb3Ig KGludCBybWlkID0gMDsgcm1pZCA8IFBHU1RBVF9OVU1fV0FMX1JNR1JTOyBybWlkKyspCisJewor CQljb25zdCBjaGFyICpybV9uYW1lOworCisJCS8qIFNraXAgcmVzb3VyY2UgbWFuYWdlcnMgdGhh dCBkb24ndCBleGlzdCAqLworCQlpZiAoIVJtZ3JJZEV4aXN0cygoUm1ncklkKSBybWlkKSkKKwkJ CWNvbnRpbnVlOworCisJCXJtX25hbWUgPSBSbWdyVGFibGVbcm1pZF0ucm1fbmFtZTsKKworCQlm b3IgKGludCBpbmZvX2lkeCA9IDA7IGluZm9faWR4IDwgUEdTVEFUX05VTV9XQUxfUkVDX1RZUEVT OyBpbmZvX2lkeCsrKQorCQl7CisJCQlEYXR1bQkJdmFsdWVzW1BHX1NUQVRfR0VUX1dBTF9SRUNP UkRTX0NPTFNdID0gezB9OworCQkJYm9vbAkJbnVsbHNbUEdfU1RBVF9HRVRfV0FMX1JFQ09SRFNf Q09MU10gPSB7MH07CisJCQljb25zdCBjaGFyICpyZWNvcmRfdHlwZSA9IE5VTEw7CisJCQljaGFy CQlyZWNvcmRfdHlwZV9idWZbMzJdOworCisJCQkvKiBTa2lwIGVudHJpZXMgd2l0aCBubyByZWNv cmRlZCBhY3Rpdml0eSAqLworCQkJaWYgKHN0YXRzLT5jb3VudHNbcm1pZF1baW5mb19pZHhdID09 IDApCisJCQkJY29udGludWU7CisKKwkJCS8qIFJlc291cmNlIG1hbmFnZXIgbmFtZSAqLworCQkJ dmFsdWVzWzBdID0gQ1N0cmluZ0dldFRleHREYXR1bShybV9uYW1lKTsKKworCQkJLyogUmVjb3Jk IHR5cGUgbmFtZSBmcm9tIHJtX2lkZW50aWZ5LCB3aXRoIG51bWVyaWMgZmFsbGJhY2sgKi8KKwkJ CWlmIChSbWdyVGFibGVbcm1pZF0ucm1faWRlbnRpZnkpCisJCQkJcmVjb3JkX3R5cGUgPSBSbWdy VGFibGVbcm1pZF0ucm1faWRlbnRpZnkoKHVpbnQ4KSAoaW5mb19pZHggPDwgNCkpOworCisJCQlp ZiAocmVjb3JkX3R5cGUpCisJCQkJdmFsdWVzWzFdID0gQ1N0cmluZ0dldFRleHREYXR1bShyZWNv cmRfdHlwZSk7CisJCQllbHNlCisJCQl7CisJCQkJc25wcmludGYocmVjb3JkX3R5cGVfYnVmLCBz aXplb2YocmVjb3JkX3R5cGVfYnVmKSwKKwkJCQkJCSAiMHglMDJYIiwgaW5mb19pZHggPDwgNCk7 CisJCQkJdmFsdWVzWzFdID0gQ1N0cmluZ0dldFRleHREYXR1bShyZWNvcmRfdHlwZV9idWYpOwor CQkJfQorCisJCQkvKiBDb3VudCAqLworCQkJdmFsdWVzWzJdID0gSW50NjRHZXREYXR1bShzdGF0 cy0+Y291bnRzW3JtaWRdW2luZm9faWR4XSk7CisKKwkJCS8qIFN0YXRzIHJlc2V0IHRpbWVzdGFt cCAqLworCQkJaWYgKHN0YXRzLT5zdGF0X3Jlc2V0X3RpbWVzdGFtcCAhPSAwKQorCQkJCXZhbHVl c1szXSA9IFRpbWVzdGFtcFR6R2V0RGF0dW0oc3RhdHMtPnN0YXRfcmVzZXRfdGltZXN0YW1wKTsK KwkJCWVsc2UKKwkJCQludWxsc1szXSA9IHRydWU7CisKKwkJCXR1cGxlc3RvcmVfcHV0dmFsdWVz KHJzaW5mby0+c2V0UmVzdWx0LCByc2luZm8tPnNldERlc2MsCisJCQkJCQkJCXZhbHVlcywgbnVs bHMpOworCQl9CisJfQorCisJcmV0dXJuIChEYXR1bSkgMDsKK30KKwogRGF0dW0KIHBnX3N0YXRf Z2V0X2xvY2soUEdfRlVOQ1RJT05fQVJHUykKIHsKQEAgLTE5NjUsNiArMjAzNSw3IEBAIHBnX3N0 YXRfcmVzZXRfc2hhcmVkKFBHX0ZVTkNUSU9OX0FSR1MpCiAJCVhMb2dQcmVmZXRjaFJlc2V0U3Rh dHMoKTsKIAkJcGdzdGF0X3Jlc2V0X29mX2tpbmQoUEdTVEFUX0tJTkRfU0xSVSk7CiAJCXBnc3Rh dF9yZXNldF9vZl9raW5kKFBHU1RBVF9LSU5EX1dBTCk7CisJCXBnc3RhdF9yZXNldF9vZl9raW5k KFBHU1RBVF9LSU5EX1dBTF9SRUNPUkRTKTsKIAogCQlQR19SRVRVUk5fVk9JRCgpOwogCX0KQEAg LTE5ODcsMTEgKzIwNTgsMTMgQEAgcGdfc3RhdF9yZXNldF9zaGFyZWQoUEdfRlVOQ1RJT05fQVJH UykKIAkJcGdzdGF0X3Jlc2V0X29mX2tpbmQoUEdTVEFUX0tJTkRfU0xSVSk7CiAJZWxzZSBpZiAo c3RyY21wKHRhcmdldCwgIndhbCIpID09IDApCiAJCXBnc3RhdF9yZXNldF9vZl9raW5kKFBHU1RB VF9LSU5EX1dBTCk7CisJZWxzZSBpZiAoc3RyY21wKHRhcmdldCwgIndhbF9yZWNvcmRzIikgPT0g MCkKKwkJcGdzdGF0X3Jlc2V0X29mX2tpbmQoUEdTVEFUX0tJTkRfV0FMX1JFQ09SRFMpOwogCWVs c2UKIAkJZXJlcG9ydChFUlJPUiwKIAkJCQkoZXJyY29kZShFUlJDT0RFX0lOVkFMSURfUEFSQU1F VEVSX1ZBTFVFKSwKIAkJCQkgZXJybXNnKCJ1bnJlY29nbml6ZWQgcmVzZXQgdGFyZ2V0OiBcIiVz XCIiLCB0YXJnZXQpLAotCQkJCSBlcnJoaW50KCJUYXJnZXQgbXVzdCBiZSBcImFyY2hpdmVyXCIs IFwiYmd3cml0ZXJcIiwgXCJjaGVja3BvaW50ZXJcIiwgXCJpb1wiLCBcInJlY292ZXJ5X3ByZWZl dGNoXCIsIFwic2xydVwiLCBvciBcIndhbFwiLiIpKSk7CisJCQkJIGVycmhpbnQoIlRhcmdldCBt dXN0IGJlIFwiYXJjaGl2ZXJcIiwgXCJiZ3dyaXRlclwiLCBcImNoZWNrcG9pbnRlclwiLCBcImlv XCIsIFwicmVjb3ZlcnlfcHJlZmV0Y2hcIiwgXCJzbHJ1XCIsIFwid2FsXCIsIG9yIFwid2FsX3Jl Y29yZHNcIi4iKSkpOwogCiAJUEdfUkVUVVJOX1ZPSUQoKTsKIH0KZGlmZiAtLWdpdCBhL3NyYy9p bmNsdWRlL2NhdGFsb2cvcGdfcHJvYy5kYXQgYi9zcmMvaW5jbHVkZS9jYXRhbG9nL3BnX3Byb2Mu ZGF0CmluZGV4IDAxMThlOTcuLmVjYzlmYjIgMTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL2NhdGFs b2cvcGdfcHJvYy5kYXQKKysrIGIvc3JjL2luY2x1ZGUvY2F0YWxvZy9wZ19wcm9jLmRhdApAQCAt NjA3OSw2ICs2MDc5LDE1IEBACiAgIHByb2FyZ21vZGVzID0+ICd7aSxvLG8sbyxvLG8sb30nLAog ICBwcm9hcmduYW1lcyA9PiAne2JhY2tlbmRfcGlkLHdhbF9yZWNvcmRzLHdhbF9mcGksd2FsX2J5 dGVzLHdhbF9mcGlfYnl0ZXMsd2FsX2J1ZmZlcnNfZnVsbCxzdGF0c19yZXNldH0nLAogICBwcm9z cmMgPT4gJ3BnX3N0YXRfZ2V0X2JhY2tlbmRfd2FsJyB9LAoreyBvaWQgPT4gJzYnLAorICBkZXNj ciA9PiAnc3RhdGlzdGljczogcGVyLXJlc291cmNlLW1hbmFnZXIgV0FMIHJlY29yZCB0eXBlIGNv dW50cycsCisgIHByb25hbWUgPT4gJ3BnX3N0YXRfZ2V0X3dhbF9yZWNvcmRzJywgcHJvcm93cyA9 PiAnMTAwJywgcHJvaXNzdHJpY3QgPT4gJ2YnLAorICBwcm9yZXRzZXQgPT4gJ3QnLCBwcm92b2xh dGlsZSA9PiAncycsIHByb3BhcmFsbGVsID0+ICdyJywKKyAgcHJvcmV0dHlwZSA9PiAncmVjb3Jk JywgcHJvYXJndHlwZXMgPT4gJycsCisgIHByb2FsbGFyZ3R5cGVzID0+ICd7dGV4dCx0ZXh0LGlu dDgsdGltZXN0YW1wdHp9JywKKyAgcHJvYXJnbW9kZXMgPT4gJ3tvLG8sbyxvfScsCisgIHByb2Fy Z25hbWVzID0+ICd7cmVzb3VyY2VfbWFuYWdlcixyZWNvcmRfdHlwZSxjb3VudCxzdGF0c19yZXNl dH0nLAorICBwcm9zcmMgPT4gJ3BnX3N0YXRfZ2V0X3dhbF9yZWNvcmRzJyB9LAogeyBvaWQgPT4g JzYyNDgnLCBkZXNjciA9PiAnc3RhdGlzdGljczogaW5mb3JtYXRpb24gYWJvdXQgV0FMIHByZWZl dGNoaW5nJywKICAgcHJvbmFtZSA9PiAncGdfc3RhdF9nZXRfcmVjb3ZlcnlfcHJlZmV0Y2gnLCBw cm9yb3dzID0+ICcxJywgcHJvcmV0c2V0ID0+ICd0JywKICAgcHJvdm9sYXRpbGUgPT4gJ3YnLCBw cm9yZXR0eXBlID0+ICdyZWNvcmQnLCBwcm9hcmd0eXBlcyA9PiAnJywKZGlmZiAtLWdpdCBhL3Ny Yy9pbmNsdWRlL3Bnc3RhdC5oIGIvc3JjL2luY2x1ZGUvcGdzdGF0LmgKaW5kZXggOGUzNTQ5Yy4u MTVhMWQ2MyAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvcGdzdGF0LmgKKysrIGIvc3JjL2luY2x1 ZGUvcGdzdGF0LmgKQEAgLTUxNCw2ICs1MTQsMjMgQEAgdHlwZWRlZiBzdHJ1Y3QgUGdTdGF0X1dh bFN0YXRzCiAJVGltZXN0YW1wVHogc3RhdF9yZXNldF90aW1lc3RhbXA7CiB9IFBnU3RhdF9XYWxT dGF0czsKIAorLyoKKyAqIE51bWJlciBvZiBXQUwgcmVzb3VyY2UgbWFuYWdlcnMgKG11c3QgbWF0 Y2ggUk1fTl9JRFMgZnJvbSBybWdyLmgpIGFuZAorICogcmVjb3JkIGluZm8gdHlwZXMgcGVyIHJl c291cmNlIG1hbmFnZXIgKHRvcCA0IGJpdHMgb2YgaW5mbyBieXRlKS4KKyAqLworI2RlZmluZSBQ R1NUQVRfTlVNX1dBTF9STUdSUwkJMjU2CisjZGVmaW5lIFBHU1RBVF9OVU1fV0FMX1JFQ19UWVBF UwkxNgorCisvKiAtLS0tLS0tCisgKiBQZ1N0YXRfV2FsUmVjb3JkU3RhdHMJCVBlci1yZXNvdXJj ZS1tYW5hZ2VyIFdBTCByZWNvcmQgdHlwZSBjb3VudHMKKyAqIC0tLS0tLS0KKyAqLwordHlwZWRl ZiBzdHJ1Y3QgUGdTdGF0X1dhbFJlY29yZFN0YXRzCit7CisJUGdTdGF0X0NvdW50ZXIgY291bnRz W1BHU1RBVF9OVU1fV0FMX1JNR1JTXVtQR1NUQVRfTlVNX1dBTF9SRUNfVFlQRVNdOworCVRpbWVz dGFtcFR6IHN0YXRfcmVzZXRfdGltZXN0YW1wOworfSBQZ1N0YXRfV2FsUmVjb3JkU3RhdHM7CisK IC8qIC0tLS0tLS0KICAqIFBnU3RhdF9CYWNrZW5kCQlCYWNrZW5kIHN0YXRpc3RpY3MKICAqIC0t LS0tLS0KQEAgLTgzNCw2ICs4NTEsMjQgQEAgZXh0ZXJuIHZvaWQgcGdzdGF0X3JlcG9ydF93YWwo Ym9vbCBmb3JjZSk7CiBleHRlcm4gUGdTdGF0X1dhbFN0YXRzICpwZ3N0YXRfZmV0Y2hfc3RhdF93 YWwodm9pZCk7CiAKIAorLyoKKyAqIEZ1bmN0aW9ucyBpbiBwZ3N0YXRfd2FscmVjb3Jkcy5jCisg Ki8KKworZXh0ZXJuIFBnU3RhdF9XYWxSZWNvcmRTdGF0cyAqcGdzdGF0X2ZldGNoX3N0YXRfd2Fs X3JlY29yZHModm9pZCk7CisKKy8qCisgKiBWYXJpYWJsZXMgaW4gcGdzdGF0X3dhbHJlY29yZHMu YworICovCisKK2V4dGVybiBQR0RMTElNUE9SVCBQZ1N0YXRfQ291bnRlciBwZ3N0YXRfcGVuZGlu Z193YWxfcmVjb3Jkc1tQR1NUQVRfTlVNX1dBTF9STUdSU11bUEdTVEFUX05VTV9XQUxfUkVDX1RZ UEVTXTsKKworI2RlZmluZSBwZ3N0YXRfY291bnRfd2FsX3JlY29yZChybWlkLCBpbmZvKSBcCisJ ZG8geyBcCisJCXBnc3RhdF9wZW5kaW5nX3dhbF9yZWNvcmRzWyhybWlkKV1bKChpbmZvKSA+PiA0 KSAmIDB4MEZdKys7IFwKKwl9IHdoaWxlICgwKQorCisKIC8qCiAgKiBWYXJpYWJsZXMgaW4gcGdz dGF0LmMKICAqLwpkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvdXRpbHMvcGdzdGF0X2ludGVybmFs LmggYi9zcmMvaW5jbHVkZS91dGlscy9wZ3N0YXRfaW50ZXJuYWwuaAppbmRleCA5NzcwNDQyLi4w NjBhNDRhIDEwMDY0NAotLS0gYS9zcmMvaW5jbHVkZS91dGlscy9wZ3N0YXRfaW50ZXJuYWwuaAor KysgYi9zcmMvaW5jbHVkZS91dGlscy9wZ3N0YXRfaW50ZXJuYWwuaApAQCAtNDg4LDYgKzQ4OCwx MyBAQCB0eXBlZGVmIHN0cnVjdCBQZ1N0YXRTaGFyZWRfV2FsCiAJUGdTdGF0X1dhbFN0YXRzIHN0 YXRzOwogfSBQZ1N0YXRTaGFyZWRfV2FsOwogCit0eXBlZGVmIHN0cnVjdCBQZ1N0YXRTaGFyZWRf V2FsUmVjb3JkcworeworCS8qIGxvY2sgcHJvdGVjdHMgLT5zdGF0cyAqLworCUxXTG9jawkJbG9j azsKKwlQZ1N0YXRfV2FsUmVjb3JkU3RhdHMgc3RhdHM7Cit9IFBnU3RhdFNoYXJlZF9XYWxSZWNv cmRzOworCiAKIAogLyogLS0tLS0tLS0tLQpAQCAtNTgzLDYgKzU5MCw3IEBAIHR5cGVkZWYgc3Ry dWN0IFBnU3RhdF9TaG1lbUNvbnRyb2wKIAlQZ1N0YXRTaGFyZWRfTG9jayBsb2NrOwogCVBnU3Rh dFNoYXJlZF9TTFJVIHNscnU7CiAJUGdTdGF0U2hhcmVkX1dhbCB3YWw7CisJUGdTdGF0U2hhcmVk X1dhbFJlY29yZHMgd2FsX3JlY29yZHM7CiAKIAkvKgogCSAqIEN1c3RvbSBzdGF0cyBkYXRhIHdp dGggZml4ZWQtbnVtYmVyZWQgb2JqZWN0cywgaW5kZXhlZCBieSAoUGdTdGF0X0tpbmQKQEAgLTYx OSw2ICs2MjcsOCBAQCB0eXBlZGVmIHN0cnVjdCBQZ1N0YXRfU25hcHNob3QKIAogCVBnU3RhdF9X YWxTdGF0cyB3YWw7CiAKKwlQZ1N0YXRfV2FsUmVjb3JkU3RhdHMgd2FsX3JlY29yZHM7CisKIAkv KgogCSAqIERhdGEgaW4gc25hcHNob3QgZm9yIGN1c3RvbSBmaXhlZC1udW1iZXJlZCBzdGF0aXN0 aWNzLCBpbmRleGVkIGJ5CiAJICogKFBnU3RhdF9LaW5kIC0gUEdTVEFUX0tJTkRfQ1VTVE9NX01J TikuICBFYWNoIGVudHJ5IGlzIGFsbG9jYXRlZCBpbgpAQCAtODQ3LDYgKzg1NywxNiBAQCBleHRl cm4gdm9pZCBwZ3N0YXRfd2FsX3Jlc2V0X2FsbF9jYihUaW1lc3RhbXBUeiB0cyk7CiBleHRlcm4g dm9pZCBwZ3N0YXRfd2FsX3NuYXBzaG90X2NiKHZvaWQpOwogCiAKKy8qCisgKiBGdW5jdGlvbnMg aW4gcGdzdGF0X3dhbHJlY29yZHMuYworICovCisKK2V4dGVybiBib29sIHBnc3RhdF93YWxyZWNv cmRzX2ZsdXNoX2NiKGJvb2wgbm93YWl0KTsKK2V4dGVybiB2b2lkIHBnc3RhdF93YWxyZWNvcmRz X2luaXRfc2htZW1fY2Iodm9pZCAqc3RhdHMpOworZXh0ZXJuIHZvaWQgcGdzdGF0X3dhbHJlY29y ZHNfcmVzZXRfYWxsX2NiKFRpbWVzdGFtcFR6IHRzKTsKK2V4dGVybiB2b2lkIHBnc3RhdF93YWxy ZWNvcmRzX3NuYXBzaG90X2NiKHZvaWQpOworCisKIC8qCiAgKiBGdW5jdGlvbnMgaW4gcGdzdGF0 X3N1YnNjcmlwdGlvbi5jCiAgKi8KZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL3V0aWxzL3Bnc3Rh dF9raW5kLmggYi9zcmMvaW5jbHVkZS91dGlscy9wZ3N0YXRfa2luZC5oCmluZGV4IDJkNzhhMDIu Ljg1ZmMwNzAgMTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL3V0aWxzL3Bnc3RhdF9raW5kLmgKKysr IGIvc3JjL2luY2x1ZGUvdXRpbHMvcGdzdGF0X2tpbmQuaApAQCAtMzksOSArMzksMTAgQEAKICNk ZWZpbmUgUEdTVEFUX0tJTkRfTE9DSwkxMQogI2RlZmluZSBQR1NUQVRfS0lORF9TTFJVCTEyCiAj ZGVmaW5lIFBHU1RBVF9LSU5EX1dBTAkxMworI2RlZmluZSBQR1NUQVRfS0lORF9XQUxfUkVDT1JE UwkxNAogCiAjZGVmaW5lIFBHU1RBVF9LSU5EX0JVSUxUSU5fTUlOIFBHU1RBVF9LSU5EX0RBVEFC QVNFCi0jZGVmaW5lIFBHU1RBVF9LSU5EX0JVSUxUSU5fTUFYIFBHU1RBVF9LSU5EX1dBTAorI2Rl ZmluZSBQR1NUQVRfS0lORF9CVUlMVElOX01BWCBQR1NUQVRfS0lORF9XQUxfUkVDT1JEUwogI2Rl ZmluZSBQR1NUQVRfS0lORF9CVUlMVElOX1NJWkUgKFBHU1RBVF9LSU5EX0JVSUxUSU5fTUFYICsg MSkKIAogLyogQ3VzdG9tIHN0YXRzIGtpbmRzICovCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZWdy ZXNzL2V4cGVjdGVkL3N0YXRzLm91dCBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvc3RhdHMu b3V0CmluZGV4IGVhN2Y3ODQuLjI3OWQ3YmUgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L3JlZ3Jlc3Mv ZXhwZWN0ZWQvc3RhdHMub3V0CisrKyBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvc3RhdHMu b3V0CkBAIC05ODIsNiArOTgyLDM4IEBAIFNFTEVDVCB3YWxfYnl0ZXMgPiA6d2FsX2J5dGVzX2Jl Zm9yZSBGUk9NIHBnX3N0YXRfd2FsOwogIHQKICgxIHJvdykKIAorLS0gVGVzdCBwZ19zdGF0X3dh bF9yZWNvcmRzCistLSBXQUwtZ2VuZXJhdGluZyBhY3Rpdml0eSBhYm92ZSBzaG91bGQgaGF2ZSBw cm9kdWNlZCByZWNvcmRzCitTRUxFQ1QgY291bnQoKikgPiAwIEFTIGhhc19yZWNvcmRzIEZST00g cGdfc3RhdF93YWxfcmVjb3JkczsKKyBoYXNfcmVjb3JkcyAKKy0tLS0tLS0tLS0tLS0KKyB0Ciso MSByb3cpCisKK1NFTEVDVCBjb3VudChESVNUSU5DVCByZXNvdXJjZV9tYW5hZ2VyKSA+IDAgQVMg aGFzX3JtZ3JzIEZST00gcGdfc3RhdF93YWxfcmVjb3JkczsKKyBoYXNfcm1ncnMgCistLS0tLS0t LS0tLQorIHQKKygxIHJvdykKKworLS0gRXZlcnkgcm93IHNob3VsZCBoYXZlIG5vbi1udWxsIHJl c291cmNlX21hbmFnZXIgYW5kIHJlY29yZF90eXBlCitTRUxFQ1QgY291bnQoKikgPSAwIEFTIG5v X251bGxzCisgIEZST00gcGdfc3RhdF93YWxfcmVjb3JkcworICBXSEVSRSByZXNvdXJjZV9tYW5h Z2VyIElTIE5VTEwgT1IgcmVjb3JkX3R5cGUgSVMgTlVMTDsKKyBub19udWxscyAKKy0tLS0tLS0t LS0KKyB0CisoMSByb3cpCisKKy0tIENvdW50cyBzaG91bGQgYWxsIGJlIHBvc2l0aXZlCitTRUxF Q1QgY291bnQoKikgPSAwIEFTIGFsbF9wb3NpdGl2ZQorICBGUk9NIHBnX3N0YXRfd2FsX3JlY29y ZHMKKyAgV0hFUkUgY291bnQgPD0gMDsKKyBhbGxfcG9zaXRpdmUgCistLS0tLS0tLS0tLS0tLQor IHQKKygxIHJvdykKKwogU0VMRUNUIHBnX3N0YXRfZm9yY2VfbmV4dF9mbHVzaCgpOwogIHBnX3N0 YXRfZm9yY2VfbmV4dF9mbHVzaCAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0xMTI3 LDEwICsxMTU5LDI1IEBAIFNFTEVDVCBzdGF0c19yZXNldCA+IDond2FsX3Jlc2V0X3RzJzo6dGlt ZXN0YW1wdHogRlJPTSBwZ19zdGF0X3dhbDsKICB0CiAoMSByb3cpCiAKKy0tIFRlc3QgdGhhdCBy ZXNldF9zaGFyZWQgd2l0aCB3YWxfcmVjb3JkcyBzcGVjaWZpZWQgYXMgdGhlIHN0YXRzIHR5cGUg d29ya3MKK1NFTEVDVCBzdGF0c19yZXNldCBBUyB3YWxfcmVjb3Jkc19yZXNldF90cyBGUk9NIHBn X3N0YXRfd2FsX3JlY29yZHMgTElNSVQgMSBcZ3NldAorU0VMRUNUIHBnX3N0YXRfcmVzZXRfc2hh cmVkKCd3YWxfcmVjb3JkcycpOworIHBnX3N0YXRfcmVzZXRfc2hhcmVkIAorLS0tLS0tLS0tLS0t LS0tLS0tLS0tLQorIAorKDEgcm93KQorCitTRUxFQ1QgY291bnQoKikgQVMgd2FsX3JlY29yZHNf cG9zdF9yZXNldCBGUk9NIHBnX3N0YXRfd2FsX3JlY29yZHMgXGdzZXQKK1NFTEVDVCA6d2FsX3Jl Y29yZHNfcG9zdF9yZXNldCA9IDAgQVMgcmVzZXRfY2xlYXJlZF9jb3VudHM7CisgcmVzZXRfY2xl YXJlZF9jb3VudHMgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgdAorKDEgcm93KQorCiAtLSBU ZXN0IGVycm9yIGNhc2UgZm9yIHJlc2V0X3NoYXJlZCB3aXRoIHVua25vd24gc3RhdHMgdHlwZQog U0VMRUNUIHBnX3N0YXRfcmVzZXRfc2hhcmVkKCd1bmtub3duJyk7CiBFUlJPUjogIHVucmVjb2du aXplZCByZXNldCB0YXJnZXQ6ICJ1bmtub3duIgotSElOVDogIFRhcmdldCBtdXN0IGJlICJhcmNo aXZlciIsICJiZ3dyaXRlciIsICJjaGVja3BvaW50ZXIiLCAiaW8iLCAicmVjb3ZlcnlfcHJlZmV0 Y2giLCAic2xydSIsIG9yICJ3YWwiLgorSElOVDogIFRhcmdldCBtdXN0IGJlICJhcmNoaXZlciIs ICJiZ3dyaXRlciIsICJjaGVja3BvaW50ZXIiLCAiaW8iLCAicmVjb3ZlcnlfcHJlZmV0Y2giLCAi c2xydSIsICJ3YWwiLCBvciAid2FsX3JlY29yZHMiLgogLS0gVGVzdCB0aGF0IHJlc2V0IHdvcmtz IGZvciBwZ19zdGF0X2RhdGFiYXNlIGFuZCBwZ19zdGF0X2RhdGFiYXNlX2NvbmZsaWN0cwogLS0g U2luY2UgcGdfc3RhdF9kYXRhYmFzZSBzdGF0c19yZXNldCBzdGFydHMgb3V0IGFzIE5VTEwsIHJl c2V0IGl0IG9uY2UgZmlyc3Qgc28gdGhhdCB3ZQogLS0gaGF2ZSBhIGJhc2VsaW5lIGZvciBjb21w YXJpc29uLiBUaGUgc2FtZSBmb3IgcGdfc3RhdF9kYXRhYmFzZV9jb25mbGljdHMgYXMgaXQgc2hh cmVzCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZWdyZXNzL3NxbC9zdGF0cy5zcWwgYi9zcmMvdGVz dC9yZWdyZXNzL3NxbC9zdGF0cy5zcWwKaW5kZXggNjVkODk2OC4uYTMzNzhlZiAxMDA2NDQKLS0t IGEvc3JjL3Rlc3QvcmVncmVzcy9zcWwvc3RhdHMuc3FsCisrKyBiL3NyYy90ZXN0L3JlZ3Jlc3Mv c3FsL3N0YXRzLnNxbApAQCAtNDY0LDYgKzQ2NCwxOSBAQCBDSEVDS1BPSU5UIChGTFVTSF9VTkxP R0dFRCk7CiBTRUxFQ1QgbnVtX3JlcXVlc3RlZCA+IDpycXN0X2NrcHRzX2JlZm9yZSBGUk9NIHBn X3N0YXRfY2hlY2twb2ludGVyOwogU0VMRUNUIHdhbF9ieXRlcyA+IDp3YWxfYnl0ZXNfYmVmb3Jl IEZST00gcGdfc3RhdF93YWw7CiAKKy0tIFRlc3QgcGdfc3RhdF93YWxfcmVjb3JkcworLS0gV0FM LWdlbmVyYXRpbmcgYWN0aXZpdHkgYWJvdmUgc2hvdWxkIGhhdmUgcHJvZHVjZWQgcmVjb3Jkcwor U0VMRUNUIGNvdW50KCopID4gMCBBUyBoYXNfcmVjb3JkcyBGUk9NIHBnX3N0YXRfd2FsX3JlY29y ZHM7CitTRUxFQ1QgY291bnQoRElTVElOQ1QgcmVzb3VyY2VfbWFuYWdlcikgPiAwIEFTIGhhc19y bWdycyBGUk9NIHBnX3N0YXRfd2FsX3JlY29yZHM7CistLSBFdmVyeSByb3cgc2hvdWxkIGhhdmUg bm9uLW51bGwgcmVzb3VyY2VfbWFuYWdlciBhbmQgcmVjb3JkX3R5cGUKK1NFTEVDVCBjb3VudCgq KSA9IDAgQVMgbm9fbnVsbHMKKyAgRlJPTSBwZ19zdGF0X3dhbF9yZWNvcmRzCisgIFdIRVJFIHJl c291cmNlX21hbmFnZXIgSVMgTlVMTCBPUiByZWNvcmRfdHlwZSBJUyBOVUxMOworLS0gQ291bnRz IHNob3VsZCBhbGwgYmUgcG9zaXRpdmUKK1NFTEVDVCBjb3VudCgqKSA9IDAgQVMgYWxsX3Bvc2l0 aXZlCisgIEZST00gcGdfc3RhdF93YWxfcmVjb3JkcworICBXSEVSRSBjb3VudCA8PSAwOworCiBT RUxFQ1QgcGdfc3RhdF9mb3JjZV9uZXh0X2ZsdXNoKCk7CiBTRUxFQ1Qgd2FsX2J5dGVzID4gOmJh Y2tlbmRfd2FsX2J5dGVzX2JlZm9yZSBGUk9NIHBnX3N0YXRfZ2V0X2JhY2tlbmRfd2FsKHBnX2Jh Y2tlbmRfcGlkKCkpOwogCkBAIC01MjAsNiArNTMzLDEyIEBAIFNFTEVDVCBzdGF0c19yZXNldCBB UyB3YWxfcmVzZXRfdHMgRlJPTSBwZ19zdGF0X3dhbCBcZ3NldAogU0VMRUNUIHBnX3N0YXRfcmVz ZXRfc2hhcmVkKCd3YWwnKTsKIFNFTEVDVCBzdGF0c19yZXNldCA+IDond2FsX3Jlc2V0X3RzJzo6 dGltZXN0YW1wdHogRlJPTSBwZ19zdGF0X3dhbDsKIAorLS0gVGVzdCB0aGF0IHJlc2V0X3NoYXJl ZCB3aXRoIHdhbF9yZWNvcmRzIHNwZWNpZmllZCBhcyB0aGUgc3RhdHMgdHlwZSB3b3JrcworU0VM RUNUIHN0YXRzX3Jlc2V0IEFTIHdhbF9yZWNvcmRzX3Jlc2V0X3RzIEZST00gcGdfc3RhdF93YWxf cmVjb3JkcyBMSU1JVCAxIFxnc2V0CitTRUxFQ1QgcGdfc3RhdF9yZXNldF9zaGFyZWQoJ3dhbF9y ZWNvcmRzJyk7CitTRUxFQ1QgY291bnQoKikgQVMgd2FsX3JlY29yZHNfcG9zdF9yZXNldCBGUk9N IHBnX3N0YXRfd2FsX3JlY29yZHMgXGdzZXQKK1NFTEVDVCA6d2FsX3JlY29yZHNfcG9zdF9yZXNl dCA9IDAgQVMgcmVzZXRfY2xlYXJlZF9jb3VudHM7CisKIC0tIFRlc3QgZXJyb3IgY2FzZSBmb3Ig cmVzZXRfc2hhcmVkIHdpdGggdW5rbm93biBzdGF0cyB0eXBlCiBTRUxFQ1QgcGdfc3RhdF9yZXNl dF9zaGFyZWQoJ3Vua25vd24nKTsKIAo= --00000000000088c4f3064df6985d--