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.94.2) (envelope-from ) id 1vGS5W-00FQlo-Qg for pgsql-hackers@arkaria.postgresql.org; Wed, 05 Nov 2025 01:13:26 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1vGS5V-00HLtl-RU for pgsql-hackers@arkaria.postgresql.org; Wed, 05 Nov 2025 01:13:24 +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.94.2) (envelope-from ) id 1vGS5V-00HLtd-FL for pgsql-hackers@lists.postgresql.org; Wed, 05 Nov 2025 01:13:24 +0000 Received: from mail-ej1-x630.google.com ([2a00:1450:4864:20::630]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.96) (envelope-from ) id 1vGS5S-0061tX-08 for pgsql-hackers@postgresql.org; Wed, 05 Nov 2025 01:13:24 +0000 Received: by mail-ej1-x630.google.com with SMTP id a640c23a62f3a-b726997b121so18540966b.0 for ; Tue, 04 Nov 2025 17:13:21 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1762305201; x=1762910001; darn=postgresql.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=lsJt6HbQ+HCtC3kAXv1sV2xRwD2Olhwy9pcatAxeV44=; b=mBt7SnmlB3bgP4VbjveBCCs/IrKeKYnmLJvrEOfCJ7iteB4hVUJvXqp4O3iFrJLxDy 9wlmmcNf1NCSGudtANS0+np7F2BeamU1ML7e7K0xw9hQWyB8fhfioroDag+1VDQJxrlK 5nhnAljI9YORrEA7OXtM7Icd3O7ynlioyq0qKmlq4Y1iRt/Uue+Mapk2D/Q6n1EbV2j3 N2iz1rqtox2Tj0JMKjZfQmZ9/hhosSNdqAQymLGL4uMS1SHceUoQSHh2kf2vrYgWaJ8c dJSDGXwFgjMr9JuUzB6UBbwNvmwA/khb/y0a9ow1FvS8NngxcPffAByg3xZzgpzkdcoF JuZg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1762305201; x=1762910001; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=lsJt6HbQ+HCtC3kAXv1sV2xRwD2Olhwy9pcatAxeV44=; b=pdosB9QjUhMcMGt68zW73yvMGrDWHDMgDq1UF/5qcIobm0MobYeruyydFsLCRieW1e vdzlYkmRvJljXXfB3dQ0qkwjXPG/hc7OjvBE77kOJLCIKIt0JU2+az1aFCPhTp319noV C7L6f9Z/fPd/MZLgn49Y9Hy7G9iceZoRWUjI5CWMRctC4AISMgF22yYCuhQiNj1UrTRD V45zVDW5N7pzmQxBPsO+Svs9/mw3IRp+WRQloroiQixpHDtTAp67sgCMREolPSFcZh8y htMhwrCrVodOhLViyA+Rz34g4ryy5sVdjFt81ORMYLi//rBmEyShgyIdllzw19XJPQIH dOPw== X-Forwarded-Encrypted: i=1; AJvYcCXJt6ZaxY2FjKwtfjqLPkYAJukMEnr0vBegUAhfjpPF+ov+XCdOGX3qtgvrjAVECqPY/gi3NaRaL8iUNJcw@postgresql.org X-Gm-Message-State: AOJu0YzJjXCj74Wv41nb6phYeI2f+hLC1MaPFRi4v6TwYt8nF51cNxLK 3GviORUzH3qIWvCpX0TQJjD0QwYa4HAf8vIlnJZ+tb70StgNKn2yOGwA2u/3ac2ErYyLEjcqgzc O39O1R1yTjyzTx0OpvOXC75sUTULGpB4= X-Gm-Gg: ASbGnctbKYKp5PfnQtJLDu8mTpQSAtwjq63IutSqCRv85JaTA6BzvE+OyRJpUcFUjgJ +UixvNSI4+9xtm3/C1JlQfBCJxiROACDS+K8Ui4yFAQbTvfq56D9Ja7karnUiKoBw7+NpiPApCp 9tfl+lyTHMgws8//cVSp9xP9zTG9w2d7nNyL7cXAc1g7E6UZJh4yIs3C8KUC9DXkct0i12tVNzS KkkQ/IYzXcCEhfr2WpVgFVR0Jg9XEtvUu8zz0qJdwfcHnT0yc4M3ilfdftT X-Google-Smtp-Source: AGHT+IErIfPg8gaSKeMyOZFkNpw3KjZLX/H1XKzdAjwIIT7qQzescM2/zyHaesmq/nfh7REvfggOL+KzGXDcAQjOyX4= X-Received: by 2002:a17:907:94d2:b0:b61:e088:b560 with SMTP id a640c23a62f3a-b72155ad0c7mr640670466b.4.1762305200920; Tue, 04 Nov 2025 17:13:20 -0800 (PST) MIME-Version: 1.0 References: <29f9e7abc90c3a4fe4a44026141c0d6c@oss.nttdata.com> <95850ce1-2d5e-4271-92ea-c2a02e36b303@vondra.me> In-Reply-To: <95850ce1-2d5e-4271-92ea-c2a02e36b303@vondra.me> From: Naga Appani Date: Tue, 4 Nov 2025 19:13:09 -0600 X-Gm-Features: AWmQ_bk6WsRANsdNcQrVy1eF9xTln7hC4kWX_x3zndPnVu1kwZizuvaxoziuoVo Message-ID: Subject: Re: [Proposal] Expose internal MultiXact member count function for efficient monitoring To: Tomas Vondra Cc: Xuneng Zhou , torikoshia , Ashutosh Bapat , Michael Paquier , Kirill Reshke , pgsql-hackers@postgresql.org Content-Type: multipart/mixed; boundary="0000000000007cd90a0642cea70e" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --0000000000007cd90a0642cea70e Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Thank you for the feedback, Tomas! I agree with the goal you outlined, providing a user-friendly =E2=80=9Chow much space is left=E2=80=9D signal would make mo= nitoring far more actionable. On Sat, Oct 18, 2025 at 6:18 AM Tomas Vondra wrote: > > Knowing num_mxids / num_members or members_size is nice, but how would > I judge how far the system is from hitting some threshold or hard limit? > Is there some maximum number of mxids/members that we could return? Or > something like that? Based on this, I experimented with calculating a num_remaining_members valu= e to estimate how close the system is to MultiXact member-space exhaustion. I te= sted two approaches and validated their behavior through repeated exhaustion cyc= les. The results are below. At the same time, both you and Ashutosh pointed out that oldest_offset expo= ses internal implementation details and is not particularly useful on its own, = so I removed oldest_offset in v11. WHAT I TRIED in regards to space remaining =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D Approach 1: (offsetStopLimit - nextOffset) ------------------------------------------ I exposed offsetStopLimit from GetMultiXactInfo() and computed: remainingMembers =3D offsetStopLimit - nextOffset; Behavior at exhaustion: postgres=3D# SELECT num_mxids,num_members,remaining_members FROM pg_get_multixact_stats(); num_mxids | num_members | remaining_members -----------+-------------+------------------- 115409471 | 4294914940 | 1 (1 row) After wraparound cleanup: postgres=3D# SELECT num_mxids,num_members,remaining_members FROM pg_get_multixact_stats(); num_mxids | num_members | remaining_members -----------+-------------+------------------- 0 | 0 | 0 (1 row) The value stayed at 0 until roughly ~100k new members were allocated. My re= ading is that nextOffset wraps to a small value, while offsetStopLimit remains la= rge (derived from the oldestOffset at the moment of truncation). Without using = the backend=E2=80=99s wrap-aware comparison logic (MultiXactOffsetWouldWrap()),= plain subtraction crosses the wrap boundary and becomes misleading. Approach 2: (MaxMultiXactOffset - members) ------------------------------------------ I also tested: remainingMembers =3D MaxMultiXactOffset - members; Across three exhaustion cycles: 1st attempt: postgres=3D# SELECT num_mxids,num_members,remaining_members FROM pg_get_multixact_stats(); num_mxids | num_members | remaining_members -----------+-------------+------------------- 125098473 | 4294914940 | 52355 (1 row) 2nd attempt: postgres=3D# SELECT num_mxids,num_members,remaining_members FROM pg_get_multixact_stats(); num_mxids | num_members | remaining_members -----------+-------------+------------------- 116285530 | 4294905729 | 61566 (1 row) 3rd attempt: postgres=3D# SELECT num_mxids,num_members,remaining_members FROM pg_get_multixact_stats(); num_mxids | num_members | remaining_members -----------+-------------+------------------- 111973488 | 4294862592 | 104703 (1 row) The system correctly rejected inserts in each cycle, but the computed =E2=80=9Cremaining=E2=80=9D value increased between cycles. This seems to match the dynamic nature of offsetStopLimit, which appears to be recomputed after truncation: - based on the new oldestOffset - aligned back to the start of its segment - with one safety segment subtracted Because the stop boundary shifts depending on segment boundaries, the plain (Max =E2=88=92 members) formula reflects alignment effects rather than actu= al remaining capacity. Understanding =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D Based on reading the relevant parts of multixact.c and observing the runtim= e behavior, both approaches seem to run into limitations when trying to deriv= e a =E2=80=9Cremaining members=E2=80=9D value outside the backend. I may be mis= sing details, but the behavior I observed suggests that a reliable computation might require duplicating several internal mechanisms, including: - wrap-aware offset comparison - SLRU page and segment alignment rules - SetOffsetVacuumLimit=E2=80=99s segment recalculation Without accounting for those, the derived numbers behaved inconsistently ac= ross tests, sometimes staying at 0 until a large jump, and in other cases increa= sing between exhaustion cycles. This seems broadly consistent with your concern = that simple arithmetic on these counters does not match how the backend determin= es wraparound risk. To be clear, this interpretation is based only on what I could infer from t= he code and testing, and I may not be capturing the entire picture. But from w= hat I observed, a user-visible =E2=80=9Cremaining members=E2=80=9D metric does no= t seem straightforward without exposing or replicating backend logic. My thoughts =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D Given all this, the cleanest approach appears to be not exposing a =E2=80= =9Cremaining members=E2=80=9D counter directly. PostgreSQL has historically avoided exposing remaining-capacity counters fo= r wraparound-limited resources such as: - transaction IDs - MultiXact IDs - OIDs Instead, PostgreSQL exposes current usage and relies on documented thresholds for monitoring. Following that established pattern avoids tying a SQL-visible interface to backend internals that may evolve over time. Self-monitoring based on documented limits =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D Monitoring then follows the same pattern PostgreSQL already uses for XIDs a= nd other wraparound-limited values: - track num_members growth over time - warn when it exceeds roughly 2^31 - treat values approaching 2^32 as exhaustion-risk territory - observe the growth rate to estimate when intervention may be needed This keeps the interface simple, stable, and aligned with existing PostgreS= QL behavior. Why oldest_offset was removed =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D Both you and Ashutosh pointed out that oldest_offset reflects internal SLRU geometry and is not actionable without reproducing backend logic. Combined = with the behavior seen in the experiments above, it made sense not to expose thi= s field in the user-visible API. It is removed in v11. Final shape of the function (v11) =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D The function now returns: - num_mxids - num_members - members_size - oldest_multixact These fields are stable, directly interpretable, and do not depend on SLRU internals or wrap-aware arithmetic. On Thu, Oct 16, 2025 at 9:10 PM Xuneng Zhou wrote: > Here=E2=80=99s the updated v10 patch, now including access/htup_details.h= in > src/backend/utils/adt/multixactfuncs.c. Thank you! On Thu, Oct 16, 2025 at 7:28 PM torikoshia wro= te: > > Could you please update the patch to fix this? Thank you for raising it and bringing it to attention! Attached is the v11. Best regards, Naga --0000000000007cd90a0642cea70e Content-Type: application/octet-stream; name="v11-0001-Add-pg_get_multixact_stats-function-for-monitori.patch" Content-Disposition: attachment; filename="v11-0001-Add-pg_get_multixact_stats-function-for-monitori.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mhlavch20 RnJvbSAwYjBjNjBmN2FiYzdiYjI5MTNmYjdlOGI0YTYyODY3MjNhMGNhZjc0IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBOYWdhIEFwcGFuaSA8bmFnbnJpa0BnbWFpbC5jb20+CkRhdGU6 IFRodSwgMjMgT2N0IDIwMjUgMjI6MTE6MDMgKzAwMDAKU3ViamVjdDogW1BBVENIIHYxMV0gQWRk IHBnX2dldF9tdWx0aXhhY3Rfc3RhdHMoKSBmdW5jdGlvbiBmb3IgbW9uaXRvcmluZwogTXVsdGlY YWN0IHVzYWdlCgpFeHBvc2UgbXVsdGl4YWN0IHN0YXRlIHZpYSBhIG5ldyBTUUwtY2FsbGFibGUg ZnVuY3Rpb24gcGdfZ2V0X211bHRpeGFjdF9zdGF0cygpLApyZXR1cm5pbmc6Ci0gbnVtX214aWRz ICAgICAgICAgIDogbnVtYmVyIG9mIE11bHRpWGFjdCBJRHMgaW4gdXNlCi0gbnVtX21lbWJlcnMg ICAgICAgIDogbnVtYmVyIG9mIG1lbWJlciBlbnRyaWVzIGluIHVzZQotIG1lbWJlcnNfc2l6ZSAg ICAgICA6IGJ5dGVzIHVzZWQgYnkgbnVtX21lbWJlcnMgaW4gcGdfbXVsdGl4YWN0L21lbWJlcnMg ZGlyZWN0b3J5Ci0gb2xkZXN0X211bHRpeGFjdCAgIDogb2xkZXN0IE11bHRpWGFjdCBJRCBzdGls bCBuZWVkZWQKClRoaXMgcGF0Y2ggYWRkcyBwZ19nZXRfbXVsdGl4YWN0X3N0YXRzKCkgZnVuY3Rp b24KICAgLSBTUUwtY2FsbGFibGUgaW50ZXJmYWNlIHRvIEdldE11bHRpWGFjdEluZm8oKQogICAt IFJldHVybnMgTlVMTHMgaWYgTXVsdGlYYWN0IHN5c3RlbSBub3QgaW5pdGlhbGl6ZWQKICAgLSBJ bmNsdWRlcyBpc29sYXRpb24gdGVzdHMgZm9yIG1vbml0b3JpbmcgaW52YXJpYW50cwoKRG9jdW1l bnRhdGlvbiB1cGRhdGVzOgotIGZ1bmMtaW5mby5zZ21sOiBhZGQgZnVuY3Rpb24gZW50cnkKLSBt YWludGVuYW5jZS5zZ21sOiBtZW50aW9uIG1vbml0b3JpbmcgbXVsdGl4YWN0IHVzYWdlCgpCdWls ZCBhbmQgY2F0YWxvZzoKLSBBZGQgZnVuY3Rpb24gdG8gZXhpc3RpbmcgbXVsdGl4YWN0ZnVuY3Mu YwotIHBnX3Byb2MuZGF0IGVudHJ5CgpBdXRob3I6IE5hZ2EgQXBwYW5pIDxuYWducmlrQGdtYWls LmNvbT4KUmV2aWV3ZWQtYnk6IEFzaHV0b3NoIEJhcGF0IDxhc2h1dG9zaC5iYXBhdC5vc3NAZ21h aWwuY29tPgpSZXZpZXdlZC1ieTogTWljaGFlbCBQYXF1aWVyIDxtaWNoYWVsQHBhcXVpZXIueHl6 PgpEaXNjdXNzaW9uOiBodHRwczovL3d3dy5wb3N0Z3Jlc3FsLm9yZy9tZXNzYWdlLWlkL2ZsYXQv Q0ElMkJRZVklMkJBQXNZSzZXdkJXNHFZekh6NGJhaEh5Y0RBWV9xNUVDbUhrRVZfZUI5Y2t6ZyU0 MG1haWwuZ21haWwuY29tCi0tLQogZG9jL3NyYy9zZ21sL2Z1bmMvZnVuYy1pbmZvLnNnbWwgICAg ICAgICAgICAgIHwgIDMzICsrKysrCiBkb2Mvc3JjL3NnbWwvbWFpbnRlbmFuY2Uuc2dtbCAgICAg ICAgICAgICAgICAgfCAgNTggKysrKysrKystCiBzcmMvYmFja2VuZC91dGlscy9hZHQvbXVsdGl4 YWN0ZnVuY3MuYyAgICAgICAgfCAgNDYgKysrKysrKwogc3JjL2luY2x1ZGUvY2F0YWxvZy9wZ19w cm9jLmRhdCAgICAgICAgICAgICAgIHwgIDEwICsrCiAuLi4vaXNvbGF0aW9uL2V4cGVjdGVkL211 bHRpeGFjdF9zdGF0cy5vdXQgICAgfCAgODkgKysrKysrKysrKysrKysKIHNyYy90ZXN0L2lzb2xh dGlvbi9pc29sYXRpb25fc2NoZWR1bGUgICAgICAgICB8ICAgMSArCiBzcmMvdGVzdC9pc29sYXRp b24vc3BlY3MvbXVsdGl4YWN0X3N0YXRzLnNwZWMgfCAxMTMgKysrKysrKysrKysrKysrKysrCiA3 IGZpbGVzIGNoYW5nZWQsIDM0NCBpbnNlcnRpb25zKCspLCA2IGRlbGV0aW9ucygtKQogY3JlYXRl IG1vZGUgMTAwNjQ0IHNyYy90ZXN0L2lzb2xhdGlvbi9leHBlY3RlZC9tdWx0aXhhY3Rfc3RhdHMu b3V0CiBjcmVhdGUgbW9kZSAxMDA2NDQgc3JjL3Rlc3QvaXNvbGF0aW9uL3NwZWNzL211bHRpeGFj dF9zdGF0cy5zcGVjCgpkaWZmIC0tZ2l0IGEvZG9jL3NyYy9zZ21sL2Z1bmMvZnVuYy1pbmZvLnNn bWwgYi9kb2Mvc3JjL3NnbWwvZnVuYy9mdW5jLWluZm8uc2dtbAppbmRleCBjMzkzODMyZDk0Yy4u MGQ3NTYxODYxOTcgMTAwNjQ0Ci0tLSBhL2RvYy9zcmMvc2dtbC9mdW5jL2Z1bmMtaW5mby5zZ21s CisrKyBiL2RvYy9zcmMvc2dtbC9mdW5jL2Z1bmMtaW5mby5zZ21sCkBAIC0yOTc1LDYgKzI5NzUs MzkgQEAgYWNsICAgICAgfCB7cG9zdGdyZXM9YXJ3ZER4dG0vcG9zdGdyZXMsZm9vPXIvcG9zdGdy ZXN9CiAgICAgICAgIG1vZGlmeSBrZXkgY29sdW1ucy4KICAgICAgICA8L3BhcmE+PC9lbnRyeT4K ICAgICAgIDwvcm93PgorCisgICAgICA8cm93PgorICAgICAgIDxlbnRyeSByb2xlPSJmdW5jX3Rh YmxlX2VudHJ5Ij48cGFyYSByb2xlPSJmdW5jX3NpZ25hdHVyZSI+CisgICAgICAgIDxpbmRleHRl cm0+CisgICAgICAgICA8cHJpbWFyeT5wZ19nZXRfbXVsdGl4YWN0X3N0YXRzPC9wcmltYXJ5Pgor ICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgPGZ1bmN0aW9uPnBnX2dldF9tdWx0aXhhY3Rf c3RhdHM8L2Z1bmN0aW9uPiAoKQorICAgICAgICA8cmV0dXJudmFsdWU+cmVjb3JkPC9yZXR1cm52 YWx1ZT4KKyAgICAgICAgKCA8cGFyYW1ldGVyPm51bV9teGlkczwvcGFyYW1ldGVyPiA8dHlwZT5p bnRlZ2VyPC90eXBlPiwKKyAgICAgICAgICA8cGFyYW1ldGVyPm51bV9tZW1iZXJzPC9wYXJhbWV0 ZXI+IDx0eXBlPmJpZ2ludDwvdHlwZT4sCisgICAgICAgICAgPHBhcmFtZXRlcj5tZW1iZXJzX3Np emU8L3BhcmFtZXRlcj4gPHR5cGU+YmlnaW50PC90eXBlPiwKKyAgICAgICAgICA8cGFyYW1ldGVy Pm9sZGVzdF9tdWx0aXhhY3Q8L3BhcmFtZXRlcj4gPHR5cGU+eGlkPC90eXBlPiApCisgICAgICAg PC9wYXJhPgorICAgICAgIDxwYXJhPgorICAgICAgICBSZXR1cm5zIHN0YXRpc3RpY3MgYWJvdXQg Y3VycmVudCBtdWx0aXhhY3QgdXNhZ2U6CisgICAgICAgIDxsaXRlcmFsPm51bV9teGlkczwvbGl0 ZXJhbD4gaXMgdGhlIHRvdGFsIG51bWJlciBvZiBtdWx0aXhhY3QgSURzIGN1cnJlbnRseSBwcmVz ZW50IGluIHRoZSBzeXN0ZW0sCisgICAgICAgIDxsaXRlcmFsPm51bV9tZW1iZXJzPC9saXRlcmFs PiBpcyB0aGUgdG90YWwgbnVtYmVyIG9mIG11bHRpeGFjdCBtZW1iZXIgZW50cmllcyBjdXJyZW50 bHkKKyAgICAgICAgcHJlc2VudCBpbiB0aGUgc3lzdGVtLAorICAgICAgICA8bGl0ZXJhbD5tZW1i ZXJzX3NpemU8L2xpdGVyYWw+IGlzIHRoZSBzdG9yYWdlIG9jY3VwaWVkIGJ5IDxsaXRlcmFsPm51 bV9tZW1iZXJzPC9saXRlcmFsPgorICAgICAgICBpbiB0aGUgPGxpdGVyYWw+cGdfbXVsdGl4YWN0 L21lbWJlcnM8L2xpdGVyYWw+IGRpcmVjdG9yeSwKKyAgICAgICAgPGxpdGVyYWw+b2xkZXN0X211 bHRpeGFjdDwvbGl0ZXJhbD4gaXMgdGhlIG9sZGVzdCBtdWx0aXhhY3QgSUQgc3RpbGwgaW4gdXNl LgorICAgICAgIDwvcGFyYT4KKyAgICAgICA8cGFyYT4KKyAgICAgICAgVGhlIGZ1bmN0aW9uIHJl cG9ydHMgc3RhdGlzdGljcyBhdCB0aGUgdGltZSBpdCBpcyBpbnZva2VkLiBWYWx1ZXMgbWF5IHZh cnkgYmV0d2VlbiBjYWxscywKKyAgICAgICAgZXZlbiB3aXRoaW4gYSBzaW5nbGUgdHJhbnNhY3Rp b24uCisgICAgICAgPC9wYXJhPgorICAgICAgIDxwYXJhPgorICAgICAgICBSZXR1cm5zIDxsaXRl cmFsPk5VTEw8L2xpdGVyYWw+IHdoZW4gbXVsdGl4YWN0IHN0YXRpc3RpY3MgYXJlIHVuYXZhaWxh YmxlLAorICAgICAgICBzdWNoIGFzIGR1cmluZyBzdGFydHVwIGJlZm9yZSBtdWx0aXhhY3QgaW5p dGlhbGl6YXRpb24gY29tcGxldGVzLgorICAgICAgICBTcGVjaWZpY2FsbHksIHRoaXMgb2NjdXJz IHdoZW4gdGhlIG9sZGVzdCBtdWx0aXhhY3Qgb2Zmc2V0CisgICAgICAgIGNvcnJlc3BvbmRpbmcg dG8gYSBtdWx0aXhhY3QgcmVmZXJlbmNlZCBieSBhIHJlbGF0aW9uIGlzIG5vdCBrbm93bi4KKyAg ICAgICA8L3BhcmE+PC9lbnRyeT4KKyAgICAgIDwvcm93PgogICAgICA8L3Rib2R5PgogICAgIDwv dGdyb3VwPgogICAgPC90YWJsZT4KZGlmZiAtLWdpdCBhL2RvYy9zcmMvc2dtbC9tYWludGVuYW5j ZS5zZ21sIGIvZG9jL3NyYy9zZ21sL21haW50ZW5hbmNlLnNnbWwKaW5kZXggZGM1OWM4ODMxOWUu LjRkN2UxNzI0NTBhIDEwMDY0NAotLS0gYS9kb2Mvc3JjL3NnbWwvbWFpbnRlbmFuY2Uuc2dtbAor KysgYi9kb2Mvc3JjL3NnbWwvbWFpbnRlbmFuY2Uuc2dtbApAQCAtODEzLDE0ICs4MTMsNjAgQEAg SElOVDogIEV4ZWN1dGUgYSBkYXRhYmFzZS13aWRlIFZBQ1VVTSBpbiB0aGF0IGRhdGFiYXNlLgog ICAgIDxwYXJhPgogICAgICBBcyBhIHNhZmV0eSBkZXZpY2UsIGFuIGFnZ3Jlc3NpdmUgdmFjdXVt IHNjYW4gd2lsbAogICAgICBvY2N1ciBmb3IgYW55IHRhYmxlIHdob3NlIG11bHRpeGFjdC1hZ2Ug aXMgZ3JlYXRlciB0aGFuIDx4cmVmCi0gICAgIGxpbmtlbmQ9Imd1Yy1hdXRvdmFjdXVtLW11bHRp eGFjdC1mcmVlemUtbWF4LWFnZSIvPi4gIEFsc28sIGlmIHRoZQotICAgICBzdG9yYWdlIG9jY3Vw aWVkIGJ5IG11bHRpeGFjdHMgbWVtYmVycyBleGNlZWRzIGFib3V0IDEwR0IsIGFnZ3Jlc3NpdmUg dmFjdXVtCi0gICAgIHNjYW5zIHdpbGwgb2NjdXIgbW9yZSBvZnRlbiBmb3IgYWxsIHRhYmxlcywg c3RhcnRpbmcgd2l0aCB0aG9zZSB0aGF0Ci0gICAgIGhhdmUgdGhlIG9sZGVzdCBtdWx0aXhhY3Qt YWdlLiAgQm90aCBvZiB0aGVzZSBraW5kcyBvZiBhZ2dyZXNzaXZlCi0gICAgIHNjYW5zIHdpbGwg b2NjdXIgZXZlbiBpZiBhdXRvdmFjdXVtIGlzIG5vbWluYWxseSBkaXNhYmxlZC4gVGhlIG1lbWJl cnMgc3RvcmFnZQotICAgICBhcmVhIGNhbiBncm93IHVwIHRvIGFib3V0IDIwR0IgYmVmb3JlIHJl YWNoaW5nIHdyYXBhcm91bmQuCisgICAgIGxpbmtlbmQ9Imd1Yy1hdXRvdmFjdXVtLW11bHRpeGFj dC1mcmVlemUtbWF4LWFnZSIvPi4gQWxzbywgaWYgdGhlIG51bWJlcgorICAgICBvZiBtdWx0aXhh Y3QgbWVtYmVyIGVudHJpZXMgY3JlYXRlZCBleGNlZWRzIGFwcHJveGltYXRlbHkgMl4zMSBlbnRy aWVzCisgICAgIChvY2N1cHlpbmcgcm91Z2hseSAxMEdCIGluIHRoZSA8bGl0ZXJhbD5wZ19tdWx0 aXhhY3QvbWVtYmVyczwvbGl0ZXJhbD4gZGlyZWN0b3J5KSwKKyAgICAgYWdncmVzc2l2ZSB2YWN1 dW0gc2NhbnMgd2lsbCBvY2N1ciBtb3JlIG9mdGVuIGZvciBhbGwgdGFibGVzLCBzdGFydGluZyB3 aXRoIHRob3NlIHRoYXQKKyAgICAgaGF2ZSB0aGUgb2xkZXN0IG11bHRpeGFjdC1hZ2UuIEJvdGgg b2YgdGhlc2Uga2luZHMgb2YgYWdncmVzc2l2ZQorICAgICBzY2FucyB3aWxsIG9jY3VyIGV2ZW4g aWYgYXV0b3ZhY3V1bSBpcyBub21pbmFsbHkgZGlzYWJsZWQuIFRoZSBtZW1iZXJzIGNhbiBncm93 CisgICAgIHVwIHRvIGFwcHJveGltYXRlbHkgMl4zMiBlbnRyaWVzIChvY2N1cHlpbmcgcm91Z2hs eSAyMEdCIGluIHRoZQorICAgICA8bGl0ZXJhbD5wZ19tdWx0aXhhY3QvbWVtYmVyczwvbGl0ZXJh bD4gZGlyZWN0b3J5KSBiZWZvcmUgcmVhY2hpbmcgd3JhcGFyb3VuZC4KICAgICA8L3BhcmE+CiAK KyAgICA8cGFyYT4KKyAgICAgVGhlIDxmdW5jdGlvbj5wZ19nZXRfbXVsdGl4YWN0X3N0YXRzKCk8 L2Z1bmN0aW9uPiBmdW5jdGlvbiBkZXNjcmliZWQgaW4KKyAgICAgPHhyZWYgbGlua2VuZD0iZnVu Y3Rpb25zLXBnLXNuYXBzaG90Ii8+IHByb3ZpZGVzIGEgd2F5IHRvIG1vbml0b3IKKyAgICAgbXVs dGl4YWN0IGFsbG9jYXRpb24gYW5kIHVzYWdlIHBhdHRlcm5zIGluIHJlYWwgdGltZSwgZm9yIGV4 YW1wbGU6CisgICAgIDxwcm9ncmFtbGlzdGluZz4KK3Bvc3RncmVzPSMgU0VMRUNUICoscGdfc2l6 ZV9wcmV0dHkobWVtYmVyc19zaXplKSBtZW1iZXJzX3NpemVfcHJldHR5IEZST00gcGdfY2F0YWxv Zy5wZ19nZXRfbXVsdGl4YWN0X3N0YXRzKCk7CisgbnVtX214aWRzIHwgbnVtX21lbWJlcnMgfCBt ZW1iZXJzX3NpemUgfCBvbGRlc3RfbXVsdGl4YWN0IHwgbWVtYmVyc19zaXplX3ByZXR0eQorLS0t LS0tLS0tLS0rLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0r LS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgMzExNzQwMjk5IHwgIDI3ODUyNDExNzYgfCAgMTM5MjYy MDU4ODAgfCAgICAgICAgICAgICAgICAyIHwgMTMgR0IKKygxIHJvdykKKyAgICAgPC9wcm9ncmFt bGlzdGluZz4KKyAgICAgVGhpcyBvdXRwdXQgc2hvd3MgYSBzeXN0ZW0gd2l0aCBzaWduaWZpY2Fu dCBtdWx0aXhhY3QgYWN0aXZpdHk6IGFib3V0IH4zMTIgbWlsbGlvbgorICAgICBtdWx0aXhhY3Qg SURzIGFuZCB+Mi44IGJpbGxpb24gbWVtYmVyIGVudHJpZXMgY29uc3VtaW5nIDEzIEdCIG9mIHN0 b3JhZ2Ugc3BhY2UuCisgICAgIEJ5IGxldmVyYWdpbmcgdGhpcyBpbmZvcm1hdGlvbiwgdGhlIGZ1 bmN0aW9uIGhlbHBzOgorICAgICA8b3JkZXJlZGxpc3Q+CisgICAgICA8bGlzdGl0ZW0+CisgICAg ICAgPHNpbXBhcmE+CisgICAgICAgIElkZW50aWZ5IHVudXN1YWwgbXVsdGl4YWN0IGFjdGl2aXR5 IGZyb20gY29uY3VycmVudCByb3ctbGV2ZWwgbG9ja3MKKyAgICAgICAgb3IgZm9yZWlnbiBrZXkg b3BlcmF0aW9ucy4gRm9yIGV4YW1wbGUsIGEgc3Bpa2UgaW4gPGxpdGVyYWw+bnVtX214aWRzPC9s aXRlcmFsPiBtaWdodCBpbmRpY2F0ZQorICAgICAgICBtdWx0aXBsZSBzZXNzaW9ucyBydW5uaW5n IDxsaXRlcmFsPlVQREFURTwvbGl0ZXJhbD4gc3RhdGVtZW50cyB3aXRoIGZvcmVpZ24ga2V5IGNo ZWNrcywKKyAgICAgICAgY29uY3VycmVudCA8bGl0ZXJhbD5TRUxFQ1QgRk9SIFNIQVJFPC9saXRl cmFsPiBvcGVyYXRpb25zLCBvciBmcmVxdWVudCB1c2Ugb2Ygc2F2ZXBvaW50cworICAgICAgICBj YXVzaW5nIGxvY2sgY29udGVudGlvbi4KKyAgICAgICA8L3NpbXBhcmE+CisgICAgICA8L2xpc3Rp dGVtPgorICAgICAgPGxpc3RpdGVtPgorICAgICAgIDxzaW1wYXJhPgorICAgICAgICBUcmFjayBt dWx0aXhhY3QgY2xlYW51cCBlZmZpY2llbmN5IGJ5IG1vbml0b3Jpbmcgb2xkZXN0X211bHRpeGFj dC4KKyAgICAgICAgSWYgdGhpcyB2YWx1ZSByZW1haW5zIHVuY2hhbmdlZCB3aGlsZSA8bGl0ZXJh bD5udW1fbWVtYmVyczwvbGl0ZXJhbD4gZ3Jvd3MsIGl0IGNvdWxkIGluZGljYXRlCisgICAgICAg IHRoYXQgbG9uZy1ydW5uaW5nIHRyYW5zYWN0aW9ucyBhcmUgcHJldmVudGluZyBjbGVhbnVwLCBv ciBhdXRvdmFjdXVtIGlzCisgICAgICAgIG5vdCBrZWVwaW5nIHVwIHdpdGggdGhlIHdvcmtsb2Fk LgorICAgICAgIDwvc2ltcGFyYT4KKyAgICAgIDwvbGlzdGl0ZW0+CisgICAgICA8bGlzdGl0ZW0+ CisgICAgICAgPHNpbXBhcmE+CisgICAgICAgIERldGVjdCBwb3RlbnRpYWwgcGVyZm9ybWFuY2Ug aW1wYWN0cyBiZWZvcmUgdGhleSBiZWNvbWUgY3JpdGljYWwuCisgICAgICAgIEZvciBpbnN0YW5j ZSwgaGlnaCBtdWx0aXhhY3QgdXNhZ2UgZnJvbSBmcmVxdWVudCByb3ctbGV2ZWwgbG9ja2luZyBv cgorICAgICAgICBmb3JlaWduIGtleSBvcGVyYXRpb25zIGNhbiBsZWFkIHRvIGluY3JlYXNlZCBJ L08gYW5kIENQVSBvdmVyaGVhZCBkdXJpbmcKKyAgICAgICAgdmFjdXVtIG9wZXJhdGlvbnMuIE1v bml0b3JpbmcgdGhlc2Ugc3RhdHMgaGVscHMgdHVuZSBhdXRvdmFjdXVtIGZyZXF1ZW5jeQorICAg ICAgICBhbmQgdHJhbnNhY3Rpb24gcGF0dGVybnMuCisgICAgICAgPC9zaW1wYXJhPgorICAgICAg PC9saXN0aXRlbT4KKyAgICAgPC9vcmRlcmVkbGlzdD4KKyAgICAgPC9wYXJhPgorCiAgICAgPHBh cmE+CiAgICAgIFNpbWlsYXIgdG8gdGhlIFhJRCBjYXNlLCBpZiBhdXRvdmFjdXVtIGZhaWxzIHRv IGNsZWFyIG9sZCBNWElEcyBmcm9tIGEgdGFibGUsIHRoZQogICAgICBzeXN0ZW0gd2lsbCBiZWdp biB0byBlbWl0IHdhcm5pbmcgbWVzc2FnZXMgd2hlbiB0aGUgZGF0YWJhc2UncyBvbGRlc3QgTVhJ RHMgcmVhY2ggZm9ydHkKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9tdWx0aXhh Y3RmdW5jcy5jIGIvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L211bHRpeGFjdGZ1bmNzLmMKaW5kZXgg ZTc0ZWE5MzgzNDguLjI4NjY3NmQzODI5IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC91dGlscy9h ZHQvbXVsdGl4YWN0ZnVuY3MuYworKysgYi9zcmMvYmFja2VuZC91dGlscy9hZHQvbXVsdGl4YWN0 ZnVuY3MuYwpAQCAtMTUsNiArMTUsNyBAQAogI2luY2x1ZGUgInBvc3RncmVzLmgiCiAKICNpbmNs dWRlICJhY2Nlc3MvbXVsdGl4YWN0LmgiCisjaW5jbHVkZSAiYWNjZXNzL2h0dXBfZGV0YWlscy5o IgogI2luY2x1ZGUgImZ1bmNhcGkuaCIKICNpbmNsdWRlICJ1dGlscy9idWlsdGlucy5oIgogCkBA IC04NSwzICs4Niw0OCBAQCBwZ19nZXRfbXVsdGl4YWN0X21lbWJlcnMoUEdfRlVOQ1RJT05fQVJH UykKIAogCVNSRl9SRVRVUk5fRE9ORShmdW5jY3h0KTsKIH0KKworLyoKKyAqIHBnX2dldF9tdWx0 aXhhY3Rfc3RhdHMKKyAqCisgKiBSZXR1cm5zIHN0YXRpc3RpY3MgYWJvdXQgY3VycmVudCBtdWx0 aXhhY3QgdXNhZ2UuCisgKgorICogUmV0dXJucyBOVUxMIGlmIHRoZSBvbGRlc3QgcmVmZXJlbmNl ZCBvZmZzZXQgaXMgdW5rbm93bi4KKyAqLworRGF0dW0KK3BnX2dldF9tdWx0aXhhY3Rfc3RhdHMo UEdfRlVOQ1RJT05fQVJHUykKK3sKKwlUdXBsZURlc2MJdHVwZGVzYzsKKwlEYXR1bQkJdmFsdWVz WzRdOworCWJvb2wJCW51bGxzWzRdOworCU11bHRpWGFjdE9mZnNldAltZW1iZXJzOworCU11bHRp WGFjdElkCW9sZGVzdE11bHRpWGFjdElkOworCXVpbnQzMgkJbXVsdGl4YWN0czsKKwlNdWx0aVhh Y3RPZmZzZXQJb2xkZXN0T2Zmc2V0OworCWludDY0CQltZW1iZXJzQnl0ZXM7CisKKwlpZiAoZ2V0 X2NhbGxfcmVzdWx0X3R5cGUoZmNpbmZvLCBOVUxMLCAmdHVwZGVzYykgIT0gVFlQRUZVTkNfQ09N UE9TSVRFKQorCQllcmVwb3J0KEVSUk9SLAorCQkJCShlcnJjb2RlKEVSUkNPREVfRkVBVFVSRV9O T1RfU1VQUE9SVEVEKSwKKwkJCQkgZXJybXNnKCJyZXR1cm4gdHlwZSBtdXN0IGJlIGEgcm93IHR5 cGUiKSkpOworCisJaWYgKEdldE11bHRpWGFjdEluZm8oJm11bHRpeGFjdHMsICZtZW1iZXJzLCAm b2xkZXN0TXVsdGlYYWN0SWQsICZvbGRlc3RPZmZzZXQpKQorCXsKKwkJLyoKKwkJICogQ2FsY3Vs YXRlIHN0b3JhZ2Ugc3BhY2UgZm9yIG1lbWJlcnMuIE1lbWJlcnMgYXJlIHN0b3JlZCBpbiBncm91 cHMgb2YgNCwKKwkJICogd2l0aCBlYWNoIGdyb3VwIHRha2luZyAyMCBieXRlcywgcmVzdWx0aW5n IGluIDUgYnl0ZXMgcGVyIG1lbWJlci4KKwkJICogTm90ZTogVGhpcyBpZ25vcmVzIHNtYWxsIHBh Z2Ugb3ZlcmhlYWQgKDEyIGJ5dGVzIHBlciA4S0IpCisJCSAqLworCQltZW1iZXJzQnl0ZXMgPSAo aW50NjQpIG1lbWJlcnMgKiA1OworCisJCXZhbHVlc1swXSA9IFVJbnQzMkdldERhdHVtKG11bHRp eGFjdHMpOworCQl2YWx1ZXNbMV0gPSBVSW50MzJHZXREYXR1bShtZW1iZXJzKTsKKwkJdmFsdWVz WzJdID0gSW50NjRHZXREYXR1bShtZW1iZXJzQnl0ZXMpOworCQl2YWx1ZXNbM10gPSBVSW50MzJH ZXREYXR1bShvbGRlc3RNdWx0aVhhY3RJZCk7CisJCW1lbXNldChudWxscywgZmFsc2UsIHNpemVv ZihudWxscykpOworCisJCXJldHVybiBIZWFwVHVwbGVHZXREYXR1bShoZWFwX2Zvcm1fdHVwbGUo dHVwZGVzYywgdmFsdWVzLCBudWxscykpOworCX0KKworCVBHX1JFVFVSTl9OVUxMKCk7Cit9CmRp ZmYgLS1naXQgYS9zcmMvaW5jbHVkZS9jYXRhbG9nL3BnX3Byb2MuZGF0IGIvc3JjL2luY2x1ZGUv Y2F0YWxvZy9wZ19wcm9jLmRhdAppbmRleCA5MTIxYTM4MmY3Ni4uOTI4YWEzY2ZmNzIgMTAwNjQ0 Ci0tLSBhL3NyYy9pbmNsdWRlL2NhdGFsb2cvcGdfcHJvYy5kYXQKKysrIGIvc3JjL2luY2x1ZGUv Y2F0YWxvZy9wZ19wcm9jLmRhdApAQCAtMTI2MDQsNCArMTI2MDQsMTQgQEAKICAgcHJvYXJnbmFt ZXMgPT4gJ3twaWQsaW9faWQsaW9fZ2VuZXJhdGlvbixzdGF0ZSxvcGVyYXRpb24sb2ZmLGxlbmd0 aCx0YXJnZXQsaGFuZGxlX2RhdGFfbGVuLHJhd19yZXN1bHQscmVzdWx0LHRhcmdldF9kZXNjLGZf c3luYyxmX2xvY2FsbWVtLGZfYnVmZmVyZWR9JywKICAgcHJvc3JjID0+ICdwZ19nZXRfYWlvcycg fSwKIAorIyBHZXQgbXVsdGl4YWN0IHVzYWdlCit7IG9pZCA9PiAnOTAwMScsIGRlc2NyID0+ICdn ZXQgY3VycmVudCBtdWx0aXhhY3QgdXNhZ2Ugc3RhdGlzdGljcycsCisgIHByb25hbWUgPT4gJ3Bn X2dldF9tdWx0aXhhY3Rfc3RhdHMnLAorICBwcm92b2xhdGlsZSA9PiAndicsIHByb3BhcmFsbGVs ID0+ICdzJywgcHJvcmV0dHlwZSA9PiAncmVjb3JkJywKKyAgcHJvYXJndHlwZXMgPT4gJycsCisg IHByb2FsbGFyZ3R5cGVzID0+ICd7aW50OCxpbnQ4LGludDgseGlkfScsCisgIHByb2FyZ21vZGVz ID0+ICd7byxvLG8sb30nLAorICBwcm9hcmduYW1lcyA9PiAne251bV9teGlkcyxudW1fbWVtYmVy cyxtZW1iZXJzX3NpemUsb2xkZXN0X211bHRpeGFjdH0nLAorICBwcm9zcmMgPT4gJ3BnX2dldF9t dWx0aXhhY3Rfc3RhdHMnfSwKKwogXQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvaXNvbGF0aW9uL2V4 cGVjdGVkL211bHRpeGFjdF9zdGF0cy5vdXQgYi9zcmMvdGVzdC9pc29sYXRpb24vZXhwZWN0ZWQv bXVsdGl4YWN0X3N0YXRzLm91dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAw MC4uMjdhNjUxMGM0YWQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9pc29sYXRpb24vZXhw ZWN0ZWQvbXVsdGl4YWN0X3N0YXRzLm91dApAQCAtMCwwICsxLDg5IEBACitQYXJzZWQgdGVzdCBz cGVjIHdpdGggMiBzZXNzaW9ucworCitzdGFydGluZyBwZXJtdXRhdGlvbjogc25hcDAgczFfYmVn aW4gczFfbG9jayBzbmFwMSBzMl9iZWdpbiBzMl9sb2NrIHNuYXAyIGNoZWNrX3doaWxlX3Bpbm5l ZCBzMV9jb21taXQgczJfY29tbWl0CitzdGVwIHNuYXAwOiAKKyAgQ1JFQVRFIFRFTVAgVEFCTEUg c25hcDAgQVMKKyAgU0VMRUNUIG51bV9teGlkcywgbnVtX21lbWJlcnMsIG9sZGVzdF9tdWx0aXhh Y3QKKyAgRlJPTSBwZ19nZXRfbXVsdGl4YWN0X3N0YXRzKCk7CisKK3N0ZXAgczFfYmVnaW46IEJF R0lOOworc3RlcCBzMV9sb2NrOiBTRUxFQ1QgMSBGUk9NIG14cSBXSEVSRSBpZD0xIEZPUiBLRVkg U0hBUkU7Cis/Y29sdW1uPworLS0tLS0tLS0KKyAgICAgICAxCisoMSByb3cpCisKK3N0ZXAgc25h cDE6IAorICBDUkVBVEUgVEVNUCBUQUJMRSBzbmFwMSBBUworICBTRUxFQ1QgbnVtX214aWRzLCBu dW1fbWVtYmVycywgb2xkZXN0X211bHRpeGFjdAorICBGUk9NIHBnX2dldF9tdWx0aXhhY3Rfc3Rh dHMoKTsKKworc3RlcCBzMl9iZWdpbjogQkVHSU47CitzdGVwIHMyX2xvY2s6IFNFTEVDVCAxIEZS T00gbXhxIFdIRVJFIGlkPTEgRk9SIEtFWSBTSEFSRTsKKz9jb2x1bW4/CistLS0tLS0tLQorICAg ICAgIDEKKygxIHJvdykKKworc3RlcCBzbmFwMjogCisgIENSRUFURSBURU1QIFRBQkxFIHNuYXAy IEFTCisgIFNFTEVDVCBudW1fbXhpZHMsIG51bV9tZW1iZXJzLCBvbGRlc3RfbXVsdGl4YWN0Cisg IEZST00gcGdfZ2V0X211bHRpeGFjdF9zdGF0cygpOworCitzdGVwIGNoZWNrX3doaWxlX3Bpbm5l ZDogCisgIFNFTEVDVCByLmFzc2VydGlvbiwgci5vaworICBGUk9NIHNuYXAwIHMwCisgIEpPSU4g c25hcDEgczEgT04gVFJVRQorICBKT0lOIHNuYXAyIHMyIE9OIFRSVUUsCisgIExBVEVSQUwgdW5u ZXN0KAorICAgIEFSUkFZWworICAgICAgJ2lzX2luaXRfbXhpZHMnLAorICAgICAgJ2lzX2luaXRf bWVtYmVycycsCisgICAgICAnaXNfaW5pdF9vbGRlc3RfbXhpZCcsCisgICAgICAnaXNfaW5pdF9v bGRlc3Rfb2ZmJywKKyAgICAgICdpc19vbGRlc3RfbXhpZF9ub25kZWNfMDEnLAorICAgICAgJ2lz X29sZGVzdF9teGlkX25vbmRlY18xMicsCisgICAgICAnaXNfb2xkZXN0X29mZl9ub25kZWNfMDEn LAorICAgICAgJ2lzX29sZGVzdF9vZmZfbm9uZGVjXzEyJywKKyAgICAgICdpc19tZW1iZXJzX2lu Y3JlYXNlZF9nZTEnLAorICAgICAgJ2lzX214aWRzX25vbmRlY18wMScsCisgICAgICAnaXNfbXhp ZHNfbm9uZGVjXzEyJywKKyAgICAgICdpc19tZW1iZXJzX25vbmRlY18wMScsCisgICAgICAnaXNf bWVtYmVyc19ub25kZWNfMTInCisgICAgXSwKKyAgICBBUlJBWVsKKyAgICAgIChzMi5udW1fbXhp ZHMgICAgICAgIElTIE5PVCBOVUxMKSwKKyAgICAgIChzMi5udW1fbWVtYmVycyAgICAgIElTIE5P VCBOVUxMKSwKKyAgICAgIChzMi5vbGRlc3RfbXVsdGl4YWN0IElTIE5PVCBOVUxMKSwKKworICAg ICAgKHMxLm9sZGVzdF9tdWx0aXhhY3Q6OnRleHQ6OmJpZ2ludCA+PSBDT0FMRVNDRShzMC5vbGRl c3RfbXVsdGl4YWN0Ojp0ZXh0OjpiaWdpbnQsIDApKSwKKyAgICAgIChzMi5vbGRlc3RfbXVsdGl4 YWN0Ojp0ZXh0OjpiaWdpbnQgPj0gQ09BTEVTQ0UoczEub2xkZXN0X211bHRpeGFjdDo6dGV4dDo6 YmlnaW50LCAwKSksCisKKyAgICAgIChzMi5udW1fbWVtYmVycyA+PSBDT0FMRVNDRShzMS5udW1f bWVtYmVycywgMCkgKyAxKSwKKworICAgICAgKHMxLm51bV9teGlkcyAgID49IENPQUxFU0NFKHMw Lm51bV9teGlkcywgICAwKSksCisgICAgICAoczIubnVtX214aWRzICAgPj0gQ09BTEVTQ0UoczEu bnVtX214aWRzLCAgIDApKSwKKyAgICAgIChzMS5udW1fbWVtYmVycyA+PSBDT0FMRVNDRShzMC5u dW1fbWVtYmVycywgMCkpLAorICAgICAgKHMyLm51bV9tZW1iZXJzID49IENPQUxFU0NFKHMxLm51 bV9tZW1iZXJzLCAwKSkKKyAgICBdCisgICkgQVMgcihhc3NlcnRpb24sIG9rKTsKKworYXNzZXJ0 aW9uICAgICAgICAgICAgICAgfG9rCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0KK2lzX2lu aXRfbXhpZHMgICAgICAgICAgIHx0IAoraXNfaW5pdF9tZW1iZXJzICAgICAgICAgfHQgCitpc19p bml0X29sZGVzdF9teGlkICAgICB8dCAKK2lzX2luaXRfb2xkZXN0X29mZiAgICAgIHx0IAoraXNf b2xkZXN0X214aWRfbm9uZGVjXzAxfHQgCitpc19vbGRlc3RfbXhpZF9ub25kZWNfMTJ8dCAKK2lz X29sZGVzdF9vZmZfbm9uZGVjXzAxIHx0IAoraXNfb2xkZXN0X29mZl9ub25kZWNfMTIgfHQgCitp c19tZW1iZXJzX2luY3JlYXNlZF9nZTF8dCAKK2lzX214aWRzX25vbmRlY18wMSAgICAgIHx0IAor aXNfbXhpZHNfbm9uZGVjXzEyICAgICAgfCAgCitpc19tZW1iZXJzX25vbmRlY18wMSAgICB8ICAK K2lzX21lbWJlcnNfbm9uZGVjXzEyICAgIHwgIAorKDEzIHJvd3MpCisKK3N0ZXAgczFfY29tbWl0 OiBDT01NSVQ7CitzdGVwIHMyX2NvbW1pdDogQ09NTUlUOwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3Qv aXNvbGF0aW9uL2lzb2xhdGlvbl9zY2hlZHVsZSBiL3NyYy90ZXN0L2lzb2xhdGlvbi9pc29sYXRp b25fc2NoZWR1bGUKaW5kZXggNWFmYWUzM2QzNzAuLmJhYjhhOGVhZjMxIDEwMDY0NAotLS0gYS9z cmMvdGVzdC9pc29sYXRpb24vaXNvbGF0aW9uX3NjaGVkdWxlCisrKyBiL3NyYy90ZXN0L2lzb2xh dGlvbi9pc29sYXRpb25fc2NoZWR1bGUKQEAgLTEyMCwzICsxMjAsNCBAQCB0ZXN0OiBzZXJpYWxp emFibGUtcGFyYWxsZWwtMgogdGVzdDogc2VyaWFsaXphYmxlLXBhcmFsbGVsLTMKIHRlc3Q6IG1h dHZpZXctd3JpdGUtc2tldwogdGVzdDogbG9jay1ub3dhaXQKK3Rlc3Q6IG11bHRpeGFjdF9zdGF0 cwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvaXNvbGF0aW9uL3NwZWNzL211bHRpeGFjdF9zdGF0cy5z cGVjIGIvc3JjL3Rlc3QvaXNvbGF0aW9uL3NwZWNzL211bHRpeGFjdF9zdGF0cy5zcGVjCm5ldyBm aWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwLi43YjAzNDY1NDUwNAotLS0gL2Rldi9u dWxsCisrKyBiL3NyYy90ZXN0L2lzb2xhdGlvbi9zcGVjcy9tdWx0aXhhY3Rfc3RhdHMuc3BlYwpA QCAtMCwwICsxLDExMyBAQAorIyBUZXN0IGludmFyaWFudHMgZm9yIHBnX2dldF9tdWx0aXhhY3Rf c3RhdHMoKQorIyBXZSBjcmVhdGUgZXhhY3RseSBvbmUgZnJlc2ggTXVsdGlYYWN0IG9uIGEgYnJh bmQtbmV3IHRhYmxlLiBXaGlsZSBpdCBpcyBwaW5uZWQKKyMgYnkgdHdvIG9wZW4gdHJhbnNhY3Rp b25zLCB3ZSBhc3NlcnQgb25seSBpbnZhcmlhbnRzIHRoYXQgYmFja2dyb3VuZCBWQUNVVU0vRlJF RVpFCisjIGNhbm5vdCB2aW9sYXRlOgorIyAgIOKAoiBtZW1iZXJzIGluY3JlYXNlZCBieSDiiaUg MSB3aGVuIHRoZSBzZWNvbmQgc2Vzc2lvbiBsb2NrZWQgdGhlIHJvdywKKyMgICDigKIgbnVtX214 aWRzIC8gbnVtX21lbWJlcnMgZGlkIG5vdCBkZWNyZWFzZSB2cyBlYXJsaWVyIHNuYXBzaG90cywK KyMgICDigKIgb2xkZXN0XyogbmV2ZXIgZGVjcmVhc2VzLgorIyBXZSBtYWtlIE5PIGFzc2VydGlv bnMgYWZ0ZXIgcmVsZWFzaW5nIGxvY2tzIChmcmVlemluZy90cnVuY2F0aW9uIG1heSBzaHJpbmsg ZGVsdGFzKS4KKyMKKyMgVGVybWlub2xvZ3kgKGdsb2JhbCBjb3VudGVycyk6CisjICAgbnVtX214 aWRzLCBudW1fbWVtYmVycyAgICA6ICJpbi11c2UiIGRlbHRhcyBkZXJpdmVkIGZyb20gZ2xvYmFs IGhvcml6b25zCisjICAgb2xkZXN0X211bHRpeGFjdCwgb2Zmc2V0ICA6IG9sZGVzdCBob3Jpem9u czsgdGhleSBtb3ZlIGZvcndhcmQsIG5ldmVyIGJhY2t3YXJkCisjCisjIEFsbCBhc3NlcnRpb25z IGV4ZWN1dGUgd2hpbGUgb3VyIG11bHRpeGFjdCBpcyBwaW5uZWQgYnkgb3BlbiB0eG5zLCB3aGlj aCBwcm90ZWN0cworIyB0aGUgdHJ1bmNhdGlvbiBob3Jpem9uIChWQUNVVU0gY2FuJ3QgYWR2YW5j ZSBwYXN0IG91ciBwaW5uZWQgbXVsdGkpLgorCitzZXR1cAoreworICAgIENSRUFURSBUQUJMRSBt eHEoaWQgaW50IFBSSU1BUlkgS0VZLCB2IGludCk7CisgICAgSU5TRVJUIElOVE8gbXhxIFZBTFVF UyAoMSwgNDIpOworfQorCit0ZWFyZG93bgoreworICAgIERST1AgVEFCTEUgbXhxOworfQorCisj IFR3byBzZXNzaW9ucyB0aGF0IGxvY2sgb24gdGhlIHNhbWUgdHVwbGUgLT4gb25lIE11bHRpWGFj dCB3aXRoID49IDIgbWVtYmVycy4KK3Nlc3Npb24gInMxIgorc2V0dXAgeyBTRVQgY2xpZW50X21p bl9tZXNzYWdlcyA9IHdhcm5pbmc7IFNFVCBsb2NrX3RpbWVvdXQgPSAnNXMnOyB9CitzdGVwIHMx X2JlZ2luICB7IEJFR0lOOyB9CitzdGVwIHMxX2xvY2sgICB7IFNFTEVDVCAxIEZST00gbXhxIFdI RVJFIGlkPTEgRk9SIEtFWSBTSEFSRTsgfQorc3RlcCBzMV9jb21taXQgeyBDT01NSVQ7IH0KKwor c2Vzc2lvbiAiczIiCitzZXR1cCB7IFNFVCBjbGllbnRfbWluX21lc3NhZ2VzID0gd2FybmluZzsg U0VUIGxvY2tfdGltZW91dCA9ICc1cyc7IH0KK3N0ZXAgczJfYmVnaW4gIHsgQkVHSU47IH0KK3N0 ZXAgczJfbG9jayAgIHsgU0VMRUNUIDEgRlJPTSBteHEgV0hFUkUgaWQ9MSBGT1IgS0VZIFNIQVJF OyB9CitzdGVwIHMyX2NvbW1pdCB7IENPTU1JVDsgfQorCisjIEJhc2VsaW5lIEJFRk9SRSBhbnkg bG9ja2luZzsgbWF5IGJlIE5VTExzIGlmIG11bHRpeGFjdCBpc24ndCBpbml0aWFsaXplZCB5ZXQu CitzdGVwIHNuYXAwIHsKKyAgQ1JFQVRFIFRFTVAgVEFCTEUgc25hcDAgQVMKKyAgU0VMRUNUIG51 bV9teGlkcywgbnVtX21lbWJlcnMsIG9sZGVzdF9tdWx0aXhhY3QKKyAgRlJPTSBwZ19nZXRfbXVs dGl4YWN0X3N0YXRzKCk7Cit9CisKKyMgQWZ0ZXIgczEgaGFzIGxvY2tlZCB0aGUgcm93Lgorc3Rl cCBzbmFwMSB7CisgIENSRUFURSBURU1QIFRBQkxFIHNuYXAxIEFTCisgIFNFTEVDVCBudW1fbXhp ZHMsIG51bV9tZW1iZXJzLCBvbGRlc3RfbXVsdGl4YWN0CisgIEZST00gcGdfZ2V0X211bHRpeGFj dF9zdGF0cygpOworfQorCisjIEFmdGVyIHMyIGpvaW5zIG9uIHRoZSBTQU1FIHR1cGxlIC0+IG11 bHRpeGFjdCB3aXRoID49IDIgbWVtYmVycy4KK3N0ZXAgc25hcDIgeworICBDUkVBVEUgVEVNUCBU QUJMRSBzbmFwMiBBUworICBTRUxFQ1QgbnVtX214aWRzLCBudW1fbWVtYmVycywgb2xkZXN0X211 bHRpeGFjdAorICBGUk9NIHBnX2dldF9tdWx0aXhhY3Rfc3RhdHMoKTsKK30KKworIyBQcmV0dHks IGRldGVybWluaXN0aWMga2V5L3ZhbHVlIG91dHB1dCBvZiBib29sZWFuIGNoZWNrcy4KKyMgS2V5 czoKKyMgICBpc19pbml0X214aWRzICAgICAgICAgICAgOiBudW1fbXhpZHMgaXMgbm9uLU5VTEwK KyMgICBpc19pbml0X21lbWJlcnMgICAgICAgICAgOiBudW1fbWVtYmVycyBpcyBub24tTlVMTAor IyAgIGlzX2luaXRfb2xkZXN0X214aWQgICAgICA6IG9sZGVzdF9tdWx0aXhhY3QgaXMgbm9uLU5V TEwKKyMgICBpc19vbGRlc3RfbXhpZF9ub25kZWNfMDEgOiBvbGRlc3RfbXVsdGl4YWN0IGRpZCBu b3QgZGVjcmVhc2UgKHNuYXAw4oaSc25hcDEpCisjICAgaXNfb2xkZXN0X214aWRfbm9uZGVjXzEy IDogb2xkZXN0X211bHRpeGFjdCBkaWQgbm90IGRlY3JlYXNlIChzbmFwMeKGknNuYXAyKQorIyAg IGlzX21lbWJlcnNfaW5jcmVhc2VkX2dlMSA6IG1lbWJlcnMgaW5jcmVhc2VkIGJ5IGF0IGxlYXN0 IDEgd2hlbiBzMiBqb2luZWQKKyMgICBpc19teGlkc19ub25kZWNfMDEgICAgICAgOiBudW1fbXhp ZHMgZGlkIG5vdCBkZWNyZWFzZSAoc25hcDDihpJzbmFwMSkKKyMgICBpc19teGlkc19ub25kZWNf MTIgICAgICAgOiBudW1fbXhpZHMgZGlkIG5vdCBkZWNyZWFzZSAoc25hcDHihpJzbmFwMikKKyMg ICBpc19tZW1iZXJzX25vbmRlY18wMSAgICAgOiBudW1fbWVtYmVycyBkaWQgbm90IGRlY3JlYXNl IChzbmFwMOKGknNuYXAxKQorIyAgIGlzX21lbWJlcnNfbm9uZGVjXzEyICAgICA6IG51bV9tZW1i ZXJzIGRpZCBub3QgZGVjcmVhc2UgKHNuYXAx4oaSc25hcDIpCitzdGVwIGNoZWNrX3doaWxlX3Bp bm5lZCB7CisgIFNFTEVDVCByLmFzc2VydGlvbiwgci5vaworICBGUk9NIHNuYXAwIHMwCisgIEpP SU4gc25hcDEgczEgT04gVFJVRQorICBKT0lOIHNuYXAyIHMyIE9OIFRSVUUsCisgIExBVEVSQUwg dW5uZXN0KAorICAgIEFSUkFZWworICAgICAgJ2lzX2luaXRfbXhpZHMnLAorICAgICAgJ2lzX2lu aXRfbWVtYmVycycsCisgICAgICAnaXNfaW5pdF9vbGRlc3RfbXhpZCcsCisgICAgICAnaXNfaW5p dF9vbGRlc3Rfb2ZmJywKKyAgICAgICdpc19vbGRlc3RfbXhpZF9ub25kZWNfMDEnLAorICAgICAg J2lzX29sZGVzdF9teGlkX25vbmRlY18xMicsCisgICAgICAnaXNfb2xkZXN0X29mZl9ub25kZWNf MDEnLAorICAgICAgJ2lzX29sZGVzdF9vZmZfbm9uZGVjXzEyJywKKyAgICAgICdpc19tZW1iZXJz X2luY3JlYXNlZF9nZTEnLAorICAgICAgJ2lzX214aWRzX25vbmRlY18wMScsCisgICAgICAnaXNf bXhpZHNfbm9uZGVjXzEyJywKKyAgICAgICdpc19tZW1iZXJzX25vbmRlY18wMScsCisgICAgICAn aXNfbWVtYmVyc19ub25kZWNfMTInCisgICAgXSwKKyAgICBBUlJBWVsKKyAgICAgIChzMi5udW1f bXhpZHMgICAgICAgIElTIE5PVCBOVUxMKSwKKyAgICAgIChzMi5udW1fbWVtYmVycyAgICAgIElT IE5PVCBOVUxMKSwKKyAgICAgIChzMi5vbGRlc3RfbXVsdGl4YWN0IElTIE5PVCBOVUxMKSwKKwor ICAgICAgKHMxLm9sZGVzdF9tdWx0aXhhY3Q6OnRleHQ6OmJpZ2ludCA+PSBDT0FMRVNDRShzMC5v bGRlc3RfbXVsdGl4YWN0Ojp0ZXh0OjpiaWdpbnQsIDApKSwKKyAgICAgIChzMi5vbGRlc3RfbXVs dGl4YWN0Ojp0ZXh0OjpiaWdpbnQgPj0gQ09BTEVTQ0UoczEub2xkZXN0X211bHRpeGFjdDo6dGV4 dDo6YmlnaW50LCAwKSksCisKKyAgICAgIChzMi5udW1fbWVtYmVycyA+PSBDT0FMRVNDRShzMS5u dW1fbWVtYmVycywgMCkgKyAxKSwKKworICAgICAgKHMxLm51bV9teGlkcyAgID49IENPQUxFU0NF KHMwLm51bV9teGlkcywgICAwKSksCisgICAgICAoczIubnVtX214aWRzICAgPj0gQ09BTEVTQ0Uo czEubnVtX214aWRzLCAgIDApKSwKKyAgICAgIChzMS5udW1fbWVtYmVycyA+PSBDT0FMRVNDRShz MC5udW1fbWVtYmVycywgMCkpLAorICAgICAgKHMyLm51bV9tZW1iZXJzID49IENPQUxFU0NFKHMx Lm51bV9tZW1iZXJzLCAwKSkKKyAgICBdCisgICkgQVMgcihhc3NlcnRpb24sIG9rKTsKK30KKwor cGVybXV0YXRpb24gc25hcDAgczFfYmVnaW4gczFfbG9jayBzbmFwMSBzMl9iZWdpbiBzMl9sb2Nr IHNuYXAyIGNoZWNrX3doaWxlX3Bpbm5lZCBzMV9jb21taXQgczJfY29tbWl0Ci0tIAoyLjQ3LjMK Cg== --0000000000007cd90a0642cea70e--