Skip to content

Commit 6419c6f

Browse files
nodejs-github-botmarco-ippolito
authored andcommitted
deps: update icu to 76.1
PR-URL: #55551 Reviewed-By: Michaël Zasso <targos@protonmail.com> Reviewed-By: Richard Lau <rlau@redhat.com>
1 parent bb92146 commit 6419c6f

File tree

414 files changed

+42422
-16007
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

414 files changed

+42422
-16007
lines changed

deps/icu-small/LICENSE

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -433,6 +433,34 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
433433

434434
----------------------------------------------------------------------
435435

436+
JSON parsing library (nlohmann/json)
437+
438+
File: vendor/json/upstream/single_include/nlohmann/json.hpp (only for ICU4C)
439+
440+
MIT License
441+
442+
Copyright (c) 2013-2022 Niels Lohmann
443+
444+
Permission is hereby granted, free of charge, to any person obtaining a copy
445+
of this software and associated documentation files (the "Software"), to deal
446+
in the Software without restriction, including without limitation the rights
447+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
448+
copies of the Software, and to permit persons to whom the Software is
449+
furnished to do so, subject to the following conditions:
450+
451+
The above copyright notice and this permission notice shall be included in all
452+
copies or substantial portions of the Software.
453+
454+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
455+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
456+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
457+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
458+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
459+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
460+
SOFTWARE.
461+
462+
----------------------------------------------------------------------
463+
436464
File: aclocal.m4 (only for ICU4C)
437465
Section: pkg.m4 - Macros to locate and utilise pkg-config.
438466

@@ -473,7 +501,7 @@ File: config.guess (only for ICU4C)
473501

474502
This file is free software; you can redistribute it and/or modify it
475503
under the terms of the GNU General Public License as published by
476-
the Free Software Foundation; either version 3 of the License, or
504+
the Free Software Foundation, either version 3 of the License, or
477505
(at your option) any later version.
478506

479507
This program is distributed in the hope that it will be useful, but

deps/icu-small/README-FULL-ICU.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
ICU sources - auto generated by shrink-icu-src.py
22

33
This directory contains the ICU subset used by --with-intl=full-icu
4-
It is a strict subset of ICU 75 source files with the following exception(s):
5-
* deps/icu-small/source/data/in/icudt75l.dat.bz2 : compressed data file
4+
It is a strict subset of ICU 76 source files with the following exception(s):
5+
* deps/icu-small/source/data/in/icudt76l.dat.bz2 : compressed data file
66

77

88
To rebuild this directory, see ../../tools/icu/README.md

deps/icu-small/source/common/appendable.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ Appendable::~Appendable() {}
2525
UBool
2626
Appendable::appendCodePoint(UChar32 c) {
2727
if(c<=0xffff) {
28-
return appendCodeUnit((char16_t)c);
28+
return appendCodeUnit(static_cast<char16_t>(c));
2929
} else {
3030
return appendCodeUnit(U16_LEAD(c)) && appendCodeUnit(U16_TRAIL(c));
3131
}

deps/icu-small/source/common/bmpset.cpp

Lines changed: 28 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ static void set32x64Bits(uint32_t table[64], int32_t start, int32_t limit) {
7575
int32_t trail=start&0x3f; // Named for UTF-8 2-byte trail byte with lower 6 bits.
7676

7777
// Set one bit indicating an all-one block.
78-
uint32_t bits=(uint32_t)1<<lead;
78+
uint32_t bits = static_cast<uint32_t>(1) << lead;
7979
if((start+1)==limit) { // Single-character shortcut.
8080
table[trail]|=bits;
8181
return;
@@ -100,9 +100,9 @@ static void set32x64Bits(uint32_t table[64], int32_t start, int32_t limit) {
100100
++lead;
101101
}
102102
if(lead<limitLead) {
103-
bits=~(((unsigned)1<<lead)-1);
103+
bits = ~((static_cast<unsigned>(1) << lead) - 1);
104104
if(limitLead<0x20) {
105-
bits&=((unsigned)1<<limitLead)-1;
105+
bits &= (static_cast<unsigned>(1) << limitLead) - 1;
106106
}
107107
for(trail=0; trail<64; ++trail) {
108108
table[trail]|=bits;
@@ -111,7 +111,7 @@ static void set32x64Bits(uint32_t table[64], int32_t start, int32_t limit) {
111111
// limit<=0x800. If limit==0x800 then limitLead=32 and limitTrail=0.
112112
// In that case, bits=1<<limitLead is undefined but the bits value
113113
// is not used because trail<limitTrail is already false.
114-
bits=(uint32_t)1<<((limitLead == 0x20) ? (limitLead - 1) : limitLead);
114+
bits = static_cast<uint32_t>(1) << ((limitLead == 0x20) ? (limitLead - 1) : limitLead);
115115
for(trail=0; trail<limitTrail; ++trail) {
116116
table[trail]|=bits;
117117
}
@@ -290,22 +290,22 @@ int32_t BMPSet::findCodePoint(UChar32 c, int32_t lo, int32_t hi) const {
290290

291291
UBool
292292
BMPSet::contains(UChar32 c) const {
293-
if((uint32_t)c<=0xff) {
294-
return (UBool)latin1Contains[c];
295-
} else if((uint32_t)c<=0x7ff) {
296-
return (UBool)((table7FF[c&0x3f]&((uint32_t)1<<(c>>6)))!=0);
297-
} else if((uint32_t)c<0xd800 || (c>=0xe000 && c<=0xffff)) {
293+
if (static_cast<uint32_t>(c) <= 0xff) {
294+
return latin1Contains[c];
295+
} else if (static_cast<uint32_t>(c) <= 0x7ff) {
296+
return (table7FF[c & 0x3f] & (static_cast<uint32_t>(1) << (c >> 6))) != 0;
297+
} else if (static_cast<uint32_t>(c) < 0xd800 || (c >= 0xe000 && c <= 0xffff)) {
298298
int lead=c>>12;
299299
uint32_t twoBits=(bmpBlockBits[(c>>6)&0x3f]>>lead)&0x10001;
300300
if(twoBits<=1) {
301301
// All 64 code points with the same bits 15..6
302302
// are either in the set or not.
303-
return (UBool)twoBits;
303+
return twoBits;
304304
} else {
305305
// Look up the code point in its 4k block of code points.
306306
return containsSlow(c, list4kStarts[lead], list4kStarts[lead+1]);
307307
}
308-
} else if((uint32_t)c<=0x10ffff) {
308+
} else if (static_cast<uint32_t>(c) <= 0x10ffff) {
309309
// surrogate or supplementary code point
310310
return containsSlow(c, list4kStarts[0xd], list4kStarts[0x11]);
311311
} else {
@@ -332,7 +332,7 @@ BMPSet::span(const char16_t *s, const char16_t *limit, USetSpanCondition spanCon
332332
break;
333333
}
334334
} else if(c<=0x7ff) {
335-
if((table7FF[c&0x3f]&((uint32_t)1<<(c>>6)))==0) {
335+
if ((table7FF[c & 0x3f] & (static_cast<uint32_t>(1) << (c >> 6))) == 0) {
336336
break;
337337
}
338338
} else if(c<0xd800 || c>=0xe000) {
@@ -372,7 +372,7 @@ BMPSet::span(const char16_t *s, const char16_t *limit, USetSpanCondition spanCon
372372
break;
373373
}
374374
} else if(c<=0x7ff) {
375-
if((table7FF[c&0x3f]&((uint32_t)1<<(c>>6)))!=0) {
375+
if ((table7FF[c & 0x3f] & (static_cast<uint32_t>(1) << (c >> 6))) != 0) {
376376
break;
377377
}
378378
} else if(c<0xd800 || c>=0xe000) {
@@ -421,7 +421,7 @@ BMPSet::spanBack(const char16_t *s, const char16_t *limit, USetSpanCondition spa
421421
break;
422422
}
423423
} else if(c<=0x7ff) {
424-
if((table7FF[c&0x3f]&((uint32_t)1<<(c>>6)))==0) {
424+
if ((table7FF[c & 0x3f] & (static_cast<uint32_t>(1) << (c >> 6))) == 0) {
425425
break;
426426
}
427427
} else if(c<0xd800 || c>=0xe000) {
@@ -464,7 +464,7 @@ BMPSet::spanBack(const char16_t *s, const char16_t *limit, USetSpanCondition spa
464464
break;
465465
}
466466
} else if(c<=0x7ff) {
467-
if((table7FF[c&0x3f]&((uint32_t)1<<(c>>6)))!=0) {
467+
if ((table7FF[c & 0x3f] & (static_cast<uint32_t>(1) << (c >> 6))) != 0) {
468468
break;
469469
}
470470
} else if(c<0xd800 || c>=0xe000) {
@@ -527,7 +527,7 @@ BMPSet::spanUTF8(const uint8_t *s, int32_t length, USetSpanCondition spanConditi
527527
b=*s;
528528
} while(U8_IS_SINGLE(b));
529529
}
530-
length=(int32_t)(limit-s);
530+
length = static_cast<int32_t>(limit - s);
531531
}
532532

533533
if(spanCondition!=USET_SPAN_NOT_CONTAINED) {
@@ -547,7 +547,7 @@ BMPSet::spanUTF8(const uint8_t *s, int32_t length, USetSpanCondition spanConditi
547547
* the truncated sequence.
548548
*/
549549
b=*(limit-1);
550-
if((int8_t)b<0) {
550+
if (static_cast<int8_t>(b) < 0) {
551551
// b>=0x80: lead or trail byte
552552
if(b<0xc0) {
553553
// single trail byte, check for preceding 3- or 4-byte lead byte
@@ -602,15 +602,15 @@ BMPSet::spanUTF8(const uint8_t *s, int32_t length, USetSpanCondition spanConditi
602602
if(b>=0xe0) {
603603
if(b<0xf0) {
604604
if( /* handle U+0000..U+FFFF inline */
605-
(t1=(uint8_t)(s[0]-0x80)) <= 0x3f &&
606-
(t2=(uint8_t)(s[1]-0x80)) <= 0x3f
605+
(t1 = static_cast<uint8_t>(s[0] - 0x80)) <= 0x3f &&
606+
(t2 = static_cast<uint8_t>(s[1] - 0x80)) <= 0x3f
607607
) {
608608
b&=0xf;
609609
uint32_t twoBits=(bmpBlockBits[t1]>>b)&0x10001;
610610
if(twoBits<=1) {
611611
// All 64 code points with this lead byte and middle trail byte
612612
// are either in the set or not.
613-
if(twoBits!=(uint32_t)spanCondition) {
613+
if (twoBits != static_cast<uint32_t>(spanCondition)) {
614614
return s-1;
615615
}
616616
} else {
@@ -624,12 +624,12 @@ BMPSet::spanUTF8(const uint8_t *s, int32_t length, USetSpanCondition spanConditi
624624
continue;
625625
}
626626
} else if( /* handle U+10000..U+10FFFF inline */
627-
(t1=(uint8_t)(s[0]-0x80)) <= 0x3f &&
628-
(t2=(uint8_t)(s[1]-0x80)) <= 0x3f &&
629-
(t3=(uint8_t)(s[2]-0x80)) <= 0x3f
627+
(t1 = static_cast<uint8_t>(s[0] - 0x80)) <= 0x3f &&
628+
(t2 = static_cast<uint8_t>(s[1] - 0x80)) <= 0x3f &&
629+
(t3 = static_cast<uint8_t>(s[2] - 0x80)) <= 0x3f
630630
) {
631631
// Give an illegal sequence the same value as the result of contains(FFFD).
632-
UChar32 c=((UChar32)(b-0xf0)<<18)|((UChar32)t1<<12)|(t2<<6)|t3;
632+
UChar32 c = (static_cast<UChar32>(b - 0xf0) << 18) | (static_cast<UChar32>(t1) << 12) | (t2 << 6) | t3;
633633
if( ( (0x10000<=c && c<=0x10ffff) ?
634634
containsSlow(c, list4kStarts[0x10], list4kStarts[0x11]) :
635635
containsFFFD
@@ -643,9 +643,9 @@ BMPSet::spanUTF8(const uint8_t *s, int32_t length, USetSpanCondition spanConditi
643643
} else {
644644
if( /* handle U+0000..U+07FF inline */
645645
b>=0xc0 &&
646-
(t1=(uint8_t)(*s-0x80)) <= 0x3f
646+
(t1 = static_cast<uint8_t>(*s - 0x80)) <= 0x3f
647647
) {
648-
if((USetSpanCondition)((table7FF[t1]&((uint32_t)1<<(b&0x1f)))!=0) != spanCondition) {
648+
if (static_cast<USetSpanCondition>((table7FF[t1] & (static_cast<uint32_t>(1) << (b & 0x1f))) != 0) != spanCondition) {
649649
return s-1;
650650
}
651651
++s;
@@ -711,7 +711,7 @@ BMPSet::spanBackUTF8(const uint8_t *s, int32_t length, USetSpanCondition spanCon
711711
c=utf8_prevCharSafeBody(s, 0, &length, b, -3);
712712
// c is a valid code point, not ASCII, not a surrogate
713713
if(c<=0x7ff) {
714-
if((USetSpanCondition)((table7FF[c&0x3f]&((uint32_t)1<<(c>>6)))!=0) != spanCondition) {
714+
if (static_cast<USetSpanCondition>((table7FF[c & 0x3f] & (static_cast<uint32_t>(1) << (c >> 6))) != 0) != spanCondition) {
715715
return prev+1;
716716
}
717717
} else if(c<=0xffff) {
@@ -720,7 +720,7 @@ BMPSet::spanBackUTF8(const uint8_t *s, int32_t length, USetSpanCondition spanCon
720720
if(twoBits<=1) {
721721
// All 64 code points with the same bits 15..6
722722
// are either in the set or not.
723-
if(twoBits!=(uint32_t)spanCondition) {
723+
if (twoBits != static_cast<uint32_t>(spanCondition)) {
724724
return prev+1;
725725
}
726726
} else {

deps/icu-small/source/common/bmpset.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ class BMPSet : public UMemory {
156156
};
157157

158158
inline UBool BMPSet::containsSlow(UChar32 c, int32_t lo, int32_t hi) const {
159-
return (UBool)(findCodePoint(c, lo, hi) & 1);
159+
return findCodePoint(c, lo, hi) & 1;
160160
}
161161

162162
U_NAMESPACE_END

deps/icu-small/source/common/brkeng.cpp

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ UnhandledEngine::findBreaks( UText *text,
8686
if (U_FAILURE(status)) return 0;
8787
utext_setNativeIndex(text, startPos);
8888
UChar32 c = utext_current32(text);
89-
while((int32_t)utext_getNativeIndex(text) < endPos && fHandled->contains(c)) {
89+
while (static_cast<int32_t>(utext_getNativeIndex(text)) < endPos && fHandled->contains(c)) {
9090
utext_next32(text); // TODO: recast loop to work with post-increment operations.
9191
c = utext_current32(text);
9292
}
@@ -146,7 +146,7 @@ ICULanguageBreakFactory::getEngineFor(UChar32 c, const char* locale) {
146146
Mutex m(&gBreakEngineMutex);
147147
int32_t i = fEngines->size();
148148
while (--i >= 0) {
149-
lbe = (const LanguageBreakEngine *)(fEngines->elementAt(i));
149+
lbe = static_cast<const LanguageBreakEngine*>(fEngines->elementAt(i));
150150
if (lbe != nullptr && lbe->handles(c, locale)) {
151151
return lbe;
152152
}
@@ -259,7 +259,7 @@ ICULanguageBreakFactory::loadDictionaryMatcherFor(UScriptCode script) {
259259
CharString ext;
260260
const char16_t *extStart = u_memrchr(dictfname, 0x002e, dictnlength); // last dot
261261
if (extStart != nullptr) {
262-
int32_t len = (int32_t)(extStart - dictfname);
262+
int32_t len = static_cast<int32_t>(extStart - dictfname);
263263
ext.appendInvariantChars(UnicodeString(false, extStart + 1, dictnlength - len - 1), status);
264264
dictnlength = len;
265265
}
@@ -269,18 +269,18 @@ ICULanguageBreakFactory::loadDictionaryMatcherFor(UScriptCode script) {
269269
UDataMemory *file = udata_open(U_ICUDATA_BRKITR, ext.data(), dictnbuf.data(), &status);
270270
if (U_SUCCESS(status)) {
271271
// build trie
272-
const uint8_t *data = (const uint8_t *)udata_getMemory(file);
273-
const int32_t *indexes = (const int32_t *)data;
272+
const uint8_t* data = static_cast<const uint8_t*>(udata_getMemory(file));
273+
const int32_t* indexes = reinterpret_cast<const int32_t*>(data);
274274
const int32_t offset = indexes[DictionaryData::IX_STRING_TRIE_OFFSET];
275275
const int32_t trieType = indexes[DictionaryData::IX_TRIE_TYPE] & DictionaryData::TRIE_TYPE_MASK;
276276
DictionaryMatcher *m = nullptr;
277277
if (trieType == DictionaryData::TRIE_TYPE_BYTES) {
278278
const int32_t transform = indexes[DictionaryData::IX_TRANSFORM];
279-
const char *characters = (const char *)(data + offset);
279+
const char* characters = reinterpret_cast<const char*>(data + offset);
280280
m = new BytesDictionaryMatcher(characters, transform, file);
281281
}
282282
else if (trieType == DictionaryData::TRIE_TYPE_UCHARS) {
283-
const char16_t *characters = (const char16_t *)(data + offset);
283+
const char16_t* characters = reinterpret_cast<const char16_t*>(data + offset);
284284
m = new UCharsDictionaryMatcher(characters, file);
285285
}
286286
if (m == nullptr) {
@@ -337,12 +337,12 @@ int32_t BreakEngineWrapper::findBreaks(
337337
// extends towards the start or end of the text, depending on 'reverse'.
338338

339339
utext_setNativeIndex(text, startPos);
340-
int32_t start = (int32_t)utext_getNativeIndex(text);
340+
int32_t start = static_cast<int32_t>(utext_getNativeIndex(text));
341341
int32_t current;
342342
int32_t rangeStart;
343343
int32_t rangeEnd;
344344
UChar32 c = utext_current32(text);
345-
while((current = (int32_t)utext_getNativeIndex(text)) < endPos && delegate->handles(c)) {
345+
while ((current = static_cast<int32_t>(utext_getNativeIndex(text))) < endPos && delegate->handles(c)) {
346346
utext_next32(text); // TODO: recast loop for postincrement
347347
c = utext_current32(text);
348348
}

deps/icu-small/source/common/brkiter.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ BreakIterator::buildInstance(const Locale& loc, const char *type, UErrorCode &st
8585
// Get the actual string
8686
brkfname = ures_getString(brkName, &size, &status);
8787
U_ASSERT((size_t)size<sizeof(fnbuff));
88-
if ((size_t)size>=sizeof(fnbuff)) {
88+
if (static_cast<size_t>(size) >= sizeof(fnbuff)) {
8989
size=0;
9090
if (U_SUCCESS(status)) {
9191
status = U_BUFFER_OVERFLOW_ERROR;
@@ -99,7 +99,7 @@ BreakIterator::buildInstance(const Locale& loc, const char *type, UErrorCode &st
9999
char16_t* extStart=u_strchr(brkfname, 0x002e);
100100
int len = 0;
101101
if (extStart != nullptr){
102-
len = (int)(extStart-brkfname);
102+
len = static_cast<int>(extStart - brkfname);
103103
u_UCharsToChars(extStart+1, ext, sizeof(ext)); // nul terminates the buff
104104
u_UCharsToChars(brkfname, fnbuff, len);
105105
}

deps/icu-small/source/common/bytesinkutil.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ ByteSinkUtil::appendChange(const uint8_t *s, const uint8_t *limit,
6464
errorCode = U_INDEX_OUTOFBOUNDS_ERROR;
6565
return false;
6666
}
67-
return appendChange((int32_t)(limit - s), s16, s16Length, sink, edits, errorCode);
67+
return appendChange(static_cast<int32_t>(limit - s), s16, s16Length, sink, edits, errorCode);
6868
}
6969

7070
void
@@ -81,15 +81,15 @@ ByteSinkUtil::appendCodePoint(int32_t length, UChar32 c, ByteSink &sink, Edits *
8181
namespace {
8282

8383
// See unicode/utf8.h U8_APPEND_UNSAFE().
84-
inline uint8_t getTwoByteLead(UChar32 c) { return (uint8_t)((c >> 6) | 0xc0); }
85-
inline uint8_t getTwoByteTrail(UChar32 c) { return (uint8_t)((c & 0x3f) | 0x80); }
84+
inline uint8_t getTwoByteLead(UChar32 c) { return static_cast<uint8_t>((c >> 6) | 0xc0); }
85+
inline uint8_t getTwoByteTrail(UChar32 c) { return static_cast<uint8_t>((c & 0x3f) | 0x80); }
8686

8787
} // namespace
8888

8989
void
9090
ByteSinkUtil::appendTwoBytes(UChar32 c, ByteSink &sink) {
9191
U_ASSERT(0x80 <= c && c <= 0x7ff); // 2-byte UTF-8
92-
char s8[2] = { (char)getTwoByteLead(c), (char)getTwoByteTrail(c) };
92+
char s8[2] = {static_cast<char>(getTwoByteLead(c)), static_cast<char>(getTwoByteTrail(c))};
9393
sink.Append(s8, 2);
9494
}
9595

@@ -114,7 +114,7 @@ ByteSinkUtil::appendUnchanged(const uint8_t *s, const uint8_t *limit,
114114
errorCode = U_INDEX_OUTOFBOUNDS_ERROR;
115115
return false;
116116
}
117-
int32_t length = (int32_t)(limit - s);
117+
int32_t length = static_cast<int32_t>(limit - s);
118118
if (length > 0) {
119119
appendNonEmptyUnchanged(s, length, sink, options, edits);
120120
}

deps/icu-small/source/common/bytesinkutil.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ class U_COMMON_API ByteSinkUtil {
7373
/** The few bytes at [src, nextSrc[ were mapped/changed to valid code point c. */
7474
static inline void appendCodePoint(const uint8_t *src, const uint8_t *nextSrc, UChar32 c,
7575
ByteSink &sink, Edits *edits = nullptr) {
76-
appendCodePoint((int32_t)(nextSrc - src), c, sink, edits);
76+
appendCodePoint(static_cast<int32_t>(nextSrc - src), c, sink, edits);
7777
}
7878

7979
/** Append the two-byte character (U+0080..U+07FF). */

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy