Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1tBCnC-002TKj-9C for pgsql-hackers@arkaria.postgresql.org; Wed, 13 Nov 2024 12:48:17 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1tBCn9-00EFdZ-It for pgsql-hackers@arkaria.postgresql.org; Wed, 13 Nov 2024 12:48:16 +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.94.2) (envelope-from ) id 1tBCn9-00EFcD-4L for pgsql-hackers@lists.postgresql.org; Wed, 13 Nov 2024 12:48:15 +0000 Received: from oss.nttdata.com ([49.212.34.109]) by makus.postgresql.org with esmtps (TLS1.2) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1tBCn6-001fOW-KS for pgsql-hackers@postgresql.org; Wed, 13 Nov 2024 12:48:14 +0000 Received: from oss.nttdata.com (localhost [127.0.0.1]) by oss.nttdata.com (Postfix) with ESMTPA id 9F951617B4; Wed, 13 Nov 2024 21:48:10 +0900 (JST) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.11 at oss.nttdata.com MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=_c0b85bbaff8f81a1716f3be4df6d1b3b" Content-Transfer-Encoding: 7bit Date: Wed, 13 Nov 2024 21:48:10 +0900 From: torikoshia To: Yugo Nagata Cc: Fujii Masao , Pgsql Hackers Subject: Re: Add reject_limit option to file_fdw In-Reply-To: <20241112145114.ba288defc684699bf8646942@sraoss.co.jp> References: <54747389a562688eab7077b144daff6a@oss.nttdata.com> <2b3ad6d4-e05f-4188-8cfe-1fd9d949a9c9@oss.nttdata.com> <192ede1e4c2b34b853e5ac46f8dee50b@oss.nttdata.com> <20241112145114.ba288defc684699bf8646942@sraoss.co.jp> User-Agent: Roundcube Webmail/1.4.11 Message-ID: <2f03bf95556c4c41d6b1659e74b346c7@oss.nttdata.com> X-Sender: torikoshia@oss.nttdata.com List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --=_c0b85bbaff8f81a1716f3be4df6d1b3b Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset=US-ASCII; format=flowed On 2024-11-12 14:51, Yugo Nagata wrote: Thanks for your review! > On Tue, 12 Nov 2024 10:16:50 +0900 > torikoshia wrote: > >> On 2024-11-12 01:49, Fujii Masao wrote: >> > On 2024/11/11 21:45, torikoshia wrote: >> >>> Thanks for adding the comment. It clearly states that REJECT_LIMIT >> >>> can be >> >>> a single-quoted string. However, it might also be helpful to mention >> >>> that >> >>> it can be provided as an int64 in the COPY command option. How about >> >>> updating it like this? >> >>> >> >>> ------------------------------------ >> >>> REJECT_LIMIT can be specified in two ways: as an int64 for the COPY >> >>> command >> >>> option or as a single-quoted string for the foreign table option >> >>> using >> >>> file_fdw. Therefore this function needs to handle both formats. >> >>> ------------------------------------ >> >> >> >> Thanks! it seems better. >> >> >> >> >> >> Attached v3 patch. >> > >> > Thanks for updating the patch! It looks like you forgot to attach it, >> > though. >> >> Oops, thanks for pointing it out. >> Here it is. > > I have one minor comment. > > + ereport(ERROR, > + (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), > + errmsg("skipped more than REJECT_LIMIT (%lld) rows due to data > type incompatibility", > + (long long) cstate->opts.reject_limit))); > > Do we have to keep this message consistent with ones of COPY command? > With foreign data wrappers, it seems common that the option name is > passed in > lowercase, so is it better to use "skipped more than reject_limit ..." > rather > than using uppercase? Agreed. Attached v4 patch. -- Regards, -- Atsushi Torikoshi Seconded from NTT DATA GROUP CORPORATION to SRA OSS K.K. --=_c0b85bbaff8f81a1716f3be4df6d1b3b Content-Transfer-Encoding: base64 Content-Type: text/x-diff; name=v4-0001-file_fdw-Add-reject_limit-option-to-file_fdw.patch Content-Disposition: attachment; filename=v4-0001-file_fdw-Add-reject_limit-option-to-file_fdw.patch; size=6315 RnJvbSAxMTRkOGRkMmM1N2JmOGI5Y2Y3MTJiOGZhNDAxYzdiOGVhYThhOTU4IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBBdHN1c2hpIFRvcmlrb3NoaSA8dG9yaWtvc2hpYUBvc3MubnR0 ZGF0YS5jb20+CkRhdGU6IFdlZCwgMTMgTm92IDIwMjQgMjE6MzI6MjUgKzA5MDAKU3ViamVjdDog W1BBVENIIHY0XSBmaWxlX2ZkdzogQWRkIHJlamVjdF9saW1pdCBvcHRpb24gdG8gZmlsZV9mZHcK CkNvbW1pdCA0YWMyYTliZWNlIGludHJvZHVjZWQgUkVKRUNUX0xJTUlUIG9wdGlvbiBmb3IgQ09Q WS4gVGhpcyBwYXRjaApleHRlbmRzIHN1cHBvcnQgZm9yIHRoaXMgb3B0aW9uIHRvIGZpbGVfZmR3 LgoKQXMgd2VsbCBhcyBSRUpFQ1RfTElNSVQgb3B0aW9uIGZvciBDT1BZLCB0aGlzIG9wdGlvbiBs aW1pdHMgdGhlCm1heGltdW0gbnVtYmVyIG9mIGVycm9uZW91cyByb3dzIHRoYXQgY2FuIGJlIHNr aXBwZWQuCklmIG1vcmUgcm93cyBlbmNvdW50ZXIgZGF0YSB0eXBlIGNvbnZlcnNpb24gZXJyb3Jz IHRoYW4gYWxsb3dlZCBieQpyZWplY3RfbGltaXQsIHRoZSBhY2Nlc3MgdG8gdGhlIGZpbGVfZmR3 IGZvcmVpZ24gdGFibGUgd2lsbCBmYWlsCndpdGggYW4gZXJyb3IsIGV2ZW4gd2hlbiBvbl9lcnJv ciA9ICdpZ25vcmUnLgoKQmFzZWQgb24gdGhlIHN5bm9wc2lzIG9mIHRoZSBDUkVBVEUvQUxURVIg Rk9SRUlHTiBUQUJMRSBjb21tYW5kcywgdGhlCnZhbHVlIGZvciB0aGUgZm9yZWlnbiB0YWJsZSdz IG9wdGlvbiBtdXN0IGJlIHNpbmdsZS1xdW90ZWQuClRvIGFjY29tbW9kYXRlIHRoaXMsIHRoZSBw YXRjaCBtb2RpZmllcyBkZWZHZXRDb3B5UmVqZWN0TGltaXRPcHRpb24KdG8gYWNjZXB0IG5vdCBv bmx5IGludDY0IGJ1dCBhbHNvIHN0cmluZ3MuCi0tLQogY29udHJpYi9maWxlX2Zkdy9kYXRhL2Fn Zy5iYWQgICAgICAgICAgfCAgMSArCiBjb250cmliL2ZpbGVfZmR3L2V4cGVjdGVkL2ZpbGVfZmR3 Lm91dCB8IDE2ICsrKysrKysrKysrKysrLS0KIGNvbnRyaWIvZmlsZV9mZHcvZmlsZV9mZHcuYyAg ICAgICAgICAgIHwgIDggKysrKysrKysKIGNvbnRyaWIvZmlsZV9mZHcvc3FsL2ZpbGVfZmR3LnNx bCAgICAgIHwgIDYgKysrKystCiBkb2Mvc3JjL3NnbWwvZmlsZS1mZHcuc2dtbCAgICAgICAgICAg ICB8IDEyICsrKysrKysrKysrKwogc3JjL2JhY2tlbmQvY29tbWFuZHMvY29weS5jICAgICAgICAg ICAgfCAxNiArKysrKysrKysrKysrKystCiA2IGZpbGVzIGNoYW5nZWQsIDU1IGluc2VydGlvbnMo KyksIDQgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvY29udHJpYi9maWxlX2Zkdy9kYXRhL2Fn Zy5iYWQgYi9jb250cmliL2ZpbGVfZmR3L2RhdGEvYWdnLmJhZAppbmRleCAzNDE1YjE1MDA3Li4w NDI3OWNlNTViIDEwMDY0NAotLS0gYS9jb250cmliL2ZpbGVfZmR3L2RhdGEvYWdnLmJhZAorKysg Yi9jb250cmliL2ZpbGVfZmR3L2RhdGEvYWdnLmJhZApAQCAtMiwzICsyLDQgQEAKIDEwMDtAOTku MDk3QAogMDtAYWFhQAogNDI7QDMyNC43OEAKKzE7QGJiYkAKZGlmZiAtLWdpdCBhL2NvbnRyaWIv ZmlsZV9mZHcvZXhwZWN0ZWQvZmlsZV9mZHcub3V0IGIvY29udHJpYi9maWxlX2Zkdy9leHBlY3Rl ZC9maWxlX2Zkdy5vdXQKaW5kZXggNTkzZmRjNzgyZS4uODFlZmU2M2VlZiAxMDA2NDQKLS0tIGEv Y29udHJpYi9maWxlX2Zkdy9leHBlY3RlZC9maWxlX2Zkdy5vdXQKKysrIGIvY29udHJpYi9maWxl X2Zkdy9leHBlY3RlZC9maWxlX2Zkdy5vdXQKQEAgLTIwNiwxMCArMjA2LDEwIEBAIFNFTEVDVCAq IEZST00gYWdnX2NzdiBjIEpPSU4gYWdnX3RleHQgdCBPTiAodC5hID0gYy5hKSBPUkRFUiBCWSBj LmE7CiBTRUxFQ1QgKiBGUk9NIGFnZ19iYWQ7ICAgICAgICAgICAgICAgLS0gRVJST1IKIEVSUk9S OiAgaW52YWxpZCBpbnB1dCBzeW50YXggZm9yIHR5cGUgcmVhbDogImFhYSIKIENPTlRFWFQ6ICBD T1BZIGFnZ19iYWQsIGxpbmUgMywgY29sdW1uIGI6ICJhYWEiCi0tLSBvbl9lcnJvciBhbmQgbG9n X3ZlcmJvc2l0eSB0ZXN0cworLS0gb25fZXJyb3IsIGxvZ192ZXJib3NpdHkgYW5kIHJlamVjdF9s aW1pdCB0ZXN0cwogQUxURVIgRk9SRUlHTiBUQUJMRSBhZ2dfYmFkIE9QVElPTlMgKEFERCBvbl9l cnJvciAnaWdub3JlJyk7CiBTRUxFQ1QgKiBGUk9NIGFnZ19iYWQ7Ci1OT1RJQ0U6ICAxIHJvdyB3 YXMgc2tpcHBlZCBkdWUgdG8gZGF0YSB0eXBlIGluY29tcGF0aWJpbGl0eQorTk9USUNFOiAgMiBy b3dzIHdlcmUgc2tpcHBlZCBkdWUgdG8gZGF0YSB0eXBlIGluY29tcGF0aWJpbGl0eQogICBhICB8 ICAgYiAgICAKIC0tLS0tKy0tLS0tLS0tCiAgMTAwIHwgOTkuMDk3CkBAIC0yMjQsNiArMjI0LDE4 IEBAIFNFTEVDVCAqIEZST00gYWdnX2JhZDsKICAgNDIgfCAzMjQuNzgKICgyIHJvd3MpCiAKK0FM VEVSIEZPUkVJR04gVEFCTEUgYWdnX2JhZCBPUFRJT05TIChBREQgcmVqZWN0X2xpbWl0ICcxJyk7 IC0tIEVSUk9SCitTRUxFQ1QgKiBGUk9NIGFnZ19iYWQ7CitFUlJPUjogIHNraXBwZWQgbW9yZSB0 aGFuIHJlamVjdF9saW1pdCAoMSkgcm93cyBkdWUgdG8gZGF0YSB0eXBlIGluY29tcGF0aWJpbGl0 eQorQ09OVEVYVDogIENPUFkgYWdnX2JhZCwgbGluZSA1LCBjb2x1bW4gYjogImJiYiIKK0FMVEVS IEZPUkVJR04gVEFCTEUgYWdnX2JhZCBPUFRJT05TIChTRVQgcmVqZWN0X2xpbWl0ICcyJyk7CitT RUxFQ1QgKiBGUk9NIGFnZ19iYWQ7CisgIGEgIHwgICBiICAgIAorLS0tLS0rLS0tLS0tLS0KKyAx MDAgfCA5OS4wOTcKKyAgNDIgfCAzMjQuNzgKKygyIHJvd3MpCisKIEFOQUxZWkUgYWdnX2JhZDsK IC0tIG1pc2MgcXVlcnkgdGVzdHMKIFx0IG9uCmRpZmYgLS1naXQgYS9jb250cmliL2ZpbGVfZmR3 L2ZpbGVfZmR3LmMgYi9jb250cmliL2ZpbGVfZmR3L2ZpbGVfZmR3LmMKaW5kZXggMDQzMjA0YzNl Ny4uNmM2NGY4MTA5OCAxMDA2NDQKLS0tIGEvY29udHJpYi9maWxlX2Zkdy9maWxlX2Zkdy5jCisr KyBiL2NvbnRyaWIvZmlsZV9mZHcvZmlsZV9mZHcuYwpAQCAtNzcsNiArNzcsNyBAQCBzdGF0aWMg Y29uc3Qgc3RydWN0IEZpbGVGZHdPcHRpb24gdmFsaWRfb3B0aW9uc1tdID0gewogCXsiZW5jb2Rp bmciLCBGb3JlaWduVGFibGVSZWxhdGlvbklkfSwKIAl7Im9uX2Vycm9yIiwgRm9yZWlnblRhYmxl UmVsYXRpb25JZH0sCiAJeyJsb2dfdmVyYm9zaXR5IiwgRm9yZWlnblRhYmxlUmVsYXRpb25JZH0s CisJeyJyZWplY3RfbGltaXQiLCBGb3JlaWduVGFibGVSZWxhdGlvbklkfSwKIAl7ImZvcmNlX25v dF9udWxsIiwgQXR0cmlidXRlUmVsYXRpb25JZH0sCiAJeyJmb3JjZV9udWxsIiwgQXR0cmlidXRl UmVsYXRpb25JZH0sCiAKQEAgLTc4OCw2ICs3ODksMTMgQEAgcmV0cnk6CiAJCQkgKi8KIAkJCVJl c2V0UGVyVHVwbGVFeHByQ29udGV4dChlc3RhdGUpOwogCisJCQlpZiAoY3N0YXRlLT5vcHRzLnJl amVjdF9saW1pdCA+IDAgJiYKKwkJCQljc3RhdGUtPm51bV9lcnJvcnMgPiBjc3RhdGUtPm9wdHMu cmVqZWN0X2xpbWl0KQorCQkJCWVyZXBvcnQoRVJST1IsCisJCQkJCQkoZXJyY29kZShFUlJDT0RF X0lOVkFMSURfVEVYVF9SRVBSRVNFTlRBVElPTiksCisJCQkJCQkgZXJybXNnKCJza2lwcGVkIG1v cmUgdGhhbiByZWplY3RfbGltaXQgKCVsbGQpIHJvd3MgZHVlIHRvIGRhdGEgdHlwZSBpbmNvbXBh dGliaWxpdHkiLAorCQkJCQkJCQkobG9uZyBsb25nKSBjc3RhdGUtPm9wdHMucmVqZWN0X2xpbWl0 KSkpOworCiAJCQkvKiBSZXBlYXQgTmV4dENvcHlGcm9tKCkgdW50aWwgbm8gc29mdCBlcnJvciBv Y2N1cnMgKi8KIAkJCWdvdG8gcmV0cnk7CiAJCX0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvZmlsZV9m ZHcvc3FsL2ZpbGVfZmR3LnNxbCBiL2NvbnRyaWIvZmlsZV9mZHcvc3FsL2ZpbGVfZmR3LnNxbApp bmRleCBlZGQ3N2M1Y2QyLi4wZDY5MjBlMWY2IDEwMDY0NAotLS0gYS9jb250cmliL2ZpbGVfZmR3 L3NxbC9maWxlX2Zkdy5zcWwKKysrIGIvY29udHJpYi9maWxlX2Zkdy9zcWwvZmlsZV9mZHcuc3Fs CkBAIC0xNTAsMTEgKzE1MCwxNSBAQCBTRUxFQ1QgKiBGUk9NIGFnZ19jc3YgYyBKT0lOIGFnZ190 ZXh0IHQgT04gKHQuYSA9IGMuYSkgT1JERVIgQlkgYy5hOwogLS0gZXJyb3IgY29udGV4dCByZXBv cnQgdGVzdHMKIFNFTEVDVCAqIEZST00gYWdnX2JhZDsgICAgICAgICAgICAgICAtLSBFUlJPUgog Ci0tLSBvbl9lcnJvciBhbmQgbG9nX3ZlcmJvc2l0eSB0ZXN0cworLS0gb25fZXJyb3IsIGxvZ192 ZXJib3NpdHkgYW5kIHJlamVjdF9saW1pdCB0ZXN0cwogQUxURVIgRk9SRUlHTiBUQUJMRSBhZ2df YmFkIE9QVElPTlMgKEFERCBvbl9lcnJvciAnaWdub3JlJyk7CiBTRUxFQ1QgKiBGUk9NIGFnZ19i YWQ7CiBBTFRFUiBGT1JFSUdOIFRBQkxFIGFnZ19iYWQgT1BUSU9OUyAoQUREIGxvZ192ZXJib3Np dHkgJ3NpbGVudCcpOwogU0VMRUNUICogRlJPTSBhZ2dfYmFkOworQUxURVIgRk9SRUlHTiBUQUJM RSBhZ2dfYmFkIE9QVElPTlMgKEFERCByZWplY3RfbGltaXQgJzEnKTsgLS0gRVJST1IKK1NFTEVD VCAqIEZST00gYWdnX2JhZDsKK0FMVEVSIEZPUkVJR04gVEFCTEUgYWdnX2JhZCBPUFRJT05TIChT RVQgcmVqZWN0X2xpbWl0ICcyJyk7CitTRUxFQ1QgKiBGUk9NIGFnZ19iYWQ7CiBBTkFMWVpFIGFn Z19iYWQ7CiAKIC0tIG1pc2MgcXVlcnkgdGVzdHMKZGlmZiAtLWdpdCBhL2RvYy9zcmMvc2dtbC9m aWxlLWZkdy5zZ21sIGIvZG9jL3NyYy9zZ21sL2ZpbGUtZmR3LnNnbWwKaW5kZXggYmIzNTc5YjA3 Ny4uODgyZDlhNzZkMiAxMDA2NDQKLS0tIGEvZG9jL3NyYy9zZ21sL2ZpbGUtZmR3LnNnbWwKKysr IGIvZG9jL3NyYy9zZ21sL2ZpbGUtZmR3LnNnbWwKQEAgLTEzOCw2ICsxMzgsMTggQEAKICAgIDwv bGlzdGl0ZW0+CiAgIDwvdmFybGlzdGVudHJ5PgogCisgIDx2YXJsaXN0ZW50cnk+CisgICA8dGVy bT48bGl0ZXJhbD5yZWplY3RfbGltaXQ8L2xpdGVyYWw+PC90ZXJtPgorCisgICA8bGlzdGl0ZW0+ CisgICAgPHBhcmE+CisgICAgIFNwZWNpZmllcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgZXJyb3Jz IHRvbGVyYXRlZCB3aGlsZSBjb252ZXJ0aW5nIGEgY29sdW1uJ3MKKyAgICAgaW5wdXQgdmFsdWUg dG8gaXRzIGRhdGEgdHlwZSwgdGhlIHNhbWUgYXMgPGNvbW1hbmQ+Q09QWTwvY29tbWFuZD4ncwor ICAgIDxsaXRlcmFsPlJFSkVDVF9MSU1JVDwvbGl0ZXJhbD4gb3B0aW9uLgorICAgIDwvcGFyYT4K KyAgIDwvbGlzdGl0ZW0+CisgIDwvdmFybGlzdGVudHJ5PgorCiAgIDx2YXJsaXN0ZW50cnk+CiAg ICA8dGVybT48bGl0ZXJhbD5sb2dfdmVyYm9zaXR5PC9saXRlcmFsPjwvdGVybT4KIApkaWZmIC0t Z2l0IGEvc3JjL2JhY2tlbmQvY29tbWFuZHMvY29weS5jIGIvc3JjL2JhY2tlbmQvY29tbWFuZHMv Y29weS5jCmluZGV4IDM0ODViYTg2NjMuLjJkOThlY2YzZjQgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNr ZW5kL2NvbW1hbmRzL2NvcHkuYworKysgYi9zcmMvYmFja2VuZC9jb21tYW5kcy9jb3B5LmMKQEAg LTQyMCwxMSArNDIwLDI1IEBAIGRlZkdldENvcHlPbkVycm9yQ2hvaWNlKERlZkVsZW0gKmRlZiwg UGFyc2VTdGF0ZSAqcHN0YXRlLCBib29sIGlzX2Zyb20pCiAKIC8qCiAgKiBFeHRyYWN0IFJFSkVD VF9MSU1JVCB2YWx1ZSBmcm9tIGEgRGVmRWxlbS4KKyAqCisgKiBSRUpFQ1RfTElNSVQgY2FuIGJl IHNwZWNpZmllZCBpbiB0d28gd2F5czogYXMgYW4gaW50NjQgZm9yIHRoZSBDT1BZIGNvbW1hbmQK KyAqIG9wdGlvbiBvciBhcyBhIHNpbmdsZS1xdW90ZWQgc3RyaW5nIGZvciB0aGUgZm9yZWlnbiB0 YWJsZSBvcHRpb24gdXNpbmcKKyAqIGZpbGVfZmR3LiBUaGVyZWZvcmUgdGhpcyBmdW5jdGlvbiBu ZWVkcyB0byBoYW5kbGUgYm90aCBmb3JtYXRzLgogICovCiBzdGF0aWMgaW50NjQKIGRlZkdldENv cHlSZWplY3RMaW1pdE9wdGlvbihEZWZFbGVtICpkZWYpCiB7Ci0JaW50NjQJCXJlamVjdF9saW1p dCA9IGRlZkdldEludDY0KGRlZik7CisJaW50NjQJCXJlamVjdF9saW1pdDsKKworCWlmIChkZWYt PmFyZyA9PSBOVUxMKQorCQllcmVwb3J0KEVSUk9SLAorCQkJCShlcnJjb2RlKEVSUkNPREVfU1lO VEFYX0VSUk9SKSwKKwkJCQkgZXJybXNnKCIlcyByZXF1aXJlcyBhIG51bWVyaWMgdmFsdWUiLAor CQkJCQkJZGVmLT5kZWZuYW1lKSkpOworCWVsc2UgaWYgKG5vZGVUYWcoZGVmLT5hcmcpID09IFRf U3RyaW5nKQorCQlyZWplY3RfbGltaXQgPSBwZ19zdHJ0b2ludDY0KHN0clZhbChkZWYtPmFyZykp OworCWVsc2UKKwkJcmVqZWN0X2xpbWl0ID0gZGVmR2V0SW50NjQoZGVmKTsKIAogCWlmIChyZWpl Y3RfbGltaXQgPD0gMCkKIAkJZXJlcG9ydChFUlJPUiwKLS0gCjIuMzkuMgoK --=_c0b85bbaff8f81a1716f3be4df6d1b3b--