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 1w81PA-0008XR-0K for pgsql-hackers@arkaria.postgresql.org; Wed, 01 Apr 2026 19:39:08 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1w81P8-0029LC-0j for pgsql-hackers@arkaria.postgresql.org; Wed, 01 Apr 2026 19:39:06 +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 1w81P7-0029L4-2C for pgsql-hackers@lists.postgresql.org; Wed, 01 Apr 2026 19:39:06 +0000 Received: from mail-pl1-x62d.google.com ([2607:f8b0:4864:20::62d]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1w81P4-0000000040p-2WpW for pgsql-hackers@postgresql.org; Wed, 01 Apr 2026 19:39:04 +0000 Received: by mail-pl1-x62d.google.com with SMTP id d9443c01a7336-2a9296b3926so458055ad.1 for ; Wed, 01 Apr 2026 12:39:02 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1775072342; cv=none; d=google.com; s=arc-20240605; b=AfT6Mlmp35iH/po9p/marmdURSYiNKFtGbNdATiPiAe3BNUdZNxtXyRHjOS4jPWB65 gkbZ4dseX2U9lxQx6OEJuS0fxjb658QeJrs7r1fw+sqW3+84NURHeX74aQHw3D4hkVnh ySScB4z6JJRlr0ss8bs6Y33XxoKPMcerG/zAU6ETAkWCRvAzJ3rncPT3bXngpSeV+aLq XJGjTEXDoHPhf6eIImPkN85w5TnpKkamt5jkyZzQHwOY8s6bU6UZZakOC4TDS/xWeGR0 I3cfxRZU3SgdTCj30pMxBWOHf06lgXnYqB69Q+Cna8L4glPENYcZt2Tsi/rt2RabO2AR uCNA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:dkim-signature; bh=tK6L+aubrX5InePv0d3YkAVzgPOhSCm/eNW95yFlsoA=; fh=L6UM2EZoMao+wYK2fRXeeZQjstWmxAV5jA4DRrRvVCM=; b=cKSm2OXZavtXpePAcceBD9NQa00hper5OQBizilViHp2ezxBvd8EffaAxB+MzotRo3 Wqqw4dgRhFZ/8UPeG4AeVmCj3ds6p2c2va9D4XzdWUYhh1W3qaxnIT5vNtt4GpVXQxf6 pdWDpvz+hM9sCBTS3ve/fz0HIr/0+3ZEokyy2GA4Px6n5HJFApY8E15Y3rTIR48hnJHQ LFTIRO+uGZ3LGZ1J6xyz7Y5ydjzHs07J2bJp+mwjZKKpIOPUIxT5RKaBosPQntZ7454k W4g6K1P4F8iufx2eCCCVsOHbTDRt2dhTcHeqAlgRtxezZdi6T7seEjB1CbTgh//aUKaw JGqA==; 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=1775072342; x=1775677142; 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=tK6L+aubrX5InePv0d3YkAVzgPOhSCm/eNW95yFlsoA=; b=UWi/KfgPsxB3E9zKQhaoyhn55jAQrbaSHsMQtcUN+4mk5aJvXQMSW/lR+LfMeijOU5 N6cHX4nKSWItFVHRpMc2nxFchqJjs8JHBGhjXZWbS7r13Vo0tPiEfLavv5qoQhuL+nb1 VXISjSDQDid5LgjosjYENb9kWkOCpinr6jFboSVx7R5tTIIanhyCZ7tB2YG4JJGGC5tP F4HmWi7o1AwNp4fKtq9mLi4OWn2D0CuVNmr1Oij20rztiEWAidsAfQEfBh8SmPtJzKq0 hmyhs9wkQc+TwWTAydZIwd7rgg4mfFMkJ2es1ko6zH+XilDRjwkk2wm8T4lYGheH0n8k 8GXg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775072342; x=1775677142; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=tK6L+aubrX5InePv0d3YkAVzgPOhSCm/eNW95yFlsoA=; b=UXCObWkGWR+nrRyQhyB+GPvCd3qrAjjHv6T8BTtYOFIEf+bEbUwwqWHlyKY39MkHLX eKK4Uq3dGcAXvhq84+4xxphlI+nzmOdYmXBYk0V+yMN51oXaaljdi9hVxcQZSbIDU1mH 68OZrrQYLCd7Wd8eTC29ntzDl/7hwUdGdjwVev9YGxnp2AoJIV9QW1Hm7myC1dl9ez5X Nw9Gzfih78z7zkLxH597vJmVvyPAang+ii5zOqlZZth9mY+uBXoosWodqgEqulDHHpWM 6GOByLUwqc1hJmb2EYkd/nyiesmIuqPvIDoiowv5n08dJ0J2PWYlFOsVGYl4WbhpH8Sk Tvow== X-Forwarded-Encrypted: i=1; AJvYcCWMtUylPE26E/G/jHN9JaRHgGCmhShI+oiAq8O22syDs0SzJsSPBevZDXoJGNVfGFe/SujNFErSyMKo77lv@postgresql.org X-Gm-Message-State: AOJu0YyAnnGkyfu7+RGQsABSUY3TgfM86GllJqy8iWkveqkoKpDtsFn3 sjnKa9kn7vO+Ud3afvWu7Yh/jFZLWSv8Jd+b1UFXtgcq+OctAHjjpH+qYyoD8V21ggJ9ox0H0mr 9MOWHVcLXv8Wwciw0FAZlxX9+AW8Cqzk= X-Gm-Gg: ATEYQzxifXmrUIvDv9RGMYz9pEu9E8mf+XHmiMpzGuBpOeUHwJGP9UzBStl4SonD4rR s9uHjsMyz1Fm6Nl1mK3hibJGJ+6H4jUuQJfyxCg6YkmpH7MT1/O8FThAB7X7sDPlyzrAj7mBOxg O+jC8OFAf+BWI/ZwB47RaiTyDdifm0eW2c4puUlX7kILoqR/39eBEzMV2d4MgreL0pq9TaCphDJ SsVnIPD5lRAXUQvH+nAR2Lbw/PXr6oQZEcosCzbXtzY8Qia0CUaM0NPvAttAVoRV3uvgkn+JZEX 5NuWYGzf X-Received: by 2002:a17:903:2acc:b0:2b2:5da8:14be with SMTP id d9443c01a7336-2b269cdebaamr46847705ad.41.1775072341621; Wed, 01 Apr 2026 12:39:01 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: From: Masahiko Sawada Date: Wed, 1 Apr 2026 12:38:23 -0700 X-Gm-Features: AQROBzDaKaX7i3efQB7PmUUKQra3RtEmJhCz15edbhTNIR50UUlZm4LF0w2BMwA Message-ID: Subject: Re: Introduce XID age based replication slot invalidation To: Bharath Rupireddy Cc: Srinath Reddy Sadipiralla , SATYANARAYANA NARLAPURAM , "Hayato Kuroda (Fujitsu)" , John H , PostgreSQL-development Content-Type: multipart/mixed; boundary="0000000000005f9a39064e6b3c32" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --0000000000005f9a39064e6b3c32 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Tue, Mar 31, 2026 at 10:21=E2=80=AFAM Bharath Rupireddy wrote: > > Hi, > > On Mon, Mar 30, 2026 at 5:13=E2=80=AFPM Masahiko Sawada wrote: > > > > I've reviewed the v6 patch. Here are some comments. > > Thank you for reviewing the patch. > > > bool > > vacuum_get_cutoffs(Relation rel, const VacuumParams params, > > - struct VacuumCutoffs *cutoffs) > > + struct VacuumCutoffs *cutoffs, > > + TransactionId *slot_xmin, > > + TransactionId *slot_catalog_xmin) > > > > How about storing both slot_xmin and catalog_xmin into VacuumCutoffs? > > Done. > > > --- > > - if (InvalidateObsoleteReplicationSlots(RS_INVAL_WAL_REMOVED | > > RS_INVAL_IDLE_TIMEOUT, > > + possibleInvalidationCauses =3D RS_INVAL_WAL_REMOVED | RS_INVAL_IDLE= _TIMEOUT | > > + RS_INVAL_XID_AGE; > > + > > + if (InvalidateObsoleteReplicationSlots(possibleInvalidationCauses, > > _logSegNo, InvalidOid, > > + InvalidTransactionId, > > + max_slot_xid_age > 0 ? > > + ReadNextTransactionId() : > > InvalidTransactionId)) > > > > It's odd to me that we specify RS_INVAL_XID_AGE while passing > > InvalidTransactionId. I think we can specify RS_INVAL_XID_AGE along > > with a valid recentXId only when we'd like to check the slots based on > > their XIDs. > > Done. > > > --- > > + /* Check if the slot needs to be invalidated due to max_slot_xid_ag= e GUC */ > > + if ((possible_causes & RS_INVAL_XID_AGE) && CanInvalidateXidAgedSlo= t(s)) > > + { > > + TransactionId xidLimit; > > + > > + Assert(TransactionIdIsValid(recentXid)); > > + > > + xidLimit =3D TransactionIdRetreatedBy(recentXid, max_slot_xid_a= ge); > > + > > > > I think we can avoid calculating xidLimit for every slot by > > calculating it in InvalidatePossiblyObsoleteSlot() and passing it to > > DetermineSlotInvalidationCause(). > > Done. > > > --- > > */ > > TransactionId > > GetOldestNonRemovableTransactionId(Relation rel) > > +{ > > + return GetOldestNonRemovableTransactionIdExt(rel, NULL, NULL); > > +} > > + > > +/* > > + * Same as GetOldestNonRemovableTransactionId(), but also returns the > > + * replication slot xmin and catalog_xmin from the same ComputeXidHori= zons() > > + * call. This avoids a separate ProcArrayLock acquisition when the ca= ller > > + * needs both values. > > + */ > > +TransactionId > > +GetOldestNonRemovableTransactionIdExt(Relation rel, > > + TransactionId *slot_xmin, > > + TransactionId *slot_catalog_xmin) > > { > > > > I understand that the primary reason why the patch introduces another > > variant of GetOldestNonRemovableTransactionId() is to avoid extra > > ProcArrayLock acquision to get replication slot xmin and catalog_xmin. > > While it's not very elegant, I find that it would not be bad because > > otherwise autovacuum takes extra ProcArrayLock (in shared mode) for > > every table to vacuum. The ProcArrayLock is already known > > high-contented lock it would be better to avoid taking it once more. > > If others think differently, we can just call > > ProcArrayGetReplicationSlotXmin() separately and compare them to the > > limit of XID-age based slot invalidation. > > I understand the concerns around the ProcArrayLock and I think a new > function to return the computed slot's xmin and catalog_xmin is good. > > > Having said that, I personally don't want to add new instructions to > > the existing GetOldestNonRemovableTransactionId(). I guess we might > > want to make both the existing function and new function call a common > > (inline) function that takes ComputeXidHorizonsResult and returns > > appropriate transaction id based on the given relation . > > Done. > > > --- > > + # Do some work to advance xids > > + $node->safe_psql( > > + 'postgres', qq[ > > + do \$\$ > > + begin > > + for i in 1..$nxids loop > > + -- use an exception block so that each iteration eats an XI= D > > + begin > > + insert into $table_name values (i); > > + exception > > + when division_by_zero then null; > > + end; > > + end loop; > > + end\$\$; > > + ]); > > > > I think it's fater to use pg_current_xact_id() instead. > > Done. I pulled this from an existing test case in 001_stream_rep.pl. > Used the pg_current_xact_id approach. Testing times stay the same i.e. > 9 wallclock secs. > > > --- > > + else > > + { > > + $node->safe_psql('postgres', "VACUUM"); > > + } > > > > We don't need to vacuum all tables here. > > Fixed. > > > --- > > +# Configure primary with XID age settings. Set autovacuum_naptime high= so > > +# that the checkpointer (not vacuum) triggers the invalidation. > > +my $max_slot_xid_age =3D 500; > > +$primary5->append_conf( > > + 'postgresql.conf', qq{ > > +max_slot_xid_age =3D $max_slot_xid_age > > +autovacuum_naptime =3D '1h' > > +}); > > > > I think that it's better to disable autovacuum than setting a large num= ber. > > Done. > > > --- > > +# Testcase end: Invalidate streaming standby's slot due to max_slot_xi= d_age > > +# GUC (via checkpoint). > > > > I think that we can say "physical slot" instead of standby's slot to > > avoid confusion as I thought standby's slot is a slot created on the > > standby at the first glance. > > Fixed. > > > --- > > Do we have tests for invalidating slots on the standbys? > > Added a test case for this. > > Please find the attached v7 patches for further review. Thank you! I've reviewed the v7 patch and have some review comments: +# Advance the given number of XIDs +sub advance_xids +{ + my ($node, $nxids) =3D @_; + my $sql =3D join(";\n", ("SELECT pg_current_xact_id()") x $nxids); + $node->safe_psql('postgres', $sql); +} I think we can create a procedure on primary5 instance to consume XIDs as follow: $standby5->safe_psql( 'postgres', qq{CREATE PROCEDURE consume_xid(cnt int) AS \$\$ DECLARE i int; BEGIN FOR i in 1..cnt LOOP EXECUTE 'SELECT pg_current_xact_id()'; COMMIT; END LOOP; END; +\$\$ LANGUAGE plpgsql; }); --- +# Create a subscriber node +my $subscriber5 =3D PostgreSQL::Test::Cluster->new('subscriber5'); +$subscriber5->init(allows_streaming =3D> 'logical'); +$subscriber5->start; Do we really need to create a subscriber for this test? I think we can simply create a logical slot on the primary5 and test the XID-age based slot invalidation. --- I've attached a fixup patch to propose some cleanup and refactoring, includ= ing: - changes to invalidation errdetail message. - passing xidLimit instead of recentXid to simplify the invalidation logic. - documentation changes. - comment changes. Regards, -- Masahiko Sawada Amazon Web Services: https://aws.amazon.com --0000000000005f9a39064e6b3c32 Content-Type: text/x-patch; charset="US-ASCII"; name="fixup_for_v7_masahiko.patch" Content-Disposition: attachment; filename="fixup_for_v7_masahiko.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mngg6m2v0 ZGlmZiAtLWdpdCBhL2RvYy9zcmMvc2dtbC9jb25maWcuc2dtbCBiL2RvYy9zcmMvc2dtbC9jb25m aWcuc2dtbAppbmRleCA0NmFhYzU5Y2IyMC4uOWFkNjYyYjhiNmYgMTAwNjQ0Ci0tLSBhL2RvYy9z cmMvc2dtbC9jb25maWcuc2dtbAorKysgYi9kb2Mvc3JjL3NnbWwvY29uZmlnLnNnbWwKQEAgLTQ3 NzIsMTcgKzQ3NzIsMjQgQEAgcmVzdG9yZV9jb21tYW5kID0gJ2NvcHkgIkM6XFxzZXJ2ZXJcXGFy Y2hpdmVkaXJcXCVmIiAiJXAiJyAgIyBXaW5kb3dzCiAgICAgICA8L3Rlcm0+CiAgICAgICA8bGlz dGl0ZW0+CiAgICAgICAgPHBhcmE+Ci0gICAgICAgIEludmFsaWRhdGUgcmVwbGljYXRpb24gc2xv dHMgd2hvc2UgPGxpdGVyYWw+eG1pbjwvbGl0ZXJhbD4gKHRoZSBvbGRlc3QKLSAgICAgICAgdHJh bnNhY3Rpb24gdGhhdCB0aGlzIHNsb3QgbmVlZHMgdGhlIGRhdGFiYXNlIHRvIHJldGFpbikgb3IK LSAgICAgICAgPGxpdGVyYWw+Y2F0YWxvZ194bWluPC9saXRlcmFsPiAodGhlIG9sZGVzdCB0cmFu c2FjdGlvbiBhZmZlY3RpbmcgdGhlCi0gICAgICAgIHN5c3RlbSBjYXRhbG9ncyB0aGF0IHRoaXMg c2xvdCBuZWVkcyB0aGUgZGF0YWJhc2UgdG8gcmV0YWluKSBoYXMgcmVhY2hlZAotICAgICAgICB0 aGUgYWdlIHNwZWNpZmllZCBieSB0aGlzIHNldHRpbmcuIFRoaXMgaW52YWxpZGF0aW9uIGNoZWNr IGhhcHBlbnMKLSAgICAgICAgZHVyaW5nIHZhY3V1bSAoYm90aCA8Y29tbWFuZD5WQUNVVU08L2Nv bW1hbmQ+IGNvbW1hbmQgYW5kIGF1dG92YWN1dW0pCi0gICAgICAgIGFuZCBkdXJpbmcgY2hlY2tw b2ludHMuCi0gICAgICAgIEEgdmFsdWUgb2YgemVybyAod2hpY2ggaXMgZGVmYXVsdCkgZGlzYWJs ZXMgdGhpcyBmZWF0dXJlLiBVc2VycyBjYW4gc2V0Ci0gICAgICAgIHRoaXMgdmFsdWUgYW55d2hl cmUgZnJvbSB6ZXJvIHRvIHR3byBiaWxsaW9uLiBUaGlzIHBhcmFtZXRlciBjYW4gb25seSBiZQot ICAgICAgICBzZXQgaW4gdGhlIDxmaWxlbmFtZT5wb3N0Z3Jlc3FsLmNvbmY8L2ZpbGVuYW1lPiBm aWxlIG9yIG9uIHRoZSBzZXJ2ZXIKLSAgICAgICAgY29tbWFuZCBsaW5lLgorICAgICAgICBJbnZh bGlkYXRlIHJlcGxpY2F0aW9uIHNsb3RzIHdob3NlIDxzdHJ1Y3RmaWVsZD54bWluPC9zdHJ1Y3Rm aWVsZD4gYWdlCisgICAgICAgIG9yIDxzdHJ1Y3RmaWVsZD5jYXRhbG9nX3htaW48L3N0cnVjdGZp ZWxkPiBhZ2UgaW4gdGhlCisgICAgICAgIDxsaW5rIGxpbmtlbmQ9InZpZXctcGctcmVwbGljYXRp b24tc2xvdHMiPnBnX3JlcGxpY2F0aW9uX3Nsb3RzPC9saW5rPgorICAgICAgICB2aWV3IGhhcyBl eGNlZWRlZCB0aGUgYWdlIHNwZWNpZmllZCBieSB0aGlzIHNldHRpbmcuIFNsb3QgaW52YWxpZGF0 aW9uCisgICAgICAgIGR1ZSB0byB0aGlzIGxpbWl0IG9jY3VycyBkdXJpbmcgdmFjdXVtIChib3Ro IDxjb21tYW5kPlZBQ1VVTTwvY29tbWFuZD4KKyAgICAgICAgY29tbWFuZCBhbmQgYXV0b3ZhY3V1 bSkgYW5kIGR1cmluZyBjaGVja3BvaW50LgorICAgICAgICBBIHZhbHVlIG9mIHplcm8gKHRoZSBk ZWZhdWx0KSBkaXNhYmxlcyB0aGlzIGZlYXR1cmUuIFVzZXJzIGNhbiBzZXQKKyAgICAgICAgdGhp cyB2YWx1ZSBhbnl3aGVyZSBmcm9tIHplcm8gdG8gdHdvIGJpbGxpb24gdHJhbnNhY3Rpb25zLiBU aGlzIHBhcmFtZXRlcgorICAgICAgICBjYW4gb25seSBiZSBzZXQgaW4gdGhlIDxmaWxlbmFtZT5w b3N0Z3Jlc3FsLmNvbmY8L2ZpbGVuYW1lPiBmaWxlIG9yIG9uCisgICAgICAgIHRoZSBzZXJ2ZXIg Y29tbWFuZCBsaW5lLgorICAgICAgIDwvcGFyYT4KKworICAgICAgIDxwYXJhPgorICAgICAgICBU aGUgY3VycmVudCBhZ2Ugb2YgYSBzbG90J3MgPGxpdGVyYWw+eG1pbjwvbGl0ZXJhbD4gYW5kCisg ICAgICAgIDxsaXRlcmFsPmNhdGFsb2dfeG1pbjwvbGl0ZXJhbD4gY2FuIGJlIG1vbml0b3JlZCBi eSBhcHBseWluZyB0aGUKKyAgICAgICAgPGZ1bmN0aW9uPmFnZTwvZnVuY3Rpb24+IGZ1bmN0aW9u IHRvIHRoZSBjb3JyZXNwb25kaW5nIGNvbHVtbnMgaW4gdGhlCisgICAgICAgIDxsaW5rIGxpbmtl bmQ9InZpZXctcGctcmVwbGljYXRpb24tc2xvdHMiPnBnX3JlcGxpY2F0aW9uX3Nsb3RzPC9saW5r PgorICAgICAgICB2aWV3LgogICAgICAgIDwvcGFyYT4KIAogICAgICAgIDxwYXJhPgpkaWZmIC0t Z2l0IGEvc3JjL2JhY2tlbmQvYWNjZXNzL3RyYW5zYW0veGxvZy5jIGIvc3JjL2JhY2tlbmQvYWNj ZXNzL3RyYW5zYW0veGxvZy5jCmluZGV4IDcwYzFkNWM1NTU5Li4xYWVjMWJjYjc5ZSAxMDA2NDQK LS0tIGEvc3JjL2JhY2tlbmQvYWNjZXNzL3RyYW5zYW0veGxvZy5jCisrKyBiL3NyYy9iYWNrZW5k L2FjY2Vzcy90cmFuc2FtL3hsb2cuYwpAQCAtNzAxOSw4ICs3MDE5LDggQEAgQ3JlYXRlQ2hlY2tQ b2ludChpbnQgZmxhZ3MpCiAJVmlydHVhbFRyYW5zYWN0aW9uSWQgKnZ4aWRzOwogCWludAkJCW52 eGlkczsKIAlpbnQJCQlvbGRYTG9nQWxsb3dlZCA9IDA7Ci0JdWludDMyCQlwb3NzaWJsZUludmFs aWRhdGlvbkNhdXNlczsKLQlUcmFuc2FjdGlvbklkIHJlY2VudFhpZDsKKwl1aW50MzIJCXNsb3RJ bnZhbGlkYXRpb25DYXVzZXM7CisJVHJhbnNhY3Rpb25JZCBzbG90WGlkTGltaXQ7CiAKIAkvKgog CSAqIEFuIGVuZC1vZi1yZWNvdmVyeSBjaGVja3BvaW50IGlzIHJlYWxseSBhIHNodXRkb3duIGNo ZWNrcG9pbnQsIGp1c3QKQEAgLTc0NTAsMTkgKzc0NTAsMTkgQEAgQ3JlYXRlQ2hlY2tQb2ludChp bnQgZmxhZ3MpCiAJWExCeXRlVG9TZWcoUmVkb1JlY1B0ciwgX2xvZ1NlZ05vLCB3YWxfc2VnbWVu dF9zaXplKTsKIAlLZWVwTG9nU2VnKHJlY3B0ciwgJl9sb2dTZWdObyk7CiAKLQlwb3NzaWJsZUlu dmFsaWRhdGlvbkNhdXNlcyA9IFJTX0lOVkFMX1dBTF9SRU1PVkVEIHwgUlNfSU5WQUxfSURMRV9U SU1FT1VUOwotCXJlY2VudFhpZCA9IEludmFsaWRUcmFuc2FjdGlvbklkOwotCisJc2xvdEludmFs aWRhdGlvbkNhdXNlcyA9IFJTX0lOVkFMX1dBTF9SRU1PVkVEIHwgUlNfSU5WQUxfSURMRV9USU1F T1VUOworCXNsb3RYaWRMaW1pdCA9IEludmFsaWRUcmFuc2FjdGlvbklkOwogCWlmIChtYXhfc2xv dF94aWRfYWdlID4gMCkKIAl7Ci0JCXBvc3NpYmxlSW52YWxpZGF0aW9uQ2F1c2VzIHw9IFJTX0lO VkFMX1hJRF9BR0U7Ci0JCXJlY2VudFhpZCA9IFJlYWROZXh0VHJhbnNhY3Rpb25JZCgpOworCQlz bG90SW52YWxpZGF0aW9uQ2F1c2VzIHw9IFJTX0lOVkFMX1hJRF9BR0U7CisJCXNsb3RYaWRMaW1p dCA9IFRyYW5zYWN0aW9uSWRSZXRyZWF0ZWRCeShSZWFkTmV4dFRyYW5zYWN0aW9uSWQoKSwKKwkJ CQkJCQkJCQkJCW1heF9zbG90X3hpZF9hZ2UpOwogCX0KIAotCWlmIChJbnZhbGlkYXRlT2Jzb2xl dGVSZXBsaWNhdGlvblNsb3RzKHBvc3NpYmxlSW52YWxpZGF0aW9uQ2F1c2VzLAorCWlmIChJbnZh bGlkYXRlT2Jzb2xldGVSZXBsaWNhdGlvblNsb3RzKHNsb3RJbnZhbGlkYXRpb25DYXVzZXMsCiAJ CQkJCQkJCQkJICAgX2xvZ1NlZ05vLCBJbnZhbGlkT2lkLAogCQkJCQkJCQkJCSAgIEludmFsaWRU cmFuc2FjdGlvbklkLAotCQkJCQkJCQkJCSAgIHJlY2VudFhpZCkpCisJCQkJCQkJCQkJICAgc2xv dFhpZExpbWl0KSkKIAl7CiAJCS8qCiAJCSAqIFNvbWUgc2xvdHMgaGF2ZSBiZWVuIGludmFsaWRh dGVkOyByZWNhbGN1bGF0ZSB0aGUgb2xkLXNlZ21lbnQKQEAgLTc3NDMsOCArNzc0Myw4IEBAIENy ZWF0ZVJlc3RhcnRQb2ludChpbnQgZmxhZ3MpCiAJWExvZ1JlY1B0cgllbmRwdHI7CiAJWExvZ1Nl Z05vCV9sb2dTZWdObzsKIAlUaW1lc3RhbXBUeiB4dGltZTsKLQl1aW50MzIJCXBvc3NpYmxlSW52 YWxpZGF0aW9uQ2F1c2VzOwotCVRyYW5zYWN0aW9uSWQgcmVjZW50WGlkOworCXVpbnQzMgkJc2xv dEludmFsaWRhdGlvbkNhdXNlczsKKwlUcmFuc2FjdGlvbklkIHNsb3RYaWRMaW1pdDsKIAogCS8q IENvbmN1cnJlbnQgY2hlY2twb2ludC9yZXN0YXJ0cG9pbnQgY2Fubm90IGhhcHBlbiAqLwogCUFz c2VydCghSXNVbmRlclBvc3RtYXN0ZXIgfHwgTXlCYWNrZW5kVHlwZSA9PSBCX0NIRUNLUE9JTlRF Uik7CkBAIC03OTE5LDE5ICs3OTE5LDE5IEBAIENyZWF0ZVJlc3RhcnRQb2ludChpbnQgZmxhZ3Mp CiAKIAlJTkpFQ1RJT05fUE9JTlQoInJlc3RhcnRwb2ludC1iZWZvcmUtc2xvdC1pbnZhbGlkYXRp b24iLCBOVUxMKTsKIAotCXBvc3NpYmxlSW52YWxpZGF0aW9uQ2F1c2VzID0gUlNfSU5WQUxfV0FM X1JFTU9WRUQgfCBSU19JTlZBTF9JRExFX1RJTUVPVVQ7Ci0JcmVjZW50WGlkID0gSW52YWxpZFRy YW5zYWN0aW9uSWQ7Ci0KKwlzbG90SW52YWxpZGF0aW9uQ2F1c2VzID0gUlNfSU5WQUxfV0FMX1JF TU9WRUQgfCBSU19JTlZBTF9JRExFX1RJTUVPVVQ7CisJeGlkTGltaXQgPSBJbnZhbGlkVHJhbnNh Y3Rpb25JZDsKIAlpZiAobWF4X3Nsb3RfeGlkX2FnZSA+IDApCiAJewotCQlwb3NzaWJsZUludmFs aWRhdGlvbkNhdXNlcyB8PSBSU19JTlZBTF9YSURfQUdFOwotCQlyZWNlbnRYaWQgPSBSZWFkTmV4 dFRyYW5zYWN0aW9uSWQoKTsKKwkJc2xvdEludmFsaWRhdGlvbkNhdXNlcyB8PSBSU19JTlZBTF9Y SURfQUdFOworCQlzbG90WGlkTGltaXQgPSBUcmFuc2FjdGlvbklkUmV0cmVhdGVkQnkoUmVhZE5l eHRUcmFuc2FjdGlvbklkKCksCisJCQkJCQkJCQkJCQltYXhfc2xvdF94aWRfYWdlKTsKIAl9CiAK LQlpZiAoSW52YWxpZGF0ZU9ic29sZXRlUmVwbGljYXRpb25TbG90cyhwb3NzaWJsZUludmFsaWRh dGlvbkNhdXNlcywKKwlpZiAoSW52YWxpZGF0ZU9ic29sZXRlUmVwbGljYXRpb25TbG90cyhzbG90 SW52YWxpZGF0aW9uQ2F1c2VzLAogCQkJCQkJCQkJCSAgIF9sb2dTZWdObywgSW52YWxpZE9pZCwK IAkJCQkJCQkJCQkgICBJbnZhbGlkVHJhbnNhY3Rpb25JZCwKLQkJCQkJCQkJCQkgICByZWNlbnRY aWQpKQorCQkJCQkJCQkJCSAgIHNsb3RYaWRMaW1pdCkpCiAJewogCQkvKgogCQkgKiBTb21lIHNs b3RzIGhhdmUgYmVlbiBpbnZhbGlkYXRlZDsgcmVjYWxjdWxhdGUgdGhlIG9sZC1zZWdtZW50CmRp ZmYgLS1naXQgYS9zcmMvYmFja2VuZC9jb21tYW5kcy92YWN1dW0uYyBiL3NyYy9iYWNrZW5kL2Nv bW1hbmRzL3ZhY3V1bS5jCmluZGV4IDdmMzZmNzk1YjcyLi5jZGE4NmI5ZDUwZiAxMDA2NDQKLS0t IGEvc3JjL2JhY2tlbmQvY29tbWFuZHMvdmFjdXVtLmMKKysrIGIvc3JjL2JhY2tlbmQvY29tbWFu ZHMvdmFjdXVtLmMKQEAgLTExMzMsOSArMTEzMywxMCBAQCB2YWN1dW1fZ2V0X2N1dG9mZnMoUmVs YXRpb24gcmVsLCBjb25zdCBWYWN1dW1QYXJhbXMgKnBhcmFtcywKIAkgKiB0aGF0IG9ubHkgb25l IHZhY3V1bSBwcm9jZXNzIGNhbiBiZSB3b3JraW5nIG9uIGEgcGFydGljdWxhciB0YWJsZSBhdAog CSAqIGFueSB0aW1lLCBhbmQgdGhhdCBlYWNoIHZhY3V1bSBpcyBhbHdheXMgYW4gaW5kZXBlbmRl bnQgdHJhbnNhY3Rpb24uCiAJICovCi0JY3V0b2Zmcy0+T2xkZXN0WG1pbiA9IEdldE9sZGVzdE5v blJlbW92YWJsZVRyYW5zYWN0aW9uSWRFeHQocmVsLAotCQkJCQkJCQkJCQkJCQkJCSZjdXRvZmZz LT5zbG90X3htaW4sCi0JCQkJCQkJCQkJCQkJCQkJJmN1dG9mZnMtPnNsb3RfY2F0YWxvZ194bWlu KTsKKwljdXRvZmZzLT5PbGRlc3RYbWluID0KKwkJR2V0T2xkZXN0Tm9uUmVtb3ZhYmxlVHJhbnNh Y3Rpb25JZFdpdGhTbG90WGlkcyhyZWwsCisJCQkJCQkJCQkJCQkJICAgJmN1dG9mZnMtPnNsb3Rf eG1pbiwKKwkJCQkJCQkJCQkJCQkgICAmY3V0b2Zmcy0+c2xvdF9jYXRhbG9nX3htaW4pOwogCiAJ QXNzZXJ0KFRyYW5zYWN0aW9uSWRJc05vcm1hbChjdXRvZmZzLT5PbGRlc3RYbWluKSk7CiAKZGlm ZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3JlcGxpY2F0aW9uL3Nsb3QuYyBiL3NyYy9iYWNrZW5kL3Jl cGxpY2F0aW9uL3Nsb3QuYwppbmRleCAyMDcyOWQyZmI0Mi4uZTYyNzFlMmE1MTkgMTAwNjQ0Ci0t LSBhL3NyYy9iYWNrZW5kL3JlcGxpY2F0aW9uL3Nsb3QuYworKysgYi9zcmMvYmFja2VuZC9yZXBs aWNhdGlvbi9zbG90LmMKQEAgLTE3OTAsNyArMTc5MCw3IEBAIFJlcG9ydFNsb3RJbnZhbGlkYXRp b24oUmVwbGljYXRpb25TbG90SW52YWxpZGF0aW9uQ2F1c2UgY2F1c2UsCiAJCQkJCSAgIGxvbmcg c2xvdF9pZGxlX3NlY29uZHMsCiAJCQkJCSAgIFRyYW5zYWN0aW9uSWQgeG1pbiwKIAkJCQkJICAg VHJhbnNhY3Rpb25JZCBjYXRhbG9nX3htaW4sCi0JCQkJCSAgIFRyYW5zYWN0aW9uSWQgcmVjZW50 WGlkKQorCQkJCQkgICBUcmFuc2FjdGlvbklkIHhpZExpbWl0KQogewogCVN0cmluZ0luZm9EYXRh IGVycl9kZXRhaWw7CiAJU3RyaW5nSW5mb0RhdGEgZXJyX2hpbnQ7CkBAIC0xODM4LDIwICsxODM4 LDE4IEBAIFJlcG9ydFNsb3RJbnZhbGlkYXRpb24oUmVwbGljYXRpb25TbG90SW52YWxpZGF0aW9u Q2F1c2UgY2F1c2UsCiAKIAkJY2FzZSBSU19JTlZBTF9YSURfQUdFOgogCQkJewotCQkJCUFzc2Vy dChUcmFuc2FjdGlvbklkSXNWYWxpZCh4bWluKSB8fCBUcmFuc2FjdGlvbklkSXNWYWxpZChjYXRh bG9nX3htaW4pKTsKLQotCQkJCWlmIChUcmFuc2FjdGlvbklkSXNWYWxpZCh4bWluKSkKLQkJCQl7 Ci0JCQkJCS8qIHRyYW5zbGF0b3I6ICVzIGlzIGEgR1VDIHZhcmlhYmxlIG5hbWUgKi8KLQkJCQkJ YXBwZW5kU3RyaW5nSW5mbygmZXJyX2RldGFpbCwgXygiVGhlIHNsb3QncyB4bWluICV1IGlzICVk IHRyYW5zYWN0aW9ucyBvbGQsIHdoaWNoIGV4Y2VlZHMgdGhlIGNvbmZpZ3VyZWQgXCIlc1wiIHZh bHVlIG9mICVkLiIpLAotCQkJCQkJCQkJIHhtaW4sIChpbnQzMikgKHJlY2VudFhpZCAtIHhtaW4p LCAibWF4X3Nsb3RfeGlkX2FnZSIsIG1heF9zbG90X3hpZF9hZ2UpOwotCQkJCX0KLQkJCQllbHNl Ci0JCQkJewotCQkJCQkvKiB0cmFuc2xhdG9yOiAlcyBpcyBhIEdVQyB2YXJpYWJsZSBuYW1lICov Ci0JCQkJCWFwcGVuZFN0cmluZ0luZm8oJmVycl9kZXRhaWwsIF8oIlRoZSBzbG90J3MgY2F0YWxv Z194bWluICV1IGlzICVkIHRyYW5zYWN0aW9ucyBvbGQsIHdoaWNoIGV4Y2VlZHMgdGhlIGNvbmZp Z3VyZWQgXCIlc1wiIHZhbHVlIG9mICVkLiIpLAotCQkJCQkJCQkJIGNhdGFsb2dfeG1pbiwgKGlu dDMyKSAocmVjZW50WGlkIC0gY2F0YWxvZ194bWluKSwgIm1heF9zbG90X3hpZF9hZ2UiLCBtYXhf c2xvdF94aWRfYWdlKTsKLQkJCQl9CisJCQkJVHJhbnNhY3Rpb25JZCBzbG90X3hpZCA9IFRyYW5z YWN0aW9uSWRJc1ZhbGlkKHhtaW4pID8geG1pbiA6IGNhdGFsb2dfeG1pbjsKKwkJCQlpbnQzMgkJ ZXhjZWVkZWRfYnkgPSAoaW50MzIpICh4aWRMaW1pdCAtIHNsb3RfeGlkKTsKKwkJCQlpbnQzMgkJ c2xvdF9hZ2UgPSAoaW50MzIpIG1heF9zbG90X3hpZF9hZ2UgKyBleGNlZWRlZF9ieTsKKworCQkJ CUFzc2VydChUcmFuc2FjdGlvbklkSXNWYWxpZChzbG90X3hpZCkpOworCisJCQkJLyogdHJhbnNs YXRvcjogJXMgaXMgYSBHVUMgdmFyaWFibGUgbmFtZSAqLworCQkJCWFwcGVuZFN0cmluZ0luZm8o JmVycl9kZXRhaWwsCisJCQkJCQkJCSBUcmFuc2FjdGlvbklkSXNWYWxpZCh4bWluKQorCQkJCQkJ CQkgPyBfKCJUaGUgc2xvdCdzIHhtaW4gYWdlIG9mICVkIGV4Y2VlZHMgdGhlIGNvbmZpZ3VyZWQg XCIlc1wiIG9mICVkIGJ5ICVkIHRyYW5zYWN0aW9ucyIpCisJCQkJCQkJCSA6IF8oIlRoZSBzbG90 J3MgY2F0YWxvZyB4bWluIGFnZSBvZiAlZCBleGNlZWRzIHRoZSBjb25maWd1cmVkIFwiJXNcIiBv ZiAlZCBieSAlZCB0cmFuc2FjdGlvbnMiKSwKKwkJCQkJCQkJIHNsb3RfYWdlLCAibWF4X3Nsb3Rf eGlkX2FnZSIsIG1heF9zbG90X3hpZF9hZ2UsIGV4Y2VlZGVkX2J5KTsKIAogCQkJCS8qIHRyYW5z bGF0b3I6ICVzIGlzIGEgR1VDIHZhcmlhYmxlIG5hbWUgKi8KIAkJCQlhcHBlbmRTdHJpbmdJbmZv KCZlcnJfaGludCwgXygiWW91IG1pZ2h0IG5lZWQgdG8gaW5jcmVhc2UgXCIlc1wiLiIpLApAQCAt MjAzMywxOSArMjAzMSwxMyBAQCBJbnZhbGlkYXRlUG9zc2libHlPYnNvbGV0ZVNsb3QodWludDMy IHBvc3NpYmxlX2NhdXNlcywKIAkJCQkJCQkgICBSZXBsaWNhdGlvblNsb3QgKnMsCiAJCQkJCQkJ ICAgWExvZ1JlY1B0ciBvbGRlc3RMU04sCiAJCQkJCQkJICAgT2lkIGRib2lkLCBUcmFuc2FjdGlv bklkIHNuYXBzaG90Q29uZmxpY3RIb3Jpem9uLAotCQkJCQkJCSAgIFRyYW5zYWN0aW9uSWQgcmVj ZW50WGlkLAorCQkJCQkJCSAgIFRyYW5zYWN0aW9uSWQgeGlkTGltaXQsCiAJCQkJCQkJICAgYm9v bCAqcmVsZWFzZWRfbG9ja19vdXQpCiB7CiAJaW50CQkJbGFzdF9zaWduYWxlZF9waWQgPSAwOwog CWJvb2wJCXJlbGVhc2VkX2xvY2sgPSBmYWxzZTsKIAlib29sCQlpbnZhbGlkYXRlZCA9IGZhbHNl OwogCVRpbWVzdGFtcFR6IGluYWN0aXZlX3NpbmNlID0gMDsKLQlUcmFuc2FjdGlvbklkIHhpZExp bWl0ID0gSW52YWxpZFRyYW5zYWN0aW9uSWQ7Ci0KLQkvKiBDb21wdXRlIHRoZSBYSUQgbGltaXQg b25jZSwgdG8gYXZvaWQgcmVkdW5kYW50IHdvcmsgcGVyIHNsb3QgKi8KLQlpZiAoKHBvc3NpYmxl X2NhdXNlcyAmIFJTX0lOVkFMX1hJRF9BR0UpICYmCi0JCVRyYW5zYWN0aW9uSWRJc1ZhbGlkKHJl Y2VudFhpZCkpCi0JCXhpZExpbWl0ID0gVHJhbnNhY3Rpb25JZFJldHJlYXRlZEJ5KHJlY2VudFhp ZCwgbWF4X3Nsb3RfeGlkX2FnZSk7CiAKIAlmb3IgKDs7KQogCXsKQEAgLTIxODcsNyArMjE3OSw3 IEBAIEludmFsaWRhdGVQb3NzaWJseU9ic29sZXRlU2xvdCh1aW50MzIgcG9zc2libGVfY2F1c2Vz LAogCQkJCQkJCQkJICAgc2xvdG5hbWUsIHJlc3RhcnRfbHNuLAogCQkJCQkJCQkJICAgb2xkZXN0 TFNOLCBzbmFwc2hvdENvbmZsaWN0SG9yaXpvbiwKIAkJCQkJCQkJCSAgIHNsb3RfaWRsZV9zZWNz LCBzLT5kYXRhLnhtaW4sCi0JCQkJCQkJCQkgICBzLT5kYXRhLmNhdGFsb2dfeG1pbiwgcmVjZW50 WGlkKTsKKwkJCQkJCQkJCSAgIHMtPmRhdGEuY2F0YWxvZ194bWluLCB4aWRMaW1pdCk7CiAKIAkJ CQlpZiAoTXlCYWNrZW5kVHlwZSA9PSBCX1NUQVJUVVApCiAJCQkJCSh2b2lkKSBTaWduYWxSZWNv dmVyeUNvbmZsaWN0KEdldFBHUHJvY0J5TnVtYmVyKGFjdGl2ZV9wcm9jKSwKQEAgLTIyNDEsNyAr MjIzMyw3IEBAIEludmFsaWRhdGVQb3NzaWJseU9ic29sZXRlU2xvdCh1aW50MzIgcG9zc2libGVf Y2F1c2VzLAogCQkJCQkJCQkgICBzbG90bmFtZSwgcmVzdGFydF9sc24sCiAJCQkJCQkJCSAgIG9s ZGVzdExTTiwgc25hcHNob3RDb25mbGljdEhvcml6b24sCiAJCQkJCQkJCSAgIHNsb3RfaWRsZV9z ZWNzLCBzLT5kYXRhLnhtaW4sCi0JCQkJCQkJCSAgIHMtPmRhdGEuY2F0YWxvZ194bWluLCByZWNl bnRYaWQpOworCQkJCQkJCQkgICBzLT5kYXRhLmNhdGFsb2dfeG1pbiwgeGlkTGltaXQpOwogCiAJ CQkvKiBkb25lIHdpdGggdGhpcyBzbG90IGZvciBub3cgKi8KIAkJCWJyZWFrOwpAQCAtMjI4NCw3 ICsyMjc2LDcgQEAgYm9vbAogSW52YWxpZGF0ZU9ic29sZXRlUmVwbGljYXRpb25TbG90cyh1aW50 MzIgcG9zc2libGVfY2F1c2VzLAogCQkJCQkJCQkgICBYTG9nU2VnTm8gb2xkZXN0U2Vnbm8sIE9p ZCBkYm9pZCwKIAkJCQkJCQkJICAgVHJhbnNhY3Rpb25JZCBzbmFwc2hvdENvbmZsaWN0SG9yaXpv biwKLQkJCQkJCQkJICAgVHJhbnNhY3Rpb25JZCByZWNlbnRYaWQpCisJCQkJCQkJCSAgIFRyYW5z YWN0aW9uSWQgeGlkTGltaXQpCiB7CiAJWExvZ1JlY1B0cglvbGRlc3RMU047CiAJYm9vbAkJaW52 YWxpZGF0ZWQgPSBmYWxzZTsKQEAgLTIzMjMsNyArMjMxNSw3IEBAIHJlc3RhcnQ6CiAKIAkJaWYg KEludmFsaWRhdGVQb3NzaWJseU9ic29sZXRlU2xvdChwb3NzaWJsZV9jYXVzZXMsIHMsIG9sZGVz dExTTiwKIAkJCQkJCQkJCQkgICBkYm9pZCwgc25hcHNob3RDb25mbGljdEhvcml6b24sCi0JCQkJ CQkJCQkJICAgcmVjZW50WGlkLCAmcmVsZWFzZWRfbG9jaykpCisJCQkJCQkJCQkJICAgeGlkTGlt aXQsICZyZWxlYXNlZF9sb2NrKSkKIAkJewogCQkJQXNzZXJ0KHJlbGVhc2VkX2xvY2spOwogCkBA IC0zMzkxLDcgKzMzODMsNyBAQCBNYXliZUludmFsaWRhdGVYSURBZ2VkU2xvdHMoVHJhbnNhY3Rp b25JZCBzbG90X3htaW4sCiAJCQkJCQkJCQkJCQkJCSAwLAogCQkJCQkJCQkJCQkJCQkgSW52YWxp ZE9pZCwKIAkJCQkJCQkJCQkJCQkJIEludmFsaWRUcmFuc2FjdGlvbklkLAotCQkJCQkJCQkJCQkJ CQkgcmVjZW50WGlkKTsKKwkJCQkJCQkJCQkJCQkJIHhpZExpbWl0KTsKIAogCXJldHVybiBpbnZh bGlkYXRlZDsKIH0KZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3N0b3JhZ2UvaXBjL3Byb2NhcnJh eS5jIGIvc3JjL2JhY2tlbmQvc3RvcmFnZS9pcGMvcHJvY2FycmF5LmMKaW5kZXggOWUwYWNmNzMw OWQuLjg5OGVmNGEwODMzIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9zdG9yYWdlL2lwYy9wcm9j YXJyYXkuYworKysgYi9zcmMvYmFja2VuZC9zdG9yYWdlL2lwYy9wcm9jYXJyYXkuYwpAQCAtMTkz OCwxMCArMTkzOCwxMSBAQCBHbG9iYWxWaXNIb3Jpem9uS2luZEZvclJlbChSZWxhdGlvbiByZWwp CiB9CiAKIC8qCi0gKiBIZWxwZXIgdG8gcmV0dXJuIHRoZSBhcHByb3ByaWF0ZSBvbGRlc3Qgbm9u LXJlbW92YWJsZSBUcmFuc2FjdGlvbklkIGZyb20KLSAqIHByZS1jb21wdXRlZCBob3Jpem9ucywg YmFzZWQgb24gdGhlIHJlbGF0aW9uIHR5cGUuCisgKiBBIGhlbHBlciBmdW5jdGlvbiB0byByZXR1 cm4gdGhlIGFwcHJvcHJpYXRlIG9sZGVzdCBub24tcmVtb3ZhYmxlCisgKiBUcmFuc2FjdGlvbklk IGZyb20gdGhlIHByZS1jb21wdXRlZCBob3Jpem9ucywgYmFzZWQgb24gdGhlIHJlbGF0aW9uCisg KiB0eXBlLgogICovCi1zdGF0aWMgaW5saW5lIFRyYW5zYWN0aW9uSWQKK3N0YXRpYyBwZ19hdHRy aWJ1dGVfYWx3YXlzX2lubGluZSBUcmFuc2FjdGlvbklkCiBHZXRPbGRlc3ROb25SZW1vdmFibGVU cmFuc2FjdGlvbklkRnJvbUhvcml6b25zKENvbXB1dGVYaWRIb3Jpem9uc1Jlc3VsdCAqaG9yaXpv bnMsCiAJCQkJCQkJCQkJCSAgIFJlbGF0aW9uIHJlbCkKIHsKQEAgLTE5ODksOSArMTk5MCw5IEBA IEdldE9sZGVzdE5vblJlbW92YWJsZVRyYW5zYWN0aW9uSWQoUmVsYXRpb24gcmVsKQogICogbmVl ZHMgYm90aCB2YWx1ZXMuCiAgKi8KIFRyYW5zYWN0aW9uSWQKLUdldE9sZGVzdE5vblJlbW92YWJs ZVRyYW5zYWN0aW9uSWRFeHQoUmVsYXRpb24gcmVsLAotCQkJCQkJCQkJICBUcmFuc2FjdGlvbklk ICpzbG90X3htaW4sCi0JCQkJCQkJCQkgIFRyYW5zYWN0aW9uSWQgKnNsb3RfY2F0YWxvZ194bWlu KQorR2V0T2xkZXN0Tm9uUmVtb3ZhYmxlVHJhbnNhY3Rpb25JZFdpdGhTbG90WGlkcyhSZWxhdGlv biByZWwsCisJCQkJCQkJCQkJCSAgIFRyYW5zYWN0aW9uSWQgKnNsb3RfeG1pbiwKKwkJCQkJCQkJ CQkJICAgVHJhbnNhY3Rpb25JZCAqc2xvdF9jYXRhbG9nX3htaW4pCiB7CiAJQ29tcHV0ZVhpZEhv cml6b25zUmVzdWx0IGhvcml6b25zOwogCmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS9yZXBsaWNh dGlvbi9zbG90LmggYi9zcmMvaW5jbHVkZS9yZXBsaWNhdGlvbi9zbG90LmgKaW5kZXggMGJhYTcx MTI1NTkuLmQxNDNiMTlhN2IzIDEwMDY0NAotLS0gYS9zcmMvaW5jbHVkZS9yZXBsaWNhdGlvbi9z bG90LmgKKysrIGIvc3JjL2luY2x1ZGUvcmVwbGljYXRpb24vc2xvdC5oCkBAIC0zNzEsNyArMzcx LDcgQEAgZXh0ZXJuIGJvb2wgSW52YWxpZGF0ZU9ic29sZXRlUmVwbGljYXRpb25TbG90cyh1aW50 MzIgcG9zc2libGVfY2F1c2VzLAogCQkJCQkJCQkJCQkgICBYTG9nU2VnTm8gb2xkZXN0U2Vnbm8s CiAJCQkJCQkJCQkJCSAgIE9pZCBkYm9pZCwKIAkJCQkJCQkJCQkJICAgVHJhbnNhY3Rpb25JZCBz bmFwc2hvdENvbmZsaWN0SG9yaXpvbiwKLQkJCQkJCQkJCQkJICAgVHJhbnNhY3Rpb25JZCByZWNl bnRYaWQpOworCQkJCQkJCQkJCQkgICBUcmFuc2FjdGlvbklkIHhpZExpbWl0KTsKIGV4dGVybiBi b29sIE1heWJlSW52YWxpZGF0ZVhJREFnZWRTbG90cyhUcmFuc2FjdGlvbklkIHNsb3RfeG1pbiwK IAkJCQkJCQkJCQlUcmFuc2FjdGlvbklkIHNsb3RfY2F0YWxvZ194bWluKTsKIGV4dGVybiBSZXBs aWNhdGlvblNsb3QgKlNlYXJjaE5hbWVkUmVwbGljYXRpb25TbG90KGNvbnN0IGNoYXIgKm5hbWUs IGJvb2wgbmVlZF9sb2NrKTsKZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL3N0b3JhZ2UvcHJvY2Fy cmF5LmggYi9zcmMvaW5jbHVkZS9zdG9yYWdlL3Byb2NhcnJheS5oCmluZGV4IGMxOThmZDIyNTE1 Li5hOTQwOTFjZTdmZCAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvc3RvcmFnZS9wcm9jYXJyYXku aAorKysgYi9zcmMvaW5jbHVkZS9zdG9yYWdlL3Byb2NhcnJheS5oCkBAIC01Myw5ICs1Myw5IEBA IGV4dGVybiBSdW5uaW5nVHJhbnNhY3Rpb25zIEdldFJ1bm5pbmdUcmFuc2FjdGlvbkRhdGEodm9p ZCk7CiAKIGV4dGVybiBib29sIFRyYW5zYWN0aW9uSWRJc0luUHJvZ3Jlc3MoVHJhbnNhY3Rpb25J ZCB4aWQpOwogZXh0ZXJuIFRyYW5zYWN0aW9uSWQgR2V0T2xkZXN0Tm9uUmVtb3ZhYmxlVHJhbnNh Y3Rpb25JZChSZWxhdGlvbiByZWwpOwotZXh0ZXJuIFRyYW5zYWN0aW9uSWQgR2V0T2xkZXN0Tm9u UmVtb3ZhYmxlVHJhbnNhY3Rpb25JZEV4dChSZWxhdGlvbiByZWwsCi0JCQkJCQkJCQkJCQkJCSAg IFRyYW5zYWN0aW9uSWQgKnNsb3RfeG1pbiwKLQkJCQkJCQkJCQkJCQkJICAgVHJhbnNhY3Rpb25J ZCAqc2xvdF9jYXRhbG9nX3htaW4pOworZXh0ZXJuIFRyYW5zYWN0aW9uSWQgR2V0T2xkZXN0Tm9u UmVtb3ZhYmxlVHJhbnNhY3Rpb25JZFdpdGhTbG90WGlkcyhSZWxhdGlvbiByZWwsCisJCQkJCQkJ CQkJCQkJCQkJCVRyYW5zYWN0aW9uSWQgKnNsb3RfeG1pbiwKKwkJCQkJCQkJCQkJCQkJCQkJVHJh bnNhY3Rpb25JZCAqc2xvdF9jYXRhbG9nX3htaW4pOwogZXh0ZXJuIFRyYW5zYWN0aW9uSWQgR2V0 T2xkZXN0VHJhbnNhY3Rpb25JZENvbnNpZGVyZWRSdW5uaW5nKHZvaWQpOwogZXh0ZXJuIFRyYW5z YWN0aW9uSWQgR2V0T2xkZXN0QWN0aXZlVHJhbnNhY3Rpb25JZChib29sIGluQ29tbWl0T25seSwK IAkJCQkJCQkJCQkJCSAgYm9vbCBhbGxEYnMpOwo= --0000000000005f9a39064e6b3c32--