From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by sourceware.org (Postfix) with ESMTPS id 557423858D1E for ; Thu, 8 Sep 2022 10:56:39 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 557423858D1E Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=redhat.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1662634598; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=SZm34A6eEEqSpxChFdy0Fb/ANDM16uHQMXdYkcd4Tjk=; b=IsLWMNrzGOw8yT45Zn3uyCf8dpCDm4uiHhnk7SigFNYaypaRxeMj8kDkt/+CKPk26mndo7 S5ytJQ2BNz4h9FOm6ApU8cKfE1b9WlL0/sb5y9WooI7ywkVUbBYiUaU5oqpX1Et+cpd6q/ XQpOaQJGGs2dlkSN7vzDm+IdxKkYiU8= Received: from mail-oo1-f69.google.com (mail-oo1-f69.google.com [209.85.161.69]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-645-_HqgmtncNO-o7wrhbc7iZA-1; Thu, 08 Sep 2022 06:56:37 -0400 X-MC-Unique: _HqgmtncNO-o7wrhbc7iZA-1 Received: by mail-oo1-f69.google.com with SMTP id n6-20020a4a6106000000b0044b2434319eso7042510ooc.3 for ; Thu, 08 Sep 2022 03:56:37 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date; bh=SZm34A6eEEqSpxChFdy0Fb/ANDM16uHQMXdYkcd4Tjk=; b=fj0DdBMqlnrWFf0QIibF7CYhD0OrtsB8AIxN7i4Vcd4VxejalSYnwazSjbx0ShZRU5 F+BQokdXdt2sPTi46SEurWcs2P8Gm/v6pOv4Ifnw/6L/3wyOxov5sPt0U4H0NRwQqAM/ NWm4CZommIkRykL7XZlSsaahu/iQLhU6dZ9im9EYue6xkYWUDxXZdZGKT2uXl8tpsw0g YjgWUvvTxi9KxQ7DnAcEgCmN0jJA91/LZB6FWGtN2Br9S5mP5g4sDAOq3dqOUU+4lv1f C9ZLZhPCIgSOY3clidPVz3Ho/N4sSwSgXO/VQ/xIVPv+45+FZnTNpWOb3aVGCDkyb2pX ScHg== X-Gm-Message-State: ACgBeo3mSFwmvYq30cciXs8i0Hz40yhjV9mzQpYQYHtfObk8c8cfe3bf Whibc8stvRWlpKlfkDr8DMTR0KNn5MPTHw5EaYfUNJNotqKrYB1SaWVxmyNdn4t0WTn167WZqHA 00fXajTc1r2MOpvGiF3yfR3lLoeFlMQLU0Q== X-Received: by 2002:a05:6870:b617:b0:10d:f7ce:50df with SMTP id cm23-20020a056870b61700b0010df7ce50dfmr1514688oab.36.1662634596531; Thu, 08 Sep 2022 03:56:36 -0700 (PDT) X-Google-Smtp-Source: AA6agR5FKQFW7fg9str0ZL/CQdcjqhdSWnbHUC4JF7rK3mEElLvtePoMaABo1KPdMkBQyA0DnugL2MaiK2xeDepXf9I= X-Received: by 2002:a05:6870:b617:b0:10d:f7ce:50df with SMTP id cm23-20020a056870b61700b0010df7ce50dfmr1514675oab.36.1662634596079; Thu, 08 Sep 2022 03:56:36 -0700 (PDT) MIME-Version: 1.0 References: <20220908062759.3610257-1-aldyh@redhat.com> <7BAA2838-822A-4DF0-B712-00C265DFECEC@gmail.com> In-Reply-To: <7BAA2838-822A-4DF0-B712-00C265DFECEC@gmail.com> From: Aldy Hernandez Date: Thu, 8 Sep 2022 12:56:24 +0200 Message-ID: Subject: Re: [PATCH] Implement known/maybe fpclassify like API for frange. To: Richard Biener Cc: Jakub Jelinek , GCC patches , Andrew MacLeod X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: multipart/mixed; boundary="0000000000007de62405e82848d9" X-Spam-Status: No, score=-11.9 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,GIT_PATCH_0,RCVD_IN_DNSWL_LOW,SPF_HELO_NONE,SPF_NONE,TXREP,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: --0000000000007de62405e82848d9 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Thu, Sep 8, 2022 at 9:27 AM Richard Biener wrote: > > > > > Am 08.09.2022 um 08:28 schrieb Aldy Hernandez : > > > > =EF=BB=BFThis is what I have in mind for the fpclassify-like methods on= the > > current implementation. I'll get to the removal of the tristates after > > Cauldron. > > > > As you mentioned, isnormal is kinda tricky, and likely to be confusing > > for the user. We can revisit it if it's important. > > Yeah. > > > ?? I assume maybe_inf() does not return true for NAN ?? > > Only maybe_nan and known_nan return true for NaN. > > > > > Also, what are your thoughts on signbit? Perhaps a method returning > > true if we're sure, and the actual signbit result as a reference? > > > > bool known_signbit (const frange &r, int &signbit); > > That works for me. You could look at ok. settled on: + bool known_signbit (bool &signbit) const; It even cleaned up the __builtin_signbit folding kludge because now we can just bail on NANs from known_signbit until they're properly handled. > Tree_expr_nonnegative_p to see if that=E2=80=99s good enough to be used t= here. Not sure if -0. is negative or if only x for which x < 0. counts as = such.. But yes, access to the sign bit is useful. We're definitely keeping track of signed zeros. That was the whole point of the sign bit. I'll be removing it also, as it's a tristate. tree_expr_nonnegative_p could definitely be made to make use of it...especially because we have global ranges. I'll look into it. > > > How does this look? I must say, the uses look much cleaner. > > Yes, I like it. Attached is the patch I'm pushing. Tested on x86-64 Linux. Thanks. Aldy > > Richard > > > Aldy > > > > gcc/ChangeLog: > > > > * gimple-range-fold.cc > > (fold_using_range::range_of_builtin_int_call): Use fpclassify like A= PI. > > * range-op-float.cc (finite_operand_p): Same. > > (finite_operands_p): Same. > > (foperator_lt::fold_range): Same. > > (foperator_le::fold_range): Same. > > (foperator_gt::fold_range): Same. > > (foperator_ge::fold_range): Same. > > (foperator_unordered::fold_range): Same. > > (foperator_unordered::op1_range): Same. > > (foperator_ordered::fold_range): Same. > > * value-range.cc (frange::set_nan): Same. > > (frange::set_signbit): Same. > > (frange::union_): Same. > > (frange::intersect): Same. > > (frange::operator=3D=3D): Same. > > (frange::singleton_p): Same. > > (frange::verify_range): Same. > > (range_tests_nan): Same. > > (range_tests_floats): Same. > > * value-range.h(frange::known_finite): New. > > (frange::maybe_inf): New. > > (frange::known_inf): New. > > (frange::maybe_nan): New. > > (frange::known_nan): New. > > --- > > gcc/gimple-range-fold.cc | 2 +- > > gcc/range-op-float.cc | 26 ++++++++----------- > > gcc/value-range.cc | 37 ++++++++++++++------------- > > gcc/value-range.h | 54 +++++++++++++++++++++++++++++++++++++++- > > 4 files changed, 83 insertions(+), 36 deletions(-) > > > > diff --git a/gcc/gimple-range-fold.cc b/gcc/gimple-range-fold.cc > > index c9c7a2ccc70..47a1f49eb36 100644 > > --- a/gcc/gimple-range-fold.cc > > +++ b/gcc/gimple-range-fold.cc > > @@ -1031,7 +1031,7 @@ fold_using_range::range_of_builtin_int_call (iran= ge &r, gcall *call, > > { > > if (tmp.get_signbit ().varying_p () > > // FIXME: We don't support signed NANs yet. > > - || !tmp.get_nan ().no_p ()) > > + || tmp.maybe_nan ()) > > return false; > > if (tmp.get_signbit ().yes_p ()) > > r.set_nonzero (type); > > diff --git a/gcc/range-op-float.cc b/gcc/range-op-float.cc > > index 5fbbaa1fb36..0f928b6c098 100644 > > --- a/gcc/range-op-float.cc > > +++ b/gcc/range-op-float.cc > > @@ -167,7 +167,7 @@ frange_set_nan (frange &r, tree type) > > static inline bool > > finite_operand_p (const frange &op1) > > { > > - return flag_finite_math_only || op1.get_nan ().no_p (); > > + return flag_finite_math_only || !op1.maybe_nan (); > > } > > > > // Return TRUE if OP1 and OP2 are known to be free of NANs. > > @@ -175,9 +175,7 @@ finite_operand_p (const frange &op1) > > static inline bool > > finite_operands_p (const frange &op1, const frange &op2) > > { > > - return (flag_finite_math_only > > - || (op1.get_nan ().no_p () > > - && op2.get_nan ().no_p ())); > > + return flag_finite_math_only || (!op1.maybe_nan () && !op2.maybe_nan= ()); > > } > > > > // Floating version of relop_early_resolve that takes into account NAN > > @@ -546,7 +544,7 @@ foperator_lt::fold_range (irange &r, tree type, > > else > > r =3D range_true_and_false (type); > > } > > - else if (op1.get_nan ().yes_p () || op2.get_nan ().yes_p ()) > > + else if (op1.known_nan () || op2.known_nan ()) > > r =3D range_false (type); > > else > > r =3D range_true_and_false (type); > > @@ -648,7 +646,7 @@ foperator_le::fold_range (irange &r, tree type, > > else > > r =3D range_true_and_false (type); > > } > > - else if (op1.get_nan ().yes_p () || op2.get_nan ().yes_p ()) > > + else if (op1.known_nan () || op2.known_nan ()) > > r =3D range_false (type); > > else > > r =3D range_true_and_false (type); > > @@ -742,7 +740,7 @@ foperator_gt::fold_range (irange &r, tree type, > > else > > r =3D range_true_and_false (type); > > } > > - else if (op1.get_nan ().yes_p () || op2.get_nan ().yes_p ()) > > + else if (op1.known_nan () || op2.known_nan ()) > > r =3D range_false (type); > > else > > r =3D range_true_and_false (type); > > @@ -844,7 +842,7 @@ foperator_ge::fold_range (irange &r, tree type, > > else > > r =3D range_true_and_false (type); > > } > > - else if (op1.get_nan ().yes_p () || op2.get_nan ().yes_p ()) > > + else if (op1.known_nan () || op2.known_nan ()) > > r =3D range_false (type); > > else > > r =3D range_true_and_false (type); > > @@ -927,10 +925,10 @@ foperator_unordered::fold_range (irange &r, tree = type, > > relation_kind) const > > { > > // UNORDERED is TRUE if either operand is a NAN. > > - if (op1.get_nan ().yes_p () || op2.get_nan ().yes_p ()) > > + if (op1.known_nan () || op2.known_nan ()) > > r =3D range_true (type); > > // UNORDERED is FALSE if neither operand is a NAN. > > - else if (op1.get_nan ().no_p () && op2.get_nan ().no_p ()) > > + else if (!op1.maybe_nan () && !op2.maybe_nan ()) > > r =3D range_false (type); > > else > > r =3D range_true_and_false (type); > > @@ -949,7 +947,7 @@ foperator_unordered::op1_range (frange &r, tree typ= e, > > r.set_varying (type); > > // Since at least one operand must be NAN, if one of them is > > // not, the other must be. > > - if (op2.get_nan ().no_p ()) > > + if (!op2.maybe_nan ()) > > frange_set_nan (r, type); > > break; > > > > @@ -993,11 +991,9 @@ foperator_ordered::fold_range (irange &r, tree typ= e, > > const frange &op1, const frange &op2, > > relation_kind) const > > { > > - // ORDERED is TRUE if neither operand is a NAN. > > - if (op1.get_nan ().no_p () && op2.get_nan ().no_p ()) > > + if (!op1.maybe_nan () && !op2.maybe_nan ()) > > r =3D range_true (type); > > - // ORDERED is FALSE if either operand is a NAN. > > - else if (op1.get_nan ().yes_p () || op2.get_nan ().yes_p ()) > > + else if (op1.known_nan () || op2.known_nan ()) > > r =3D range_false (type); > > else > > r =3D range_true_and_false (type); > > diff --git a/gcc/value-range.cc b/gcc/value-range.cc > > index c3f668a811a..364919ca5c6 100644 > > --- a/gcc/value-range.cc > > +++ b/gcc/value-range.cc > > @@ -274,7 +274,7 @@ frange::set_nan (fp_prop::kind k) > > { > > if (k =3D=3D fp_prop::YES) > > { > > - if (get_nan ().no_p ()) > > + if (!maybe_nan ()) > > { > > set_undefined (); > > return; > > @@ -284,7 +284,7 @@ frange::set_nan (fp_prop::kind k) > > return; > > } > > > > - if (k =3D=3D fp_prop::NO && get_nan ().yes_p ()) > > + if (k =3D=3D fp_prop::NO && known_nan ()) > > { > > set_undefined (); > > return; > > @@ -308,7 +308,7 @@ frange::set_signbit (fp_prop::kind k) > > gcc_checking_assert (m_type); > > > > // No additional adjustments are needed for a NAN. > > - if (get_nan ().yes_p ()) > > + if (known_nan ()) > > { > > m_props.set_signbit (k); > > return; > > @@ -467,7 +467,7 @@ frange::union_ (const vrange &v) > > > > // If one side has a NAN, the union is the other side, plus the union > > // of the properties and the possibility of a NAN. > > - if (get_nan ().yes_p ()) > > + if (known_nan ()) > > { > > frange_props save =3D m_props; > > *this =3D r; > > @@ -478,7 +478,7 @@ frange::union_ (const vrange &v) > > verify_range (); > > return true; > > } > > - if (r.get_nan ().yes_p ()) > > + if (r.known_nan ()) > > { > > m_props.union_ (r.m_props); > > set_nan (fp_prop::VARYING); > > @@ -525,7 +525,7 @@ frange::intersect (const vrange &v) > > > > // If two NANs are not exactly the same, drop to an unknown NAN, > > // otherwise there's nothing to do. > > - if (get_nan ().yes_p () && r.get_nan ().yes_p ()) > > + if (known_nan () && r.known_nan ()) > > { > > if (m_props =3D=3D r.m_props) > > return false; > > @@ -534,7 +534,7 @@ frange::intersect (const vrange &v) > > return true; > > } > > // ?? Perhaps the intersection of a NAN and anything is a NAN ??. > > - if (get_nan ().yes_p () || r.get_nan ().yes_p ()) > > + if (known_nan () || r.known_nan ()) > > { > > set_varying (m_type); > > return true; > > @@ -590,8 +590,7 @@ frange::operator=3D=3D (const frange &src) const > > if (varying_p ()) > > return types_compatible_p (m_type, src.m_type); > > > > - if (m_props.get_nan ().yes_p () > > - || src.m_props.get_nan ().yes_p ()) > > + if (known_nan () || src.known_nan ()) > > return false; > > > > return (real_identical (&m_min, &src.m_min) > > @@ -644,7 +643,7 @@ frange::singleton_p (tree *result) const > > if (m_kind =3D=3D VR_RANGE && real_identical (&m_min, &m_max)) > > { > > // Return false for any singleton that may be a NAN. > > - if (HONOR_NANS (m_type) && !get_nan ().no_p ()) > > + if (HONOR_NANS (m_type) && maybe_nan ()) > > return false; > > > > // Return the appropriate zero if known. > > @@ -701,7 +700,7 @@ frange::verify_range () > > { > > // If either is a NAN, both must be a NAN. > > gcc_checking_assert (real_identical (&m_min, &m_max)); > > - gcc_checking_assert (get_nan ().yes_p ()); > > + gcc_checking_assert (known_nan ()); > > } > > else > > // Make sure we don't have swapped ranges. > > @@ -710,7 +709,7 @@ frange::verify_range () > > // If we're absolutely sure we have a NAN, the endpoints should > > // reflect this, otherwise we'd have more than one way to represent > > // a NAN. > > - if (m_props.get_nan ().yes_p ()) > > + if (known_nan ()) > > { > > gcc_checking_assert (real_isnan (&m_min)); > > gcc_checking_assert (real_isnan (&m_max)); > > @@ -3637,7 +3636,7 @@ range_tests_nan () > > ASSERT_FALSE (r0 =3D=3D r0); > > ASSERT_TRUE (r0 !=3D r0); > > > > - // [5,6] U NAN is [5,6] with an unknown NAN bit. > > + // [5,6] U NAN. > > r0 =3D frange_float ("5", "6"); > > r0.set_nan (fp_prop::NO); > > r1 =3D frange_nan (float_type_node); > > @@ -3646,7 +3645,7 @@ range_tests_nan () > > real_from_string (&r, "6"); > > ASSERT_TRUE (real_identical (&q, &r0.lower_bound ())); > > ASSERT_TRUE (real_identical (&r, &r0.upper_bound ())); > > - ASSERT_TRUE (r0.get_nan ().varying_p ()); > > + ASSERT_TRUE (r0.maybe_nan ()); > > > > // NAN U NAN =3D NAN > > r0 =3D frange_nan (float_type_node); > > @@ -3654,7 +3653,7 @@ range_tests_nan () > > r0.union_ (r1); > > ASSERT_TRUE (real_isnan (&r0.lower_bound ())); > > ASSERT_TRUE (real_isnan (&r1.upper_bound ())); > > - ASSERT_TRUE (r0.get_nan ().yes_p ()); > > + ASSERT_TRUE (r0.known_nan ()); > > > > // [INF, INF] ^ NAN =3D VARYING > > r0 =3D frange_nan (float_type_node); > > @@ -3666,18 +3665,18 @@ range_tests_nan () > > r0 =3D frange_nan (float_type_node); > > r1 =3D frange_nan (float_type_node); > > r0.intersect (r1); > > - ASSERT_TRUE (r0.get_nan ().yes_p ()); > > + ASSERT_TRUE (r0.known_nan ()); > > > > // VARYING ^ NAN =3D NAN. > > r0 =3D frange_nan (float_type_node); > > r1.set_varying (float_type_node); > > r0.intersect (r1); > > - ASSERT_TRUE (r0.get_nan ().yes_p ()); > > + ASSERT_TRUE (r0.known_nan ()); > > > > // Setting the NAN bit to yes, forces to range to [NAN, NAN]. > > r0.set_varying (float_type_node); > > r0.set_nan (fp_prop::YES); > > - ASSERT_TRUE (r0.get_nan ().yes_p ()); > > + ASSERT_TRUE (r0.known_nan ()); > > ASSERT_TRUE (real_isnan (&r0.lower_bound ())); > > ASSERT_TRUE (real_isnan (&r0.upper_bound ())); > > } > > @@ -3795,7 +3794,7 @@ range_tests_floats () > > // A range of [-INF,+INF] is actually VARYING if no other properties > > // are set. > > r0 =3D frange_float ("-Inf", "+Inf"); > > - if (r0.get_nan ().varying_p ()) > > + if (r0.maybe_nan ()) > > ASSERT_TRUE (r0.varying_p ()); > > // ...unless it has some special property... > > r0.set_nan (fp_prop::NO); > > diff --git a/gcc/value-range.h b/gcc/value-range.h > > index 645dc76c33a..e426225eabf 100644 > > --- a/gcc/value-range.h > > +++ b/gcc/value-range.h > > @@ -330,6 +330,7 @@ private: > > class frange : public vrange > > { > > friend class frange_storage_slot; > > + friend class vrange_printer; > > public: > > frange (); > > frange (const frange &); > > @@ -366,12 +367,19 @@ public: > > const REAL_VALUE_TYPE &lower_bound () const; > > const REAL_VALUE_TYPE &upper_bound () const; > > > > + // fpclassify like API > > + bool known_finite () const; > > + bool maybe_inf () const; > > + bool known_inf () const; > > + bool maybe_nan () const; > > + bool known_nan () const; > > + > > // Accessors for FP properties. > > - fp_prop get_nan () const { return m_props.get_nan (); } > > void set_nan (fp_prop::kind f); > > fp_prop get_signbit () const { return m_props.get_signbit (); } > > void set_signbit (fp_prop::kind); > > private: > > + fp_prop get_nan () const { return m_props.get_nan (); } > > void verify_range (); > > bool normalize_kind (); > > > > @@ -1187,4 +1195,48 @@ frange_nan (tree type) > > return frange (type, r, r); > > } > > > > +// Return TRUE if range is known to be finite. > > + > > +inline bool > > +frange::known_finite () const > > +{ > > + if (undefined_p () || varying_p () || m_kind =3D=3D VR_ANTI_RANGE) > > + return false; > > + return (!real_isnan (&m_min) > > + && !real_isinf (&m_min) > > + && !real_isinf (&m_max)); > > +} > > + > > +// Return TRUE if range may be infinite. > > + > > +inline bool > > +frange::maybe_inf () const > > +{ > > + if (undefined_p () || m_kind =3D=3D VR_ANTI_RANGE) > > + return false; > > + if (varying_p ()) > > + return true; > > + return real_isinf (&m_min) || real_isinf (&m_max); > > +} > > + > > +inline bool > > +frange::known_inf () const > > +{ > > + return (m_kind =3D=3D VR_RANGE > > + && real_identical (&m_min, &m_max) > > + && real_isinf (&m_min)); > > +} > > + > > +inline bool > > +frange::maybe_nan () const > > +{ > > + return !get_nan ().no_p (); > > +} > > + > > +inline bool > > +frange::known_nan () const > > +{ > > + return get_nan ().yes_p (); > > +} > > + > > #endif // GCC_VALUE_RANGE_H > > -- > > 2.37.1 > > > --0000000000007de62405e82848d9 Content-Type: text/x-patch; charset="US-ASCII"; name="0001-Implement-known-maybe-fpclassify-like-API-for-frange.patch" Content-Disposition: attachment; filename="0001-Implement-known-maybe-fpclassify-like-API-for-frange.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_l7sxop4o0 RnJvbSA3OTViYWEwYjA0NDk1M2U5ZjE5OGY0OWUzNzkzNzRkNjMzZjQzYjQ3IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBBbGR5IEhlcm5hbmRleiA8YWxkeWhAcmVkaGF0LmNvbT4KRGF0 ZTogVGh1LCA4IFNlcCAyMDIyIDA4OjExOjQzICswMjAwClN1YmplY3Q6IFtQQVRDSF0gSW1wbGVt ZW50IGtub3duL21heWJlIGZwY2xhc3NpZnkgbGlrZSBBUEkgZm9yIGZyYW5nZS4KCmdjYy9DaGFu Z2VMb2c6CgoJKiBnaW1wbGUtcmFuZ2UtZm9sZC5jYwoJKGZvbGRfdXNpbmdfcmFuZ2U6OnJhbmdl X29mX2J1aWx0aW5faW50X2NhbGwpOiBVc2UgZnBjbGFzc2lmeSBsaWtlIEFQSS4KCSogcmFuZ2Ut b3AtZmxvYXQuY2MgKGZpbml0ZV9vcGVyYW5kX3ApOiBTYW1lLgoJKGZpbml0ZV9vcGVyYW5kc19w KTogU2FtZS4KCShmb3BlcmF0b3JfbHQ6OmZvbGRfcmFuZ2UpOiBTYW1lLgoJKGZvcGVyYXRvcl9s ZTo6Zm9sZF9yYW5nZSk6IFNhbWUuCgkoZm9wZXJhdG9yX2d0Ojpmb2xkX3JhbmdlKTogU2FtZS4K CShmb3BlcmF0b3JfZ2U6OmZvbGRfcmFuZ2UpOiBTYW1lLgoJKGZvcGVyYXRvcl91bm9yZGVyZWQ6 OmZvbGRfcmFuZ2UpOiBTYW1lLgoJKGZvcGVyYXRvcl91bm9yZGVyZWQ6Om9wMV9yYW5nZSk6IFNh bWUuCgkoZm9wZXJhdG9yX29yZGVyZWQ6OmZvbGRfcmFuZ2UpOiBTYW1lLgoJKiB2YWx1ZS1yYW5n ZS5jYyAoZnJhbmdlOjpzZXRfbmFuKTogU2FtZS4KCShmcmFuZ2U6OnNldF9zaWduYml0KTogU2Ft ZS4KCShmcmFuZ2U6OnVuaW9uXyk6IFNhbWUuCgkoZnJhbmdlOjppbnRlcnNlY3QpOiBTYW1lLgoJ KGZyYW5nZTo6b3BlcmF0b3I9PSk6IFNhbWUuCgkoZnJhbmdlOjpzaW5nbGV0b25fcCk6IFNhbWUu CgkoZnJhbmdlOjp2ZXJpZnlfcmFuZ2UpOiBTYW1lLgoJKHJhbmdlX3Rlc3RzX25hbik6IFNhbWUu CgkocmFuZ2VfdGVzdHNfZmxvYXRzKTogU2FtZS4KCSogdmFsdWUtcmFuZ2UuaChmcmFuZ2U6Omtu b3duX2Zpbml0ZSk6IE5ldy4KCShmcmFuZ2U6Om1heWJlX2luZik6IE5ldy4KCShmcmFuZ2U6Omtu b3duX2luZik6IE5ldy4KCShmcmFuZ2U6Om1heWJlX25hbik6IE5ldy4KCShmcmFuZ2U6Omtub3du X25hbik6IE5ldy4KCShmcmFuZ2U6Omtub3duX3NpZ25iaXQpOiBOZXcuCi0tLQogZ2NjL2dpbXBs ZS1yYW5nZS1mb2xkLmNjIHwgIDE5ICsrKy0tLQogZ2NjL3JhbmdlLW9wLWZsb2F0LmNjICAgIHwg IDI2ICsrKystLS0tCiBnY2MvdmFsdWUtcmFuZ2UuY2MgICAgICAgfCAxMjYgKysrKysrKysrKysr KysrKysrKysrKystLS0tLS0tLS0tLS0tLS0tCiBnY2MvdmFsdWUtcmFuZ2UuaCAgICAgICAgfCAg NzggKysrKysrKysrKysrKysrKysrKysrKystCiA0IGZpbGVzIGNoYW5nZWQsIDE3MCBpbnNlcnRp b25zKCspLCA3OSBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9nY2MvZ2ltcGxlLXJhbmdlLWZv bGQuY2MgYi9nY2MvZ2ltcGxlLXJhbmdlLWZvbGQuY2MKaW5kZXggYzljN2EyY2NjNzAuLjg1ZWQ2 ZjlkNDdlIDEwMDY0NAotLS0gYS9nY2MvZ2ltcGxlLXJhbmdlLWZvbGQuY2MKKysrIGIvZ2NjL2dp bXBsZS1yYW5nZS1mb2xkLmNjCkBAIC0xMDI5LDE1ICsxMDI5LDE2IEBAIGZvbGRfdXNpbmdfcmFu Z2U6OnJhbmdlX29mX2J1aWx0aW5faW50X2NhbGwgKGlyYW5nZSAmciwgZ2NhbGwgKmNhbGwsCiAJ ZnJhbmdlIHRtcDsKIAlpZiAoc3JjLmdldF9vcGVyYW5kICh0bXAsIGFyZykpCiAJICB7Ci0JICAg IGlmICh0bXAuZ2V0X3NpZ25iaXQgKCkudmFyeWluZ19wICgpCi0JCS8vIEZJWE1FOiBXZSBkb24n dCBzdXBwb3J0IHNpZ25lZCBOQU5zIHlldC4KLQkJfHwgIXRtcC5nZXRfbmFuICgpLm5vX3AgKCkp Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICBpZiAodG1wLmdldF9zaWduYml0ICgpLnllc19w ICgpKQotCSAgICAgIHIuc2V0X25vbnplcm8gKHR5cGUpOwotCSAgICBlbHNlCi0JICAgICAgci5z ZXRfemVybyAodHlwZSk7Ci0JICAgIHJldHVybiB0cnVlOworCSAgICBib29sIHNpZ25iaXQ7CisJ ICAgIGlmICh0bXAua25vd25fc2lnbmJpdCAoc2lnbmJpdCkpCisJICAgICAgeworCQlpZiAoc2ln bmJpdCkKKwkJICByLnNldF9ub256ZXJvICh0eXBlKTsKKwkJZWxzZQorCQkgIHIuc2V0X3plcm8g KHR5cGUpOworCQlyZXR1cm4gdHJ1ZTsKKwkgICAgICB9CisJICAgIHJldHVybiBmYWxzZTsKIAkg IH0KIAlicmVhazsKICAgICAgIH0KZGlmZiAtLWdpdCBhL2djYy9yYW5nZS1vcC1mbG9hdC5jYyBi L2djYy9yYW5nZS1vcC1mbG9hdC5jYwppbmRleCA1ZmJiYWExZmIzNi4uMGY5MjhiNmMwOTggMTAw NjQ0Ci0tLSBhL2djYy9yYW5nZS1vcC1mbG9hdC5jYworKysgYi9nY2MvcmFuZ2Utb3AtZmxvYXQu Y2MKQEAgLTE2Nyw3ICsxNjcsNyBAQCBmcmFuZ2Vfc2V0X25hbiAoZnJhbmdlICZyLCB0cmVlIHR5 cGUpCiBzdGF0aWMgaW5saW5lIGJvb2wKIGZpbml0ZV9vcGVyYW5kX3AgKGNvbnN0IGZyYW5nZSAm b3AxKQogewotICByZXR1cm4gZmxhZ19maW5pdGVfbWF0aF9vbmx5IHx8IG9wMS5nZXRfbmFuICgp Lm5vX3AgKCk7CisgIHJldHVybiBmbGFnX2Zpbml0ZV9tYXRoX29ubHkgfHwgIW9wMS5tYXliZV9u YW4gKCk7CiB9CiAKIC8vIFJldHVybiBUUlVFIGlmIE9QMSBhbmQgT1AyIGFyZSBrbm93biB0byBi ZSBmcmVlIG9mIE5BTnMuCkBAIC0xNzUsOSArMTc1LDcgQEAgZmluaXRlX29wZXJhbmRfcCAoY29u c3QgZnJhbmdlICZvcDEpCiBzdGF0aWMgaW5saW5lIGJvb2wKIGZpbml0ZV9vcGVyYW5kc19wIChj b25zdCBmcmFuZ2UgJm9wMSwgY29uc3QgZnJhbmdlICZvcDIpCiB7Ci0gIHJldHVybiAoZmxhZ19m aW5pdGVfbWF0aF9vbmx5Ci0JICB8fCAob3AxLmdldF9uYW4gKCkubm9fcCAoKQotCSAgICAgICYm IG9wMi5nZXRfbmFuICgpLm5vX3AgKCkpKTsKKyAgcmV0dXJuIGZsYWdfZmluaXRlX21hdGhfb25s eSB8fCAoIW9wMS5tYXliZV9uYW4gKCkgJiYgIW9wMi5tYXliZV9uYW4gKCkpOwogfQogCiAvLyBG bG9hdGluZyB2ZXJzaW9uIG9mIHJlbG9wX2Vhcmx5X3Jlc29sdmUgdGhhdCB0YWtlcyBpbnRvIGFj Y291bnQgTkFOCkBAIC01NDYsNyArNTQ0LDcgQEAgZm9wZXJhdG9yX2x0Ojpmb2xkX3JhbmdlIChp cmFuZ2UgJnIsIHRyZWUgdHlwZSwKICAgICAgIGVsc2UKIAlyID0gcmFuZ2VfdHJ1ZV9hbmRfZmFs c2UgKHR5cGUpOwogICAgIH0KLSAgZWxzZSBpZiAob3AxLmdldF9uYW4gKCkueWVzX3AgKCkgfHwg b3AyLmdldF9uYW4gKCkueWVzX3AgKCkpCisgIGVsc2UgaWYgKG9wMS5rbm93bl9uYW4gKCkgfHwg b3AyLmtub3duX25hbiAoKSkKICAgICByID0gcmFuZ2VfZmFsc2UgKHR5cGUpOwogICBlbHNlCiAg ICAgciA9IHJhbmdlX3RydWVfYW5kX2ZhbHNlICh0eXBlKTsKQEAgLTY0OCw3ICs2NDYsNyBAQCBm b3BlcmF0b3JfbGU6OmZvbGRfcmFuZ2UgKGlyYW5nZSAmciwgdHJlZSB0eXBlLAogICAgICAgZWxz ZQogCXIgPSByYW5nZV90cnVlX2FuZF9mYWxzZSAodHlwZSk7CiAgICAgfQotICBlbHNlIGlmIChv cDEuZ2V0X25hbiAoKS55ZXNfcCAoKSB8fCBvcDIuZ2V0X25hbiAoKS55ZXNfcCAoKSkKKyAgZWxz ZSBpZiAob3AxLmtub3duX25hbiAoKSB8fCBvcDIua25vd25fbmFuICgpKQogICAgIHIgPSByYW5n ZV9mYWxzZSAodHlwZSk7CiAgIGVsc2UKICAgICByID0gcmFuZ2VfdHJ1ZV9hbmRfZmFsc2UgKHR5 cGUpOwpAQCAtNzQyLDcgKzc0MCw3IEBAIGZvcGVyYXRvcl9ndDo6Zm9sZF9yYW5nZSAoaXJhbmdl ICZyLCB0cmVlIHR5cGUsCiAgICAgICBlbHNlCiAJciA9IHJhbmdlX3RydWVfYW5kX2ZhbHNlICh0 eXBlKTsKICAgICB9Ci0gIGVsc2UgaWYgKG9wMS5nZXRfbmFuICgpLnllc19wICgpIHx8IG9wMi5n ZXRfbmFuICgpLnllc19wICgpKQorICBlbHNlIGlmIChvcDEua25vd25fbmFuICgpIHx8IG9wMi5r bm93bl9uYW4gKCkpCiAgICAgciA9IHJhbmdlX2ZhbHNlICh0eXBlKTsKICAgZWxzZQogICAgIHIg PSByYW5nZV90cnVlX2FuZF9mYWxzZSAodHlwZSk7CkBAIC04NDQsNyArODQyLDcgQEAgZm9wZXJh dG9yX2dlOjpmb2xkX3JhbmdlIChpcmFuZ2UgJnIsIHRyZWUgdHlwZSwKICAgICAgIGVsc2UKIAly ID0gcmFuZ2VfdHJ1ZV9hbmRfZmFsc2UgKHR5cGUpOwogICAgIH0KLSAgZWxzZSBpZiAob3AxLmdl dF9uYW4gKCkueWVzX3AgKCkgfHwgb3AyLmdldF9uYW4gKCkueWVzX3AgKCkpCisgIGVsc2UgaWYg KG9wMS5rbm93bl9uYW4gKCkgfHwgb3AyLmtub3duX25hbiAoKSkKICAgICByID0gcmFuZ2VfZmFs c2UgKHR5cGUpOwogICBlbHNlCiAgICAgciA9IHJhbmdlX3RydWVfYW5kX2ZhbHNlICh0eXBlKTsK QEAgLTkyNywxMCArOTI1LDEwIEBAIGZvcGVyYXRvcl91bm9yZGVyZWQ6OmZvbGRfcmFuZ2UgKGly YW5nZSAmciwgdHJlZSB0eXBlLAogCQkJCSByZWxhdGlvbl9raW5kKSBjb25zdAogewogICAvLyBV Tk9SREVSRUQgaXMgVFJVRSBpZiBlaXRoZXIgb3BlcmFuZCBpcyBhIE5BTi4KLSAgaWYgKG9wMS5n ZXRfbmFuICgpLnllc19wICgpIHx8IG9wMi5nZXRfbmFuICgpLnllc19wICgpKQorICBpZiAob3Ax Lmtub3duX25hbiAoKSB8fCBvcDIua25vd25fbmFuICgpKQogICAgIHIgPSByYW5nZV90cnVlICh0 eXBlKTsKICAgLy8gVU5PUkRFUkVEIGlzIEZBTFNFIGlmIG5laXRoZXIgb3BlcmFuZCBpcyBhIE5B Ti4KLSAgZWxzZSBpZiAob3AxLmdldF9uYW4gKCkubm9fcCAoKSAmJiBvcDIuZ2V0X25hbiAoKS5u b19wICgpKQorICBlbHNlIGlmICghb3AxLm1heWJlX25hbiAoKSAmJiAhb3AyLm1heWJlX25hbiAo KSkKICAgICByID0gcmFuZ2VfZmFsc2UgKHR5cGUpOwogICBlbHNlCiAgICAgciA9IHJhbmdlX3Ry dWVfYW5kX2ZhbHNlICh0eXBlKTsKQEAgLTk0OSw3ICs5NDcsNyBAQCBmb3BlcmF0b3JfdW5vcmRl cmVkOjpvcDFfcmFuZ2UgKGZyYW5nZSAmciwgdHJlZSB0eXBlLAogICAgICAgci5zZXRfdmFyeWlu ZyAodHlwZSk7CiAgICAgICAvLyBTaW5jZSBhdCBsZWFzdCBvbmUgb3BlcmFuZCBtdXN0IGJlIE5B TiwgaWYgb25lIG9mIHRoZW0gaXMKICAgICAgIC8vIG5vdCwgdGhlIG90aGVyIG11c3QgYmUuCi0g ICAgICBpZiAob3AyLmdldF9uYW4gKCkubm9fcCAoKSkKKyAgICAgIGlmICghb3AyLm1heWJlX25h biAoKSkKIAlmcmFuZ2Vfc2V0X25hbiAociwgdHlwZSk7CiAgICAgICBicmVhazsKIApAQCAtOTkz LDExICs5OTEsOSBAQCBmb3BlcmF0b3Jfb3JkZXJlZDo6Zm9sZF9yYW5nZSAoaXJhbmdlICZyLCB0 cmVlIHR5cGUsCiAJCQkgICAgICAgY29uc3QgZnJhbmdlICZvcDEsIGNvbnN0IGZyYW5nZSAmb3Ay LAogCQkJICAgICAgIHJlbGF0aW9uX2tpbmQpIGNvbnN0CiB7Ci0gIC8vIE9SREVSRUQgaXMgVFJV RSBpZiBuZWl0aGVyIG9wZXJhbmQgaXMgYSBOQU4uCi0gIGlmIChvcDEuZ2V0X25hbiAoKS5ub19w ICgpICYmIG9wMi5nZXRfbmFuICgpLm5vX3AgKCkpCisgIGlmICghb3AxLm1heWJlX25hbiAoKSAm JiAhb3AyLm1heWJlX25hbiAoKSkKICAgICByID0gcmFuZ2VfdHJ1ZSAodHlwZSk7Ci0gIC8vIE9S REVSRUQgaXMgRkFMU0UgaWYgZWl0aGVyIG9wZXJhbmQgaXMgYSBOQU4uCi0gIGVsc2UgaWYgKG9w MS5nZXRfbmFuICgpLnllc19wICgpIHx8IG9wMi5nZXRfbmFuICgpLnllc19wICgpKQorICBlbHNl IGlmIChvcDEua25vd25fbmFuICgpIHx8IG9wMi5rbm93bl9uYW4gKCkpCiAgICAgciA9IHJhbmdl X2ZhbHNlICh0eXBlKTsKICAgZWxzZQogICAgIHIgPSByYW5nZV90cnVlX2FuZF9mYWxzZSAodHlw ZSk7CmRpZmYgLS1naXQgYS9nY2MvdmFsdWUtcmFuZ2UuY2MgYi9nY2MvdmFsdWUtcmFuZ2UuY2MK aW5kZXggYzNmNjY4YTgxMWEuLmFkY2FhYTJhNjlhIDEwMDY0NAotLS0gYS9nY2MvdmFsdWUtcmFu Z2UuY2MKKysrIGIvZ2NjL3ZhbHVlLXJhbmdlLmNjCkBAIC0yNzQsNyArMjc0LDcgQEAgZnJhbmdl OjpzZXRfbmFuIChmcF9wcm9wOjpraW5kIGspCiB7CiAgIGlmIChrID09IGZwX3Byb3A6OllFUykK ICAgICB7Ci0gICAgICBpZiAoZ2V0X25hbiAoKS5ub19wICgpKQorICAgICAgaWYgKCFtYXliZV9u YW4gKCkpCiAJewogCSAgc2V0X3VuZGVmaW5lZCAoKTsKIAkgIHJldHVybjsKQEAgLTI4NCw3ICsy ODQsNyBAQCBmcmFuZ2U6OnNldF9uYW4gKGZwX3Byb3A6OmtpbmQgaykKICAgICAgIHJldHVybjsK ICAgICB9CiAKLSAgaWYgKGsgPT0gZnBfcHJvcDo6Tk8gJiYgZ2V0X25hbiAoKS55ZXNfcCAoKSkK KyAgaWYgKGsgPT0gZnBfcHJvcDo6Tk8gJiYga25vd25fbmFuICgpKQogICAgIHsKICAgICAgIHNl dF91bmRlZmluZWQgKCk7CiAgICAgICByZXR1cm47CkBAIC0zMDgsMjEgKzMwOCwxOCBAQCBmcmFu Z2U6OnNldF9zaWduYml0IChmcF9wcm9wOjpraW5kIGspCiAgIGdjY19jaGVja2luZ19hc3NlcnQg KG1fdHlwZSk7CiAKICAgLy8gTm8gYWRkaXRpb25hbCBhZGp1c3RtZW50cyBhcmUgbmVlZGVkIGZv ciBhIE5BTi4KLSAgaWYgKGdldF9uYW4gKCkueWVzX3AgKCkpCisgIGlmIChrbm93bl9uYW4gKCkp CiAgICAgewogICAgICAgbV9wcm9wcy5zZXRfc2lnbmJpdCAoayk7CiAgICAgICByZXR1cm47CiAg ICAgfQogICAvLyBJZ25vcmUgc2lnbiBjaGFuZ2VzIHdoZW4gdGhleSdyZSBzZXQgY29ycmVjdGx5 LgotICBpZiAocmVhbF9sZXNzICgmbV9tYXgsICZkY29uc3QwKSkKLSAgICB7Ci0gICAgICBnY2Nf Y2hlY2tpbmdfYXNzZXJ0IChnZXRfc2lnbmJpdCAoKS55ZXNfcCAoKSk7Ci0gICAgICByZXR1cm47 Ci0gICAgfQotICBpZiAocmVhbF9sZXNzICgmZGNvbnN0MCwgJm1fbWluKSkKKyAgaWYgKCFtYXli ZV9uYW4gKCkpCiAgICAgewotICAgICAgZ2NjX2NoZWNraW5nX2Fzc2VydCAoZ2V0X3NpZ25iaXQg KCkubm9fcCAoKSk7Ci0gICAgICByZXR1cm47CisgICAgICBpZiAocmVhbF9sZXNzICgmbV9tYXgs ICZkY29uc3QwKSkKKwlyZXR1cm47CisgICAgICBpZiAocmVhbF9sZXNzICgmZGNvbnN0MCwgJm1f bWluKSkKKwlyZXR1cm47CiAgICAgfQogICAvLyBBZGp1c3QgdGhlIHJhbmdlIGRlcGVuZGluZyBv biB0aGUgc2lnbiBiaXQuCiAgIGlmIChrID09IGZwX3Byb3A6OllFUykKQEAgLTMzMCwxNyArMzI3 LDIyIEBAIGZyYW5nZTo6c2V0X3NpZ25iaXQgKGZwX3Byb3A6OmtpbmQgaykKICAgICAgIC8vIENy b3AgdGhlIHJhbmdlIHRvIFstSU5GLCAwXS4KICAgICAgIGZyYW5nZSBjcm9wIChtX3R5cGUsIGRj b25zdG5pbmYsIGRjb25zdDApOwogICAgICAgaW50ZXJzZWN0IChjcm9wKTsKLSAgICAgIG1fcHJv cHMuc2V0X3NpZ25iaXQgKGZwX3Byb3A6OllFUyk7CisgICAgICBpZiAoIXVuZGVmaW5lZF9wICgp KQorCW1fcHJvcHMuc2V0X3NpZ25iaXQgKGZwX3Byb3A6OllFUyk7CiAgICAgfQogICBlbHNlIGlm IChrID09IGZwX3Byb3A6Ok5PKQogICAgIHsKICAgICAgIC8vIENyb3AgdGhlIHJhbmdlIHRvIFsw LCArSU5GXS4KICAgICAgIGZyYW5nZSBjcm9wIChtX3R5cGUsIGRjb25zdDAsIGRjb25zdGluZik7 CiAgICAgICBpbnRlcnNlY3QgKGNyb3ApOwotICAgICAgbV9wcm9wcy5zZXRfc2lnbmJpdCAoZnBf cHJvcDo6Tk8pOworICAgICAgaWYgKCF1bmRlZmluZWRfcCAoKSkKKwltX3Byb3BzLnNldF9zaWdu Yml0IChmcF9wcm9wOjpOTyk7CiAgICAgfQogICBlbHNlCi0gICAgbV9wcm9wcy5zZXRfc2lnbmJp dCAoZnBfcHJvcDo6VkFSWUlORyk7CisgICAgeworICAgICAgbV9wcm9wcy5zZXRfc2lnbmJpdCAo ZnBfcHJvcDo6VkFSWUlORyk7CisgICAgICBub3JtYWxpemVfa2luZCAoKTsKKyAgICB9CiAKICAg aWYgKGZsYWdfY2hlY2tpbmcpCiAgICAgdmVyaWZ5X3JhbmdlICgpOwpAQCAtNDY3LDcgKzQ2OSw3 IEBAIGZyYW5nZTo6dW5pb25fIChjb25zdCB2cmFuZ2UgJnYpCiAKICAgLy8gSWYgb25lIHNpZGUg aGFzIGEgTkFOLCB0aGUgdW5pb24gaXMgdGhlIG90aGVyIHNpZGUsIHBsdXMgdGhlIHVuaW9uCiAg IC8vIG9mIHRoZSBwcm9wZXJ0aWVzIGFuZCB0aGUgcG9zc2liaWxpdHkgb2YgYSBOQU4uCi0gIGlm IChnZXRfbmFuICgpLnllc19wICgpKQorICBpZiAoa25vd25fbmFuICgpKQogICAgIHsKICAgICAg IGZyYW5nZV9wcm9wcyBzYXZlID0gbV9wcm9wczsKICAgICAgICp0aGlzID0gcjsKQEAgLTQ3OCw3 ICs0ODAsNyBAQCBmcmFuZ2U6OnVuaW9uXyAoY29uc3QgdnJhbmdlICZ2KQogCXZlcmlmeV9yYW5n ZSAoKTsKICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KLSAgaWYgKHIuZ2V0X25hbiAoKS55ZXNf cCAoKSkKKyAgaWYgKHIua25vd25fbmFuICgpKQogICAgIHsKICAgICAgIG1fcHJvcHMudW5pb25f IChyLm1fcHJvcHMpOwogICAgICAgc2V0X25hbiAoZnBfcHJvcDo6VkFSWUlORyk7CkBAIC01MjUs NyArNTI3LDcgQEAgZnJhbmdlOjppbnRlcnNlY3QgKGNvbnN0IHZyYW5nZSAmdikKIAogICAvLyBJ ZiB0d28gTkFOcyBhcmUgbm90IGV4YWN0bHkgdGhlIHNhbWUsIGRyb3AgdG8gYW4gdW5rbm93biBO QU4sCiAgIC8vIG90aGVyd2lzZSB0aGVyZSdzIG5vdGhpbmcgdG8gZG8uCi0gIGlmIChnZXRfbmFu ICgpLnllc19wICgpICYmIHIuZ2V0X25hbiAoKS55ZXNfcCAoKSkKKyAgaWYgKGtub3duX25hbiAo KSAmJiByLmtub3duX25hbiAoKSkKICAgICB7CiAgICAgICBpZiAobV9wcm9wcyA9PSByLm1fcHJv cHMpCiAJcmV0dXJuIGZhbHNlOwpAQCAtNTM0LDcgKzUzNiw3IEBAIGZyYW5nZTo6aW50ZXJzZWN0 IChjb25zdCB2cmFuZ2UgJnYpCiAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgIC8vID8/IFBl cmhhcHMgdGhlIGludGVyc2VjdGlvbiBvZiBhIE5BTiBhbmQgYW55dGhpbmcgaXMgYSBOQU4gPz8u Ci0gIGlmIChnZXRfbmFuICgpLnllc19wICgpIHx8IHIuZ2V0X25hbiAoKS55ZXNfcCAoKSkKKyAg aWYgKGtub3duX25hbiAoKSB8fCByLmtub3duX25hbiAoKSkKICAgICB7CiAgICAgICBzZXRfdmFy eWluZyAobV90eXBlKTsKICAgICAgIHJldHVybiB0cnVlOwpAQCAtNTkwLDggKzU5Miw3IEBAIGZy YW5nZTo6b3BlcmF0b3I9PSAoY29uc3QgZnJhbmdlICZzcmMpIGNvbnN0CiAgICAgICBpZiAodmFy eWluZ19wICgpKQogCXJldHVybiB0eXBlc19jb21wYXRpYmxlX3AgKG1fdHlwZSwgc3JjLm1fdHlw ZSk7CiAKLSAgICAgIGlmIChtX3Byb3BzLmdldF9uYW4gKCkueWVzX3AgKCkKLQkgIHx8IHNyYy5t X3Byb3BzLmdldF9uYW4gKCkueWVzX3AgKCkpCisgICAgICBpZiAoa25vd25fbmFuICgpIHx8IHNy Yy5rbm93bl9uYW4gKCkpCiAJcmV0dXJuIGZhbHNlOwogCiAgICAgICByZXR1cm4gKHJlYWxfaWRl bnRpY2FsICgmbV9taW4sICZzcmMubV9taW4pCkBAIC02MjEsNiArNjIyLDkgQEAgZnJhbmdlOjpj b250YWluc19wICh0cmVlIGNzdCkgY29uc3QKICAgICB7CiAgICAgICBpZiAoSE9OT1JfU0lHTkVE X1pFUk9TIChtX3R5cGUpICYmIHJlYWxfaXN6ZXJvIChydikpCiAJeworCSAgLy8gRklYTUU6IFRo aXMgaXMgc3RpbGwgdXNpbmcgZ2V0X3NpZ25iaXQoKSBpbnN0ZWFkIG9mCisJICAvLyBrbm93bl9z aWduYml0KCkgYmVjYXVzZSB0aGUgbGF0dGVyIGJhaWxzIG9uIHBvc3NpYmxlIE5BTnMKKwkgIC8v IChmb3Igbm93KS4KIAkgIGlmIChnZXRfc2lnbmJpdCAoKS55ZXNfcCAoKSkKIAkgICAgcmV0dXJu IHJlYWxfaXNuZWcgKHJ2KTsKIAkgIGVsc2UgaWYgKGdldF9zaWduYml0ICgpLm5vX3AgKCkpCkBA IC02NDQsMjIgKzY0OCwyNSBAQCBmcmFuZ2U6OnNpbmdsZXRvbl9wICh0cmVlICpyZXN1bHQpIGNv bnN0CiAgIGlmIChtX2tpbmQgPT0gVlJfUkFOR0UgJiYgcmVhbF9pZGVudGljYWwgKCZtX21pbiwg Jm1fbWF4KSkKICAgICB7CiAgICAgICAvLyBSZXR1cm4gZmFsc2UgZm9yIGFueSBzaW5nbGV0b24g dGhhdCBtYXkgYmUgYSBOQU4uCi0gICAgICBpZiAoSE9OT1JfTkFOUyAobV90eXBlKSAmJiAhZ2V0 X25hbiAoKS5ub19wICgpKQorICAgICAgaWYgKEhPTk9SX05BTlMgKG1fdHlwZSkgJiYgbWF5YmVf bmFuICgpKQogCXJldHVybiBmYWxzZTsKIAogICAgICAgLy8gUmV0dXJuIHRoZSBhcHByb3ByaWF0 ZSB6ZXJvIGlmIGtub3duLgogICAgICAgaWYgKEhPTk9SX1NJR05FRF9aRVJPUyAobV90eXBlKSAm JiB6ZXJvX3AgKCkpCiAJewotCSAgaWYgKGdldF9zaWduYml0ICgpLm5vX3AgKCkpCisJICBib29s IHNpZ25iaXQ7CisJICBpZiAoa25vd25fc2lnbmJpdCAoc2lnbmJpdCkpCiAJICAgIHsKLQkgICAg ICBpZiAocmVzdWx0KQotCQkqcmVzdWx0ID0gYnVpbGRfcmVhbCAobV90eXBlLCBkY29uc3QwKTsK LQkgICAgICByZXR1cm4gdHJ1ZTsKLQkgICAgfQotCSAgaWYgKGdldF9zaWduYml0ICgpLnllc19w ICgpKQotCSAgICB7Ci0JICAgICAgaWYgKHJlc3VsdCkKLQkJKnJlc3VsdCA9IGJ1aWxkX3JlYWwg KG1fdHlwZSwgcmVhbF92YWx1ZV9uZWdhdGUgKCZkY29uc3QwKSk7CisJICAgICAgaWYgKHNpZ25i aXQpCisJCXsKKwkJICBpZiAocmVzdWx0KQorCQkgICAgKnJlc3VsdCA9IGJ1aWxkX3JlYWwgKG1f dHlwZSwgcmVhbF92YWx1ZV9uZWdhdGUgKCZkY29uc3QwKSk7CisJCX0KKwkgICAgICBlbHNlCisJ CXsKKwkJICBpZiAocmVzdWx0KQorCQkgICAgKnJlc3VsdCA9IGJ1aWxkX3JlYWwgKG1fdHlwZSwg ZGNvbnN0MCk7CisJCX0KIAkgICAgICByZXR1cm4gdHJ1ZTsKIAkgICAgfQogCSAgcmV0dXJuIGZh bHNlOwpAQCAtNzAxLDcgKzcwOCw3IEBAIGZyYW5nZTo6dmVyaWZ5X3JhbmdlICgpCiAgICAgewog ICAgICAgLy8gSWYgZWl0aGVyIGlzIGEgTkFOLCBib3RoIG11c3QgYmUgYSBOQU4uCiAgICAgICBn Y2NfY2hlY2tpbmdfYXNzZXJ0IChyZWFsX2lkZW50aWNhbCAoJm1fbWluLCAmbV9tYXgpKTsKLSAg ICAgIGdjY19jaGVja2luZ19hc3NlcnQgKGdldF9uYW4gKCkueWVzX3AgKCkpOworICAgICAgZ2Nj X2NoZWNraW5nX2Fzc2VydCAoa25vd25fbmFuICgpKTsKICAgICB9CiAgIGVsc2UKICAgICAvLyBN YWtlIHN1cmUgd2UgZG9uJ3QgaGF2ZSBzd2FwcGVkIHJhbmdlcy4KQEAgLTcxMCw3ICs3MTcsNyBA QCBmcmFuZ2U6OnZlcmlmeV9yYW5nZSAoKQogICAvLyBJZiB3ZSdyZSBhYnNvbHV0ZWx5IHN1cmUg d2UgaGF2ZSBhIE5BTiwgdGhlIGVuZHBvaW50cyBzaG91bGQKICAgLy8gcmVmbGVjdCB0aGlzLCBv dGhlcndpc2Ugd2UnZCBoYXZlIG1vcmUgdGhhbiBvbmUgd2F5IHRvIHJlcHJlc2VudAogICAvLyBh IE5BTi4KLSAgaWYgKG1fcHJvcHMuZ2V0X25hbiAoKS55ZXNfcCAoKSkKKyAgaWYgKGtub3duX25h biAoKSkKICAgICB7CiAgICAgICBnY2NfY2hlY2tpbmdfYXNzZXJ0IChyZWFsX2lzbmFuICgmbV9t aW4pKTsKICAgICAgIGdjY19jaGVja2luZ19hc3NlcnQgKHJlYWxfaXNuYW4gKCZtX21heCkpOwpA QCAtNzE4LDEwICs3MjUsMTQgQEAgZnJhbmdlOjp2ZXJpZnlfcmFuZ2UgKCkKICAgZWxzZQogICAg IHsKICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgc2lnbmJpdCBhbmQgcmFuZ2UgYWdyZWUuCi0gICAg ICBpZiAobV9wcm9wcy5nZXRfc2lnbmJpdCAoKS55ZXNfcCAoKSkKLQlnY2NfY2hlY2tpbmdfYXNz ZXJ0IChyZWFsX2NvbXBhcmUgKExFX0VYUFIsICZtX21heCwgJmRjb25zdDApKTsKLSAgICAgIGVs c2UgaWYgKG1fcHJvcHMuZ2V0X3NpZ25iaXQgKCkubm9fcCAoKSkKLQlnY2NfY2hlY2tpbmdfYXNz ZXJ0IChyZWFsX2NvbXBhcmUgKEdFX0VYUFIsICZtX21pbiwgJmRjb25zdDApKTsKKyAgICAgIGJv b2wgc2lnbmJpdDsKKyAgICAgIGlmIChrbm93bl9zaWduYml0IChzaWduYml0KSkKKwl7CisJICBp ZiAoc2lnbmJpdCkKKwkgICAgZ2NjX2NoZWNraW5nX2Fzc2VydCAocmVhbF9jb21wYXJlIChMRV9F WFBSLCAmbV9tYXgsICZkY29uc3QwKSk7CisJICBlbHNlCisJICAgIGdjY19jaGVja2luZ19hc3Nl cnQgKHJlYWxfY29tcGFyZSAoR0VfRVhQUiwgJm1fbWluLCAmZGNvbnN0MCkpOworCX0KICAgICB9 CiAKICAgLy8gSWYgYWxsIHRoZSBwcm9wZXJ0aWVzIGFyZSBjbGVhciwgd2UgYmV0dGVyIG5vdCBz cGFuIHRoZSBlbnRpcmUKQEAgLTM2MzcsNyArMzY0OCw3IEBAIHJhbmdlX3Rlc3RzX25hbiAoKQog ICBBU1NFUlRfRkFMU0UgKHIwID09IHIwKTsKICAgQVNTRVJUX1RSVUUgKHIwICE9IHIwKTsKIAot ICAvLyBbNSw2XSBVIE5BTiBpcyBbNSw2XSB3aXRoIGFuIHVua25vd24gTkFOIGJpdC4KKyAgLy8g WzUsNl0gVSBOQU4uCiAgIHIwID0gZnJhbmdlX2Zsb2F0ICgiNSIsICI2Iik7CiAgIHIwLnNldF9u YW4gKGZwX3Byb3A6Ok5PKTsKICAgcjEgPSBmcmFuZ2VfbmFuIChmbG9hdF90eXBlX25vZGUpOwpA QCAtMzY0Niw3ICszNjU3LDcgQEAgcmFuZ2VfdGVzdHNfbmFuICgpCiAgIHJlYWxfZnJvbV9zdHJp bmcgKCZyLCAiNiIpOwogICBBU1NFUlRfVFJVRSAocmVhbF9pZGVudGljYWwgKCZxLCAmcjAubG93 ZXJfYm91bmQgKCkpKTsKICAgQVNTRVJUX1RSVUUgKHJlYWxfaWRlbnRpY2FsICgmciwgJnIwLnVw cGVyX2JvdW5kICgpKSk7Ci0gIEFTU0VSVF9UUlVFIChyMC5nZXRfbmFuICgpLnZhcnlpbmdfcCAo KSk7CisgIEFTU0VSVF9UUlVFIChyMC5tYXliZV9uYW4gKCkpOwogCiAgIC8vIE5BTiBVIE5BTiA9 IE5BTgogICByMCA9IGZyYW5nZV9uYW4gKGZsb2F0X3R5cGVfbm9kZSk7CkBAIC0zNjU0LDcgKzM2 NjUsNyBAQCByYW5nZV90ZXN0c19uYW4gKCkKICAgcjAudW5pb25fIChyMSk7CiAgIEFTU0VSVF9U UlVFIChyZWFsX2lzbmFuICgmcjAubG93ZXJfYm91bmQgKCkpKTsKICAgQVNTRVJUX1RSVUUgKHJl YWxfaXNuYW4gKCZyMS51cHBlcl9ib3VuZCAoKSkpOwotICBBU1NFUlRfVFJVRSAocjAuZ2V0X25h biAoKS55ZXNfcCAoKSk7CisgIEFTU0VSVF9UUlVFIChyMC5rbm93bl9uYW4gKCkpOwogCiAgIC8v IFtJTkYsIElORl0gXiBOQU4gPSBWQVJZSU5HCiAgIHIwID0gZnJhbmdlX25hbiAoZmxvYXRfdHlw ZV9ub2RlKTsKQEAgLTM2NjYsMTggKzM2NzcsMTggQEAgcmFuZ2VfdGVzdHNfbmFuICgpCiAgIHIw ID0gZnJhbmdlX25hbiAoZmxvYXRfdHlwZV9ub2RlKTsKICAgcjEgPSBmcmFuZ2VfbmFuIChmbG9h dF90eXBlX25vZGUpOwogICByMC5pbnRlcnNlY3QgKHIxKTsKLSAgQVNTRVJUX1RSVUUgKHIwLmdl dF9uYW4gKCkueWVzX3AgKCkpOworICBBU1NFUlRfVFJVRSAocjAua25vd25fbmFuICgpKTsKIAog ICAvLyBWQVJZSU5HIF4gTkFOID0gTkFOLgogICByMCA9IGZyYW5nZV9uYW4gKGZsb2F0X3R5cGVf bm9kZSk7CiAgIHIxLnNldF92YXJ5aW5nIChmbG9hdF90eXBlX25vZGUpOwogICByMC5pbnRlcnNl Y3QgKHIxKTsKLSAgQVNTRVJUX1RSVUUgKHIwLmdldF9uYW4gKCkueWVzX3AgKCkpOworICBBU1NF UlRfVFJVRSAocjAua25vd25fbmFuICgpKTsKIAogICAvLyBTZXR0aW5nIHRoZSBOQU4gYml0IHRv IHllcywgZm9yY2VzIHRvIHJhbmdlIHRvIFtOQU4sIE5BTl0uCiAgIHIwLnNldF92YXJ5aW5nIChm bG9hdF90eXBlX25vZGUpOwogICByMC5zZXRfbmFuIChmcF9wcm9wOjpZRVMpOwotICBBU1NFUlRf VFJVRSAocjAuZ2V0X25hbiAoKS55ZXNfcCAoKSk7CisgIEFTU0VSVF9UUlVFIChyMC5rbm93bl9u YW4gKCkpOwogICBBU1NFUlRfVFJVRSAocmVhbF9pc25hbiAoJnIwLmxvd2VyX2JvdW5kICgpKSk7 CiAgIEFTU0VSVF9UUlVFIChyZWFsX2lzbmFuICgmcjAudXBwZXJfYm91bmQgKCkpKTsKIH0KQEAg LTM2ODksNiArMzcwMCw3IEBAIHJhbmdlX3Rlc3RzX3NpZ25lZF96ZXJvcyAoKQogICB0cmVlIG5l Z196ZXJvID0gZm9sZF9idWlsZDEgKE5FR0FURV9FWFBSLCBmbG9hdF90eXBlX25vZGUsIHplcm8p OwogICBSRUFMX1ZBTFVFX1RZUEUgcSwgcjsKICAgZnJhbmdlIHIwLCByMTsKKyAgYm9vbCBzaWdu Yml0OwogCiAgIC8vIFNpbmNlIC0wLjAgPT0gKzAuMCwgYSByYW5nZSBvZiBbLTAuMCwgLTAuMF0g c2hvdWxkIGNvbnRhaW4gKzAuMAogICAvLyBhbmQgdmljZSB2ZXJzYS4KQEAgLTM3MjIsNyArMzcz NCw3IEBAIHJhbmdlX3Rlc3RzX3NpZ25lZF96ZXJvcyAoKQogICByMSA9IGZyYW5nZSAoemVybywg emVybyk7CiAgIHIxLnNldF9zaWduYml0IChmcF9wcm9wOjpZRVMpOwogICByMC51bmlvbl8gKHIx KTsKLSAgQVNTRVJUX1RSVUUgKHIwLnplcm9fcCAoKSAmJiByMC5nZXRfc2lnbmJpdCAoKS52YXJ5 aW5nX3AgKCkpOworICBBU1NFUlRfVFJVRSAocjAuemVyb19wICgpICYmICFyMC5rbm93bl9zaWdu Yml0IChzaWduYml0KSk7CiAKICAgLy8gTkFOIFUgWzUsNl0gc2hvdWxkIGJlIFs1LDZdIHdpdGgg bm8gc2lnbiBpbmZvLgogICByMCA9IGZyYW5nZV9uYW4gKGZsb2F0X3R5cGVfbm9kZSk7CkBAIC0z NzMyLDEzICszNzQ0LDE0IEBAIHJhbmdlX3Rlc3RzX3NpZ25lZF96ZXJvcyAoKQogICByZWFsX2Zy b21fc3RyaW5nICgmciwgIjYiKTsKICAgQVNTRVJUX1RSVUUgKHJlYWxfaWRlbnRpY2FsICgmcSwg JnIwLmxvd2VyX2JvdW5kICgpKSk7CiAgIEFTU0VSVF9UUlVFIChyZWFsX2lkZW50aWNhbCAoJnIs ICZyMC51cHBlcl9ib3VuZCAoKSkpOwotICBBU1NFUlRfVFJVRSAocjAuZ2V0X3NpZ25iaXQgKCku dmFyeWluZ19wICgpKTsKKyAgQVNTRVJUX1RSVUUgKCFyMC5rbm93bl9zaWduYml0IChzaWduYml0 KSk7CiB9CiAKIHN0YXRpYyB2b2lkCiByYW5nZV90ZXN0c19zaWduYml0ICgpCiB7CiAgIGZyYW5n ZSByMCwgcjE7CisgIGJvb2wgc2lnbmJpdDsKIAogICAvLyBTZXR0aW5nIHRoZSBzaWduYml0IGRy b3BzIHRoZSByYW5nZSB0byBbLUlORiwgMF0uCiAgIHIwLnNldF92YXJ5aW5nIChmbG9hdF90eXBl X25vZGUpOwpAQCAtMzc1MCwzNSArMzc2Myw0MiBAQCByYW5nZV90ZXN0c19zaWduYml0ICgpCiAg IC8vIHRoZSBzaWduYml0IHByb3BlcnR5IHNldC4KICAgcjAgPSBmcmFuZ2VfZmxvYXQgKCItNSIs ICIxMCIpOwogICByMC5zZXRfc2lnbmJpdCAoZnBfcHJvcDo6WUVTKTsKLSAgQVNTRVJUX1RSVUUg KHIwLmdldF9zaWduYml0ICgpLnllc19wICgpKTsKKyAgcjAuc2V0X25hbiAoZnBfcHJvcDo6Tk8p OworICBBU1NFUlRfVFJVRSAocjAua25vd25fc2lnbmJpdCAoc2lnbmJpdCkgJiYgc2lnbmJpdCk7 CiAgIHIxID0gZnJhbmdlX2Zsb2F0ICgiLTUiLCAiMCIpOwogICBBU1NFUlRfVFJVRSAocmVhbF9p ZGVudGljYWwgKCZyMC5sb3dlcl9ib3VuZCAoKSwgJnIxLmxvd2VyX2JvdW5kICgpKSk7CiAgIEFT U0VSVF9UUlVFIChyZWFsX2lkZW50aWNhbCAoJnIwLnVwcGVyX2JvdW5kICgpLCAmcjEudXBwZXJf Ym91bmQgKCkpKTsKIAogICAvLyBOZWdhdGl2ZSBudW1iZXJzIHNob3VsZCBoYXZlIHRoZSBTSUdO QklUIHNldC4KICAgcjAgPSBmcmFuZ2VfZmxvYXQgKCItNSIsICItMSIpOwotICBBU1NFUlRfVFJV RSAocjAuZ2V0X3NpZ25iaXQgKCkueWVzX3AgKCkpOworICByMC5zZXRfbmFuIChmcF9wcm9wOjpO Tyk7CisgIEFTU0VSVF9UUlVFIChyMC5rbm93bl9zaWduYml0IChzaWduYml0KSAmJiBzaWduYml0 KTsKICAgLy8gUG9zaXRpdmUgbnVtYmVycyBzaG91bGQgaGF2ZSB0aGUgU0lHTkJJVCBjbGVhci4K ICAgcjAgPSBmcmFuZ2VfZmxvYXQgKCIxIiwgIjEwIik7Ci0gIEFTU0VSVF9UUlVFIChyMC5nZXRf c2lnbmJpdCAoKS5ub19wICgpKTsKKyAgcjAuc2V0X25hbiAoZnBfcHJvcDo6Tk8pOworICBBU1NF UlRfVFJVRSAocjAua25vd25fc2lnbmJpdCAoc2lnbmJpdCkgJiYgIXNpZ25iaXQpOwogICAvLyBO dW1iZXJzIGNvbnRhaW5pbmcgemVybyBzaG91bGQgaGF2ZSBhbiB1bmtub3duIFNJR05CSVQuCiAg IHIwID0gZnJhbmdlX2Zsb2F0ICgiMCIsICIxMCIpOwotICBBU1NFUlRfVFJVRSAocjAuZ2V0X3Np Z25iaXQgKCkudmFyeWluZ19wICgpKTsKKyAgcjAuc2V0X25hbiAoZnBfcHJvcDo6Tk8pOworICBB U1NFUlRfVFJVRSAoIXIwLmtub3duX3NpZ25iaXQgKHNpZ25iaXQpKTsKICAgLy8gTnVtYmVycyBz cGFubmluZyBib3RoIHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSBzaG91bGQgaGF2ZSBhbgogICAvLyB1 bmtub3duIFNJR05CSVQuCiAgIHIwID0gZnJhbmdlX2Zsb2F0ICgiLTEwIiwgIjEwIik7Ci0gIEFT U0VSVF9UUlVFIChyMC5nZXRfc2lnbmJpdCAoKS52YXJ5aW5nX3AgKCkpOworICByMC5zZXRfbmFu IChmcF9wcm9wOjpOTyk7CisgIEFTU0VSVF9UUlVFICghcjAua25vd25fc2lnbmJpdCAoc2lnbmJp dCkpOwogICByMC5zZXRfdmFyeWluZyAoZmxvYXRfdHlwZV9ub2RlKTsKLSAgQVNTRVJUX1RSVUUg KHIwLmdldF9zaWduYml0ICgpLnZhcnlpbmdfcCAoKSk7CisgIEFTU0VSVF9UUlVFICghcjAua25v d25fc2lnbmJpdCAoc2lnbmJpdCkpOwogCiAgIC8vIElnbm9yZSBzaWduYml0IGNoYW5nZXMgd2hl biB0aGUgc2lnbiBiaXQgaXMgb2J2aW91c2x5IGtub3duIGZyb20KICAgLy8gdGhlIHJhbmdlLgog ICByMCA9IGZyYW5nZV9mbG9hdCAoIjUiLCAiMTAiKTsKKyAgcjAuc2V0X25hbiAoZnBfcHJvcDo6 Tk8pOwogICByMC5zZXRfc2lnbmJpdCAoZnBfcHJvcDo6VkFSWUlORyk7Ci0gIEFTU0VSVF9UUlVF IChyMC5nZXRfc2lnbmJpdCAoKS5ub19wICgpKTsKKyAgQVNTRVJUX1RSVUUgKHIwLmtub3duX3Np Z25iaXQgKHNpZ25iaXQpICYmICFzaWduYml0KTsKICAgcjAgPSBmcmFuZ2VfZmxvYXQgKCItNSIs ICItMSIpOwogICByMC5zZXRfc2lnbmJpdCAoZnBfcHJvcDo6Tk8pOwotICBBU1NFUlRfVFJVRSAo cjAuZ2V0X3NpZ25iaXQgKCkueWVzX3AgKCkpOworICByMC5zZXRfbmFuIChmcF9wcm9wOjpOTyk7 CisgIEFTU0VSVF9UUlVFIChyMC51bmRlZmluZWRfcCAoKSk7CiB9CiAKIHN0YXRpYyB2b2lkCkBA IC0zNzk1LDcgKzM4MTUsNyBAQCByYW5nZV90ZXN0c19mbG9hdHMgKCkKICAgLy8gQSByYW5nZSBv ZiBbLUlORiwrSU5GXSBpcyBhY3R1YWxseSBWQVJZSU5HIGlmIG5vIG90aGVyIHByb3BlcnRpZXMK ICAgLy8gYXJlIHNldC4KICAgcjAgPSBmcmFuZ2VfZmxvYXQgKCItSW5mIiwgIitJbmYiKTsKLSAg aWYgKHIwLmdldF9uYW4gKCkudmFyeWluZ19wICgpKQorICBpZiAocjAubWF5YmVfbmFuICgpKQog ICAgIEFTU0VSVF9UUlVFIChyMC52YXJ5aW5nX3AgKCkpOwogICAvLyAuLi51bmxlc3MgaXQgaGFz IHNvbWUgc3BlY2lhbCBwcm9wZXJ0eS4uLgogICByMC5zZXRfbmFuIChmcF9wcm9wOjpOTyk7CmRp ZmYgLS1naXQgYS9nY2MvdmFsdWUtcmFuZ2UuaCBiL2djYy92YWx1ZS1yYW5nZS5oCmluZGV4IDY0 NWRjNzZjMzNhLi5mOWEwMWVlN2EwNSAxMDA2NDQKLS0tIGEvZ2NjL3ZhbHVlLXJhbmdlLmgKKysr IGIvZ2NjL3ZhbHVlLXJhbmdlLmgKQEAgLTMzMCw2ICszMzAsNyBAQCBwcml2YXRlOgogY2xhc3Mg ZnJhbmdlIDogcHVibGljIHZyYW5nZQogewogICBmcmllbmQgY2xhc3MgZnJhbmdlX3N0b3JhZ2Vf c2xvdDsKKyAgZnJpZW5kIGNsYXNzIHZyYW5nZV9wcmludGVyOwogcHVibGljOgogICBmcmFuZ2Ug KCk7CiAgIGZyYW5nZSAoY29uc3QgZnJhbmdlICYpOwpAQCAtMzY2LDEyICszNjcsMjAgQEAgcHVi bGljOgogICBjb25zdCBSRUFMX1ZBTFVFX1RZUEUgJmxvd2VyX2JvdW5kICgpIGNvbnN0OwogICBj b25zdCBSRUFMX1ZBTFVFX1RZUEUgJnVwcGVyX2JvdW5kICgpIGNvbnN0OwogCisgIC8vIGZwY2xh c3NpZnkgbGlrZSBBUEkKKyAgYm9vbCBrbm93bl9maW5pdGUgKCkgY29uc3Q7CisgIGJvb2wgbWF5 YmVfaW5mICgpIGNvbnN0OworICBib29sIGtub3duX2luZiAoKSBjb25zdDsKKyAgYm9vbCBtYXli ZV9uYW4gKCkgY29uc3Q7CisgIGJvb2wga25vd25fbmFuICgpIGNvbnN0OworICBib29sIGtub3du X3NpZ25iaXQgKGJvb2wgJnNpZ25iaXQpIGNvbnN0OworCiAgIC8vIEFjY2Vzc29ycyBmb3IgRlAg cHJvcGVydGllcy4KLSAgZnBfcHJvcCBnZXRfbmFuICgpIGNvbnN0IHsgcmV0dXJuIG1fcHJvcHMu Z2V0X25hbiAoKTsgfQogICB2b2lkIHNldF9uYW4gKGZwX3Byb3A6OmtpbmQgZik7Ci0gIGZwX3By b3AgZ2V0X3NpZ25iaXQgKCkgY29uc3QgeyByZXR1cm4gbV9wcm9wcy5nZXRfc2lnbmJpdCAoKTsg fQogICB2b2lkIHNldF9zaWduYml0IChmcF9wcm9wOjpraW5kKTsKIHByaXZhdGU6CisgIGZwX3By b3AgZ2V0X25hbiAoKSBjb25zdCB7IHJldHVybiBtX3Byb3BzLmdldF9uYW4gKCk7IH0KKyAgZnBf cHJvcCBnZXRfc2lnbmJpdCAoKSBjb25zdCB7IHJldHVybiBtX3Byb3BzLmdldF9zaWduYml0ICgp OyB9CiAgIHZvaWQgdmVyaWZ5X3JhbmdlICgpOwogICBib29sIG5vcm1hbGl6ZV9raW5kICgpOwog CkBAIC0xMTg3LDQgKzExOTYsNjkgQEAgZnJhbmdlX25hbiAodHJlZSB0eXBlKQogICByZXR1cm4g ZnJhbmdlICh0eXBlLCByLCByKTsKIH0KIAorLy8gUmV0dXJuIFRSVUUgaWYgcmFuZ2UgaXMga25v d24gdG8gYmUgZmluaXRlLgorCitpbmxpbmUgYm9vbAorZnJhbmdlOjprbm93bl9maW5pdGUgKCkg Y29uc3QKK3sKKyAgaWYgKHVuZGVmaW5lZF9wICgpIHx8IHZhcnlpbmdfcCAoKSB8fCBtX2tpbmQg PT0gVlJfQU5USV9SQU5HRSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiAoIXJlYWxfaXNu YW4gKCZtX21pbikKKwkgICYmICFyZWFsX2lzaW5mICgmbV9taW4pCisJICAmJiAhcmVhbF9pc2lu ZiAoJm1fbWF4KSk7Cit9CisKKy8vIFJldHVybiBUUlVFIGlmIHJhbmdlIG1heSBiZSBpbmZpbml0 ZS4KKworaW5saW5lIGJvb2wKK2ZyYW5nZTo6bWF5YmVfaW5mICgpIGNvbnN0Cit7CisgIGlmICh1 bmRlZmluZWRfcCAoKSB8fCBtX2tpbmQgPT0gVlJfQU5USV9SQU5HRSkKKyAgICByZXR1cm4gZmFs c2U7CisgIGlmICh2YXJ5aW5nX3AgKCkpCisgICAgcmV0dXJuIHRydWU7CisgIHJldHVybiByZWFs X2lzaW5mICgmbV9taW4pIHx8IHJlYWxfaXNpbmYgKCZtX21heCk7Cit9CisKKy8vIFJldHVybiBU UlVFIGlmIHJhbmdlIGlzIGtub3duIHRvIGJlIHRoZSBbLUlORiwtSU5GXSBvciBbK0lORiwrSU5G XS4KKworaW5saW5lIGJvb2wKK2ZyYW5nZTo6a25vd25faW5mICgpIGNvbnN0Cit7CisgIHJldHVy biAobV9raW5kID09IFZSX1JBTkdFCisJICAmJiByZWFsX2lkZW50aWNhbCAoJm1fbWluLCAmbV9t YXgpCisJICAmJiByZWFsX2lzaW5mICgmbV9taW4pKTsKK30KKworLy8gUmV0dXJuIFRSVUUgaWYg cmFuZ2UgaXMgcG9zc2libHkgYSBOQU4uCisKK2lubGluZSBib29sCitmcmFuZ2U6Om1heWJlX25h biAoKSBjb25zdAoreworICByZXR1cm4gIWdldF9uYW4gKCkubm9fcCAoKTsKK30KKworLy8gUmV0 dXJuIFRSVUUgaWYgcmFuZ2UgaXMgYSArTkFOIG9yIC1OQU4uCisKK2lubGluZSBib29sCitmcmFu Z2U6Omtub3duX25hbiAoKSBjb25zdAoreworICByZXR1cm4gZ2V0X25hbiAoKS55ZXNfcCAoKTsK K30KKworLy8gSWYgdGhlIHNpZ25iaXQgZm9yIHRoZSByYW5nZSBpcyBrbm93biwgc2V0IGl0IGlu IFNJR05CSVQgYW5kIHJldHVybgorLy8gVFJVRS4KKworaW5saW5lIGJvb2wKK2ZyYW5nZTo6a25v d25fc2lnbmJpdCAoYm9vbCAmc2lnbmJpdCkgY29uc3QKK3sKKyAgLy8gRklYTUU6IFNpZ25lZCBO QU5zIGFyZSBub3Qgc3VwcG9ydGVkIHlldC4KKyAgaWYgKG1heWJlX25hbiAoKSkKKyAgICByZXR1 cm4gZmFsc2U7CisgIGlmIChnZXRfc2lnbmJpdCAoKS52YXJ5aW5nX3AgKCkpCisgICAgcmV0dXJu IGZhbHNlOworICBzaWduYml0ID0gZ2V0X3NpZ25iaXQgKCkueWVzX3AgKCk7CisgIHJldHVybiB0 cnVlOworfQorCiAjZW5kaWYgLy8gR0NDX1ZBTFVFX1JBTkdFX0gKLS0gCjIuMzcuMQoK --0000000000007de62405e82848d9--