Received: by 2002:a05:7208:13ce:b0:7f:395a:35b6 with SMTP id r14csp326674rbe; Thu, 29 Feb 2024 00:07:30 -0800 (PST) X-Forwarded-Encrypted: i=3; AJvYcCW+10t5SkOycgnh8F2dZcgWp6QtrEds4JIY0RCHLaq3qEvJurk1Ly1mY2BOR9NDqOMojAaBapxbUjBoGITTqdSIiPV2sqc4jfEj0M1pSw== X-Google-Smtp-Source: AGHT+IGgtKFaCEf52E2B5j8ay94+uaEm8heGc9RY0VQ8O8wnGtvJBTpxDPOemwdikPqqIEOBZ1nf X-Received: by 2002:a17:906:eca5:b0:a44:4a94:a6c8 with SMTP id qh5-20020a170906eca500b00a444a94a6c8mr435060ejb.10.1709194049856; Thu, 29 Feb 2024 00:07:29 -0800 (PST) ARC-Seal: i=2; a=rsa-sha256; t=1709194049; cv=pass; d=google.com; s=arc-20160816; b=MQimppSlNebowoJMDfrHDocFsM6146H1cCS6Z2pFr/U0ANTFzWURg/bgfOuLwvbptD RVtrClbDUQjqEpTDIKbGlKmHUS6gOEMgMCbMSXqxup2hoQ3d4ZRJGPl08U86mybo6blR g2pm63O6SqGw4CZjaMPBA6brCDk29koQYkYse6GZ/aj4GrcZLKOiXf9RsirSzl/LqcS4 DYmhPlcAQi/Gbejd4Zza08AmsBeQV73GBUoQp8hY3XzNzacdY+h7FJ+BAL0dHGnR+hpO Mu4L/YnrgeE4xr5sa0sRLijmS49vIpOuK8hQaFkHb1PNcFyf2mmLkJQ1wP3ChCiG4Tg6 lOCQ== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:list-unsubscribe:list-subscribe:list-id:precedence :dkim-signature; bh=4Fjor6Y//rHfiKR7Cn/FDO5AIMMBBf+dphuZxWmVAmY=; fh=KcREMJmj4ZplEwJcmpk43qOxBplT3QCzy33iA0TBGCg=; b=nedqZrOHrnHbtFBPfp3Ix6626ELBLPexUwMCpA0A8lzqtFsUC1LgA1oEuGkX3m2a+M s8+xOzkEr0frpH4KWRUNB6pjOSagfoNgZcKQAbRgC2/Ks/ItP5ngo8CdBhaWXcP8rTKD qk0y/5qHSMr+Szc4ZuAo2oTYPS3xyo/Ok55TIQyeLPTHr3WYLTjj7QoKXl1yLYxtfi5B EiP45xvW6tDYqq+w8huC49AjdS7O8hh/fNfs41dynOnTyDAuGE5Z5YasvFWYBwezmJV3 IUPM1dGDBeyjslxgnPGB+a4u2K9FmbIWOJCfaP4UwYcHiLZlPtq8UWGBCALoHR4TrwG8 xq9g==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@google.com header.s=20230601 header.b=2klkpU9Y; arc=pass (i=1 spf=pass spfdomain=google.com dkim=pass dkdomain=google.com dmarc=pass fromdomain=google.com); spf=pass (google.com: domain of linux-kernel+bounces-86265-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:4601:e00::3 as permitted sender) smtp.mailfrom="linux-kernel+bounces-86265-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Return-Path: Received: from am.mirrors.kernel.org (am.mirrors.kernel.org. [2604:1380:4601:e00::3]) by mx.google.com with ESMTPS id lf13-20020a170907174d00b00a44323561d5si375346ejc.432.2024.02.29.00.07.29 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 29 Feb 2024 00:07:29 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel+bounces-86265-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:4601:e00::3 as permitted sender) client-ip=2604:1380:4601:e00::3; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20230601 header.b=2klkpU9Y; arc=pass (i=1 spf=pass spfdomain=google.com dkim=pass dkdomain=google.com dmarc=pass fromdomain=google.com); spf=pass (google.com: domain of linux-kernel+bounces-86265-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:4601:e00::3 as permitted sender) smtp.mailfrom="linux-kernel+bounces-86265-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by am.mirrors.kernel.org (Postfix) with ESMTPS id 7313B1F20F51 for ; Thu, 29 Feb 2024 08:07:29 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 71E5E481CD; Thu, 29 Feb 2024 08:07:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="2klkpU9Y" Received: from mail-wm1-f47.google.com (mail-wm1-f47.google.com [209.85.128.47]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 54B6347F73 for ; Thu, 29 Feb 2024 08:07:18 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.47 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1709194040; cv=none; b=ALhLWJnFZ9aXr6H+8Z15sQQCnnxKN/n/KF+gIOlx25IdJRSFDR5r3zfeVgBBaPNKTs4MEh8vdfVQeGEWdvWbgpZMzh0zEQEoFlkQ39FNa6YmQSHw+QLxRZWuhumeVPL96tr72/26wBl31fXik2Lc06U6s8Qe1vp4kk7czU6ksYo= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1709194040; c=relaxed/simple; bh=Zo0ojnXys1cbTRl7RfWuu8qjSBcQQaK7ILw+QWklT70=; h=MIME-Version:References:In-Reply-To:From:Date:Message-ID:Subject: To:Cc:Content-Type; b=oby3lNTde9ce/uNaCWzsBplbDC2jM4mEjog5Xyaz2g6bm+Y1KFEIyMiIHW+WiLn08VQgROUynep/YyIdCFmozad0fVUoRO4d6mLmu6WbIjf1HWqbUe3+jvfhvjSO20w7ac+AWe6VRxZyiEZ0ywxsyGZ848pdazTt3x/7sdjsB/s= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=2klkpU9Y; arc=none smtp.client-ip=209.85.128.47 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=google.com Received: by mail-wm1-f47.google.com with SMTP id 5b1f17b1804b1-4129a748420so53835e9.0 for ; Thu, 29 Feb 2024 00:07:18 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1709194037; x=1709798837; darn=vger.kernel.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=4Fjor6Y//rHfiKR7Cn/FDO5AIMMBBf+dphuZxWmVAmY=; b=2klkpU9YmZlKufGnhR/vkIcG/qnrlOJ6kEMlnCiC3mhWaExE9PAZPay3L9+sBeZgJI ok+8h9i8C0qY2MHlgmHDxM7lA1meTedZAfEv2BNO2dcKZVI0+VJE0NkwEcDWIAzr6VQw TWyfr0cCXk1S/GK5+6LIe40NhfVcGlQrluWCodPCWRaSi4QIpJPM+j2gs3N8syoGwJJN D6N+nw74DLZ/2YzUclTzPC0ZdB2/2hI8nuiNhqS+uWkEWQq9Mf76eJxdsRBppVocSxth Ml1HAIUXC3I9RnndpSMUar2wAjvX0YWTUsF5KcBP2/MrbSCOE4QXBAUmQ/fb5h9rCzqx Zqhg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1709194037; x=1709798837; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=4Fjor6Y//rHfiKR7Cn/FDO5AIMMBBf+dphuZxWmVAmY=; b=llfLeMW0Vw8zk+cdFoE45vshug2Zo3sOVfD+E8oQ9OWzJu1VtjjUhg0QNm/gfZUADs iPuHtKs1XlaRhQC/POq9yKTNn44qYCAnD80QLqODi9DVaPEl5/aL1mTgo7N3LPJlaGfQ HPVjWLqcSzes5U8GRRc1QLxgKy15ev3aqet7+j0VX1ey4MsOkGlcSXPq+Ez+oSFlCyNE OhGwGeEyDbmaA58M0LahzpChBMguqzDwc+9kZBv7ynMr8MDkbMzaMInTtP3H5AMyUHGQ t03c5A2A99DxuFISEorkqxGDQRAOX91h3ilGYoaSBXzE5mDhrec4wH0eIU1sVQltLAWm mPdQ== X-Forwarded-Encrypted: i=1; AJvYcCW9W8egxjZB6m8fKAso/AO65jUQ+7LEEF1G/3Q9dkf98hfQNIcshDVvkLhxBITeBcYxmhpq3GM1YUpaJN5pLGMnrbXibWwsz6XlOmOQ X-Gm-Message-State: AOJu0YxtHOpB9I3c+TUxAoNDUIQ76PVGS6NdTi9WSPRGTUlO0XA5VA3I 0UE9mlYSfgF9oamujHctLyRQtO9ImfHpF8P6tMTs4ug+c6PkNs2RjH8YvEkhRoIpCvKPv546m9i BrF0uHw66roAFZG6NXpmVekjUyxeeO9OLoOLG X-Received: by 2002:a05:600c:a386:b0:412:aa80:bdd9 with SMTP id hn6-20020a05600ca38600b00412aa80bdd9mr86479wmb.2.1709194036479; Thu, 29 Feb 2024 00:07:16 -0800 (PST) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 References: <7ae930a7-3b10-4470-94ee-89cb650b3349@csgroup.eu> <9b4ce664-3ddb-4789-9d5d-8824f9089c48@csgroup.eu> <02bb92c3-a14c-4a77-a3b0-a7c857d1d60d@roeck-us.net> In-Reply-To: From: David Gow Date: Thu, 29 Feb 2024 16:07:03 +0800 Message-ID: Subject: Re: [PATCH v10] lib: checksum: Use aligned accesses for ip_fast_csum and csum_ipv6_magic tests To: Guenter Roeck Cc: Geert Uytterhoeven , Christophe Leroy , Charlie Jenkins , "Russell King (Oracle)" , David Laight , Palmer Dabbelt , Andrew Morton , Helge Deller , "James E.J. Bottomley" , Parisc List , Arnd Bergmann , "linux-kernel@vger.kernel.org" , Palmer Dabbelt , Linux ARM , "open list:KERNEL SELFTEST FRAMEWORK" , KUnit Development Content-Type: multipart/signed; protocol="application/pkcs7-signature"; micalg=sha-256; boundary="0000000000006d72e4061280bf7e" --0000000000006d72e4061280bf7e Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Wed, 28 Feb 2024 at 23:40, Guenter Roeck wrote: > > On 2/28/24 02:15, Geert Uytterhoeven wrote: > > CC testing > > > > On Wed, Feb 28, 2024 at 8:59=E2=80=AFAM Guenter Roeck wrote: > >> On 2/27/24 23:25, Christophe Leroy wrote: > >> [ ... ] > >>>> > >>>> This test case is supposed to be as true to the "general case" as > >>>> possible, so I have aligned the data along 14 + NET_IP_ALIGN. On ARM > >>>> this will be a 16-byte boundary since NET_IP_ALIGN is 2. A driver th= at > >>>> does not follow this may not be appropriately tested by this test ca= se, > >>>> but anyone is welcome to submit additional test cases that address t= his > >>>> additional alignment concern. > >>> > >>> But then this test case is becoming less and less true to the "genera= l > >>> case" with this patch, whereas your initial implementation was almost > >>> perfect as it was covering most cases, a lot more than what we get wi= th > >>> that patch applied. > >>> > >> NP with me if that is where people want to go. I'll simply disable che= cksum > >> tests on all architectures which don't support unaligned accesses (so = far > >> it looks like that is only arm with thumb instructions, and possibly n= ios2). > >> I personally find that less desirable and would have preferred a secon= d > >> configurable set of tests for unaligned accesses, but I have no proble= m > >> with it. > > > > IMHO the tests should validate the expected functionality. If a test > > fails, either functionality is missing or behaves wrong, or the test > > is wrong. > > > > What is the point of writing tests for a core functionality like networ= k > > checksumming that do not match the expected functionality? > > > > Tough one. I can't enable CONFIG_NET_TEST on nios2, parisc, and arm with = THUMB > enabled due to crashes or hangs in gso tests. I accept that. Downside is = that I > have to disable CONFIG_NET_TEST on those architectures/platforms entirely= , > meaning a whole class of tests are missing for those architectures. I wou= ld > prefer to have a configuration option such as CONFIG_NET_GSO_TEST to let = me > disable the problematic tests for the affected platforms so I can run all > the other network unit tests. Yes, obviously something is wrong either wi= th > the affected tests or with the implementation of the tested functionality > on the affected systems, but that could be handled separately if a separa= te > configuration option existed, and new regressions in other tests on the a= ffected > architectures could be identified as they happen. > > This case is similar. I'd prefer to have a separate configuration option, > say, CONFIG_CHECKSUM_MISALIGNED_KUNIT, which I can disable to be able to > run the common checksum tests on platforms / architectures which don't > support unaligned accesses. > > However, as I said, if the community wants to take a harsh stance, I have= no > problem with just disabling groups of tests entirely on platforms which h= ave > a problem with part of it. > > Guenter > I think the ideal solution is for there to be some official stance on the required alignment, for every architecture to support that, and for the tests to exercise it. Now, judging from the sheer number of replies in this thread, it seems like there isn't any real agreement on that. (From my quick reading of some of the checksum code, my assumption was that this was either 1- or 2- byte alignment required, with 4-byte alignment being ideal for performance reasons in most setups). If different architectures have different alignment requirements (ouch!), my feeling is that the test suite should be written to the maximum such alignment (as any non-architecture-specific code will need to align things anyway), and architectures/drivers with non-aligned buffers can have their own tests. If it turns out there are a lot of such drivers/architectures, then we can add the extra config option. I'd rather, if there is a config option to disable these tests, it be of the form ARCH_HAS_UNALIGNED_CHECKSUM to enable it, or similar. There's also the option of having the test 'skip' itself on a configuration which doesn't support it. That way it'll still show up in the list of tests, but with a description, like "Disabled due to checksum alignment requirements" or something, which may be more obvious to people debugging it later. For the gso test hangs, I think it's probably quite sensible to have a config option for the GSO tests generally. I'd be more hesitant to have a separate CONFIG_NET_GSO_FREQUENTLY_BROKEN_TESTS, which is selected automatically by a bunch of architectures. At that point, I think we need to either just fix the bugs, or start thinking about a better solution for these tests / architectures. One of the things I'm hoping to work on this year is some improvements to KUnit tooling to automatically run tests across a wider set of architectures and configs, so test authors can catch this sort of thing before even sending patches out. We can do a bit of this with the manual --arch option to kunit.py, but very few people will test things across more than a couple of architectures, and rarely will we get good testing on the less common architectures, like 32-bit ones, big endian ones, or ones with stricter alignment requirements. So we can do better there. tl;dr: I think it's a good idea for tests to sit behind config options. Obviously they shouldn't be either too broad, or too granular, but common sense usually prevails here. I'd rather not have config options explicitly for "broken" tests, though: if you have to, try to make the config option for the missing/broken feature (HAS_xxx) rather than the test if possible. Otherwise, 'skip' the test, with a suitable reason string if you can. -- David --0000000000006d72e4061280bf7e Content-Type: application/pkcs7-signature; name="smime.p7s" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="smime.p7s" Content-Description: S/MIME Cryptographic Signature MIIPqgYJKoZIhvcNAQcCoIIPmzCCD5cCAQExDzANBglghkgBZQMEAgEFADALBgkqhkiG9w0BBwGg gg0EMIIEtjCCA56gAwIBAgIQeAMYYHb81ngUVR0WyMTzqzANBgkqhkiG9w0BAQsFADBMMSAwHgYD VQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UE AxMKR2xvYmFsU2lnbjAeFw0yMDA3MjgwMDAwMDBaFw0yOTAzMTgwMDAwMDBaMFQxCzAJBgNVBAYT AkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMSowKAYDVQQDEyFHbG9iYWxTaWduIEF0bGFz IFIzIFNNSU1FIENBIDIwMjAwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvLe9xPU9W dpiHLAvX7kFnaFZPuJLey7LYaMO8P/xSngB9IN73mVc7YiLov12Fekdtn5kL8PjmDBEvTYmWsuQS 6VBo3vdlqqXZ0M9eMkjcKqijrmDRleudEoPDzTumwQ18VB/3I+vbN039HIaRQ5x+NHGiPHVfk6Rx c6KAbYceyeqqfuJEcq23vhTdium/Bf5hHqYUhuJwnBQ+dAUcFndUKMJrth6lHeoifkbw2bv81zxJ I9cvIy516+oUekqiSFGfzAqByv41OrgLV4fLGCDH3yRh1tj7EtV3l2TngqtrDLUs5R+sWIItPa/4 AJXB1Q3nGNl2tNjVpcSn0uJ7aFPbAgMBAAGjggGKMIIBhjAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0l BBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMEMBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFHzM CmjXouseLHIb0c1dlW+N+/JjMB8GA1UdIwQYMBaAFI/wS3+oLkUkrk1Q+mOai97i3Ru8MHsGCCsG AQUFBwEBBG8wbTAuBggrBgEFBQcwAYYiaHR0cDovL29jc3AyLmdsb2JhbHNpZ24uY29tL3Jvb3Ry MzA7BggrBgEFBQcwAoYvaHR0cDovL3NlY3VyZS5nbG9iYWxzaWduLmNvbS9jYWNlcnQvcm9vdC1y My5jcnQwNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5nbG9iYWxzaWduLmNvbS9yb290LXIz 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 7xDrOPfX3COqq162RFg/MFcGA1UdIARQME4wCQYHZ4EMAQUBATBBBgkrBgEEAaAyASgwNDAyBggr BgEFBQcCARYmaHR0cHM6Ly93d3cuZ2xvYmFsc2lnbi5jb20vcmVwb3NpdG9yeS8wDAYDVR0TAQH/ BAIwADCBmgYIKwYBBQUHAQEEgY0wgYowPgYIKwYBBQUHMAGGMmh0dHA6Ly9vY3NwLmdsb2JhbHNp Z24uY29tL2NhL2dzYXRsYXNyM3NtaW1lY2EyMDIwMEgGCCsGAQUFBzAChjxodHRwOi8vc2VjdXJl Lmdsb2JhbHNpZ24uY29tL2NhY2VydC9nc2F0bGFzcjNzbWltZWNhMjAyMC5jcnQwHwYDVR0jBBgw FoAUfMwKaNei6x4schvRzV2Vb4378mMwRgYDVR0fBD8wPTA7oDmgN4Y1aHR0cDovL2NybC5nbG9i YWxzaWduLmNvbS9jYS9nc2F0bGFzcjNzbWltZWNhMjAyMC5jcmwwDQYJKoZIhvcNAQELBQADggEB AK0lDd6/eSh3qHmXaw1YUfIFy07B25BEcTvWgOdla99gF1O7sOsdYaTz/DFkZI5ghjgaPJCovgla mRMfNcxZCfoBtsB7mAS6iOYjuwFOZxi9cv6jhfiON6b89QWdMaPeDddg/F2Q0bxZ9Z2ZEBxyT34G wlDp+1p6RAqlDpHifQJW16h5jWIIwYisvm5QyfxQEVc+XH1lt+taSzCfiBT0ZLgjB9Sg+zAo8ys6 5PHxFaT2a5Td/fj5yJ5hRSrqy/nj/hjT14w3/ZdX5uWg+cus6VjiiR/5qGSZRjHt8JoApD6t6/tg ITv8ZEy6ByumbU23nkHTMOzzQSxczHkT+0q10/MxggJqMIICZgIBATBoMFQxCzAJBgNVBAYTAkJF MRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMSowKAYDVQQDEyFHbG9iYWxTaWduIEF0bGFzIFIz IFNNSU1FIENBIDIwMjACEAHS+TgZvH/tCq5FcDC0n9IwDQYJYIZIAWUDBAIBBQCggdQwLwYJKoZI hvcNAQkEMSIEIIVyzxSwGRZg5JxRkLSUHB9wqFyP3fi9S3bEMxHOaqQZMBgGCSqGSIb3DQEJAzEL BgkqhkiG9w0BBwEwHAYJKoZIhvcNAQkFMQ8XDTI0MDIyOTA4MDcxNlowaQYJKoZIhvcNAQkPMVww WjALBglghkgBZQMEASowCwYJYIZIAWUDBAEWMAsGCWCGSAFlAwQBAjAKBggqhkiG9w0DBzALBgkq hkiG9w0BAQowCwYJKoZIhvcNAQEHMAsGCWCGSAFlAwQCATANBgkqhkiG9w0BAQEFAASCAQCDxswZ cKnmei1SJwfjeHXR0YMr0Z2iYl0creflrItGTE7s+blJ9TiaTxsaJe3oL+tWN0apNBEHLK9qLdJS aj9qaWYpR72y475W/35MlQsGY+d+y9JwJmx+mALFanQ9c5TIGy4VV+95rza80KBzxEhDCsjXgrIu wdh1wwSVFROaGetcp+6L+haJnpuKz1y7ZpyXiLfBnTdjFRTxXabybXO3BAxm1eqAulWzFox1foFw Wm3d4K5ejtfWQjbKr+uAXLaX8EVUXq1n82/yXgkR8Gf69Jo/vQw+Z05i2n5q1n1Wb4poGvVeqrHm Rsc0wLmPOYQadOCMyhpMj7r3Smn+qL8s --0000000000006d72e4061280bf7e--