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 1whV9C-000GWL-0o for pgsql-hackers@arkaria.postgresql.org; Wed, 08 Jul 2026 16:29:19 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1whV99-0084B2-0R for pgsql-hackers@arkaria.postgresql.org; Wed, 08 Jul 2026 16:29:15 +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 1whAk9-002Fmt-2K for pgsql-hackers@lists.postgresql.org; Tue, 07 Jul 2026 18:42:06 +0000 Received: from mail-ej1-x632.google.com ([2a00:1450:4864:20::632]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1whAk7-000000001pY-3uiR for pgsql-hackers@postgresql.org; Tue, 07 Jul 2026 18:42:05 +0000 Received: by mail-ej1-x632.google.com with SMTP id a640c23a62f3a-c15b9def622so77966866b.2 for ; Tue, 07 Jul 2026 11:42:04 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1783449721; cv=none; d=google.com; s=arc-20260327; b=lflmNSwasfUvK2EP6hd6RJi9Gfn788Pa/EWklfMKBKK+y42/GdI6omssKvKEBaGKOD 1R2QHqiKXZVHYu1TSH7ZJ5aOcgaEvkUqTVE6nMK5U6mLZQ4uRyr+YU18trXGBxheNc5S yT5VtldUVb8r0RMmz8n+T/fr8vm7wsKtrOPIx6nYTjubixn3io8SEFF9P6iD9fjhIMUt irI44lOXxUffVL+fZpCkwl8W1eVGl7B43fBRg7KvPSBGXemFs6NZ4+lYaCRIDXE52XEj D3tYG2Y/W80Ur9pO81T4C+9QC9K172tT8nxgLdFU8m0AgpUuj5NWOAqkWYNHykCV2/Iz 7ZOA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20260327; h=cc:to:subject:message-id:date:from:mime-version:dkim-signature; bh=XJ7bCzQvAZEkkJ2yaVL+OwyPAj2cwl1OD2hPL6wjqVY=; fh=085T0rwGq2f1sfYixbRy/iaReIaZKNb416/dUjbuCVc=; b=dWYFkw6Pe+arOtvGRCPAjlfkjhRpX5N68HC7zsryKBdh63V5IEK6px3SgL3I2n4aqi shR5j37g+VSpPq5I6VG6SG01VT3ZfvVhSOWGFf+rjmFqrjtEahN/mmftemcBWm1ssi1q rJyosY1Hk5WXZACGqC8qgqIDzYD+5Z3+QTkJyGbs2KqIrK+ouB9cZWb9OzGGxlpH7LQg i7zBhmT03N89y3DTwn6EzfUg+cG1dz0m7AqoKdzCi/Pg3OxGBJE+mp5VOQAvxr8WnRbt cMDfQijPUv6QoHRJUbgRaWYYpDtjgAyqEio9cxmDjJmzAXYU83Y08cfkTCCZWp4gHw6z 1FAg==; darn=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=1783449721; x=1784054521; darn=postgresql.org; h=content-type:cc:to:subject:message-id:date:from:mime-version:from :to:cc:subject:date:message-id:reply-to:content-type; bh=XJ7bCzQvAZEkkJ2yaVL+OwyPAj2cwl1OD2hPL6wjqVY=; b=mbIb33hyIEvsCQ2B79JVdJs4A/X5QkpCpWEtSSC8mYVgVzjTi8q3ofiuZCjUCywWlp 5WoDtCabHAVNFeI/p0IU/YkPyji4SGHcdZnWqzlTeOm9Cuu+R9gnTeZCxwIK9sgpQfJo QJ46L42QkArChp9Re20O9K7s66V3fgS2ue9/U9kF7DrIKS8DFZT+0IkQhkfS/9dQSeO7 PgtQtBui/cJ+VkfvDncYlrnKC+yMtfflcrOKcHW5aX66uZJ7SC+YfLx3Du3z8Kcgn3UQ UCCzxa2yF4jJv8e3olai7B2zT6sauvp+HTdJDbGQLoijNwyAWwZC6qLfrndoGfJ7EbpG /pCw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1783449721; x=1784054521; h=content-type:cc:to:subject:message-id:date:from:mime-version :x-gm-gg:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to:content-type; bh=XJ7bCzQvAZEkkJ2yaVL+OwyPAj2cwl1OD2hPL6wjqVY=; b=K6kra4nFzQe9awX5ZuBDfIuetnDlo5M5ldjGh90gzrACRy9TIvIWgbeLgve9zHs7oA TQHBIrAxPySZQITMvj+s5gSFoaegwiJG2z8ZTHq43XO535xFM0QXtVgn1hfJYDWeG0qN JW6xG8hKPL3WPbUUgLLhUJSV4Barp05S84pv+f36JwSGvrxmcFXDewhfZRCG8VSxjxEE 5Gj7BokLJj7sRkEanMhBDiFTOnHliFAqJIPSpSabK5P9fcuJDy7OcoQSVgO5EinUKKtN OiBDmS5Fzihx+NaQ7BDkpJtnFcNUobdlqnBdD0LJucpFfsLcuKIbpL7EfAlxKc/7rAAF I90Q== X-Gm-Message-State: AOJu0Yzh64LoVBkcNxvmS//KwclNTyMPpWml6WBIfNe6Ergl1/cWoWxr YN9wbUhcLQiI/I/y8HmbX+rAf8hpuw0fUCl+DFscoLKTjQjBO1LH1UNxqnSIZp/oDNX/Tls60yP +lm+eBEJuLRN/e5gZ77US2G8yz1BPK+r7TCCu X-Gm-Gg: AfdE7cmLJyJxY/5tTwSQue3bzMXqbDxEnEIU2Cv7AOPMRKec1TleysbWlphHlttIekq C9ruWWP2sqtCiNJuH0GNuOAewM2D0w+NNYVkb4huAC0T7n+Kze0Qx7FpGbUivmF6/jYk/1/dVg8 A1EVONmD/q8BE9JGlHbnEhgzrBO/X+lwXWTu16fgbgB1MEvaqbwc5HfmoYL9egueT+MlJRx1ETx fhDuJYazJM+jkg9S7K+c9+5y2gYOyzfLxLgHIiW4k1YloORHMHny0syLZ+3RID402Z/hkWfQfHk Vn55qPJmzaKcpO4GkGmuaOK/c0y4O6qjz+QEKg== X-Received: by 2002:a17:906:79d2:b0:c12:7512:18de with SMTP id a640c23a62f3a-c15a687db02mr269285566b.57.1783449720992; Tue, 07 Jul 2026 11:42:00 -0700 (PDT) MIME-Version: 1.0 From: Dhruv Aron Date: Tue, 7 Jul 2026 11:41:47 -0700 X-Gm-Features: AVVi8Cc-_KhWWNDkz1Bq5q3DKxDd9CzXoaoFRa9TcYFen61nOfR_qGaCNeMfN4o Message-ID: Subject: Restructured Shared Buffer Hash Table To: pgsql-hackers@postgresql.org Cc: haoyu.huang.68@gmail.com, "hlinnaka@iki.fi" Content-Type: multipart/mixed; boundary="000000000000188dff065609bff8" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000188dff065609bff8 Content-Type: multipart/alternative; boundary="000000000000188dfd065609bff6" --000000000000188dfd065609bff6 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Hi, At Databricks, we=E2=80=99ve found that the existing dynahash table structu= re is leaving performance gains on the table when it comes to shared buffer lookups: the multi-level structure (directory, segment, bucket chain, freelist) appears excessive for the shared buffers and could be simplified to boost performance and lower memory overhead. As such, we are proposing a specialized hash table just for this purpose and would appreciate feedback on this approach. To give a brief overview, our new table operates primarily on two arrays, one for the entries and one for the bucket heads, and it enforces the invariant that *entries[x]* describes the page in buffer *x*. Each entry stores only a BufferTag and a =E2=80=98next=E2=80=99 index (representing th= e next entry in the same bucket chain), with each bucket head only storing a =E2=80=98head= =E2=80=99 index (representing the first entry in the bucket chain). At a high-level, the table essentially creates a logical linked list for each bucket on top of the flat physical arrays. The attached patch implements this functionality and passes the existing regression tests; the buf_table.c functions were modified directly, with bufmgr.c also changed slightly to prevent a race condition. My testing (helper script also attached) indicates that all three standard hash table operations (insert, lookup, and delete) generally execute significantly faster than the existing PG18 dynahash counterparts: 4 GB Operation Average Dynahash Execution Time (ns) Average New Table Execution Time (ns) Speedup (Dynahash / New Table) Lookup 77.33 46.50 1.66x Insert 111.78 86.33 1.29x Delete 148.73 104.13 1.43x 16 GB Operation Average Dynahash Execution Time (ns) Average New Table Execution Time (ns) Speedup (Dynahash / New Table) Lookup 98.18 83.01 1.18x Insert 198.58 195.30 1.02x Delete 279.48 274.77 1.02x I would like to note, however, that this patch is part of a larger effort around dynamic shared buffers alongside this patch and additional internal functionality to dynamically resize this new shared buffer table, i.e. adding *and* removing the number of buckets and entry slots without requiring a restart or total table rehash; I believe the table should be resized to prevent it from consuming a disproportionate amount of memory (or being too slow) relative to the size of the shared buffers, and I would be happy to create a follow-up patch demonstrating those resizing capabilities. That being said, I would like to emphasize that I think the changes here offer enough standalone benefits to merit their own patch. Thanks, Dhruv Aron --000000000000188dfd065609bff6 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
Hi,

At Databricks, we=E2=80=99ve found that the exi= sting dynahash table structure is leaving performance gains on the table wh= en it comes to shared buffer lookups: the multi-level structure (directory,= segment, bucket chain, freelist) appears excessive for the shared buffers = and could be simplified to boost performance and lower memory overhead. As = such, we are proposing a specialized hash table just for this purpose and w= ould appreciate feedback on this approach.

To give a brief overview,= our new table operates primarily on two arrays, one for the entries and on= e for the bucket heads, and it enforces the invariant that entries[x] describes the page in buffer x. Each entry stores only a BufferTag= and a =E2=80=98next=E2=80=99 index (representing the next entry in the sam= e bucket chain), with each bucket head only storing a =E2=80=98head=E2=80= =99 index (representing the first entry in the bucket chain). At a high-lev= el, the table essentially creates a logical linked list for each bucket on = top of the flat physical arrays.

The attached patch implements this = functionality and passes the existing regression tests; the buf_table.c fun= ctions were modified directly, with bufmgr.c also changed slightly to preve= nt a race condition. My testing (helper script also attached) indicates tha= t all three standard hash table operations (insert, lookup, and delete) gen= erally execute significantly faster than the existing PG18 dynahash counter= parts:

4 GB

Insert

Operation

Average Dynahash Execution Time (ns)

Average New Table Execution Time (ns)

Speedup (Dynahash / New Tab= le)

Lookup

77.33

46.50

1.66x

111.78

86.33

1.29x

= Delete

= 148.73

= 104.13

= 1.43x


16 GB

Delete

Operation

A= verage Dynahash Execution Time (ns)

Average New Table Execution Tim= e (ns)

Speedup (Dynahash / New Table)

Look= up

98.1= 8

83.0= 1

1.18= x

Insert

198.58

195.30

1.02x

279.48

274.77

1.02x


I would like to note, however, that this patc= h is part of a larger effort around dynamic shared buffers alongside this patch and additional interna= l functionality to dynamically resize this new shared buffer table, i.e. ad= ding and removing the number of buckets and entry slots without requ= iring a restart or total table rehash; I believe the table should be resize= d to prevent it from consuming a disproportionate amount of memory (or bein= g too slow) relative to the size of the shared buffers, and I would be happ= y to create a follow-up patch demonstrating those resizing capabilities. Th= at being said, I would like to emphasize that I think the changes here offe= r enough standalone benefits to merit their own patch.

Thanks,
Dh= ruv Aron
--000000000000188dfd065609bff6-- --000000000000188dff065609bff8 Content-Type: application/octet-stream; name="restructured_shared_buffer_table.patch" Content-Disposition: attachment; filename="restructured_shared_buffer_table.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mrazstbe0 ZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3N0b3JhZ2UvYnVmZmVyL2J1Zl90YWJsZS5jIGIvc3Jj L2JhY2tlbmQvc3RvcmFnZS9idWZmZXIvYnVmX3RhYmxlLmMKaW5kZXggMzQ3YmYyNjdkNzMuLjU3 MDk1N2U2MzU3IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9zdG9yYWdlL2J1ZmZlci9idWZfdGFi bGUuYworKysgYi9zcmMvYmFja2VuZC9zdG9yYWdlL2J1ZmZlci9idWZfdGFibGUuYwpAQCAtMyw2 ICszLDI3IEBACiAgKiBidWZfdGFibGUuYwogICoJICByb3V0aW5lcyBmb3IgbWFwcGluZyBCdWZm ZXJUYWdzIHRvIGJ1ZmZlciBpbmRleGVzLgogICoKKyAqIFRoZSBzaGFyZWQgYnVmZmVyIG1hcHBp bmcgdGFibGUgaXMgYSBmbGF0LCBpbmRleC1saW5rZWQgaGFzaCB0YWJsZSAoYW4KKyAqIG9wZW4t Y2hhaW5pbmcgcmVwbGFjZW1lbnQgZm9yIHRoZSBmb3JtZXIgZHluYWhhc2gtYmFzZWQgdGFibGUp LiAgSXQgaXMgbWFkZQorICogb2YgdHdvIHNoYXJlZC1tZW1vcnkgYXJyYXlzOgorICoKKyAqCSAg YnVja2V0c1tudW1fYnVja2V0c10gLSBvbmUgY2hhaW4gaGVhZCBwZXIgaGFzaCBidWNrZXQKKyAq CSAgZW50cmllc1tOQnVmZmVyc10gICAgIC0gb25lIGVudHJ5IHBlciBidWZmZXIsIGluZGV4ZWQg YnkgYnVmX2lkCisgKgorICogRWFjaCBidWZmZXIgc2xvdCBpIHBlcm1hbmVudGx5IG93bnMgZW50 cnkgc2xvdCBpLCBzbyBubyBmcmVlbGlzdCBpcyBuZWVkZWQ6CisgKiBidWZtZ3IgYWx3YXlzIHJl bW92ZXMgYSBidWZmZXIncyBvbGQgbWFwcGluZyAoQnVmVGFibGVEZWxldGUsIGNhbGxlZCBmcm9t CisgKiBJbnZhbGlkYXRlVmljdGltQnVmZmVyKSBiZWZvcmUgaW5zZXJ0aW5nIGEgbmV3IHRhZyBm b3IgdGhhdCBzYW1lIGJ1Zl9pZCAoc2VlCisgKiBHZXRWaWN0aW1CdWZmZXIgLyBCdWZmZXJBbGxv YyBpbiBidWZtZ3IuYykuICBFbXB0eSBlbnRyeSBzbG90cyBhcmUgbWFya2VkIGJ5CisgKiB0YWcu YmxvY2tOdW0gPT0gUF9ORVc7IGNoYWlucyBhcmUgbGlua2VkIGJ5IGludCBpbmRleCBhbmQgdGVy bWluYXRlZCBieQorICogQlVGX1RBQkxFX0NIQUlOX0VORC4KKyAqCisgKiBudW1fYnVja2V0cyBp cyBhIHBvd2VyIG9mIHR3byBhbmQgYSBtdWx0aXBsZSBvZiBOVU1fQlVGRkVSX1BBUlRJVElPTlMs IHNvIHRoZQorICogYnVja2V0IGluZGV4IChoYXNoY29kZSAlIG51bV9idWNrZXRzKSBzaGFyZXMg aXRzIGxvdyBiaXRzIHdpdGggdGhlIHBhcnRpdGlvbgorICogaW5kZXggKGhhc2hjb2RlICUgTlVN X0JVRkZFUl9QQVJUSVRJT05TKS4gIEV2ZXJ5IHRhZyB0aGF0IG1hcHMgdG8gYSBnaXZlbgorICog YnVja2V0IHRoZXJlZm9yZSBtYXBzIHRvIGEgc2luZ2xlIHBhcnRpdGlvbiwgYW5kIHRoZSBjYWxs ZXIncyBCdWZNYXBwaW5nTG9jaworICogZnVsbHkgc2VyaWFsaXplcyBlYWNoIGNoYWluIC0tIHRo ZSBzYW1lIGd1YXJhbnRlZSB0aGUgZHluYWhhc2ggdGFibGUgcmVsaWVkCisgKiBvbi4KKyAqCiAg KiBOb3RlOiB0aGUgcm91dGluZXMgaW4gdGhpcyBmaWxlIGRvIG5vIGxvY2tpbmcgb2YgdGhlaXIg b3duLiAgVGhlIGNhbGxlcgogICogbXVzdCBob2xkIGEgc3VpdGFibGUgbG9jayBvbiB0aGUgYXBw cm9wcmlhdGUgQnVmTWFwcGluZ0xvY2ssIGFzIHNwZWNpZmllZAogICogaW4gdGhlIGNvbW1lbnRz LiAgV2UgY2FuJ3QgZG8gdGhlIGxvY2tpbmcgaW5zaWRlIHRoZXNlIGZ1bmN0aW9ucyBiZWNhdXNl CkBAIC0yMSw1NiArNDIsMTE0IEBACiAgKi8KICNpbmNsdWRlICJwb3N0Z3Jlcy5oIgogCisjaW5j bHVkZSAiY29tbW9uL2hhc2hmbi5oIgorI2luY2x1ZGUgIm1pc2NhZG1pbi5oIgorI2luY2x1ZGUg InBvcnQvcGdfYml0dXRpbHMuaCIKICNpbmNsdWRlICJzdG9yYWdlL2J1Zl9pbnRlcm5hbHMuaCIK KyNpbmNsdWRlICJzdG9yYWdlL2J1Zm1nci5oIgorI2luY2x1ZGUgInN0b3JhZ2Uvc2htZW0uaCIK ICNpbmNsdWRlICJzdG9yYWdlL3N1YnN5c3RlbXMuaCIKIAorI2RlZmluZSBCVUZfVEFCTEVfQ0hB SU5fRU5EICAoLTEpCisKKy8qIGJ1Y2tldCBmb3IgYnVmZmVyIGxvb2t1cCBoYXNodGFibGUgKi8K K3R5cGVkZWYgc3RydWN0Cit7CisJaW50CQkJaGVhZDsJCQkvKiBoZWFkIG9mIGhhc2ggY2hhaW4s IG9yIEJVRl9UQUJMRV9DSEFJTl9FTkQgKi8KK30gQnVmZmVyTG9va3VwQnVja2V0OworCiAvKiBl bnRyeSBmb3IgYnVmZmVyIGxvb2t1cCBoYXNodGFibGUgKi8KIHR5cGVkZWYgc3RydWN0CiB7Ci0J QnVmZmVyVGFnCWtleTsJCQkvKiBUYWcgb2YgYSBkaXNrIHBhZ2UgKi8KLQlpbnQJCQlpZDsJCQkJ LyogQXNzb2NpYXRlZCBidWZmZXIgSUQgKi8KKwlCdWZmZXJUYWcJdGFnOwkJCS8qIFRhZyBvZiBh IGRpc2sgcGFnZSwgb3IgUF9ORVcgaWYgZW1wdHkgKi8KKwlpbnQJCQluZXh0OwkJCS8qIG5leHQg ZW50cnkgaW4gaGFzaCBjaGFpbiAqLwogfSBCdWZmZXJMb29rdXBFbnQ7CiAKLXN0YXRpYyBIVEFC ICpTaGFyZWRCdWZIYXNoOworLyogYnVja2V0IGFuZCBlbnRyeSBhcnJheXMgZm9yIGJ1ZmZlciBs b29rdXAgaGFzaHRhYmxlIChpbiBzaGFyZWQgbWVtb3J5KSAqLworc3RhdGljIEJ1ZmZlckxvb2t1 cEJ1Y2tldCAqYnVja2V0czsKK3N0YXRpYyBCdWZmZXJMb29rdXBFbnQgKmVudHJpZXM7CisKKy8q IG51bWJlciBvZiBoYXNoIGJ1Y2tldHM7IHBvd2VyIG9mIHR3byBhbmQgbXVsdGlwbGUgb2YgTlVN X0JVRkZFUl9QQVJUSVRJT05TICovCitzdGF0aWMgaW50CW51bV9idWNrZXRzOwogCiBzdGF0aWMg dm9pZCBCdWZUYWJsZVNobWVtUmVxdWVzdCh2b2lkICphcmcpOworc3RhdGljIHZvaWQgQnVmVGFi bGVTaG1lbUluaXQodm9pZCAqYXJnKTsKK3N0YXRpYyB2b2lkIEJ1ZlRhYmxlU2htZW1BdHRhY2go dm9pZCAqYXJnKTsKIAogY29uc3QgU2htZW1DYWxsYmFja3MgQnVmVGFibGVTaG1lbUNhbGxiYWNr cyA9IHsKIAkucmVxdWVzdF9mbiA9IEJ1ZlRhYmxlU2htZW1SZXF1ZXN0LAotCS8qIG5vIHNwZWNp YWwgaW5pdGlhbGl6YXRpb24gbmVlZGVkLCB0aGUgaGFzaCB0YWJsZSB3aWxsIHN0YXJ0IGVtcHR5 ICovCisJLmluaXRfZm4gPSBCdWZUYWJsZVNobWVtSW5pdCwKKwkuYXR0YWNoX2ZuID0gQnVmVGFi bGVTaG1lbUF0dGFjaCwKIH07CiAKIC8qCi0gKiBSZWdpc3RlciBzaG1lbSBoYXNoIHRhYmxlIGZv ciBtYXBwaW5nIGJ1ZmZlcnMuCi0gKgkJc2l6ZSBpcyB0aGUgZGVzaXJlZCBoYXNoIHRhYmxlIHNp emUgKHBvc3NpYmx5IG1vcmUgdGhhbiBOQnVmZmVycykKKyAqIE51bWJlciBvZiBoYXNoIGJ1Y2tl dHMgZm9yIHRoZSBjdXJyZW50IE5CdWZmZXJzLgorICoKKyAqIE11c3QgYmUgYSBwb3dlciBvZiB0 d28gKHNvIGhhc2hjb2RlICUgbnVtX2J1Y2tldHMgPT0gaGFzaGNvZGUgJiAobnVtX2J1Y2tldHMK KyAqIC0gMSkpIGFuZCBhIG11bHRpcGxlIG9mIE5VTV9CVUZGRVJfUEFSVElUSU9OUywgc28gdGhh dCBldmVyeSB0YWcgaW4gYSBidWNrZXQKKyAqIG1hcHMgdG8gYSBzaW5nbGUgYnVmZmVyIHBhcnRp dGlvbiAoc2VlIGZpbGUgaGVhZGVyKS4KKyAqLworc3RhdGljIGlubGluZSBpbnQKK0J1ZlRhYmxl TnVtQnVja2V0cyh2b2lkKQoreworCXJldHVybiBNYXgoTlVNX0JVRkZFUl9QQVJUSVRJT05TLCBw Z19uZXh0cG93ZXIyXzMyKE5CdWZmZXJzKSk7Cit9CisKKy8qCisgKiBSZWdpc3RlciBzaGFyZWQg bWVtb3J5IGFycmF5cyBmb3IgbWFwcGluZyBidWZmZXJzLgogICovCiB2b2lkCiBCdWZUYWJsZVNo bWVtUmVxdWVzdCh2b2lkICphcmcpCiB7Ci0JaW50CQkJc2l6ZTsKKwludW1fYnVja2V0cyA9IEJ1 ZlRhYmxlTnVtQnVja2V0cygpOworCUFzc2VydChudW1fYnVja2V0cyAlIE5VTV9CVUZGRVJfUEFS VElUSU9OUyA9PSAwKTsKIAotCS8qCi0JICogUmVxdWVzdCB0aGUgc2hhcmVkIGJ1ZmZlciBsb29r dXAgaGFzaHRhYmxlLgotCSAqCi0JICogU2luY2Ugd2UgY2FuJ3QgdG9sZXJhdGUgcnVubmluZyBv dXQgb2YgbG9va3VwIHRhYmxlIGVudHJpZXMsIHdlIG11c3QgYmUKLQkgKiBzdXJlIHRvIHNwZWNp ZnkgYW4gYWRlcXVhdGUgdGFibGUgc2l6ZSBoZXJlLiAgVGhlIG1heGltdW0gc3RlYWR5LXN0YXRl Ci0JICogdXNhZ2UgaXMgb2YgY291cnNlIE5CdWZmZXJzIGVudHJpZXMsIGJ1dCBCdWZmZXJBbGxv YygpIHRyaWVzIHRvIGluc2VydAotCSAqIGEgbmV3IGVudHJ5IGJlZm9yZSBkZWxldGluZyB0aGUg b2xkLiAgSW4gcHJpbmNpcGxlIHRoaXMgY291bGQgYmUKLQkgKiBoYXBwZW5pbmcgaW4gZWFjaCBw YXJ0aXRpb24gY29uY3VycmVudGx5LCBzbyB3ZSBjb3VsZCBuZWVkIGFzIG1hbnkgYXMKLQkgKiBO QnVmZmVycyArIE5VTV9CVUZGRVJfUEFSVElUSU9OUyBlbnRyaWVzLgotCSAqLwotCXNpemUgPSBO QnVmZmVycyArIE5VTV9CVUZGRVJfUEFSVElUSU9OUzsKLQotCVNobWVtUmVxdWVzdEhhc2goLm5h bWUgPSAiU2hhcmVkIEJ1ZmZlciBMb29rdXAgVGFibGUiLAotCQkJCQkgLm5lbGVtcyA9IHNpemUs Ci0JCQkJCSAucHRyID0gJlNoYXJlZEJ1Zkhhc2gsCi0JCQkJCSAuaGFzaF9pbmZvLmtleXNpemUg PSBzaXplb2YoQnVmZmVyVGFnKSwKLQkJCQkJIC5oYXNoX2luZm8uZW50cnlzaXplID0gc2l6ZW9m KEJ1ZmZlckxvb2t1cEVudCksCi0JCQkJCSAuaGFzaF9pbmZvLm51bV9wYXJ0aXRpb25zID0gTlVN X0JVRkZFUl9QQVJUSVRJT05TLAotCQkJCQkgLmhhc2hfZmxhZ3MgPSBIQVNIX0VMRU0gfCBIQVNI X0JMT0JTIHwgSEFTSF9QQVJUSVRJT04gfCBIQVNIX0ZJWEVEX1NJWkUsCisJU2htZW1SZXF1ZXN0 U3RydWN0KC5uYW1lID0gIlNoYXJlZCBCdWZmZXIgTG9va3VwIEJ1Y2tldHMiLAorCQkJCQkgICAu c2l6ZSA9IChTaXplKSBudW1fYnVja2V0cyAqIHNpemVvZihCdWZmZXJMb29rdXBCdWNrZXQpLAor CQkJCQkgICAucHRyID0gKHZvaWQgKiopICZidWNrZXRzLAorCQkpOworCisJU2htZW1SZXF1ZXN0 U3RydWN0KC5uYW1lID0gIlNoYXJlZCBCdWZmZXIgTG9va3VwIEVudHJpZXMiLAorCQkJCQkgICAu c2l6ZSA9IChTaXplKSBOQnVmZmVycyAqIHNpemVvZihCdWZmZXJMb29rdXBFbnQpLAorCQkJCQkg ICAucHRyID0gKHZvaWQgKiopICZlbnRyaWVzLAogCQkpOwogfQogCisvKgorICogSW5pdGlhbGl6 ZSB0aGUgc2hhcmVkIGJ1ZmZlciBsb29rdXAgdGFibGUuICBDYWxsZWQgb25jZSBkdXJpbmcgc2hh cmVkLW1lbW9yeQorICogaW5pdGlhbGl6YXRpb24gKGluIHRoZSBwb3N0bWFzdGVyLCBvciBpbiBh IHN0YW5kYWxvbmUgYmFja2VuZCkuCisgKgorICogU2hhcmVkIG1lbW9yeSBpcyB6ZXJvZWQsIGJ1 dCB6ZXJvIGlzIGEgdmFsaWQgYnVmX2lkIGFuZCBibG9jayAwIGlzIGEgdmFsaWQKKyAqIGJsb2Nr IG51bWJlciwgc28gd2UgbXVzdCBleHBsaWNpdGx5IG1hcmsgZXZlcnkgYnVja2V0IGVtcHR5Cisg KiAoQlVGX1RBQkxFX0NIQUlOX0VORCkgYW5kIGV2ZXJ5IGVudHJ5IGVtcHR5ICh0YWcuYmxvY2tO dW0gPT0gUF9ORVcpLgorICovCit2b2lkCitCdWZUYWJsZVNobWVtSW5pdCh2b2lkICphcmcpCit7 CisJbnVtX2J1Y2tldHMgPSBCdWZUYWJsZU51bUJ1Y2tldHMoKTsKKworCWZvciAoaW50IGkgPSAw OyBpIDwgbnVtX2J1Y2tldHM7IGkrKykKKwkJYnVja2V0c1tpXS5oZWFkID0gQlVGX1RBQkxFX0NI QUlOX0VORDsKKworCWZvciAoaW50IGkgPSAwOyBpIDwgTkJ1ZmZlcnM7IGkrKykKKwl7CisJCWVu dHJpZXNbaV0udGFnLmJsb2NrTnVtID0gUF9ORVc7CisJCWVudHJpZXNbaV0ubmV4dCA9IEJVRl9U QUJMRV9DSEFJTl9FTkQ7CisJfQorfQorCisvKgorICogUGVyLWJhY2tlbmQgYXR0YWNoLiAgVGhl IGJ1Y2tldHMvZW50cmllcyBwb2ludGVycyBhcmUgcmVzdG9yZWQgYnkgdGhlIHNobWVtCisgKiBm cmFtZXdvcmssIGJ1dCBudW1fYnVja2V0cyBpcyBhIHByb2Nlc3MtbG9jYWwgc2NhbGFyIHRoYXQg bXVzdCBiZSByZWNvbXB1dGVkCisgKiBpbiBlYWNoIGJhY2tlbmQuICBGb3JrZWQgY2hpbGRyZW4g aW5oZXJpdCBpdCwgYnV0IEVYRUNfQkFDS0VORCBjaGlsZHJlbiBydW4KKyAqIG9ubHkgdGhlIGF0 dGFjaCBjYWxsYmFjaywgc28gc2V0IGl0IGhlcmUgdG9vLgorICovCit2b2lkCitCdWZUYWJsZVNo bWVtQXR0YWNoKHZvaWQgKmFyZykKK3sKKwludW1fYnVja2V0cyA9IEJ1ZlRhYmxlTnVtQnVja2V0 cygpOworfQorCiAvKgogICogQnVmVGFibGVIYXNoQ29kZQogICoJCUNvbXB1dGUgdGhlIGhhc2gg Y29kZSBhc3NvY2lhdGVkIHdpdGggYSBCdWZmZXJUYWcKQEAgLTgzLDcgKzE2Miw3IEBAIEJ1ZlRh YmxlU2htZW1SZXF1ZXN0KHZvaWQgKmFyZykKIHVpbnQzMgogQnVmVGFibGVIYXNoQ29kZShCdWZm ZXJUYWcgKnRhZ1B0cikKIHsKLQlyZXR1cm4gZ2V0X2hhc2hfdmFsdWUoU2hhcmVkQnVmSGFzaCwg dGFnUHRyKTsKKwlyZXR1cm4gdGFnX2hhc2godGFnUHRyLCBzaXplb2YoQnVmZmVyVGFnKSk7CiB9 CiAKIC8qCkBAIC05NSwxOSArMTc0LDE1IEBAIEJ1ZlRhYmxlSGFzaENvZGUoQnVmZmVyVGFnICp0 YWdQdHIpCiBpbnQKIEJ1ZlRhYmxlTG9va3VwKEJ1ZmZlclRhZyAqdGFnUHRyLCB1aW50MzIgaGFz aGNvZGUpCiB7Ci0JQnVmZmVyTG9va3VwRW50ICpyZXN1bHQ7Ci0KLQlyZXN1bHQgPSAoQnVmZmVy TG9va3VwRW50ICopCi0JCWhhc2hfc2VhcmNoX3dpdGhfaGFzaF92YWx1ZShTaGFyZWRCdWZIYXNo LAotCQkJCQkJCQkJdGFnUHRyLAotCQkJCQkJCQkJaGFzaGNvZGUsCi0JCQkJCQkJCQlIQVNIX0ZJ TkQsCi0JCQkJCQkJCQlOVUxMKTsKLQotCWlmICghcmVzdWx0KQotCQlyZXR1cm4gLTE7CisJaW50 CQkJaWQgPSBidWNrZXRzW2hhc2hjb2RlICUgbnVtX2J1Y2tldHNdLmhlYWQ7CiAKLQlyZXR1cm4g cmVzdWx0LT5pZDsKKwl3aGlsZSAoaWQgIT0gQlVGX1RBQkxFX0NIQUlOX0VORCkKKwl7CisJCWlm IChCdWZmZXJUYWdzRXF1YWwoJmVudHJpZXNbaWRdLnRhZywgdGFnUHRyKSkKKwkJCXJldHVybiBp ZDsKKwkJaWQgPSBlbnRyaWVzW2lkXS5uZXh0OworCX0KKwlyZXR1cm4gLTE7CiB9CiAKIC8qCkBA IC0xMjMsMjMgKzE5OCwzNSBAQCBCdWZUYWJsZUxvb2t1cChCdWZmZXJUYWcgKnRhZ1B0ciwgdWlu dDMyIGhhc2hjb2RlKQogaW50CiBCdWZUYWJsZUluc2VydChCdWZmZXJUYWcgKnRhZ1B0ciwgdWlu dDMyIGhhc2hjb2RlLCBpbnQgYnVmX2lkKQogewotCUJ1ZmZlckxvb2t1cEVudCAqcmVzdWx0Owot CWJvb2wJCWZvdW5kOworCWludAkJCWJ1Y2tldF9pZCA9IGhhc2hjb2RlICUgbnVtX2J1Y2tldHM7 CisJaW50CQkJaGVhZCA9IGJ1Y2tldHNbYnVja2V0X2lkXS5oZWFkOworCWludAkJCWlkID0gaGVh ZDsKIAotCUFzc2VydChidWZfaWQgPj0gMCk7CQkvKiAtMSBpcyByZXNlcnZlZCBmb3Igbm90LWlu LXRhYmxlICovCisJQXNzZXJ0KGJ1Zl9pZCA+PSAwICYmIGJ1Zl9pZCA8IE5CdWZmZXJzKTsKIAlB c3NlcnQodGFnUHRyLT5ibG9ja051bSAhPSBQX05FVyk7CS8qIGludmFsaWQgdGFnICovCiAKLQly ZXN1bHQgPSAoQnVmZmVyTG9va3VwRW50ICopCi0JCWhhc2hfc2VhcmNoX3dpdGhfaGFzaF92YWx1 ZShTaGFyZWRCdWZIYXNoLAotCQkJCQkJCQkJdGFnUHRyLAotCQkJCQkJCQkJaGFzaGNvZGUsCi0J CQkJCQkJCQlIQVNIX0VOVEVSLAotCQkJCQkJCQkJJmZvdW5kKTsKKwkvKiBJZiB0aGUgdGFnIGlz IGFscmVhZHkgaW4gdGhlIGNoYWluLCBzdXJmYWNlIHRoZSBleGlzdGluZyBidWZfaWQuICovCisJ d2hpbGUgKGlkICE9IEJVRl9UQUJMRV9DSEFJTl9FTkQpCisJeworCQlpZiAoQnVmZmVyVGFnc0Vx dWFsKCZlbnRyaWVzW2lkXS50YWcsIHRhZ1B0cikpCisJCQlyZXR1cm4gaWQ7CisJCWlkID0gZW50 cmllc1tpZF0ubmV4dDsKKwl9CiAKLQlpZiAoZm91bmQpCQkJCQkvKiBmb3VuZCBzb21ldGhpbmcg YWxyZWFkeSBpbiB0aGUgdGFibGUgKi8KLQkJcmV0dXJuIHJlc3VsdC0+aWQ7CisJLyoKKwkgKiBO b3QgcHJlc2VudC4gIGVudHJ5W2J1Zl9pZF0gbXVzdCBiZSBlbXB0eTogYnVmbWdyIGFsd2F5cyBk ZWxldGVzIGEKKwkgKiBidWZmZXIncyBvbGQgbWFwcGluZyBiZWZvcmUgaW5zZXJ0aW5nIGEgbmV3 IHRhZyBmb3IgdGhhdCBidWZfaWQuCisJICovCisJQXNzZXJ0KGVudHJpZXNbYnVmX2lkXS50YWcu YmxvY2tOdW0gPT0gUF9ORVcpOwogCi0JcmVzdWx0LT5pZCA9IGJ1Zl9pZDsKKwkvKgorCSAqIExp bmsgZW50cnlbYnVmX2lkXSBhdCB0aGUgY2hhaW4gaGVhZCwga2VlcGluZyB0aGUgcHJpb3IgaGVh ZCBhcyBpdHMKKwkgKiBzdWNjZXNzb3IuICAoVXNlIHRoZSBzYXZlZCBgaGVhZGAsIG5vdCBgaWRg LCB3aGljaCB0aGUgbG9vcCBhYm92ZSBoYXMKKwkgKiBhZHZhbmNlZCB0byBCVUZfVEFCTEVfQ0hB SU5fRU5ELikKKwkgKi8KKwllbnRyaWVzW2J1Zl9pZF0udGFnID0gKnRhZ1B0cjsKKwllbnRyaWVz W2J1Zl9pZF0ubmV4dCA9IGhlYWQ7CisJYnVja2V0c1tidWNrZXRfaWRdLmhlYWQgPSBidWZfaWQ7 CiAKIAlyZXR1cm4gLTE7CiB9CkBAIC0xNTMsMTUgKzI0MCwzMiBAQCBCdWZUYWJsZUluc2VydChC dWZmZXJUYWcgKnRhZ1B0ciwgdWludDMyIGhhc2hjb2RlLCBpbnQgYnVmX2lkKQogdm9pZAogQnVm VGFibGVEZWxldGUoQnVmZmVyVGFnICp0YWdQdHIsIHVpbnQzMiBoYXNoY29kZSkKIHsKLQlCdWZm ZXJMb29rdXBFbnQgKnJlc3VsdDsKKwlpbnQJCQlidWNrZXRfaWQgPSBoYXNoY29kZSAlIG51bV9i dWNrZXRzOworCWludAkJCXByZXYgPSBCVUZfVEFCTEVfQ0hBSU5fRU5EOworCWludAkJCWlkID0g YnVja2V0c1tidWNrZXRfaWRdLmhlYWQ7CiAKLQlyZXN1bHQgPSAoQnVmZmVyTG9va3VwRW50ICop Ci0JCWhhc2hfc2VhcmNoX3dpdGhfaGFzaF92YWx1ZShTaGFyZWRCdWZIYXNoLAotCQkJCQkJCQkJ dGFnUHRyLAotCQkJCQkJCQkJaGFzaGNvZGUsCi0JCQkJCQkJCQlIQVNIX1JFTU9WRSwKLQkJCQkJ CQkJCU5VTEwpOworCXdoaWxlIChpZCAhPSBCVUZfVEFCTEVfQ0hBSU5fRU5EKQorCXsKKwkJaWYg KEJ1ZmZlclRhZ3NFcXVhbCgmZW50cmllc1tpZF0udGFnLCB0YWdQdHIpKQorCQl7CisJCQkvKiB1 bmxpbmsgZnJvbSB0aGUgY2hhaW4gKi8KKwkJCWlmIChwcmV2ID09IEJVRl9UQUJMRV9DSEFJTl9F TkQpCisJCQkJYnVja2V0c1tidWNrZXRfaWRdLmhlYWQgPSBlbnRyaWVzW2lkXS5uZXh0OworCQkJ ZWxzZQorCQkJCWVudHJpZXNbcHJldl0ubmV4dCA9IGVudHJpZXNbaWRdLm5leHQ7CisJCQkvKiBt YXJrIHRoZSBlbnRyeSBlbXB0eSAqLworCQkJZW50cmllc1tpZF0udGFnLmJsb2NrTnVtID0gUF9O RVc7CisJCQllbnRyaWVzW2lkXS5uZXh0ID0gQlVGX1RBQkxFX0NIQUlOX0VORDsKKwkJCXJldHVy bjsKKwkJfQorCQlwcmV2ID0gaWQ7CisJCWlkID0gZW50cmllc1tpZF0ubmV4dDsKKwl9CiAKLQlp ZiAoIXJlc3VsdCkJCQkJLyogc2hvdWxkbid0IGhhcHBlbiAqLwotCQllbG9nKEVSUk9SLCAic2hh cmVkIGJ1ZmZlciBoYXNoIHRhYmxlIGNvcnJ1cHRlZCIpOworCS8qCisJICogRW50cnkgbm90IGlu IHRhYmxlLiAgQ2FsbGVycyBuZXZlciBkb3VibGUtZGVsZXRlIChkZWxldGlvbiBpcyBnYXRlZCBi eQorCSAqIEJNX1RBR19WQUxJRCBvbiB0aGUgYnVmZmVyIGhlYWRlciksIHNvIHRoaXMgaW5kaWNh dGVzIGNvcnJ1cHRpb24uCisJICovCisJQXNzZXJ0KGZhbHNlKTsKKwllbG9nKEVSUk9SLCAic2hh cmVkIGJ1ZmZlciBoYXNoIHRhYmxlIGNvcnJ1cHRlZCIpOwogfQpkaWZmIC0tZ2l0IGEvc3JjL2Jh Y2tlbmQvc3RvcmFnZS9idWZmZXIvYnVmbWdyLmMgYi9zcmMvYmFja2VuZC9zdG9yYWdlL2J1ZmZl ci9idWZtZ3IuYwppbmRleCBkNmMwY2MxZjZkNC4uZjE3M2VhZjc2NWIgMTAwNjQ0Ci0tLSBhL3Ny Yy9iYWNrZW5kL3N0b3JhZ2UvYnVmZmVyL2J1Zm1nci5jCisrKyBiL3NyYy9iYWNrZW5kL3N0b3Jh Z2UvYnVmZmVyL2J1Zm1nci5jCkBAIC0yNDQxLDE3ICsyNDQxLDIxIEBAIHJldHJ5OgogCW9sZEZs YWdzID0gYnVmX3N0YXRlICYgQlVGX0ZMQUdfTUFTSzsKIAlDbGVhckJ1ZmZlclRhZygmYnVmLT50 YWcpOwogCi0JVW5sb2NrQnVmSGRyRXh0KGJ1ZiwgYnVmX3N0YXRlLAotCQkJCQkwLAotCQkJCQlC VUZfRkxBR19NQVNLIHwgQlVGX1VTQUdFQ09VTlRfTUFTSywKLQkJCQkJMCk7Ci0KIAkvKgogCSAq IFJlbW92ZSB0aGUgYnVmZmVyIGZyb20gdGhlIGxvb2t1cCBoYXNodGFibGUsIGlmIGl0IHdhcyBp biB0aGVyZS4KIAkgKi8KIAlpZiAob2xkRmxhZ3MgJiBCTV9UQUdfVkFMSUQpCiAJCUJ1ZlRhYmxl RGVsZXRlKCZvbGRUYWcsIG9sZEhhc2gpOwogCisJLyogVW5sb2NrIGJ1ZmZlciBoZWFkZXIgYWZ0 ZXIgdGhlIGVudHJ5IGlzIGRlbGV0ZWQgdG8gYXZvaWQgYSByYWNlIGNvbmRpdGlvbjoKKwkgKiBJ ZiB1bmxvY2tlZCBwcmlvciwgYSBjb25jdXJyZW50IEdldFZpY3RpbUJ1ZmZlcigpIGNvdWxkIGlu c2VydCBhIG5ldyBlbnRyeQorCSAqIGZvciB0aGUgc2FtZSBidWZmZXIgYW5kIG92ZXJ3cml0ZSB0 aGUgZW50cnkgc2xvdC4gVGhlbiwgdGhlIEJ1ZlRhYmxlRGVsZXRlKCkKKwkgKiB3b3VsZCBiZSB1 bmFibGUgdG8gZmluZCB0aGUgZW50cnkgYW5kIHdvdWxkIGNvcnJ1cHQgdGhlIGhhc2h0YWJsZS4g Ki8JCisJVW5sb2NrQnVmSGRyRXh0KGJ1ZiwgYnVmX3N0YXRlLAorCQkwLAorCQlCVUZfRkxBR19N QVNLIHwgQlVGX1VTQUdFQ09VTlRfTUFTSywKKwkJMCk7CisKIAkvKgogCSAqIERvbmUgd2l0aCBt YXBwaW5nIGxvY2suCiAJICovCg== --000000000000188dff065609bff8 Content-Type: application/octet-stream; name="test.diff" Content-Disposition: attachment; filename="test.diff" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mrazsyjt1 ZGlmZiAtLWdpdCBhL2J1ZnRhYmxlX2JlbmNoLy5naXRpZ25vcmUgYi9idWZ0YWJsZV9iZW5jaC8u Z2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwLi4yOTg4ZThj M2I0OQotLS0gL2Rldi9udWxsCisrKyBiL2J1ZnRhYmxlX2JlbmNoLy5naXRpZ25vcmUKQEAgLTAs MCArMSwyIEBACitfd29yay8KKy5idWlsZHMvCmRpZmYgLS1naXQgYS9idWZ0YWJsZV9iZW5jaC9S RUFETUUubWQgYi9idWZ0YWJsZV9iZW5jaC9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQK aW5kZXggMDAwMDAwMDAwMDAuLmIzYjkyYTM4YTM1Ci0tLSAvZGV2L251bGwKKysrIGIvYnVmdGFi bGVfYmVuY2gvUkVBRE1FLm1kCkBAIC0wLDAgKzEsNTcgQEAKKyMgYnVmdGFibGVfYmVuY2gKKwor QSBtaWNyby1iZW5jaG1hcmsgb2YgUG9zdGdyZVNRTCdzIHNoYXJlZCAqKmJ1ZmZlciBtYXBwaW5n IHRhYmxlKiogb3BzLiBUaGUgU1FMIGZ1bmN0aW9uCitgYnVmdGFibGVfYmVuY2hfcHJvYmUobiwg cm91bmRzLCByYW5kb20pYCBjYWxscyBgQnVmVGFibGVMb29rdXBgIC8gYEJ1ZlRhYmxlSW5zZXJ0 YCAvCitgQnVmVGFibGVEZWxldGVgICoqZGlyZWN0bHkqKiBvbiB0aGUgbGl2ZSBzaGFyZWQgdGFi bGUgYW5kICoqYnVsay10aW1lcyoqIGVhY2ggb3AgKG9uZSByZHRzYyBwYWlyIMO3CitOKSDigJQg bm8gYFJlYWRCdWZmZXJgLCBubyBwYWdlIGNvcHksIG5vIHBlci1vcCByZHRzYy4gSXQgb3BlcmF0 ZXMgb24gZnJlZSBidWZmZXIgc2xvdHMgKyBzeW50aGV0aWMKK3RhZ3MgYW5kIHJlc3RvcmVzIHRo ZSB0YWJsZSBhZnRlcndhcmQuCisKK1RoZSB3aG9sZSB0aGluZyBpcyBvbmUgc2VsZi1jb250YWlu ZWQgdGVzdC1tb2R1bGUgZXh0ZW5zaW9uIOKAlCB0aGUgKipvbmx5IGNoYW5nZSB2cyBzdG9jawor UG9zdGdyZVNRTCoqLiB4ODZfNjQgb25seSAodXNlcyBgcmR0c2NgKS4KKworIyMgRmlsZXMKKwor YGBgCitidWZ0YWJsZV9iZW5jaC8KK+KUnOKUgOKUgCBydW4uc2ggICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICMgYnVpbGQgdGhlIGN1cnJlbnQgYnJhbmNoIChyZWxlYXNlKSArIHJ1 biArIHByaW50IG51bWJlcnMKK+KUnOKUgOKUgCBpbnN0cnVtZW50YXRpb24vYnVmdGFibGVfYmVu Y2hfbW9kdWxlLyAgICMgdGhlIGV4dGVuc2lvbiAoZHJvcCBpbnRvIHNyYy90ZXN0L21vZHVsZXMv KQor4pSCICAg4pSc4pSA4pSAIGJ1ZnRhYmxlX2JlbmNoLmMgICAgICAgICAgICAgICAgICAgICAg IyAgIGJ1ZnRhYmxlX2JlbmNoX3Byb2JlKCkg4oCUIHRoZSBwcm9iZQor4pSCICAg4pSc4pSA4pSA IGJ1ZnRhYmxlX2JlbmNoLS0xLjAuc3FsICAgICAgICAgICAgICAgIyAgIENSRUFURSBGVU5DVElP TiBidWZ0YWJsZV9iZW5jaF9wcm9iZSguLi4pCivilIIgICDilJzilIDilIAgYnVmdGFibGVfYmVu Y2guY29udHJvbAor4pSCICAg4pSc4pSA4pSAIE1ha2VmaWxlCivilIIgICDilJTilIDilIAgbWVz b24uYnVpbGQKK+KUnOKUgOKUgCBzY3JpcHRzLwor4pSCICAg4pSc4pSA4pSAIGJlbmNoX3Byb2Jl LnNoICAgPHByZWZpeD4gPHNpemU+ICAgICAgIyBydW4gdGhlIHByb2JlIGFnYWluc3Qgb25lIGV4 cGxpY2l0IGluc3RhbGwKK+KUgiAgIOKUlOKUgOKUgCBjb21wYXJlX3Byb2JlLnNoIFtzaXplcy4u Ll0gICAgICAgICAgICMgZmxhdC12cy1keW5haGFzaCBBL0IgKG5lZWRzIHR3byBidWlsZHMpCivi lJTilIDilIAgcmVzdWx0cy8KKyAgICDilJzilIDilIAgcHJvYmVfc3VtbWFyeS50eHQgICAgICAg ICAgICAgICAgICAgICAjIHJlY29yZGVkIEEvQiBudW1iZXJzCisgICAg4pSU4pSA4pSAIGNvbXBh cmVfcHJvYmUucmVzdWx0cy50eHQKK2BgYAorKGAuYnVpbGRzL2AgYW5kIGBfd29yay9gIGFyZSBs b2NhbCBidWlsZC9zY3JhdGNoIGNhY2hlcyDigJQgZ2l0aWdub3JlZC4pCisKKyMjIEhvdyB0byBy dW4KKworKipUaGUgY3VycmVudCBicmFuY2gqKiAoYnVpbGRzIHRoaXMgcmVwbydzIGBIRUFEYCBh cyBhIHJlbGVhc2UsIGNhY2hlcyBpdCBwZXIgY29tbWl0LCBydW5zLCBhbmQKK3ByaW50cyB0aGUg cGVyLW9wIG51bWJlcnMpOgorCitgYGBzaAorYnVmdGFibGVfYmVuY2gvcnVuLnNoICAgICAgICAg ICAgICAgICAjIGRlZmF1bHQgc2hhcmVkX2J1ZmZlcnMgPSAxR0IKK2J1ZnRhYmxlX2JlbmNoL3J1 bi5zaCAyNTZNQiA0R0IgMTZHQiAgIyBhbnkgc2l6ZXMKK2BgYAorRmlyc3QgcnVuIGZvciBhIGNv bW1pdCBidWlsZHMgKH4zMCBz4oCTZmV3IG1pbik7IGxhdGVyIHJ1bnMgYXJlIGluc3RhbnQuIE91 dHB1dCAodG8gc3Rkb3V0KSwgbGFiZWxlZAorYGJyYW5jaEBjb21taXRgOgorYGBgCistLSBzaGFy ZWRfYnVmZmVycz0xR0IgIChuPTEwNDg1NyBrZXlzKSAtLQorICAgICBvcCAgICAgIHwgYXZnX25z IHwgIGNvdW50CisgaW5zZXJ0ICAgICAgfCAxOC41NTUgfCAxMDQ4NTcwCisgbG9va3VwX2hpdCAg fCAyMy4wNjQgfCAxMDQ4NTcwCisgbG9va3VwX21pc3MgfCAyMS45MDIgfCAxMDQ4NTcwCisgZGVs ZXRlICAgICAgfCAyNC41NjkgfCAxMDQ4NTcwCitgYGAKK0tub2JzOiBgQlVGVEFCTEVfUFJPQkVf Uk9VTkRTYCAoZGVmYXVsdCAxMCk7IGBQR19DT05GSUc9L3BhdGgvYmluL3BnX2NvbmZpZ2AgdG8g c2tpcCB0aGUgYnVpbGQgYW5kCit1c2UgYW4gZXhpc3RpbmcgaW5zdGFsbC4gKGBydW4uc2hgIGlz ICoqc2luZ2xlLWFybSoqIOKAlCBpdCBtZWFzdXJlcyB0aGUgY3VycmVudCBicmFuY2ggb25seS4p CisKKyoqRmxhdC12cy1keW5haGFzaCBBL0IqKiAob3B0aW9uYWw7IG5lZWRzIHR3byBpbnN0YWxs cyBhdCBgfi9wZy1iZW5jaC97ZmxhdCxkeW5hfWApOgorYGBgc2gKK2J1ZnRhYmxlX2JlbmNoL3Nj cmlwdHMvY29tcGFyZV9wcm9iZS5zaCAyNTZNQiA0R0IgMTZHQgorYGBgCmRpZmYgLS1naXQgYS9i dWZ0YWJsZV9iZW5jaC9pbnN0cnVtZW50YXRpb24vYnVmdGFibGVfYmVuY2hfbW9kdWxlL01ha2Vm aWxlIGIvYnVmdGFibGVfYmVuY2gvaW5zdHJ1bWVudGF0aW9uL2J1ZnRhYmxlX2JlbmNoX21vZHVs ZS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uNzVjYTMw Yzc5ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9idWZ0YWJsZV9iZW5jaC9pbnN0cnVtZW50YXRpb24v YnVmdGFibGVfYmVuY2hfbW9kdWxlL01ha2VmaWxlCkBAIC0wLDAgKzEsMjIgQEAKKyMgc3JjL3Rl c3QvbW9kdWxlcy9idWZ0YWJsZV9iZW5jaC9NYWtlZmlsZQorCitQR0ZJTEVERVNDID0gImJ1ZnRh YmxlX2JlbmNoIC0gcmR0c2MgbWljcm8tYmVuY2htYXJrIGZvciB0aGUgYnVmZmVyIG1hcHBpbmcg dGFibGUiCisKK01PRFVMRV9iaWcgPSBidWZ0YWJsZV9iZW5jaAorT0JKUyA9IFwKKwkkKFdJTjMy UkVTKSBcCisJYnVmdGFibGVfYmVuY2gubworCitFWFRFTlNJT04gPSBidWZ0YWJsZV9iZW5jaAor REFUQSA9IGJ1ZnRhYmxlX2JlbmNoLS0xLjAuc3FsCisKK2lmZGVmIFVTRV9QR1hTCitQR19DT05G SUcgPSBwZ19jb25maWcKK1BHWFMgOj0gJChzaGVsbCAkKFBHX0NPTkZJRykgLS1wZ3hzKQoraW5j bHVkZSAkKFBHWFMpCitlbHNlCitzdWJkaXIgPSBzcmMvdGVzdC9tb2R1bGVzL2J1ZnRhYmxlX2Jl bmNoCit0b3BfYnVpbGRkaXIgPSAuLi8uLi8uLi8uLgoraW5jbHVkZSAkKHRvcF9idWlsZGRpcikv c3JjL01ha2VmaWxlLmdsb2JhbAoraW5jbHVkZSAkKHRvcF9zcmNkaXIpL2NvbnRyaWIvY29udHJp Yi1nbG9iYWwubWsKK2VuZGlmCmRpZmYgLS1naXQgYS9idWZ0YWJsZV9iZW5jaC9pbnN0cnVtZW50 YXRpb24vYnVmdGFibGVfYmVuY2hfbW9kdWxlL2J1ZnRhYmxlX2JlbmNoLS0xLjAuc3FsIGIvYnVm dGFibGVfYmVuY2gvaW5zdHJ1bWVudGF0aW9uL2J1ZnRhYmxlX2JlbmNoX21vZHVsZS9idWZ0YWJs ZV9iZW5jaC0tMS4wLnNxbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4u ZjgxYzBlNjBkNWQKLS0tIC9kZXYvbnVsbAorKysgYi9idWZ0YWJsZV9iZW5jaC9pbnN0cnVtZW50 YXRpb24vYnVmdGFibGVfYmVuY2hfbW9kdWxlL2J1ZnRhYmxlX2JlbmNoLS0xLjAuc3FsCkBAIC0w LDAgKzEsMTcgQEAKKy8qIHNyYy90ZXN0L21vZHVsZXMvYnVmdGFibGVfYmVuY2gvYnVmdGFibGVf YmVuY2gtLTEuMC5zcWwgKi8KKworLS0gY29tcGxhaW4gaWYgc2NyaXB0IGlzIHNvdXJjZWQgaW4g cHNxbCwgcmF0aGVyIHRoYW4gdmlhIENSRUFURSBFWFRFTlNJT04KK1xlY2hvIFVzZSAiQ1JFQVRF IEVYVEVOU0lPTiBidWZ0YWJsZV9iZW5jaCIgdG8gbG9hZCB0aGlzIGZpbGUuIFxxdWl0CisKK0NS RUFURSBGVU5DVElPTiBidWZ0YWJsZV9iZW5jaF9wcm9iZSgKKwlJTiBuIGludDgsCisJSU4gcm91 bmRzIGludDggREVGQVVMVCAxLAorCUlOIHJhbmRvbSBib29sIERFRkFVTFQgdHJ1ZSwKKwlPVVQg b3AgdGV4dCwKKwlPVVQgYXZnX25zIGZsb2F0OCwKKwlPVVQgY291bnQgaW50OCkKK1JFVFVSTlMg U0VUT0YgcmVjb3JkCitBUyAnTU9EVUxFX1BBVEhOQU1FJywgJ2J1ZnRhYmxlX2JlbmNoX3Byb2Jl JworTEFOR1VBR0UgQzsKKworUkVWT0tFIEFMTCBPTiBGVU5DVElPTiBidWZ0YWJsZV9iZW5jaF9w cm9iZShpbnQ4LCBpbnQ4LCBib29sKSBGUk9NIFBVQkxJQzsKZGlmZiAtLWdpdCBhL2J1ZnRhYmxl X2JlbmNoL2luc3RydW1lbnRhdGlvbi9idWZ0YWJsZV9iZW5jaF9tb2R1bGUvYnVmdGFibGVfYmVu Y2guYyBiL2J1ZnRhYmxlX2JlbmNoL2luc3RydW1lbnRhdGlvbi9idWZ0YWJsZV9iZW5jaF9tb2R1 bGUvYnVmdGFibGVfYmVuY2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAw MC4uNjdkMDliMzU3OWMKLS0tIC9kZXYvbnVsbAorKysgYi9idWZ0YWJsZV9iZW5jaC9pbnN0cnVt ZW50YXRpb24vYnVmdGFibGVfYmVuY2hfbW9kdWxlL2J1ZnRhYmxlX2JlbmNoLmMKQEAgLTAsMCAr MSwyNTUgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIGJ1ZnRhYmxlX2JlbmNoLmMKKyAq CQlQb2xsdXRpb24tZnJlZSBpbi1wbGFjZSBiZW5jaG1hcmsgb2YgdGhlIHNoYXJlZCBidWZmZXIg bWFwcGluZyB0YWJsZS4KKyAqCisgKiBUaHJvd2F3YXkgbWljcm8tYmVuY2htYXJrIG1vZHVsZSAo Tk9UIGZvciB1cHN0cmVhbSkuICBPbmUgU1FMIGZ1bmN0aW9uLAorICogYnVmdGFibGVfYmVuY2hf cHJvYmUobiwgcm91bmRzKSwgdGltZXMgbG9va3VwIChoaXQrbWlzcyksIGluc2VydCwgYW5kIGRl bGV0ZQorICogYnkgY2FsbGluZyBCdWZUYWJsZXtJbnNlcnQsTG9va3VwLERlbGV0ZX0gRElSRUNU TFkgb24gdGhlIHJlYWwgc2hhcmVkIHRhYmxlCisgKiAtLSBubyBSZWFkQnVmZmVyLCBubyA4IEtC IHBhZ2UgY29weSwgbm8gcGVyLW9wIHJkdHNjLiAgRWFjaCBvcCdzIGxvb3AgaXMKKyAqIGJ1bGst dGltZWQgd2l0aCBhIHNpbmdsZSByZHRzYyBwYWlyLCBzbyB0aGUgbWVhc3VyZW1lbnQgaXNuJ3Qg cG9sbHV0ZWQgYnkKKyAqIHBhZ2UtY29weSBjYWNoZSB0cmFmZmljIG9yIHBlci1vcCB0aW1lciBv dmVyaGVhZC4KKyAqCisgKiBJdCB3b3JrcyBhZ2FpbnN0IFNUT0NLIFBvc3RncmVTUUw6IGl0IG9u bHkgY2FsbHMgdGhlIGV4aXN0aW5nIHB1YmxpYworICogQnVmVGFibGUqIC8gQnVmVGFibGVIYXNo Q29kZSBmdW5jdGlvbnMsIHNvIG5vIGNvcmUgY2hhbmdlcyBhcmUgbmVlZGVkIC0tIHRoZQorICog dHdvIGFybXMgYmVpbmcgY29tcGFyZWQgYXJlIGp1c3QgdHdvIHN0b2NrIGJ1aWxkcyAoZmxhdCB0 YWJsZSB2cyBkeW5haGFzaCkuCisgKgorICogSW5zZXJ0L2RlbGV0ZSBtdXRhdGUgdGhlIGxpdmUg dGFibGUsIHNvIHdlIG9ubHkgdXNlIEZSRUUgYnVmZmVyIHNsb3RzICh0aGVpcgorICogbWFwcGlu ZyBlbnRyeSBpcyBndWFyYW50ZWVkIGVtcHR5KSBhbmQgcmVzdG9yZSB0aGUgdGFibGUgYWZ0ZXJ3 YXJkLgorICoKKyAqIHg4Nl82NCBvbmx5IChyZHRzYykuCisgKgorICogSURFTlRJRklDQVRJT04K KyAqCSAgc3JjL3Rlc3QvbW9kdWxlcy9idWZ0YWJsZV9iZW5jaC9idWZ0YWJsZV9iZW5jaC5jCisg KgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKyNpbmNsdWRlICJwb3N0Z3Jlcy5oIgorCisjaW5j bHVkZSAiZm1nci5oIgorI2luY2x1ZGUgImZ1bmNhcGkuaCIKKyNpbmNsdWRlICJtaXNjYWRtaW4u aCIKKyNpbmNsdWRlICJwb3J0YWJpbGl0eS9pbnN0cl90aW1lLmgiCisjaW5jbHVkZSAic3RvcmFn ZS9idWZfaW50ZXJuYWxzLmgiCisjaW5jbHVkZSAic3RvcmFnZS9idWZtZ3IuaCIKKyNpbmNsdWRl ICJ1dGlscy9idWlsdGlucy5oIgorI2luY2x1ZGUgInV0aWxzL3R1cGxlc3RvcmUuaCIKKworUEdf TU9EVUxFX01BR0lDOworCitQR19GVU5DVElPTl9JTkZPX1YxKGJ1ZnRhYmxlX2JlbmNoX3Byb2Jl KTsKKworI2RlZmluZSBCVUZUQUJMRV9CRU5DSF9QUk9CRV9DT0xTIDMKKworLyogc3ludGhldGlj IHJlbGZpbGVub2RlcyBmb3IgYmVuY2ggdGFncyDigJQgdW5saWtlbHkgdG8gY29sbGlkZSB3aXRo IGFueXRoaW5nIHJlYWwgKi8KKyNkZWZpbmUgQkVOQ0hfU1BDX09JRCAgMHhCMEIwCisjZGVmaW5l IEJFTkNIX0RCX09JRCAgIDB4QjFCMQorI2RlZmluZSBCRU5DSF9SRUxfUFJFU0VOVCAgKChSZWxG aWxlTnVtYmVyKSAweDdFNTcwMDAxKQorI2RlZmluZSBCRU5DSF9SRUxfQUJTRU5UICAgKChSZWxG aWxlTnVtYmVyKSAweDdFNTcwMDAyKQorCitzdGF0aWMgaW5saW5lIHVpbnQ2NAorYmVuY2hfcmR0 c2Modm9pZCkKK3sKKwl1aW50MzIJCWxvLAorCQkJCWhpOworCisJX19hc21fXyBfX3ZvbGF0aWxl X18oInJkdHNjIiA6ICI9YSIobG8pLCAiPWQiKGhpKTo6Im1lbW9yeSIpOworCXJldHVybiAoKHVp bnQ2NCkgaGkgPDwgMzIpIHwgbG87Cit9CisKKy8qIGN5Y2xlcyBwZXIgbmFub3NlY29uZCwgbWVh c3VyZWQgb3ZlciBhIH4yIG1zIHdhbGwtY2xvY2sgd2luZG93ICovCitzdGF0aWMgZG91YmxlCitw cm9iZV9jYWxpYnJhdGUodm9pZCkKK3sKKwlpbnN0cl90aW1lCXcwLAorCQkJCXcxLAorCQkJCWQ7 CisJdWludDY0CQljMCwKKwkJCQljMTsKKwlkb3VibGUJCW5zOworCisJSU5TVFJfVElNRV9TRVRf Q1VSUkVOVCh3MCk7CisJYzAgPSBiZW5jaF9yZHRzYygpOworCWRvCisJeworCQlJTlNUUl9USU1F X1NFVF9DVVJSRU5UKHcxKTsKKwkJZCA9IHcxOworCQlJTlNUUl9USU1FX1NVQlRSQUNUKGQsIHcw KTsKKwl9IHdoaWxlIChJTlNUUl9USU1FX0dFVF9ET1VCTEUoZCkgPCAwLjAwMik7CisJYzEgPSBi ZW5jaF9yZHRzYygpOworCW5zID0gSU5TVFJfVElNRV9HRVRfRE9VQkxFKGQpICogMWU5OworCXJl dHVybiAobnMgPiAwLjApID8gKGRvdWJsZSkgKGMxIC0gYzApIC8gbnMgOiAwLjA7Cit9CisKKy8q CisgKiBidWZ0YWJsZV9iZW5jaF9wcm9iZShuLCByb3VuZHMpIC0+IFNFVE9GIChvcCB0ZXh0LCBh dmdfbnMgZmxvYXQ4LCBjb3VudCBpbnQ4KQorICoKKyAqIFJvd3M6IGluc2VydCwgbG9va3VwX2hp dCwgbG9va3VwX21pc3MsIGRlbGV0ZS4gIFNlZSBmaWxlIGhlYWRlci4KKyAqLworRGF0dW0KK2J1 ZnRhYmxlX2JlbmNoX3Byb2JlKFBHX0ZVTkNUSU9OX0FSR1MpCit7CisJaW50NjQJCW4gPSBQR19H RVRBUkdfSU5UNjQoMCk7CisJaW50NjQJCXJvdW5kcyA9IFBHX0FSR0lTTlVMTCgxKSA/IDEgOiBQ R19HRVRBUkdfSU5UNjQoMSk7CisJYm9vbAkJcmFuZG9taXplID0gUEdfQVJHSVNOVUxMKDIpID8g dHJ1ZSA6IFBHX0dFVEFSR19CT09MKDIpOworCVJldHVyblNldEluZm8gKnJzaW5mbyA9IChSZXR1 cm5TZXRJbmZvICopIGZjaW5mby0+cmVzdWx0aW5mbzsKKwlpbnQJCSAgICpidWZpZHM7CisJaW50 NjQJICAgKm9yZDsKKwlCdWZmZXJUYWcgICpwdGFnLAorCQkJICAgKmF0YWc7CisJdWludDMyCSAg ICpwaGFzaCwKKwkJCSAgICphaGFzaDsKKwlpbnQ2NAkJbmZyZWUgPSAwOworCWRvdWJsZQkJY3lj X3Blcl9ucywKKwkJCQlkZW5vbTsKKwl1aW50NjQJCWlucyA9IDAsCisJCQkJbGtoID0gMCwKKwkJ CQlsa20gPSAwLAorCQkJCWRlbCA9IDA7CisJdm9sYXRpbGUgaW50NjQgc2luayA9IDA7CisJUmVs RmlsZUxvY2F0b3IgcnAgPSB7LnNwY09pZCA9IEJFTkNIX1NQQ19PSUQsLmRiT2lkID0gQkVOQ0hf REJfT0lELC5yZWxOdW1iZXIgPSBCRU5DSF9SRUxfUFJFU0VOVH07CisJUmVsRmlsZUxvY2F0b3Ig cmEgPSB7LnNwY09pZCA9IEJFTkNIX1NQQ19PSUQsLmRiT2lkID0gQkVOQ0hfREJfT0lELC5yZWxO dW1iZXIgPSBCRU5DSF9SRUxfQUJTRU5UfTsKKwljb25zdCBjaGFyICpuYW1lc1s0XSA9IHsiaW5z ZXJ0IiwgImxvb2t1cF9oaXQiLCAibG9va3VwX21pc3MiLCAiZGVsZXRlIn07CisJZG91YmxlCQlh dmdbNF07CisKKwlpZiAobiA8PSAwIHx8IHJvdW5kcyA8PSAwKQorCQllcmVwb3J0KEVSUk9SLCAo ZXJybXNnKCJuIGFuZCByb3VuZHMgbXVzdCBiZSBwb3NpdGl2ZSIpKSk7CisKKwlJbml0TWF0ZXJp YWxpemVkU1JGKGZjaW5mbywgMCk7CisKKwkvKiBjb2xsZWN0IHVwIHRvIG4gRlJFRSBidWZmZXIg c2xvdHMgKG1hcHBpbmcgZW50cnkgZ3VhcmFudGVlZCBlbXB0eSkgKi8KKwlidWZpZHMgPSBwYWxs b2Moc2l6ZW9mKGludCkgKiBuKTsKKwlmb3IgKGludCBpID0gMDsgaSA8IE5CdWZmZXJzICYmIG5m cmVlIDwgbjsgaSsrKQorCXsKKwkJQnVmZmVyRGVzYyAqZGVzYyA9IEdldEJ1ZmZlckRlc2NyaXB0 b3IoaSk7CisJCXVpbnQ2NAkJc3RhdGUgPSBwZ19hdG9taWNfcmVhZF91NjQoJmRlc2MtPnN0YXRl KTsKKworCQlpZiAoIShzdGF0ZSAmIEJNX1RBR19WQUxJRCkpCisJCQlidWZpZHNbbmZyZWUrK10g PSBpOworCX0KKwluID0gbmZyZWU7CisJaWYgKG4gPT0gMCkKKwkJZXJlcG9ydChFUlJPUiwgKGVy cm1zZygibm8gZnJlZSBidWZmZXJzIHRvIHByb2JlIHdpdGgiKSkpOworCisJLyogYnVpbGQgcHJl c2VudCArIGFic2VudCB0YWdzIGFuZCB0aGVpciBoYXNoZXMgKi8KKwlwdGFnID0gcGFsbG9jKHNp emVvZihCdWZmZXJUYWcpICogbik7CisJYXRhZyA9IHBhbGxvYyhzaXplb2YoQnVmZmVyVGFnKSAq IG4pOworCXBoYXNoID0gcGFsbG9jKHNpemVvZih1aW50MzIpICogbik7CisJYWhhc2ggPSBwYWxs b2Moc2l6ZW9mKHVpbnQzMikgKiBuKTsKKwlmb3IgKGludDY0IGogPSAwOyBqIDwgbjsgaisrKQor CXsKKwkJSW5pdEJ1ZmZlclRhZygmcHRhZ1tqXSwgJnJwLCBNQUlOX0ZPUktOVU0sIChCbG9ja051 bWJlcikgaik7CisJCUluaXRCdWZmZXJUYWcoJmF0YWdbal0sICZyYSwgTUFJTl9GT1JLTlVNLCAo QmxvY2tOdW1iZXIpIGopOworCQlwaGFzaFtqXSA9IEJ1ZlRhYmxlSGFzaENvZGUoJnB0YWdbal0p OworCQlhaGFzaFtqXSA9IEJ1ZlRhYmxlSGFzaENvZGUoJmF0YWdbal0pOworCX0KKworCS8qCisJ ICogSXRlcmF0aW9uIG9yZGVyIG92ZXIgdGhlIGtleXM6IGlkZW50aXR5IChzZXF1ZW50aWFsKSBv ciBhIEZpc2hlci1ZYXRlcworCSAqIHNodWZmbGUgKHJhbmRvbSkuICBBIHNodWZmbGVkIG9yZGVy IG1ha2VzIHRoZSB0aW1lZCBsb29wcyB2aXNpdCBrZXlzIGluCisJICogYW4gb3JkZXIgdW5jb3Jy ZWxhdGVkIHdpdGggd2hlcmUgdGhlaXIgZW50cmllcy9lbGVtZW50cyBsaXZlLCBzbyBCT1RICisJ ICogYXJtcycgZW50cnkvZWxlbWVudCBhY2Nlc3MgaXMgcmFuZG9tIChub3QganVzdCB0aGUgYnVj a2V0IGFjY2Vzcywgd2hpY2gKKwkgKiB0aGUgaGFzaCBhbHJlYWR5IHNjYXR0ZXJzKS4gIERvbmUg b25jZSBpbiBzZXR1cCAodW50aW1lZCkuCisJICovCisJb3JkID0gcGFsbG9jKHNpemVvZihpbnQ2 NCkgKiBuKTsKKwlmb3IgKGludDY0IGkgPSAwOyBpIDwgbjsgaSsrKQorCQlvcmRbaV0gPSBpOwor CWlmIChyYW5kb21pemUpCisJeworCQl1aW50NjQJCXJuZyA9IDB4OUUzNzc5Qjk3RjRBN0MxNVVM TDsJLyogZml4ZWQgc2VlZCAtPiByZXByb2R1Y2libGUgKi8KKworCQlmb3IgKGludDY0IGkgPSBu IC0gMTsgaSA+IDA7IGktLSkKKwkJeworCQkJaW50NjQJCWssCisJCQkJCQl0bXA7CisKKwkJCXJu ZyBePSBybmcgPDwgMTM7CisJCQlybmcgXj0gcm5nID4+IDc7CisJCQlybmcgXj0gcm5nIDw8IDE3 OworCQkJayA9IChpbnQ2NCkgKHJuZyAlICh1aW50NjQpIChpICsgMSkpOworCQkJdG1wID0gb3Jk W2ldOworCQkJb3JkW2ldID0gb3JkW2tdOworCQkJb3JkW2tdID0gdG1wOworCQl9CisJfQorCisJ Y3ljX3Blcl9ucyA9IHByb2JlX2NhbGlicmF0ZSgpOworCisJUEdfVFJZKCk7CisJeworCQlmb3Ig KGludDY0IHIgPSAwOyByIDwgcm91bmRzOyByKyspCisJCXsKKwkJCXVpbnQ2NAkJdDAsCisJCQkJ CQl0MTsKKworCQkJdDAgPSBiZW5jaF9yZHRzYygpOworCQkJZm9yIChpbnQ2NCBpID0gMDsgaSA8 IG47IGkrKykKKwkJCXsKKwkJCQlpbnQ2NAkJaiA9IG9yZFtpXTsKKworCQkJCUJ1ZlRhYmxlSW5z ZXJ0KCZwdGFnW2pdLCBwaGFzaFtqXSwgYnVmaWRzW2pdKTsKKwkJCX0KKwkJCXQxID0gYmVuY2hf cmR0c2MoKTsKKwkJCWlucyArPSB0MSAtIHQwOworCisJCQl0MCA9IGJlbmNoX3JkdHNjKCk7CisJ CQlmb3IgKGludDY0IGkgPSAwOyBpIDwgbjsgaSsrKQorCQkJeworCQkJCWludDY0CQlqID0gb3Jk W2ldOworCisJCQkJc2luayArPSBCdWZUYWJsZUxvb2t1cCgmcHRhZ1tqXSwgcGhhc2hbal0pOwor CQkJfQorCQkJdDEgPSBiZW5jaF9yZHRzYygpOworCQkJbGtoICs9IHQxIC0gdDA7CisKKwkJCXQw ID0gYmVuY2hfcmR0c2MoKTsKKwkJCWZvciAoaW50NjQgaSA9IDA7IGkgPCBuOyBpKyspCisJCQl7 CisJCQkJaW50NjQJCWogPSBvcmRbaV07CisKKwkJCQlzaW5rICs9IEJ1ZlRhYmxlTG9va3VwKCZh dGFnW2pdLCBhaGFzaFtqXSk7CisJCQl9CisJCQl0MSA9IGJlbmNoX3JkdHNjKCk7CisJCQlsa20g Kz0gdDEgLSB0MDsKKworCQkJdDAgPSBiZW5jaF9yZHRzYygpOworCQkJZm9yIChpbnQ2NCBpID0g MDsgaSA8IG47IGkrKykKKwkJCXsKKwkJCQlpbnQ2NAkJaiA9IG9yZFtpXTsKKworCQkJCUJ1ZlRh YmxlRGVsZXRlKCZwdGFnW2pdLCBwaGFzaFtqXSk7CisJCQl9CisJCQl0MSA9IGJlbmNoX3JkdHNj KCk7CisJCQlkZWwgKz0gdDEgLSB0MDsKKwkJfQorCX0KKwlQR19DQVRDSCgpOworCXsKKwkJLyog YmVzdC1lZmZvcnQgcmVzdG9yZTogcmVtb3ZlIGFueSBwcmVzZW50IHRhZyBzdGlsbCBtYXBwZWQg Ki8KKwkJZm9yIChpbnQ2NCBqID0gMDsgaiA8IG47IGorKykKKwkJCWlmIChCdWZUYWJsZUxvb2t1 cCgmcHRhZ1tqXSwgcGhhc2hbal0pID49IDApCisJCQkJQnVmVGFibGVEZWxldGUoJnB0YWdbal0s IHBoYXNoW2pdKTsKKwkJUEdfUkVfVEhST1coKTsKKwl9CisJUEdfRU5EX1RSWSgpOworCisJZGVu b20gPSAoZG91YmxlKSBuICogKGRvdWJsZSkgcm91bmRzICogY3ljX3Blcl9uczsKKwlhdmdbMF0g PSBpbnMgLyBkZW5vbTsKKwlhdmdbMV0gPSBsa2ggLyBkZW5vbTsKKwlhdmdbMl0gPSBsa20gLyBk ZW5vbTsKKwlhdmdbM10gPSBkZWwgLyBkZW5vbTsKKworCWZvciAoaW50IGkgPSAwOyBpIDwgNDsg aSsrKQorCXsKKwkJRGF0dW0JCXZhbHVlc1tCVUZUQUJMRV9CRU5DSF9QUk9CRV9DT0xTXTsKKwkJ Ym9vbAkJbnVsbHNbQlVGVEFCTEVfQkVOQ0hfUFJPQkVfQ09MU10gPSB7MH07CisKKwkJdmFsdWVz WzBdID0gQ1N0cmluZ0dldFRleHREYXR1bShuYW1lc1tpXSk7CisJCXZhbHVlc1sxXSA9IEZsb2F0 OEdldERhdHVtKGF2Z1tpXSk7CisJCXZhbHVlc1syXSA9IEludDY0R2V0RGF0dW0obiAqIHJvdW5k cyk7CisJCXR1cGxlc3RvcmVfcHV0dmFsdWVzKHJzaW5mby0+c2V0UmVzdWx0LCByc2luZm8tPnNl dERlc2MsIHZhbHVlcywgbnVsbHMpOworCX0KKworCSh2b2lkKSBzaW5rOworCXJldHVybiAoRGF0 dW0pIDA7Cit9CmRpZmYgLS1naXQgYS9idWZ0YWJsZV9iZW5jaC9pbnN0cnVtZW50YXRpb24vYnVm dGFibGVfYmVuY2hfbW9kdWxlL2J1ZnRhYmxlX2JlbmNoLmNvbnRyb2wgYi9idWZ0YWJsZV9iZW5j aC9pbnN0cnVtZW50YXRpb24vYnVmdGFibGVfYmVuY2hfbW9kdWxlL2J1ZnRhYmxlX2JlbmNoLmNv bnRyb2wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLmFhZTZjYjE4MTBm Ci0tLSAvZGV2L251bGwKKysrIGIvYnVmdGFibGVfYmVuY2gvaW5zdHJ1bWVudGF0aW9uL2J1ZnRh YmxlX2JlbmNoX21vZHVsZS9idWZ0YWJsZV9iZW5jaC5jb250cm9sCkBAIC0wLDAgKzEsNCBAQAor Y29tbWVudCA9ICdyZHRzYyBtaWNyby1iZW5jaG1hcmsgZm9yIHRoZSBzaGFyZWQgYnVmZmVyIG1h cHBpbmcgdGFibGUnCitkZWZhdWx0X3ZlcnNpb24gPSAnMS4wJworbW9kdWxlX3BhdGhuYW1lID0g JyRsaWJkaXIvYnVmdGFibGVfYmVuY2gnCityZWxvY2F0YWJsZSA9IHRydWUKZGlmZiAtLWdpdCBh L2J1ZnRhYmxlX2JlbmNoL2luc3RydW1lbnRhdGlvbi9idWZ0YWJsZV9iZW5jaF9tb2R1bGUvbWVz b24uYnVpbGQgYi9idWZ0YWJsZV9iZW5jaC9pbnN0cnVtZW50YXRpb24vYnVmdGFibGVfYmVuY2hf bW9kdWxlL21lc29uLmJ1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAw Li43NTI3NzM4NDFiMgotLS0gL2Rldi9udWxsCisrKyBiL2J1ZnRhYmxlX2JlbmNoL2luc3RydW1l bnRhdGlvbi9idWZ0YWJsZV9iZW5jaF9tb2R1bGUvbWVzb24uYnVpbGQKQEAgLTAsMCArMSwyMiBA QAorIyBDb3B5cmlnaHQgKGMpIDIwMjQtMjAyNiwgUG9zdGdyZVNRTCBHbG9iYWwgRGV2ZWxvcG1l bnQgR3JvdXAKKworYnVmdGFibGVfYmVuY2hfc291cmNlcyA9IGZpbGVzKAorICAnYnVmdGFibGVf YmVuY2guYycsCispCisKK2lmIGhvc3Rfc3lzdGVtID09ICd3aW5kb3dzJworICBidWZ0YWJsZV9i ZW5jaF9zb3VyY2VzICs9IHJjX2xpYl9nZW4ucHJvY2Vzcyh3aW4zMnZlcl9yYywgZXh0cmFfYXJn czogWworICAgICctLU5BTUUnLCAnYnVmdGFibGVfYmVuY2gnLAorICAgICctLUZJTEVERVNDJywg J2J1ZnRhYmxlX2JlbmNoIC0gcmR0c2MgbWljcm8tYmVuY2htYXJrIGZvciB0aGUgYnVmZmVyIG1h cHBpbmcgdGFibGUnLF0pCitlbmRpZgorCitidWZ0YWJsZV9iZW5jaCA9IHNoYXJlZF9tb2R1bGUo J2J1ZnRhYmxlX2JlbmNoJywKKyAgYnVmdGFibGVfYmVuY2hfc291cmNlcywKKyAga3dhcmdzOiBw Z190ZXN0X21vZF9hcmdzLAorKQordGVzdF9pbnN0YWxsX2xpYnMgKz0gYnVmdGFibGVfYmVuY2gK KwordGVzdF9pbnN0YWxsX2RhdGEgKz0gZmlsZXMoCisgICdidWZ0YWJsZV9iZW5jaC5jb250cm9s JywKKyAgJ2J1ZnRhYmxlX2JlbmNoLS0xLjAuc3FsJywKKykKZGlmZiAtLWdpdCBhL2J1ZnRhYmxl X2JlbmNoL3Jlc3VsdHMvY29tcGFyZV9wcm9iZS5yZXN1bHRzLnR4dCBiL2J1ZnRhYmxlX2JlbmNo L3Jlc3VsdHMvY29tcGFyZV9wcm9iZS5yZXN1bHRzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NApp bmRleCAwMDAwMDAwMDAwMC4uYzU1OTAzMTMyYjgKLS0tIC9kZXYvbnVsbAorKysgYi9idWZ0YWJs ZV9iZW5jaC9yZXN1bHRzL2NvbXBhcmVfcHJvYmUucmVzdWx0cy50eHQKQEAgLTAsMCArMSwyNCBA QAorUkVTVUxUIGR5bmEgMjU2TUIgaW5zZXJ0IDI4Ljk5NSAyNjIxNDAKK1JFU1VMVCBkeW5hIDI1 Nk1CIGxvb2t1cF9oaXQgMjEuMTM0IDI2MjE0MAorUkVTVUxUIGR5bmEgMjU2TUIgbG9va3VwX21p c3MgMjEuMjU3IDI2MjE0MAorUkVTVUxUIGR5bmEgMjU2TUIgZGVsZXRlIDIxLjc5OCAyNjIxNDAK K1JFU1VMVCBmbGF0IDI1Nk1CIGluc2VydCAxMy4yNDUgMjYyMTQwCitSRVNVTFQgZmxhdCAyNTZN QiBsb29rdXBfaGl0IDE2LjIyMiAyNjIxNDAKK1JFU1VMVCBmbGF0IDI1Nk1CIGxvb2t1cF9taXNz IDE3LjQ5OCAyNjIxNDAKK1JFU1VMVCBmbGF0IDI1Nk1CIGRlbGV0ZSAxNy44MDUgMjYyMTQwCitS RVNVTFQgZHluYSA0R0IgaW5zZXJ0IDY2Ljg0NSA0MTk0MzAwCitSRVNVTFQgZHluYSA0R0IgbG9v a3VwX2hpdCA0OS42NzMgNDE5NDMwMAorUkVTVUxUIGR5bmEgNEdCIGxvb2t1cF9taXNzIDM5Ljgy NSA0MTk0MzAwCitSRVNVTFQgZHluYSA0R0IgZGVsZXRlIDU2LjcwNCA0MTk0MzAwCitSRVNVTFQg ZmxhdCA0R0IgaW5zZXJ0IDMwLjUwNiA0MTk0MzAwCitSRVNVTFQgZmxhdCA0R0IgbG9va3VwX2hp dCAzMS43MTcgNDE5NDMwMAorUkVTVUxUIGZsYXQgNEdCIGxvb2t1cF9taXNzIDI4Ljc4NiA0MTk0 MzAwCitSRVNVTFQgZmxhdCA0R0IgZGVsZXRlIDM0Ljk3MSA0MTk0MzAwCitSRVNVTFQgZHluYSAx NkdCIGluc2VydCAxMDQuMzAwIDE2Nzc3MjEwCitSRVNVTFQgZHluYSAxNkdCIGxvb2t1cF9oaXQg ODIuMDc0IDE2Nzc3MjEwCitSRVNVTFQgZHluYSAxNkdCIGxvb2t1cF9taXNzIDYyLjA2OSAxNjc3 NzIxMAorUkVTVUxUIGR5bmEgMTZHQiBkZWxldGUgODguNjM5IDE2Nzc3MjEwCitSRVNVTFQgZmxh dCAxNkdCIGluc2VydCA1NS4wNjggMTY3NzcyMTAKK1JFU1VMVCBmbGF0IDE2R0IgbG9va3VwX2hp dCA2Mi45NDIgMTY3NzcyMTAKK1JFU1VMVCBmbGF0IDE2R0IgbG9va3VwX21pc3MgNDcuMjYwIDE2 Nzc3MjEwCitSRVNVTFQgZmxhdCAxNkdCIGRlbGV0ZSA2OS4zMDggMTY3NzcyMTAKZGlmZiAtLWdp dCBhL2J1ZnRhYmxlX2JlbmNoL3Jlc3VsdHMvcHJvYmVfc3VtbWFyeS50eHQgYi9idWZ0YWJsZV9i ZW5jaC9yZXN1bHRzL3Byb2JlX3N1bW1hcnkudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4 IDAwMDAwMDAwMDAwLi5hNmFjOWJhODU1ZAotLS0gL2Rldi9udWxsCisrKyBiL2J1ZnRhYmxlX2Jl bmNoL3Jlc3VsdHMvcHJvYmVfc3VtbWFyeS50eHQKQEAgLTAsMCArMSwyOSBAQAorIyBQb2xsdXRp b24tZnJlZSBpbi1wbGFjZSBBL0Igb2YgdGhlIFJFQUwgc2hhcmVkIGJ1ZmZlciBtYXBwaW5nIHRh YmxlLgorIyBidWZ0YWJsZV9iZW5jaF9wcm9iZShuLCByb3VuZHMsIHJhbmRvbSk6IGRpcmVjdCBC dWZUYWJsZXtJbnNlcnQsTG9va3VwLERlbGV0ZX0KKyMgY2FsbHMsIGJ1bGstdGltZWQgKG9uZSBy ZHRzYyBwYWlyIHBlciBwaGFzZSksIE5PIFJlYWRCdWZmZXIvcGFnZS1jb3B5LCBOTworIyBwZXIt b3AgcmR0c2MuICByYW5kb209dHJ1ZSAoREVGQVVMVCk6IGtleXMgdmlzaXRlZCBpbiBhIHNodWZm bGVkIG9yZGVyIHNvIHRoZQorIyBidWNrZXQgQU5EIGVudHJ5L2VsZW1lbnQgYWNjZXNzZXMgYXJl IHJhbmRvbSBmb3IgYm90aCBhcm1zLgorIyBzcGVlZHVwID0gZHluYWhhc2gvZmxhdCAoPjEgPSBm bGF0IGZhc3RlcikuIG4gfiAwLjgqTkJ1ZmZlcnMsIHJvdW5kcz0xMC4KKyMKKyMgPT09IFJBTkRP TSBhY2Nlc3MgKGRlZmF1bHQpID09PQorIyBzYiAgICAgb3AgICAgICAgICAgICBkeW5haGFzaF9u cyAgZmxhdF9ucyAgc3BlZWR1cAorIyAyNTZNQiAgaW5zZXJ0ICAgICAgICAgICAgMjguOTkgICAg IDEzLjI1ICAgIDIuMTl4CisjIDI1Nk1CICBsb29rdXBfaGl0ICAgICAgICAyMS4xMyAgICAgMTYu MjIgICAgMS4zMHgKKyMgMjU2TUIgIGxvb2t1cF9taXNzICAgICAgIDIxLjI2ICAgICAxNy41MCAg ICAxLjIxeAorIyAyNTZNQiAgZGVsZXRlICAgICAgICAgICAgMjEuODAgICAgIDE3LjgxICAgIDEu MjJ4CisjIDRHQiAgICBpbnNlcnQgICAgICAgICAgICA2Ni44NSAgICAgMzAuNTEgICAgMi4xOXgK KyMgNEdCICAgIGxvb2t1cF9oaXQgICAgICAgIDQ5LjY3ICAgICAzMS43MiAgICAxLjU3eAorIyA0 R0IgICAgbG9va3VwX21pc3MgICAgICAgMzkuODMgICAgIDI4Ljc5ICAgIDEuMzh4CisjIDRHQiAg ICBkZWxldGUgICAgICAgICAgICA1Ni43MCAgICAgMzQuOTcgICAgMS42MngKKyMgMTZHQiAgIGlu c2VydCAgICAgICAgICAgMTA0LjMwICAgICA1NS4wNyAgICAxLjg5eAorIyAxNkdCICAgbG9va3Vw X2hpdCAgICAgICAgODIuMDcgICAgIDYyLjk0ICAgIDEuMzB4CisjIDE2R0IgICBsb29rdXBfbWlz cyAgICAgICA2Mi4wNyAgICAgNDcuMjYgICAgMS4zMXgKKyMgMTZHQiAgIGRlbGV0ZSAgICAgICAg ICAgIDg4LjY0ICAgICA2OS4zMSAgICAxLjI4eAorIworIyBGbGF0IGlzIEZBU1RFUiBvbiBFVkVS WSBvcCBhdCBFVkVSWSBzaXplICgxLjItMi4yeCkuIFJhbmRvbSBhY2Nlc3MgcmFpc2VzCisjIGFi c29sdXRlIG5zIGFuZCBjb21wcmVzc2VzIHRoZSByYXRpbyB2cyBzZXF1ZW50aWFsIChhIGNvbW1v bi1tb2RlIGtleS1mZXRjaAorIyBjb3N0LCBlcXVhbCBmb3IgYm90aCBhcm1zKSAtLSB0aGUgbW9y ZSBjb25zZXJ2YXRpdmUsIHJlYWxpc3RpYyBudW1iZXIuCisjCisjIEZvciByZWZlcmVuY2UsIHRo ZSBlYXJsaWVyIFNFUVVFTlRJQUwgb3JkZXIgKHJhbmRvbT1mYWxzZSkgZ2F2ZSBsYXJnZXIgcmF0 aW9zOgorIyAgIGluc2VydCAyLjQvMi44LzMuNXgsIGxvb2t1cF9oaXQgMS42LzEuNy8yLjN4LCBs b29rdXBfbWlzcyAxLjMvMS4zLzEuN3gsCisjICAgZGVsZXRlIDEuNC8xLjYvMi4yeCBAMjU2TUIv NEdCLzE2R0IgKGVudHJ5L2VsZW1lbnQgYWNjZXNzIHdhcyBwcmVmZXRjaC1mcmllbmRseSkuCmRp ZmYgLS1naXQgYS9idWZ0YWJsZV9iZW5jaC9ydW4uc2ggYi9idWZ0YWJsZV9iZW5jaC9ydW4uc2gK bmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMDAwMDAuLjVhYzM4ODAxODYzCi0tLSAv ZGV2L251bGwKKysrIGIvYnVmdGFibGVfYmVuY2gvcnVuLnNoCkBAIC0wLDAgKzEsOTcgQEAKKyMh L3Vzci9iaW4vZW52IGJhc2gKKyMKKyMgcnVuLnNoIFtzaXplIC4uLl0KKyMKKyMgQnVpbGQgdGhl IENVUlJFTlRMWSBDSEVDS0VELU9VVCBCUkFOQ0ggb2YgdGhpcyByZXBvIChpdHMgSEVBRCkgYXMg YSByZWxlYXNlLAorIyB0aGVuIHJ1biB0aGUgYnVmZmVyLW1hcHBpbmctdGFibGUgcHJvYmUgYW5k IHByaW50IHRoZSBwZXItb3AgbnVtYmVycyBmb3IgaXQuCisjIFNpbmdsZSBhcm0gKGp1c3QgdGhp cyBicmFuY2gncyBidWZfdGFibGUuYykg4oCUIGZvciB0aGUgZmxhdC12cy1keW5haGFzaCBBL0IK KyMgdXNlIHNjcmlwdHMvY29tcGFyZV9wcm9iZS5zaC4KKyMKKyMgVGhlIGJ1aWxkIGlzIGNhY2hl ZCBwZXIgY29tbWl0IHVuZGVyIGJ1ZnRhYmxlX2JlbmNoLy5idWlsZHMvPGNvbW1pdD4sIHNvIHRo ZQorIyBmaXJzdCBydW4gZm9yIGEgY29tbWl0IHRha2VzIGEgZmV3IG1pbnV0ZXMgYW5kIGxhdGVy IHJ1bnMgYXJlIGluc3RhbnQuCisjIEl0IGV4cG9ydHMgdGhlIGNvbW1pdHRlZCB0cmVlIChnaXQg YXJjaGl2ZSkgaW50byBhIHRlbXAgZGlyIHRvIGJ1aWxkLCBzbyB5b3VyCisjIHdvcmtpbmcgY2hl Y2tvdXQgaXMgbmV2ZXIgdG91Y2hlZC4KKyMKKyMgRW52OiBQR19DT05GSUcgKHVzZSB0aGlzIHBy ZWJ1aWx0IGluc3RhbGwgaW5zdGVhZCBvZiBidWlsZGluZyksCisjICAgICAgQlVGVEFCTEVfUFJP QkVfUk9VTkRTIChkZWZhdWx0IDEwKSwgQlVGVEFCTEVfQkVOQ0hfV09SSy4KK3NldCAtZXVvIHBp cGVmYWlsCisKK0hFUkU9IiQoY2QgIiQoZGlybmFtZSAiJHtCQVNIX1NPVVJDRVswXX0iKSIgJiYg cHdkKSIKK01PRFNSQz0iJEhFUkUvaW5zdHJ1bWVudGF0aW9uL2J1ZnRhYmxlX2JlbmNoX21vZHVs ZSIKK1dPUks9IiR7QlVGVEFCTEVfQkVOQ0hfV09SSzotJEhFUkUvX3dvcmt9IjsgbWtkaXIgLXAg IiRXT1JLIgorUk9VTkRTPSIke0JVRlRBQkxFX1BST0JFX1JPVU5EUzotMTB9IgorU0laRVM9IiR7 KjotMUdCfSIKKworcmVwbz0iJChnaXQgLUMgIiRIRVJFIiByZXYtcGFyc2UgLS1zaG93LXRvcGxl dmVsKSIKK2NvbW1pdD0iJChnaXQgLUMgIiRyZXBvIiByZXYtcGFyc2UgLS1zaG9ydCBIRUFEKSIK K2JyYW5jaD0iJChnaXQgLUMgIiRyZXBvIiByZXYtcGFyc2UgLS1hYmJyZXYtcmVmIEhFQUQpIgor bGFiZWw9IiRicmFuY2hAJGNvbW1pdCIKKworIyAtLS0tIGxvY2F0ZSBvciBidWlsZCBhIHJlbGVh c2UgaW5zdGFsbCBvZiB0aGUgY3VycmVudCBIRUFEIC0tLS0tLS0tLS0tLS0tLS0tLQoraWYgW1sg LW4gIiR7UEdfQ09ORklHOi19IiBdXTsgdGhlbgorCUJJTj0iJCgiJFBHX0NPTkZJRyIgLS1iaW5k aXIpIgorCWVjaG8gIj09PiB1c2luZyBQR19DT05GSUcgYnVpbGQ6ICQoIiRQR19DT05GSUciIC0t dmVyc2lvbikgWyRCSU5dIiA+JjIKK2Vsc2UKKwlwcmVmaXg9IiRIRVJFLy5idWlsZHMvJGNvbW1p dCIKKwlpZiBbWyAteCAiJHByZWZpeC9iaW4vcGdfY29uZmlnIiBdXSAmJiBcCisJICAgW1sgLWUg IiQoIiRwcmVmaXgvYmluL3BnX2NvbmZpZyIgLS1wa2dsaWJkaXIpL2J1ZnRhYmxlX2JlbmNoLnNv IiBdXTsgdGhlbgorCQllY2hvICI9PT4gcmV1c2luZyBjYWNoZWQgcmVsZWFzZSBidWlsZCBvZiAk bGFiZWwgIFskcHJlZml4XSIgPiYyCisJZWxzZQorCQllY2hvICI9PT4gYnVpbGRpbmcgJGxhYmVs IGFzIHJlbGVhc2UgKGZpcnN0IHJ1biBmb3IgdGhpcyBjb21taXQsIH4yLTQgbWluKS4uLiIgPiYy CisJCXNyYz0iJChta3RlbXAgLWQgIiRXT1JLL3NyYy4kY29tbWl0LlhYWFgiKSIKKwkJZ2l0IC1D ICIkcmVwbyIgYXJjaGl2ZSBIRUFEIHwgdGFyIC14IC1DICIkc3JjIgorCQlta2RpciAtcCAiJHNy Yy9zcmMvdGVzdC9tb2R1bGVzL2J1ZnRhYmxlX2JlbmNoIgorCQljcCAiJE1PRFNSQyIvKiAiJHNy Yy9zcmMvdGVzdC9tb2R1bGVzL2J1ZnRhYmxlX2JlbmNoIi8KKwkJKAorCQkJY2QgIiRzcmMiCisJ CQkuL2NvbmZpZ3VyZSAtLXByZWZpeD0iJHByZWZpeCIgLS13aXRob3V0LWljdSAtLXdpdGhvdXQt emxpYiAtLXdpdGhvdXQtcmVhZGxpbmUgPi9kZXYvbnVsbAorCQkJbWFrZSAtcyAtaiIkKG5wcm9j KSIgaW5zdGFsbCA+L2Rldi9udWxsCisJCQltYWtlIC1zIC1DIHNyYy90ZXN0L21vZHVsZXMvYnVm dGFibGVfYmVuY2ggaW5zdGFsbCA+L2Rldi9udWxsCisJCSkgfHwgeyBlY2hvICJidWlsZCBmYWls ZWQ7IHNlZSAkc3JjIiA+JjI7IGV4aXQgMTsgfQorCQlybSAtcmYgIiRzcmMiCisJCWVjaG8gIj09 PiBidWlsdCAkbGFiZWwiID4mMgorCWZpCisJQklOPSIkcHJlZml4L2JpbiIKK2ZpCisKKyMgLS0t LSBydW4gdGhlIHByb2JlIHBlciBzaXplIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0KK3NpemVfdG9fYnl0ZXMoKSB7CisJbG9jYWwgcz0iJHsxXl59Igor CWNhc2UgIiRzIiBpbgorCQkqR0IpIGVjaG8gJCgoICR7cyVHQn0gKiAxMDI0ICogMTAyNCAqIDEw MjQgKSk7OworCQkqTUIpIGVjaG8gJCgoICR7cyVNQn0gKiAxMDI0ICogMTAyNCApKTs7CisJCSpL QikgZWNobyAkKCggJHtzJUtCfSAqIDEwMjQgKSk7OworCQkqKSAgIGVjaG8gIiRzIjs7CisJZXNh YworfQorCitlY2hvCitlY2hvICI9PT09PSBidWZ0YWJsZV9iZW5jaDogJGxhYmVsIChyYW5kb20g YWNjZXNzLCByb3VuZHM9JFJPVU5EUykgPT09PT0iCitmb3IgU0laRSBpbiAkU0laRVM7IGRvCisJ REFUQURJUj0iJChta3RlbXAgLWQgIiRXT1JLL3BnZGF0YS4ke1NJWkV9LlhYWFgiKSIKKwlTT0NL RElSPSIkKG1rdGVtcCAtZCAvdG1wL3BnYi5YWFhYWFgpIgorCU49IiQoYXdrIC12IGI9IiQoc2l6 ZV90b19ieXRlcyAiJFNJWkUiKSIgJ0JFR0lOe3ByaW50ZiAiJWQiLCAwLjgqYi84MTkyfScpIgor CisJIiRCSU4vaW5pdGRiIiAtRCAiJERBVEFESVIiIC0tbm8tc3luYyAtQSB0cnVzdCA+L2Rldi9u dWxsIDI+JjEKKwljYXQgPj4gIiREQVRBRElSL3Bvc3RncmVzcWwuY29uZiIgPDxDT05GCitzaGFy ZWRfYnVmZmVycyA9ICckU0laRScKK2ppdCA9IG9mZgorYXV0b3ZhY3V1bSA9IG9mZgorZnN5bmMg PSBvZmYKK2Jnd3JpdGVyX2xydV9tYXhwYWdlcyA9IDAKK2xpc3Rlbl9hZGRyZXNzZXMgPSAnJwor dW5peF9zb2NrZXRfZGlyZWN0b3JpZXMgPSAnJFNPQ0tESVInCitDT05GCisJIiRCSU4vcGdfY3Rs IiAtRCAiJERBVEFESVIiIC1sICIkREFUQURJUi9sb2ciIC13IHN0YXJ0ID4vZGV2L251bGwKKwor CWVjaG8gIi0tIHNoYXJlZF9idWZmZXJzPSRTSVpFICAobj0kTiBrZXlzKSAtLSIKKwkiJEJJTi9w c3FsIiAtaCAiJFNPQ0tESVIiIC1kIHBvc3RncmVzIC1xIC1QIHBhZ2VyPW9mZiBcCisJCS1jICJD UkVBVEUgRVhURU5TSU9OIGJ1ZnRhYmxlX2JlbmNoOyIgXAorCQktYyAiU0VMRUNUIG9wLCByb3Vu ZChhdmdfbnM6Om51bWVyaWMsMykgQVMgYXZnX25zLCBjb3VudAorCQkgICAgRlJPTSBidWZ0YWJs ZV9iZW5jaF9wcm9iZSgkTiwgJFJPVU5EUykKKwkJICAgIE9SREVSIEJZIGFycmF5X3Bvc2l0aW9u KEFSUkFZWydpbnNlcnQnLCdsb29rdXBfaGl0JywnbG9va3VwX21pc3MnLCdkZWxldGUnXSwgb3Ap OyIKKworCSIkQklOL3BnX2N0bCIgLUQgIiREQVRBRElSIiAtbSBpbW1lZGlhdGUgc3RvcCA+L2Rl di9udWxsIDI+JjEgfHwgdHJ1ZQorCXJtIC1yZiAiJERBVEFESVIiICIkU09DS0RJUiIKK2RvbmUK K2VjaG8gIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT0iCmRpZmYgLS1naXQgYS9idWZ0YWJsZV9iZW5jaC9zY3JpcHRzL2JlbmNo X3Byb2JlLnNoIGIvYnVmdGFibGVfYmVuY2gvc2NyaXB0cy9iZW5jaF9wcm9iZS5zaApuZXcgZmls ZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwMDAwMC4uZmRlNjE5OTExYjIKLS0tIC9kZXYvbnVs bAorKysgYi9idWZ0YWJsZV9iZW5jaC9zY3JpcHRzL2JlbmNoX3Byb2JlLnNoCkBAIC0wLDAgKzEs NjMgQEAKKyMhL3Vzci9iaW4vZW52IGJhc2gKKyMKKyMgYmVuY2hfcHJvYmUuc2ggPHBnX2luc3Rh bGxfcHJlZml4PiA8c2hhcmVkX2J1ZmZlcnNfc2l6ZT4KKyMKKyMgUG9sbHV0aW9uLWZyZWUsIGlu LXBsYWNlIGJlbmNobWFyayBvZiB0aGUgUkVBTCBzaGFyZWQgYnVmZmVyIG1hcHBpbmcgdGFibGUg Zm9yCisjIGxvb2t1cCAoaGl0K21pc3MpLCBpbnNlcnQsIGFuZCBkZWxldGUsIHZpYSBidWZ0YWJs ZV9iZW5jaF9wcm9iZSgpIOKAlCB3aGljaCBjYWxscworIyBCdWZUYWJsZXtJbnNlcnQsTG9va3Vw LERlbGV0ZX0gZGlyZWN0bHkgKG5vIFJlYWRCdWZmZXIsIG5vIDggS0IgcGFnZSBjb3B5LCBubwor IyBwZXItb3AgcmR0c2M7IGVhY2ggb3AncyBsb29wIGlzIGJ1bGstdGltZWQpLiAgTm8gdGFibGUv cHJld2FybSBuZWVkZWQ6IGl0IHVzZXMKKyMgZnJlZSBidWZmZXIgc2xvdHMgKyBzeW50aGV0aWMg dGFncyBhbmQgcmVzdG9yZXMgdGhlIHRhYmxlIGFmdGVyd2FyZC4KKyMKKyMgRW1pdHMgIlJFU1VM VCA8YXJtPiA8c2l6ZT4gPG9wPiA8YXZnX25zPiA8Y291bnQ+Ii4KKyMgRW52OiBCVUZUQUJMRV9Q Uk9CRV9ST1VORFMgKGRlZmF1bHQgMTApLgorc2V0IC1ldW8gcGlwZWZhaWwKKworUFJFRklYPSIk ezE6P3VzYWdlOiBiZW5jaF9wcm9iZS5zaCA8cHJlZml4PiA8c2l6ZT59IgorU0laRT0iJHsyOj91 c2FnZTogYmVuY2hfcHJvYmUuc2ggPHByZWZpeD4gPHNpemU+fSIKK1JPVU5EUz0iJHtCVUZUQUJM RV9QUk9CRV9ST1VORFM6LTEwfSIKK0FSTT0iJChiYXNlbmFtZSAiJFBSRUZJWCIpIgorQklOPSIk UFJFRklYL2JpbiIKKworSEVSRT0iJChjZCAiJChkaXJuYW1lICIke0JBU0hfU09VUkNFWzBdfSIp IiAmJiBwd2QpIgorU0NSQVRDSD0iJHtCVUZUQUJMRV9CRU5DSF9XT1JLOi0kSEVSRS9fd29ya30i OyBta2RpciAtcCAiJFNDUkFUQ0giCitEQVRBRElSPSIkKG1rdGVtcCAtZCAiJFNDUkFUQ0gvcGdk YXRhLiR7QVJNfS4ke1NJWkV9LnByLlhYWFgiKSIKK1NPQ0tESVI9IiQobWt0ZW1wIC1kIC90bXAv cGdiLlhYWFhYWCkiCitMT0c9IiREQVRBRElSL3NlcnZlci5sb2ciCisKK2xvZygpIHsgZWNobyAi WyRBUk0gJFNJWkUgcHJvYmVdICQqIiA+JjI7IH0KK2NsZWFudXAoKSB7ICIkQklOL3BnX2N0bCIg LUQgIiREQVRBRElSIiAtbSBpbW1lZGlhdGUgc3RvcCA+L2Rldi9udWxsIDI+JjEgfHwgdHJ1ZTsg cm0gLXJmICIkREFUQURJUiIgIiRTT0NLRElSIjsgfQordHJhcCBjbGVhbnVwIEVYSVQKKworc2l6 ZV90b19ieXRlcygpIHsKKwlsb2NhbCBzPSIkezFeXn0iCisJY2FzZSAiJHMiIGluCisJCSpHQikg ZWNobyAkKCggJHtzJUdCfSAqIDEwMjQgKiAxMDI0ICogMTAyNCApKTs7CisJCSpNQikgZWNobyAk KCggJHtzJU1CfSAqIDEwMjQgKiAxMDI0ICkpOzsKKwkJKikgICBlY2hvICIkcyI7OworCWVzYWMK K30KK1NCPSIkKHNpemVfdG9fYnl0ZXMgIiRTSVpFIikiCitOPSIkKGF3ayAtdiBiPSIkU0IiICdC RUdJTntwcmludGYgIiVkIiwgMC44KmIvODE5Mn0nKSIgICAjIH4wLjh4IE5CdWZmZXJzIC0+IGxv YWQgZmFjdG9yIH4xCisKKyIkQklOL2luaXRkYiIgLUQgIiREQVRBRElSIiAtLW5vLXN5bmMgLUEg dHJ1c3QgPi9kZXYvbnVsbCAyPiYxCitjYXQgPj4gIiREQVRBRElSL3Bvc3RncmVzcWwuY29uZiIg PDxDT05GCitzaGFyZWRfYnVmZmVycyA9ICckU0laRScKK2ppdCA9IG9mZgorYXV0b3ZhY3V1bSA9 IG9mZgorZnN5bmMgPSBvZmYKK2Jnd3JpdGVyX2xydV9tYXhwYWdlcyA9IDAKK2xpc3Rlbl9hZGRy ZXNzZXMgPSAnJwordW5peF9zb2NrZXRfZGlyZWN0b3JpZXMgPSAnJFNPQ0tESVInCitDT05GCisK K2xvZyAic3RhcnQgKHNoYXJlZF9idWZmZXJzPSRTSVpFLCBuPSROLCByb3VuZHM9JFJPVU5EUyki CisiJEJJTi9wZ19jdGwiIC1EICIkREFUQURJUiIgLWwgIiRMT0ciIC13IHN0YXJ0ID4vZGV2L251 bGwKKworT1VUPSIkKCIkQklOL3BzcWwiIC1oICIkU09DS0RJUiIgLWQgcG9zdGdyZXMgLXEgLVgg LUF0IC1GJyAnIC12IE9OX0VSUk9SX1NUT1A9MSBcCisJLWMgIkNSRUFURSBFWFRFTlNJT04gYnVm dGFibGVfYmVuY2g7IiBcCisJLWMgIlNFTEVDVCAnUicsIG9wLCByb3VuZChhdmdfbnM6Om51bWVy aWMsMyksIGNvdW50IEZST00gYnVmdGFibGVfYmVuY2hfcHJvYmUoJE4sICRST1VORFMpOyIgMj4m MSkiIHx8IHsKKwlsb2cgInBzcWwgZmFpbGVkOiI7IGVjaG8gIiRPVVQiID4mMjsgZXhpdCAxOwor fQorCitlY2hvICIkT1VUIiB8IGF3ayAtdiBhcm09IiRBUk0iIC12IHN6PSIkU0laRSIgJyQxPT0i UiJ7cHJpbnRmICJSRVNVTFQgJXMgJXMgJXMgJXMgJXNcbiIsIGFybSwgc3osICQyLCAkMywgJDR9 JworbG9nICJkb25lIgpkaWZmIC0tZ2l0IGEvYnVmdGFibGVfYmVuY2gvc2NyaXB0cy9jb21wYXJl X3Byb2JlLnNoIGIvYnVmdGFibGVfYmVuY2gvc2NyaXB0cy9jb21wYXJlX3Byb2JlLnNoCm5ldyBm aWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAwMDAwLi5mZTk4YThhYjE0OQotLS0gL2Rldi9u dWxsCisrKyBiL2J1ZnRhYmxlX2JlbmNoL3NjcmlwdHMvY29tcGFyZV9wcm9iZS5zaApAQCAtMCww ICsxLDQ0IEBACisjIS91c3IvYmluL2VudiBiYXNoCisjCisjIGNvbXBhcmVfcHJvYmUuc2ggW3Np emUgLi4uXQorIworIyBQb2xsdXRpb24tZnJlZSBpbi1wbGFjZSBBL0Igb2YgdGhlIHNoYXJlZCBi dWZmZXIgbWFwcGluZyB0YWJsZSBmb3IgYWxsIHRocmVlCisjIG9wcyAoaW5zZXJ0IC8gbG9va3Vw X2hpdCAvIGxvb2t1cF9taXNzIC8gZGVsZXRlKSwgdmlhIGJ1ZnRhYmxlX2JlbmNoX3Byb2JlKCku CisjIFByaW50cywgcGVyIHNpemUsIGR5bmFoYXNoIHZzIGZsYXQgYXZnX25zIGFuZCBzcGVlZHVw ID0gZHluYWhhc2gvZmxhdCAoPjEgPQorIyBmbGF0IGZhc3RlcikuICBTaXplcyBkZWZhdWx0ICIy NTZNQiA0R0IgMTZHQiIgb3IgJEJVRlRBQkxFX0NBUElfU0laRVMgb3IgYXJncy4KK3NldCAtZXVv IHBpcGVmYWlsCisKK0hFUkU9IiQoY2QgIiQoZGlybmFtZSAiJHtCQVNIX1NPVVJDRVswXX0iKSIg JiYgcHdkKSIKK0JFTkNIPSIkSEVSRS9iZW5jaF9wcm9iZS5zaCIKK0ZMQVQ9L2hvbWUvZGhydXYu YXJvbi9wZy1iZW5jaC9mbGF0CitEWU5BPS9ob21lL2RocnV2LmFyb24vcGctYmVuY2gvZHluYQor U0NSQVRDSD0iJHtCVUZUQUJMRV9CRU5DSF9XT1JLOi0kSEVSRS9fd29ya30iOyBta2RpciAtcCAi JFNDUkFUQ0giCitSRVNVTFRTPSIkU0NSQVRDSC9jb21wYXJlX3Byb2JlLnJlc3VsdHMudHh0Ijsg OiA+ICIkUkVTVUxUUyIKKworaWYgW1sgJCMgLWd0IDAgXV07IHRoZW4gU0laRVM9IiQqIjsgZWxz ZSBTSVpFUz0iJHtCVUZUQUJMRV9DQVBJX1NJWkVTOi0yNTZNQiA0R0IgMTZHQn0iOyBmaQorCitm b3Igc2l6ZSBpbiAkU0laRVM7IGRvCisJZm9yIHByZWZpeCBpbiAiJERZTkEiICIkRkxBVCI7IGRv CisJCWVjaG8gIj4+PiAkKGJhc2VuYW1lICIkcHJlZml4IikgQCAkc2l6ZSIgPiYyCisJCWJhc2gg IiRCRU5DSCIgIiRwcmVmaXgiICIkc2l6ZSIgfCBncmVwICdeUkVTVUxUICcgPj4gIiRSRVNVTFRT IgorCWRvbmUKK2RvbmUKKworZWNobworZWNobyAiPT09PT0gcG9sbHV0aW9uLWZyZWUgZGlyZWN0 LXByb2JlIEEvQiAocmVhbCBzaGFyZWQgdGFibGUpID09PT09IgorYXdrICcKK3sgYXJtPSQyOyBz aXplPSQzOyBvcD0kNDsgdltzaXplLG9wLGFybV09JDU7IGNudFtzaXplLG9wLGFybV09JDY7Cisg IGlmKCEoc2l6ZSBpbiBzZWVuKSl7c2VlbltzaXplXT0xOyBvcmRlclsrK25pXT1zaXplfSB9CitF TkR7CisgIHNwbGl0KCJpbnNlcnQgbG9va3VwX2hpdCBsb29rdXBfbWlzcyBkZWxldGUiLCBvcHMs ICIgIik7CisgIGZvcihpPTE7aTw9bmk7aSsrKXsgcz1vcmRlcltpXTsKKyAgICBwcmludGYgIlxu PT09IHNoYXJlZF9idWZmZXJzID0gJXMgIChzYW1wbGVzL29wICVzKSA9PT1cbiIsIHMsIGNudFtz LCJpbnNlcnQiLCJmbGF0Il07CisgICAgcHJpbnRmICIlLTEycyAlMTJzICUxMnMgJTE0c1xuIiwi b3AiLCJkeW5haGFzaCBucyIsImZsYXQgbnMiLCJzcGVlZHVwKGRoL2Z0KSI7CisgICAgZm9yKGo9 MTtqPD00O2orKyl7IG89b3BzW2pdOworICAgICAgZGg9dltzLG8sImR5bmEiXTsgZnQ9dltzLG8s ImZsYXQiXTsKKyAgICAgIGlmKGRoPT0iInx8ZnQ9PSIiKXsgcHJpbnRmICIlLTEycyAlMTJzICUx MnMgJTE0c1xuIixvLChkaD09IiI/Ii0iOmRoKSwoZnQ9PSIiPyItIjpmdCksIm4vYSI7IGNvbnRp bnVlIH0KKyAgICAgIHByaW50ZiAiJS0xMnMgJTEyLjNmICUxMi4zZiAlMTMuMmZ4XG4iLCBvLCBk aCwgZnQsIChmdD4wP2RoL2Z0OjApOworICAgIH0KKyAgfQorfScgIiRSRVNVTFRTIgorZWNobyAi PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09Igo= --000000000000188dff065609bff8--