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 1w5sb7-003ie6-2G for pgsql-hackers@arkaria.postgresql.org; Thu, 26 Mar 2026 21:50:37 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1w5sb6-005pR5-0B for pgsql-hackers@arkaria.postgresql.org; Thu, 26 Mar 2026 21:50:36 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1w5sb5-005pQx-2D for pgsql-hackers@lists.postgresql.org; Thu, 26 Mar 2026 21:50:36 +0000 Received: from mail-lf1-x12c.google.com ([2a00:1450:4864:20::12c]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1w5sb3-00000001MXM-1Mhv for pgsql-hackers@postgresql.org; Thu, 26 Mar 2026 21:50:35 +0000 Received: by mail-lf1-x12c.google.com with SMTP id 2adb3069b0e04-5a281b091c2so1868539e87.0 for ; Thu, 26 Mar 2026 14:50:33 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1774561832; cv=none; d=google.com; s=arc-20240605; b=Yiv4MAlmAiCUU7HiCOtNh905wtSxv+WlA/SEzbWSwnG4CPG9tOmg8YKPoZL3rd4oNJ odSKO8eCM5dlb46pqao9/blcSF7pBy6NNh4yh0v4ZXMOenEZsWdtc+r8QodHfhwJIyGW Hlld7bhW48lb8LrbgTZmWzP9agRmUPA8h4H4qGD5MtNf9J55yakh+3iUipGzFMr71WpB eLfBhSNxX3a0WBlI+/TzsKOTQOkeDYtf+Frv4Xjq3W8Zfe8cYpXEQpgjvRX4sC6eW0yz boJRgkQTdrhhkTklb6Mm1EbBSi+LK1zb3jU+QsFIoHHhDh/1gkvDEefsfq6ClDmXtrKs kM7w== 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=9ctzP8p/J0q9/kz2IzSp2FO3/uiGSyeLgJUCvKZWoCQ=; fh=YYi0j9XLDRFH4gZSbd+IreelsdnY8u7bYYfH3tPYWtw=; b=LdJRvguDSHXtpIM8rGnpVQAW+G1eSfQmQOMGNPuRUVurbhZteXvNiDt3VXI8hBtiMK vnDLFjwGJOa6J09PxH1xjG/aqP8qpkfV/g8c2sofeVxer9CX96zvpGZ0JlbffGzCTq9A fmX4Wg1GimPbIEat9ctFzeFv728I0w5WCM8K3k9EyzMYbOd0kvPdogemf/vF7tVzCnjs kFBsPLnaM/ikWPo+m8b1etlZ+ZoTcdViBwj0/v7pPMQmCob0zCCyf3/U/02DU7waoCce s1m4smGEGANfHX8Uh67DvL9lgymxFfr7ftsNAIQc1ZSOsa8jEHwQRjQ5Be5cGTarjSgg PM4w==; 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=1774561832; x=1775166632; 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=9ctzP8p/J0q9/kz2IzSp2FO3/uiGSyeLgJUCvKZWoCQ=; b=Y/WS9G1i/DB5ssvLJSE7KFXHum5k04XOFTlxol1H1JXOEOe1X2Qjq9HZkJKzHTuVbJ T2bYjE4pQFxoKyd0motxb8NZGKSPaFlEolW9sMb6JoBWwDQ6hc2yukxgNZj5JJCOapVn ebOV7ME4VLspRfvYkfk+cYzt3p+wHFFfjd1ICFuNTCMTcf63OHK+qthxtKnlKDZMkbdq S9qJ1RAOKUz+IYyH2BGz390t2CrfTayU9ufEq38MB2OOvcPf6969ifAp5HjyLlMaE/tu GPeKnACmrOkFX7cRyMh45Sg2k/P95Vqg+QTQ1vqqCTcvLDS2jCMclw5VpWBMby9Pw7yH b3XA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774561832; x=1775166632; 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=9ctzP8p/J0q9/kz2IzSp2FO3/uiGSyeLgJUCvKZWoCQ=; b=eOWtpJM5OenS7SZX1g1LiDSoKgQb2mMopd8DpIrO1mRS/dYL9j1NJqwaLAYG7946xs gW+GnMi7p2DrAPZhNSp8F+6Y5Llu57dsGkO9mcfLL/KEeIKRXbkS/G1yq1zQERUtIscw Vwny8w4Hl4aiADbcbtt/hoKGoFv68PxNdVW2E+Gqjprc456VLEw7XojsgVmcWXM2t7i4 o78rlUytyxy+21Gogvw993gXf8vgEqKxKhABvshcP2Sk3unhsTh/dOZ6XN9oNBV1db7M yjy46xKu3CaY9jEI3WX7wy2ViwneLrYsB6ud6NVQyrcwJwn3vrgu1HWHeH1w8SQFn3FN M5iA== X-Forwarded-Encrypted: i=1; AJvYcCW2gTrzQcRJgr138Lt91kDhkcx30GiNWlja9BnYI0lYHXutpHETlMWTy+2m/bBhbniX40EsSXBoT2OxD43p@postgresql.org X-Gm-Message-State: AOJu0YzJ+8YRr8U0aOFzJemfoR8P2eFFOGyWo8XuCsroT/tC2IsZGlTW DYFdUHrc0DorBzLI23/NxiE4oTC7sSN8eKdHdLS7+z6XAFkUg14z2ies0bQ3HfiNoHO+40NtlX0 lYbNPR7Zfg1acRPMfJydiQMjiEavowNDDRKxX X-Gm-Gg: ATEYQzwKD6LxqWyJcsIZk1jjkyfD2JrxKExxWbCx/nuEgFrHfWeCuf4ljzBtL1xN/nx jt9U26DK5ToeD1fCGrrinXyr9u7YNSSFRZtYMCJ+E9OCBOihw2oLVqU5RCvlReSnnR5gGc8mjg9 P5wtzuRzm9BKs7h/KRvuqS6iFJ0avaIJvXJjRLtZTNpUyM3WjVPQAorSNFaKuCocO77mco5J5/s 3FPO0AczilfTvOfxXm10EihB0hgvx1AMcwUu+LEO11oxFMm+vOQDBr3qMJajfUzGLaKBXEkBxls pFIQy1zPR2pNRllm6Z4= X-Received: by 2002:a05:6512:3c88:b0:5a1:3437:84ac with SMTP id 2adb3069b0e04-5a2ab92a15bmr45220e87.31.1774561832104; Thu, 26 Mar 2026 14:50:32 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: From: Masahiko Sawada Date: Thu, 26 Mar 2026 14:49:55 -0700 X-Gm-Features: AQROBzCu1sdccG8CbYliGjSIRlsRQFBNkGBNU8abu0NZb7qbjs4AAc_OvTbBRrs Message-ID: Subject: Re: Introduce XID age based replication slot invalidation To: Bharath Rupireddy Cc: SATYANARAYANA NARLAPURAM , "Hayato Kuroda (Fujitsu)" , John H , PostgreSQL-development Content-Type: multipart/mixed; boundary="000000000000a29ff8064df45f91" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000a29ff8064df45f91 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Wed, Mar 25, 2026 at 12:17=E2=80=AFPM Bharath Rupireddy wrote: > > Hi, > > On Tue, Mar 24, 2026 at 11:50=E2=80=AFPM Masahiko Sawada wrote: > > > > > Please find the v3 patch for further review. > > > > Thank you for updating the patch. I think the patch is reasonably > > simple and can avoid unnecessary overheads well due to XID-based > > checks. Here are some comments: > > Thank you for reviewing the patch. > > > vacuum_get_cutoff() is also called by VACUUM FULL, CLUSTER, and > > REPACK. I'm not sure that users would expect the slot invalidation > > also in these commands. I think it's better to leave > > vacuum_get_cutoff() a pure cutoff computation function and we can try > > to invalidate slots in heap_vacuum_rel(). It requires additional > > ReadNextTransactionId() but we can live with it, or we can make > > vacuum_get_cutoffs() return the nextXID as well (stored in *cutoffs). > > +1. I chose to perform the slot invalidation in heap_vacuum_rel by > getting the next txn ID and calling vacuum_get_cutoffs again when a > slot gets invalidated. IMHO, this is simple than adding a flag and do > the invalidation selectively in vacuum_get_cutoffs. > > > if (TransactionIdPrecedes(oldestXmin, cutoffXID)) > > + { > > + invalidated =3D InvalidateObsoleteReplicationSlots(RS_INVAL_XID= _AGE, > > + 0, > > + InvalidOid, > > + InvalidTransac= tionId, > > + nextXID); > > + } > > > > I think it's better to check the procArray->replication_slot_xmin and > > procArray->replication_slot_catalog_xmin before iterating over each > > slot. Otherwise, we would end up checking every slot even when a long > > running transaction holds the oldestxmin back. > > +1. Changed. > > > + if (!TransactionIdIsNormal(cutoffXID)) > > + cutoffXID =3D FirstNormalTransactionId; > > > > These codes have the same comment but are doing a slightly different > > thing. I guess the latter is missing '-'? > > Fixed the typo. > > I fixed a test error being reported in CI. > > Please find the attached v4 patch for further review. Thank you for updating the patch. I've reviewed the patch and have some review comments: + /* translator: %s is a GUC variable name */ + appendStringInfo(&err_detail, _("The slot's xmin %u at next transaction ID %u exceeds the age %d specified by \"%s\"."), + xmin, + nextXID, + max_slot_xid_age, + "max_slot_xid_age"); I think it's better to show the age of the slot's xmin instead of the recent XID. --- + + if (!TransactionIdIsNormal(oldestXmin) || !TransactionIdIsNormal(nextXI= D)) + return false; + Do we expect that the passed oldestXmin or nextXID could be non-normal XIDs? I think the function assumes these are valid XIDs. Also, since this function is called only by heap_vacuum_rel(), we can call ReadNextTransactionId() within this function. --- + if (IsReplicationSlotXIDAged(slot_xmin, slot_catalog_xmin, nextXID)= ) We compute the cutoff XID in IsReplicationSlotXIDAged() again, which seems redundant. I've attached the fixup patch addressing these comments and having some code cleanups. Please review it. I'm reviewing the regression test part, and will share review comments soon= . > > I've also attached the 0002 patch that adds a test case to demo a > production-like scenario by pushing the database to XID wraparound > limits and checking if the XID-age based invalidation with the GUC > setting at the default vacuum_failsafe_age of 1.6B works correctly, > and whether autovacuum can successfully remove this replication slot > blocker to proceed with freezing and bring the database back to > normal. I don't intend to get this committed unless others think > otherwise, but I wanted to have this as a reference. Thank you for sharing the test script! I'll check it as well. Regards, --=20 Masahiko Sawada Amazon Web Services: https://aws.amazon.com --000000000000a29ff8064df45f91 Content-Type: text/x-patch; charset="US-ASCII"; name="v4_cleanup_masahiko.patch" Content-Disposition: attachment; filename="v4_cleanup_masahiko.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mn808a1m0 ZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2FjY2Vzcy9oZWFwL3ZhY3V1bWxhenkuYyBiL3NyYy9i YWNrZW5kL2FjY2Vzcy9oZWFwL3ZhY3V1bWxhenkuYwppbmRleCA4MDkwNjExMTBjNy4uYmM5MzYw Yjk3NDMgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL2FjY2Vzcy9oZWFwL3ZhY3V1bWxhenkuYwor KysgYi9zcmMvYmFja2VuZC9hY2Nlc3MvaGVhcC92YWN1dW1sYXp5LmMKQEAgLTgwNSwxNiArODA1 LDE1IEBAIGhlYXBfdmFjdXVtX3JlbChSZWxhdGlvbiByZWwsIGNvbnN0IFZhY3V1bVBhcmFtcyBw YXJhbXMsCiAJICogdmFjdXVtJ3MgYWJpbGl0eSB0byBmcmVlemUgYW5kIHJlbW92ZSBkZWFkIHR1 cGxlcy4gU2luY2UgT2xkZXN0WG1pbgogCSAqIGFscmVhZHkgY292ZXJzIHRoZSBzbG90IHhtaW4v Y2F0YWxvZ194bWluIHZhbHVlcywgcGFzcyBpdCBhcyBhCiAJICogcHJlbGltaW5hcnkgY2hlY2sg dG8gYXZvaWQgYWRkaXRpb25hbCBpdGVyYXRpb24gb3ZlciBhbGwgdGhlIHNsb3RzLgotCSAqCi0J ICogSWYgYXQgbGVhc3Qgb25lIHNsb3Qgd2FzIGludmFsaWRhdGVkLCByZWNvbXB1dGUgY3V0b2Zm cyBzbyB0aGF0IHRoaXMKLQkgKiB2YWN1dW0gYmVuZWZpdHMgZnJvbSB0aGUgYWR2YW5jZWQgaG9y aXpvbiBpbW1lZGlhdGVseS4KLQkgKgotCSAqIFhYWDogTmV4dCBYSUQgY291bGQgYmUgcmV0dXJu ZWQgYXMgb3V0cHV0IGZyb20gdmFjdXVtX2dldF9jdXRvZmZzKCkgYnV0Ci0JICogZm9yIG5vdyB3 ZSBsaXZlIHdpdGggYW4gYWRkaXRpb25hbCBSZWFkTmV4dFRyYW5zYWN0aW9uSWQoKSBjYWxsLgog CSAqLwotCWlmIChJbnZhbGlkYXRlWElEQWdlZFJlcGxpY2F0aW9uU2xvdHModmFjcmVsLT5jdXRv ZmZzLk9sZGVzdFhtaW4sCi0JCQkJCQkJCQkJICBSZWFkTmV4dFRyYW5zYWN0aW9uSWQoKSkpCisJ aWYgKE1heWJlSW52YWxpZGF0ZVhJREFnZWRTbG90cyh2YWNyZWwtPmN1dG9mZnMuT2xkZXN0WG1p bikpCisJeworCQkvKgorCQkgKiBTb21lIHNsb3RzIGhhdmUgYmVlbiBpbnZhbGlkYXRlZCBiYXNl ZCBvbiB0aGVpciBYSUQgYWdlOyByZWNvbXB1dGUKKwkJICogdGhlIHZhY3V1bSBjdXRvZmZzLgor CQkgKi8KIAkJdmFjcmVsLT5hZ2dyZXNzaXZlID0gdmFjdXVtX2dldF9jdXRvZmZzKHJlbCwgcGFy YW1zLCAmdmFjcmVsLT5jdXRvZmZzKTsKKwl9CiAKIAl2YWNyZWwtPnJlbF9wYWdlcyA9IG9yaWdf cmVsX3BhZ2VzID0gUmVsYXRpb25HZXROdW1iZXJPZkJsb2NrcyhyZWwpOwogCXZhY3JlbC0+dmlz dGVzdCA9IEdsb2JhbFZpc1Rlc3RGb3IocmVsKTsKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3Jl cGxpY2F0aW9uL3Nsb3QuYyBiL3NyYy9iYWNrZW5kL3JlcGxpY2F0aW9uL3Nsb3QuYwppbmRleCA4 Y2E1ZDg2ZmUwZS4uODI5Njg1NmVlZmUgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3JlcGxpY2F0 aW9uL3Nsb3QuYworKysgYi9zcmMvYmFja2VuZC9yZXBsaWNhdGlvbi9zbG90LmMKQEAgLTE2MCw3 ICsxNjAsNyBAQCBpbnQJCQltYXhfcmVwbGljYXRpb25fc2xvdHMgPSAxMDsgLyogdGhlIG1heGlt dW0gbnVtYmVyIG9mIHJlcGxpY2F0aW9uCiBpbnQJCQlpZGxlX3JlcGxpY2F0aW9uX3Nsb3RfdGlt ZW91dF9zZWNzID0gMDsKIAogLyoKLSAqIEludmFsaWRhdGUgcmVwbGljYXRpb24gc2xvdHMgdGhh dCBoYXZlIHhtaW4gb3IgY2F0YWxvZ194bWluIGdyZWF0ZXIKKyAqIEludmFsaWRhdGUgcmVwbGlj YXRpb24gc2xvdHMgdGhhdCBoYXZlIHhtaW4gb3IgY2F0YWxvZ194bWluIG9sZGVyCiAgKiB0aGFu IHRoZSBzcGVjaWZpZWQgYWdlOyAnMCcgZGlzYWJsZXMgaXQuCiAgKi8KIGludAkJCW1heF9zbG90 X3hpZF9hZ2UgPSAwOwpAQCAtMTgzLDggKzE4Myw2IEBAIHN0YXRpYyBYTG9nUmVjUHRyIHNzX29s ZGVzdF9mbHVzaF9sc24gPSBJbnZhbGlkWExvZ1JlY1B0cjsKIHN0YXRpYyB2b2lkIFJlcGxpY2F0 aW9uU2xvdFNobWVtRXhpdChpbnQgY29kZSwgRGF0dW0gYXJnKTsKIHN0YXRpYyBib29sIElzU2xv dEZvckNvbmZsaWN0Q2hlY2soY29uc3QgY2hhciAqbmFtZSk7CiBzdGF0aWMgdm9pZCBSZXBsaWNh dGlvblNsb3REcm9wUHRyKFJlcGxpY2F0aW9uU2xvdCAqc2xvdCk7Ci1zdGF0aWMgYm9vbCBJc1Jl cGxpY2F0aW9uU2xvdFhJREFnZWQoVHJhbnNhY3Rpb25JZCB4bWluLCBUcmFuc2FjdGlvbklkIGNh dGFsb2dfeG1pbiwKLQkJCQkJCQkJCSBUcmFuc2FjdGlvbklkIG5leHRYSUQpOwogCiAvKiBpbnRl cm5hbCBwZXJzaXN0ZW5jeSBmdW5jdGlvbnMgKi8KIHN0YXRpYyB2b2lkIFJlc3RvcmVTbG90RnJv bURpc2soY29uc3QgY2hhciAqbmFtZSk7CkBAIC0xNzkyLDcgKzE3OTAsNyBAQCBSZXBvcnRTbG90 SW52YWxpZGF0aW9uKFJlcGxpY2F0aW9uU2xvdEludmFsaWRhdGlvbkNhdXNlIGNhdXNlLAogCQkJ CQkgICBsb25nIHNsb3RfaWRsZV9zZWNvbmRzLAogCQkJCQkgICBUcmFuc2FjdGlvbklkIHhtaW4s CiAJCQkJCSAgIFRyYW5zYWN0aW9uSWQgY2F0YWxvZ194bWluLAotCQkJCQkgICBUcmFuc2FjdGlv bklkIG5leHRYSUQpCisJCQkJCSAgIFRyYW5zYWN0aW9uSWQgcmVjZW50WGlkKQogewogCVN0cmlu Z0luZm9EYXRhIGVycl9kZXRhaWw7CiAJU3RyaW5nSW5mb0RhdGEgZXJyX2hpbnQ7CkBAIC0xODQ1 LDIwICsxODQzLDE0IEBAIFJlcG9ydFNsb3RJbnZhbGlkYXRpb24oUmVwbGljYXRpb25TbG90SW52 YWxpZGF0aW9uQ2F1c2UgY2F1c2UsCiAJCQkJaWYgKFRyYW5zYWN0aW9uSWRJc1ZhbGlkKHhtaW4p KQogCQkJCXsKIAkJCQkJLyogdHJhbnNsYXRvcjogJXMgaXMgYSBHVUMgdmFyaWFibGUgbmFtZSAq LwotCQkJCQlhcHBlbmRTdHJpbmdJbmZvKCZlcnJfZGV0YWlsLCBfKCJUaGUgc2xvdCdzIHhtaW4g JXUgYXQgbmV4dCB0cmFuc2FjdGlvbiBJRCAldSBleGNlZWRzIHRoZSBhZ2UgJWQgc3BlY2lmaWVk IGJ5IFwiJXNcIi4iKSwKLQkJCQkJCQkJCSB4bWluLAotCQkJCQkJCQkJIG5leHRYSUQsCi0JCQkJ CQkJCQkgbWF4X3Nsb3RfeGlkX2FnZSwKLQkJCQkJCQkJCSAibWF4X3Nsb3RfeGlkX2FnZSIpOwor CQkJCQlhcHBlbmRTdHJpbmdJbmZvKCZlcnJfZGV0YWlsLCBfKCJUaGUgc2xvdCdzIHhtaW4gJXUg aXMgJWQgdHJhbnNhY3Rpb25zIG9sZCwgd2hpY2ggZXhjZWVkcyB0aGUgY29uZmlndXJlZCBcIiVz XCIgdmFsdWUgb2YgJWQuIiksCisJCQkJCQkJCQkgeG1pbiwgKGludDMyKSAocmVjZW50WGlkIC0g eG1pbiksICJtYXhfc2xvdF94aWRfYWdlIiwgbWF4X3Nsb3RfeGlkX2FnZSk7CiAJCQkJfQogCQkJ CWVsc2UKIAkJCQl7CiAJCQkJCS8qIHRyYW5zbGF0b3I6ICVzIGlzIGEgR1VDIHZhcmlhYmxlIG5h bWUgKi8KLQkJCQkJYXBwZW5kU3RyaW5nSW5mbygmZXJyX2RldGFpbCwgXygiVGhlIHNsb3QncyBj YXRhbG9nIHhtaW4gJXUgYXQgbmV4dCB0cmFuc2FjdGlvbiBJRCAldSBleGNlZWRzIHRoZSBhZ2Ug JWQgc3BlY2lmaWVkIGJ5IFwiJXNcIi4iKSwKLQkJCQkJCQkJCSBjYXRhbG9nX3htaW4sCi0JCQkJ CQkJCQkgbmV4dFhJRCwKLQkJCQkJCQkJCSBtYXhfc2xvdF94aWRfYWdlLAotCQkJCQkJCQkJICJt YXhfc2xvdF94aWRfYWdlIik7CisJCQkJCWFwcGVuZFN0cmluZ0luZm8oJmVycl9kZXRhaWwsIF8o IlRoZSBzbG90J3MgeG1pbiAldSBpcyAlZCB0cmFuc2FjdGlvbnMgb2xkLCB3aGljaCBleGNlZWRz IHRoZSBjb25maWd1cmVkIFwiJXNcIiB2YWx1ZSBvZiAlZC4iKSwKKwkJCQkJCQkJCSBjYXRhbG9n X3htaW4sIChpbnQzMikgKHJlY2VudFhpZCAtIGNhdGFsb2dfeG1pbiksICJtYXhfc2xvdF94aWRf YWdlIiwgbWF4X3Nsb3RfeGlkX2FnZSk7CiAJCQkJfQogCiAJCQkJLyogdHJhbnNsYXRvcjogJXMg aXMgYSBHVUMgdmFyaWFibGUgbmFtZSAqLwpAQCAtMTkwNSw2ICsxODk3LDI1IEBAIENhbkludmFs aWRhdGVJZGxlU2xvdChSZXBsaWNhdGlvblNsb3QgKnMpCiAJCQkhKFJlY292ZXJ5SW5Qcm9ncmVz cygpICYmIHMtPmRhdGEuc3luY2VkKSk7CiB9CiAKKy8qCisgKiBDYW4gd2UgaW52YWxpZGF0ZSBh biBYSUQtYWdlZCByZXBsaWNhdGlvbiBzbG90PworICoKKyAqIFhJRC1hZ2VkIGJhc2VkIGludmFs aWRhdGlvbiBpcyBhbGxvd2VkIHRvIHRoZSBnaXZlbiBzbG90IHdoZW46CisgKgorICogMS4gTWF4 IFhJRC1hZ2UgaXMgc2V0CisgKiAyLiBTbG90IGhhcyB2YWxpZCB4bWluIG9yIGNhdGFsb2dfeG1p bgorICogMy4gVGhlIHNsb3QgaXMgbm90IGJlaW5nIHN5bmNlZCBmcm9tIHRoZSBwcmltYXJ5IHdo aWxlIHRoZSBzZXJ2ZXIgaXMgaW4KKyAqCSAgcmVjb3ZlcnkuCisgKi8KK3N0YXRpYyBpbmxpbmUg Ym9vbAorQ2FuSW52YWxpZGF0ZVhpZEFnZWRTbG90KFJlcGxpY2F0aW9uU2xvdCAqcykKK3sKKwly ZXR1cm4gKG1heF9zbG90X3hpZF9hZ2UgIT0gMCAmJgorCQkJKFRyYW5zYWN0aW9uSWRJc1ZhbGlk KHMtPmRhdGEueG1pbikgfHwKKwkJCSBUcmFuc2FjdGlvbklkSXNWYWxpZChzLT5kYXRhLmNhdGFs b2dfeG1pbikpICYmCisJCQkhKFJlY292ZXJ5SW5Qcm9ncmVzcygpICYmIHMtPmRhdGEuc3luY2Vk KSk7Cit9CisKIC8qCiAgKiBEZXRlcm1pbmVTbG90SW52YWxpZGF0aW9uQ2F1c2UgLSBEZXRlcm1p bmUgdGhlIGNhdXNlIGZvciB3aGljaCBhIHNsb3QKICAqIGJlY29tZXMgaW52YWxpZCBhbW9uZyB0 aGUgZ2l2ZW4gcG9zc2libGUgY2F1c2VzLgpAQCAtMTkxNiw3ICsxOTI3LDcgQEAgc3RhdGljIFJl cGxpY2F0aW9uU2xvdEludmFsaWRhdGlvbkNhdXNlCiBEZXRlcm1pbmVTbG90SW52YWxpZGF0aW9u Q2F1c2UodWludDMyIHBvc3NpYmxlX2NhdXNlcywgUmVwbGljYXRpb25TbG90ICpzLAogCQkJCQkJ CSAgIFhMb2dSZWNQdHIgb2xkZXN0TFNOLCBPaWQgZGJvaWQsCiAJCQkJCQkJICAgVHJhbnNhY3Rp b25JZCBzbmFwc2hvdENvbmZsaWN0SG9yaXpvbiwKLQkJCQkJCQkgICBUcmFuc2FjdGlvbklkIG5l eHRYSUQsCisJCQkJCQkJICAgVHJhbnNhY3Rpb25JZCByZWNlbnRYaWQsCiAJCQkJCQkJICAgVGlt ZXN0YW1wVHogKmluYWN0aXZlX3NpbmNlLCBUaW1lc3RhbXBUeiBub3cpCiB7CiAJQXNzZXJ0KHBv c3NpYmxlX2NhdXNlcyAhPSBSU19JTlZBTF9OT05FKTsKQEAgLTE5ODksOSArMjAwMCwyMyBAQCBE ZXRlcm1pbmVTbG90SW52YWxpZGF0aW9uQ2F1c2UodWludDMyIHBvc3NpYmxlX2NhdXNlcywgUmVw bGljYXRpb25TbG90ICpzLAogCX0KIAogCS8qIENoZWNrIGlmIHRoZSBzbG90IG5lZWRzIHRvIGJl IGludmFsaWRhdGVkIGR1ZSB0byBtYXhfc2xvdF94aWRfYWdlIEdVQyAqLwotCWlmICgocG9zc2li bGVfY2F1c2VzICYgUlNfSU5WQUxfWElEX0FHRSkgJiYKLQkJSXNSZXBsaWNhdGlvblNsb3RYSURB Z2VkKHMtPmRhdGEueG1pbiwgcy0+ZGF0YS5jYXRhbG9nX3htaW4sIG5leHRYSUQpKQotCQlyZXR1 cm4gUlNfSU5WQUxfWElEX0FHRTsKKwlpZiAocG9zc2libGVfY2F1c2VzICYgUlNfSU5WQUxfWElE X0FHRSkKKwl7CisJCUFzc2VydChUcmFuc2FjdGlvbklkSXNWYWxpZChyZWNlbnRYaWQpKTsKKwor CQlpZiAoQ2FuSW52YWxpZGF0ZVhpZEFnZWRTbG90KHMpKQorCQl7CisJCQlUcmFuc2FjdGlvbklk IHhpZExpbWl0OworCisJCQl4aWRMaW1pdCA9IFRyYW5zYWN0aW9uSWRSZXRyZWF0ZWRCeShyZWNl bnRYaWQsIG1heF9zbG90X3hpZF9hZ2UpOworCisJCQlpZiAoKFRyYW5zYWN0aW9uSWRJc1ZhbGlk KHMtPmRhdGEueG1pbikgJiYKKwkJCQkgVHJhbnNhY3Rpb25JZFByZWNlZGVzKHMtPmRhdGEueG1p biwgeGlkTGltaXQpKSB8fAorCQkJCShUcmFuc2FjdGlvbklkSXNWYWxpZChzLT5kYXRhLmNhdGFs b2dfeG1pbikgJiYKKwkJCQkgVHJhbnNhY3Rpb25JZFByZWNlZGVzKHMtPmRhdGEuY2F0YWxvZ194 bWluLCB4aWRMaW1pdCkpKQorCQkJCXJldHVybiBSU19JTlZBTF9YSURfQUdFOworCQl9CisJfQog CiAJcmV0dXJuIFJTX0lOVkFMX05PTkU7CiB9CkBAIC0yMDE1LDcgKzIwNDAsNyBAQCBJbnZhbGlk YXRlUG9zc2libHlPYnNvbGV0ZVNsb3QodWludDMyIHBvc3NpYmxlX2NhdXNlcywKIAkJCQkJCQkg ICBSZXBsaWNhdGlvblNsb3QgKnMsCiAJCQkJCQkJICAgWExvZ1JlY1B0ciBvbGRlc3RMU04sCiAJ CQkJCQkJICAgT2lkIGRib2lkLCBUcmFuc2FjdGlvbklkIHNuYXBzaG90Q29uZmxpY3RIb3Jpem9u LAotCQkJCQkJCSAgIFRyYW5zYWN0aW9uSWQgbmV4dFhJRCwKKwkJCQkJCQkgICBUcmFuc2FjdGlv bklkIHJlY2VudFhpZCwKIAkJCQkJCQkgICBib29sICpyZWxlYXNlZF9sb2NrX291dCkKIHsKIAlp bnQJCQlsYXN0X3NpZ25hbGVkX3BpZCA9IDA7CkBAIC0yMDY4LDcgKzIwOTMsNyBAQCBJbnZhbGlk YXRlUG9zc2libHlPYnNvbGV0ZVNsb3QodWludDMyIHBvc3NpYmxlX2NhdXNlcywKIAkJCQkJCQkJ CQkJCQkJCQlzLCBvbGRlc3RMU04sCiAJCQkJCQkJCQkJCQkJCQkJZGJvaWQsCiAJCQkJCQkJCQkJ CQkJCQkJc25hcHNob3RDb25mbGljdEhvcml6b24sCi0JCQkJCQkJCQkJCQkJCQkJbmV4dFhJRCwK KwkJCQkJCQkJCQkJCQkJCQlyZWNlbnRYaWQsCiAJCQkJCQkJCQkJCQkJCQkJJmluYWN0aXZlX3Np bmNlLAogCQkJCQkJCQkJCQkJCQkJCW5vdyk7CiAKQEAgLTIxNjMsNyArMjE4OCw3IEBAIEludmFs aWRhdGVQb3NzaWJseU9ic29sZXRlU2xvdCh1aW50MzIgcG9zc2libGVfY2F1c2VzLAogCQkJCQkJ CQkJICAgc2xvdG5hbWUsIHJlc3RhcnRfbHNuLAogCQkJCQkJCQkJICAgb2xkZXN0TFNOLCBzbmFw c2hvdENvbmZsaWN0SG9yaXpvbiwKIAkJCQkJCQkJCSAgIHNsb3RfaWRsZV9zZWNzLCBzLT5kYXRh LnhtaW4sCi0JCQkJCQkJCQkgICBzLT5kYXRhLmNhdGFsb2dfeG1pbiwgbmV4dFhJRCk7CisJCQkJ CQkJCQkgICBzLT5kYXRhLmNhdGFsb2dfeG1pbiwgcmVjZW50WGlkKTsKIAogCQkJCWlmIChNeUJh Y2tlbmRUeXBlID09IEJfU1RBUlRVUCkKIAkJCQkJKHZvaWQpIFNpZ25hbFJlY292ZXJ5Q29uZmxp Y3QoR2V0UEdQcm9jQnlOdW1iZXIoYWN0aXZlX3Byb2MpLApAQCAtMjIxNyw3ICsyMjQyLDcgQEAg SW52YWxpZGF0ZVBvc3NpYmx5T2Jzb2xldGVTbG90KHVpbnQzMiBwb3NzaWJsZV9jYXVzZXMsCiAJ CQkJCQkJCSAgIHNsb3RuYW1lLCByZXN0YXJ0X2xzbiwKIAkJCQkJCQkJICAgb2xkZXN0TFNOLCBz bmFwc2hvdENvbmZsaWN0SG9yaXpvbiwKIAkJCQkJCQkJICAgc2xvdF9pZGxlX3NlY3MsIHMtPmRh dGEueG1pbiwKLQkJCQkJCQkJICAgcy0+ZGF0YS5jYXRhbG9nX3htaW4sIG5leHRYSUQpOworCQkJ CQkJCQkgICBzLT5kYXRhLmNhdGFsb2dfeG1pbiwgcmVjZW50WGlkKTsKIAogCQkJLyogZG9uZSB3 aXRoIHRoaXMgc2xvdCBmb3Igbm93ICovCiAJCQlicmVhazsKQEAgLTIyNTksNyArMjI4NCw4IEBA IEludmFsaWRhdGVQb3NzaWJseU9ic29sZXRlU2xvdCh1aW50MzIgcG9zc2libGVfY2F1c2VzLAog Ym9vbAogSW52YWxpZGF0ZU9ic29sZXRlUmVwbGljYXRpb25TbG90cyh1aW50MzIgcG9zc2libGVf Y2F1c2VzLAogCQkJCQkJCQkgICBYTG9nU2VnTm8gb2xkZXN0U2Vnbm8sIE9pZCBkYm9pZCwKLQkJ CQkJCQkJICAgVHJhbnNhY3Rpb25JZCBzbmFwc2hvdENvbmZsaWN0SG9yaXpvbiwgVHJhbnNhY3Rp b25JZCBuZXh0WElEKQorCQkJCQkJCQkgICBUcmFuc2FjdGlvbklkIHNuYXBzaG90Q29uZmxpY3RI b3Jpem9uLAorCQkJCQkJCQkgICBUcmFuc2FjdGlvbklkIHJlY2VudFhpZCkKIHsKIAlYTG9nUmVj UHRyCW9sZGVzdExTTjsKIAlib29sCQlpbnZhbGlkYXRlZCA9IGZhbHNlOwpAQCAtMjI5OCw3ICsy MzI0LDcgQEAgcmVzdGFydDoKIAogCQlpZiAoSW52YWxpZGF0ZVBvc3NpYmx5T2Jzb2xldGVTbG90 KHBvc3NpYmxlX2NhdXNlcywgcywgb2xkZXN0TFNOLAogCQkJCQkJCQkJCSAgIGRib2lkLCBzbmFw c2hvdENvbmZsaWN0SG9yaXpvbiwKLQkJCQkJCQkJCQkgICBuZXh0WElELCAmcmVsZWFzZWRfbG9j aykpCisJCQkJCQkJCQkJICAgcmVjZW50WGlkLCAmcmVsZWFzZWRfbG9jaykpCiAJCXsKIAkJCUFz c2VydChyZWxlYXNlZF9sb2NrKTsKIApAQCAtMzMzMCwxMDQgKzMzNTYsNTMgQEAgV2FpdEZvclN0 YW5kYnlDb25maXJtYXRpb24oWExvZ1JlY1B0ciB3YWl0X2Zvcl9sc24pCiAJQ29uZGl0aW9uVmFy aWFibGVDYW5jZWxTbGVlcCgpOwogfQogCi0vKgotICogQ2hlY2sgaWYgdGhlIHBhc3NlZC1pbiB4 bWluIG9yIGNhdGFsb2dfeG1pbiBoYXZlIGFnZWQgYmV5b25kIHRoZQotICogbWF4X3Nsb3RfeGlk X2FnZSBHVUMgbGltaXQgcmVsYXRpdmUgdG8gbmV4dFhJRC4KLSAqCi0gKiBSZXR1cm5zIHRydWUg aWYgZWl0aGVyIHZhbHVlIGV4Y2VlZHMgdGhlIGNvbmZpZ3VyZWQgYWdlLgotICovCi1zdGF0aWMg Ym9vbAotSXNSZXBsaWNhdGlvblNsb3RYSURBZ2VkKFRyYW5zYWN0aW9uSWQgeG1pbiwgVHJhbnNh Y3Rpb25JZCBjYXRhbG9nX3htaW4sCi0JCQkJCQkgVHJhbnNhY3Rpb25JZCBuZXh0WElEKQotewot CVRyYW5zYWN0aW9uSWQgY3V0b2ZmWElEOwotCWJvb2wJCWFnZWQgPSBmYWxzZTsKLQotCWlmICht YXhfc2xvdF94aWRfYWdlID09IDApCi0JCXJldHVybiBmYWxzZTsKLQotCWlmICghVHJhbnNhY3Rp b25JZElzTm9ybWFsKG5leHRYSUQpKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQljdXRvZmZYSUQgPSBu ZXh0WElEIC0gbWF4X3Nsb3RfeGlkX2FnZTsKLQotCS8qIGVuc3VyZSBpdCdzIGEgIm5vcm1hbCIg WElELCBlbHNlIFRyYW5zYWN0aW9uSWRQcmVjZWRlcyBtaXNiZWhhdmVzICovCi0JLyogdGhpcyBj YW4gY2F1c2UgdGhlIGxpbWl0IHRvIGdvIGJhY2t3YXJkcyBieSAzLCBidXQgdGhhdCdzIE9LICov Ci0JaWYgKGN1dG9mZlhJRCA8IEZpcnN0Tm9ybWFsVHJhbnNhY3Rpb25JZCkKLQkJY3V0b2ZmWElE IC09IEZpcnN0Tm9ybWFsVHJhbnNhY3Rpb25JZDsKLQotCWlmIChUcmFuc2FjdGlvbklkSXNOb3Jt YWwoeG1pbikgJiYKLQkJVHJhbnNhY3Rpb25JZFByZWNlZGVzKHhtaW4sIGN1dG9mZlhJRCkpCi0J CWFnZWQgPSB0cnVlOwotCi0JaWYgKFRyYW5zYWN0aW9uSWRJc05vcm1hbChjYXRhbG9nX3htaW4p ICYmCi0JCVRyYW5zYWN0aW9uSWRQcmVjZWRlcyhjYXRhbG9nX3htaW4sIGN1dG9mZlhJRCkpCi0J CWFnZWQgPSB0cnVlOwotCi0JcmV0dXJuIGFnZWQ7Ci19Ci0KIC8qCiAgKiBJbnZhbGlkYXRlIHJl cGxpY2F0aW9uIHNsb3RzIHdob3NlIFhJRCBhZ2UgZXhjZWVkcyB0aGUgbWF4X3Nsb3RfeGlkX2Fn ZQogICogR1VDLgogICoKLSAqIFRoZSBjYWxsZXIgc3VwcGxpZXMgb2xkZXN0WG1pbiwgZWl0aGVy IGNvbXB1dGVkIHZpYQotICogR2V0T2xkZXN0Tm9uUmVtb3ZhYmxlVHJhbnNhY3Rpb25JZCBkdXJp bmcgdmFjdXVtLCBvciBjb21wdXRlZCB2aWEgdGhlCi0gKiBtaW5pbXVtIG9mIHNsb3QgeG1pbiB2 YWx1ZXMgb2J0YWluZWQgZnJvbSBQcm9jQXJyYXlHZXRSZXBsaWNhdGlvblNsb3RYbWluLAotICog YW5kIG5leHRYSUQsIHRoZSBuZXh0IFhJRCB0byBiZSBhc3NpZ25lZCB1c2VkIHRvIGNvbXB1dGUg dGhlIGFnZS4KLSAqCi0gKiBQcmVsaW1pbmFyeSBjaGVja3MgYmFzZWQgb24gdGhlIHBhc3NlZC1p biBvbGRlc3RYbWluIGFuZCB0aGUgb2xkZXN0IHNsb3QKLSAqIHhtaW4gYW5kIGNhdGFsb2dfeG1p biBhcmUgZG9uZSB0byBhdm9pZCB1bm5lY2Vzc2FyaWx5IGl0ZXJhdGluZyBvdmVyIGFsbAotICog dGhlIHNsb3RzLiAgSWYgdGhlIG9sZGVzdFhtaW4gYWdlIGRvZXMgbm90IGV4Y2VlZCB0aGUgR1VD IHRoZW4gbm8KLSAqIGluZGl2aWR1YWwgc2xvdCBjYW4gZWl0aGVyLCBzbyB0aGUgcGVyLXNsb3Qg c2NhbiBpcyBza2lwcGVkLiAgRm9yIGV4YW1wbGUsCi0gKiBpZiBvbGRlc3RYbWluIGlzIDEwMCBh bmQgdGhlIEdVQyBpcyA1MDAsIGV2ZXJ5IHNsb3QncyB4bWluIG11c3QgYmUgPj0gMTAwLAotICog c28gbm9uZSBjYW4gYmUgb2xkZXIgdGhhbiB0aGUgR1VDLiAgU2ltaWxhcmx5LCBpZiB0aGUgb2xk ZXN0IHNsb3QgeG1pbiBhbmQKLSAqIGNhdGFsb2dfeG1pbiBmcm9tIFByb2NBcnJheSBhcmUgbm90 IGFnZWQsIHRoZSBwZXItc2xvdCBzY2FuIGlzIHNraXBwZWQ7Ci0gKiB0aGlzIGNhbiBoYXBwZW4g d2hlbiBhIGxvbmctcnVubmluZyB0cmFuc2FjdGlvbiBob2xkcyB0aGUgb2xkZXN0WG1pbiBiYWNr LgotICoKLSAqIEV2ZW4gaWYgdGhlIGNhbGxlciBwYXNzZXMgYW4gb2xkZXN0WG1pbiB0aGF0IGRv ZXMgbm90IGluY2x1ZGUgdGhlIHNsb3QKLSAqIHhtaW4vY2F0YWxvZ194bWluIHJhbmdlLCB0aGVy ZSBpcyBubyByaXNrIG9mIGluY29ycmVjdCBpbnZhbGlkYXRpb246IGVhY2gKLSAqIHNsb3QncyBv d24geG1pbiBhbmQgY2F0YWxvZ194bWluIGFyZSBpbmRpdmlkdWFsbHkgdmVyaWZpZWQgYWdhaW5z dCB0aGUgR1VDCi0gKiBpbnNpZGUgSXNSZXBsaWNhdGlvblNsb3RYSURBZ2VkKCkuIFRoZSBvbmx5 IGRvd25zaWRlIGlzIGFuIGFkZGl0aW9uYWwKLSAqIGl0ZXJhdGlvbiBvdmVyIGFsbCB0aGUgc2xv dHMuCisgKiBUaGUgb2xkZXN0WG1pbiBpcyBleHBlY3RlZCB0byBiZSBhIFhJRCBjb21wdXRlZCB2 aWEKKyAqIEdldE9sZGVzdE5vblJlbW92YWJsZVRyYW5zYWN0aW9uSWQoKSBkdXJpbmcgdmFjdXVt LiBJdCBpcyB1c2VkIGFzIGN1dG9mZnMKKyAqIGZvciBpbmRpdmlkdWFsIHNsb3QgY2hlY2tzOyBp ZiBpdHMgYWdlIGRvZXMgbm90IGV4Y2VlZCB0aGUgbWF4X3Nsb3RfeGlkX2FnZSwKKyAqIG5vIGlu ZGl2aWR1YWwgc2xvdCBjYW4gZWl0aGVyLCBzbyB3ZSBza2lwIHBlci1zbG90IGludmFsaWRhdGlv biBjaGVjay4KICAqCiAgKiBSZXR1cm5zIHRydWUgaWYgYXQgbGVhc3Qgb25lIHNsb3Qgd2FzIGlu dmFsaWRhdGVkLgogICovCiBib29sCi1JbnZhbGlkYXRlWElEQWdlZFJlcGxpY2F0aW9uU2xvdHMo VHJhbnNhY3Rpb25JZCBvbGRlc3RYbWluLCBUcmFuc2FjdGlvbklkIG5leHRYSUQpCitNYXliZUlu dmFsaWRhdGVYSURBZ2VkU2xvdHMoVHJhbnNhY3Rpb25JZCBvbGRlc3RYbWluKQogewotCVRyYW5z YWN0aW9uSWQgY3V0b2ZmWElEOworCVRyYW5zYWN0aW9uSWQgcmVjZW50WGlkOworCVRyYW5zYWN0 aW9uSWQgeGlkTGltaXQ7CisJVHJhbnNhY3Rpb25JZCBzbG90X3htaW4gPSBJbnZhbGlkVHJhbnNh Y3Rpb25JZDsKKwlUcmFuc2FjdGlvbklkIHNsb3RfY2F0YWxvZ194bWluID0gSW52YWxpZFRyYW5z YWN0aW9uSWQ7CiAJYm9vbAkJaW52YWxpZGF0ZWQgPSBmYWxzZTsKIAotCWlmIChtYXhfc2xvdF94 aWRfYWdlID09IDApCi0JCXJldHVybiBmYWxzZTsKKwlBc3NlcnQoVHJhbnNhY3Rpb25JZElzVmFs aWQob2xkZXN0WG1pbikpOwogCi0JaWYgKCFUcmFuc2FjdGlvbklkSXNOb3JtYWwob2xkZXN0WG1p bikgfHwgIVRyYW5zYWN0aW9uSWRJc05vcm1hbChuZXh0WElEKSkKKwlpZiAobWF4X3Nsb3RfeGlk X2FnZSA9PSAwKQogCQlyZXR1cm4gZmFsc2U7CiAKLQljdXRvZmZYSUQgPSBuZXh0WElEIC0gbWF4 X3Nsb3RfeGlkX2FnZTsKKwlyZWNlbnRYaWQgPSBSZWFkTmV4dFRyYW5zYWN0aW9uSWQoKTsKKwl4 aWRMaW1pdCA9IFRyYW5zYWN0aW9uSWRSZXRyZWF0ZWRCeShyZWNlbnRYaWQsIG1heF9zbG90X3hp ZF9hZ2UpOwogCi0JLyogZW5zdXJlIGl0J3MgYSAibm9ybWFsIiBYSUQsIGVsc2UgVHJhbnNhY3Rp b25JZFByZWNlZGVzIG1pc2JlaGF2ZXMgKi8KLQkvKiB0aGlzIGNhbiBjYXVzZSB0aGUgbGltaXQg dG8gZ28gYmFja3dhcmRzIGJ5IDMsIGJ1dCB0aGF0J3MgT0sgKi8KLQlpZiAoIVRyYW5zYWN0aW9u SWRJc05vcm1hbChjdXRvZmZYSUQpKQotCQljdXRvZmZYSUQgLT0gRmlyc3ROb3JtYWxUcmFuc2Fj dGlvbklkOwotCi0JaWYgKFRyYW5zYWN0aW9uSWRQcmVjZWRlcyhvbGRlc3RYbWluLCBjdXRvZmZY SUQpKQotCXsKLQkJVHJhbnNhY3Rpb25JZCBzbG90X3htaW47Ci0JCVRyYW5zYWN0aW9uSWQgc2xv dF9jYXRhbG9nX3htaW47CisJLyogb2xkZXN0WG1pbiBpcyBub3QgYmVoaW5kIHRoZSBjdXRvZmY7 IG5vIG5lZWQgdG8gY2hlY2sgc2xvdHMgKi8KKwlpZiAoVHJhbnNhY3Rpb25JZFByZWNlZGVzKHhp ZExpbWl0LCBvbGRlc3RYbWluKSkKKwkJcmV0dXJuIGZhbHNlOwogCi0JCVByb2NBcnJheUdldFJl cGxpY2F0aW9uU2xvdFhtaW4oJnNsb3RfeG1pbiwgJnNsb3RfY2F0YWxvZ194bWluKTsKKwlQcm9j QXJyYXlHZXRSZXBsaWNhdGlvblNsb3RYbWluKCZzbG90X3htaW4sICZzbG90X2NhdGFsb2dfeG1p bik7CiAKLQkJaWYgKElzUmVwbGljYXRpb25TbG90WElEQWdlZChzbG90X3htaW4sIHNsb3RfY2F0 YWxvZ194bWluLCBuZXh0WElEKSkKLQkJewotCQkJaW52YWxpZGF0ZWQgPSBJbnZhbGlkYXRlT2Jz b2xldGVSZXBsaWNhdGlvblNsb3RzKFJTX0lOVkFMX1hJRF9BR0UsCi0JCQkJCQkJCQkJCQkJCQkg MCwKLQkJCQkJCQkJCQkJCQkJCSBJbnZhbGlkT2lkLAotCQkJCQkJCQkJCQkJCQkJIEludmFsaWRU cmFuc2FjdGlvbklkLAotCQkJCQkJCQkJCQkJCQkJIG5leHRYSUQpOwotCQl9Ci0JfQorCS8qCisJ ICogSW52YWxpZGF0ZSBwb3NzaWJseSBvYnNvbGV0ZSBzbG90cyBiYXNlZCBvbiBYSUQtYWdlLCBp ZiBlaXRoZXIgc2xvdCdzCisJICogeG1pbiBvciBjYXRhbG9nX3htaW4gaXMgb2xkZXIgdGhhbiB0 aGUgY3V0b2ZmLgorCSAqLworCWlmICgoVHJhbnNhY3Rpb25JZElzVmFsaWQoc2xvdF94bWluKSAm JgorCQkgVHJhbnNhY3Rpb25JZFByZWNlZGVzKHNsb3RfeG1pbiwgeGlkTGltaXQpKSB8fAorCQko VHJhbnNhY3Rpb25JZElzVmFsaWQoc2xvdF9jYXRhbG9nX3htaW4pICYmCisJCSBUcmFuc2FjdGlv bklkUHJlY2VkZXMoc2xvdF9jYXRhbG9nX3htaW4sIHhpZExpbWl0KSkpCisJCWludmFsaWRhdGVk ID0gSW52YWxpZGF0ZU9ic29sZXRlUmVwbGljYXRpb25TbG90cyhSU19JTlZBTF9YSURfQUdFLAor CQkJCQkJCQkJCQkJCQkgMCwKKwkJCQkJCQkJCQkJCQkJIEludmFsaWRPaWQsCisJCQkJCQkJCQkJ CQkJCSBJbnZhbGlkVHJhbnNhY3Rpb25JZCwKKwkJCQkJCQkJCQkJCQkJIHJlY2VudFhpZCk7CiAK IAlyZXR1cm4gaW52YWxpZGF0ZWQ7CiB9CmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS9yZXBsaWNh dGlvbi9zbG90LmggYi9zcmMvaW5jbHVkZS9yZXBsaWNhdGlvbi9zbG90LmgKaW5kZXggODNjZjg0 Mzg3MjQuLmM0ODNmMGY1MzFiIDEwMDY0NAotLS0gYS9zcmMvaW5jbHVkZS9yZXBsaWNhdGlvbi9z bG90LmgKKysrIGIvc3JjL2luY2x1ZGUvcmVwbGljYXRpb24vc2xvdC5oCkBAIC0zNzEsNyArMzcx LDggQEAgZXh0ZXJuIGJvb2wgSW52YWxpZGF0ZU9ic29sZXRlUmVwbGljYXRpb25TbG90cyh1aW50 MzIgcG9zc2libGVfY2F1c2VzLAogCQkJCQkJCQkJCQkgICBYTG9nU2VnTm8gb2xkZXN0U2Vnbm8s CiAJCQkJCQkJCQkJCSAgIE9pZCBkYm9pZCwKIAkJCQkJCQkJCQkJICAgVHJhbnNhY3Rpb25JZCBz bmFwc2hvdENvbmZsaWN0SG9yaXpvbiwKLQkJCQkJCQkJCQkJICAgVHJhbnNhY3Rpb25JZCBuZXh0 WElEKTsKKwkJCQkJCQkJCQkJICAgVHJhbnNhY3Rpb25JZCByZWNlbnRYaWQpOworZXh0ZXJuIGJv b2wgTWF5YmVJbnZhbGlkYXRlWElEQWdlZFNsb3RzKFRyYW5zYWN0aW9uSWQgb2xkZXN0WG1pbik7 CiBleHRlcm4gUmVwbGljYXRpb25TbG90ICpTZWFyY2hOYW1lZFJlcGxpY2F0aW9uU2xvdChjb25z dCBjaGFyICpuYW1lLCBib29sIG5lZWRfbG9jayk7CiBleHRlcm4gaW50CVJlcGxpY2F0aW9uU2xv dEluZGV4KFJlcGxpY2F0aW9uU2xvdCAqc2xvdCk7CiBleHRlcm4gYm9vbCBSZXBsaWNhdGlvblNs b3ROYW1lKGludCBpbmRleCwgTmFtZSBuYW1lKTsKQEAgLTM5MSw2ICszOTIsNCBAQCBleHRlcm4g Ym9vbCBTbG90RXhpc3RzSW5TeW5jU3RhbmRieVNsb3RzKGNvbnN0IGNoYXIgKnNsb3RfbmFtZSk7 CiBleHRlcm4gYm9vbCBTdGFuZGJ5U2xvdHNIYXZlQ2F1Z2h0dXAoWExvZ1JlY1B0ciB3YWl0X2Zv cl9sc24sIGludCBlbGV2ZWwpOwogZXh0ZXJuIHZvaWQgV2FpdEZvclN0YW5kYnlDb25maXJtYXRp b24oWExvZ1JlY1B0ciB3YWl0X2Zvcl9sc24pOwogCi1leHRlcm4gYm9vbCBJbnZhbGlkYXRlWElE QWdlZFJlcGxpY2F0aW9uU2xvdHMoVHJhbnNhY3Rpb25JZCBvbGRlc3RYbWluLCBUcmFuc2FjdGlv bklkIG5leHRYSUQpOwotCiAjZW5kaWYJCQkJCQkJLyogU0xPVF9IICovCg== --000000000000a29ff8064df45f91--