From 2ea416ee3d2a6fd6d2a74701b79231be2ebb0b71 Mon Sep 17 00:00:00 2001 From: Robert Muir Date: Thu, 21 Jun 2018 20:08:17 -0400 Subject: [PATCH] LUCENE-8366: Upgrade to ICU 62.1 --- lucene/CHANGES.txt | 4 + .../lucene/analysis/util/UnicodeProps.java | 6 +- .../analysis/icu/src/data/uax29/Default.rbbi | 46 +---- .../icu/src/data/utr30/DiacriticFolding.txt | 4 + .../icu/src/data/utr30/NativeDigitFolding.txt | 20 ++ .../segmentation/BreakIteratorWrapper.java | 12 +- lucene/analysis/icu/src/java/overview.html | 2 +- .../analysis/icu/segmentation/Default.brk | Bin 50760 -> 43176 bytes .../icu/segmentation/MyanmarSyllable.brk | Bin 21272 -> 21808 bytes .../org/apache/lucene/analysis/icu/utr30.nrm | Bin 59056 -> 59232 bytes .../Latin-dont-break-on-hyphens.rbbi | 187 ++++++++++++------ .../icu/segmentation/TestICUTokenizer.java | 15 ++ lucene/ivy-versions.properties | 2 +- lucene/licenses/icu4j-61.1.jar.sha1 | 1 - lucene/licenses/icu4j-62.1.jar.sha1 | 1 + solr/licenses/icu4j-61.1.jar.sha1 | 1 - solr/licenses/icu4j-62.1.jar.sha1 | 1 + 17 files changed, 194 insertions(+), 108 deletions(-) delete mode 100644 lucene/licenses/icu4j-61.1.jar.sha1 create mode 100644 lucene/licenses/icu4j-62.1.jar.sha1 delete mode 100644 solr/licenses/icu4j-61.1.jar.sha1 create mode 100644 solr/licenses/icu4j-62.1.jar.sha1 diff --git a/lucene/CHANGES.txt b/lucene/CHANGES.txt index e6125cec330..477f2610752 100644 --- a/lucene/CHANGES.txt +++ b/lucene/CHANGES.txt @@ -123,6 +123,10 @@ Changes in Runtime Behavior: * LUCENE-7976: TieredMergePolicy now respects maxSegmentSizeMB by default when executing findForcedMerges and findForcedDeletesMerges (Erick Erickson) +Other: + +* LUCENE-8366: Upgrade to ICU 62.1. Emoji handling now uses Unicode 11's + Extended_Pictographic property. (Robert Muir) ======================= Lucene 7.4.1 ======================= diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/util/UnicodeProps.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/util/UnicodeProps.java index 86870d0becf..3e1006546bc 100644 --- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/util/UnicodeProps.java +++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/util/UnicodeProps.java @@ -24,15 +24,15 @@ import org.apache.lucene.util.SparseFixedBitSet; /** * This file contains unicode properties used by various {@link CharTokenizer}s. - * The data was created using ICU4J v61.1.0.0 + * The data was created using ICU4J v62.1.0.0 *

- * Unicode version: 10.0.0.0 + * Unicode version: 11.0.0.0 */ public final class UnicodeProps { private UnicodeProps() {} /** Unicode version that was used to generate this file: {@value} */ - public static final String UNICODE_VERSION = "10.0.0.0"; + public static final String UNICODE_VERSION = "11.0.0.0"; /** Bitset with Unicode WHITESPACE code points. */ public static final Bits WHITESPACE = createBits( diff --git a/lucene/analysis/icu/src/data/uax29/Default.rbbi b/lucene/analysis/icu/src/data/uax29/Default.rbbi index afda68f47b5..b87fe7fcbf1 100644 --- a/lucene/analysis/icu/src/data/uax29/Default.rbbi +++ b/lucene/analysis/icu/src/data/uax29/Default.rbbi @@ -63,14 +63,10 @@ $MidNumLet = [\p{Word_Break = MidNumLet}]; $MidLetter = [\p{Word_Break = MidLetter}]; $MidNum = [\p{Word_Break = MidNum}]; $Numeric = [\p{Word_Break = Numeric}[[:Decomposition_Type=Wide:]&[:General_Category=Decimal_Number:]]]; -$ExtendNumLet = [\p{Word_Break = ExtendNumLet}]; -$E_Base = [\p{Word_Break = EB}]; -$E_Modifier = [\p{Word_Break = EM}]; -# Data for Extended Pictographic scraped from CLDR common/properties/ExtendedPictographic.txt, r13267 -$Extended_Pict = [\U0001F774-\U0001F77F\U00002700-\U00002701\U00002703-\U00002704\U0000270E\U00002710-\U00002711\U00002765-\U00002767\U0001F030-\U0001F093\U0001F094-\U0001F09F\U0001F10D-\U0001F10F\U0001F12F\U0001F16C-\U0001F16F\U0001F1AD-\U0001F1E5\U0001F260-\U0001F265\U0001F203-\U0001F20F\U0001F23C-\U0001F23F\U0001F249-\U0001F24F\U0001F252-\U0001F25F\U0001F266-\U0001F2FF\U0001F7D5-\U0001F7FF\U0001F000-\U0001F003\U0001F005-\U0001F02B\U0001F02C-\U0001F02F\U0001F322-\U0001F323\U0001F394-\U0001F395\U0001F398\U0001F39C-\U0001F39D\U0001F3F1-\U0001F3F2\U0001F3F6\U0001F4FE\U0001F53E-\U0001F548\U0001F54F\U0001F568-\U0001F56E\U0001F571-\U0001F572\U0001F57B-\U0001F586\U0001F588-\U0001F589\U0001F58E-\U0001F58F\U0001F591-\U0001F594\U0001F597-\U0001F5A3\U0001F5A6-\U0001F5A7\U0001F5A9-\U0001F5B0\U0001F5B3-\U0001F5BB\U0001F5BD-\U0001F5C1\U0001F5C5-\U0001F5D0\U0001F5D4-\U0001F5DB\U0001F5DF-\U0001F5E0\U0001F5E2\U0001F5E4-\U0001F5E7\U0001F5E9-\U0001F5EE\U0001F5F0-\U0001F5F2\U0001F5F4-\U0001F5F9\U00002605\U00002607-\U0000260D\U0000260F-\U00002610\U00002612\U00002616-\U00002617\U00002619-\U0000261C\U0000261E-\U0000261F\U00002621\U00002624-\U00002625\U00002627-\U00002629\U0000262B-\U0000262D\U00002630-\U00002637\U0000263B-\U00002647\U00002654-\U0000265F\U00002661-\U00002662\U00002664\U00002667\U00002669-\U0000267A\U0000267C-\U0000267E\U00002680-\U00002691\U00002695\U00002698\U0000269A\U0000269D-\U0000269F\U000026A2-\U000026A9\U000026AC-\U000026AF\U000026B2-\U000026BC\U000026BF-\U000026C3\U000026C6-\U000026C7\U000026C9-\U000026CD\U000026D0\U000026D2\U000026D5-\U000026E8\U000026EB-\U000026EF\U000026F6\U000026FB-\U000026FC\U000026FE-\U000026FF\U00002388\U0001FA00-\U0001FFFD\U0001F0A0-\U0001F0AE\U0001F0B1-\U0001F0BF\U0001F0C1-\U0001F0CF\U0001F0D1-\U0001F0F5\U0001F0AF-\U0001F0B0\U0001F0C0\U0001F0D0\U0001F0F6-\U0001F0FF\U0001F80C-\U0001F80F\U0001F848-\U0001F84F\U0001F85A-\U0001F85F\U0001F888-\U0001F88F\U0001F8AE-\U0001F8FF\U0001F900-\U0001F90B\U0001F91F\U0001F928-\U0001F92F\U0001F931-\U0001F932\U0001F94C\U0001F95F-\U0001F96B\U0001F992-\U0001F997\U0001F9D0-\U0001F9E6\U0001F90C-\U0001F90F\U0001F93F\U0001F94D-\U0001F94F\U0001F96C-\U0001F97F\U0001F998-\U0001F9BF\U0001F9C1-\U0001F9CF\U0001F9E7-\U0001F9FF\U0001F6C6-\U0001F6CA\U0001F6D3-\U0001F6D4\U0001F6E6-\U0001F6E8\U0001F6EA\U0001F6F1-\U0001F6F2\U0001F6F7-\U0001F6F8\U0001F6D5-\U0001F6DF\U0001F6ED-\U0001F6EF\U0001F6F9-\U0001F6FF]; -$EBG = [\p{Word_Break = EBG}]; -$EmojiNRK = [[\p{Emoji}] - [\p{Word_Break = Regional_Indicator}\u002a\u00230-9©®™〰〽]]; +$ExtendNumLet = [\p{Word_Break = ExtendNumLet}]; +$WSegSpace = [\p{Word_Break = WSegSpace}]; +$Extended_Pict = [:ExtPict:]; $Han = [:Han:]; $Hiragana = [:Hiragana:]; @@ -115,17 +111,17 @@ $IdeographicEx = $Ideographic ($Extend | $Format | $ZWJ)*; ## ------------------------------------------------- -!!forward; - - # Rule 3 - CR x LF # $CR $LF; # Rule 3c ZWJ x (Extended_Pict | EmojiNRK). Precedes WB4, so no intervening Extend chars allowed. # -$ZWJ ($Extended_Pict | $EmojiNRK); +$ZWJ $Extended_Pict; +# Rule 3d - Keep horizontal whitespace together. +# +$WSegSpace $WSegSpace; # Rule 4 - ignore Format and Extend characters, except when they appear at the beginning # of a region of Text. The rule here comes into play when the start of text @@ -142,8 +138,6 @@ $KatakanaEx {300}; # note: these status values override those from rule 5 $HiraganaEx {300}; # by virtue of being numerically larger. $IdeographicEx {400}; # -$E_Base ($Extend | $Format | $ZWJ)*; -$E_Modifier ($Extend | $Format | $ZWJ)*; $Extended_Pict ($Extend | $Format | $ZWJ)*; # @@ -193,11 +187,6 @@ $ExtendNumLetEx $Hebrew_Letter {200}; # (13b) $ExtendNumLetEx $NumericEx {100}; # (13b) $ExtendNumLetEx $KatakanaEx {300}; # (13b) -# rule 14 -# Do not break within emoji modifier sequences - -($E_Base | $EBG) ($Format | $Extend | $ZWJ)* $E_Modifier; - # rules 15 - 17 # Pairs of Regional Indicators stay together. # With rule chaining disabled by ^, this rule will match exactly two of them. @@ -211,24 +200,3 @@ $HangulSyllable $HangulSyllable {200}; # Rule 999 # Match a single code point if no other rule applies. .; - - -## ------------------------------------------------- - -!!safe_reverse; - -# rule 3 -($Extend | $Format | $ZWJ)+ .?; - -# rule 6 -($MidLetter | $MidNumLet | $Single_Quote) ($Format | $Extend | $ZWJ)* ($Hebrew_Letter | $ALetterPlus); - -# rule 7b -$Double_Quote ($Format | $Extend | $ZWJ)* $Hebrew_Letter; - - -# rule 11 -($MidNum | $MidNumLet | $Single_Quote) ($Format | $Extend | $ZWJ)* $Numeric; - -# rule 13c -$Regional_Indicator ($Format | $Extend | $ZWJ)* $Regional_Indicator; diff --git a/lucene/analysis/icu/src/data/utr30/DiacriticFolding.txt b/lucene/analysis/icu/src/data/utr30/DiacriticFolding.txt index 806a4f9baf8..ac6ac1eb05b 100644 --- a/lucene/analysis/icu/src/data/utr30/DiacriticFolding.txt +++ b/lucene/analysis/icu/src/data/utr30/DiacriticFolding.txt @@ -159,6 +159,8 @@ FF9E..FF9F> FFE3> 102E0> 10AE5..10AE6> +10D22..10D27> +10F46..10F50> 110B9..110BA> 11133..11134> 11173> @@ -177,12 +179,14 @@ FFE3> 1163F> 116B6..116B7> 1172B> +11839..1183A> 11A34> 11A47> 11A99> 11C3F> 11D42> 11D44..11D45> +11D97> 16AF0..16AF4> 16F8F..16F9F> 1D167..1D169> diff --git a/lucene/analysis/icu/src/data/utr30/NativeDigitFolding.txt b/lucene/analysis/icu/src/data/utr30/NativeDigitFolding.txt index 707674e299d..382a2795601 100644 --- a/lucene/analysis/icu/src/data/utr30/NativeDigitFolding.txt +++ b/lucene/analysis/icu/src/data/utr30/NativeDigitFolding.txt @@ -442,6 +442,16 @@ ABF9>0039 # MEETEI MAYEK DIGIT NINE 10A41>0032 # KHAROSHTHI DIGIT TWO 10A42>0033 # KHAROSHTHI DIGIT THREE 10A43>0034 # KHAROSHTHI DIGIT FOUR +10D30>0030 # HANIFI ROHINGYA DIGIT ZERO +10D31>0031 # HANIFI ROHINGYA DIGIT ONE +10D32>0032 # HANIFI ROHINGYA DIGIT TWO +10D33>0033 # HANIFI ROHINGYA DIGIT THREE +10D34>0034 # HANIFI ROHINGYA DIGIT FOUR +10D35>0035 # HANIFI ROHINGYA DIGIT FIVE +10D36>0036 # HANIFI ROHINGYA DIGIT SIX +10D37>0037 # HANIFI ROHINGYA DIGIT SEVEN +10D38>0038 # HANIFI ROHINGYA DIGIT EIGHT +10D39>0039 # HANIFI ROHINGYA DIGIT NINE 10E60>0031 # RUMI DIGIT ONE 10E61>0032 # RUMI DIGIT TWO 10E62>0033 # RUMI DIGIT THREE @@ -590,6 +600,16 @@ ABF9>0039 # MEETEI MAYEK DIGIT NINE 11D57>0037 # MASARAM GONDI DIGIT SEVEN 11D58>0038 # MASARAM GONDI DIGIT EIGHT 11D59>0039 # MASARAM GONDI DIGIT NINE +11DA0>0030 # GUNJALA GONDI DIGIT ZERO +11DA1>0031 # GUNJALA GONDI DIGIT ONE +11DA2>0032 # GUNJALA GONDI DIGIT TWO +11DA3>0033 # GUNJALA GONDI DIGIT THREE +11DA4>0034 # GUNJALA GONDI DIGIT FOUR +11DA5>0035 # GUNJALA GONDI DIGIT FIVE +11DA6>0036 # GUNJALA GONDI DIGIT SIX +11DA7>0037 # GUNJALA GONDI DIGIT SEVEN +11DA8>0038 # GUNJALA GONDI DIGIT EIGHT +11DA9>0039 # GUNJALA GONDI DIGIT NINE 16A60>0030 # MRO DIGIT ZERO 16A61>0031 # MRO DIGIT ONE 16A62>0032 # MRO DIGIT TWO diff --git a/lucene/analysis/icu/src/java/org/apache/lucene/analysis/icu/segmentation/BreakIteratorWrapper.java b/lucene/analysis/icu/src/java/org/apache/lucene/analysis/icu/segmentation/BreakIteratorWrapper.java index 9e5050d55b8..e21d2fdee92 100644 --- a/lucene/analysis/icu/src/java/org/apache/lucene/analysis/icu/segmentation/BreakIteratorWrapper.java +++ b/lucene/analysis/icu/src/java/org/apache/lucene/analysis/icu/segmentation/BreakIteratorWrapper.java @@ -16,8 +16,6 @@ */ package org.apache.lucene.analysis.icu.segmentation; -import com.ibm.icu.lang.UCharacter; -import com.ibm.icu.lang.UProperty; import com.ibm.icu.text.BreakIterator; import com.ibm.icu.text.RuleBasedBreakIterator; import com.ibm.icu.text.UTF16; @@ -65,18 +63,18 @@ final class BreakIteratorWrapper { } } - // See unicode doc L2/16-315 and also the RBBI rules for rationale. - // we don't include regional indicators here, because they aren't ambiguous for tagging, - // they need only be treated special for segmentation. + // See unicode doc L2/16-315 for rationale. + // basically for us the ambiguous cases (keycap/etc) as far as types go. static final UnicodeSet EMOJI_RK = new UnicodeSet("[\u002a\u00230-9©®™〰〽]").freeze(); + // faster than doing hasBinaryProperty() checks, at the cost of 1KB ram + static final UnicodeSet EMOJI = new UnicodeSet("[[:Emoji:][:Extended_Pictographic:]]").freeze(); /** Returns true if the current text represents emoji character or sequence */ private boolean isEmoji(int current, int next) { int begin = start + current; int end = start + next; int codepoint = UTF16.charAt(text, 0, end, begin); - // TODO: this can be made more aggressive and future-proof if it uses [:Extended_Pictographic:] - if (UCharacter.hasBinaryProperty(codepoint, UProperty.EMOJI)) { + if (EMOJI.contains(codepoint)) { if (EMOJI_RK.contains(codepoint)) { // if its in EmojiRK, we don't treat it as emoji unless there is evidence it forms emoji sequence, // an emoji presentation selector or keycap follows. diff --git a/lucene/analysis/icu/src/java/overview.html b/lucene/analysis/icu/src/java/overview.html index 6fa5821c242..6e0a5d70f58 100644 --- a/lucene/analysis/icu/src/java/overview.html +++ b/lucene/analysis/icu/src/java/overview.html @@ -353,7 +353,7 @@ and

Backwards Compatibility

This module exists to provide up-to-date Unicode functionality that supports -the most recent version of Unicode (currently 10.0). However, some users who wish +the most recent version of Unicode (currently 11.0). However, some users who wish for stronger backwards compatibility can restrict {@link org.apache.lucene.analysis.icu.ICUNormalizer2Filter} to operate on only a specific Unicode Version by using a {@link com.ibm.icu.text.FilteredNormalizer2}. diff --git a/lucene/analysis/icu/src/resources/org/apache/lucene/analysis/icu/segmentation/Default.brk b/lucene/analysis/icu/src/resources/org/apache/lucene/analysis/icu/segmentation/Default.brk index e6c0ef770e7c55ccc90ef1cdcce5d667d9799eea..9333a40bec9505ccf73be18de84ff7732920f8fb 100644 GIT binary patch literal 43176 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 dm{oQ4)1c= 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 diff --git a/lucene/analysis/icu/src/resources/org/apache/lucene/analysis/icu/utr30.nrm b/lucene/analysis/icu/src/resources/org/apache/lucene/analysis/icu/utr30.nrm index 1c3de121cadef59176f61ed61760d21226e0943e..4ded6c9776210379f7142dd59e641c51da35d85b 100644 GIT binary patch delta 5865 zcmeHL32anF7;c%FH}_1p#rDY)LhiAfcq7HH`?V&_aoTB>_@=K#Cke zITj=!T8;u1Ypu2lYLUZ6gj6g^gAgeqLWKwf!VwNpXWwq=K^L|X+nA8ayqW*|zL|fH ze|F!Sq94G?LtuHg$QvOc)%`+3e!nNLhKh`i8!zzt%-KoAd-KnfTKGQc!2 z3(NzH!3wYzYy|n>Q}89&3l4z8;25X^XTSw;4cvhUO4tT=f?Z)R*dGpo32-<}hN&l3hZ=qI*p>Pz5qEHtz43kg~ z)E5m#@hA}`8EXuB1x+yJBsASAXQTOOv4gKb6VO_ei?(@jgA_V^2`Y8UedwScuW;<6 z=od#-jV>7NHFU?aktMA*Rwv7GZ1q44xUD|cAZw`goHj135!M*s*30x7-@qC^tyC+` zhglicw1#Zswl&M&BHPNg{nh!_BE+oaH4QAkJ8PY9{AM5 z*3Sm})#S4#UohMi>$a)=jWO1^9jL;ca97+5_s2tU0v?W&aVk#3nK%n);~Z=+#jEgo zoQDf=2`4ZqkT?cOO7kVc$CT0d|-jW9E&BozuB`gWjk&>CHM%7dK+r_amEuv+pyuW^k|V zz)RB{?l;*1ccxj~YdcV2G>`kuc7V97asQDwqV?C>e4gop-g>Y}?hZ=X;^#l8Q3gHh zCinKgoj<$GZt_r0xr;~gXzu2*d?1hKi9Cs?@NvM+Gx#()ifJSVD=mqJ!uxx{E$ykQge4iBaNZFtuMx@YL{C;gu0# z5hEj(MwCaKZ5=~Tv2Zq$EeqYyFtJ??k7sYAVi%bACsc@70K# zburYc){-F-OD)@(zrlR@n0&&N9xp4ObYA*p|2opa-n$ezR3_G9MwsNtUy`rZLnq4D z9egTt)2K)ozLt@>M!)sm&T18P zYc)D)HcWoz8|q#D-yM3n^KJ)bz7LaZxhKe<=LT-%_p(ABl_zAi&%L}Dco_0J$&ok7 zLKUj0a;ZoatvV_~XDQMtYn=Kax|)H!uo)jMR3 zwQ3qxZ~i(|Q|;1`I$FDRtRAT2b)rtvDSDjF(9`rRJ+En<2cd2d|5fHXw^>to19veX zrg%?e+z3xaB=p1$2=f%i2+!2fQJ&QFsN$&f=i$mR-91J9lqWs&tfwMbdmir*T|9Ei N*s#z6n~UaT`~#}p)4>1$ delta 5841 zcmeHL3ry8j7zfY!|Ihmz;F5{r)Jb|3=6tY{Xze&8PE(af@=^$4#Qz2jDj&R7RJNza1xvblVK{H z3m3pQpaqw~Rd5~L0(ZdOa6kMK9)(q~2G+vU@Hcqgf>+>QMzBGQP@|7Az!A30HeH@Cjdi z3OC|r&obeQ_!@zP6DyoVk|+{GV#y=qG2kSV$^;9kYtfujT8_!*+{l~hakI1 zDJdgINfoIfwWNVGkqhK11(Z<-?MLk_@@jVO>s$ZMDc=JvOHXHaQcwKdI{lz${kt>! zfwL$7d-A_KXQ12nzd_(!8coM|wjqtDE}B3SX%bDLFKK=rUDUcgX%@{j2+gM}ZQV8W z1G?3271O<1_W=ExdM>d}T1l(vNvdx|^sLHP@2Uc|LakJ*)aG_Lt0Q3-$gB>0>jLx2 z3OqGkVSa@baAms0ys`o%M%S2MX$8p37V~R88Lf7z-TJ%V)9x$@`=)$L?QY-yxAd^n z5#P~B|J(TKIr=9HVwi=nK5QU!vXN{obFl=L$dXtJaI!R(!4|V@md6U&TDF<(WP8|W z>?`&SJI+q9Q>>Bw&Mqu|dW}a{JYZk?MNDf)G1~K%BI1Or71N3dw)#`z89#KE&?mE&zD$el z`Zdp!iRNGT(|TKvXyZ4c`c)!JEY+7@vD_bS z?l~cIWWHQ2H^{Bhb1dGx{_<0KNLI-2WR=&btdX^{;qE!$Ka!4LHpvU}ssf5Bhw7&W zt7tVw#jEjZlA5NHRjNw&?{Zf;JN`QTh}%s>ZNo!>CU", "", "", "" }); } + public void testEmojiFromTheFuture() throws Exception { + // pick an unassigned character with extended_pictographic + int ch = new UnicodeSet("[[:Extended_Pictographic:]&[:Unassigned:]]").getRangeStart(0); + String value = new String(Character.toChars(ch)); + // should analyze to emoji type + BaseTokenStreamTestCase.assertAnalyzesTo(a, value, + new String[] { value }, + new String[] { "" }); + // shouldn't break in a sequence + BaseTokenStreamTestCase.assertAnalyzesTo(a, value + '\u200D' + value, + new String[] { value + '\u200D' + value }, + new String[] { "" }); + } + /** blast some random strings through the analyzer */ public void testRandomStrings() throws Exception { checkRandomData(random(), a, 1000*RANDOM_MULTIPLIER); diff --git a/lucene/ivy-versions.properties b/lucene/ivy-versions.properties index 49a119096fa..4847f5d9a7c 100644 --- a/lucene/ivy-versions.properties +++ b/lucene/ivy-versions.properties @@ -30,7 +30,7 @@ com.fasterxml.jackson.core.version = 2.9.5 /com.googlecode.mp4parser/isoparser = 1.1.18 /com.healthmarketscience.jackcess/jackcess = 2.1.8 /com.healthmarketscience.jackcess/jackcess-encrypt = 2.1.4 -/com.ibm.icu/icu4j = 61.1 +/com.ibm.icu/icu4j = 62.1 /com.lmax/disruptor = 3.4.0 /com.pff/java-libpst = 0.8.1 diff --git a/lucene/licenses/icu4j-61.1.jar.sha1 b/lucene/licenses/icu4j-61.1.jar.sha1 deleted file mode 100644 index bde7409baf4..00000000000 --- a/lucene/licenses/icu4j-61.1.jar.sha1 +++ /dev/null @@ -1 +0,0 @@ -28d33b5e44e72edcc66a5da7a34a42147f38d987 diff --git a/lucene/licenses/icu4j-62.1.jar.sha1 b/lucene/licenses/icu4j-62.1.jar.sha1 new file mode 100644 index 00000000000..20fa5c7528d --- /dev/null +++ b/lucene/licenses/icu4j-62.1.jar.sha1 @@ -0,0 +1 @@ +7a4d00d5ec5febd252a6182e8b6e87a0a9821f81 diff --git a/solr/licenses/icu4j-61.1.jar.sha1 b/solr/licenses/icu4j-61.1.jar.sha1 deleted file mode 100644 index bde7409baf4..00000000000 --- a/solr/licenses/icu4j-61.1.jar.sha1 +++ /dev/null @@ -1 +0,0 @@ -28d33b5e44e72edcc66a5da7a34a42147f38d987 diff --git a/solr/licenses/icu4j-62.1.jar.sha1 b/solr/licenses/icu4j-62.1.jar.sha1 new file mode 100644 index 00000000000..20fa5c7528d --- /dev/null +++ b/solr/licenses/icu4j-62.1.jar.sha1 @@ -0,0 +1 @@ +7a4d00d5ec5febd252a6182e8b6e87a0a9821f81