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 1vUDha-002SHw-2G for pgsql-hackers@arkaria.postgresql.org; Sat, 13 Dec 2025 00:41:39 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1vUDhX-009gWO-1t for pgsql-hackers@arkaria.postgresql.org; Sat, 13 Dec 2025 00:41:36 +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 1vUDhW-009gWG-2r for pgsql-hackers@lists.postgresql.org; Sat, 13 Dec 2025 00:41:36 +0000 Received: from mail-oo1-xc2e.google.com ([2607:f8b0:4864:20::c2e]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.96) (envelope-from ) id 1vUDhW-000OYd-0l for pgsql-hackers@lists.postgresql.org; Sat, 13 Dec 2025 00:41:34 +0000 Received: by mail-oo1-xc2e.google.com with SMTP id 006d021491bc7-6597046fcbdso614805eaf.0 for ; Fri, 12 Dec 2025 16:41:33 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1765586493; x=1766191293; darn=lists.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=pEMWznzEGXsieE0phNo3ZVvR3dDTGfJNL50W3HIqyKk=; b=MkLl5tXkDLzVOLw/tLMQRoUBBUoCFGGNkW1VI8cpAYGxwMEobf1ay+G2o9OhBdI+Dz QNuJaoIbjS03Wrk4Gf0oPbnTpCKRMisLt+YcFeRA0YU4cMSydOHbpm8ad0O97HjNdPur R92gRETTAtP+/Rnpy97zBU9VsinpeAyysNPBaUWQ9BKI7UQ6FKw7xW114zzG7ROE3jyE x/qdBdwKsAmyoDExqLXgM/cleSyFYNgxZ+28FjuOGoMumDUxwR3lZXIdvF5ZMpp6Ejw4 AnTjgBL2zCDjeSePyOtHwDrvSJZNJz9ULYPL/pmazFO8HgnQRkvs7UwT1Qr0Pg5gHJwe BZKg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1765586493; x=1766191293; 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=pEMWznzEGXsieE0phNo3ZVvR3dDTGfJNL50W3HIqyKk=; b=vUqQ2ldtUQ9qql0/UvuL1UFzN5ONhK1v+3vCHiebxeavLBUgezjGIg1lgQIc+22LKF Aszm39o5EKr4aqg+oXspRMdOeVpVXnE1PcNfjZh428wgt7fYVKv0dF1817pqOHl4fSWJ NoWcm7ec+SdZbpMdWbVxmlRZ44mK/m17IH/gkPm8TgbKkXhtTJNtJGa+72/WFFRX+/zJ PraRqy910Nrw9oLK2tsXSyA/rNIbKpIg6fD92smdIgubehX25kTL1AJrsPEznmqIkb4z 6qz+F2NOGCzEC6XcBS5jElgNs8J7Ca4AubGtVZm4cZ2KzyvwFv3i09CC3BvlaFGGmj3r 2SRQ== X-Forwarded-Encrypted: i=1; AJvYcCWIYpTySNLUbEmis+SGBLDffHCKpX/Kwmfr9Pgd5QBiBQH4e1Bc3ueJtyOuD3FAL+EOoQ/C8ITABGN78vH5@lists.postgresql.org X-Gm-Message-State: AOJu0YwhqYcbyijGsVvzBU+5Vf6Rlt5HAhRjUCwbzIlq/+Z9H8+0cc/v uKFnxyHnLDmZtTFK4qAG4BVE3mu6uwQwCXtkuj1aB0Z1UouNPpz2p91xKMCT3yT4e+ZVmTo80NT YVNEXTq8QVX0ROK++Vz7a5ftK5GvqWr8= X-Gm-Gg: AY/fxX67Bvs4Szynls73MDh2h4LsFOBQHQHxC/7WxIMZ0yUrd1Sj4l4mpf15kO7QA+x JD5IwayLpkb+ir2H332uGgZUP2KH5ozxEY12bMeUd0xLeEts18yzC+ENc2RrwhpG4/zXSQFDyg/ Dq7Gj4xoXNSEfS50dVcf9OTgnVDjfDKWAeEEVxXvaSr6PNI1daUtHJD6pJdlpXZBNloXL76YJBh qO0D9GaIsJA428ibfrczzQ+4xAz07NNYKSSSEzN2+tIyc9GbJKvTLk/61BJ6r0rpmJzISA= X-Google-Smtp-Source: AGHT+IFDWuatEj0O/4qFp6xwwflJqDbo90bmqgrN3yKm6rQ/9OQu86bBcM+Yywz/twXmr203BOcoD6CjKYCKrfIKmGc= X-Received: by 2002:a05:6820:169e:b0:65b:3376:a898 with SMTP id 006d021491bc7-65b45151c23mr1903179eaf.12.1765586493186; Fri, 12 Dec 2025 16:41:33 -0800 (PST) MIME-Version: 1.0 References: <9252DA7C-C611-4A93-A484-E6CD42557C15@gmail.com> <4E61FDC4-CFBB-4116-980F-75ADD245A1F6@gmail.com> In-Reply-To: From: Sami Imseih Date: Fri, 12 Dec 2025 18:41:20 -0600 X-Gm-Features: AQt7F2oLBNtnk1RndDG22iHsVzmb0IdMoX--XNNY4IG9Z4_VxfLeTZ5mS87xs2I Message-ID: Subject: Re: [Proposal] Adding callback support for custom statistics kinds To: Michael Paquier Cc: Chao Li , PostgreSQL Hackers Content-Type: multipart/mixed; boundary="000000000000bf402b0645caa35e" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000bf402b0645caa35e Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Thanks for the updates! > - Less fwrite() and fread(), more read_chunk() and write_chunk(). We > are exposing these APIs, let's use them. oops. That totally slipped my mind :( sorry about that. > - The callbacks are renamed, to be more generic: "finish" for the > end-of-operation actions and to/from_serialized_data. At first I wasn=E2=80=99t a fan of the name =E2=80=9Cfinish=E2=80=9D for th= e callback. I was thinking of calling it =E2=80=9Cfinish_auxiliary=E2=80=9D. But, we=E2= =80=99re not forcing callbacks to be used together, and there could perhaps be cases where =E2=80=9Cfinish" can be used on its own, so this is fine by = me. I made some changes as well, in v8: 1/ looks like b4cbc106a6ce snuck into v7. I fixed that. 2/ After looking this over, I realized that =E2=80=9Cextra=E2=80=9D and =E2= =80=9Cauxiliary=E2=80=9D were being used interchangeably. To avoid confusion, I replaced all instances of =E2=80=9Cextra=E2=80=9D with =E2=80=9Cauxiliary" in both the c= omments and macros, i.e. TEST_CUSTOM_AUX_DATA_DESC -- Sami Imseih Amazon Web Services (AWS) --000000000000bf402b0645caa35e Content-Type: application/octet-stream; name="v8-0001-Allow-cumulative-statistics-to-serialize-auxiliar.patch" Content-Disposition: attachment; filename="v8-0001-Allow-cumulative-statistics-to-serialize-auxiliar.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mj3kl1170 RnJvbSAwZDkxNjFhNzNmMzMwZTZmNTQxNTdlYjc1NDhhYTFjYmM0YWRlZDU1IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBNaWNoYWVsIFBhcXVpZXIgPG1pY2hhZWxAcGFxdWllci54eXo+ CkRhdGU6IEZyaSwgMTIgRGVjIDIwMjUgMTg6Mzg6MDUgKzA5MDAKU3ViamVjdDogW1BBVENIIHY4 IDEvMV0gQWxsb3cgY3VtdWxhdGl2ZSBzdGF0aXN0aWNzIHRvIHNlcmlhbGl6ZSBhdXhpbGlhcnkK IGRhdGEgdG8gZGlzay4KCkN1bXVsYXRpdmUgU3RhdGlzdGljcyBraW5kcyBjYW4gbm93IHdyaXRl IGFkZGl0aW9uYWwgcGVyLWVudHJ5IGRhdGEgdG8KdGhlIHN0YXRpc3RpY3MgZmlsZSB0aGF0IGRv ZXNuJ3QgZml0IGluIHNoYXJlZCBtZW1vcnkuIFRoaXMgaXMgdXNlZnVsCmZvciBzdGF0aXN0aWNz IHdpdGggdmFyaWFibGUtbGVuZ3RoIGF1eGlsaWFyeSBkYXRhLgoKVGhyZWUgbmV3IG9wdGlvbmFs IGNhbGxiYWNrcyBhcmUgYWRkZWQgdG8gUGdTdGF0X0tpbmRJbmZvOgoKKiB0b19zZXJpYWxpemVk X2RhdGE6IHdyaXRlcyBhdXhpbGlhcnkgZGF0YSBmb3IgYW4gZW50cnkKKiBmcm9tX3NlcmlhbGl6 ZWRfZGF0YTogcmVhZHMgYXV4aWxpYXJ5IGRhdGEgZm9yIGFuIGVudHJ5CiogZmluaXNoOiBwZXJm b3JtcyBhY3Rpb25zIGFmdGVyIHJlYWQvd3JpdGUvZGlzY2FyZCBvcGVyYXRpb25zLgoKVGhlIGZp bmlzaCBjYWxsYmFjayBpcyBpbnZva2VkIGFmdGVyIHByb2Nlc3NpbmcgYWxsIGVudHJpZXMgb2Yg YSBraW5kLAphbGxvd2luZyBleHRlbnNpb25zIHRvIGNsb3NlIGZpbGUgaGFuZGxlcyBhbmQgY2xl YW4gdXAgcmVzb3VyY2VzLgoKVGVzdHMgYXJlIGFsc28gYWRkZWQgdG8gdGVzdF9jdXN0b21fc3Rh dHMucGwKCkRpc2N1c3Npb246IGh0dHBzOi8vcG9zdGdyLmVzL20vQ0FBNVJaMHM5U0RPdStaNnZl b0pDSFdrK2tEZVRrdEF0Qy1LWTlmUTlaNkJKZERVaXJRQG1haWwuZ21haWwuY29tCi0tLQogc3Jj L2JhY2tlbmQvdXRpbHMvYWN0aXZpdHkvcGdzdGF0LmMgICAgICAgICAgIHwgIDUwICsrLQogc3Jj L2luY2x1ZGUvdXRpbHMvcGdzdGF0X2ludGVybmFsLmggICAgICAgICAgIHwgIDQ3ICsrCiAuLi4v dGVzdF9jdXN0b21fc3RhdHMvdC8wMDFfY3VzdG9tX3N0YXRzLnBsICAgfCAgMzkgKy0KIC4uLi90 ZXN0X2N1c3RvbV92YXJfc3RhdHMtLTEuMC5zcWwgICAgICAgICAgICB8ICAgNyArLQogLi4uL3Rl c3RfY3VzdG9tX3N0YXRzL3Rlc3RfY3VzdG9tX3Zhcl9zdGF0cy5jIHwgNDAxICsrKysrKysrKysr KysrKysrLQogc3JjL3Rvb2xzL3BnaW5kZW50L3R5cGVkZWZzLmxpc3QgICAgICAgICAgICAgIHwg ICAxICsKIDYgZmlsZXMgY2hhbmdlZCwgNTI0IGluc2VydGlvbnMoKyksIDIxIGRlbGV0aW9ucygt KQoKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3V0aWxzL2FjdGl2aXR5L3Bnc3RhdC5jIGIvc3Jj L2JhY2tlbmQvdXRpbHMvYWN0aXZpdHkvcGdzdGF0LmMKaW5kZXggODcxM2M3YTA0ODMuLmM4MDBl MGJkYTQ4IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC91dGlscy9hY3Rpdml0eS9wZ3N0YXQuYwor KysgYi9zcmMvYmFja2VuZC91dGlscy9hY3Rpdml0eS9wZ3N0YXQuYwpAQCAtNTIzLDYgKzUyMyw3 IEBAIHBnc3RhdF9kaXNjYXJkX3N0YXRzKHZvaWQpCiAKIAkvKiBOQjogdGhpcyBuZWVkcyB0byBi ZSBkb25lIGV2ZW4gaW4gc2luZ2xlIHVzZXIgbW9kZSAqLwogCisJLyogRmlyc3QsIGNsZWFudXAg dGhlIG1haW4gc3RhdHMgZmlsZSwgUEdTVEFUX1NUQVRfUEVSTUFORU5UX0ZJTEVOQU1FICovCiAJ cmV0ID0gdW5saW5rKFBHU1RBVF9TVEFUX1BFUk1BTkVOVF9GSUxFTkFNRSk7CiAJaWYgKHJldCAh PSAwKQogCXsKQEAgLTU0NCw2ICs1NDUsMTUgQEAgcGdzdGF0X2Rpc2NhcmRfc3RhdHModm9pZCkK IAkJCQkJCQkJIFBHU1RBVF9TVEFUX1BFUk1BTkVOVF9GSUxFTkFNRSkpKTsKIAl9CiAKKwkvKiBG aW5pc2ggY2FsbGJhY2tzLCBpZiByZXF1aXJlZCAqLworCWZvciAoUGdTdGF0X0tpbmQga2luZCA9 IFBHU1RBVF9LSU5EX01JTjsga2luZCA8PSBQR1NUQVRfS0lORF9NQVg7IGtpbmQrKykKKwl7CisJ CWNvbnN0IFBnU3RhdF9LaW5kSW5mbyAqa2luZF9pbmZvID0gcGdzdGF0X2dldF9raW5kX2luZm8o a2luZCk7CisKKwkJaWYgKGtpbmRfaW5mbyAmJiBraW5kX2luZm8tPmZpbmlzaCkKKwkJCWtpbmRf aW5mby0+ZmluaXNoKFNUQVRTX0RJU0NBUkQpOworCX0KKwogCS8qCiAJICogUmVzZXQgc3RhdHMg Y29udGVudHMuIFRoaXMgd2lsbCBzZXQgcmVzZXQgdGltZXN0YW1wcyBvZiBmaXhlZC1udW1iZXJl ZAogCSAqIHN0YXRzIHRvIHRoZSBjdXJyZW50IHRpbWUgKG5vIHZhcmlhYmxlIHN0YXRzIGV4aXN0 KS4KQEAgLTE3MDIsNiArMTcxMiwxMCBAQCBwZ3N0YXRfd3JpdGVfc3RhdHNmaWxlKHZvaWQpCiAJ CXBnc3RhdF93cml0ZV9jaHVuayhmcG91dCwKIAkJCQkJCSAgIHBnc3RhdF9nZXRfZW50cnlfZGF0 YShwcy0+a2V5LmtpbmQsIHNoc3RhdHMpLAogCQkJCQkJICAgcGdzdGF0X2dldF9lbnRyeV9sZW4o cHMtPmtleS5raW5kKSk7CisKKwkJLyogV3JpdGUgbW9yZSBkYXRhIGZvciB0aGUgZW50cnksIGlm IHJlcXVpcmVkICovCisJCWlmIChraW5kX2luZm8tPnRvX3NlcmlhbGl6ZWRfZGF0YSkKKwkJCWtp bmRfaW5mby0+dG9fc2VyaWFsaXplZF9kYXRhKCZwcy0+a2V5LCBzaHN0YXRzLCBmcG91dCk7CiAJ fQogCWRzaGFzaF9zZXFfdGVybSgmaHN0YXQpOwogCkBAIC0xNzM0LDYgKzE3NDgsMTUgQEAgcGdz dGF0X3dyaXRlX3N0YXRzZmlsZSh2b2lkKQogCQkvKiBkdXJhYmxlX3JlbmFtZSBhbHJlYWR5IGVt aXR0ZWQgbG9nIG1lc3NhZ2UgKi8KIAkJdW5saW5rKHRtcGZpbGUpOwogCX0KKworCS8qIE5vdywg YWxsb3cgc3RhdHMga2luZHMgdG8gZmluYWxpemUgdGhlIGRhdGEgd3JpdGVzICovCisJZm9yIChQ Z1N0YXRfS2luZCBraW5kID0gUEdTVEFUX0tJTkRfTUlOOyBraW5kIDw9IFBHU1RBVF9LSU5EX01B WDsga2luZCsrKQorCXsKKwkJY29uc3QgUGdTdGF0X0tpbmRJbmZvICpraW5kX2luZm8gPSBwZ3N0 YXRfZ2V0X2tpbmRfaW5mbyhraW5kKTsKKworCQlpZiAoa2luZF9pbmZvICYmIGtpbmRfaW5mby0+ ZmluaXNoKQorCQkJa2luZF9pbmZvLT5maW5pc2goU1RBVFNfV1JJVEUpOworCX0KIH0KIAogLyog aGVscGVyIGZvciBwZ3N0YXRfcmVhZF9zdGF0c2ZpbGUoKSAqLwpAQCAtMTg3MSw2ICsxODk0LDcg QEAgcGdzdGF0X3JlYWRfc3RhdHNmaWxlKHZvaWQpCiAJCQkJCVBnU3RhdF9IYXNoS2V5IGtleTsK IAkJCQkJUGdTdGF0U2hhcmVkX0hhc2hFbnRyeSAqcDsKIAkJCQkJUGdTdGF0U2hhcmVkX0NvbW1v biAqaGVhZGVyOworCQkJCQljb25zdCBQZ1N0YXRfS2luZEluZm8gKmtpbmRfaW5mbyA9IE5VTEw7 CiAKIAkJCQkJQ0hFQ0tfRk9SX0lOVEVSUlVQVFMoKTsKIApAQCAtMTg5MSw3ICsxOTE1LDggQEAg cGdzdGF0X3JlYWRfc3RhdHNmaWxlKHZvaWQpCiAJCQkJCQkJZ290byBlcnJvcjsKIAkJCQkJCX0K IAotCQkJCQkJaWYgKCFwZ3N0YXRfZ2V0X2tpbmRfaW5mbyhrZXkua2luZCkpCisJCQkJCQlraW5k X2luZm8gPSBwZ3N0YXRfZ2V0X2tpbmRfaW5mbyhrZXkua2luZCk7CisJCQkJCQlpZiAoIWtpbmRf aW5mbykKIAkJCQkJCXsKIAkJCQkJCQllbG9nKFdBUk5JTkcsICJjb3VsZCBub3QgZmluZCBpbmZv cm1hdGlvbiBvZiBraW5kIGZvciBlbnRyeSAldS8ldS8lIiBQUkl1NjQgIiBvZiB0eXBlICVjIiwK IAkJCQkJCQkJIGtleS5raW5kLCBrZXkuZGJvaWQsCkBAIC0xOTAyLDcgKzE5MjcsNiBAQCBwZ3N0 YXRfcmVhZF9zdGF0c2ZpbGUodm9pZCkKIAkJCQkJZWxzZQogCQkJCQl7CiAJCQkJCQkvKiBzdGF0 cyBlbnRyeSBpZGVudGlmaWVkIGJ5IG5hbWUgb24gZGlzayAoZS5nLiBzbG90cykgKi8KLQkJCQkJ CWNvbnN0IFBnU3RhdF9LaW5kSW5mbyAqa2luZF9pbmZvID0gTlVMTDsKIAkJCQkJCVBnU3RhdF9L aW5kIGtpbmQ7CiAJCQkJCQlOYW1lRGF0YQluYW1lOwogCkBAIC0xOTk2LDYgKzIwMjAsMTggQEAg cGdzdGF0X3JlYWRfc3RhdHNmaWxlKHZvaWQpCiAJCQkJCQlnb3RvIGVycm9yOwogCQkJCQl9CiAK KwkJCQkJLyogcmVhZCBtb3JlIGRhdGEgZm9yIHRoZSBlbnRyeSwgaWYgcmVxdWlyZWQgKi8KKwkJ CQkJaWYgKGtpbmRfaW5mby0+ZnJvbV9zZXJpYWxpemVkX2RhdGEpCisJCQkJCXsKKwkJCQkJCWlm ICgha2luZF9pbmZvLT5mcm9tX3NlcmlhbGl6ZWRfZGF0YSgma2V5LCBoZWFkZXIsIGZwaW4pKQor CQkJCQkJeworCQkJCQkJCWVsb2coV0FSTklORywgImNvdWxkIG5vdCByZWFkIGF1eGlsaWFyeSBk YXRhIGZvciBlbnRyeSAldS8ldS8lIiBQUkl1NjQgIiBvZiB0eXBlICVjIiwKKwkJCQkJCQkJIGtl eS5raW5kLCBrZXkuZGJvaWQsCisJCQkJCQkJCSBrZXkub2JqaWQsIHQpOworCQkJCQkJCWdvdG8g ZXJyb3I7CisJCQkJCQl9CisJCQkJCX0KKwogCQkJCQlicmVhazsKIAkJCQl9CiAJCQljYXNlIFBH U1RBVF9GSUxFX0VOVFJZX0VORDoKQEAgLTIwMTksMTEgKzIwNTUsMjEgQEAgcGdzdGF0X3JlYWRf c3RhdHNmaWxlKHZvaWQpCiAJfQogCiBkb25lOgorCS8qIEZpcnN0LCBjbGVhbnVwIHRoZSBtYWlu IHN0YXRzIGZpbGUsIFBHU1RBVF9TVEFUX1BFUk1BTkVOVF9GSUxFTkFNRSAqLwogCUZyZWVGaWxl KGZwaW4pOwogCiAJZWxvZyhERUJVRzIsICJyZW1vdmluZyBwZXJtYW5lbnQgc3RhdHMgZmlsZSBc IiVzXCIiLCBzdGF0ZmlsZSk7CiAJdW5saW5rKHN0YXRmaWxlKTsKIAorCS8qIExldCBlYWNoIHN0 YXRzIGtpbmQgcnVuIGl0cyBmaW5pc2ggY2FsbGJhY2ssIGlmIHJlcXVpcmVkICovCisJZm9yIChQ Z1N0YXRfS2luZCBraW5kID0gUEdTVEFUX0tJTkRfTUlOOyBraW5kIDw9IFBHU1RBVF9LSU5EX01B WDsga2luZCsrKQorCXsKKwkJY29uc3QgUGdTdGF0X0tpbmRJbmZvICpraW5kX2luZm8gPSBwZ3N0 YXRfZ2V0X2tpbmRfaW5mbyhraW5kKTsKKworCQlpZiAoa2luZF9pbmZvICYmIGtpbmRfaW5mby0+ ZmluaXNoKQorCQkJa2luZF9pbmZvLT5maW5pc2goU1RBVFNfUkVBRCk7CisJfQorCiAJcmV0dXJu OwogCiBlcnJvcjoKZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL3V0aWxzL3Bnc3RhdF9pbnRlcm5h bC5oIGIvc3JjL2luY2x1ZGUvdXRpbHMvcGdzdGF0X2ludGVybmFsLmgKaW5kZXggY2ExYmE2NDIw Y2EuLjlmZjFiYzNmNGZmIDEwMDY0NAotLS0gYS9zcmMvaW5jbHVkZS91dGlscy9wZ3N0YXRfaW50 ZXJuYWwuaAorKysgYi9zcmMvaW5jbHVkZS91dGlscy9wZ3N0YXRfaW50ZXJuYWwuaApAQCAtNjMs NiArNjMsMjEgQEAgdHlwZWRlZiBzdHJ1Y3QgUGdTdGF0X0hhc2hLZXkKIAkJCQkJCQkJICogaWRl bnRpZmllci4gKi8KIH0gUGdTdGF0X0hhc2hLZXk7CiAKKy8qCisgKiBUcmFja3MgaWYgdGhlIHN0 YXRzIGZpbGUgaXMgYmVpbmcgcmVhZCwgd3JpdHRlbiBvciBkaXNjYXJkZWQsIHVzZWQgaW4KKyAq IGNvbWJpbmF0aW9uIHdpdGggdGhlIGZpbmlzaCBjYWxsYmFjay4KKyAqCisgKiBUaGVzZSBzdGF0 ZXMgYWxsb3cgcGx1Z2lucyB0aGF0IGNyZWF0ZSBhdXhpbGlhcnkgZGF0YSBmaWxlcworICogdG8g ZGV0ZXJtaW5lIHRoZSBjdXJyZW50IG9wZXJhdGlvbiBhbmQgcGVyZm9ybSBhbnkgbmVjZXNzYXJ5 CisgKiBmaWxlIGNsZWFudXAuCisgKi8KK3R5cGVkZWYgZW51bSBQZ1N0YXRfU3RhdHNGaWxlT3AK K3sKKwlTVEFUU19XUklURSwKKwlTVEFUU19SRUFELAorCVNUQVRTX0RJU0NBUkQsCit9IFBnU3Rh dF9TdGF0c0ZpbGVPcDsKKwogLyoKICAqIFBnU3RhdF9IYXNoS2V5IHNob3VsZCBub3QgaGF2ZSBh bnkgcGFkZGluZy4gIENoZWNraW5nIHRoYXQgdGhlIHN0cnVjdHVyZQogICogc2l6ZSBtYXRjaGVz IHdpdGggdGhlIHN1bSBvZiBlYWNoIGZpZWxkIGlzIGEgY2hlY2sgc2ltcGxlIGVub3VnaCB0bwpA QCAtMzAzLDYgKzMxOCwzOCBAQCB0eXBlZGVmIHN0cnVjdCBQZ1N0YXRfS2luZEluZm8KIAkJCQkJ CQkJCSAgIGNvbnN0IFBnU3RhdFNoYXJlZF9Db21tb24gKmhlYWRlciwgTmFtZURhdGEgKm5hbWUp OwogCWJvb2wJCSgqZnJvbV9zZXJpYWxpemVkX25hbWUpIChjb25zdCBOYW1lRGF0YSAqbmFtZSwg UGdTdGF0X0hhc2hLZXkgKmtleSk7CiAKKwkvKgorCSAqIEZvciB2YXJpYWJsZS1udW1iZXJlZCBz dGF0czogcmVhZCBvciB3cml0ZSBhZGRpdGlvbmFsIGRhdGEgcmVsYXRlZCB0byBhCisJICogZ2l2 ZW4gZW50cnksIGluIHRoZSBzdGF0cyBmaWxlIG9yIG9wdGlvbmFsbHkgaW4gYSBkaWZmZXJlbnQg ZmlsZS4KKwkgKiBPcHRpb25hbC4KKwkgKgorCSAqIHRvX3NlcmlhbGl6ZWRfZGF0YTogd3JpdGUg YXV4aWxpYXJ5IGRhdGEgZm9yIGFuIGVudHJ5LgorCSAqCisJICogZnJvbV9zZXJpYWxpemVkX2Rh dGE6IHJlYWQgYXV4aWxpYXJ5IGRhdGEgZm9yIGFuIGVudHJ5LiAgUmV0dXJucyB0cnVlCisJICog b24gc3VjY2VzcywgZmFsc2Ugb24gcmVhZCBlcnJvci4KKwkgKgorCSAqICJzdGF0ZmlsZSIgaXMg YSBwb2ludGVyIHRvIHRoZSBvbi1kaXNrIHN0YXRzIGZpbGUsIG5hbWVkCisJICogUEdTVEFUX1NU QVRfUEVSTUFORU5UX0ZJTEVOQU1FLiAgImtleSIgaXMgdGhlIGhhc2gga2V5IG9mIHRoZSBlbnRy eQorCSAqIGp1c3Qgd3JpdHRlbiBvciByZWFkLiAgImhlYWRlciIgaXMgYSBwb2ludGVyIHRvIHRo ZSBzdGF0cyBkYXRhLgorCSAqLworCXZvaWQJCSgqdG9fc2VyaWFsaXplZF9kYXRhKSAoY29uc3Qg UGdTdGF0X0hhc2hLZXkgKmtleSwKKwkJCQkJCQkJCSAgIGNvbnN0IFBnU3RhdFNoYXJlZF9Db21t b24gKmhlYWRlciwKKwkJCQkJCQkJCSAgIEZJTEUgKnN0YXRmaWxlKTsKKwlib29sCQkoKmZyb21f c2VyaWFsaXplZF9kYXRhKSAoY29uc3QgUGdTdGF0X0hhc2hLZXkgKmtleSwKKwkJCQkJCQkJCQkg Y29uc3QgUGdTdGF0U2hhcmVkX0NvbW1vbiAqaGVhZGVyLAorCQkJCQkJCQkJCSBGSUxFICpzdGF0 ZmlsZSk7CisKKwkvKgorCSAqIEZvciBmaXhlZC1udW1iZXJlZCBvciB2YXJpYWJsZS1udW1iZXJl ZCBzdGF0aXN0aWNzLgorCSAqCisJICogUGVyZm9ybSBjdXN0b20gYWN0aW9ucyB3aGVuIGRvbmUg cHJvY2Vzc2luZyB0aGUgb24tZGlzayBzdGF0cyBmaWxlCisJICogYWZ0ZXIgYWxsIHRoZSBzdGF0 cyBlbnRyaWVzIGhhdmUgYmVlbiBwcm9jZXNzZWQuICBPcHRpb25hbC4KKwkgKgorCSAqICJzdGF0 dXMiIHRyYWNrcyB0aGUgb3BlcmF0aW9uIGRvbmUgZm9yIHRoZSBvbi1kaXNrIHN0YXRzIGZpbGUg KHJlYWQsCisJICogd3JpdGUsIGRpc2NhcmQpLgorCSAqLworCXZvaWQJCSgqZmluaXNoKSAoUGdT dGF0X1N0YXRzRmlsZU9wIHN0YXR1cyk7CisKIAkvKgogCSAqIEZvciBmaXhlZC1udW1iZXJlZCBz dGF0aXN0aWNzOiBJbml0aWFsaXplIHNoYXJlZCBtZW1vcnkgc3RhdGUuCiAJICoKZGlmZiAtLWdp dCBhL3NyYy90ZXN0L21vZHVsZXMvdGVzdF9jdXN0b21fc3RhdHMvdC8wMDFfY3VzdG9tX3N0YXRz LnBsIGIvc3JjL3Rlc3QvbW9kdWxlcy90ZXN0X2N1c3RvbV9zdGF0cy90LzAwMV9jdXN0b21fc3Rh dHMucGwKaW5kZXggZTUyODU5NWNmYjAuLjM3OGVjMjJiYmRmIDEwMDY0NAotLS0gYS9zcmMvdGVz dC9tb2R1bGVzL3Rlc3RfY3VzdG9tX3N0YXRzL3QvMDAxX2N1c3RvbV9zdGF0cy5wbAorKysgYi9z cmMvdGVzdC9tb2R1bGVzL3Rlc3RfY3VzdG9tX3N0YXRzL3QvMDAxX2N1c3RvbV9zdGF0cy5wbApA QCAtMjksMTMgKzI5LDEzIEBAICRub2RlLT5zYWZlX3BzcWwoJ3Bvc3RncmVzJywgcShDUkVBVEUg RVhURU5TSU9OIHRlc3RfY3VzdG9tX2ZpeGVkX3N0YXRzKSk7CiAKICMgQ3JlYXRlIGVudHJpZXMg Zm9yIHZhcmlhYmxlLXNpemVkIHN0YXRzLgogJG5vZGUtPnNhZmVfcHNxbCgncG9zdGdyZXMnLAot CXEoc2VsZWN0IHRlc3RfY3VzdG9tX3N0YXRzX3Zhcl9jcmVhdGUoJ2VudHJ5MScpKSk7CisJcShz ZWxlY3QgdGVzdF9jdXN0b21fc3RhdHNfdmFyX2NyZWF0ZSgnZW50cnkxJywgJ1Rlc3QgZW50cnkg MScpKSk7CiAkbm9kZS0+c2FmZV9wc3FsKCdwb3N0Z3JlcycsCi0JcShzZWxlY3QgdGVzdF9jdXN0 b21fc3RhdHNfdmFyX2NyZWF0ZSgnZW50cnkyJykpKTsKKwlxKHNlbGVjdCB0ZXN0X2N1c3RvbV9z dGF0c192YXJfY3JlYXRlKCdlbnRyeTInLCAnVGVzdCBlbnRyeSAyJykpKTsKICRub2RlLT5zYWZl X3BzcWwoJ3Bvc3RncmVzJywKLQlxKHNlbGVjdCB0ZXN0X2N1c3RvbV9zdGF0c192YXJfY3JlYXRl KCdlbnRyeTMnKSkpOworCXEoc2VsZWN0IHRlc3RfY3VzdG9tX3N0YXRzX3Zhcl9jcmVhdGUoJ2Vu dHJ5MycsICdUZXN0IGVudHJ5IDMnKSkpOwogJG5vZGUtPnNhZmVfcHNxbCgncG9zdGdyZXMnLAot CXEoc2VsZWN0IHRlc3RfY3VzdG9tX3N0YXRzX3Zhcl9jcmVhdGUoJ2VudHJ5NCcpKSk7CisJcShz ZWxlY3QgdGVzdF9jdXN0b21fc3RhdHNfdmFyX2NyZWF0ZSgnZW50cnk0JywgJ1Rlc3QgZW50cnkg NCcpKSk7CiAKICMgVXBkYXRlIGNvdW50ZXJzOiBlbnRyeTE9MiwgZW50cnkyPTMsIGVudHJ5Mz0y LCBlbnRyeTQ9MywgZml4ZWQ9MwogJG5vZGUtPnNhZmVfcHNxbCgncG9zdGdyZXMnLApAQCAtNjUs MTYgKzY1LDI4IEBAICRub2RlLT5zYWZlX3BzcWwoJ3Bvc3RncmVzJywgcShzZWxlY3QgdGVzdF9j dXN0b21fc3RhdHNfZml4ZWRfdXBkYXRlKCkpKTsKICMgVGVzdCBkYXRhIHJlcG9ydHMuCiBteSAk cmVzdWx0ID0gJG5vZGUtPnNhZmVfcHNxbCgncG9zdGdyZXMnLAogCXEoc2VsZWN0ICogZnJvbSB0 ZXN0X2N1c3RvbV9zdGF0c192YXJfcmVwb3J0KCdlbnRyeTEnKSkpOwotaXMoJHJlc3VsdCwgImVu dHJ5MXwyIiwgInJlcG9ydCBmb3IgdmFyaWFibGUtc2l6ZWQgZGF0YSBvZiBlbnRyeTEiKTsKK2lz KCAkcmVzdWx0LAorCSJlbnRyeTF8MnxUZXN0IGVudHJ5IDEiLAorCSJyZXBvcnQgZm9yIHZhcmlh YmxlLXNpemVkIGRhdGEgb2YgZW50cnkxIik7CisKICRyZXN1bHQgPSAkbm9kZS0+c2FmZV9wc3Fs KCdwb3N0Z3JlcycsCiAJcShzZWxlY3QgKiBmcm9tIHRlc3RfY3VzdG9tX3N0YXRzX3Zhcl9yZXBv cnQoJ2VudHJ5MicpKSk7Ci1pcygkcmVzdWx0LCAiZW50cnkyfDMiLCAicmVwb3J0IGZvciB2YXJp YWJsZS1zaXplZCBkYXRhIG9mIGVudHJ5MiIpOworaXMoICRyZXN1bHQsCisJImVudHJ5MnwzfFRl c3QgZW50cnkgMiIsCisJInJlcG9ydCBmb3IgdmFyaWFibGUtc2l6ZWQgZGF0YSBvZiBlbnRyeTIi KTsKKwogJHJlc3VsdCA9ICRub2RlLT5zYWZlX3BzcWwoJ3Bvc3RncmVzJywKIAlxKHNlbGVjdCAq IGZyb20gdGVzdF9jdXN0b21fc3RhdHNfdmFyX3JlcG9ydCgnZW50cnkzJykpKTsKLWlzKCRyZXN1 bHQsICJlbnRyeTN8MiIsICJyZXBvcnQgZm9yIHZhcmlhYmxlLXNpemVkIGRhdGEgb2YgZW50cnkz Iik7CitpcyggJHJlc3VsdCwKKwkiZW50cnkzfDJ8VGVzdCBlbnRyeSAzIiwKKwkicmVwb3J0IGZv ciB2YXJpYWJsZS1zaXplZCBkYXRhIG9mIGVudHJ5MyIpOworCiAkcmVzdWx0ID0gJG5vZGUtPnNh ZmVfcHNxbCgncG9zdGdyZXMnLAogCXEoc2VsZWN0ICogZnJvbSB0ZXN0X2N1c3RvbV9zdGF0c192 YXJfcmVwb3J0KCdlbnRyeTQnKSkpOwotaXMoJHJlc3VsdCwgImVudHJ5NHwzIiwgInJlcG9ydCBm b3IgdmFyaWFibGUtc2l6ZWQgZGF0YSBvZiBlbnRyeTQiKTsKK2lzKCAkcmVzdWx0LAorCSJlbnRy eTR8M3xUZXN0IGVudHJ5IDQiLAorCSJyZXBvcnQgZm9yIHZhcmlhYmxlLXNpemVkIGRhdGEgb2Yg ZW50cnk0Iik7CisKICRyZXN1bHQgPSAkbm9kZS0+c2FmZV9wc3FsKCdwb3N0Z3JlcycsCiAJcShz ZWxlY3QgKiBmcm9tIHRlc3RfY3VzdG9tX3N0YXRzX2ZpeGVkX3JlcG9ydCgpKSk7CiBpcygkcmVz dWx0LCAiM3wiLCAicmVwb3J0IGZvciBmaXhlZC1zaXplZCBzdGF0cyIpOwpAQCAtOTcsNyArMTA5 LDE2IEBAICRub2RlLT5zdGFydCgpOwogCiAkcmVzdWx0ID0gJG5vZGUtPnNhZmVfcHNxbCgncG9z dGdyZXMnLAogCXEoc2VsZWN0ICogZnJvbSB0ZXN0X2N1c3RvbV9zdGF0c192YXJfcmVwb3J0KCdl bnRyeTEnKSkpOwotaXMoJHJlc3VsdCwgImVudHJ5MXwyIiwgInZhcmlhYmxlLXNpemVkIHN0YXRz IHBlcnNpc3QgYWZ0ZXIgY2xlYW4gcmVzdGFydCIpOworaXMoICRyZXN1bHQsCisJImVudHJ5MXwy fFRlc3QgZW50cnkgMSIsCisJInZhcmlhYmxlLXNpemVkIHN0YXRzIHBlcnNpc3QgYWZ0ZXIgY2xl YW4gcmVzdGFydCIpOworCiskcmVzdWx0ID0gJG5vZGUtPnNhZmVfcHNxbCgncG9zdGdyZXMnLAor CXEoc2VsZWN0ICogZnJvbSB0ZXN0X2N1c3RvbV9zdGF0c192YXJfcmVwb3J0KCdlbnRyeTInKSkp OworaXMoICRyZXN1bHQsCisJImVudHJ5MnwzfFRlc3QgZW50cnkgMiIsCisJInZhcmlhYmxlLXNp emVkIHN0YXRzIHBlcnNpc3QgYWZ0ZXIgY2xlYW4gcmVzdGFydCIpOworCiAkcmVzdWx0ID0gJG5v ZGUtPnNhZmVfcHNxbCgncG9zdGdyZXMnLAogCXEoc2VsZWN0ICogZnJvbSB0ZXN0X2N1c3RvbV9z dGF0c19maXhlZF9yZXBvcnQoKSkpOwogaXMoJHJlc3VsdCwgIjN8IiwgImZpeGVkLXNpemVkIHN0 YXRzIHBlcnNpc3QgYWZ0ZXIgY2xlYW4gcmVzdGFydCIpOwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3Qv bW9kdWxlcy90ZXN0X2N1c3RvbV9zdGF0cy90ZXN0X2N1c3RvbV92YXJfc3RhdHMtLTEuMC5zcWwg Yi9zcmMvdGVzdC9tb2R1bGVzL3Rlc3RfY3VzdG9tX3N0YXRzL3Rlc3RfY3VzdG9tX3Zhcl9zdGF0 cy0tMS4wLnNxbAppbmRleCBkNWY4MmI1ZDU0Ni4uNWVkOGNmYzJkY2YgMTAwNjQ0Ci0tLSBhL3Ny Yy90ZXN0L21vZHVsZXMvdGVzdF9jdXN0b21fc3RhdHMvdGVzdF9jdXN0b21fdmFyX3N0YXRzLS0x LjAuc3FsCisrKyBiL3NyYy90ZXN0L21vZHVsZXMvdGVzdF9jdXN0b21fc3RhdHMvdGVzdF9jdXN0 b21fdmFyX3N0YXRzLS0xLjAuc3FsCkBAIC0zLDcgKzMsNyBAQAogLS0gY29tcGxhaW4gaWYgc2Ny aXB0IGlzIHNvdXJjZWQgaW4gcHNxbCwgcmF0aGVyIHRoYW4gdmlhIENSRUFURSBFWFRFTlNJT04K IFxlY2hvIFVzZSAiQ1JFQVRFIEVYVEVOU0lPTiB0ZXN0X2N1c3RvbV92YXJfc3RhdHMiIHRvIGxv YWQgdGhpcyBmaWxlLiBccXVpdAogCi1DUkVBVEUgRlVOQ1RJT04gdGVzdF9jdXN0b21fc3RhdHNf dmFyX2NyZWF0ZShJTiBuYW1lIFRFWFQpCitDUkVBVEUgRlVOQ1RJT04gdGVzdF9jdXN0b21fc3Rh dHNfdmFyX2NyZWF0ZShJTiBuYW1lIFRFWFQsIGluIGRlc2NyaXB0aW9uIFRFWFQpCiBSRVRVUk5T IHZvaWQKIEFTICdNT0RVTEVfUEFUSE5BTUUnLCAndGVzdF9jdXN0b21fc3RhdHNfdmFyX2NyZWF0 ZScKIExBTkdVQUdFIEMgU1RSSUNUIFBBUkFMTEVMIFVOU0FGRTsKQEAgLTE4LDggKzE4LDkgQEAg UkVUVVJOUyB2b2lkCiBBUyAnTU9EVUxFX1BBVEhOQU1FJywgJ3Rlc3RfY3VzdG9tX3N0YXRzX3Zh cl9kcm9wJwogTEFOR1VBR0UgQyBTVFJJQ1QgUEFSQUxMRUwgVU5TQUZFOwogCi0KLUNSRUFURSBG VU5DVElPTiB0ZXN0X2N1c3RvbV9zdGF0c192YXJfcmVwb3J0KElOT1VUIG5hbWUgVEVYVCwgT1VU IGNhbGxzIEJJR0lOVCkKK0NSRUFURSBGVU5DVElPTiB0ZXN0X2N1c3RvbV9zdGF0c192YXJfcmVw b3J0KElOT1VUIG5hbWUgVEVYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIE9VVCBjYWxscyBCSUdJTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBPVVQgZGVzY3JpcHRpb24gVEVYVCkKIFJFVFVSTlMgU0VUT0YgcmVj b3JkCiBBUyAnTU9EVUxFX1BBVEhOQU1FJywgJ3Rlc3RfY3VzdG9tX3N0YXRzX3Zhcl9yZXBvcnQn CiBMQU5HVUFHRSBDIFNUUklDVCBQQVJBTExFTCBVTlNBRkU7CmRpZmYgLS1naXQgYS9zcmMvdGVz dC9tb2R1bGVzL3Rlc3RfY3VzdG9tX3N0YXRzL3Rlc3RfY3VzdG9tX3Zhcl9zdGF0cy5jIGIvc3Jj L3Rlc3QvbW9kdWxlcy90ZXN0X2N1c3RvbV9zdGF0cy90ZXN0X2N1c3RvbV92YXJfc3RhdHMuYwpp bmRleCBkNDkwNWFiNGVlOS4uN2JmZTNmZjFjYmQgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L21vZHVs ZXMvdGVzdF9jdXN0b21fc3RhdHMvdGVzdF9jdXN0b21fdmFyX3N0YXRzLmMKKysrIGIvc3JjL3Rl c3QvbW9kdWxlcy90ZXN0X2N1c3RvbV9zdGF0cy90ZXN0X2N1c3RvbV92YXJfc3RhdHMuYwpAQCAt MTQsNiArMTQsNyBAQAogCiAjaW5jbHVkZSAiY29tbW9uL2hhc2hmbi5oIgogI2luY2x1ZGUgImZ1 bmNhcGkuaCIKKyNpbmNsdWRlICJzdG9yYWdlL2RzbV9yZWdpc3RyeS5oIgogI2luY2x1ZGUgInV0 aWxzL2J1aWx0aW5zLmgiCiAjaW5jbHVkZSAidXRpbHMvcGdzdGF0X2ludGVybmFsLmgiCiAKQEAg LTIyLDYgKzIzLDggQEAgUEdfTU9EVUxFX01BR0lDX0VYVCgKIAkJCQkJLnZlcnNpb24gPSBQR19W RVJTSU9OCiApOwogCisjZGVmaW5lIFRFU1RfQ1VTVE9NX1ZBUl9NQUdJQ19OVU1CRVIgKDB4QkVF RkJFRUYpCisKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIE1hY3JvcyBhbmQgY29uc3RhbnRzCiAg Ki0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0zMiw2ICszNSw5IEBAIFBHX01PRFVMRV9NQUdJQ19FWFQo CiAgKi8KICNkZWZpbmUgUEdTVEFUX0tJTkRfVEVTVF9DVVNUT01fVkFSX1NUQVRTIDI1CiAKKy8q IEZpbGUgcGF0aHMgZm9yIGF1eGlsaWFyeSBkYXRhIHNlcmlhbGl6YXRpb24gKi8KKyNkZWZpbmUg VEVTVF9DVVNUT01fQVVYX0RBVEFfREVTQyAicGdfc3RhdC90ZXN0X2N1c3RvbV92YXJfc3RhdHNf ZGVzYy5zdGF0cyIKKwogLyoKICAqIEhhc2ggc3RhdGlzdGljIG5hbWUgdG8gZ2VuZXJhdGUgZW50 cnkgaW5kZXggZm9yIHBnc3RhdCBsb29rdXAuCiAgKi8KQEAgLTUzLDggKzU5LDIzIEBAIHR5cGVk ZWYgc3RydWN0IFBnU3RhdFNoYXJlZF9DdXN0b21WYXJFbnRyeQogewogCVBnU3RhdFNoYXJlZF9D b21tb24gaGVhZGVyOyAvKiBzdGFuZGFyZCBwZ3N0YXQgZW50cnkgaGVhZGVyICovCiAJUGdTdGF0 X1N0YXRDdXN0b21WYXJFbnRyeSBzdGF0czsJLyogY3VzdG9tIHN0YXRpc3RpY3MgZGF0YSAqLwor CWRzYV9wb2ludGVyIGRlc2NyaXB0aW9uOwkvKiBwb2ludGVyIHRvIGRlc2NyaXB0aW9uIHN0cmlu ZyBpbiBEU0EgKi8KIH0gUGdTdGF0U2hhcmVkX0N1c3RvbVZhckVudHJ5OwogCisvKi0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tCisgKiBHbG9iYWwgVmFyaWFibGVzCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8K KworLyogRmlsZSBoYW5kbGUgZm9yIGF1eGlsaWFyeSBkYXRhIHNlcmlhbGl6YXRpb24gKi8KK3N0 YXRpYyBGSUxFICpmZF9kZXNjcmlwdGlvbiA9IE5VTEw7CisKKy8qIEN1cnJlbnQgd3JpdGUgb2Zm c2V0IGluIGZkX2Rlc2NyaXB0aW9uIGZpbGUgKi8KK3N0YXRpYyBsb25nIGZkX2Rlc2NyaXB0aW9u X29mZnNldCA9IDA7CisKKy8qIERTQSBhcmVhIGZvciBzdG9yaW5nIHZhcmlhYmxlLWxlbmd0aCBk ZXNjcmlwdGlvbiBzdHJpbmdzICovCitzdGF0aWMgZHNhX2FyZWEgKmN1c3RvbV9zdGF0c19kZXNj cmlwdGlvbl9kc2EgPSBOVUxMOworCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBGdW5jdGlvbiBw cm90b3R5cGVzCiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC02NCw2ICs4NSwxOSBAQCB0eXBlZGVm IHN0cnVjdCBQZ1N0YXRTaGFyZWRfQ3VzdG9tVmFyRW50cnkKIHN0YXRpYyBib29sIHRlc3RfY3Vz dG9tX3N0YXRzX3Zhcl9mbHVzaF9wZW5kaW5nX2NiKFBnU3RhdF9FbnRyeVJlZiAqZW50cnlfcmVm LAogCQkJCQkJCQkJCQkJICAgYm9vbCBub3dhaXQpOwogCisvKiBTZXJpYWxpemF0aW9uIGNhbGxi YWNrOiBzZXJpYWxpemUgYXV4aWxpYXJ5IGVudHJ5IGRhdGEgKi8KK3N0YXRpYyB2b2lkIHRlc3Rf Y3VzdG9tX3N0YXRzX3Zhcl90b19zZXJpYWxpemVkX2RhdGEoY29uc3QgUGdTdGF0X0hhc2hLZXkg KmtleSwKKwkJCQkJCQkJCQkJCQkgY29uc3QgUGdTdGF0U2hhcmVkX0NvbW1vbiAqaGVhZGVyLAor CQkJCQkJCQkJCQkJCSBGSUxFICpzdGF0ZmlsZSk7CisKKy8qIERlc2VyaWFsaXphdGlvbiBjYWxs YmFjazogZGVzZXJpYWxpemUgYXV4aWxpYXJ5IGVudHJ5IGRhdGEgKi8KK3N0YXRpYyBib29sIHRl c3RfY3VzdG9tX3N0YXRzX3Zhcl9mcm9tX3NlcmlhbGl6ZWRfZGF0YShjb25zdCBQZ1N0YXRfSGFz aEtleSAqa2V5LAorCQkJCQkJCQkJCQkJCSAgIGNvbnN0IFBnU3RhdFNoYXJlZF9Db21tb24gKmhl YWRlciwKKwkJCQkJCQkJCQkJCQkgICBGSUxFICpzdGF0ZmlsZSk7CisKKy8qIENsZWFudXAgY2Fs bGJhY2s6IGVuZCBvZiBzdGF0aXN0aWNzIGZpbGUgb3BlcmF0aW9ucyAqLworc3RhdGljIHZvaWQg dGVzdF9jdXN0b21fc3RhdHNfdmFyX2ZpbmlzaChQZ1N0YXRfU3RhdHNGaWxlT3Agc3RhdHVzKTsK KwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogQ3VzdG9tIGtpbmQgY29uZmlndXJhdGlvbgogICot LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLQpAQCAtODAsNiArMTE0LDkgQEAgc3RhdGljIGNvbnN0IFBnU3RhdF9L aW5kSW5mbyBjdXN0b21fc3RhdHMgPSB7CiAJLnNoYXJlZF9kYXRhX2xlbiA9IHNpemVvZigoKFBn U3RhdFNoYXJlZF9DdXN0b21WYXJFbnRyeSAqKSAwKS0+c3RhdHMpLAogCS5wZW5kaW5nX3NpemUg PSBzaXplb2YoUGdTdGF0X1N0YXRDdXN0b21WYXJFbnRyeSksCiAJLmZsdXNoX3BlbmRpbmdfY2Ig PSB0ZXN0X2N1c3RvbV9zdGF0c192YXJfZmx1c2hfcGVuZGluZ19jYiwKKwkudG9fc2VyaWFsaXpl ZF9kYXRhID0gdGVzdF9jdXN0b21fc3RhdHNfdmFyX3RvX3NlcmlhbGl6ZWRfZGF0YSwKKwkuZnJv bV9zZXJpYWxpemVkX2RhdGEgPSB0ZXN0X2N1c3RvbV9zdGF0c192YXJfZnJvbV9zZXJpYWxpemVk X2RhdGEsCisJLmZpbmlzaCA9IHRlc3RfY3VzdG9tX3N0YXRzX3Zhcl9maW5pc2gsCiB9OwogCiAv Ki0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0xMzIsNiArMTY5LDMxMCBAQCB0ZXN0X2N1c3RvbV9zdGF0 c192YXJfZmx1c2hfcGVuZGluZ19jYihQZ1N0YXRfRW50cnlSZWYgKmVudHJ5X3JlZiwgYm9vbCBu b3dhaXQpCiAJcmV0dXJuIHRydWU7CiB9CiAKKy8qCisgKiB0ZXN0X2N1c3RvbV9zdGF0c192YXJf dG9fc2VyaWFsaXplZF9kYXRhKCkgLQorICoKKyAqIFNlcmlhbGl6ZSBhdXhpbGlhcnkgZGF0YSAo ZGVzY3JpcHRpb25zKSBmb3IgY3VzdG9tIHN0YXRpc3RpY3MgZW50cmllcworICogdG8gYSBzZWNv bmRhcnkgc3RhdGlzdGljcyBmaWxlLiBUaGlzIGlzIGNhbGxlZCB3aGlsZSB3cml0aW5nIHRoZSBz dGF0aXN0aWNzCisgKiB0byBkaXNrLgorICoKKyAqIFRoaXMgY2FsbGJhY2sgd3JpdGVzIGEgbWl4 IG9mIGRhdGEgd2l0aGluIHRoZSBtYWluIHBnc3RhdHMgZmlsZSBhbmQgYQorICogc2Vjb25kYXJ5 IHN0YXRpc3RpY3MgZmlsZS4gIFRoZSBmb2xsb3dpbmcgZGF0YSBpcyB3cml0dGVuIHRvIHRoZSBt YWluIGZpbGUgZm9yCisgKiBlYWNoIGVudHJ5OgorICogLSBBbiBhcmJpdHJhcnkgbWFnaWMgbnVt YmVyLgorICogLSBBbiBvZmZzZXQuICBUaGlzIGlzIHVzZWQgdG8ga25vdyB0aGUgbG9jYXRpb24g d2UgbmVlZCB0byBsb29rIGF0CisgKiB0byByZXRyaWV2ZSB0aGUgaW5mb3JtYXRpb24gZnJvbSB0 aGUgc2Vjb25kIGZpbGUuCisgKgorICogVGhlIGZvbGxvd2luZyBkYXRhIGlzIHdyaXR0ZW4gdG8g dGhlIHNlY29uZGFyeSBzdGF0aXN0aWNzIGZpbGU6CisgKiAtIFRoZSBlbnRyeSBrZXksIGNyb3Nz LWNoZWNrZWQgd2l0aCB0aGUgZGF0YSBmcm9tIHRoZSBtYWluIGZpbGUKKyAqIHdoZW4gcmVsb2Fk ZWQuCisgKiAtIFRoZSBsZW5ndGggb2YgdGhlIGRlc2NyaXB0aW9uLgorICogLSBUaGUgZGVzY3Jp cHRpb24gZGF0YSBpdHNlbGYuCisgKi8KK3N0YXRpYyB2b2lkCit0ZXN0X2N1c3RvbV9zdGF0c192 YXJfdG9fc2VyaWFsaXplZF9kYXRhKGNvbnN0IFBnU3RhdF9IYXNoS2V5ICprZXksCisJCQkJCQkJ CQkJIGNvbnN0IFBnU3RhdFNoYXJlZF9Db21tb24gKmhlYWRlciwKKwkJCQkJCQkJCQkgRklMRSAq c3RhdGZpbGUpCit7CisJY2hhcgkgICAqZGVzY3JpcHRpb247CisJc2l6ZV90CQlsZW47CisJUGdT dGF0U2hhcmVkX0N1c3RvbVZhckVudHJ5ICplbnRyeSA9IChQZ1N0YXRTaGFyZWRfQ3VzdG9tVmFy RW50cnkgKikgaGVhZGVyOworCWJvb2wJCWZvdW5kOworCXVpbnQzMgkJbWFnaWNfbnVtYmVyID0g VEVTVF9DVVNUT01fVkFSX01BR0lDX05VTUJFUjsKKworCS8qCisJICogRmlyc3QgbWFyayB0aGUg bWFpbiBmaWxlIHdpdGggYSBtYWdpYyBudW1iZXIsIGtlZXBpbmcgYSB0cmFjZSB0aGF0IHNvbWUK KwkgKiBhdXhpbGlhcnkgZGF0YSB3aWxsIGV4aXN0IGluIHRoZSBzZWNvbmRhcnkgc3RhdGlzdGlj cyBmaWxlLgorCSAqLworCXBnc3RhdF93cml0ZV9jaHVua19zKHN0YXRmaWxlLCAmbWFnaWNfbnVt YmVyKTsKKworCS8qIE9wZW4gc3RhdGlzdGljcyBmaWxlIGZvciB3cml0aW5nLiAqLworCWlmICgh ZmRfZGVzY3JpcHRpb24pCisJeworCQlmZF9kZXNjcmlwdGlvbiA9IEFsbG9jYXRlRmlsZShURVNU X0NVU1RPTV9BVVhfREFUQV9ERVNDLCBQR19CSU5BUllfVyk7CisJCWlmIChmZF9kZXNjcmlwdGlv biA9PSBOVUxMKQorCQl7CisJCQllcmVwb3J0KExPRywKKwkJCQkJKGVycmNvZGVfZm9yX2ZpbGVf YWNjZXNzKCksCisJCQkJCSBlcnJtc2coImNvdWxkIG5vdCBvcGVuIHN0YXRpc3RpY3MgZmlsZSBc IiVzXCIgZm9yIHdyaXRpbmc6ICVtIiwKKwkJCQkJCQlURVNUX0NVU1RPTV9BVVhfREFUQV9ERVND KSkpOworCQkJcmV0dXJuOworCQl9CisKKwkJLyogSW5pdGlhbGl6ZSBvZmZzZXQgZm9yIHNlY29u ZGFyeSBzdGF0aXN0aWNzIGZpbGUuICovCisJCWZkX2Rlc2NyaXB0aW9uX29mZnNldCA9IDA7CisJ fQorCisJLyogV3JpdGUgb2Zmc2V0IHRvIHRoZSBtYWluIGRhdGEgZmlsZSAqLworCXBnc3RhdF93 cml0ZV9jaHVua19zKHN0YXRmaWxlLCAmZmRfZGVzY3JpcHRpb25fb2Zmc2V0KTsKKworCS8qCisJ ICogRmlyc3Qgd3JpdGUgdGhlIGVudHJ5IGtleSB0byB0aGUgc2Vjb25kYXJ5IHN0YXRpc3RpY3Mg ZmlsZS4gIFRoaXMgd2lsbAorCSAqIGJlIGNyb3NzLWNoZWNrZWQgd2l0aCB0aGUga2V5IHJlYWQg ZnJvbSBtYWluIHN0YXRzIGZpbGUgYXQgbG9hZGluZworCSAqIHRpbWUuCisJICovCisJcGdzdGF0 X3dyaXRlX2NodW5rX3MoZmRfZGVzY3JpcHRpb24sIChQZ1N0YXRfSGFzaEtleSAqKSBrZXkpOwor CWZkX2Rlc2NyaXB0aW9uX29mZnNldCArPSBzaXplb2YoUGdTdGF0X0hhc2hLZXkpOworCisJaWYg KCFjdXN0b21fc3RhdHNfZGVzY3JpcHRpb25fZHNhKQorCQljdXN0b21fc3RhdHNfZGVzY3JpcHRp b25fZHNhID0gR2V0TmFtZWREU0EoInRlc3RfY3VzdG9tX3N0YXRfZHNhIiwgJmZvdW5kKTsKKwor CS8qIEhhbmRsZSBlbnRyaWVzIHdpdGhvdXQgZGVzY3JpcHRpb25zICovCisJaWYgKCFEc2FQb2lu dGVySXNWYWxpZChlbnRyeS0+ZGVzY3JpcHRpb24pIHx8ICFjdXN0b21fc3RhdHNfZGVzY3JpcHRp b25fZHNhKQorCXsKKwkJLyogbGVuZ3RoIHRvIGRlc2NyaXB0aW9uIGZpbGUgKi8KKwkJbGVuID0g MDsKKwkJcGdzdGF0X3dyaXRlX2NodW5rX3MoZmRfZGVzY3JpcHRpb24sICZsZW4pOworCQlmZF9k ZXNjcmlwdGlvbl9vZmZzZXQgKz0gc2l6ZW9mKHNpemVfdCk7CisJCXJldHVybjsKKwl9CisKKwkv KgorCSAqIFJldHJpZXZlIGRlc2NyaXB0aW9uIGZyb20gRFNBLCB0aGVuIHdyaXRlIHRoZSBsZW5n dGggZm9sbG93ZWQgYnkgdGhlCisJICogZGVzY3JpcHRpb24uCisJICovCisJZGVzY3JpcHRpb24g PSBkc2FfZ2V0X2FkZHJlc3MoY3VzdG9tX3N0YXRzX2Rlc2NyaXB0aW9uX2RzYSwKKwkJCQkJCQkJ ICBlbnRyeS0+ZGVzY3JpcHRpb24pOworCWxlbiA9IHN0cmxlbihkZXNjcmlwdGlvbikgKyAxOwor CXBnc3RhdF93cml0ZV9jaHVua19zKGZkX2Rlc2NyaXB0aW9uLCAmbGVuKTsKKwlwZ3N0YXRfd3Jp dGVfY2h1bmsoZmRfZGVzY3JpcHRpb24sIGRlc2NyaXB0aW9uLCBsZW4pOworCisJLyoKKwkgKiBV cGRhdGUgb2Zmc2V0IGZvciBuZXh0IGVudHJ5LCBjb3VudGluZyBmb3IgdGhlIGxlbmd0aCAoc2l6 ZV90KSBvZiB0aGUKKwkgKiBkZXNjcmlwdGlvbiBhbmQgdGhlIGRlc2NyaXB0aW9uIGNvbnRlbnRz LgorCSAqLworCWZkX2Rlc2NyaXB0aW9uX29mZnNldCArPSBsZW4gKyBzaXplb2Yoc2l6ZV90KTsK K30KKworLyoKKyAqIHRlc3RfY3VzdG9tX3N0YXRzX3Zhcl9mcm9tX3NlcmlhbGl6ZWRfZGF0YSgp IC0KKyAqCisgKiBSZWFkIGF1eGlsaWFyeSBkYXRhIChkZXNjcmlwdGlvbnMpIGZvciBjdXN0b20g c3RhdGlzdGljcyBlbnRyaWVzIGZyb20KKyAqIHRoZSBzZWNvbmRhcnkgc3RhdGlzdGljcyBmaWxl LiAgVGhpcyBpcyBjYWxsZWQgd2hpbGUgbG9hZGluZyB0aGUgc3RhdGlzdGljcworICogYXQgc3Rh cnR1cC4KKyAqCisgKiBTZWUgdGhlIHRvcCBvZiB0ZXN0X2N1c3RvbV9zdGF0c192YXJfdG9fc2Vy aWFsaXplZF9kYXRhKCkgZm9yIGEKKyAqIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIHRoZSBkYXRh IGxheW91dCByZWFkIGhlcmUuCisgKi8KK3N0YXRpYyBib29sCit0ZXN0X2N1c3RvbV9zdGF0c192 YXJfZnJvbV9zZXJpYWxpemVkX2RhdGEoY29uc3QgUGdTdGF0X0hhc2hLZXkgKmtleSwKKwkJCQkJ CQkJCQkgICBjb25zdCBQZ1N0YXRTaGFyZWRfQ29tbW9uICpoZWFkZXIsCisJCQkJCQkJCQkJICAg RklMRSAqc3RhdGZpbGUpCit7CisJUGdTdGF0U2hhcmVkX0N1c3RvbVZhckVudHJ5ICplbnRyeTsK Kwlkc2FfcG9pbnRlciBkcDsKKwlzaXplX3QJCWxlbjsKKwlsb25nCQlvZmZzZXQ7CisJY2hhcgkg ICAqYnVmZmVyOworCWJvb2wJCWZvdW5kOworCXVpbnQzMgkJbWFnaWNfbnVtYmVyID0gMDsKKwlQ Z1N0YXRfSGFzaEtleSBmaWxlX2tleTsKKworCS8qIENoZWNrIHRoZSBtYWdpYyBudW1iZXIgZmly c3QsIGluIHRoZSBtYWluIGZpbGUuICovCisJaWYgKCFwZ3N0YXRfcmVhZF9jaHVua19zKHN0YXRm aWxlLCAmbWFnaWNfbnVtYmVyKSkKKwl7CisJCWVsb2coV0FSTklORywgImZhaWxlZCB0byByZWFk IG1hZ2ljIG51bWJlciBmcm9tIHN0YXRpc3RpY3MgZmlsZSIpOworCQlyZXR1cm4gZmFsc2U7CisJ fQorCisJaWYgKG1hZ2ljX251bWJlciAhPSBURVNUX0NVU1RPTV9WQVJfTUFHSUNfTlVNQkVSKQor CXsKKwkJZWxvZyhXQVJOSU5HLCAiZm91bmQgbWFnaWMgbnVtYmVyICV1IGZyb20gc3RhdGlzdGlj cyBmaWxlLCBzaG91bGQgYmUgJXUiLAorCQkJIG1hZ2ljX251bWJlciwgVEVTVF9DVVNUT01fVkFS X01BR0lDX05VTUJFUik7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKgorCSAqIFJlYWQgdGhl IG9mZnNldCBmcm9tIHRoZSBtYWluIHN0YXRzIGZpbGUsIHRvIGJlIGFibGUgdG8gcmVhZCB0aGUK KwkgKiBhdXhpbGlhcnkgZGF0YSBmcm9tIHRoZSBzZWNvbmRhcnkgc3RhdGlzdGljcyBmaWxlLgor CSAqLworCWlmICghcGdzdGF0X3JlYWRfY2h1bmtfcyhzdGF0ZmlsZSwgJm9mZnNldCkpCisJewor CQllbG9nKFdBUk5JTkcsICJmYWlsZWQgdG8gcmVhZCBtZXRhZGF0YSBvZmZzZXQgZnJvbSBzdGF0 aXN0aWNzIGZpbGUiKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qIE9wZW4gc3RhdGlzdGlj cyBmaWxlIGZvciByZWFkaW5nIGlmIG5vdCBhbHJlYWR5IG9wZW4gKi8KKwlpZiAoIWZkX2Rlc2Ny aXB0aW9uKQorCXsKKwkJZmRfZGVzY3JpcHRpb24gPSBBbGxvY2F0ZUZpbGUoVEVTVF9DVVNUT01f QVVYX0RBVEFfREVTQywgUEdfQklOQVJZX1IpOworCQlpZiAoZmRfZGVzY3JpcHRpb24gPT0gTlVM TCkKKwkJeworCQkJaWYgKGVycm5vICE9IEVOT0VOVCkKKwkJCQllcmVwb3J0KExPRywKKwkJCQkJ CShlcnJjb2RlX2Zvcl9maWxlX2FjY2VzcygpLAorCQkJCQkJIGVycm1zZygiY291bGQgbm90IG9w ZW4gc3RhdGlzdGljcyBmaWxlIFwiJXNcIiBmb3IgcmVhZGluZzogJW0iLAorCQkJCQkJCQlURVNU X0NVU1RPTV9BVVhfREFUQV9ERVNDKSkpOworCQkJcGdzdGF0X3Jlc2V0X29mX2tpbmQoUEdTVEFU X0tJTkRfVEVTVF9DVVNUT01fVkFSX1NUQVRTKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCX0K KworCS8qIFJlYWQgZGF0YSBmcm9tIHRoZSBzZWNvbmRhcnkgc3RhdGlzdGljcyBmaWxlLCBhdCB0 aGUgc3BlY2lmaWVkIG9mZnNldCAqLworCWlmIChmc2VlayhmZF9kZXNjcmlwdGlvbiwgb2Zmc2V0 LCBTRUVLX1NFVCkgIT0gMCkKKwl7CisJCWVsb2coV0FSTklORywgImZhaWxlZCB0byBzZWVrIHRv IG9mZnNldCAlbGQgaW4gZGVzY3JpcHRpb24gZmlsZSIsIG9mZnNldCk7CisJCXJldHVybiBmYWxz ZTsKKwl9CisKKwkvKiBSZWFkIHRoZSBoYXNoIGtleSBmcm9tIHRoZSBzZWNvbmRhcnkgc3RhdGlz dGljcyBmaWxlICovCisJaWYgKCFwZ3N0YXRfcmVhZF9jaHVua19zKGZkX2Rlc2NyaXB0aW9uLCAm ZmlsZV9rZXkpKQorCXsKKwkJZWxvZyhXQVJOSU5HLCAiZmFpbGVkIHRvIHJlYWQgaGFzaCBrZXkg ZnJvbSBmaWxlIik7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKiBDaGVjayBrZXkgY29uc2lz dGVuY3kgKi8KKwlpZiAoZmlsZV9rZXkua2luZCAhPSBrZXktPmtpbmQgfHwKKwkJZmlsZV9rZXku ZGJvaWQgIT0ga2V5LT5kYm9pZCB8fAorCQlmaWxlX2tleS5vYmppZCAhPSBrZXktPm9iamlkKQor CXsKKwkJZWxvZyhXQVJOSU5HLCAiZm91bmQgZW50cnkga2V5ICV1LyV1LyUiIFBSSXU2NCAiIG5v dCBtYXRjaGluZyB3aXRoICV1LyV1LyUiIFBSSXU2NCwKKwkJCSBmaWxlX2tleS5raW5kLCBmaWxl X2tleS5kYm9pZCwgZmlsZV9rZXkub2JqaWQsCisJCQkga2V5LT5raW5kLCBrZXktPmRib2lkLCBr ZXktPm9iamlkKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCWVudHJ5ID0gKFBnU3RhdFNoYXJl ZF9DdXN0b21WYXJFbnRyeSAqKSBoZWFkZXI7CisKKwkvKiBSZWFkIHRoZSBkZXNjcmlwdGlvbiBs ZW5ndGggYW5kIGl0cyBkYXRhICovCisJaWYgKCFwZ3N0YXRfcmVhZF9jaHVua19zKGZkX2Rlc2Ny aXB0aW9uLCAmbGVuKSkKKwl7CisJCWVsb2coV0FSTklORywgImZhaWxlZCB0byByZWFkIG1ldGFk YXRhIGxlbmd0aCBmcm9tIHN0YXRpc3RpY3MgZmlsZSIpOworCQlyZXR1cm4gZmFsc2U7CisJfQor CisJLyogSGFuZGxlIGVtcHR5IGRlc2NyaXB0aW9ucyAqLworCWlmIChsZW4gPT0gMCkKKwl7CisJ CWVudHJ5LT5kZXNjcmlwdGlvbiA9IEludmFsaWREc2FQb2ludGVyOworCQlyZXR1cm4gdHJ1ZTsK Kwl9CisKKwkvKiBJbml0aWFsaXplIERTQSBpZiBuZWVkZWQgKi8KKwlpZiAoIWN1c3RvbV9zdGF0 c19kZXNjcmlwdGlvbl9kc2EpCisJCWN1c3RvbV9zdGF0c19kZXNjcmlwdGlvbl9kc2EgPSBHZXRO YW1lZERTQSgidGVzdF9jdXN0b21fc3RhdF9kc2EiLCAmZm91bmQpOworCisJaWYgKCFjdXN0b21f c3RhdHNfZGVzY3JpcHRpb25fZHNhKQorCXsKKwkJZWxvZyhXQVJOSU5HLCAiY291bGQgbm90IGFj Y2VzcyBEU0EgZm9yIGN1c3RvbSBzdGF0aXN0aWNzIGRlc2NyaXB0aW9ucyIpOworCQlyZXR1cm4g ZmFsc2U7CisJfQorCisJYnVmZmVyID0gcGFsbG9jKGxlbik7CisJaWYgKCFwZ3N0YXRfcmVhZF9j aHVuayhmZF9kZXNjcmlwdGlvbiwgYnVmZmVyLCBsZW4pKQorCXsKKwkJcGZyZWUoYnVmZmVyKTsK KwkJZWxvZyhXQVJOSU5HLCAiZmFpbGVkIHRvIHJlYWQgZGVzY3JpcHRpb24gZnJvbSBmaWxlIik7 CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKiBBbGxvY2F0ZSBzcGFjZSBpbiBEU0EgYW5kIGNv cHkgdGhlIGRlc2NyaXB0aW9uICovCisJZHAgPSBkc2FfYWxsb2NhdGUoY3VzdG9tX3N0YXRzX2Rl c2NyaXB0aW9uX2RzYSwgbGVuKTsKKwltZW1jcHkoZHNhX2dldF9hZGRyZXNzKGN1c3RvbV9zdGF0 c19kZXNjcmlwdGlvbl9kc2EsIGRwKSwgYnVmZmVyLCBsZW4pOworCWVudHJ5LT5kZXNjcmlwdGlv biA9IGRwOworCXBmcmVlKGJ1ZmZlcik7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworLyoKKyAqIHRl c3RfY3VzdG9tX3N0YXRzX3Zhcl9maW5pc2goKSAtCisgKgorICogQ2xlYW51cCBmdW5jdGlvbiBj YWxsZWQgYXQgdGhlIGVuZCBvZiBzdGF0aXN0aWNzIGZpbGUgb3BlcmF0aW9ucy4KKyAqIEhhbmRs ZXMgY2xvc2luZyBmaWxlcyBhbmQgY2xlYW51cCBiYXNlZCBvbiB0aGUgb3BlcmF0aW9uIHR5cGUu CisgKi8KK3N0YXRpYyB2b2lkCit0ZXN0X2N1c3RvbV9zdGF0c192YXJfZmluaXNoKFBnU3RhdF9T dGF0c0ZpbGVPcCBzdGF0dXMpCit7CisJc3dpdGNoIChzdGF0dXMpCisJeworCQljYXNlIFNUQVRT X1dSSVRFOgorCQkJaWYgKCFmZF9kZXNjcmlwdGlvbikKKwkJCQlyZXR1cm47CisKKwkJCWZkX2Rl c2NyaXB0aW9uX29mZnNldCA9IDA7CisKKwkJCS8qIENoZWNrIGZvciB3cml0ZSBlcnJvcnMgYW5k IGNsZWFudXAgaWYgbmVjZXNzYXJ5ICovCisJCQlpZiAoZmVycm9yKGZkX2Rlc2NyaXB0aW9uKSkK KwkJCXsKKwkJCQllcmVwb3J0KExPRywKKwkJCQkJCShlcnJjb2RlX2Zvcl9maWxlX2FjY2Vzcygp LAorCQkJCQkJIGVycm1zZygiY291bGQgbm90IHdyaXRlIHN0YXRpc3RpY3MgZmlsZSBcIiVzXCI6 ICVtIiwKKwkJCQkJCQkJVEVTVF9DVVNUT01fQVVYX0RBVEFfREVTQykpKTsKKwkJCQlGcmVlRmls ZShmZF9kZXNjcmlwdGlvbik7CisJCQkJdW5saW5rKFRFU1RfQ1VTVE9NX0FVWF9EQVRBX0RFU0Mp OworCQkJfQorCQkJZWxzZSBpZiAoRnJlZUZpbGUoZmRfZGVzY3JpcHRpb24pIDwgMCkKKwkJCXsK KwkJCQllcmVwb3J0KExPRywKKwkJCQkJCShlcnJjb2RlX2Zvcl9maWxlX2FjY2VzcygpLAorCQkJ CQkJIGVycm1zZygiY291bGQgbm90IGNsb3NlIHN0YXRpc3RpY3MgZmlsZSBcIiVzXCI6ICVtIiwK KwkJCQkJCQkJVEVTVF9DVVNUT01fQVVYX0RBVEFfREVTQykpKTsKKwkJCQl1bmxpbmsoVEVTVF9D VVNUT01fQVVYX0RBVEFfREVTQyk7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFNUQVRTX1JF QUQ6CisJCQlpZiAoZmRfZGVzY3JpcHRpb24pCisJCQkJRnJlZUZpbGUoZmRfZGVzY3JpcHRpb24p OworCisJCQkvKiBSZW1vdmUgdGhlIHRlbXBvcmFyeSBzdGF0aXN0aWNzIGZpbGUgYWZ0ZXIgcmVh ZGluZyAqLworCQkJZWxvZyhERUJVRzIsICJyZW1vdmluZyBzdGF0aXN0aWNzIGZpbGUgXCIlc1wi IiwgVEVTVF9DVVNUT01fQVVYX0RBVEFfREVTQyk7CisJCQl1bmxpbmsoVEVTVF9DVVNUT01fQVVY X0RBVEFfREVTQyk7CisJCQlicmVhazsKKworCQljYXNlIFNUQVRTX0RJU0NBUkQ6CisJCQl7CisJ CQkJaW50CQkJcmV0OworCisJCQkJLyogQXR0ZW1wdCB0byByZW1vdmUgdGhlIHN0YXRpc3RpY3Mg ZmlsZSAqLworCQkJCXJldCA9IHVubGluayhURVNUX0NVU1RPTV9BVVhfREFUQV9ERVNDKTsKKwkJ CQlpZiAocmV0ICE9IDApCisJCQkJeworCQkJCQlpZiAoZXJybm8gPT0gRU5PRU5UKQorCQkJCQkJ ZWxvZyhMT0csCisJCQkJCQkJICJkaWRuJ3QgbmVlZCB0byB1bmxpbmsgcGVybWFuZW50IHN0YXRz IGZpbGUgXCIlc1wiIC0gZGlkbid0IGV4aXN0IiwKKwkJCQkJCQkgVEVTVF9DVVNUT01fQVVYX0RB VEFfREVTQyk7CisJCQkJCWVsc2UKKwkJCQkJCWVyZXBvcnQoTE9HLAorCQkJCQkJCQkoZXJyY29k ZV9mb3JfZmlsZV9hY2Nlc3MoKSwKKwkJCQkJCQkJIGVycm1zZygiY291bGQgbm90IHVubGluayBw ZXJtYW5lbnQgc3RhdGlzdGljcyBmaWxlIFwiJXNcIjogJW0iLAorCQkJCQkJCQkJCVRFU1RfQ1VT VE9NX0FVWF9EQVRBX0RFU0MpKSk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCWVyZXBv cnQoTE9HLAorCQkJCQkJCShlcnJtc2dfaW50ZXJuYWwoInVubGlua2VkIHBlcm1hbmVudCBzdGF0 aXN0aWNzIGZpbGUgXCIlc1wiIiwKKwkJCQkJCQkJCQkJIFRFU1RfQ1VTVE9NX0FVWF9EQVRBX0RF U0MpKSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJfQorCisJZmRfZGVzY3JpcHRpb24gPSBO VUxMOworfQorCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBIZWxwZXIgZnVuY3Rpb25zCiAgKi0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tCkBAIC0xNjIsOCArNTAzLDcgQEAgdGVzdF9jdXN0b21fc3RhdHNfdmFy X2ZldGNoX2VudHJ5KGNvbnN0IGNoYXIgKnN0YXRfbmFtZSkKICAqIHRlc3RfY3VzdG9tX3N0YXRz X3Zhcl9jcmVhdGUKICAqCQlDcmVhdGUgbmV3IGN1c3RvbSBzdGF0aXN0aWMgZW50cnkKICAqCi0g KiBJbml0aWFsaXplcyBhIHplcm8tdmFsdWVkIHN0YXRpc3RpY3MgZW50cnkgaW4gc2hhcmVkIG1l bW9yeS4KLSAqIFZhbGlkYXRlcyBuYW1lIGxlbmd0aCBhZ2FpbnN0IE5BTUVEQVRBTEVOIGxpbWl0 LgorICogSW5pdGlhbGl6ZXMgYSBzdGF0aXN0aWNzIGVudHJ5IHdpdGggdGhlIGdpdmVuIG5hbWUg YW5kIGRlc2NyaXB0aW9uLgogICovCiBQR19GVU5DVElPTl9JTkZPX1YxKHRlc3RfY3VzdG9tX3N0 YXRzX3Zhcl9jcmVhdGUpOwogRGF0dW0KQEAgLTE3Miw2ICs1MTIsOSBAQCB0ZXN0X2N1c3RvbV9z dGF0c192YXJfY3JlYXRlKFBHX0ZVTkNUSU9OX0FSR1MpCiAJUGdTdGF0X0VudHJ5UmVmICplbnRy eV9yZWY7CiAJUGdTdGF0U2hhcmVkX0N1c3RvbVZhckVudHJ5ICpzaGFyZWRfZW50cnk7CiAJY2hh cgkgICAqc3RhdF9uYW1lID0gdGV4dF90b19jc3RyaW5nKFBHX0dFVEFSR19URVhUX1BQKDApKTsK KwljaGFyCSAgICpkZXNjcmlwdGlvbiA9IHRleHRfdG9fY3N0cmluZyhQR19HRVRBUkdfVEVYVF9Q UCgxKSk7CisJZHNhX3BvaW50ZXIgZHAgPSBJbnZhbGlkRHNhUG9pbnRlcjsKKwlib29sCQlmb3Vu ZDsKIAogCS8qIFZhbGlkYXRlIG5hbWUgbGVuZ3RoIGZpcnN0ICovCiAJaWYgKHN0cmxlbihzdGF0 X25hbWUpID49IE5BTUVEQVRBTEVOKQpAQCAtMTgwLDYgKzUyMywyMCBAQCB0ZXN0X2N1c3RvbV9z dGF0c192YXJfY3JlYXRlKFBHX0ZVTkNUSU9OX0FSR1MpCiAJCQkJIGVycm1zZygiY3VzdG9tIHN0 YXRpc3RpYyBuYW1lIFwiJXNcIiBpcyB0b28gbG9uZyIsIHN0YXRfbmFtZSksCiAJCQkJIGVycmRl dGFpbCgiTmFtZSBtdXN0IGJlIGxlc3MgdGhhbiAlZCBjaGFyYWN0ZXJzLiIsIE5BTUVEQVRBTEVO KSkpOwogCisJLyogSW5pdGlhbGl6ZSBEU0EgYW5kIGRlc2NyaXB0aW9uIHByb3ZpZGVkICovCisJ aWYgKCFjdXN0b21fc3RhdHNfZGVzY3JpcHRpb25fZHNhKQorCQljdXN0b21fc3RhdHNfZGVzY3Jp cHRpb25fZHNhID0gR2V0TmFtZWREU0EoInRlc3RfY3VzdG9tX3N0YXRfZHNhIiwgJmZvdW5kKTsK KworCWlmICghY3VzdG9tX3N0YXRzX2Rlc2NyaXB0aW9uX2RzYSkKKwkJZXJlcG9ydChFUlJPUiwK KwkJCQkoZXJybXNnKCJjb3VsZCBub3QgYWNjZXNzIERTQSBmb3IgY3VzdG9tIHN0YXRpc3RpY3Mg ZGVzY3JpcHRpb25zIikpKTsKKworCS8qIEFsbG9jYXRlIHNwYWNlIGluIERTQSBhbmQgY29weSBk ZXNjcmlwdGlvbiAqLworCWRwID0gZHNhX2FsbG9jYXRlKGN1c3RvbV9zdGF0c19kZXNjcmlwdGlv bl9kc2EsIHN0cmxlbihkZXNjcmlwdGlvbikgKyAxKTsKKwltZW1jcHkoZHNhX2dldF9hZGRyZXNz KGN1c3RvbV9zdGF0c19kZXNjcmlwdGlvbl9kc2EsIGRwKSwKKwkJICAgZGVzY3JpcHRpb24sCisJ CSAgIHN0cmxlbihkZXNjcmlwdGlvbikgKyAxKTsKKwogCS8qIENyZWF0ZSBvciBnZXQgZXhpc3Rp bmcgZW50cnkgKi8KIAllbnRyeV9yZWYgPSBwZ3N0YXRfZ2V0X2VudHJ5X3JlZl9sb2NrZWQoUEdT VEFUX0tJTkRfVEVTVF9DVVNUT01fVkFSX1NUQVRTLCBJbnZhbGlkT2lkLAogCQkJCQkJCQkJCQlQ R1NUQVRfQ1VTVE9NX1ZBUl9TVEFUU19JRFgoc3RhdF9uYW1lKSwgdHJ1ZSk7CkBAIC0xOTIsNiAr NTQ5LDkgQEAgdGVzdF9jdXN0b21fc3RhdHNfdmFyX2NyZWF0ZShQR19GVU5DVElPTl9BUkdTKQog CS8qIFplcm8taW5pdGlhbGl6ZSBzdGF0aXN0aWNzICovCiAJbWVtc2V0KCZzaGFyZWRfZW50cnkt PnN0YXRzLCAwLCBzaXplb2Yoc2hhcmVkX2VudHJ5LT5zdGF0cykpOwogCisJLyogU3RvcmUgZGVz Y3JpcHRpb24gcG9pbnRlciAqLworCXNoYXJlZF9lbnRyeS0+ZGVzY3JpcHRpb24gPSBkcDsKKwog CXBnc3RhdF91bmxvY2tfZW50cnkoZW50cnlfcmVmKTsKIAogCVBHX1JFVFVSTl9WT0lEKCk7CkBA IC0yMjYsOCArNTg2LDcgQEAgdGVzdF9jdXN0b21fc3RhdHNfdmFyX3VwZGF0ZShQR19GVU5DVElP Tl9BUkdTKQogICogdGVzdF9jdXN0b21fc3RhdHNfdmFyX2Ryb3AKICAqCQlSZW1vdmUgY3VzdG9t IHN0YXRpc3RpYyBlbnRyeQogICoKLSAqIERyb3BzIHRoZSBuYW1lZCBzdGF0aXN0aWMgZnJvbSBz aGFyZWQgbWVtb3J5IGFuZCByZXF1ZXN0cwotICogZ2FyYmFnZSBjb2xsZWN0aW9uIGlmIG5lZWRl ZC4KKyAqIERyb3BzIHRoZSBuYW1lZCBzdGF0aXN0aWMgZnJvbSBzaGFyZWQgbWVtb3J5LgogICov CiBQR19GVU5DVElPTl9JTkZPX1YxKHRlc3RfY3VzdG9tX3N0YXRzX3Zhcl9kcm9wKTsKIERhdHVt CkBAIC0yNDcsNyArNjA2LDcgQEAgdGVzdF9jdXN0b21fc3RhdHNfdmFyX2Ryb3AoUEdfRlVOQ1RJ T05fQVJHUykKICAqIHRlc3RfY3VzdG9tX3N0YXRzX3Zhcl9yZXBvcnQKICAqCQlSZXRyaWV2ZSBj dXN0b20gc3RhdGlzdGljIHZhbHVlcwogICoKLSAqIFJldHVybnMgc2luZ2xlIHJvdyB3aXRoIHN0 YXRpc3RpYyBuYW1lIGFuZCBjYWxsIGNvdW50IGlmIHRoZQorICogUmV0dXJucyBzaW5nbGUgcm93 IHdpdGggc3RhdGlzdGljIG5hbWUsIGNhbGwgY291bnQsIGFuZCBkZXNjcmlwdGlvbiBpZiB0aGUK ICAqIHN0YXRpc3RpYyBleGlzdHMsIG90aGVyd2lzZSByZXR1cm5zIG5vIHJvd3MuCiAgKi8KIFBH X0ZVTkNUSU9OX0lORk9fVjEodGVzdF9jdXN0b21fc3RhdHNfdmFyX3JlcG9ydCk7CkBAIC0yODEs OSArNjQwLDEzIEBAIHRlc3RfY3VzdG9tX3N0YXRzX3Zhcl9yZXBvcnQoUEdfRlVOQ1RJT05fQVJH UykKIAogCWlmIChmdW5jY3R4LT5jYWxsX2NudHIgPCBmdW5jY3R4LT5tYXhfY2FsbHMpCiAJewot CQlEYXR1bQkJdmFsdWVzWzJdOwotCQlib29sCQludWxsc1syXSA9IHtmYWxzZSwgZmFsc2V9Owor CQlEYXR1bQkJdmFsdWVzWzNdOworCQlib29sCQludWxsc1szXSA9IHtmYWxzZSwgZmFsc2UsIGZh bHNlfTsKIAkJSGVhcFR1cGxlCXR1cGxlOworCQlQZ1N0YXRfRW50cnlSZWYgKmVudHJ5X3JlZjsK KwkJUGdTdGF0U2hhcmVkX0N1c3RvbVZhckVudHJ5ICpzaGFyZWRfZW50cnk7CisJCWNoYXIJICAg KmRlc2NyaXB0aW9uID0gTlVMTDsKKwkJYm9vbAkJZm91bmQ7CiAKIAkJc3RhdF9uYW1lID0gdGV4 dF90b19jc3RyaW5nKFBHX0dFVEFSR19URVhUX1BQKDApKTsKIAkJc3RhdF9lbnRyeSA9IHRlc3Rf Y3VzdG9tX3N0YXRzX3Zhcl9mZXRjaF9lbnRyeShzdGF0X25hbWUpOwpAQCAtMjkxLDkgKzY1NCwz MyBAQCB0ZXN0X2N1c3RvbV9zdGF0c192YXJfcmVwb3J0KFBHX0ZVTkNUSU9OX0FSR1MpCiAJCS8q IFJldHVybiByb3cgb25seSBpZiBlbnRyeSBleGlzdHMgKi8KIAkJaWYgKHN0YXRfZW50cnkpCiAJ CXsKKwkJCS8qIEdldCBlbnRyeSByZWYgdG8gYWNjZXNzIHNoYXJlZCBlbnRyeSAqLworCQkJZW50 cnlfcmVmID0gcGdzdGF0X2dldF9lbnRyeV9yZWYoUEdTVEFUX0tJTkRfVEVTVF9DVVNUT01fVkFS X1NUQVRTLCBJbnZhbGlkT2lkLAorCQkJCQkJCQkJCQkgUEdTVEFUX0NVU1RPTV9WQVJfU1RBVFNf SURYKHN0YXRfbmFtZSksIGZhbHNlLCBOVUxMKTsKKworCQkJaWYgKGVudHJ5X3JlZikKKwkJCXsK KwkJCQlzaGFyZWRfZW50cnkgPSAoUGdTdGF0U2hhcmVkX0N1c3RvbVZhckVudHJ5ICopIGVudHJ5 X3JlZi0+c2hhcmVkX3N0YXRzOworCisJCQkJLyogR2V0IGRlc2NyaXB0aW9uIGZyb20gRFNBIGlm IGF2YWlsYWJsZSAqLworCQkJCWlmIChEc2FQb2ludGVySXNWYWxpZChzaGFyZWRfZW50cnktPmRl c2NyaXB0aW9uKSkKKwkJCQl7CisJCQkJCWlmICghY3VzdG9tX3N0YXRzX2Rlc2NyaXB0aW9uX2Rz YSkKKwkJCQkJCWN1c3RvbV9zdGF0c19kZXNjcmlwdGlvbl9kc2EgPSBHZXROYW1lZERTQSgidGVz dF9jdXN0b21fc3RhdF9kc2EiLCAmZm91bmQpOworCisJCQkJCWlmIChjdXN0b21fc3RhdHNfZGVz Y3JpcHRpb25fZHNhKQorCQkJCQkJZGVzY3JpcHRpb24gPSBkc2FfZ2V0X2FkZHJlc3MoY3VzdG9t X3N0YXRzX2Rlc2NyaXB0aW9uX2RzYSwgc2hhcmVkX2VudHJ5LT5kZXNjcmlwdGlvbik7CisJCQkJ fQorCQkJfQorCiAJCQl2YWx1ZXNbMF0gPSBQb2ludGVyR2V0RGF0dW0oY3N0cmluZ190b190ZXh0 KHN0YXRfbmFtZSkpOwogCQkJdmFsdWVzWzFdID0gSW50NjRHZXREYXR1bShzdGF0X2VudHJ5LT5u dW1jYWxscyk7CiAKKwkJCWlmIChkZXNjcmlwdGlvbikKKwkJCQl2YWx1ZXNbMl0gPSBQb2ludGVy R2V0RGF0dW0oY3N0cmluZ190b190ZXh0KGRlc2NyaXB0aW9uKSk7CisJCQllbHNlCisJCQkJbnVs bHNbMl0gPSB0cnVlOworCiAJCQl0dXBsZSA9IGhlYXBfZm9ybV90dXBsZShmdW5jY3R4LT50dXBs ZV9kZXNjLCB2YWx1ZXMsIG51bGxzKTsKIAkJCVNSRl9SRVRVUk5fTkVYVChmdW5jY3R4LCBIZWFw VHVwbGVHZXREYXR1bSh0dXBsZSkpOwogCQl9CmRpZmYgLS1naXQgYS9zcmMvdG9vbHMvcGdpbmRl bnQvdHlwZWRlZnMubGlzdCBiL3NyYy90b29scy9wZ2luZGVudC90eXBlZGVmcy5saXN0CmluZGV4 IDlkZDY1YjEwMjU0Li4xNGY3ZjgyMTc0OSAxMDA2NDQKLS0tIGEvc3JjL3Rvb2xzL3BnaW5kZW50 L3R5cGVkZWZzLmxpc3QKKysrIGIvc3JjL3Rvb2xzL3BnaW5kZW50L3R5cGVkZWZzLmxpc3QKQEAg LTIyNjksNiArMjI2OSw3IEBAIFBnU3RhdF9TdGF0RnVuY0VudHJ5CiBQZ1N0YXRfU3RhdFJlcGxT bG90RW50cnkKIFBnU3RhdF9TdGF0U3ViRW50cnkKIFBnU3RhdF9TdGF0VGFiRW50cnkKK1BnU3Rh dF9TdGF0c0ZpbGVPcAogUGdTdGF0X1N1YlhhY3RTdGF0dXMKIFBnU3RhdF9UYWJsZUNvdW50cwog UGdTdGF0X1RhYmxlU3RhdHVzCi0tIAoyLjQzLjAKCg== --000000000000bf402b0645caa35e--