From b56241f22f96826ef9ef38cf7e4312b899f8e241 Mon Sep 17 00:00:00 2001 From: bruvzg <7645683+bruvzg@users.noreply.github.com> Date: Thu, 22 Apr 2021 15:08:59 +0300 Subject: [PATCH] ICU: Update to version 69.1, improve ICU data export process. --- COPYRIGHT.txt | 2 +- doc/classes/ProjectSettings.xml | 5 + editor/editor_export.cpp | 28 +- editor/localization_editor.cpp | 71 ---- editor/localization_editor.h | 7 - main/main.cpp | 1 + modules/text_server_adv/SCsub | 2 +- thirdparty/README.md | 6 +- thirdparty/icu4c/APIChangeReport.md | 396 ------------------ thirdparty/icu4c/common/bytestriebuilder.cpp | 26 +- thirdparty/icu4c/common/charstr.cpp | 34 ++ thirdparty/icu4c/common/charstr.h | 3 + thirdparty/icu4c/common/cmemory.h | 55 ++- thirdparty/icu4c/common/dictbe.cpp | 32 +- thirdparty/icu4c/common/edits.cpp | 1 + thirdparty/icu4c/common/filteredbrk.cpp | 93 ++-- thirdparty/icu4c/common/hash.h | 19 + thirdparty/icu4c/common/localematcher.cpp | 12 +- .../icu4c/common/localeprioritylist.cpp | 11 +- thirdparty/icu4c/common/locdispnames.cpp | 2 +- thirdparty/icu4c/common/locid.cpp | 244 ++++++++++- thirdparty/icu4c/common/loclikelysubtags.cpp | 3 +- thirdparty/icu4c/common/norm2allmodes.h | 82 +++- thirdparty/icu4c/common/normalizer2impl.cpp | 152 ++++++- thirdparty/icu4c/common/normalizer2impl.h | 11 +- thirdparty/icu4c/common/pluralmap.h | 2 +- thirdparty/icu4c/common/putil.cpp | 4 +- thirdparty/icu4c/common/putilimp.h | 2 +- thirdparty/icu4c/common/rbbi.cpp | 2 +- thirdparty/icu4c/common/rbbi_cache.cpp | 2 +- thirdparty/icu4c/common/rbbiscan.cpp | 6 +- thirdparty/icu4c/common/rbbitblb.cpp | 2 +- thirdparty/icu4c/common/resource.h | 6 +- thirdparty/icu4c/common/restrace.cpp | 3 + thirdparty/icu4c/common/servnotf.h | 4 +- thirdparty/icu4c/common/ubrk.cpp | 12 + thirdparty/icu4c/common/ucase.cpp | 2 +- thirdparty/icu4c/common/uchar.cpp | 38 +- thirdparty/icu4c/common/ucnv2022.cpp | 6 +- thirdparty/icu4c/common/ucnv_bld.cpp | 2 +- thirdparty/icu4c/common/ucnv_err.cpp | 2 +- thirdparty/icu4c/common/ucnv_lmb.cpp | 4 +- thirdparty/icu4c/common/ucnv_u7.cpp | 2 +- thirdparty/icu4c/common/ucnvisci.cpp | 6 +- thirdparty/icu4c/common/ucurr.cpp | 4 +- thirdparty/icu4c/common/uhash.cpp | 81 +++- thirdparty/icu4c/common/uhash.h | 95 ++++- thirdparty/icu4c/common/uloc.cpp | 42 +- thirdparty/icu4c/common/uloc_keytype.cpp | 2 +- thirdparty/icu4c/common/uloc_tag.cpp | 41 +- thirdparty/icu4c/common/ulocimp.h | 3 + thirdparty/icu4c/common/unicode/bytestream.h | 6 +- thirdparty/icu4c/common/unicode/bytestrie.h | 3 + .../icu4c/common/unicode/bytestriebuilder.h | 5 + thirdparty/icu4c/common/unicode/docmain.h | 8 +- thirdparty/icu4c/common/unicode/icuplug.h | 7 +- .../icu4c/common/unicode/localematcher.h | 16 +- thirdparty/icu4c/common/unicode/locid.h | 4 +- thirdparty/icu4c/common/unicode/normalizer2.h | 28 +- thirdparty/icu4c/common/unicode/platform.h | 2 +- thirdparty/icu4c/common/unicode/stringpiece.h | 26 +- thirdparty/icu4c/common/unicode/ubrk.h | 21 +- thirdparty/icu4c/common/unicode/ucnv.h | 4 +- thirdparty/icu4c/common/unicode/ucnvsel.h | 4 +- thirdparty/icu4c/common/unicode/unifilt.h | 4 +- thirdparty/icu4c/common/unicode/uniset.h | 66 +-- thirdparty/icu4c/common/unicode/unistr.h | 8 +- thirdparty/icu4c/common/unicode/urename.h | 16 + thirdparty/icu4c/common/unicode/uset.h | 95 ++++- thirdparty/icu4c/common/unicode/ushape.h | 2 +- thirdparty/icu4c/common/unicode/utrace.h | 17 +- thirdparty/icu4c/common/unicode/uvernum.h | 12 +- thirdparty/icu4c/common/uniset.cpp | 128 +++--- thirdparty/icu4c/common/uniset_props.cpp | 116 ++--- thirdparty/icu4c/common/unisetspan.cpp | 25 +- thirdparty/icu4c/common/uprops.h | 52 --- thirdparty/icu4c/common/uresbund.cpp | 23 +- thirdparty/icu4c/common/uresdata.cpp | 8 - thirdparty/icu4c/common/uresimp.h | 4 +- thirdparty/icu4c/common/uset.cpp | 35 ++ thirdparty/icu4c/common/usprep.cpp | 2 +- thirdparty/icu4c/common/ustr_wcs.cpp | 4 +- thirdparty/icu4c/common/utext.cpp | 6 +- thirdparty/icu4c/common/util.h | 6 +- thirdparty/icu4c/common/utracimp.h | 2 +- thirdparty/icu4c/common/uvector.cpp | 4 +- thirdparty/icu4c/common/wintz.cpp | 24 +- .../icu4c/{icudt68l.dat => icudt69l.dat} | Bin 3846720 -> 3851952 bytes 88 files changed, 1417 insertions(+), 1049 deletions(-) delete mode 100644 thirdparty/icu4c/APIChangeReport.md rename thirdparty/icu4c/{icudt68l.dat => icudt69l.dat} (86%) diff --git a/COPYRIGHT.txt b/COPYRIGHT.txt index 3bb9c916fd..9e63da3fc4 100644 --- a/COPYRIGHT.txt +++ b/COPYRIGHT.txt @@ -198,7 +198,7 @@ License: HarfBuzz Files: ./thirdparty/icu4c/ Comment: International Components for Unicode -Copyright: 1991-2020, Unicode +Copyright: 1991-2021, Unicode License: Unicode Files: ./thirdparty/jpeg-compressor/ diff --git a/doc/classes/ProjectSettings.xml b/doc/classes/ProjectSettings.xml index c8fd0d667b..59279f4e3f 100644 --- a/doc/classes/ProjectSettings.xml +++ b/doc/classes/ProjectSettings.xml @@ -746,6 +746,11 @@ Default delay for touch events. This only affects iOS devices. + + If [code]true[/code], text server break iteration rule sets, dictionaries and other optional data are included in the exported project. + [b]Note:[/b] "ICU / HarfBuzz / Graphite" text server data includes dictionaries for Burmese, Chinese, Japanese, Khmer, Lao and Thai as well as Unicode Standard Annex #29 and Unicode Standard Annex #14 word and line breaking rules. Data is about 4 MB large. + [b]Note:[/b] "Fallback" text server does not use additional data. + The locale to fall back to if a translation isn't available in a given language. If left empty, [code]en[/code] (English) will be used. diff --git a/editor/editor_export.cpp b/editor/editor_export.cpp index a5ebfbfb8a..a368a9618e 100644 --- a/editor/editor_export.cpp +++ b/editor/editor_export.cpp @@ -1051,14 +1051,28 @@ Error EditorExportPlatform::export_project_files(const Ref & } } - // Store text server data if exists. + // Store text server data if it is supported. if (TS->has_feature(TextServer::FEATURE_USE_SUPPORT_DATA)) { - String ts_data = "res://" + TS->get_support_data_filename(); - if (FileAccess::exists(ts_data)) { - Vector array = FileAccess::get_file_as_array(ts_data); - err = p_func(p_udata, ts_data, array, idx, total, enc_in_filters, enc_ex_filters, key); - if (err != OK) { - return err; + bool use_data = ProjectSettings::get_singleton()->get("internationalization/locale/include_text_server_data"); + if (use_data) { + // Try using user provided data file. + String ts_data = "res://" + TS->get_support_data_filename(); + if (FileAccess::exists(ts_data)) { + Vector array = FileAccess::get_file_as_array(ts_data); + err = p_func(p_udata, ts_data, array, idx, total, enc_in_filters, enc_ex_filters, key); + if (err != OK) { + return err; + } + } else { + // Use default text server data. + String icu_data_file = EditorSettings::get_singleton()->get_cache_dir().plus_file("tmp_icu_data"); + TS->save_support_data(icu_data_file); + Vector array = FileAccess::get_file_as_array(icu_data_file); + err = p_func(p_udata, ts_data, array, idx, total, enc_in_filters, enc_ex_filters, key); + DirAccess::remove_file_or_error(icu_data_file); + if (err != OK) { + return err; + } } } } diff --git a/editor/localization_editor.cpp b/editor/localization_editor.cpp index 0e68af06f0..161f1dde0d 100644 --- a/editor/localization_editor.cpp +++ b/editor/localization_editor.cpp @@ -37,24 +37,6 @@ #include "scene/gui/control.h" void LocalizationEditor::_notification(int p_what) { - if (p_what == NOTIFICATION_TEXT_SERVER_CHANGED) { - ts_name->set_text(TTR("Text server: ") + TS->get_name()); - - FileAccessRef file_check = FileAccess::create(FileAccess::ACCESS_RESOURCES); - if (TS->has_feature(TextServer::FEATURE_USE_SUPPORT_DATA)) { - if (file_check->file_exists("res://" + TS->get_support_data_filename())) { - ts_data_status->set_text(TTR("Support data: ") + TTR("Installed")); - ts_install->set_disabled(true); - } else { - ts_data_status->set_text(TTR("Support data: ") + TTR("Not installed")); - ts_install->set_disabled(false); - } - } else { - ts_data_status->set_text(TTR("Support data: ") + TTR("Not supported")); - ts_install->set_disabled(false); - } - ts_data_info->set_text(TTR("Info: ") + TS->get_support_data_info()); - } if (p_what == NOTIFICATION_ENTER_TREE) { translation_list->connect("button_pressed", callable_mp(this, &LocalizationEditor::_translation_delete)); translation_pot_list->connect("button_pressed", callable_mp(this, &LocalizationEditor::_pot_delete)); @@ -649,26 +631,6 @@ void LocalizationEditor::update_translations() { updating_translations = false; } -void LocalizationEditor::_install_ts_data() { - if (TS->has_feature(TextServer::FEATURE_USE_SUPPORT_DATA)) { - TS->save_support_data("res://" + TS->get_support_data_filename()); - } - - FileAccessRef file_check = FileAccess::create(FileAccess::ACCESS_RESOURCES); - if (TS->has_feature(TextServer::FEATURE_USE_SUPPORT_DATA)) { - if (file_check->file_exists("res://" + TS->get_support_data_filename())) { - ts_data_status->set_text(TTR("Support data: ") + TTR("Installed")); - ts_install->set_disabled(true); - } else { - ts_data_status->set_text(TTR("Support data: ") + TTR("Not installed")); - ts_install->set_disabled(false); - } - } else { - ts_data_status->set_text(TTR("Support data: ") + TTR("Not supported")); - ts_install->set_disabled(false); - } -} - void LocalizationEditor::_bind_methods() { ClassDB::bind_method(D_METHOD("update_translations"), &LocalizationEditor::update_translations); @@ -838,37 +800,4 @@ LocalizationEditor::LocalizationEditor() { pot_file_open_dialog->connect("files_selected", callable_mp(this, &LocalizationEditor::_pot_add)); add_child(pot_file_open_dialog); } - - { - VBoxContainer *tvb = memnew(VBoxContainer); - tvb->set_name(TTR("Text Server Data")); - translations->add_child(tvb); - - ts_name = memnew(Label(TTR("Text server: ") + TS->get_name())); - tvb->add_child(ts_name); - - ts_data_status = memnew(Label(TTR("Support data: "))); - tvb->add_child(ts_data_status); - - ts_data_info = memnew(Label(TTR("Info: ") + TS->get_support_data_info())); - tvb->add_child(ts_data_info); - - ts_install = memnew(Button(TTR("Install support data..."))); - ts_install->connect("pressed", callable_mp(this, &LocalizationEditor::_install_ts_data)); - tvb->add_child(ts_install); - - FileAccessRef file_check = FileAccess::create(FileAccess::ACCESS_RESOURCES); - if (TS->has_feature(TextServer::FEATURE_USE_SUPPORT_DATA)) { - if (file_check->file_exists("res://" + TS->get_support_data_filename())) { - ts_data_status->set_text(TTR("Support data: ") + TTR("Installed")); - ts_install->set_disabled(true); - } else { - ts_data_status->set_text(TTR("Support data: ") + TTR("Not installed")); - ts_install->set_disabled(false); - } - } else { - ts_data_status->set_text(TTR("Support data: ") + TTR("Not supported")); - ts_install->set_disabled(false); - } - } } diff --git a/editor/localization_editor.h b/editor/localization_editor.h index 6e0d7ce61f..23cea06fbe 100644 --- a/editor/localization_editor.h +++ b/editor/localization_editor.h @@ -58,11 +58,6 @@ class LocalizationEditor : public VBoxContainer { Vector translation_filter_treeitems; Vector translation_locales_idxs_remap; - Label *ts_name; - Label *ts_data_status; - Label *ts_data_info; - Button *ts_install; - Tree *translation_pot_list; EditorFileDialog *pot_file_open_dialog; EditorFileDialog *pot_generate_dialog; @@ -94,8 +89,6 @@ class LocalizationEditor : public VBoxContainer { void _pot_generate(const String &p_file); void _update_pot_file_extensions(); - void _install_ts_data(); - protected: void _notification(int p_what); static void _bind_methods(); diff --git a/main/main.cpp b/main/main.cpp index bf7b88bdc9..bb16c49983 100644 --- a/main/main.cpp +++ b/main/main.cpp @@ -1253,6 +1253,7 @@ Error Main::setup(const char *execpath, int argc, char *argv[], bool p_second_ph } GLOBAL_DEF("internationalization/rendering/force_right_to_left_layout_direction", false); + GLOBAL_DEF("internationalization/locale/include_text_server_data", false); if (!force_lowdpi) { OS::get_singleton()->_allow_hidpi = GLOBAL_DEF("display/window/dpi/allow_hidpi", false); diff --git a/modules/text_server_adv/SCsub b/modules/text_server_adv/SCsub index e7863f88a3..a55b6dc283 100644 --- a/modules/text_server_adv/SCsub +++ b/modules/text_server_adv/SCsub @@ -448,7 +448,7 @@ if env["builtin_icu"]: ] thirdparty_sources = [thirdparty_dir + file for file in thirdparty_sources] - icu_data_name = "icudt68l.dat" + icu_data_name = "icudt69l.dat" if env_icu["tools"]: env_icu.Depends("#thirdparty/icu4c/icudata.gen.h", "#thirdparty/icu4c/" + icu_data_name) diff --git a/thirdparty/README.md b/thirdparty/README.md index 33ce2423d9..97f21f8539 100644 --- a/thirdparty/README.md +++ b/thirdparty/README.md @@ -186,17 +186,17 @@ Files extracted from upstream source: ## icu4c - Upstream: https://github.com/unicode-org/icu -- Version: 68.2 (84e1f26ea77152936e70d53178a816dbfbf69989, 2020) +- Version: 69.1 (0e7b4428866f3133b4abba2d932ee3faa708db1d, 2021) - License: Unicode Files extracted from upstream source: - the `common` folder -- `APIChangeReport.md`, `LICENSE` +- `LICENSE` Files generated from upstream source: -- the `icudt68l.dat` built with the provided `godot_data.json` config file (see +- the `icudt69l.dat` built with the provided `godot_data.json` config file (see https://github.com/unicode-org/icu/blob/master/docs/userguide/icu_data/buildtool.md for instructions) diff --git a/thirdparty/icu4c/APIChangeReport.md b/thirdparty/icu4c/APIChangeReport.md deleted file mode 100644 index 5385904fd1..0000000000 --- a/thirdparty/icu4c/APIChangeReport.md +++ /dev/null @@ -1,396 +0,0 @@ - - - - -# ICU4C API Comparison: ICU 67 with ICU 68 - -> _Note_ Markdown format of this document is new for ICU 65. - -- [Removed from ICU 67](#removed) -- [Deprecated or Obsoleted in ICU 68](#deprecated) -- [Changed in ICU 68](#changed) -- [Promoted to stable in ICU 68](#promoted) -- [Added in ICU 68](#added) -- [Other existing drafts in ICU 68](#other) -- [Signature Simplifications](#simplifications) - -## Removed - -Removed from ICU 67 - -| File | API | ICU 67 | ICU 68 | -|---|---|---|---| -| fmtable.h | const UFormattable* icu::Formattable::toUFormattable() | StableICU 52 | (missing) -| measunit.h | LocalArray<MeasureUnit> icu::MeasureUnit::splitToSingleUnits(int32_t&, UErrorCode&) const | InternalICU 67 | (missing) -| measunit.h | int32_t icu::MeasureUnit::getIndex() const | Internal | (missing) -| measunit.h | static MeasureUnit icu::MeasureUnit::resolveUnitPerUnit(const MeasureUnit&, const MeasureUnit&, bool*) | Internal | (missing) -| measunit.h | static int32_t icu::MeasureUnit::getIndexCount() | Internal | (missing) -| measunit.h | static int32_t icu::MeasureUnit::internalGetIndexForTypeAndSubtype(const char*, const char*) | Internal | (missing) -| nounit.h | UClassID icu::NoUnit::getDynamicClassID() const | DraftICU 60 | (missing) -| nounit.h | icu::NoUnit::NoUnit(const NoUnit&) | DraftICU 60 | (missing) -| nounit.h | icu::NoUnit::~NoUnit() | DraftICU 60 | (missing) -| nounit.h | static NoUnit icu::NoUnit::base() | DraftICU 60 | (missing) -| nounit.h | static NoUnit icu::NoUnit::percent() | DraftICU 60 | (missing) -| nounit.h | static NoUnit icu::NoUnit::permille() | DraftICU 60 | (missing) -| nounit.h | static UClassID icu::NoUnit::getStaticClassID() | DraftICU 60 | (missing) -| nounit.h | void* icu::NoUnit::clone() const | DraftICU 60 | (missing) -| uniset.h | const USet* icu::UnicodeSet::toUSet() | StableICU 4.2 | (missing) - -## Deprecated - -Deprecated or Obsoleted in ICU 68 - -| File | API | ICU 67 | ICU 68 | -|---|---|---|---| -| numberrangeformatter.h | UnicodeString icu::number::FormattedNumberRange::getFirstDecimal(UErrorCode&) const | DraftICU 63 | DeprecatedICU 68 -| numberrangeformatter.h | UnicodeString icu::number::FormattedNumberRange::getSecondDecimal(UErrorCode&) const | DraftICU 63 | DeprecatedICU 68 -| umachine.h | #define FALSE | StableICU 2.0 | DeprecatedICU 68 -| umachine.h | #define TRUE | StableICU 2.0 | DeprecatedICU 68 - -## Changed - -Changed in ICU 68 (old, new) - - - -| File | API | ICU 67 | ICU 68 | -|---|---|---|---| -| bytestrie.h | BytesTrie& icu::BytesTrie::resetToState64(uint64_t) | Draft→StableICU 65 -| bytestrie.h | uint64_t icu::BytesTrie::getState64() const | Draft→StableICU 65 -| listformatter.h | static ListFormatter* icu::ListFormatter::createInstance(const Locale&, UListFormatterType, UListFormatterWidth, UErrorCode&) | Draft→StableICU 67 -| localebuilder.h | UBool icu::LocaleBuilder::copyErrorTo(UErrorCode&) const | Draft→StableICU 65 -| localematcher.h | Builder& icu::LocaleMatcher::Builder::addSupportedLocale(const Locale&) | Draft→StableICU 65 -| localematcher.h | Builder& icu::LocaleMatcher::Builder::operator=(Builder&&) | Draft→StableICU 65 -| localematcher.h | Builder& icu::LocaleMatcher::Builder::setDefaultLocale(const Locale*) | Draft→StableICU 65 -| localematcher.h | Builder& icu::LocaleMatcher::Builder::setDemotionPerDesiredLocale(ULocMatchDemotion) | Draft→StableICU 65 -| localematcher.h | Builder& icu::LocaleMatcher::Builder::setFavorSubtag(ULocMatchFavorSubtag) | Draft→StableICU 65 -| localematcher.h | Builder& icu::LocaleMatcher::Builder::setSupportedLocales(Iter, Iter) | Draft→StableICU 65 -| localematcher.h | Builder& icu::LocaleMatcher::Builder::setSupportedLocales(Locale::Iterator&) | Draft→StableICU 65 -| localematcher.h | Builder& icu::LocaleMatcher::Builder::setSupportedLocalesFromListString(StringPiece) | Draft→StableICU 65 -| localematcher.h | Builder& icu::LocaleMatcher::Builder::setSupportedLocalesViaConverter(Iter, Iter, Conv) | Draft→StableICU 65 -| localematcher.h | Locale icu::LocaleMatcher::Result::makeResolvedLocale(UErrorCode&) const | Draft→StableICU 65 -| localematcher.h | LocaleMatcher icu::LocaleMatcher::Builder::build(UErrorCode&) const | Draft→StableICU 65 -| localematcher.h | LocaleMatcher& icu::LocaleMatcher::operator=(LocaleMatcher&&) | Draft→StableICU 65 -| localematcher.h | Result icu::LocaleMatcher::getBestMatchResult(Locale::Iterator&, UErrorCode&) const | Draft→StableICU 65 -| localematcher.h | Result icu::LocaleMatcher::getBestMatchResult(const Locale&, UErrorCode&) const | Draft→StableICU 65 -| localematcher.h | Result& icu::LocaleMatcher::Result::operator=(Result&&) | Draft→StableICU 65 -| localematcher.h | UBool icu::LocaleMatcher::Builder::copyErrorTo(UErrorCode&) const | Draft→StableICU 65 -| localematcher.h | const Locale* icu::LocaleMatcher::Result::getDesiredLocale() const | Draft→StableICU 65 -| localematcher.h | const Locale* icu::LocaleMatcher::Result::getSupportedLocale() const | Draft→StableICU 65 -| localematcher.h | const Locale* icu::LocaleMatcher::getBestMatch(Locale::Iterator&, UErrorCode&) const | Draft→StableICU 65 -| localematcher.h | const Locale* icu::LocaleMatcher::getBestMatch(const Locale&, UErrorCode&) const | Draft→StableICU 65 -| localematcher.h | const Locale* icu::LocaleMatcher::getBestMatchForListString(StringPiece, UErrorCode&) const | Draft→StableICU 65 -| localematcher.h | enum ULocMatchDemotion::ULOCMATCH_DEMOTION_NONE | Draft→StableICU 65 -| localematcher.h | enum ULocMatchDemotion::ULOCMATCH_DEMOTION_REGION | Draft→StableICU 65 -| localematcher.h | enum ULocMatchFavorSubtag::ULOCMATCH_FAVOR_LANGUAGE | Draft→StableICU 65 -| localematcher.h | enum ULocMatchFavorSubtag::ULOCMATCH_FAVOR_SCRIPT | Draft→StableICU 65 -| localematcher.h | icu::LocaleMatcher::Builder::Builder() | Draft→StableICU 65 -| localematcher.h | icu::LocaleMatcher::Builder::Builder(Builder&&) | Draft→StableICU 65 -| localematcher.h | icu::LocaleMatcher::Builder::~Builder() | Draft→StableICU 65 -| localematcher.h | icu::LocaleMatcher::LocaleMatcher(LocaleMatcher&&) | Draft→StableICU 65 -| localematcher.h | icu::LocaleMatcher::Result::Result(Result&&) | Draft→StableICU 65 -| localematcher.h | icu::LocaleMatcher::Result::~Result() | Draft→StableICU 65 -| localematcher.h | icu::LocaleMatcher::~LocaleMatcher() | Draft→StableICU 65 -| localematcher.h | int32_t icu::LocaleMatcher::Result::getDesiredIndex() const | Draft→StableICU 65 -| localematcher.h | int32_t icu::LocaleMatcher::Result::getSupportedIndex() const | Draft→StableICU 65 -| locid.h | UBool icu::Locale::ConvertingIterator< Iter, Conv >::hasNext() const override | Draft→StableICU 65 -| locid.h | UBool icu::Locale::Iterator::hasNext() const | Draft→StableICU 65 -| locid.h | UBool icu::Locale::RangeIterator< Iter >::hasNext() const override | Draft→StableICU 65 -| locid.h | const Locale& icu::Locale::ConvertingIterator< Iter, Conv >::next() override | Draft→StableICU 65 -| locid.h | const Locale& icu::Locale::Iterator::next() | Draft→StableICU 65 -| locid.h | const Locale& icu::Locale::RangeIterator< Iter >::next() override | Draft→StableICU 65 -| locid.h | icu::Locale::ConvertingIterator< Iter, Conv >::ConvertingIterator(Iter, Iter, Conv) | Draft→StableICU 65 -| locid.h | icu::Locale::Iterator::~Iterator() | Draft→StableICU 65 -| locid.h | icu::Locale::RangeIterator< Iter >::RangeIterator(Iter, Iter) | Draft→StableICU 65 -| measunit.h | static MeasureUnit icu::MeasureUnit::getBar() | Draft→StableICU 65 -| measunit.h | static MeasureUnit icu::MeasureUnit::getDecade() | Draft→StableICU 65 -| measunit.h | static MeasureUnit icu::MeasureUnit::getDotPerCentimeter() | Draft→StableICU 65 -| measunit.h | static MeasureUnit icu::MeasureUnit::getDotPerInch() | Draft→StableICU 65 -| measunit.h | static MeasureUnit icu::MeasureUnit::getEm() | Draft→StableICU 65 -| measunit.h | static MeasureUnit icu::MeasureUnit::getMegapixel() | Draft→StableICU 65 -| measunit.h | static MeasureUnit icu::MeasureUnit::getPascal() | Draft→StableICU 65 -| measunit.h | static MeasureUnit icu::MeasureUnit::getPixel() | Draft→StableICU 65 -| measunit.h | static MeasureUnit icu::MeasureUnit::getPixelPerCentimeter() | Draft→StableICU 65 -| measunit.h | static MeasureUnit icu::MeasureUnit::getPixelPerInch() | Draft→StableICU 65 -| measunit.h | static MeasureUnit icu::MeasureUnit::getThermUs() | Draft→StableICU 65 -| measunit.h | static MeasureUnit* icu::MeasureUnit::createBar(UErrorCode&) | Draft→StableICU 65 -| measunit.h | static MeasureUnit* icu::MeasureUnit::createDecade(UErrorCode&) | Draft→StableICU 65 -| measunit.h | static MeasureUnit* icu::MeasureUnit::createDotPerCentimeter(UErrorCode&) | Draft→StableICU 65 -| measunit.h | static MeasureUnit* icu::MeasureUnit::createDotPerInch(UErrorCode&) | Draft→StableICU 65 -| measunit.h | static MeasureUnit* icu::MeasureUnit::createEm(UErrorCode&) | Draft→StableICU 65 -| measunit.h | static MeasureUnit* icu::MeasureUnit::createMegapixel(UErrorCode&) | Draft→StableICU 65 -| measunit.h | static MeasureUnit* icu::MeasureUnit::createPascal(UErrorCode&) | Draft→StableICU 65 -| measunit.h | static MeasureUnit* icu::MeasureUnit::createPixel(UErrorCode&) | Draft→StableICU 65 -| measunit.h | static MeasureUnit* icu::MeasureUnit::createPixelPerCentimeter(UErrorCode&) | Draft→StableICU 65 -| measunit.h | static MeasureUnit* icu::MeasureUnit::createPixelPerInch(UErrorCode&) | Draft→StableICU 65 -| measunit.h | static MeasureUnit* icu::MeasureUnit::createThermUs(UErrorCode&) | Draft→StableICU 65 -| numberformatter.h | StringClass icu::number::FormattedNumber::toDecimalNumber(UErrorCode&) const | Draft→StableICU 65 -| numberrangeformatter.h | UnicodeString icu::number::FormattedNumberRange::getFirstDecimal(UErrorCode&) const | DraftICU 63 | DeprecatedICU 68 -| numberrangeformatter.h | UnicodeString icu::number::FormattedNumberRange::getSecondDecimal(UErrorCode&) const | DraftICU 63 | DeprecatedICU 68 -| reldatefmt.h | enum UDateAbsoluteUnit::UDAT_ABSOLUTE_HOUR | Draft→StableICU 65 -| reldatefmt.h | enum UDateAbsoluteUnit::UDAT_ABSOLUTE_MINUTE | Draft→StableICU 65 -| stringpiece.h | icu::StringPiece::StringPiece(T) | Draft→StableICU 65 -| ucal.h | int32_t ucal_getHostTimeZone(UChar*, int32_t, UErrorCode*) | Draft→StableICU 65 -| ucharstrie.h | UCharsTrie& icu::UCharsTrie::resetToState64(uint64_t) | Draft→StableICU 65 -| ucharstrie.h | uint64_t icu::UCharsTrie::getState64() const | Draft→StableICU 65 -| ulistformatter.h | UListFormatter* ulistfmt_openForType(const char*, UListFormatterType, UListFormatterWidth, UErrorCode*) | Draft→StableICU 67 -| ulistformatter.h | enum UListFormatterType::ULISTFMT_TYPE_AND | Draft→StableICU 67 -| ulistformatter.h | enum UListFormatterType::ULISTFMT_TYPE_OR | Draft→StableICU 67 -| ulistformatter.h | enum UListFormatterType::ULISTFMT_TYPE_UNITS | Draft→StableICU 67 -| ulistformatter.h | enum UListFormatterWidth::ULISTFMT_WIDTH_NARROW | Draft→StableICU 67 -| ulistformatter.h | enum UListFormatterWidth::ULISTFMT_WIDTH_SHORT | Draft→StableICU 67 -| ulistformatter.h | enum UListFormatterWidth::ULISTFMT_WIDTH_WIDE | Draft→StableICU 67 -| uloc.h | UEnumeration* uloc_openAvailableByType(ULocAvailableType, UErrorCode*) | Draft→StableICU 65 -| uloc.h | enum ULocAvailableType::ULOC_AVAILABLE_DEFAULT | Draft→StableICU 65 -| uloc.h | enum ULocAvailableType::ULOC_AVAILABLE_ONLY_LEGACY_ALIASES | Draft→StableICU 65 -| uloc.h | enum ULocAvailableType::ULOC_AVAILABLE_WITH_LEGACY_ALIASES | Draft→StableICU 65 -| umachine.h | #define FALSE | StableICU 2.0 | DeprecatedICU 68 -| umachine.h | #define TRUE | StableICU 2.0 | DeprecatedICU 68 -| utrace.h | enum UTraceFunctionNumber::UTRACE_UDATA_BUNDLE | Draft→StableICU 65 -| utrace.h | enum UTraceFunctionNumber::UTRACE_UDATA_DATA_FILE | Draft→StableICU 65 -| utrace.h | enum UTraceFunctionNumber::UTRACE_UDATA_RES_FILE | Draft→StableICU 65 -| utrace.h | enum UTraceFunctionNumber::UTRACE_UDATA_START | Draft→StableICU 65 - -## Promoted - -Promoted to stable in ICU 68 - -| File | API | ICU 67 | ICU 68 | -|---|---|---|---| -| bytestrie.h | BytesTrie& icu::BytesTrie::resetToState64(uint64_t) | Draft→StableICU 65 -| bytestrie.h | uint64_t icu::BytesTrie::getState64() const | Draft→StableICU 65 -| fmtable.h | UFormattable* icu::Formattable::toUFormattable() | (missing) | StableICU 52 -| listformatter.h | static ListFormatter* icu::ListFormatter::createInstance(const Locale&, UListFormatterType, UListFormatterWidth, UErrorCode&) | Draft→StableICU 67 -| localebuilder.h | UBool icu::LocaleBuilder::copyErrorTo(UErrorCode&) const | Draft→StableICU 65 -| localematcher.h | Builder& icu::LocaleMatcher::Builder::addSupportedLocale(const Locale&) | Draft→StableICU 65 -| localematcher.h | Builder& icu::LocaleMatcher::Builder::operator=(Builder&&) | Draft→StableICU 65 -| localematcher.h | Builder& icu::LocaleMatcher::Builder::setDefaultLocale(const Locale*) | Draft→StableICU 65 -| localematcher.h | Builder& icu::LocaleMatcher::Builder::setDemotionPerDesiredLocale(ULocMatchDemotion) | Draft→StableICU 65 -| localematcher.h | Builder& icu::LocaleMatcher::Builder::setFavorSubtag(ULocMatchFavorSubtag) | Draft→StableICU 65 -| localematcher.h | Builder& icu::LocaleMatcher::Builder::setSupportedLocales(Iter, Iter) | Draft→StableICU 65 -| localematcher.h | Builder& icu::LocaleMatcher::Builder::setSupportedLocales(Locale::Iterator&) | Draft→StableICU 65 -| localematcher.h | Builder& icu::LocaleMatcher::Builder::setSupportedLocalesFromListString(StringPiece) | Draft→StableICU 65 -| localematcher.h | Builder& icu::LocaleMatcher::Builder::setSupportedLocalesViaConverter(Iter, Iter, Conv) | Draft→StableICU 65 -| localematcher.h | Locale icu::LocaleMatcher::Result::makeResolvedLocale(UErrorCode&) const | Draft→StableICU 65 -| localematcher.h | LocaleMatcher icu::LocaleMatcher::Builder::build(UErrorCode&) const | Draft→StableICU 65 -| localematcher.h | LocaleMatcher& icu::LocaleMatcher::operator=(LocaleMatcher&&) | Draft→StableICU 65 -| localematcher.h | Result icu::LocaleMatcher::getBestMatchResult(Locale::Iterator&, UErrorCode&) const | Draft→StableICU 65 -| localematcher.h | Result icu::LocaleMatcher::getBestMatchResult(const Locale&, UErrorCode&) const | Draft→StableICU 65 -| localematcher.h | Result& icu::LocaleMatcher::Result::operator=(Result&&) | Draft→StableICU 65 -| localematcher.h | UBool icu::LocaleMatcher::Builder::copyErrorTo(UErrorCode&) const | Draft→StableICU 65 -| localematcher.h | const Locale* icu::LocaleMatcher::Result::getDesiredLocale() const | Draft→StableICU 65 -| localematcher.h | const Locale* icu::LocaleMatcher::Result::getSupportedLocale() const | Draft→StableICU 65 -| localematcher.h | const Locale* icu::LocaleMatcher::getBestMatch(Locale::Iterator&, UErrorCode&) const | Draft→StableICU 65 -| localematcher.h | const Locale* icu::LocaleMatcher::getBestMatch(const Locale&, UErrorCode&) const | Draft→StableICU 65 -| localematcher.h | const Locale* icu::LocaleMatcher::getBestMatchForListString(StringPiece, UErrorCode&) const | Draft→StableICU 65 -| localematcher.h | enum ULocMatchDemotion::ULOCMATCH_DEMOTION_NONE | Draft→StableICU 65 -| localematcher.h | enum ULocMatchDemotion::ULOCMATCH_DEMOTION_REGION | Draft→StableICU 65 -| localematcher.h | enum ULocMatchFavorSubtag::ULOCMATCH_FAVOR_LANGUAGE | Draft→StableICU 65 -| localematcher.h | enum ULocMatchFavorSubtag::ULOCMATCH_FAVOR_SCRIPT | Draft→StableICU 65 -| localematcher.h | icu::LocaleMatcher::Builder::Builder() | Draft→StableICU 65 -| localematcher.h | icu::LocaleMatcher::Builder::Builder(Builder&&) | Draft→StableICU 65 -| localematcher.h | icu::LocaleMatcher::Builder::~Builder() | Draft→StableICU 65 -| localematcher.h | icu::LocaleMatcher::LocaleMatcher(LocaleMatcher&&) | Draft→StableICU 65 -| localematcher.h | icu::LocaleMatcher::Result::Result(Result&&) | Draft→StableICU 65 -| localematcher.h | icu::LocaleMatcher::Result::~Result() | Draft→StableICU 65 -| localematcher.h | icu::LocaleMatcher::~LocaleMatcher() | Draft→StableICU 65 -| localematcher.h | int32_t icu::LocaleMatcher::Result::getDesiredIndex() const | Draft→StableICU 65 -| localematcher.h | int32_t icu::LocaleMatcher::Result::getSupportedIndex() const | Draft→StableICU 65 -| locid.h | UBool icu::Locale::ConvertingIterator< Iter, Conv >::hasNext() const override | Draft→StableICU 65 -| locid.h | UBool icu::Locale::Iterator::hasNext() const | Draft→StableICU 65 -| locid.h | UBool icu::Locale::RangeIterator< Iter >::hasNext() const override | Draft→StableICU 65 -| locid.h | const Locale& icu::Locale::ConvertingIterator< Iter, Conv >::next() override | Draft→StableICU 65 -| locid.h | const Locale& icu::Locale::Iterator::next() | Draft→StableICU 65 -| locid.h | const Locale& icu::Locale::RangeIterator< Iter >::next() override | Draft→StableICU 65 -| locid.h | icu::Locale::ConvertingIterator< Iter, Conv >::ConvertingIterator(Iter, Iter, Conv) | Draft→StableICU 65 -| locid.h | icu::Locale::Iterator::~Iterator() | Draft→StableICU 65 -| locid.h | icu::Locale::RangeIterator< Iter >::RangeIterator(Iter, Iter) | Draft→StableICU 65 -| measunit.h | static MeasureUnit icu::MeasureUnit::getBar() | Draft→StableICU 65 -| measunit.h | static MeasureUnit icu::MeasureUnit::getDecade() | Draft→StableICU 65 -| measunit.h | static MeasureUnit icu::MeasureUnit::getDotPerCentimeter() | Draft→StableICU 65 -| measunit.h | static MeasureUnit icu::MeasureUnit::getDotPerInch() | Draft→StableICU 65 -| measunit.h | static MeasureUnit icu::MeasureUnit::getEm() | Draft→StableICU 65 -| measunit.h | static MeasureUnit icu::MeasureUnit::getMegapixel() | Draft→StableICU 65 -| measunit.h | static MeasureUnit icu::MeasureUnit::getPascal() | Draft→StableICU 65 -| measunit.h | static MeasureUnit icu::MeasureUnit::getPixel() | Draft→StableICU 65 -| measunit.h | static MeasureUnit icu::MeasureUnit::getPixelPerCentimeter() | Draft→StableICU 65 -| measunit.h | static MeasureUnit icu::MeasureUnit::getPixelPerInch() | Draft→StableICU 65 -| measunit.h | static MeasureUnit icu::MeasureUnit::getThermUs() | Draft→StableICU 65 -| measunit.h | static MeasureUnit* icu::MeasureUnit::createBar(UErrorCode&) | Draft→StableICU 65 -| measunit.h | static MeasureUnit* icu::MeasureUnit::createDecade(UErrorCode&) | Draft→StableICU 65 -| measunit.h | static MeasureUnit* icu::MeasureUnit::createDotPerCentimeter(UErrorCode&) | Draft→StableICU 65 -| measunit.h | static MeasureUnit* icu::MeasureUnit::createDotPerInch(UErrorCode&) | Draft→StableICU 65 -| measunit.h | static MeasureUnit* icu::MeasureUnit::createEm(UErrorCode&) | Draft→StableICU 65 -| measunit.h | static MeasureUnit* icu::MeasureUnit::createMegapixel(UErrorCode&) | Draft→StableICU 65 -| measunit.h | static MeasureUnit* icu::MeasureUnit::createPascal(UErrorCode&) | Draft→StableICU 65 -| measunit.h | static MeasureUnit* icu::MeasureUnit::createPixel(UErrorCode&) | Draft→StableICU 65 -| measunit.h | static MeasureUnit* icu::MeasureUnit::createPixelPerCentimeter(UErrorCode&) | Draft→StableICU 65 -| measunit.h | static MeasureUnit* icu::MeasureUnit::createPixelPerInch(UErrorCode&) | Draft→StableICU 65 -| measunit.h | static MeasureUnit* icu::MeasureUnit::createThermUs(UErrorCode&) | Draft→StableICU 65 -| numberformatter.h | StringClass icu::number::FormattedNumber::toDecimalNumber(UErrorCode&) const | Draft→StableICU 65 -| reldatefmt.h | enum UDateAbsoluteUnit::UDAT_ABSOLUTE_HOUR | Draft→StableICU 65 -| reldatefmt.h | enum UDateAbsoluteUnit::UDAT_ABSOLUTE_MINUTE | Draft→StableICU 65 -| stringpiece.h | icu::StringPiece::StringPiece(T) | Draft→StableICU 65 -| ucal.h | int32_t ucal_getHostTimeZone(UChar*, int32_t, UErrorCode*) | Draft→StableICU 65 -| ucharstrie.h | UCharsTrie& icu::UCharsTrie::resetToState64(uint64_t) | Draft→StableICU 65 -| ucharstrie.h | uint64_t icu::UCharsTrie::getState64() const | Draft→StableICU 65 -| ulistformatter.h | UListFormatter* ulistfmt_openForType(const char*, UListFormatterType, UListFormatterWidth, UErrorCode*) | Draft→StableICU 67 -| ulistformatter.h | enum UListFormatterType::ULISTFMT_TYPE_AND | Draft→StableICU 67 -| ulistformatter.h | enum UListFormatterType::ULISTFMT_TYPE_OR | Draft→StableICU 67 -| ulistformatter.h | enum UListFormatterType::ULISTFMT_TYPE_UNITS | Draft→StableICU 67 -| ulistformatter.h | enum UListFormatterWidth::ULISTFMT_WIDTH_NARROW | Draft→StableICU 67 -| ulistformatter.h | enum UListFormatterWidth::ULISTFMT_WIDTH_SHORT | Draft→StableICU 67 -| ulistformatter.h | enum UListFormatterWidth::ULISTFMT_WIDTH_WIDE | Draft→StableICU 67 -| uloc.h | UEnumeration* uloc_openAvailableByType(ULocAvailableType, UErrorCode*) | Draft→StableICU 65 -| uloc.h | enum ULocAvailableType::ULOC_AVAILABLE_DEFAULT | Draft→StableICU 65 -| uloc.h | enum ULocAvailableType::ULOC_AVAILABLE_ONLY_LEGACY_ALIASES | Draft→StableICU 65 -| uloc.h | enum ULocAvailableType::ULOC_AVAILABLE_WITH_LEGACY_ALIASES | Draft→StableICU 65 -| uniset.h | USet* icu::UnicodeSet::toUSet() | (missing) | StableICU 4.2 -| utrace.h | enum UTraceFunctionNumber::UTRACE_UDATA_BUNDLE | Draft→StableICU 65 -| utrace.h | enum UTraceFunctionNumber::UTRACE_UDATA_DATA_FILE | Draft→StableICU 65 -| utrace.h | enum UTraceFunctionNumber::UTRACE_UDATA_RES_FILE | Draft→StableICU 65 -| utrace.h | enum UTraceFunctionNumber::UTRACE_UDATA_START | Draft→StableICU 65 - -## Added - -Added in ICU 68 - -| File | API | ICU 67 | ICU 68 | -|---|---|---|---| -| dtitvfmt.h | UDisplayContext icu::DateIntervalFormat::getContext(UDisplayContextType, UErrorCode&) const | (missing) | DraftICU 68 -| dtitvfmt.h | void icu::DateIntervalFormat::setContext(UDisplayContext, UErrorCode&) | (missing) | DraftICU 68 -| dtptngen.h | static DateTimePatternGenerator* icu::DateTimePatternGenerator::createInstanceNoStdPat(const Locale&, UErrorCode&) | (missing) | Internal -| fmtable.h | UFormattable* icu::Formattable::toUFormattable() | (missing) | StableICU 52 -| localematcher.h | Builder& icu::LocaleMatcher::Builder::setMaxDistance(const Locale&, const Locale&) | (missing) | DraftICU 68 -| localematcher.h | Builder& icu::LocaleMatcher::Builder::setNoDefaultLocale() | (missing) | DraftICU 68 -| localematcher.h | UBool icu::LocaleMatcher::isMatch(const Locale&, const Locale&, UErrorCode&) const | (missing) | DraftICU 68 -| measunit.h | int32_t icu::MeasureUnit::getOffset() const | (missing) | Internal -| measunit.h | static MeasureUnit icu::MeasureUnit::getCandela() | (missing) | DraftICU 68 -| measunit.h | static MeasureUnit icu::MeasureUnit::getDessertSpoon() | (missing) | DraftICU 68 -| measunit.h | static MeasureUnit icu::MeasureUnit::getDessertSpoonImperial() | (missing) | DraftICU 68 -| measunit.h | static MeasureUnit icu::MeasureUnit::getDot() | (missing) | DraftICU 68 -| measunit.h | static MeasureUnit icu::MeasureUnit::getDram() | (missing) | DraftICU 68 -| measunit.h | static MeasureUnit icu::MeasureUnit::getDrop() | (missing) | DraftICU 68 -| measunit.h | static MeasureUnit icu::MeasureUnit::getEarthRadius() | (missing) | DraftICU 68 -| measunit.h | static MeasureUnit icu::MeasureUnit::getGrain() | (missing) | DraftICU 68 -| measunit.h | static MeasureUnit icu::MeasureUnit::getJigger() | (missing) | DraftICU 68 -| measunit.h | static MeasureUnit icu::MeasureUnit::getLumen() | (missing) | DraftICU 68 -| measunit.h | static MeasureUnit icu::MeasureUnit::getPinch() | (missing) | DraftICU 68 -| measunit.h | static MeasureUnit icu::MeasureUnit::getQuartImperial() | (missing) | DraftICU 68 -| measunit.h | static MeasureUnit* icu::MeasureUnit::createCandela(UErrorCode&) | (missing) | DraftICU 68 -| measunit.h | static MeasureUnit* icu::MeasureUnit::createDessertSpoon(UErrorCode&) | (missing) | DraftICU 68 -| measunit.h | static MeasureUnit* icu::MeasureUnit::createDessertSpoonImperial(UErrorCode&) | (missing) | DraftICU 68 -| measunit.h | static MeasureUnit* icu::MeasureUnit::createDot(UErrorCode&) | (missing) | DraftICU 68 -| measunit.h | static MeasureUnit* icu::MeasureUnit::createDram(UErrorCode&) | (missing) | DraftICU 68 -| measunit.h | static MeasureUnit* icu::MeasureUnit::createDrop(UErrorCode&) | (missing) | DraftICU 68 -| measunit.h | static MeasureUnit* icu::MeasureUnit::createEarthRadius(UErrorCode&) | (missing) | DraftICU 68 -| measunit.h | static MeasureUnit* icu::MeasureUnit::createGrain(UErrorCode&) | (missing) | DraftICU 68 -| measunit.h | static MeasureUnit* icu::MeasureUnit::createJigger(UErrorCode&) | (missing) | DraftICU 68 -| measunit.h | static MeasureUnit* icu::MeasureUnit::createLumen(UErrorCode&) | (missing) | DraftICU 68 -| measunit.h | static MeasureUnit* icu::MeasureUnit::createPinch(UErrorCode&) | (missing) | DraftICU 68 -| measunit.h | static MeasureUnit* icu::MeasureUnit::createQuartImperial(UErrorCode&) | (missing) | DraftICU 68 -| measunit.h | std::pair< LocalArray< MeasureUnit >, int32_t > icu::MeasureUnit::splitToSingleUnits(UErrorCode&) const | (missing) | DraftICU 68 -| numberformatter.h | Derived icu::number::NumberFormatterSettings< Derived >::usage(StringPiece) const& | (missing) | DraftICU 68 -| numberformatter.h | Derived icu::number::NumberFormatterSettings< Derived >::usage(StringPiece)&& | (missing) | DraftICU 68 -| numberformatter.h | MeasureUnit icu::number::FormattedNumber::getOutputUnit(UErrorCode&) const | (missing) | DraftICU 68 -| numberformatter.h | Usage& icu::number::impl::Usage::operator=(Usage&&) | (missing) | Internal -| numberformatter.h | Usage& icu::number::impl::Usage::operator=(const Usage&) | (missing) | Internal -| numberformatter.h | bool icu::number::impl::Usage::isSet() const | (missing) | Internal -| numberformatter.h | icu::number::impl::Usage::Usage(Usage&&) | (missing) | Internal -| numberformatter.h | icu::number::impl::Usage::Usage(const Usage&) | (missing) | Internal -| numberformatter.h | icu::number::impl::Usage::~Usage() | (missing) | Internal -| numberformatter.h | int16_t icu::number::impl::Usage::length() const | (missing) | Internal -| numberformatter.h | void icu::number::impl::Usage::set(StringPiece) | (missing) | Internal -| numberrangeformatter.h | std::pair< StringClass, StringClass > icu::number::FormattedNumberRange::getDecimalNumbers(UErrorCode&) const | (missing) | DraftICU 68 -| plurrule.h | UnicodeString icu::PluralRules::select(const number::FormattedNumberRange&, UErrorCode&) const | (missing) | DraftICU 68 -| plurrule.h | UnicodeString icu::PluralRules::select(const number::impl::UFormattedNumberRangeData*, UErrorCode&) const | (missing) | Internal -| plurrule.h | int32_t icu::PluralRules::getSamples(const UnicodeString&, FixedDecimal*, int32_t, UErrorCode&) | (missing) | Internal -| timezone.h | static TimeZone* icu::TimeZone::forLocaleOrDefault(const Locale&) | (missing) | Internal -| ucurr.h | enum UCurrNameStyle::UCURR_FORMAL_SYMBOL_NAME | (missing) | DraftICU 68 -| ucurr.h | enum UCurrNameStyle::UCURR_VARIANT_SYMBOL_NAME | (missing) | DraftICU 68 -| udateintervalformat.h | UDisplayContext udtitvfmt_getContext(const UDateIntervalFormat*, UDisplayContextType, UErrorCode*) | (missing) | DraftICU 68 -| udateintervalformat.h | void udtitvfmt_setContext(UDateIntervalFormat*, UDisplayContext, UErrorCode*) | (missing) | DraftICU 68 -| umachine.h | #define U_DEFINE_FALSE_AND_TRUE | (missing) | InternalICU 68 -| uniset.h | USet* icu::UnicodeSet::toUSet() | (missing) | StableICU 4.2 -| unum.h | enum UNumberFormatMinimumGroupingDigits::UNUM_MINIMUM_GROUPING_DIGITS_AUTO | (missing) | DraftICU 68 -| unum.h | enum UNumberFormatMinimumGroupingDigits::UNUM_MINIMUM_GROUPING_DIGITS_MIN2 | (missing) | DraftICU 68 -| unumberformatter.h | enum UNumberUnitWidth::UNUM_UNIT_WIDTH_FORMAL | (missing) | DraftICU 68 -| unumberformatter.h | enum UNumberUnitWidth::UNUM_UNIT_WIDTH_VARIANT | (missing) | DraftICU 68 -| unumberformatter.h | int32_t unumf_resultToDecimalNumber(const UFormattedNumber*, char*, int32_t, UErrorCode*) | (missing) | DraftICU 68 -| unumberrangeformatter.h | UFormattedNumberRange* unumrf_openResult(UErrorCode*) | (missing) | DraftICU 68 -| unumberrangeformatter.h | UNumberRangeFormatter* unumrf_openForSkeletonWithCollapseAndIdentityFallback(const UChar*, int32_t, UNumberRangeCollapse, UNumberRangeIdentityFallback, const char*, UParseError*, UErrorCode*) | (missing) | DraftICU 68 -| unumberrangeformatter.h | UNumberRangeIdentityResult unumrf_resultGetIdentityResult(const UFormattedNumberRange*, UErrorCode*) | (missing) | DraftICU 68 -| unumberrangeformatter.h | const UFormattedValue* unumrf_resultAsValue(const UFormattedNumberRange*, UErrorCode*) | (missing) | DraftICU 68 -| unumberrangeformatter.h | int32_t unumrf_resultGetFirstDecimalNumber(const UFormattedNumberRange*, char*, int32_t, UErrorCode*) | (missing) | DraftICU 68 -| unumberrangeformatter.h | int32_t unumrf_resultGetSecondDecimalNumber(const UFormattedNumberRange*, char*, int32_t, UErrorCode*) | (missing) | DraftICU 68 -| unumberrangeformatter.h | void unumrf_close(UNumberRangeFormatter*) | (missing) | DraftICU 68 -| unumberrangeformatter.h | void unumrf_closeResult(UFormattedNumberRange*) | (missing) | DraftICU 68 -| unumberrangeformatter.h | void unumrf_formatDecimalRange(const UNumberRangeFormatter*, const char*, int32_t, const char*, int32_t, UFormattedNumberRange*, UErrorCode*) | (missing) | DraftICU 68 -| unumberrangeformatter.h | void unumrf_formatDoubleRange(const UNumberRangeFormatter*, double, double, UFormattedNumberRange*, UErrorCode*) | (missing) | DraftICU 68 -| upluralrules.h | int32_t uplrules_selectForRange(const UPluralRules*, const struct UFormattedNumberRange*, UChar*, int32_t, UErrorCode*) | (missing) | DraftICU 68 - -## Other - -Other existing drafts in ICU 68 - -| File | API | ICU 67 | ICU 68 | -|---|---|---|---| -| bytestream.h | void icu::ByteSink::AppendU8(const char*, int32_t) | DraftICU 67 | -| bytestream.h | void icu::ByteSink::AppendU8(const char8_t*, int32_t) | DraftICU 67 | -| dtptngen.h | UDateFormatHourCycle icu::DateTimePatternGenerator::getDefaultHourCycle(UErrorCode&) const | DraftICU 67 | -| localematcher.h | Builder& icu::LocaleMatcher::Builder::setDirection(ULocMatchDirection) | DraftICU 67 | -| localematcher.h | enum ULocMatchDirection::ULOCMATCH_DIRECTION_ONLY_TWO_WAY | DraftICU 67 | -| localematcher.h | enum ULocMatchDirection::ULOCMATCH_DIRECTION_WITH_ONE_WAY | DraftICU 67 | -| locid.h | void icu::Locale::canonicalize(UErrorCode&) | DraftICU 67 | -| measfmt.h | void icu::MeasureFormat::parseObject(const UnicodeString&, Formattable&, ParsePosition&) const | DraftICU 53 | -| measunit.h | MeasureUnit icu::MeasureUnit::product(const MeasureUnit&, UErrorCode&) const | DraftICU 67 | -| measunit.h | MeasureUnit icu::MeasureUnit::reciprocal(UErrorCode&) const | DraftICU 67 | -| measunit.h | MeasureUnit icu::MeasureUnit::withDimensionality(int32_t, UErrorCode&) const | DraftICU 67 | -| measunit.h | MeasureUnit icu::MeasureUnit::withSIPrefix(UMeasureSIPrefix, UErrorCode&) const | DraftICU 67 | -| measunit.h | MeasureUnit& icu::MeasureUnit::operator=(MeasureUnit&&) noexcept | DraftICU 67 | -| measunit.h | UMeasureSIPrefix icu::MeasureUnit::getSIPrefix(UErrorCode&) const | DraftICU 67 | -| measunit.h | UMeasureUnitComplexity icu::MeasureUnit::getComplexity(UErrorCode&) const | DraftICU 67 | -| measunit.h | const char* icu::MeasureUnit::getIdentifier() const | DraftICU 67 | -| measunit.h | icu::MeasureUnit::MeasureUnit(MeasureUnit&&) noexcept | DraftICU 67 | -| measunit.h | int32_t icu::MeasureUnit::getDimensionality(UErrorCode&) const | DraftICU 67 | -| measunit.h | static MeasureUnit icu::MeasureUnit::forIdentifier(StringPiece, UErrorCode&) | DraftICU 67 | -| stringpiece.h | icu::StringPiece::StringPiece(const char8_t*) | DraftICU 67 | -| stringpiece.h | icu::StringPiece::StringPiece(const char8_t*, int32_t) | DraftICU 67 | -| stringpiece.h | icu::StringPiece::StringPiece(const std::u8string&) | DraftICU 67 | -| stringpiece.h | icu::StringPiece::StringPiece(std::nullptr_t) | DraftICU 67 | -| stringpiece.h | int32_t icu::StringPiece::compare(StringPiece) | DraftICU 67 | -| stringpiece.h | int32_t icu::StringPiece::find(StringPiece, int32_t) | DraftICU 67 | -| stringpiece.h | void icu::StringPiece::set(const char8_t*) | DraftICU 67 | -| stringpiece.h | void icu::StringPiece::set(const char8_t*, int32_t) | DraftICU 67 | -| udat.h | enum UDateFormatHourCycle::UDAT_HOUR_CYCLE_11 | DraftICU 67 | -| udat.h | enum UDateFormatHourCycle::UDAT_HOUR_CYCLE_12 | DraftICU 67 | -| udat.h | enum UDateFormatHourCycle::UDAT_HOUR_CYCLE_23 | DraftICU 67 | -| udat.h | enum UDateFormatHourCycle::UDAT_HOUR_CYCLE_24 | DraftICU 67 | -| udateintervalformat.h | void udtitvfmt_formatCalendarToResult(const UDateIntervalFormat*, UCalendar*, UCalendar*, UFormattedDateInterval*, UErrorCode*) | DraftICU 67 | -| udateintervalformat.h | void udtitvfmt_formatToResult(const UDateIntervalFormat*, UDate, UDate, UFormattedDateInterval*, UErrorCode*) | DraftICU 67 | -| udatpg.h | UDateFormatHourCycle udatpg_getDefaultHourCycle(const UDateTimePatternGenerator*, UErrorCode*) | DraftICU 67 | -| uregex.h | enum URegexpFlag::UREGEX_CANON_EQ | DraftICU 2.4 | -| utrace.h | enum UTraceFunctionNumber::UTRACE_UBRK_CREATE_BREAK_ENGINE | DraftICU 67 | -| utrace.h | enum UTraceFunctionNumber::UTRACE_UBRK_CREATE_CHARACTER | DraftICU 67 | -| utrace.h | enum UTraceFunctionNumber::UTRACE_UBRK_CREATE_LINE | DraftICU 67 | -| utrace.h | enum UTraceFunctionNumber::UTRACE_UBRK_CREATE_SENTENCE | DraftICU 67 | -| utrace.h | enum UTraceFunctionNumber::UTRACE_UBRK_CREATE_TITLE | DraftICU 67 | -| utrace.h | enum UTraceFunctionNumber::UTRACE_UBRK_CREATE_WORD | DraftICU 67 | -| utrace.h | enum UTraceFunctionNumber::UTRACE_UBRK_START | DraftICU 67 | - -## Simplifications - -This section shows cases where the signature was "simplified" for the sake of comparison. The simplified form is in bold, followed by - all possible variations in "original" form. - - -## Colophon - -Contents generated by StableAPI tool on Fri Oct 23 11:32:42 PDT 2020 - -Copyright © 2019 and later: Unicode, Inc. and others. -License & terms of use: http://www.unicode.org/copyright.html - \ No newline at end of file diff --git a/thirdparty/icu4c/common/bytestriebuilder.cpp b/thirdparty/icu4c/common/bytestriebuilder.cpp index ec1ab7d8f5..28256f272a 100644 --- a/thirdparty/icu4c/common/bytestriebuilder.cpp +++ b/thirdparty/icu4c/common/bytestriebuilder.cpp @@ -474,31 +474,39 @@ BytesTrieBuilder::writeDeltaTo(int32_t jumpTarget) { U_ASSERT(i>=0); if(i<=BytesTrie::kMaxOneByteDelta) { return write(i); + } else { + char intBytes[5]; + return write(intBytes, internalEncodeDelta(i, intBytes)); } - char intBytes[5]; - int32_t length; +} + +int32_t +BytesTrieBuilder::internalEncodeDelta(int32_t i, char intBytes[]) { + U_ASSERT(i>=0); + if(i<=BytesTrie::kMaxOneByteDelta) { + intBytes[0]=(char)i; + return 1; + } + int32_t length=1; if(i<=BytesTrie::kMaxTwoByteDelta) { intBytes[0]=(char)(BytesTrie::kMinTwoByteDeltaLead+(i>>8)); - length=1; } else { if(i<=BytesTrie::kMaxThreeByteDelta) { intBytes[0]=(char)(BytesTrie::kMinThreeByteDeltaLead+(i>>16)); - length=2; } else { if(i<=0xffffff) { intBytes[0]=(char)BytesTrie::kFourByteDeltaLead; - length=3; } else { intBytes[0]=(char)BytesTrie::kFiveByteDeltaLead; intBytes[1]=(char)(i>>24); - length=4; + length=2; } - intBytes[1]=(char)(i>>16); + intBytes[length++]=(char)(i>>16); } - intBytes[1]=(char)(i>>8); + intBytes[length++]=(char)(i>>8); } intBytes[length++]=(char)i; - return write(intBytes, length); + return length; } U_NAMESPACE_END diff --git a/thirdparty/icu4c/common/charstr.cpp b/thirdparty/icu4c/common/charstr.cpp index 318a185b3f..c35622882c 100644 --- a/thirdparty/icu4c/common/charstr.cpp +++ b/thirdparty/icu4c/common/charstr.cpp @@ -14,6 +14,8 @@ * created by: Markus W. Scherer */ +#include + #include "unicode/utypes.h" #include "unicode/putil.h" #include "charstr.h" @@ -141,6 +143,38 @@ CharString &CharString::append(const char *s, int32_t sLength, UErrorCode &error return *this; } +CharString &CharString::appendNumber(int32_t number, UErrorCode &status) { + if (number < 0) { + this->append('-', status); + if (U_FAILURE(status)) { + return *this; + } + } + + if (number == 0) { + this->append('0', status); + return *this; + } + + int32_t numLen = 0; + while (number != 0) { + int32_t residue = number % 10; + number /= 10; + this->append(std::abs(residue) + '0', status); + numLen++; + if (U_FAILURE(status)) { + return *this; + } + } + + int32_t start = this->length() - numLen, end = this->length() - 1; + while(start < end) { + std::swap(this->data()[start++], this->data()[end--]); + } + + return *this; +} + char *CharString::getAppendBuffer(int32_t minCapacity, int32_t desiredCapacityHint, int32_t &resultCapacity, diff --git a/thirdparty/icu4c/common/charstr.h b/thirdparty/icu4c/common/charstr.h index 6619faac61..175acd1c0a 100644 --- a/thirdparty/icu4c/common/charstr.h +++ b/thirdparty/icu4c/common/charstr.h @@ -127,6 +127,9 @@ public: return append(s.data(), s.length(), errorCode); } CharString &append(const char *s, int32_t sLength, UErrorCode &status); + + CharString &appendNumber(int32_t number, UErrorCode &status); + /** * Returns a writable buffer for appending and writes the buffer's capacity to * resultCapacity. Guarantees resultCapacity>=minCapacity if U_SUCCESS(). diff --git a/thirdparty/icu4c/common/cmemory.h b/thirdparty/icu4c/common/cmemory.h index a9d9424b4e..f03b7dcce6 100644 --- a/thirdparty/icu4c/common/cmemory.h +++ b/thirdparty/icu4c/common/cmemory.h @@ -31,14 +31,63 @@ #include #include #include "unicode/localpointer.h" +#include "uassert.h" #if U_DEBUG && defined(UPRV_MALLOC_COUNT) #include #endif - -#define uprv_memcpy(dst, src, size) U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size) -#define uprv_memmove(dst, src, size) U_STANDARD_CPP_NAMESPACE memmove(dst, src, size) +// uprv_memcpy and uprv_memmove +#if defined(__clang__) +#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \ + /* Suppress warnings about addresses that will never be NULL */ \ + _Pragma("clang diagnostic push") \ + _Pragma("clang diagnostic ignored \"-Waddress\"") \ + U_ASSERT(dst != NULL); \ + U_ASSERT(src != NULL); \ + _Pragma("clang diagnostic pop") \ + U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \ +} UPRV_BLOCK_MACRO_END +#define uprv_memmove(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \ + /* Suppress warnings about addresses that will never be NULL */ \ + _Pragma("clang diagnostic push") \ + _Pragma("clang diagnostic ignored \"-Waddress\"") \ + U_ASSERT(dst != NULL); \ + U_ASSERT(src != NULL); \ + _Pragma("clang diagnostic pop") \ + U_STANDARD_CPP_NAMESPACE memmove(dst, src, size); \ +} UPRV_BLOCK_MACRO_END +#elif defined(__GNUC__) +#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \ + /* Suppress warnings about addresses that will never be NULL */ \ + _Pragma("GCC diagnostic push") \ + _Pragma("GCC diagnostic ignored \"-Waddress\"") \ + U_ASSERT(dst != NULL); \ + U_ASSERT(src != NULL); \ + _Pragma("GCC diagnostic pop") \ + U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \ +} UPRV_BLOCK_MACRO_END +#define uprv_memmove(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \ + /* Suppress warnings about addresses that will never be NULL */ \ + _Pragma("GCC diagnostic push") \ + _Pragma("GCC diagnostic ignored \"-Waddress\"") \ + U_ASSERT(dst != NULL); \ + U_ASSERT(src != NULL); \ + _Pragma("GCC diagnostic pop") \ + U_STANDARD_CPP_NAMESPACE memmove(dst, src, size); \ +} UPRV_BLOCK_MACRO_END +#else +#define uprv_memcpy(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \ + U_ASSERT(dst != NULL); \ + U_ASSERT(src != NULL); \ + U_STANDARD_CPP_NAMESPACE memcpy(dst, src, size); \ +} UPRV_BLOCK_MACRO_END +#define uprv_memmove(dst, src, size) UPRV_BLOCK_MACRO_BEGIN { \ + U_ASSERT(dst != NULL); \ + U_ASSERT(src != NULL); \ + U_STANDARD_CPP_NAMESPACE memmove(dst, src, size); \ +} UPRV_BLOCK_MACRO_END +#endif /** * \def UPRV_LENGTHOF diff --git a/thirdparty/icu4c/common/dictbe.cpp b/thirdparty/icu4c/common/dictbe.cpp index b42cdf03fa..44285755f3 100644 --- a/thirdparty/icu4c/common/dictbe.cpp +++ b/thirdparty/icu4c/common/dictbe.cpp @@ -265,13 +265,9 @@ ThaiBreakEngine::divideUpDictionaryRange( UText *text, goto foundBest; } do { - int32_t wordsMatched = 1; if (words[(wordsFound + 1) % THAI_LOOKAHEAD].candidates(text, fDictionary, rangeEnd) > 0) { - if (wordsMatched < 2) { - // Followed by another dictionary word; mark first word as a good candidate - words[wordsFound%THAI_LOOKAHEAD].markCurrent(); - wordsMatched = 2; - } + // Followed by another dictionary word; mark first word as a good candidate + words[wordsFound%THAI_LOOKAHEAD].markCurrent(); // If we're already at the end of the range, we're done if ((int32_t)utext_getNativeIndex(text) >= rangeEnd) { @@ -503,13 +499,9 @@ LaoBreakEngine::divideUpDictionaryRange( UText *text, goto foundBest; } do { - int32_t wordsMatched = 1; if (words[(wordsFound + 1) % LAO_LOOKAHEAD].candidates(text, fDictionary, rangeEnd) > 0) { - if (wordsMatched < 2) { - // Followed by another dictionary word; mark first word as a good candidate - words[wordsFound%LAO_LOOKAHEAD].markCurrent(); - wordsMatched = 2; - } + // Followed by another dictionary word; mark first word as a good candidate + words[wordsFound%LAO_LOOKAHEAD].markCurrent(); // If we're already at the end of the range, we're done if ((int32_t)utext_getNativeIndex(text) >= rangeEnd) { @@ -699,13 +691,9 @@ BurmeseBreakEngine::divideUpDictionaryRange( UText *text, goto foundBest; } do { - int32_t wordsMatched = 1; if (words[(wordsFound + 1) % BURMESE_LOOKAHEAD].candidates(text, fDictionary, rangeEnd) > 0) { - if (wordsMatched < 2) { - // Followed by another dictionary word; mark first word as a good candidate - words[wordsFound%BURMESE_LOOKAHEAD].markCurrent(); - wordsMatched = 2; - } + // Followed by another dictionary word; mark first word as a good candidate + words[wordsFound%BURMESE_LOOKAHEAD].markCurrent(); // If we're already at the end of the range, we're done if ((int32_t)utext_getNativeIndex(text) >= rangeEnd) { @@ -908,13 +896,9 @@ KhmerBreakEngine::divideUpDictionaryRange( UText *text, goto foundBest; } do { - int32_t wordsMatched = 1; if (words[(wordsFound + 1) % KHMER_LOOKAHEAD].candidates(text, fDictionary, rangeEnd) > 0) { - if (wordsMatched < 2) { - // Followed by another dictionary word; mark first word as a good candidate - words[wordsFound % KHMER_LOOKAHEAD].markCurrent(); - wordsMatched = 2; - } + // Followed by another dictionary word; mark first word as a good candidate + words[wordsFound % KHMER_LOOKAHEAD].markCurrent(); // If we're already at the end of the range, we're done if ((int32_t)utext_getNativeIndex(text) >= rangeEnd) { diff --git a/thirdparty/icu4c/common/edits.cpp b/thirdparty/icu4c/common/edits.cpp index 95f0c19a72..92ca36fb5d 100644 --- a/thirdparty/icu4c/common/edits.cpp +++ b/thirdparty/icu4c/common/edits.cpp @@ -86,6 +86,7 @@ Edits &Edits::moveArray(Edits &src) U_NOEXCEPT { } Edits &Edits::operator=(const Edits &other) { + if (this == &other) { return *this; } // self-assignment: no-op length = other.length; delta = other.delta; numChanges = other.numChanges; diff --git a/thirdparty/icu4c/common/filteredbrk.cpp b/thirdparty/icu4c/common/filteredbrk.cpp index c07128cbce..25080f9d33 100644 --- a/thirdparty/icu4c/common/filteredbrk.cpp +++ b/thirdparty/icu4c/common/filteredbrk.cpp @@ -20,6 +20,7 @@ #include "ubrkimpl.h" // U_ICUDATA_BRKITR #include "uvector.h" #include "cmemory.h" +#include "umutex.h" U_NAMESPACE_BEGIN @@ -139,13 +140,30 @@ class SimpleFilteredSentenceBreakData : public UMemory { public: SimpleFilteredSentenceBreakData(UCharsTrie *forwards, UCharsTrie *backwards ) : fForwardsPartialTrie(forwards), fBackwardsTrie(backwards), refcount(1) { } - SimpleFilteredSentenceBreakData *incr() { refcount++; return this; } - SimpleFilteredSentenceBreakData *decr() { if((--refcount) <= 0) delete this; return 0; } - virtual ~SimpleFilteredSentenceBreakData(); + SimpleFilteredSentenceBreakData *incr() { + umtx_atomic_inc(&refcount); + return this; + } + SimpleFilteredSentenceBreakData *decr() { + if(umtx_atomic_dec(&refcount) <= 0) { + delete this; + } + return 0; + } + virtual ~SimpleFilteredSentenceBreakData(); - LocalPointer fForwardsPartialTrie; // Has ".a" for "a.M." - LocalPointer fBackwardsTrie; // i.e. ".srM" for Mrs. - int32_t refcount; + bool hasForwardsPartialTrie() const { return fForwardsPartialTrie.isValid(); } + bool hasBackwardsTrie() const { return fBackwardsTrie.isValid(); } + + const UCharsTrie &getForwardsPartialTrie() const { return *fForwardsPartialTrie; } + const UCharsTrie &getBackwardsTrie() const { return *fBackwardsTrie; } + +private: + // These tries own their data arrays. + // They are shared and must therefore not be modified. + LocalPointer fForwardsPartialTrie; // Has ".a" for "a.M." + LocalPointer fBackwardsTrie; // i.e. ".srM" for Mrs. + u_atomic_int32_t refcount; }; SimpleFilteredSentenceBreakData::~SimpleFilteredSentenceBreakData() {} @@ -244,7 +262,13 @@ SimpleFilteredSentenceBreakIterator::SimpleFilteredSentenceBreakIterator(BreakIt fData(new SimpleFilteredSentenceBreakData(forwards, backwards)), fDelegate(adopt) { - // all set.. + if (fData == nullptr) { + delete forwards; + delete backwards; + if (U_SUCCESS(status)) { + status = U_MEMORY_ALLOCATION_ERROR; + } + } } SimpleFilteredSentenceBreakIterator::~SimpleFilteredSentenceBreakIterator() { @@ -261,59 +285,62 @@ SimpleFilteredSentenceBreakIterator::breakExceptionAt(int32_t n) { int32_t bestValue = -1; // loops while 'n' points to an exception. utext_setNativeIndex(fText.getAlias(), n); // from n.. - fData->fBackwardsTrie->reset(); - UChar32 uch; //if(debug2) u_printf(" n@ %d\n", n); // Assume a space is following the '.' (so we handle the case: "Mr. /Brown") - if((uch=utext_previous32(fText.getAlias()))==(UChar32)0x0020) { // TODO: skip a class of chars here?? + if(utext_previous32(fText.getAlias())==u' ') { // TODO: skip a class of chars here?? // TODO only do this the 1st time? //if(debug2) u_printf("skipping prev: |%C| \n", (UChar)uch); } else { //if(debug2) u_printf("not skipping prev: |%C| \n", (UChar)uch); - uch = utext_next32(fText.getAlias()); + utext_next32(fText.getAlias()); //if(debug2) u_printf(" -> : |%C| \n", (UChar)uch); } - UStringTrieResult r = USTRINGTRIE_INTERMEDIATE_VALUE; - - while((uch=utext_previous32(fText.getAlias()))!=U_SENTINEL && // more to consume backwards and.. - USTRINGTRIE_HAS_NEXT(r=fData->fBackwardsTrie->nextForCodePoint(uch))) {// more in the trie - if(USTRINGTRIE_HAS_VALUE(r)) { // remember the best match so far - bestPosn = utext_getNativeIndex(fText.getAlias()); - bestValue = fData->fBackwardsTrie->getValue(); - } - //if(debug2) u_printf("rev< /%C/ cont?%d @%d\n", (UChar)uch, r, utext_getNativeIndex(fText.getAlias())); + { + // Do not modify the shared trie! + UCharsTrie iter(fData->getBackwardsTrie()); + UChar32 uch; + while((uch=utext_previous32(fText.getAlias()))!=U_SENTINEL) { // more to consume backwards + UStringTrieResult r = iter.nextForCodePoint(uch); + if(USTRINGTRIE_HAS_VALUE(r)) { // remember the best match so far + bestPosn = utext_getNativeIndex(fText.getAlias()); + bestValue = iter.getValue(); + } + if(!USTRINGTRIE_HAS_NEXT(r)) { + break; + } + //if(debug2) u_printf("rev< /%C/ cont?%d @%d\n", (UChar)uch, r, utext_getNativeIndex(fText.getAlias())); + } } - if(USTRINGTRIE_MATCHES(r)) { // exact match? - //if(debug2) u_printf("revfBackwardsTrie->getValue(); - bestPosn = utext_getNativeIndex(fText.getAlias()); - //if(debug2) u_printf("rev<+/%C/+end of seq.. r=%d, bestPosn=%d, bestValue=%d\n", (UChar)uch, r, bestPosn, bestValue); - } + //if(bestValue >= 0) { + //if(debug2) u_printf("rev<+/%C/+end of seq.. r=%d, bestPosn=%d, bestValue=%d\n", (UChar)uch, r, bestPosn, bestValue); + //} if(bestPosn>=0) { //if(debug2) u_printf("rev< /%C/ end of seq.. r=%d, bestPosn=%d, bestValue=%d\n", (UChar)uch, r, bestPosn, bestValue); //if(USTRINGTRIE_MATCHES(r)) { // matched - so, now what? - //int32_t bestValue = fBackwardsTrie->getValue(); + //int32_t bestValue = iter.getValue(); ////if(debug2) u_printf("rev< /%C/ matched, skip..%d bestValue=%d\n", (UChar)uch, r, bestValue); if(bestValue == kMATCH) { // exact match! //if(debug2) u_printf(" exact backward match\n"); return kExceptionHere; // See if the next is another exception. } else if(bestValue == kPARTIAL - && fData->fForwardsPartialTrie.isValid()) { // make sure there's a forward trie + && fData->hasForwardsPartialTrie()) { // make sure there's a forward trie //if(debug2) u_printf(" partial backward match\n"); // We matched the "Ph." in "Ph.D." - now we need to run everything through the forwards trie // to see if it matches something going forward. - fData->fForwardsPartialTrie->reset(); UStringTrieResult rfwd = USTRINGTRIE_INTERMEDIATE_VALUE; utext_setNativeIndex(fText.getAlias(), bestPosn); // hope that's close .. //if(debug2) u_printf("Retrying at %d\n", bestPosn); + // Do not modify the shared trie! + UCharsTrie iter(fData->getForwardsPartialTrie()); + UChar32 uch; while((uch=utext_next32(fText.getAlias()))!=U_SENTINEL && - USTRINGTRIE_HAS_NEXT(rfwd=fData->fForwardsPartialTrie->nextForCodePoint(uch))) { + USTRINGTRIE_HAS_NEXT(rfwd=iter.nextForCodePoint(uch))) { //if(debug2) u_printf("fwd> /%C/ cont?%d @%d\n", (UChar)uch, rfwd, utext_getNativeIndex(fText.getAlias())); } if(USTRINGTRIE_MATCHES(rfwd)) { @@ -339,7 +366,7 @@ SimpleFilteredSentenceBreakIterator::breakExceptionAt(int32_t n) { int32_t SimpleFilteredSentenceBreakIterator::internalNext(int32_t n) { if(n == UBRK_DONE || // at end or - fData->fBackwardsTrie.isNull()) { // .. no backwards table loaded == no exceptions + !fData->hasBackwardsTrie()) { // .. no backwards table loaded == no exceptions return n; } // OK, do we need to break here? @@ -369,7 +396,7 @@ SimpleFilteredSentenceBreakIterator::internalNext(int32_t n) { int32_t SimpleFilteredSentenceBreakIterator::internalPrev(int32_t n) { if(n == 0 || n == UBRK_DONE || // at end or - fData->fBackwardsTrie.isNull()) { // .. no backwards table loaded == no exceptions + !fData->hasBackwardsTrie()) { // .. no backwards table loaded == no exceptions return n; } // OK, do we need to break here? @@ -420,7 +447,7 @@ SimpleFilteredSentenceBreakIterator::previous(void) { UBool SimpleFilteredSentenceBreakIterator::isBoundary(int32_t offset) { if (!fDelegate->isBoundary(offset)) return false; // no break to suppress - if (fData->fBackwardsTrie.isNull()) return true; // no data = no suppressions + if (!fData->hasBackwardsTrie()) return true; // no data = no suppressions UErrorCode status = U_ZERO_ERROR; resetState(status); diff --git a/thirdparty/icu4c/common/hash.h b/thirdparty/icu4c/common/hash.h index f02cb7087a..b927ddb3c3 100644 --- a/thirdparty/icu4c/common/hash.h +++ b/thirdparty/icu4c/common/hash.h @@ -85,16 +85,22 @@ public: inline int32_t puti(const UnicodeString& key, int32_t value, UErrorCode& status); + inline int32_t putiAllowZero(const UnicodeString& key, int32_t value, UErrorCode& status); + inline void* get(const UnicodeString& key) const; inline int32_t geti(const UnicodeString& key) const; + inline int32_t getiAndFound(const UnicodeString& key, UBool &found) const; + inline void* remove(const UnicodeString& key); inline int32_t removei(const UnicodeString& key); inline void removeAll(void); + inline UBool containsKey(const UnicodeString& key) const; + inline const UHashElement* find(const UnicodeString& key) const; /** @@ -203,6 +209,11 @@ inline int32_t Hashtable::puti(const UnicodeString& key, int32_t value, UErrorCo return uhash_puti(hash, new UnicodeString(key), value, &status); } +inline int32_t Hashtable::putiAllowZero(const UnicodeString& key, int32_t value, + UErrorCode& status) { + return uhash_putiAllowZero(hash, new UnicodeString(key), value, &status); +} + inline void* Hashtable::get(const UnicodeString& key) const { return uhash_get(hash, &key); } @@ -211,6 +222,10 @@ inline int32_t Hashtable::geti(const UnicodeString& key) const { return uhash_geti(hash, &key); } +inline int32_t Hashtable::getiAndFound(const UnicodeString& key, UBool &found) const { + return uhash_getiAndFound(hash, &key, &found); +} + inline void* Hashtable::remove(const UnicodeString& key) { return uhash_remove(hash, &key); } @@ -219,6 +234,10 @@ inline int32_t Hashtable::removei(const UnicodeString& key) { return uhash_removei(hash, &key); } +inline UBool Hashtable::containsKey(const UnicodeString& key) const { + return uhash_containsKey(hash, &key); +} + inline const UHashElement* Hashtable::find(const UnicodeString& key) const { return uhash_find(hash, &key); } diff --git a/thirdparty/icu4c/common/localematcher.cpp b/thirdparty/icu4c/common/localematcher.cpp index 5795cbf87e..132aee290e 100644 --- a/thirdparty/icu4c/common/localematcher.cpp +++ b/thirdparty/icu4c/common/localematcher.cpp @@ -345,9 +345,8 @@ UBool compareLSRs(const UHashTok t1, const UHashTok t2) { int32_t LocaleMatcher::putIfAbsent(const LSR &lsr, int32_t i, int32_t suppLength, UErrorCode &errorCode) { if (U_FAILURE(errorCode)) { return suppLength; } - int32_t index = uhash_geti(supportedLsrToIndex, &lsr); - if (index == 0) { - uhash_puti(supportedLsrToIndex, const_cast(&lsr), i + 1, &errorCode); + if (!uhash_containsKey(supportedLsrToIndex, &lsr)) { + uhash_putiAllowZero(supportedLsrToIndex, const_cast(&lsr), i, &errorCode); if (U_SUCCESS(errorCode)) { supportedLSRs[suppLength] = &lsr; supportedIndexes[suppLength++] = i; @@ -685,12 +684,11 @@ int32_t LocaleMatcher::getBestSuppIndex(LSR desiredLSR, LocaleLsrIterator *remai int32_t bestSupportedLsrIndex = -1; for (int32_t bestShiftedDistance = LocaleDistance::shiftDistance(thresholdDistance);;) { // Quick check for exact maximized LSR. - // Returns suppIndex+1 where 0 means not found. if (supportedLsrToIndex != nullptr) { desiredLSR.setHashCode(); - int32_t index = uhash_geti(supportedLsrToIndex, &desiredLSR); - if (index != 0) { - int32_t suppIndex = index - 1; + UBool found = false; + int32_t suppIndex = uhash_getiAndFound(supportedLsrToIndex, &desiredLSR, &found); + if (found) { if (remainingIter != nullptr) { remainingIter->rememberCurrent(desiredIndex, errorCode); } diff --git a/thirdparty/icu4c/common/localeprioritylist.cpp b/thirdparty/icu4c/common/localeprioritylist.cpp index 8916b121be..4455eedb75 100644 --- a/thirdparty/icu4c/common/localeprioritylist.cpp +++ b/thirdparty/icu4c/common/localeprioritylist.cpp @@ -187,17 +187,18 @@ bool LocalePriorityList::add(const Locale &locale, int32_t weight, UErrorCode &e if (U_FAILURE(errorCode)) { return false; } } LocalPointer clone; - int32_t index = uhash_geti(map, &locale); - if (index != 0) { + UBool found = false; + int32_t index = uhash_getiAndFound(map, &locale, &found); + if (found) { // Duplicate: Remove the old item and append it anew. - LocaleAndWeight &lw = list->array[index - 1]; + LocaleAndWeight &lw = list->array[index]; clone.adoptInstead(lw.locale); lw.locale = nullptr; lw.weight = 0; ++numRemoved; } if (weight <= 0) { // do not add q=0 - if (index != 0) { + if (found) { // Not strictly necessary but cleaner. uhash_removei(map, &locale); } @@ -217,7 +218,7 @@ bool LocalePriorityList::add(const Locale &locale, int32_t weight, UErrorCode &e return false; } } - uhash_puti(map, clone.getAlias(), listLength + 1, &errorCode); + uhash_putiAllowZero(map, clone.getAlias(), listLength, &errorCode); if (U_FAILURE(errorCode)) { return false; } LocaleAndWeight &lw = list->array[listLength]; lw.locale = clone.orphan(); diff --git a/thirdparty/icu4c/common/locdispnames.cpp b/thirdparty/icu4c/common/locdispnames.cpp index 47c0667417..96af3f9aa8 100644 --- a/thirdparty/icu4c/common/locdispnames.cpp +++ b/thirdparty/icu4c/common/locdispnames.cpp @@ -698,7 +698,7 @@ uloc_getDisplayName(const char *locale, } /* end switch */ if (len>0) { - /* we addeed a component, so add separator and write it if there's room. */ + /* we added a component, so add separator and write it if there's room. */ if(len+sepLen<=cap) { const UChar * plimit = p + len; for (; p < plimit; p++) { diff --git a/thirdparty/icu4c/common/locid.cpp b/thirdparty/icu4c/common/locid.cpp index 874e4a7055..0d506293a9 100644 --- a/thirdparty/icu4c/common/locid.cpp +++ b/thirdparty/icu4c/common/locid.cpp @@ -254,7 +254,7 @@ UOBJECT_DEFINE_RTTI_IMPLEMENTATION(Locale) Locale::~Locale() { - if (baseName != fullName) { + if ((baseName != fullName) && (baseName != fullNameBuffer)) { uprv_free(baseName); } baseName = NULL; @@ -466,7 +466,7 @@ Locale& Locale::operator=(const Locale& other) { } Locale& Locale::operator=(Locale&& other) U_NOEXCEPT { - if (baseName != fullName) uprv_free(baseName); + if ((baseName != fullName) && (baseName != fullNameBuffer)) uprv_free(baseName); if (fullName != fullNameBuffer) uprv_free(fullName); if (other.fullName == other.fullNameBuffer) { @@ -524,7 +524,7 @@ static const char* const KNOWN_CANONICALIZED[] = { "km", "km_KH", "kn", "kn_IN", "ko", "ko_KR", "ky", "ky_KG", "lo", "lo_LA", "lt", "lt_LT", "lv", "lv_LV", "mk", "mk_MK", "ml", "ml_IN", "mn", "mn_MN", "mr", "mr_IN", "ms", "ms_MY", "my", "my_MM", "nb", "nb_NO", "ne", "ne_NP", - "nl", "nl_NL", "or", "or_IN", "pa", "pa_IN", "pl", "pl_PL", "ps", "ps_AF", + "nl", "nl_NL", "no", "or", "or_IN", "pa", "pa_IN", "pl", "pl_PL", "ps", "ps_AF", "pt", "pt_BR", "pt_PT", "ro", "ro_RO", "ru", "ru_RU", "sd", "sd_IN", "si", "si_LK", "sk", "sk_SK", "sl", "sl_SI", "so", "so_SO", "sq", "sq_AL", "sr", "sr_Cyrl_RS", "sr_Latn", "sr_RS", "sv", "sv_SE", "sw", "sw_TZ", "ta", @@ -627,6 +627,17 @@ private: LocalMemory& types, LocalMemory& replacementIndexes, int32_t &length, UErrorCode &status); + + // Read the subdivisionAlias data from alias to + // strings+types+replacementIndexes + // Allocate length items for types, to store the type field. + // Allocate length items for replacementIndexes, + // to store the index in the strings for the replacement variant. + void readSubdivisionAlias(UResourceBundle* alias, + UniqueCharStrings* strings, + LocalMemory& types, + LocalMemory& replacementIndexes, + int32_t &length, UErrorCode &status); }; /** @@ -647,6 +658,7 @@ public: const CharStringMap& scriptMap() const { return script; } const CharStringMap& territoryMap() const { return territory; } const CharStringMap& variantMap() const { return variant; } + const CharStringMap& subdivisionMap() const { return subdivision; } static void U_CALLCONV loadData(UErrorCode &status); static UBool U_CALLCONV cleanup(); @@ -658,11 +670,13 @@ private: CharStringMap scriptMap, CharStringMap territoryMap, CharStringMap variantMap, + CharStringMap subdivisionMap, CharString* strings) : language(std::move(languageMap)), script(std::move(scriptMap)), territory(std::move(territoryMap)), variant(std::move(variantMap)), + subdivision(std::move(subdivisionMap)), strings(strings) { } @@ -676,6 +690,7 @@ private: CharStringMap script; CharStringMap territory; CharStringMap variant; + CharStringMap subdivision; CharString* strings; friend class AliasDataBuilder; @@ -866,6 +881,34 @@ AliasDataBuilder::readVariantAlias( status); } +/** + * Read the subdivisionAlias data from alias to strings+types+replacementIndexes. + * Allocate length items for types, to store the type field. Allocate length + * items for replacementIndexes, to store the index in the strings for the + * replacement regions. + */ +void +AliasDataBuilder::readSubdivisionAlias( + UResourceBundle* alias, + UniqueCharStrings* strings, + LocalMemory& types, + LocalMemory& replacementIndexes, + int32_t &length, + UErrorCode &status) +{ + return readAlias( + alias, strings, types, replacementIndexes, length, +#if U_DEBUG + [](const char* type) { + U_ASSERT(uprv_strlen(type) >= 3 && uprv_strlen(type) <= 8); + }, +#else + [](const char*) {}, +#endif + [](const UnicodeString&) { }, + status); +} + /** * Initializes the alias data from the ICU resource bundles. The alias data * contains alias of language, country, script and variants. @@ -905,12 +948,14 @@ AliasDataBuilder::build(UErrorCode &status) { ures_getByKey(metadataAlias.getAlias(), "territory", nullptr, &status)); LocalUResourceBundlePointer variantAlias( ures_getByKey(metadataAlias.getAlias(), "variant", nullptr, &status)); + LocalUResourceBundlePointer subdivisionAlias( + ures_getByKey(metadataAlias.getAlias(), "subdivision", nullptr, &status)); if (U_FAILURE(status)) { return nullptr; } int32_t languagesLength = 0, scriptLength = 0, territoryLength = 0, - variantLength = 0; + variantLength = 0, subdivisionLength = 0; // Read the languageAlias into languageTypes, languageReplacementIndexes // and strings @@ -955,6 +1000,16 @@ AliasDataBuilder::build(UErrorCode &status) { variantReplacementIndexes, variantLength, status); + // Read the subdivisionAlias into subdivisionTypes, subdivisionReplacementIndexes + // and strings + LocalMemory subdivisionTypes; + LocalMemory subdivisionReplacementIndexes; + readSubdivisionAlias(subdivisionAlias.getAlias(), + &strings, + subdivisionTypes, + subdivisionReplacementIndexes, + subdivisionLength, status); + if (U_FAILURE(status)) { return nullptr; } @@ -994,6 +1049,14 @@ AliasDataBuilder::build(UErrorCode &status) { status); } + // Build the subdivisionMap from subdivisionTypes & subdivisionReplacementIndexes. + CharStringMap subdivisionMap(2, status); + for (int32_t i = 0; U_SUCCESS(status) && i < subdivisionLength; i++) { + subdivisionMap.put(subdivisionTypes[i], + strings.get(subdivisionReplacementIndexes[i]), + status); + } + if (U_FAILURE(status)) { return nullptr; } @@ -1004,6 +1067,7 @@ AliasDataBuilder::build(UErrorCode &status) { std::move(scriptMap), std::move(territoryMap), std::move(variantMap), + std::move(subdivisionMap), strings.orphanCharStrings()); if (data == nullptr) { @@ -1105,6 +1169,14 @@ private: // Replace by using variantAlias. bool replaceVariant(UErrorCode& status); + + // Replace by using subdivisionAlias. + bool replaceSubdivision(StringPiece subdivision, + CharString& output, UErrorCode& status); + + // Replace transformed extensions. + bool replaceTransformedExtensions( + CharString& transformedExtensions, CharString& output, UErrorCode& status); }; CharString& @@ -1294,7 +1366,6 @@ AliasReplacer::replaceLanguage( } } if (replacedExtensions != nullptr) { - // TODO(ICU-21292) // DO NOTHING // UTS35 does not specifiy what should we do if we have extensions in the // replacement. Currently we know only the following 4 "BCP47 LegacyRules" have @@ -1435,6 +1506,106 @@ AliasReplacer::replaceVariant(UErrorCode& status) return false; } +bool +AliasReplacer::replaceSubdivision( + StringPiece subdivision, CharString& output, UErrorCode& status) +{ + if (U_FAILURE(status)) { + return false; + } + const char *replacement = data->subdivisionMap().get(subdivision.data()); + if (replacement != nullptr) { + const char* firstSpace = uprv_strchr(replacement, ' '); + // Found replacement data for this subdivision. + size_t len = (firstSpace != nullptr) ? + (firstSpace - replacement) : uprv_strlen(replacement); + if (2 <= len && len <= 8) { + output.append(replacement, (int32_t)len, status); + if (2 == len) { + // Add 'zzzz' based on changes to UTS #35 for CLDR-14312. + output.append("zzzz", 4, status); + } + } + return true; + } + return false; +} + +bool +AliasReplacer::replaceTransformedExtensions( + CharString& transformedExtensions, CharString& output, UErrorCode& status) +{ + // The content of the transformedExtensions will be modified in this + // function to NULL-terminating (tkey-tvalue) pairs. + if (U_FAILURE(status)) { + return false; + } + int32_t len = transformedExtensions.length(); + const char* str = transformedExtensions.data(); + const char* tkey = ultag_getTKeyStart(str); + int32_t tlangLen = (tkey == str) ? 0 : + ((tkey == nullptr) ? len : static_cast((tkey - str - 1))); + CharStringByteSink sink(&output); + if (tlangLen > 0) { + Locale tlang = LocaleBuilder() + .setLanguageTag(StringPiece(str, tlangLen)) + .build(status); + tlang.canonicalize(status); + tlang.toLanguageTag(sink, status); + if (U_FAILURE(status)) { + return false; + } + T_CString_toLowerCase(output.data()); + } + if (tkey != nullptr) { + // We need to sort the tfields by tkey + UVector tfields(status); + if (U_FAILURE(status)) { + return false; + } + do { + const char* tvalue = uprv_strchr(tkey, '-'); + if (tvalue == nullptr) { + status = U_ILLEGAL_ARGUMENT_ERROR; + } + const char* nextTKey = ultag_getTKeyStart(tvalue); + if (nextTKey != nullptr) { + *((char*)(nextTKey-1)) = '\0'; // NULL terminate tvalue + } + tfields.insertElementAt((void*)tkey, tfields.size(), status); + if (U_FAILURE(status)) { + return false; + } + tkey = nextTKey; + } while (tkey != nullptr); + tfields.sort([](UElement e1, UElement e2) -> int8_t { + // uprv_strcmp return int and in some platform, such as arm64-v8a, + // it may return positive values > 127 which cause the casted value + // of int8_t negative. + int res = uprv_strcmp( + (const char*)e1.pointer, (const char*)e2.pointer); + return (res == 0) ? 0 : ((res > 0) ? 1 : -1); + }, status); + for (int32_t i = 0; i < tfields.size(); i++) { + if (output.length() > 0) { + output.append('-', status); + } + const char* tfield = (const char*) tfields.elementAt(i); + const char* tvalue = uprv_strchr(tfield, '-'); + // Split the "tkey-tvalue" pair string so that we can canonicalize the tvalue. + U_ASSERT(tvalue != nullptr); + *((char*)tvalue++) = '\0'; // NULL terminate tkey + output.append(tfield, status).append('-', status); + const char* bcpTValue = ulocimp_toBcpType(tfield, tvalue, nullptr, nullptr); + output.append((bcpTValue == nullptr) ? tvalue : bcpTValue, status); + } + } + if (U_FAILURE(status)) { + return false; + } + return true; +} + CharString& AliasReplacer::outputToString( CharString& out, UErrorCode status) @@ -1453,8 +1624,12 @@ AliasReplacer::outputToString( out.append(SEP_CHAR, status); } variants.sort([](UElement e1, UElement e2) -> int8_t { - return uprv_strcmp( + // uprv_strcmp return int and in some platform, such as arm64-v8a, + // it may return positive values > 127 which cause the casted value + // of int8_t negative. + int res = uprv_strcmp( (const char*)e1.pointer, (const char*)e2.pointer); + return (res == 0) ? 0 : ((res > 0) ? 1 : -1); }, status); int32_t variantsStart = out.length(); for (int32_t i = 0; i < variants.size(); i++) { @@ -1497,7 +1672,6 @@ AliasReplacer::replace(const Locale& locale, CharString& out, UErrorCode& status region = nullptr; } const char* variantsStr = locale.getVariant(); - const char* extensionsStr = locale_getKeywordsStart(locale.getName()); CharString variantsBuff(variantsStr, -1, status); if (!variantsBuff.isEmpty()) { if (U_FAILURE(status)) { return false; } @@ -1516,8 +1690,12 @@ AliasReplacer::replace(const Locale& locale, CharString& out, UErrorCode& status // Sort the variants variants.sort([](UElement e1, UElement e2) -> int8_t { - return uprv_strcmp( + // uprv_strcmp return int and in some platform, such as arm64-v8a, + // it may return positive values > 127 which cause the casted value + // of int8_t negative. + int res = uprv_strcmp( (const char*)e1.pointer, (const char*)e2.pointer); + return (res == 0) ? 0 : ((res > 0) ? 1 : -1); }, status); // A changed count to assert when loop too many times. @@ -1561,11 +1739,52 @@ AliasReplacer::replace(const Locale& locale, CharString& out, UErrorCode& status if (U_FAILURE(status)) { return false; } // Nothing changed and we know the order of the vaiants are not change // because we have no variant or only one. - if (changed == 0 && variants.size() <= 1) { + const char* extensionsStr = locale_getKeywordsStart(locale.getName()); + if (changed == 0 && variants.size() <= 1 && extensionsStr == nullptr) { return false; } outputToString(out, status); + if (U_FAILURE(status)) { + return false; + } if (extensionsStr != nullptr) { + changed = 0; + Locale temp(locale); + LocalPointer iter(locale.createKeywords(status)); + if (U_SUCCESS(status) && !iter.isNull()) { + const char* key; + while ((key = iter->next(nullptr, status)) != nullptr) { + if (uprv_strcmp("sd", key) == 0 || uprv_strcmp("rg", key) == 0 || + uprv_strcmp("t", key) == 0) { + CharString value; + CharStringByteSink valueSink(&value); + locale.getKeywordValue(key, valueSink, status); + if (U_FAILURE(status)) { + status = U_ZERO_ERROR; + continue; + } + CharString replacement; + if (uprv_strlen(key) == 2) { + if (replaceSubdivision(value.toStringPiece(), replacement, status)) { + changed++; + temp.setKeywordValue(key, replacement.data(), status); + } + } else { + U_ASSERT(uprv_strcmp(key, "t") == 0); + if (replaceTransformedExtensions(value, replacement, status)) { + changed++; + temp.setKeywordValue(key, replacement.data(), status); + } + } + if (U_FAILURE(status)) { + return false; + } + } + } + } + if (changed != 0) { + extensionsStr = locale_getKeywordsStart(temp.getName()); + } out.append(extensionsStr, status); } if (U_FAILURE(status)) { @@ -1573,8 +1792,6 @@ AliasReplacer::replace(const Locale& locale, CharString& out, UErrorCode& status } // If the tag is not changed, return. if (uprv_strcmp(out.data(), locale.getName()) == 0) { - U_ASSERT(changed == 0); - U_ASSERT(variants.size() > 1); out.clear(); return false; } @@ -1636,7 +1853,7 @@ Locale& Locale::init(const char* localeID, UBool canonicalize) { fIsBogus = FALSE; /* Free our current storage */ - if (baseName != fullName) { + if ((baseName != fullName) && (baseName != fullNameBuffer)) { uprv_free(baseName); } baseName = NULL; @@ -1672,6 +1889,7 @@ Locale& Locale::init(const char* localeID, UBool canonicalize) uloc_getName(localeID, fullName, sizeof(fullNameBuffer), &err); if(err == U_BUFFER_OVERFLOW_ERROR || length >= (int32_t)sizeof(fullNameBuffer)) { + U_ASSERT(baseName == nullptr); /*Go to heap for the fullName if necessary*/ fullName = (char *)uprv_malloc(sizeof(char)*(length + 1)); if(fullName == 0) { @@ -1825,7 +2043,7 @@ Locale::hashCode() const void Locale::setToBogus() { /* Free our current storage */ - if(baseName != fullName) { + if((baseName != fullName) && (baseName != fullNameBuffer)) { uprv_free(baseName); } baseName = NULL; diff --git a/thirdparty/icu4c/common/loclikelysubtags.cpp b/thirdparty/icu4c/common/loclikelysubtags.cpp index a031bfa587..aa592e6ea8 100644 --- a/thirdparty/icu4c/common/loclikelysubtags.cpp +++ b/thirdparty/icu4c/common/loclikelysubtags.cpp @@ -320,7 +320,8 @@ XLikelySubtags::~XLikelySubtags() { LSR XLikelySubtags::makeMaximizedLsrFrom(const Locale &locale, UErrorCode &errorCode) const { const char *name = locale.getName(); if (uprv_isAtSign(name[0]) && name[1] == 'x' && name[2] == '=') { // name.startsWith("@x=") - // Private use language tag x-subtag-subtag... + // Private use language tag x-subtag-subtag... which CLDR changes to + // und-x-subtag-subtag... return LSR(name, "", "", LSR::EXPLICIT_LSR); } return makeMaximizedLsr(locale.getLanguage(), locale.getScript(), locale.getCountry(), diff --git a/thirdparty/icu4c/common/norm2allmodes.h b/thirdparty/icu4c/common/norm2allmodes.h index e8bd52c6ae..584835da57 100644 --- a/thirdparty/icu4c/common/norm2allmodes.h +++ b/thirdparty/icu4c/common/norm2allmodes.h @@ -38,7 +38,7 @@ public: virtual UnicodeString & normalize(const UnicodeString &src, UnicodeString &dest, - UErrorCode &errorCode) const { + UErrorCode &errorCode) const U_OVERRIDE { if(U_FAILURE(errorCode)) { dest.setToBogus(); return dest; @@ -64,13 +64,13 @@ public: virtual UnicodeString & normalizeSecondAndAppend(UnicodeString &first, const UnicodeString &second, - UErrorCode &errorCode) const { + UErrorCode &errorCode) const U_OVERRIDE { return normalizeSecondAndAppend(first, second, true, errorCode); } virtual UnicodeString & append(UnicodeString &first, const UnicodeString &second, - UErrorCode &errorCode) const { + UErrorCode &errorCode) const U_OVERRIDE { return normalizeSecondAndAppend(first, second, false, errorCode); } UnicodeString & @@ -107,7 +107,7 @@ public: UnicodeString &safeMiddle, ReorderingBuffer &buffer, UErrorCode &errorCode) const = 0; virtual UBool - getDecomposition(UChar32 c, UnicodeString &decomposition) const { + getDecomposition(UChar32 c, UnicodeString &decomposition) const U_OVERRIDE { UChar buffer[4]; int32_t length; const UChar *d=impl.getDecomposition(c, buffer, length); @@ -122,7 +122,7 @@ public: return true; } virtual UBool - getRawDecomposition(UChar32 c, UnicodeString &decomposition) const { + getRawDecomposition(UChar32 c, UnicodeString &decomposition) const U_OVERRIDE { UChar buffer[30]; int32_t length; const UChar *d=impl.getRawDecomposition(c, buffer, length); @@ -137,18 +137,18 @@ public: return true; } virtual UChar32 - composePair(UChar32 a, UChar32 b) const { + composePair(UChar32 a, UChar32 b) const U_OVERRIDE { return impl.composePair(a, b); } virtual uint8_t - getCombiningClass(UChar32 c) const { + getCombiningClass(UChar32 c) const U_OVERRIDE { return impl.getCC(impl.getNorm16(c)); } // quick checks virtual UBool - isNormalized(const UnicodeString &s, UErrorCode &errorCode) const { + isNormalized(const UnicodeString &s, UErrorCode &errorCode) const U_OVERRIDE { if(U_FAILURE(errorCode)) { return false; } @@ -161,11 +161,11 @@ public: return sLimit==spanQuickCheckYes(sArray, sLimit, errorCode); } virtual UNormalizationCheckResult - quickCheck(const UnicodeString &s, UErrorCode &errorCode) const { + quickCheck(const UnicodeString &s, UErrorCode &errorCode) const U_OVERRIDE { return Normalizer2WithImpl::isNormalized(s, errorCode) ? UNORM_YES : UNORM_NO; } virtual int32_t - spanQuickCheckYes(const UnicodeString &s, UErrorCode &errorCode) const { + spanQuickCheckYes(const UnicodeString &s, UErrorCode &errorCode) const U_OVERRIDE { if(U_FAILURE(errorCode)) { return 0; } @@ -194,27 +194,57 @@ public: private: virtual void normalize(const UChar *src, const UChar *limit, - ReorderingBuffer &buffer, UErrorCode &errorCode) const { + ReorderingBuffer &buffer, UErrorCode &errorCode) const U_OVERRIDE { impl.decompose(src, limit, &buffer, errorCode); } using Normalizer2WithImpl::normalize; // Avoid warning about hiding base class function. virtual void normalizeAndAppend(const UChar *src, const UChar *limit, UBool doNormalize, UnicodeString &safeMiddle, - ReorderingBuffer &buffer, UErrorCode &errorCode) const { + ReorderingBuffer &buffer, UErrorCode &errorCode) const U_OVERRIDE { impl.decomposeAndAppend(src, limit, doNormalize, safeMiddle, buffer, errorCode); } + + void + normalizeUTF8(uint32_t options, StringPiece src, ByteSink &sink, + Edits *edits, UErrorCode &errorCode) const U_OVERRIDE { + if (U_FAILURE(errorCode)) { + return; + } + if (edits != nullptr && (options & U_EDITS_NO_RESET) == 0) { + edits->reset(); + } + const uint8_t *s = reinterpret_cast(src.data()); + impl.decomposeUTF8(options, s, s + src.length(), &sink, edits, errorCode); + sink.Flush(); + } + virtual UBool + isNormalizedUTF8(StringPiece sp, UErrorCode &errorCode) const U_OVERRIDE { + if(U_FAILURE(errorCode)) { + return false; + } + const uint8_t *s = reinterpret_cast(sp.data()); + const uint8_t *sLimit = s + sp.length(); + return sLimit == impl.decomposeUTF8(0, s, sLimit, nullptr, nullptr, errorCode); + } + virtual const UChar * - spanQuickCheckYes(const UChar *src, const UChar *limit, UErrorCode &errorCode) const { + spanQuickCheckYes(const UChar *src, const UChar *limit, UErrorCode &errorCode) const U_OVERRIDE { return impl.decompose(src, limit, NULL, errorCode); } using Normalizer2WithImpl::spanQuickCheckYes; // Avoid warning about hiding base class function. - virtual UNormalizationCheckResult getQuickCheck(UChar32 c) const { + virtual UNormalizationCheckResult getQuickCheck(UChar32 c) const U_OVERRIDE { return impl.isDecompYes(impl.getNorm16(c)) ? UNORM_YES : UNORM_NO; } - virtual UBool hasBoundaryBefore(UChar32 c) const { return impl.hasDecompBoundaryBefore(c); } - virtual UBool hasBoundaryAfter(UChar32 c) const { return impl.hasDecompBoundaryAfter(c); } - virtual UBool isInert(UChar32 c) const { return impl.isDecompInert(c); } + virtual UBool hasBoundaryBefore(UChar32 c) const U_OVERRIDE { + return impl.hasDecompBoundaryBefore(c); + } + virtual UBool hasBoundaryAfter(UChar32 c) const U_OVERRIDE { + return impl.hasDecompBoundaryAfter(c); + } + virtual UBool isInert(UChar32 c) const U_OVERRIDE { + return impl.isDecompInert(c); + } }; class ComposeNormalizer2 : public Normalizer2WithImpl { @@ -321,24 +351,30 @@ public: private: virtual void normalize(const UChar *src, const UChar *limit, - ReorderingBuffer &buffer, UErrorCode &errorCode) const { + ReorderingBuffer &buffer, UErrorCode &errorCode) const U_OVERRIDE { impl.makeFCD(src, limit, &buffer, errorCode); } using Normalizer2WithImpl::normalize; // Avoid warning about hiding base class function. virtual void normalizeAndAppend(const UChar *src, const UChar *limit, UBool doNormalize, UnicodeString &safeMiddle, - ReorderingBuffer &buffer, UErrorCode &errorCode) const { + ReorderingBuffer &buffer, UErrorCode &errorCode) const U_OVERRIDE { impl.makeFCDAndAppend(src, limit, doNormalize, safeMiddle, buffer, errorCode); } virtual const UChar * - spanQuickCheckYes(const UChar *src, const UChar *limit, UErrorCode &errorCode) const { + spanQuickCheckYes(const UChar *src, const UChar *limit, UErrorCode &errorCode) const U_OVERRIDE { return impl.makeFCD(src, limit, NULL, errorCode); } using Normalizer2WithImpl::spanQuickCheckYes; // Avoid warning about hiding base class function. - virtual UBool hasBoundaryBefore(UChar32 c) const { return impl.hasFCDBoundaryBefore(c); } - virtual UBool hasBoundaryAfter(UChar32 c) const { return impl.hasFCDBoundaryAfter(c); } - virtual UBool isInert(UChar32 c) const { return impl.isFCDInert(c); } + virtual UBool hasBoundaryBefore(UChar32 c) const U_OVERRIDE { + return impl.hasFCDBoundaryBefore(c); + } + virtual UBool hasBoundaryAfter(UChar32 c) const U_OVERRIDE { + return impl.hasFCDBoundaryAfter(c); + } + virtual UBool isInert(UChar32 c) const U_OVERRIDE { + return impl.isFCDInert(c); + } }; struct Norm2AllModes : public UMemory { diff --git a/thirdparty/icu4c/common/normalizer2impl.cpp b/thirdparty/icu4c/common/normalizer2impl.cpp index cbf6b4d980..c0ad5c69f3 100644 --- a/thirdparty/icu4c/common/normalizer2impl.cpp +++ b/thirdparty/icu4c/common/normalizer2impl.cpp @@ -731,9 +731,131 @@ UBool Normalizer2Impl::decompose(UChar32 c, uint16_t norm16, return buffer.append((const UChar *)mapping+1, length, TRUE, leadCC, trailCC, errorCode); } +// Dual functionality: +// sink != nullptr: normalize +// sink == nullptr: isNormalized/spanQuickCheckYes +const uint8_t * +Normalizer2Impl::decomposeUTF8(uint32_t options, + const uint8_t *src, const uint8_t *limit, + ByteSink *sink, Edits *edits, UErrorCode &errorCode) const { + U_ASSERT(limit != nullptr); + UnicodeString s16; + uint8_t minNoLead = leadByteForCP(minDecompNoCP); + + const uint8_t *prevBoundary = src; + // only for quick check + uint8_t prevCC = 0; + + for (;;) { + // Fast path: Scan over a sequence of characters below the minimum "no" code point, + // or with (decompYes && ccc==0) properties. + const uint8_t *fastStart = src; + const uint8_t *prevSrc; + uint16_t norm16 = 0; + + for (;;) { + if (src == limit) { + if (prevBoundary != limit && sink != nullptr) { + ByteSinkUtil::appendUnchanged(prevBoundary, limit, + *sink, options, edits, errorCode); + } + return src; + } + if (*src < minNoLead) { + ++src; + } else { + prevSrc = src; + UCPTRIE_FAST_U8_NEXT(normTrie, UCPTRIE_16, src, limit, norm16); + if (!isMostDecompYesAndZeroCC(norm16)) { + break; + } + } + } + // isMostDecompYesAndZeroCC(norm16) is false, that is, norm16>=minYesNo, + // and the current character at [prevSrc..src[ is not a common case with cc=0 + // (MIN_NORMAL_MAYBE_YES or JAMO_VT). + // It could still be a maybeYes with cc=0. + if (prevSrc != fastStart) { + // The fast path looped over yes/0 characters before the current one. + if (sink != nullptr && + !ByteSinkUtil::appendUnchanged(prevBoundary, prevSrc, + *sink, options, edits, errorCode)) { + break; + } + prevBoundary = prevSrc; + prevCC = 0; + } + + // Medium-fast path: Quick check. + if (isMaybeOrNonZeroCC(norm16)) { + // Does not decompose. + uint8_t cc = getCCFromYesOrMaybe(norm16); + if (prevCC <= cc || cc == 0) { + prevCC = cc; + if (cc <= 1) { + if (sink != nullptr && + !ByteSinkUtil::appendUnchanged(prevBoundary, src, + *sink, options, edits, errorCode)) { + break; + } + prevBoundary = src; + } + continue; + } + } + if (sink == nullptr) { + return prevBoundary; // quick check: "no" or cc out of order + } + + // Slow path + // Decompose up to and including the current character. + if (prevBoundary != prevSrc && norm16HasDecompBoundaryBefore(norm16)) { + if (!ByteSinkUtil::appendUnchanged(prevBoundary, prevSrc, + *sink, options, edits, errorCode)) { + break; + } + prevBoundary = prevSrc; + } + ReorderingBuffer buffer(*this, s16, errorCode); + if (U_FAILURE(errorCode)) { + break; + } + decomposeShort(prevBoundary, src, STOP_AT_LIMIT, FALSE /* onlyContiguous */, + buffer, errorCode); + // Decompose until the next boundary. + if (buffer.getLastCC() > 1) { + src = decomposeShort(src, limit, STOP_AT_DECOMP_BOUNDARY, FALSE /* onlyContiguous */, + buffer, errorCode); + } + if (U_FAILURE(errorCode)) { + break; + } + if ((src - prevSrc) > INT32_MAX) { // guard before buffer.equals() + errorCode = U_INDEX_OUTOFBOUNDS_ERROR; + break; + } + // We already know there was a change if the original character decomposed; + // otherwise compare. + if (isMaybeOrNonZeroCC(norm16) && buffer.equals(prevBoundary, src)) { + if (!ByteSinkUtil::appendUnchanged(prevBoundary, src, + *sink, options, edits, errorCode)) { + break; + } + } else { + if (!ByteSinkUtil::appendChange(prevBoundary, src, buffer.getStart(), buffer.length(), + *sink, edits, errorCode)) { + break; + } + } + prevBoundary = src; + prevCC = 0; + } + return src; +} + const uint8_t * Normalizer2Impl::decomposeShort(const uint8_t *src, const uint8_t *limit, - UBool stopAtCompBoundary, UBool onlyContiguous, + StopAt stopAt, UBool onlyContiguous, ReorderingBuffer &buffer, UErrorCode &errorCode) const { if (U_FAILURE(errorCode)) { return nullptr; @@ -746,21 +868,28 @@ Normalizer2Impl::decomposeShort(const uint8_t *src, const uint8_t *limit, UChar32 c = U_SENTINEL; if (norm16 >= limitNoNo) { if (isMaybeOrNonZeroCC(norm16)) { - // No boundaries around this character. + // No comp boundaries around this character. + uint8_t cc = getCCFromYesOrMaybe(norm16); + if (cc == 0 && stopAt == STOP_AT_DECOMP_BOUNDARY) { + return prevSrc; + } c = codePointFromValidUTF8(prevSrc, src); - if (!buffer.append(c, getCCFromYesOrMaybe(norm16), errorCode)) { + if (!buffer.append(c, cc, errorCode)) { return nullptr; } + if (stopAt == STOP_AT_DECOMP_BOUNDARY && buffer.getLastCC() <= 1) { + return src; + } continue; } // Maps to an isCompYesAndZeroCC. - if (stopAtCompBoundary) { + if (stopAt != STOP_AT_LIMIT) { return prevSrc; } c = codePointFromValidUTF8(prevSrc, src); c = mapAlgorithmic(c, norm16); norm16 = getRawNorm16(c); - } else if (stopAtCompBoundary && norm16 < minNoNoCompNoMaybeCC) { + } else if (stopAt != STOP_AT_LIMIT && norm16 < minNoNoCompNoMaybeCC) { return prevSrc; } // norm16!=INERT guarantees that [prevSrc, src[ is valid UTF-8. @@ -768,7 +897,8 @@ Normalizer2Impl::decomposeShort(const uint8_t *src, const uint8_t *limit, // its norm16==INERT is normalization-inert, // so it gets copied unchanged in the fast path, // and we stop the slow path where invalid UTF-8 begins. - U_ASSERT(norm16 != INERT); + // c >= 0 is the result of an algorithmic mapping. + U_ASSERT(c >= 0 || norm16 != INERT); if (norm16 < minYesNo) { if (c < 0) { c = codePointFromValidUTF8(prevSrc, src); @@ -798,11 +928,15 @@ Normalizer2Impl::decomposeShort(const uint8_t *src, const uint8_t *limit, } else { leadCC = 0; } + if (leadCC == 0 && stopAt == STOP_AT_DECOMP_BOUNDARY) { + return prevSrc; + } if (!buffer.append((const char16_t *)mapping+1, length, TRUE, leadCC, trailCC, errorCode)) { return nullptr; } } - if (stopAtCompBoundary && norm16HasCompBoundaryAfter(norm16, onlyContiguous)) { + if ((stopAt == STOP_AT_COMP_BOUNDARY && norm16HasCompBoundaryAfter(norm16, onlyContiguous)) || + (stopAt == STOP_AT_DECOMP_BOUNDARY && buffer.getLastCC() <= 1)) { return src; } } @@ -1954,10 +2088,10 @@ Normalizer2Impl::composeUTF8(uint32_t options, UBool onlyContiguous, break; } // We know there is not a boundary here. - decomposeShort(prevSrc, src, FALSE /* !stopAtCompBoundary */, onlyContiguous, + decomposeShort(prevSrc, src, STOP_AT_LIMIT, onlyContiguous, buffer, errorCode); // Decompose until the next boundary. - src = decomposeShort(src, limit, TRUE /* stopAtCompBoundary */, onlyContiguous, + src = decomposeShort(src, limit, STOP_AT_COMP_BOUNDARY, onlyContiguous, buffer, errorCode); if (U_FAILURE(errorCode)) { break; diff --git a/thirdparty/icu4c/common/normalizer2impl.h b/thirdparty/icu4c/common/normalizer2impl.h index 4218a30a34..bdb6767a92 100644 --- a/thirdparty/icu4c/common/normalizer2impl.h +++ b/thirdparty/icu4c/common/normalizer2impl.h @@ -491,6 +491,12 @@ public: UnicodeString &safeMiddle, ReorderingBuffer &buffer, UErrorCode &errorCode) const; + + /** sink==nullptr: isNormalized()/spanQuickCheckYes() */ + const uint8_t *decomposeUTF8(uint32_t options, + const uint8_t *src, const uint8_t *limit, + ByteSink *sink, Edits *edits, UErrorCode &errorCode) const; + UBool compose(const UChar *src, const UChar *limit, UBool onlyContiguous, UBool doCompose, @@ -649,6 +655,9 @@ private: UChar32 minNeedDataCP, ReorderingBuffer *buffer, UErrorCode &errorCode) const; + + enum StopAt { STOP_AT_LIMIT, STOP_AT_DECOMP_BOUNDARY, STOP_AT_COMP_BOUNDARY }; + const UChar *decomposeShort(const UChar *src, const UChar *limit, UBool stopAtCompBoundary, UBool onlyContiguous, ReorderingBuffer &buffer, UErrorCode &errorCode) const; @@ -656,7 +665,7 @@ private: ReorderingBuffer &buffer, UErrorCode &errorCode) const; const uint8_t *decomposeShort(const uint8_t *src, const uint8_t *limit, - UBool stopAtCompBoundary, UBool onlyContiguous, + StopAt stopAt, UBool onlyContiguous, ReorderingBuffer &buffer, UErrorCode &errorCode) const; static int32_t combine(const uint16_t *list, UChar32 trail); diff --git a/thirdparty/icu4c/common/pluralmap.h b/thirdparty/icu4c/common/pluralmap.h index d898ac4671..2a14a07af1 100644 --- a/thirdparty/icu4c/common/pluralmap.h +++ b/thirdparty/icu4c/common/pluralmap.h @@ -24,7 +24,7 @@ class U_COMMON_API PluralMapBase : public UMemory { public: /** * The names of all the plural categories. NONE is not an actual plural - * category, but rather represents the absense of a plural category. + * category, but rather represents the absence of a plural category. */ enum Category { NONE = -1, diff --git a/thirdparty/icu4c/common/putil.cpp b/thirdparty/icu4c/common/putil.cpp index 3ed6a05d22..ffcbbcce59 100644 --- a/thirdparty/icu4c/common/putil.cpp +++ b/thirdparty/icu4c/common/putil.cpp @@ -1139,7 +1139,7 @@ uprv_tzname(int n) #endif if (tzid != NULL && isValidOlsonID(tzid) #if U_PLATFORM == U_PF_SOLARIS - /* When TZ equals localtime on Solaris, check the /etc/localtime file. */ + /* Don't misinterpret TZ "localtime" on Solaris as a time zone name. */ && uprv_strcmp(tzid, TZ_ENV_CHECK) != 0 #endif ) { @@ -1361,7 +1361,7 @@ uprv_pathIsAbsolute(const char *path) /* Backup setting of ICU_DATA_DIR_PREFIX_ENV_VAR (needed for some Darwin ICU build environments) */ -#if U_PLATFORM_IS_DARWIN_BASED && TARGET_OS_SIMULATOR +#if U_PLATFORM_IS_DARWIN_BASED && defined(TARGET_OS_SIMULATOR) && TARGET_OS_SIMULATOR # if !defined(ICU_DATA_DIR_PREFIX_ENV_VAR) # define ICU_DATA_DIR_PREFIX_ENV_VAR "IPHONE_SIMULATOR_ROOT" # endif diff --git a/thirdparty/icu4c/common/putilimp.h b/thirdparty/icu4c/common/putilimp.h index a325c6c359..5b95a68418 100644 --- a/thirdparty/icu4c/common/putilimp.h +++ b/thirdparty/icu4c/common/putilimp.h @@ -527,7 +527,7 @@ U_CAPI void * U_EXPORT2 uprv_maximumPtr(void *base); * on the destination pointer and capacity cannot overflow. * * The pinned capacity must fulfill the following conditions (for positive capacities): - * - dest + capacity is a valid pointer according to the machine arcitecture (AS/400, 64-bit, etc.) + * - dest + capacity is a valid pointer according to the machine architecture (AS/400, 64-bit, etc.) * - (dest + capacity) >= dest * - The size (in bytes) of T[capacity] does not exceed 0x7fffffff * diff --git a/thirdparty/icu4c/common/rbbi.cpp b/thirdparty/icu4c/common/rbbi.cpp index 9b7e70c3cf..b821ca4463 100644 --- a/thirdparty/icu4c/common/rbbi.cpp +++ b/thirdparty/icu4c/common/rbbi.cpp @@ -812,7 +812,7 @@ int32_t RuleBasedBreakIterator::handleNext() { } #endif - // handleNext alway sets the break tag value. + // handleNext always sets the break tag value. // Set the default for it. fRuleStatusIndex = 0; diff --git a/thirdparty/icu4c/common/rbbi_cache.cpp b/thirdparty/icu4c/common/rbbi_cache.cpp index 63ff3001c7..44f19d8697 100644 --- a/thirdparty/icu4c/common/rbbi_cache.cpp +++ b/thirdparty/icu4c/common/rbbi_cache.cpp @@ -258,7 +258,7 @@ void RuleBasedBreakIterator::BreakCache::preceding(int32_t startPos, UErrorCode previous(status); } else { // seek() leaves the BreakCache positioned at the preceding boundary - // if the requested position is between two bounaries. + // if the requested position is between two boundaries. // current() pushes the BreakCache position out to the BreakIterator itself. U_ASSERT(startPos > fTextIdx); current(); diff --git a/thirdparty/icu4c/common/rbbiscan.cpp b/thirdparty/icu4c/common/rbbiscan.cpp index 9c406af671..45911b1cfe 100644 --- a/thirdparty/icu4c/common/rbbiscan.cpp +++ b/thirdparty/icu4c/common/rbbiscan.cpp @@ -284,7 +284,7 @@ UBool RBBIRuleScanner::doParseActions(int32_t action) case doEndAssign: { - // We have reached the end of an assignement statement. + // We have reached the end of an assignment statement. // Current scan char is the ';' that terminates the assignment. // Terminate expression, leaves expression parse tree rooted in TOS node. @@ -856,6 +856,10 @@ UChar32 RBBIRuleScanner::nextCharLL() { return (UChar32)-1; } ch = fRB->fRules.char32At(fNextIndex); + if (U_IS_SURROGATE(ch)) { + error(U_ILLEGAL_CHAR_FOUND); + return U_SENTINEL; + } fNextIndex = fRB->fRules.moveIndex32(fNextIndex, 1); if (ch == chCR || diff --git a/thirdparty/icu4c/common/rbbitblb.cpp b/thirdparty/icu4c/common/rbbitblb.cpp index 70e260fc08..dd76337bc6 100644 --- a/thirdparty/icu4c/common/rbbitblb.cpp +++ b/thirdparty/icu4c/common/rbbitblb.cpp @@ -151,7 +151,7 @@ void RBBITableBuilder::buildForwardTable() { // // calculate the functions nullable, firstpos, lastpos and followpos on // nodes in the parse tree. - // See the alogrithm description in Aho. + // See the algorithm description in Aho. // Understanding how this works by looking at the code alone will be // nearly impossible. // diff --git a/thirdparty/icu4c/common/resource.h b/thirdparty/icu4c/common/resource.h index 3795694412..48f5b9fa6e 100644 --- a/thirdparty/icu4c/common/resource.h +++ b/thirdparty/icu4c/common/resource.h @@ -274,8 +274,10 @@ public: * * @param key The key string of the enumeration-start resource. * Empty if the enumeration starts at the top level of the bundle. - * @param value Call getArray() or getTable() as appropriate. - * Then reuse for output values from Array and Table getters. + * @param value Call getArray() or getTable() as appropriate. Then reuse for + * output values from Array and Table getters. Note: ResourceTable and + * ResourceArray instances must outlive the ResourceValue instance for + * ResourceTracer to be happy. * @param noFallback true if the bundle has no parent; * that is, its top-level table has the nofallback attribute, * or it is the root bundle of a locale tree. diff --git a/thirdparty/icu4c/common/restrace.cpp b/thirdparty/icu4c/common/restrace.cpp index 5c6498850e..1f83372d68 100644 --- a/thirdparty/icu4c/common/restrace.cpp +++ b/thirdparty/icu4c/common/restrace.cpp @@ -54,6 +54,9 @@ void ResourceTracer::traceOpen() const { CharString& ResourceTracer::getFilePath(CharString& output, UErrorCode& status) const { if (fResB) { + // Note: if you get a segfault around here, check that ResourceTable and + // ResourceArray instances outlive ResourceValue instances referring to + // their contents: output.append(fResB->fData->fPath, status); output.append('/', status); output.append(fResB->fData->fName, status); diff --git a/thirdparty/icu4c/common/servnotf.h b/thirdparty/icu4c/common/servnotf.h index 305570c1e6..73ce38c772 100644 --- a/thirdparty/icu4c/common/servnotf.h +++ b/thirdparty/icu4c/common/servnotf.h @@ -82,7 +82,7 @@ public: /** * Add a listener to be notified when notifyChanged is called. * The listener must not be null. AcceptsListener must return - * true for the listener. Attempts to concurrently + * true for the listener. Attempts to concurrently * register the identical listener more than once will be * silently ignored. */ @@ -90,7 +90,7 @@ public: /** * Stop notifying this listener. The listener must - * not be null. Attemps to remove a listener that is + * not be null. Attempts to remove a listener that is * not registered will be silently ignored. */ virtual void removeListener(const EventListener* l, UErrorCode& status); diff --git a/thirdparty/icu4c/common/ubrk.cpp b/thirdparty/icu4c/common/ubrk.cpp index f8bdf5a6b6..bb5bdd1b50 100644 --- a/thirdparty/icu4c/common/ubrk.cpp +++ b/thirdparty/icu4c/common/ubrk.cpp @@ -174,6 +174,18 @@ ubrk_safeClone( return (UBreakIterator *)newBI; } +U_CAPI UBreakIterator * U_EXPORT2 +ubrk_clone(const UBreakIterator *bi, UErrorCode *status) { + if (U_FAILURE(*status)) { + return nullptr; + } + BreakIterator *newBI = ((BreakIterator *)bi)->clone(); + if (newBI == nullptr) { + *status = U_MEMORY_ALLOCATION_ERROR; + return nullptr; + } + return (UBreakIterator *)newBI; +} U_CAPI void U_EXPORT2 diff --git a/thirdparty/icu4c/common/ucase.cpp b/thirdparty/icu4c/common/ucase.cpp index 2b142f5bc2..4f4c274d60 100644 --- a/thirdparty/icu4c/common/ucase.cpp +++ b/thirdparty/icu4c/common/ucase.cpp @@ -681,7 +681,7 @@ ucase_isCaseSensitive(UChar32 c) { * - In [CoreProps], C has one of the properties Uppercase, or Lowercase * - Given D = NFD(C), then it is not the case that: * D = UCD_lower(D) = UCD_upper(D) = UCD_title(D) - * (This third criterium does not add any characters to the list + * (This third criterion does not add any characters to the list * for Unicode 3.2. Ignored.) * * D2. A character C is defined to be case-ignorable diff --git a/thirdparty/icu4c/common/uchar.cpp b/thirdparty/icu4c/common/uchar.cpp index eb14e4c75d..61e9c3d900 100644 --- a/thirdparty/icu4c/common/uchar.cpp +++ b/thirdparty/icu4c/common/uchar.cpp @@ -194,7 +194,7 @@ u_isISOControl(UChar32 c) { /* Some control characters that are used as space. */ #define IS_THAT_CONTROL_SPACE(c) \ - (c<=0x9f && ((c>=TAB && c<=CR) || (c>=0x1c && c <=0x1f) || c==NL)) + (c<=0x9f && ((c>=TAB && c<=CR) || (c>=0x1c && c <=0x1f) || c==0x85)) /* Java has decided that U+0085 New Line is not whitespace any more. */ #define IS_THAT_ASCII_CONTROL_SPACE(c) \ @@ -677,14 +677,14 @@ uchar_addPropertyStarts(const USetAdder *sa, UErrorCode *pErrorCode) { sa->add(sa->set, CR+1); /* range TAB..CR */ sa->add(sa->set, 0x1c); sa->add(sa->set, 0x1f+1); - USET_ADD_CP_AND_NEXT(sa, NL); + USET_ADD_CP_AND_NEXT(sa, 0x85); // NEXT LINE (NEL) /* add for u_isIDIgnorable() what was not added above */ - sa->add(sa->set, DEL); /* range DEL..NBSP-1, NBSP added below */ + sa->add(sa->set, 0x7f); /* range DEL..NBSP-1, NBSP added below */ sa->add(sa->set, HAIRSP); sa->add(sa->set, RLM+1); - sa->add(sa->set, INHSWAP); - sa->add(sa->set, NOMDIG+1); + sa->add(sa->set, 0x206a); // INHIBIT SYMMETRIC SWAPPING + sa->add(sa->set, 0x206f+1); // NOMINAL DIGIT SHAPES USET_ADD_CP_AND_NEXT(sa, ZWNBSP); /* add no-break spaces for u_isWhitespace() what was not added above */ @@ -693,23 +693,25 @@ uchar_addPropertyStarts(const USetAdder *sa, UErrorCode *pErrorCode) { USET_ADD_CP_AND_NEXT(sa, NNBSP); /* add for u_digit() */ - sa->add(sa->set, U_a); - sa->add(sa->set, U_z+1); - sa->add(sa->set, U_A); - sa->add(sa->set, U_Z+1); - sa->add(sa->set, U_FW_a); - sa->add(sa->set, U_FW_z+1); - sa->add(sa->set, U_FW_A); - sa->add(sa->set, U_FW_Z+1); + sa->add(sa->set, u'a'); + sa->add(sa->set, u'z'+1); + sa->add(sa->set, u'A'); + sa->add(sa->set, u'Z'+1); + // fullwidth + sa->add(sa->set, u'a'); + sa->add(sa->set, u'z'+1); + sa->add(sa->set, u'A'); + sa->add(sa->set, u'Z'+1); /* add for u_isxdigit() */ - sa->add(sa->set, U_f+1); - sa->add(sa->set, U_F+1); - sa->add(sa->set, U_FW_f+1); - sa->add(sa->set, U_FW_F+1); + sa->add(sa->set, u'f'+1); + sa->add(sa->set, u'F'+1); + // fullwidth + sa->add(sa->set, u'f'+1); + sa->add(sa->set, u'F'+1); /* add for UCHAR_DEFAULT_IGNORABLE_CODE_POINT what was not added above */ - sa->add(sa->set, WJ); /* range WJ..NOMDIG */ + sa->add(sa->set, 0x2060); /* range 2060..206f */ sa->add(sa->set, 0xfff0); sa->add(sa->set, 0xfffb+1); sa->add(sa->set, 0xe0000); diff --git a/thirdparty/icu4c/common/ucnv2022.cpp b/thirdparty/icu4c/common/ucnv2022.cpp index 169ad4c526..1726440b94 100644 --- a/thirdparty/icu4c/common/ucnv2022.cpp +++ b/thirdparty/icu4c/common/ucnv2022.cpp @@ -820,7 +820,7 @@ getKey_2022(char c,int32_t* key,int32_t* offset){ return INVALID_2022; } -/*runs through a state machine to determine the escape sequence - codepage correspondance +/*runs through a state machine to determine the escape sequence - codepage correspondence */ static void changeState_2022(UConverter* _this, @@ -1424,7 +1424,7 @@ toUnicodeCallback(UConverter *cnv, * KSC5601 : alias to ibm-949 mapping table * GB2312 : alias to ibm-1386 mapping table * ISO-8859-1 : Algorithmic implemented as LATIN1 case -* ISO-8859-7 : alisas to ibm-9409 mapping table +* ISO-8859-7 : alias to ibm-9409 mapping table */ /* preference order of JP charsets */ @@ -2324,7 +2324,7 @@ endloop: /*************************************************************** * Rules for ISO-2022-KR encoding * i) The KSC5601 designator sequence should appear only once in a file, -* at the begining of a line before any KSC5601 characters. This usually +* at the beginning of a line before any KSC5601 characters. This usually * means that it appears by itself on the first line of the file * ii) There are only 2 shifting sequences SO to shift into double byte mode * and SI to shift into single byte mode diff --git a/thirdparty/icu4c/common/ucnv_bld.cpp b/thirdparty/icu4c/common/ucnv_bld.cpp index 0e198892f1..d08eec7369 100644 --- a/thirdparty/icu4c/common/ucnv_bld.cpp +++ b/thirdparty/icu4c/common/ucnv_bld.cpp @@ -427,7 +427,7 @@ getAlgorithmicTypeFromName(const char *realName) #define UCNV_CACHE_LOAD_FACTOR 2 /* Puts the shared data in the static hashtable SHARED_DATA_HASHTABLE */ -/* Will always be called with the cnvCacheMutex alrady being held */ +/* Will always be called with the cnvCacheMutex already being held */ /* by the calling function. */ /* Stores the shared data in the SHARED_DATA_HASHTABLE * @param data The shared data diff --git a/thirdparty/icu4c/common/ucnv_err.cpp b/thirdparty/icu4c/common/ucnv_err.cpp index 6b738face5..e1f2b934aa 100644 --- a/thirdparty/icu4c/common/ucnv_err.cpp +++ b/thirdparty/icu4c/common/ucnv_err.cpp @@ -321,7 +321,7 @@ UCNV_FROM_U_CALLBACK_ESCAPE ( case UCNV_PRV_ESCAPE_CSS2: valueString[valueStringLength++] = (UChar) UNICODE_RS_CODEPOINT; /* adding \ */ valueStringLength += uprv_itou (valueString + valueStringLength, VALUE_STRING_LENGTH - valueStringLength, codePoint, 16, 0); - /* Always add space character, becase the next character might be whitespace, + /* Always add space character, because the next character might be whitespace, which would erroneously be considered the termination of the escape sequence. */ valueString[valueStringLength++] = (UChar) UNICODE_SPACE_CODEPOINT; break; diff --git a/thirdparty/icu4c/common/ucnv_lmb.cpp b/thirdparty/icu4c/common/ucnv_lmb.cpp index 168392837b..41317d1cc0 100644 --- a/thirdparty/icu4c/common/ucnv_lmb.cpp +++ b/thirdparty/icu4c/common/ucnv_lmb.cpp @@ -81,7 +81,7 @@ [G] D1 [D2] That is, a sometimes-optional 'group' byte, followed by 1 and sometimes 2 - data bytes. The maximum size of a LMBCS chjaracter is 3 bytes: + data bytes. The maximum size of a LMBCS character is 3 bytes: */ #define ULMBCS_CHARSIZE_MAX 3 /* @@ -164,7 +164,7 @@ beginning of internal 'system' range names: */ /* Then we needed a place to put all the other ansi control characters that must be moved to different values because LMBCS reserves those values for other purposes. To represent the control characters, we start -with a first byte of 0xF & add the control chaarcter value as the +with a first byte of 0xF & add the control character value as the second byte */ #define ULMBCS_GRP_CTRL 0x0F diff --git a/thirdparty/icu4c/common/ucnv_u7.cpp b/thirdparty/icu4c/common/ucnv_u7.cpp index 87ba8cf37e..de9f3f42ec 100644 --- a/thirdparty/icu4c/common/ucnv_u7.cpp +++ b/thirdparty/icu4c/common/ucnv_u7.cpp @@ -814,7 +814,7 @@ const UConverterSharedData _UTF7Data= * the use of "~" in some servers as a home directory indicator. * * 5) UTF-7 permits multiple alternate forms to represent the same - * string; in particular, printable US-ASCII chararacters can be + * string; in particular, printable US-ASCII characters can be * represented in encoded form. * * In modified UTF-7, printable US-ASCII characters except for "&" diff --git a/thirdparty/icu4c/common/ucnvisci.cpp b/thirdparty/icu4c/common/ucnvisci.cpp index 44a7c05a3c..ffb8c7ac3e 100644 --- a/thirdparty/icu4c/common/ucnvisci.cpp +++ b/thirdparty/icu4c/common/ucnvisci.cpp @@ -992,7 +992,7 @@ UConverter_fromUnicode_ISCII_OFFSETS_LOGIC( if (converterData->currentDeltaFromUnicode == PNJ_DELTA) { if (sourceChar == PNJ_TIPPI) { - /* Make sure Tippi is converterd to Bindi. */ + /* Make sure Tippi is converted to Bindi. */ sourceChar = PNJ_BINDI; } else if (sourceChar == PNJ_ADHAK) { /* This is for consonant cluster handling. */ @@ -1147,7 +1147,7 @@ static const uint16_t lookupTable[][2]={ /* is the code point valid in current script? */ \ if(sourceChar> ASCII_END && \ (validityTable[(targetUniChar & 0x7F)] & data->currentMaskToUnicode)==0){ \ - /* Vocallic RR is assigne in ISCII Telugu and Unicode */ \ + /* Vocallic RR is assigned in ISCII Telugu and Unicode */ \ if(data->currentDeltaToUnicode!=(TELUGU_DELTA) || \ targetUniChar!=VOCALLIC_RR){ \ targetUniChar=missingCharMarker; \ @@ -1272,7 +1272,7 @@ UConverter_toUnicode_ISCII_OFFSETS_LOGIC(UConverterToUnicodeArgs *args, UErrorCo goto CALLBACK; } else if (*contextCharToUnicode==ISCII_INV) { if (sourceChar==ISCII_HALANT) { - targetUniChar = 0x0020; /* replace with space accoding to Indic FAQ */ + targetUniChar = 0x0020; /* replace with space according to Indic FAQ */ } else { targetUniChar = ZWJ; } diff --git a/thirdparty/icu4c/common/ucurr.cpp b/thirdparty/icu4c/common/ucurr.cpp index 0e14cddcff..20bbd51488 100644 --- a/thirdparty/icu4c/common/ucurr.cpp +++ b/thirdparty/icu4c/common/ucurr.cpp @@ -844,7 +844,7 @@ typedef struct { #endif -// Comparason function used in quick sort. +// Comparison function used in quick sort. static int U_CALLCONV currencyNameComparator(const void* a, const void* b) { const CurrencyNameStruct* currName_1 = (const CurrencyNameStruct*)a; const CurrencyNameStruct* currName_2 = (const CurrencyNameStruct*)b; @@ -1530,7 +1530,7 @@ uprv_parseCurrency(const char* locale, int32_t max = 0; int32_t matchIndex = -1; - // case in-sensitive comparision against currency names + // case in-sensitive comparison against currency names searchCurrencyName(currencyNames, total_currency_name_count, upperText, textLen, partialMatchLen, &max, &matchIndex); diff --git a/thirdparty/icu4c/common/uhash.cpp b/thirdparty/icu4c/common/uhash.cpp index 86311ceb0b..67c7c36354 100644 --- a/thirdparty/icu4c/common/uhash.cpp +++ b/thirdparty/icu4c/common/uhash.cpp @@ -133,8 +133,10 @@ static const float RESIZE_POLICY_RATIO_TABLE[6] = { * or a pointer. If a hint bit is zero, then the associated * token is assumed to be an integer. */ +#define HINT_BOTH_INTEGERS (0) #define HINT_KEY_POINTER (1) #define HINT_VALUE_POINTER (2) +#define HINT_ALLOW_ZERO (4) /******************************************************************** * PRIVATE Implementation @@ -479,8 +481,9 @@ _uhash_put(UHashtable *hash, goto err; } U_ASSERT(hash != NULL); - /* Cannot always check pointer here or iSeries sees NULL every time. */ - if ((hint & HINT_VALUE_POINTER) && value.pointer == NULL) { + if ((hint & HINT_VALUE_POINTER) ? + value.pointer == NULL : + value.integer == 0 && (hint & HINT_ALLOW_ZERO) == 0) { /* Disallow storage of NULL values, since NULL is returned by * get() to indicate an absent key. Storing NULL == removing. */ @@ -687,6 +690,28 @@ uhash_igeti(const UHashtable *hash, return _uhash_find(hash, keyholder, hash->keyHasher(keyholder))->value.integer; } +U_CAPI int32_t U_EXPORT2 +uhash_getiAndFound(const UHashtable *hash, + const void *key, + UBool *found) { + UHashTok keyholder; + keyholder.pointer = (void *)key; + const UHashElement *e = _uhash_find(hash, keyholder, hash->keyHasher(keyholder)); + *found = !IS_EMPTY_OR_DELETED(e->hashcode); + return e->value.integer; +} + +U_CAPI int32_t U_EXPORT2 +uhash_igetiAndFound(const UHashtable *hash, + int32_t key, + UBool *found) { + UHashTok keyholder; + keyholder.integer = key; + const UHashElement *e = _uhash_find(hash, keyholder, hash->keyHasher(keyholder)); + *found = !IS_EMPTY_OR_DELETED(e->hashcode); + return e->value.integer; +} + U_CAPI void* U_EXPORT2 uhash_put(UHashtable *hash, void* key, @@ -736,7 +761,34 @@ uhash_iputi(UHashtable *hash, keyholder.integer = key; valueholder.integer = value; return _uhash_put(hash, keyholder, valueholder, - 0, /* neither is a ptr */ + HINT_BOTH_INTEGERS, + status).integer; +} + +U_CAPI int32_t U_EXPORT2 +uhash_putiAllowZero(UHashtable *hash, + void *key, + int32_t value, + UErrorCode *status) { + UHashTok keyholder, valueholder; + keyholder.pointer = key; + valueholder.integer = value; + return _uhash_put(hash, keyholder, valueholder, + HINT_KEY_POINTER | HINT_ALLOW_ZERO, + status).integer; +} + + +U_CAPI int32_t U_EXPORT2 +uhash_iputiAllowZero(UHashtable *hash, + int32_t key, + int32_t value, + UErrorCode *status) { + UHashTok keyholder, valueholder; + keyholder.integer = key; + valueholder.integer = value; + return _uhash_put(hash, keyholder, valueholder, + HINT_BOTH_INTEGERS | HINT_ALLOW_ZERO, status).integer; } @@ -785,6 +837,29 @@ uhash_removeAll(UHashtable *hash) { U_ASSERT(hash->count == 0); } +U_CAPI UBool U_EXPORT2 +uhash_containsKey(const UHashtable *hash, const void *key) { + UHashTok keyholder; + keyholder.pointer = (void *)key; + const UHashElement *e = _uhash_find(hash, keyholder, hash->keyHasher(keyholder)); + return !IS_EMPTY_OR_DELETED(e->hashcode); +} + +/** + * Returns true if the UHashtable contains an item with this integer key. + * + * @param hash The target UHashtable. + * @param key An integer key stored in a hashtable + * @return true if the key is found. + */ +U_CAPI UBool U_EXPORT2 +uhash_icontainsKey(const UHashtable *hash, int32_t key) { + UHashTok keyholder; + keyholder.integer = key; + const UHashElement *e = _uhash_find(hash, keyholder, hash->keyHasher(keyholder)); + return !IS_EMPTY_OR_DELETED(e->hashcode); +} + U_CAPI const UHashElement* U_EXPORT2 uhash_find(const UHashtable *hash, const void* key) { UHashTok keyholder; diff --git a/thirdparty/icu4c/common/uhash.h b/thirdparty/icu4c/common/uhash.h index b59d2711bb..af75999860 100644 --- a/thirdparty/icu4c/common/uhash.h +++ b/thirdparty/icu4c/common/uhash.h @@ -23,7 +23,7 @@ /** * UHashtable stores key-value pairs and does moderately fast lookup * based on keys. It provides a good tradeoff between access time and - * storage space. As elements are added to it, it grows to accomodate + * storage space. As elements are added to it, it grows to accommodate * them. By default, the table never shrinks, even if all elements * are removed from it. * @@ -54,6 +54,13 @@ * uhash_remove() on that key. This keeps uhash_get(), uhash_count(), * and uhash_nextElement() consistent with one another. * + * Keys and values can be integers. + * Functions that work with an integer key have an "i" prefix. + * Functions that work with an integer value have an "i" suffix. + * As with putting a NULL value pointer, putting a zero value integer removes the item. + * Except, there are pairs of functions that allow setting zero values + * and fetching (value, found) pairs. + * * To see everything in a hashtable, use uhash_nextElement() to * iterate through its contents. Each call to this function returns a * UHashElement pointer. A hash element contains a key, value, and @@ -405,6 +412,44 @@ uhash_iputi(UHashtable *hash, int32_t value, UErrorCode *status); +/** + * Put a (key=pointer, value=integer) item in a UHashtable. If the + * keyDeleter is non-NULL, then the hashtable owns 'key' after this + * call. valueDeleter must be NULL. + * Storing a 0 value is possible; call uhash_igetiAndFound() to retrieve values including zero. + * + * @param hash The target UHashtable. + * @param key The key to store. + * @param value The integer value to store. + * @param status A pointer to an UErrorCode to receive any errors. + * @return The previous value, or 0 if none. + * @see uhash_getiAndFound + */ +U_CAPI int32_t U_EXPORT2 +uhash_putiAllowZero(UHashtable *hash, + void *key, + int32_t value, + UErrorCode *status); + +/** + * Put a (key=integer, value=integer) item in a UHashtable. If the + * keyDeleter is non-NULL, then the hashtable owns 'key' after this + * call. valueDeleter must be NULL. + * Storing a 0 value is possible; call uhash_igetiAndFound() to retrieve values including zero. + * + * @param hash The target UHashtable. + * @param key The key to store. + * @param value The integer value to store. + * @param status A pointer to an UErrorCode to receive any errors. + * @return The previous value, or 0 if none. + * @see uhash_igetiAndFound + */ +U_CAPI int32_t U_EXPORT2 +uhash_iputiAllowZero(UHashtable *hash, + int32_t key, + int32_t value, + UErrorCode *status); + /** * Retrieve a pointer value from a UHashtable using a pointer key, * as previously stored by uhash_put(). @@ -448,6 +493,34 @@ U_CAPI int32_t U_EXPORT2 uhash_igeti(const UHashtable *hash, int32_t key); +/** + * Retrieves an integer value from a UHashtable using a pointer key, + * as previously stored by uhash_putiAllowZero() or uhash_puti(). + * + * @param hash The target UHashtable. + * @param key A pointer key stored in a hashtable + * @param found A pointer to a boolean which will be set for whether the key was found. + * @return The requested item, or 0 if not found. + */ +U_CAPI int32_t U_EXPORT2 +uhash_getiAndFound(const UHashtable *hash, + const void *key, + UBool *found); + +/** + * Retrieves an integer value from a UHashtable using an integer key, + * as previously stored by uhash_iputiAllowZero() or uhash_iputi(). + * + * @param hash The target UHashtable. + * @param key An integer key stored in a hashtable + * @param found A pointer to a boolean which will be set for whether the key was found. + * @return The requested item, or 0 if not found. + */ +U_CAPI int32_t U_EXPORT2 +uhash_igetiAndFound(const UHashtable *hash, + int32_t key, + UBool *found); + /** * Remove an item from a UHashtable stored by uhash_put(). * @param hash The target UHashtable. @@ -495,6 +568,26 @@ uhash_iremovei(UHashtable *hash, U_CAPI void U_EXPORT2 uhash_removeAll(UHashtable *hash); +/** + * Returns true if the UHashtable contains an item with this pointer key. + * + * @param hash The target UHashtable. + * @param key A pointer key stored in a hashtable + * @return true if the key is found. + */ +U_CAPI UBool U_EXPORT2 +uhash_containsKey(const UHashtable *hash, const void *key); + +/** + * Returns true if the UHashtable contains an item with this integer key. + * + * @param hash The target UHashtable. + * @param key An integer key stored in a hashtable + * @return true if the key is found. + */ +U_CAPI UBool U_EXPORT2 +uhash_icontainsKey(const UHashtable *hash, int32_t key); + /** * Locate an element of a UHashtable. The caller must not modify the * returned object. The primary use of this function is to obtain the diff --git a/thirdparty/icu4c/common/uloc.cpp b/thirdparty/icu4c/common/uloc.cpp index ebfbb50650..d96e79b8fd 100644 --- a/thirdparty/icu4c/common/uloc.cpp +++ b/thirdparty/icu4c/common/uloc.cpp @@ -143,7 +143,7 @@ static const char * const LANGUAGES[] = { "mad", "maf", "mag", "mai", "mak", "man", "mas", "mde", "mdf", "mdh", "mdr", "men", "mer", "mfe", "mg", "mga", "mgh", "mgo", "mh", "mi", "mic", "min", "mis", "mk", - "ml", "mn", "mnc", "mni", "mo", + "ml", "mn", "mnc", "mni", "moh", "mos", "mr", "mrj", "ms", "mt", "mua", "mul", "mus", "mwl", "mwr", "mwv", "my", "mye", "myv", "mzn", @@ -166,9 +166,9 @@ static const char * const LANGUAGES[] = { "sl", "sli", "sly", "sm", "sma", "smj", "smn", "sms", "sn", "snk", "so", "sog", "sq", "sr", "srn", "srr", "ss", "ssy", "st", "stq", "su", "suk", "sus", "sux", - "sv", "sw", "swb", "swc", "syc", "syr", "szl", + "sv", "sw", "swb", "syc", "syr", "szl", "ta", "tcy", "te", "tem", "teo", "ter", "tet", "tg", - "th", "ti", "tig", "tiv", "tk", "tkl", "tkr", "tl", + "th", "ti", "tig", "tiv", "tk", "tkl", "tkr", "tlh", "tli", "tly", "tmh", "tn", "to", "tog", "tpi", "tr", "tru", "trv", "ts", "tsd", "tsi", "tt", "ttt", "tum", "tvl", "tw", "twq", "ty", "tyv", "tzm", @@ -181,7 +181,7 @@ static const char * const LANGUAGES[] = { "za", "zap", "zbl", "zea", "zen", "zgh", "zh", "zu", "zun", "zxx", "zza", NULL, - "in", "iw", "ji", "jw", "sh", /* obsolete language codes */ + "in", "iw", "ji", "jw", "mo", "sh", "swc", "tl", /* obsolete language codes */ NULL }; @@ -260,7 +260,7 @@ static const char * const LANGUAGES_3[] = { "mad", "maf", "mag", "mai", "mak", "man", "mas", "mde", "mdf", "mdh", "mdr", "men", "mer", "mfe", "mlg", "mga", "mgh", "mgo", "mah", "mri", "mic", "min", "mis", "mkd", - "mal", "mon", "mnc", "mni", "mol", + "mal", "mon", "mnc", "mni", "moh", "mos", "mar", "mrj", "msa", "mlt", "mua", "mul", "mus", "mwl", "mwr", "mwv", "mya", "mye", "myv", "mzn", @@ -283,9 +283,9 @@ static const char * const LANGUAGES_3[] = { "slv", "sli", "sly", "smo", "sma", "smj", "smn", "sms", "sna", "snk", "som", "sog", "sqi", "srp", "srn", "srr", "ssw", "ssy", "sot", "stq", "sun", "suk", "sus", "sux", - "swe", "swa", "swb", "swc", "syc", "syr", "szl", + "swe", "swa", "swb", "syc", "syr", "szl", "tam", "tcy", "tel", "tem", "teo", "ter", "tet", "tgk", - "tha", "tir", "tig", "tiv", "tuk", "tkl", "tkr", "tgl", + "tha", "tir", "tig", "tiv", "tuk", "tkl", "tkr", "tlh", "tli", "tly", "tmh", "tsn", "ton", "tog", "tpi", "tur", "tru", "trv", "tso", "tsd", "tsi", "tat", "ttt", "tum", "tvl", "twi", "twq", "tah", "tyv", "tzm", @@ -298,8 +298,8 @@ static const char * const LANGUAGES_3[] = { "zha", "zap", "zbl", "zea", "zen", "zgh", "zho", "zul", "zun", "zxx", "zza", NULL, -/* "in", "iw", "ji", "jw", "sh", */ - "ind", "heb", "yid", "jaw", "srp", +/* "in", "iw", "ji", "jw", "mo", "sh", "swc", "tl", */ + "ind", "heb", "yid", "jaw", "mol", "srp", "swc", "tgl", NULL }; @@ -334,13 +334,13 @@ static const char * const COUNTRIES[] = { "BJ", "BL", "BM", "BN", "BO", "BQ", "BR", "BS", "BT", "BV", "BW", "BY", "BZ", "CA", "CC", "CD", "CF", "CG", "CH", "CI", "CK", "CL", "CM", "CN", "CO", "CR", - "CU", "CV", "CW", "CX", "CY", "CZ", "DE", "DJ", "DK", - "DM", "DO", "DZ", "EC", "EE", "EG", "EH", "ER", + "CU", "CV", "CW", "CX", "CY", "CZ", "DE", "DG", "DJ", "DK", + "DM", "DO", "DZ", "EA", "EC", "EE", "EG", "EH", "ER", "ES", "ET", "FI", "FJ", "FK", "FM", "FO", "FR", "GA", "GB", "GD", "GE", "GF", "GG", "GH", "GI", "GL", "GM", "GN", "GP", "GQ", "GR", "GS", "GT", "GU", "GW", "GY", "HK", "HM", "HN", "HR", "HT", "HU", - "ID", "IE", "IL", "IM", "IN", "IO", "IQ", "IR", "IS", + "IC", "ID", "IE", "IL", "IM", "IN", "IO", "IQ", "IR", "IS", "IT", "JE", "JM", "JO", "JP", "KE", "KG", "KH", "KI", "KM", "KN", "KP", "KR", "KW", "KY", "KZ", "LA", "LB", "LC", "LI", "LK", "LR", "LS", "LT", "LU", @@ -357,7 +357,7 @@ static const char * const COUNTRIES[] = { "TK", "TL", "TM", "TN", "TO", "TR", "TT", "TV", "TW", "TZ", "UA", "UG", "UM", "US", "UY", "UZ", "VA", "VC", "VE", "VG", "VI", "VN", "VU", "WF", - "WS", "YE", "YT", "ZA", "ZM", "ZW", + "WS", "XK", "YE", "YT", "ZA", "ZM", "ZW", NULL, "AN", "BU", "CS", "FX", "RO", "SU", "TP", "YD", "YU", "ZR", /* obsolete country codes */ NULL @@ -397,10 +397,10 @@ static const char * const COUNTRIES_3[] = { "BWA", "BLR", "BLZ", "CAN", "CCK", "COD", "CAF", "COG", /* "CH", "CI", "CK", "CL", "CM", "CN", "CO", "CR", */ "CHE", "CIV", "COK", "CHL", "CMR", "CHN", "COL", "CRI", -/* "CU", "CV", "CW", "CX", "CY", "CZ", "DE", "DJ", "DK", */ - "CUB", "CPV", "CUW", "CXR", "CYP", "CZE", "DEU", "DJI", "DNK", -/* "DM", "DO", "DZ", "EC", "EE", "EG", "EH", "ER", */ - "DMA", "DOM", "DZA", "ECU", "EST", "EGY", "ESH", "ERI", +/* "CU", "CV", "CW", "CX", "CY", "CZ", "DE", "DG", "DJ", "DK", */ + "CUB", "CPV", "CUW", "CXR", "CYP", "CZE", "DEU", "DGA", "DJI", "DNK", +/* "DM", "DO", "DZ", "EA", "EC", "EE", "EG", "EH", "ER", */ + "DMA", "DOM", "DZA", "XEA", "ECU", "EST", "EGY", "ESH", "ERI", /* "ES", "ET", "FI", "FJ", "FK", "FM", "FO", "FR", */ "ESP", "ETH", "FIN", "FJI", "FLK", "FSM", "FRO", "FRA", /* "GA", "GB", "GD", "GE", "GF", "GG", "GH", "GI", "GL", */ @@ -409,8 +409,8 @@ static const char * const COUNTRIES_3[] = { "GMB", "GIN", "GLP", "GNQ", "GRC", "SGS", "GTM", "GUM", /* "GW", "GY", "HK", "HM", "HN", "HR", "HT", "HU", */ "GNB", "GUY", "HKG", "HMD", "HND", "HRV", "HTI", "HUN", -/* "ID", "IE", "IL", "IM", "IN", "IO", "IQ", "IR", "IS" */ - "IDN", "IRL", "ISR", "IMN", "IND", "IOT", "IRQ", "IRN", "ISL", +/* "IC", "ID", "IE", "IL", "IM", "IN", "IO", "IQ", "IR", "IS" */ + "XIC", "IDN", "IRL", "ISR", "IMN", "IND", "IOT", "IRQ", "IRN", "ISL", /* "IT", "JE", "JM", "JO", "JP", "KE", "KG", "KH", "KI", */ "ITA", "JEY", "JAM", "JOR", "JPN", "KEN", "KGZ", "KHM", "KIR", /* "KM", "KN", "KP", "KR", "KW", "KY", "KZ", "LA", */ @@ -443,8 +443,8 @@ static const char * const COUNTRIES_3[] = { "TWN", "TZA", "UKR", "UGA", "UMI", "USA", "URY", "UZB", /* "VA", "VC", "VE", "VG", "VI", "VN", "VU", "WF", */ "VAT", "VCT", "VEN", "VGB", "VIR", "VNM", "VUT", "WLF", -/* "WS", "YE", "YT", "ZA", "ZM", "ZW", */ - "WSM", "YEM", "MYT", "ZAF", "ZMB", "ZWE", +/* "WS", "XK", "YE", "YT", "ZA", "ZM", "ZW", */ + "WSM", "XXK", "YEM", "MYT", "ZAF", "ZMB", "ZWE", NULL, /* "AN", "BU", "CS", "FX", "RO", "SU", "TP", "YD", "YU", "ZR" */ "ANT", "BUR", "SCG", "FXX", "ROM", "SUN", "TMP", "YMD", "YUG", "ZAR", diff --git a/thirdparty/icu4c/common/uloc_keytype.cpp b/thirdparty/icu4c/common/uloc_keytype.cpp index 019da058cf..c289ebe76f 100644 --- a/thirdparty/icu4c/common/uloc_keytype.cpp +++ b/thirdparty/icu4c/common/uloc_keytype.cpp @@ -271,7 +271,7 @@ initFromResourceBundle(UErrorCode& sts) { if (U_FAILURE(sts)) { break; } - // check if this is an alias of canoncal legacy type + // check if this is an alias of canonical legacy type if (uprv_compareInvWithUChar(NULL, legacyTypeId, -1, to, toLen) == 0) { const char* from = ures_getKey(typeAliasDataEntry.getAlias()); if (isTZ) { diff --git a/thirdparty/icu4c/common/uloc_tag.cpp b/thirdparty/icu4c/common/uloc_tag.cpp index 7f7fd9119e..1235081bf3 100644 --- a/thirdparty/icu4c/common/uloc_tag.cpp +++ b/thirdparty/icu4c/common/uloc_tag.cpp @@ -129,7 +129,6 @@ static const char* const LEGACY[] = { // Legacy tags with no preferred value in the IANA // registry. Kept for now for the backward compatibility // because ICU has mapped them this way. - "cel-gaulish", "xtg-x-cel-gaulish", "i-default", "en-x-i-default", "i-enochian", "und-x-i-enochian", "i-mingo", "see-x-i-mingo", @@ -647,6 +646,22 @@ _isTKey(const char* s, int32_t len) return FALSE; } +U_CAPI const char * U_EXPORT2 +ultag_getTKeyStart(const char *localeID) { + const char *result = localeID; + const char *sep; + while((sep = uprv_strchr(result, SEP)) != nullptr) { + if (_isTKey(result, static_cast(sep - result))) { + return result; + } + result = ++sep; + } + if (_isTKey(result, -1)) { + return result; + } + return nullptr; +} + static UBool _isTValue(const char* s, int32_t len) { @@ -671,9 +686,13 @@ _isTransformedExtensionSubtag(int32_t& state, const char* s, int32_t len) const int32_t kGotTKey = -1; // Got tkey, wait for tvalue. ERROR if stop here. const int32_t kGotTValue = 6; // Got tvalue, wait for tkey, tvalue or end + + if (len < 0) { + len = (int32_t)uprv_strlen(s); + } switch (state) { case kStart: - if (ultag_isLanguageSubtag(s, len)) { + if (ultag_isLanguageSubtag(s, len) && len != 4) { state = kGotLanguage; return TRUE; } @@ -1775,11 +1794,6 @@ _appendKeywords(ULanguageTag* langtag, icu::ByteSink& sink, UErrorCode* status) return; } - /* Determine if variants already exists */ - if (ultag_getVariantsSize(langtag)) { - posixVariant = TRUE; - } - n = ultag_getExtensionsSize(langtag); /* resolve locale keywords and reordering keys */ @@ -1787,6 +1801,11 @@ _appendKeywords(ULanguageTag* langtag, icu::ByteSink& sink, UErrorCode* status) key = ultag_getExtensionKey(langtag, i); type = ultag_getExtensionValue(langtag, i); if (*key == LDMLEXT) { + /* Determine if variants already exists */ + if (ultag_getVariantsSize(langtag)) { + posixVariant = TRUE; + } + _appendLDMLExtensionAsKeywords(type, &kwdFirst, extPool, kwdBuf, &posixVariant, status); if (U_FAILURE(*status)) { break; @@ -2028,7 +2047,10 @@ ultag_parse(const char* tag, int32_t tagLen, int32_t* parsedLen, UErrorCode* sta *status = U_MEMORY_ALLOCATION_ERROR; return NULL; } - uprv_memcpy(tagBuf, tag, tagLen); + + if (tagLen > 0) { + uprv_memcpy(tagBuf, tag, tagLen); + } *(tagBuf + tagLen) = 0; /* create a ULanguageTag */ @@ -2692,8 +2714,7 @@ ulocimp_toLanguageTag(const char* localeID, if (U_SUCCESS(tmpStatus)) { if (ultag_isPrivateuseValueSubtags(buf.data(), buf.length())) { /* return private use only tag */ - static const char PREFIX[] = { PRIVATEUSE, SEP }; - sink.Append(PREFIX, sizeof(PREFIX)); + sink.Append("und-x-", 6); sink.Append(buf.data(), buf.length()); done = TRUE; } else if (strict) { diff --git a/thirdparty/icu4c/common/ulocimp.h b/thirdparty/icu4c/common/ulocimp.h index 5691fe9a77..1f796aa213 100644 --- a/thirdparty/icu4c/common/ulocimp.h +++ b/thirdparty/icu4c/common/ulocimp.h @@ -286,6 +286,9 @@ ultag_isUnicodeLocaleType(const char* s, int32_t len); U_CFUNC UBool ultag_isVariantSubtags(const char* s, int32_t len); +U_CAPI const char * U_EXPORT2 +ultag_getTKeyStart(const char *localeID); + U_CFUNC const char* ulocimp_toBcpKey(const char* key); diff --git a/thirdparty/icu4c/common/unicode/bytestream.h b/thirdparty/icu4c/common/unicode/bytestream.h index 044f7a77e7..9735ee0bf8 100644 --- a/thirdparty/icu4c/common/unicode/bytestream.h +++ b/thirdparty/icu4c/common/unicode/bytestream.h @@ -71,7 +71,6 @@ public: */ virtual void Append(const char* bytes, int32_t n) = 0; -#ifndef U_HIDE_DRAFT_API /** * Appends n bytes to this. Same as Append(). * Call AppendU8() with u8"string literals" which are const char * in C++11 @@ -81,7 +80,7 @@ public: * * @param bytes the pointer to the bytes * @param n the number of bytes; must be non-negative - * @draft ICU 67 + * @stable ICU 67 */ inline void AppendU8(const char* bytes, int32_t n) { Append(bytes, n); @@ -97,13 +96,12 @@ public: * * @param bytes the pointer to the bytes * @param n the number of bytes; must be non-negative - * @draft ICU 67 + * @stable ICU 67 */ inline void AppendU8(const char8_t* bytes, int32_t n) { Append(reinterpret_cast(bytes), n); } #endif -#endif // U_HIDE_DRAFT_API /** * Returns a writable buffer for appending and writes the buffer's capacity to diff --git a/thirdparty/icu4c/common/unicode/bytestrie.h b/thirdparty/icu4c/common/unicode/bytestrie.h index 85f802df42..271a81d1b4 100644 --- a/thirdparty/icu4c/common/unicode/bytestrie.h +++ b/thirdparty/icu4c/common/unicode/bytestrie.h @@ -30,6 +30,8 @@ #include "unicode/uobject.h" #include "unicode/ustringtrie.h" +class BytesTrieTest; + U_NAMESPACE_BEGIN class ByteSink; @@ -378,6 +380,7 @@ public: private: friend class BytesTrieBuilder; + friend class ::BytesTrieTest; /** * Constructs a BytesTrie reader instance. diff --git a/thirdparty/icu4c/common/unicode/bytestriebuilder.h b/thirdparty/icu4c/common/unicode/bytestriebuilder.h index cae16e48b4..3cff89e443 100644 --- a/thirdparty/icu4c/common/unicode/bytestriebuilder.h +++ b/thirdparty/icu4c/common/unicode/bytestriebuilder.h @@ -30,6 +30,8 @@ #include "unicode/stringpiece.h" #include "unicode/stringtriebuilder.h" +class BytesTrieTest; + U_NAMESPACE_BEGIN class BytesTrieElement; @@ -125,6 +127,8 @@ public: BytesTrieBuilder &clear(); private: + friend class ::BytesTrieTest; + BytesTrieBuilder(const BytesTrieBuilder &other); // no copy constructor BytesTrieBuilder &operator=(const BytesTrieBuilder &other); // no assignment operator @@ -168,6 +172,7 @@ private: virtual int32_t writeValueAndFinal(int32_t i, UBool isFinal); virtual int32_t writeValueAndType(UBool hasValue, int32_t value, int32_t node); virtual int32_t writeDeltaTo(int32_t jumpTarget); + static int32_t internalEncodeDelta(int32_t i, char intBytes[]); CharString *strings; // Pointer not object so we need not #include internal charstr.h. BytesTrieElement *elements; diff --git a/thirdparty/icu4c/common/unicode/docmain.h b/thirdparty/icu4c/common/unicode/docmain.h index edcb5d4e83..e82678c95f 100644 --- a/thirdparty/icu4c/common/unicode/docmain.h +++ b/thirdparty/icu4c/common/unicode/docmain.h @@ -15,7 +15,7 @@ * \file * \brief (Non API- contains Doxygen definitions) * - * This file contains documentation for Doxygen and doesnot have + * This file contains documentation for Doxygen and does not have * any significance with respect to C or C++ API */ @@ -74,7 +74,7 @@ * * * Strings and Character Iteration - * ustring.h, utf8.h, utf16.h, UText, UCharIterator + * ustring.h, utf8.h, utf16.h, icu::StringPiece, UText, UCharIterator, icu::ByteSink * icu::UnicodeString, icu::CharacterIterator, icu::Appendable, icu::StringPiece,icu::ByteSink * * @@ -128,9 +128,9 @@ * icu::Normalizer2 * * - * Calendars + * Calendars and Time Zones * ucal.h - * icu::Calendar + * icu::Calendar, icu::TimeZone * * * Date and Time Formatting diff --git a/thirdparty/icu4c/common/unicode/icuplug.h b/thirdparty/icu4c/common/unicode/icuplug.h index 52f810da57..205af360d4 100644 --- a/thirdparty/icu4c/common/unicode/icuplug.h +++ b/thirdparty/icu4c/common/unicode/icuplug.h @@ -117,14 +117,13 @@ /* === Basic types === */ #ifndef U_HIDE_INTERNAL_API +struct UPlugData; /** * @{ - * Opaque structure passed to/from a plugin. - * use the APIs to access it. + * Typedef for opaque structure passed to/from a plugin. + * Use the APIs to access it. * @internal ICU 4.4 Technology Preview */ - -struct UPlugData; typedef struct UPlugData UPlugData; /** @} */ diff --git a/thirdparty/icu4c/common/unicode/localematcher.h b/thirdparty/icu4c/common/unicode/localematcher.h index 63a68b0b7f..0cd068ef32 100644 --- a/thirdparty/icu4c/common/unicode/localematcher.h +++ b/thirdparty/icu4c/common/unicode/localematcher.h @@ -91,8 +91,6 @@ enum ULocMatchDemotion { typedef enum ULocMatchDemotion ULocMatchDemotion; #endif -#ifndef U_FORCE_HIDE_DRAFT_API - /** * Builder option for whether to include or ignore one-way (fallback) match data. * The LocaleMatcher uses CLDR languageMatch data which includes fallback (oneway=true) entries. @@ -108,20 +106,20 @@ typedef enum ULocMatchDemotion ULocMatchDemotion; * but not if it is merely a fallback. * * @see LocaleMatcher::Builder#setDirection(ULocMatchDirection) - * @draft ICU 67 + * @stable ICU 67 */ enum ULocMatchDirection { /** * Locale matching includes one-way matches such as Breton→French. (default) * - * @draft ICU 67 + * @stable ICU 67 */ ULOCMATCH_DIRECTION_WITH_ONE_WAY, /** * Locale matching limited to two-way matches including e.g. Danish↔Norwegian * but ignoring one-way matches. * - * @draft ICU 67 + * @stable ICU 67 */ ULOCMATCH_DIRECTION_ONLY_TWO_WAY }; @@ -129,8 +127,6 @@ enum ULocMatchDirection { typedef enum ULocMatchDirection ULocMatchDirection; #endif -#endif // U_FORCE_HIDE_DRAFT_API - struct UHashtable; U_NAMESPACE_BEGIN @@ -463,14 +459,13 @@ public: */ Builder &setDemotionPerDesiredLocale(ULocMatchDemotion demotion); -#ifndef U_HIDE_DRAFT_API /** * Option for whether to include or ignore one-way (fallback) match data. * By default, they are included. * * @param direction the match direction to set. * @return this Builder object - * @draft ICU 67 + * @stable ICU 67 */ Builder &setDirection(ULocMatchDirection direction) { if (U_SUCCESS(errorCode_)) { @@ -478,7 +473,6 @@ public: } return *this; } -#endif // U_HIDE_DRAFT_API #ifndef U_HIDE_DRAFT_API /** @@ -704,7 +698,7 @@ private: LSR *lsrs; int32_t supportedLocalesLength; // These are in preference order: 1. Default locale 2. paradigm locales 3. others. - UHashtable *supportedLsrToIndex; // Map stores index+1 because 0 is "not found" + UHashtable *supportedLsrToIndex; // Map // Array versions of the supportedLsrToIndex keys and values. // The distance lookup loops over the supportedLSRs and returns the index of the best match. const LSR **supportedLSRs; diff --git a/thirdparty/icu4c/common/unicode/locid.h b/thirdparty/icu4c/common/unicode/locid.h index ba858d702a..81f4685d65 100644 --- a/thirdparty/icu4c/common/unicode/locid.h +++ b/thirdparty/icu4c/common/unicode/locid.h @@ -571,15 +571,13 @@ public: */ void minimizeSubtags(UErrorCode& status); -#ifndef U_HIDE_DRAFT_API /** * Canonicalize the locale ID of this object according to CLDR. * @param status the status code - * @draft ICU 67 + * @stable ICU 67 * @see createCanonical */ void canonicalize(UErrorCode& status); -#endif // U_HIDE_DRAFT_API /** * Gets the list of keywords for the specified locale. diff --git a/thirdparty/icu4c/common/unicode/normalizer2.h b/thirdparty/icu4c/common/unicode/normalizer2.h index 5eb1d95caf..2d355250c2 100644 --- a/thirdparty/icu4c/common/unicode/normalizer2.h +++ b/thirdparty/icu4c/common/unicode/normalizer2.h @@ -225,10 +225,8 @@ public: * Normalizes a UTF-8 string and optionally records how source substrings * relate to changed and unchanged result substrings. * - * Currently implemented completely only for "compose" modes, - * such as for NFC, NFKC, and NFKC_Casefold - * (UNORM2_COMPOSE and UNORM2_COMPOSE_CONTIGUOUS). - * Otherwise currently converts to & from UTF-16 and does not support edits. + * Implemented completely for all built-in modes except for FCD. + * The base class implementation converts to & from UTF-16 and does not support edits. * * @param options Options bit set, usually 0. See U_OMIT_UNCHANGED_TEXT and U_EDITS_NO_RESET. * @param src Source UTF-8 string. @@ -381,11 +379,9 @@ public: * resolves to "yes" or "no" to provide a definitive result, * at the cost of doing more work in those cases. * - * This works for all normalization modes, - * but it is currently optimized for UTF-8 only for "compose" modes, - * such as for NFC, NFKC, and NFKC_Casefold - * (UNORM2_COMPOSE and UNORM2_COMPOSE_CONTIGUOUS). - * For other modes it currently converts to UTF-16 and calls isNormalized(). + * This works for all normalization modes. + * It is optimized for UTF-8 for all built-in modes except for FCD. + * The base class implementation converts to UTF-16 and calls isNormalized(). * * @param s UTF-8 input string * @param errorCode Standard ICU error code. Its input value must @@ -543,10 +539,8 @@ public: * Normalizes a UTF-8 string and optionally records how source substrings * relate to changed and unchanged result substrings. * - * Currently implemented completely only for "compose" modes, - * such as for NFC, NFKC, and NFKC_Casefold - * (UNORM2_COMPOSE and UNORM2_COMPOSE_CONTIGUOUS). - * Otherwise currently converts to & from UTF-16 and does not support edits. + * Implemented completely for most built-in modes except for FCD. + * The base class implementation converts to & from UTF-16 and does not support edits. * * @param options Options bit set, usually 0. See U_OMIT_UNCHANGED_TEXT and U_EDITS_NO_RESET. * @param src Source UTF-8 string. @@ -676,11 +670,9 @@ public: * resolves to "yes" or "no" to provide a definitive result, * at the cost of doing more work in those cases. * - * This works for all normalization modes, - * but it is currently optimized for UTF-8 only for "compose" modes, - * such as for NFC, NFKC, and NFKC_Casefold - * (UNORM2_COMPOSE and UNORM2_COMPOSE_CONTIGUOUS). - * For other modes it currently converts to UTF-16 and calls isNormalized(). + * This works for all normalization modes. + * It is optimized for UTF-8 for all built-in modes except for FCD. + * The base class implementation converts to UTF-16 and calls isNormalized(). * * @param s UTF-8 input string * @param errorCode Standard ICU error code. Its input value must diff --git a/thirdparty/icu4c/common/unicode/platform.h b/thirdparty/icu4c/common/unicode/platform.h index 2bb2f8b318..cb3a833fef 100644 --- a/thirdparty/icu4c/common/unicode/platform.h +++ b/thirdparty/icu4c/common/unicode/platform.h @@ -880,6 +880,6 @@ namespace std { #else # define U_CALLCONV_FPTR #endif -/* @} */ +/** @} */ #endif // _PLATFORM_H diff --git a/thirdparty/icu4c/common/unicode/stringpiece.h b/thirdparty/icu4c/common/unicode/stringpiece.h index 7d7d871e1f..8c96789e73 100644 --- a/thirdparty/icu4c/common/unicode/stringpiece.h +++ b/thirdparty/icu4c/common/unicode/stringpiece.h @@ -75,12 +75,11 @@ class U_COMMON_API StringPiece : public UMemory { * @stable ICU 4.2 */ StringPiece(const char* str); -#ifndef U_HIDE_DRAFT_API #if defined(__cpp_char8_t) || defined(U_IN_DOXYGEN) /** * Constructs from a NUL-terminated const char8_t * pointer. * @param str a NUL-terminated const char8_t * pointer - * @draft ICU 67 + * @stable ICU 67 */ StringPiece(const char8_t* str) : StringPiece(reinterpret_cast(str)) {} #endif @@ -88,10 +87,9 @@ class U_COMMON_API StringPiece : public UMemory { * Constructs an empty StringPiece. * Needed for type disambiguation from multiple other overloads. * @param p nullptr - * @draft ICU 67 + * @stable ICU 67 */ StringPiece(std::nullptr_t p) : ptr_(p), length_(0) {} -#endif // U_HIDE_DRAFT_API /** * Constructs from a std::string. @@ -99,17 +97,15 @@ class U_COMMON_API StringPiece : public UMemory { */ StringPiece(const std::string& str) : ptr_(str.data()), length_(static_cast(str.size())) { } -#ifndef U_HIDE_DRAFT_API #if defined(__cpp_lib_char8_t) || defined(U_IN_DOXYGEN) /** * Constructs from a std::u8string. - * @draft ICU 67 + * @stable ICU 67 */ StringPiece(const std::u8string& str) : ptr_(reinterpret_cast(str.data())), length_(static_cast(str.size())) { } #endif -#endif // U_HIDE_DRAFT_API /** * Constructs from some other implementation of a string piece class, from any @@ -152,18 +148,16 @@ class U_COMMON_API StringPiece : public UMemory { * @stable ICU 4.2 */ StringPiece(const char* offset, int32_t len) : ptr_(offset), length_(len) { } -#ifndef U_HIDE_DRAFT_API #if defined(__cpp_char8_t) || defined(U_IN_DOXYGEN) /** * Constructs from a const char8_t * pointer and a specified length. * @param str a const char8_t * pointer (need not be terminated) * @param len the length of the string; must be non-negative - * @draft ICU 67 + * @stable ICU 67 */ StringPiece(const char8_t* str, int32_t len) : StringPiece(reinterpret_cast(str), len) {} #endif -#endif // U_HIDE_DRAFT_API /** * Substring of another StringPiece. @@ -233,13 +227,12 @@ class U_COMMON_API StringPiece : public UMemory { */ void set(const char* str); -#ifndef U_HIDE_DRAFT_API #if defined(__cpp_char8_t) || defined(U_IN_DOXYGEN) /** * Resets the stringpiece to refer to new data. * @param xdata pointer the new string data. Need not be NUL-terminated. * @param len the length of the new data - * @draft ICU 67 + * @stable ICU 67 */ inline void set(const char8_t* xdata, int32_t len) { set(reinterpret_cast(xdata), len); @@ -248,13 +241,12 @@ class U_COMMON_API StringPiece : public UMemory { /** * Resets the stringpiece to refer to new data. * @param str a pointer to a NUL-terminated string. - * @draft ICU 67 + * @stable ICU 67 */ inline void set(const char8_t* str) { set(reinterpret_cast(str)); } #endif -#endif // U_HIDE_DRAFT_API /** * Removes the first n string units. @@ -286,13 +278,12 @@ class U_COMMON_API StringPiece : public UMemory { } } -#ifndef U_HIDE_DRAFT_API /** * Searches the StringPiece for the given search string (needle); * @param needle The string for which to search. * @param offset Where to start searching within this string (haystack). * @return The offset of needle in haystack, or -1 if not found. - * @draft ICU 67 + * @stable ICU 67 */ int32_t find(StringPiece needle, int32_t offset); @@ -301,10 +292,9 @@ class U_COMMON_API StringPiece : public UMemory { * similar to std::string::compare(). * @param other The string to compare to. * @return below zero if this < other; above zero if this > other; 0 if this == other. - * @draft ICU 67 + * @stable ICU 67 */ int32_t compare(StringPiece other); -#endif // U_HIDE_DRAFT_API /** * Maximum integer, used as a default value for substring methods. diff --git a/thirdparty/icu4c/common/unicode/ubrk.h b/thirdparty/icu4c/common/unicode/ubrk.h index 37189a8598..1249b0b160 100644 --- a/thirdparty/icu4c/common/unicode/ubrk.h +++ b/thirdparty/icu4c/common/unicode/ubrk.h @@ -296,6 +296,8 @@ ubrk_openBinaryRules(const uint8_t *binaryRules, int32_t rulesLength, const UChar * text, int32_t textLength, UErrorCode * status); +#ifndef U_HIDE_DEPRECATED_API + /** * Thread safe cloning operation * @param bi iterator to be cloned @@ -312,7 +314,7 @@ ubrk_openBinaryRules(const uint8_t *binaryRules, int32_t rulesLength, * @param status to indicate whether the operation went on smoothly or there were errors * An informational status value, U_SAFECLONE_ALLOCATED_ERROR, is used if any allocations were necessary. * @return pointer to the new clone - * @stable ICU 2.0 + * @deprecated ICU 69 Use ubrk_clone() instead. */ U_CAPI UBreakIterator * U_EXPORT2 ubrk_safeClone( @@ -321,6 +323,23 @@ ubrk_safeClone( int32_t *pBufferSize, UErrorCode *status); +#endif /* U_HIDE_DEPRECATED_API */ + +#ifndef U_HIDE_DRAFT_API + +/** + * Thread safe cloning operation. + * @param bi iterator to be cloned + * @param status to indicate whether the operation went on smoothly or there were errors + * @return pointer to the new clone + * @draft ICU 69 + */ +U_CAPI UBreakIterator * U_EXPORT2 +ubrk_clone(const UBreakIterator *bi, + UErrorCode *status); + +#endif // U_HIDE_DRAFT_API + #ifndef U_HIDE_DEPRECATED_API /** diff --git a/thirdparty/icu4c/common/unicode/ucnv.h b/thirdparty/icu4c/common/unicode/ucnv.h index 58f271cfb5..5d784990f2 100644 --- a/thirdparty/icu4c/common/unicode/ucnv.h +++ b/thirdparty/icu4c/common/unicode/ucnv.h @@ -1699,10 +1699,10 @@ ucnv_countAvailable(void); /** * Gets the canonical converter name of the specified converter from a list of - * all available converters contaied in the alias file. All converters + * all available converters contained in the alias file. All converters * in this list can be opened. * - * @param n the index to a converter available on the system (in the range [0..ucnv_countAvaiable()]) + * @param n the index to a converter available on the system (in the range [0..ucnv_countAvailable()]) * @return a pointer a string (library owned), or NULL if the index is out of bounds. * @see ucnv_countAvailable * @stable ICU 2.0 diff --git a/thirdparty/icu4c/common/unicode/ucnvsel.h b/thirdparty/icu4c/common/unicode/ucnvsel.h index 5e0a71cf35..3d7d3327f7 100644 --- a/thirdparty/icu4c/common/unicode/ucnvsel.h +++ b/thirdparty/icu4c/common/unicode/ucnvsel.h @@ -45,11 +45,11 @@ * from the serialized form. */ +struct UConverterSelector; /** * @{ - * The selector data structure + * Typedef for selector data structure. */ -struct UConverterSelector; typedef struct UConverterSelector UConverterSelector; /** @} */ diff --git a/thirdparty/icu4c/common/unicode/unifilt.h b/thirdparty/icu4c/common/unicode/unifilt.h index 420e1a1905..7870b55939 100644 --- a/thirdparty/icu4c/common/unicode/unifilt.h +++ b/thirdparty/icu4c/common/unicode/unifilt.h @@ -40,8 +40,8 @@ U_NAMESPACE_BEGIN * * UnicodeFilter defines a protocol for selecting a * subset of the full range (U+0000 to U+10FFFF) of Unicode characters. - * Currently, filters are used in conjunction with classes like {@link - * Transliterator} to only process selected characters through a + * Currently, filters are used in conjunction with classes like + * {@link Transliterator} to only process selected characters through a * transformation. * *

Note: UnicodeFilter currently stubs out two pure virtual methods diff --git a/thirdparty/icu4c/common/unicode/uniset.h b/thirdparty/icu4c/common/unicode/uniset.h index 50b6360f3a..8403c4026c 100644 --- a/thirdparty/icu4c/common/unicode/uniset.h +++ b/thirdparty/icu4c/common/unicode/uniset.h @@ -178,8 +178,6 @@ class RuleCharacterIterator; * Unicode property * * - *

Warning: you cannot add an empty string ("") to a UnicodeSet.

- * *

Formal syntax

* * \htmlonly
\endhtmlonly @@ -601,7 +599,7 @@ public: /** * Make this object represent the range `start - end`. - * If `end > start` then this object is set to an empty range. + * If `start > end` then this object is set to an empty range. * A frozen set will not be modified. * * @param start first character in the set, inclusive @@ -1077,7 +1075,7 @@ public: /** * Adds the specified range to this set if it is not already * present. If this set already contains the specified range, - * the call leaves this set unchanged. If end > start + * the call leaves this set unchanged. If start > end * then an empty range is added, leaving the set unchanged. * This is equivalent to a boolean logic OR, or a set UNION. * A frozen set will not be modified. @@ -1095,6 +1093,9 @@ public: * present. If this set already contains the specified character, * the call leaves this set unchanged. * A frozen set will not be modified. + * + * @param c the character (code point) + * @return this object, for chaining * @stable ICU 2.0 */ UnicodeSet& add(UChar32 c); @@ -1104,8 +1105,8 @@ public: * present. If this set already contains the multicharacter, * the call leaves this set unchanged. * Thus "ch" => {"ch"} - *
Warning: you cannot add an empty string ("") to a UnicodeSet. * A frozen set will not be modified. + * * @param s the source string * @return this object, for chaining * @stable ICU 2.4 @@ -1124,8 +1125,8 @@ public: public: /** - * Adds each of the characters in this string to the set. Thus "ch" => {"c", "h"} - * If this set already any particular character, it has no effect on that character. + * Adds each of the characters in this string to the set. Note: "ch" => {"c", "h"} + * If this set already contains any particular character, it has no effect on that character. * A frozen set will not be modified. * @param s the source string * @return this object, for chaining @@ -1135,7 +1136,6 @@ public: /** * Retains EACH of the characters in this string. Note: "ch" == {"c", "h"} - * If this set already any particular character, it has no effect on that character. * A frozen set will not be modified. * @param s the source string * @return this object, for chaining @@ -1145,7 +1145,6 @@ public: /** * Complement EACH of the characters in this string. Note: "ch" == {"c", "h"} - * If this set already any particular character, it has no effect on that character. * A frozen set will not be modified. * @param s the source string * @return this object, for chaining @@ -1155,7 +1154,6 @@ public: /** * Remove EACH of the characters in this string. Note: "ch" == {"c", "h"} - * If this set already any particular character, it has no effect on that character. * A frozen set will not be modified. * @param s the source string * @return this object, for chaining @@ -1165,7 +1163,7 @@ public: /** * Makes a set from a multicharacter string. Thus "ch" => {"ch"} - *
Warning: you cannot add an empty string ("") to a UnicodeSet. + * * @param s the source string * @return a newly created set containing the given string. * The caller owns the return object and is responsible for deleting it. @@ -1185,15 +1183,13 @@ public: /** * Retain only the elements in this set that are contained in the - * specified range. If end > start then an empty range is + * specified range. If start > end then an empty range is * retained, leaving the set empty. This is equivalent to * a boolean logic AND, or a set INTERSECTION. * A frozen set will not be modified. * - * @param start first character, inclusive, of range to be retained - * to this set. - * @param end last character, inclusive, of range to be retained - * to this set. + * @param start first character, inclusive, of range + * @param end last character, inclusive, of range * @stable ICU 2.0 */ virtual UnicodeSet& retain(UChar32 start, UChar32 end); @@ -1202,14 +1198,31 @@ public: /** * Retain the specified character from this set if it is present. * A frozen set will not be modified. + * + * @param c the character (code point) + * @return this object, for chaining * @stable ICU 2.0 */ UnicodeSet& retain(UChar32 c); +#ifndef U_HIDE_DRAFT_API + /** + * Retains only the specified string from this set if it is present. + * Upon return this set will be empty if it did not contain s, or + * will only contain s if it did contain s. + * A frozen set will not be modified. + * + * @param s the source string + * @return this object, for chaining + * @draft ICU 69 + */ + UnicodeSet& retain(const UnicodeString &s); +#endif // U_HIDE_DRAFT_API + /** * Removes the specified range from this set if it is present. * The set will not contain the specified range once the call - * returns. If end > start then an empty range is + * returns. If start > end then an empty range is * removed, leaving the set unchanged. * A frozen set will not be modified. * @@ -1226,6 +1239,9 @@ public: * The set will not contain the specified range once the call * returns. * A frozen set will not be modified. + * + * @param c the character (code point) + * @return this object, for chaining * @stable ICU 2.0 */ UnicodeSet& remove(UChar32 c); @@ -1253,15 +1269,13 @@ public: /** * Complements the specified range in this set. Any character in * the range will be removed if it is in this set, or will be - * added if it is not in this set. If end > start + * added if it is not in this set. If start > end * then an empty range is complemented, leaving the set unchanged. * This is equivalent to a boolean logic XOR. * A frozen set will not be modified. * - * @param start first character, inclusive, of range to be removed - * from this set. - * @param end last character, inclusive, of range to be removed - * from this set. + * @param start first character, inclusive, of range + * @param end last character, inclusive, of range * @stable ICU 2.0 */ virtual UnicodeSet& complement(UChar32 start, UChar32 end); @@ -1271,16 +1285,18 @@ public: * will be removed if it is in this set, or will be added if it is * not in this set. * A frozen set will not be modified. + * + * @param c the character (code point) + * @return this object, for chaining * @stable ICU 2.0 */ UnicodeSet& complement(UChar32 c); /** * Complement the specified string in this set. - * The set will not contain the specified string once the call - * returns. - *
Warning: you cannot add an empty string ("") to a UnicodeSet. + * The string will be removed if it is in this set, or will be added if it is not in this set. * A frozen set will not be modified. + * * @param s the string to complement * @return this object, for chaining * @stable ICU 2.4 diff --git a/thirdparty/icu4c/common/unicode/unistr.h b/thirdparty/icu4c/common/unicode/unistr.h index 456389f265..85bd964951 100644 --- a/thirdparty/icu4c/common/unicode/unistr.h +++ b/thirdparty/icu4c/common/unicode/unistr.h @@ -44,9 +44,10 @@ struct UConverter; // unicode/ucnv.h #ifndef USTRING_H /** * \ingroup ustring_ustrlen + * @param s Pointer to sequence of UChars. + * @return Length of sequence. */ -U_CAPI int32_t U_EXPORT2 -u_strlen(const UChar *s); +U_CAPI int32_t U_EXPORT2 u_strlen(const UChar *s); #endif U_NAMESPACE_BEGIN @@ -2766,7 +2767,6 @@ public: * @param options Options bit set, usually 0. See U_TITLECASE_NO_LOWERCASE, * U_TITLECASE_NO_BREAK_ADJUSTMENT, U_TITLECASE_ADJUST_TO_CASED, * U_TITLECASE_WHOLE_STRING, U_TITLECASE_SENTENCES. - * @param options Options bit set, see ucasemap_open(). * @return A reference to this. * @stable ICU 3.8 */ @@ -3614,7 +3614,7 @@ private: // turn a bogus string into an empty one void unBogus(); - // implements assigment operator, copy constructor, and fastCopyFrom() + // implements assignment operator, copy constructor, and fastCopyFrom() UnicodeString ©From(const UnicodeString &src, UBool fastCopy=false); // Copies just the fields without memory management. diff --git a/thirdparty/icu4c/common/unicode/urename.h b/thirdparty/icu4c/common/unicode/urename.h index fe59fdd893..737f4b308e 100644 --- a/thirdparty/icu4c/common/unicode/urename.h +++ b/thirdparty/icu4c/common/unicode/urename.h @@ -482,6 +482,7 @@ #define ubiditransform_open U_ICU_ENTRY_POINT_RENAME(ubiditransform_open) #define ubiditransform_transform U_ICU_ENTRY_POINT_RENAME(ubiditransform_transform) #define ublock_getCode U_ICU_ENTRY_POINT_RENAME(ublock_getCode) +#define ubrk_clone U_ICU_ENTRY_POINT_RENAME(ubrk_clone) #define ubrk_close U_ICU_ENTRY_POINT_RENAME(ubrk_close) #define ubrk_countAvailable U_ICU_ENTRY_POINT_RENAME(ubrk_countAvailable) #define ubrk_current U_ICU_ENTRY_POINT_RENAME(ubrk_current) @@ -534,6 +535,7 @@ #define ucal_getTimeZoneDisplayName U_ICU_ENTRY_POINT_RENAME(ucal_getTimeZoneDisplayName) #define ucal_getTimeZoneID U_ICU_ENTRY_POINT_RENAME(ucal_getTimeZoneID) #define ucal_getTimeZoneIDForWindowsID U_ICU_ENTRY_POINT_RENAME(ucal_getTimeZoneIDForWindowsID) +#define ucal_getTimeZoneOffsetFromLocal U_ICU_ENTRY_POINT_RENAME(ucal_getTimeZoneOffsetFromLocal) #define ucal_getTimeZoneTransitionDate U_ICU_ENTRY_POINT_RENAME(ucal_getTimeZoneTransitionDate) #define ucal_getType U_ICU_ENTRY_POINT_RENAME(ucal_getType) #define ucal_getWeekendTransition U_ICU_ENTRY_POINT_RENAME(ucal_getWeekendTransition) @@ -962,6 +964,7 @@ #define uhash_compareScriptSet U_ICU_ENTRY_POINT_RENAME(uhash_compareScriptSet) #define uhash_compareUChars U_ICU_ENTRY_POINT_RENAME(uhash_compareUChars) #define uhash_compareUnicodeString U_ICU_ENTRY_POINT_RENAME(uhash_compareUnicodeString) +#define uhash_containsKey U_ICU_ENTRY_POINT_RENAME(uhash_containsKey) #define uhash_count U_ICU_ENTRY_POINT_RENAME(uhash_count) #define uhash_deleteHashtable U_ICU_ENTRY_POINT_RENAME(uhash_deleteHashtable) #define uhash_deleteScriptSet U_ICU_ENTRY_POINT_RENAME(uhash_deleteScriptSet) @@ -970,6 +973,7 @@ #define uhash_find U_ICU_ENTRY_POINT_RENAME(uhash_find) #define uhash_get U_ICU_ENTRY_POINT_RENAME(uhash_get) #define uhash_geti U_ICU_ENTRY_POINT_RENAME(uhash_geti) +#define uhash_getiAndFound U_ICU_ENTRY_POINT_RENAME(uhash_getiAndFound) #define uhash_hashCaselessUnicodeString U_ICU_ENTRY_POINT_RENAME(uhash_hashCaselessUnicodeString) #define uhash_hashChars U_ICU_ENTRY_POINT_RENAME(uhash_hashChars) #define uhash_hashIChars U_ICU_ENTRY_POINT_RENAME(uhash_hashIChars) @@ -977,12 +981,15 @@ #define uhash_hashScriptSet U_ICU_ENTRY_POINT_RENAME(uhash_hashScriptSet) #define uhash_hashUChars U_ICU_ENTRY_POINT_RENAME(uhash_hashUChars) #define uhash_hashUnicodeString U_ICU_ENTRY_POINT_RENAME(uhash_hashUnicodeString) +#define uhash_icontainsKey U_ICU_ENTRY_POINT_RENAME(uhash_icontainsKey) #define uhash_iget U_ICU_ENTRY_POINT_RENAME(uhash_iget) #define uhash_igeti U_ICU_ENTRY_POINT_RENAME(uhash_igeti) +#define uhash_igetiAndFound U_ICU_ENTRY_POINT_RENAME(uhash_igetiAndFound) #define uhash_init U_ICU_ENTRY_POINT_RENAME(uhash_init) #define uhash_initSize U_ICU_ENTRY_POINT_RENAME(uhash_initSize) #define uhash_iput U_ICU_ENTRY_POINT_RENAME(uhash_iput) #define uhash_iputi U_ICU_ENTRY_POINT_RENAME(uhash_iputi) +#define uhash_iputiAllowZero U_ICU_ENTRY_POINT_RENAME(uhash_iputiAllowZero) #define uhash_iremove U_ICU_ENTRY_POINT_RENAME(uhash_iremove) #define uhash_iremovei U_ICU_ENTRY_POINT_RENAME(uhash_iremovei) #define uhash_nextElement U_ICU_ENTRY_POINT_RENAME(uhash_nextElement) @@ -990,6 +997,7 @@ #define uhash_openSize U_ICU_ENTRY_POINT_RENAME(uhash_openSize) #define uhash_put U_ICU_ENTRY_POINT_RENAME(uhash_put) #define uhash_puti U_ICU_ENTRY_POINT_RENAME(uhash_puti) +#define uhash_putiAllowZero U_ICU_ENTRY_POINT_RENAME(uhash_putiAllowZero) #define uhash_remove U_ICU_ENTRY_POINT_RENAME(uhash_remove) #define uhash_removeAll U_ICU_ENTRY_POINT_RENAME(uhash_removeAll) #define uhash_removeElement U_ICU_ENTRY_POINT_RENAME(uhash_removeElement) @@ -1150,6 +1158,8 @@ #define ultag_isUnicodeLocaleKey U_ICU_ENTRY_POINT_RENAME(ultag_isUnicodeLocaleKey) #define ultag_isUnicodeLocaleType U_ICU_ENTRY_POINT_RENAME(ultag_isUnicodeLocaleType) #define ultag_isVariantSubtags U_ICU_ENTRY_POINT_RENAME(ultag_isVariantSubtags) +#define umeas_getPrefixBase U_ICU_ENTRY_POINT_RENAME(umeas_getPrefixBase) +#define umeas_getPrefixPower U_ICU_ENTRY_POINT_RENAME(umeas_getPrefixPower) #define umsg_applyPattern U_ICU_ENTRY_POINT_RENAME(umsg_applyPattern) #define umsg_autoQuoteApostrophe U_ICU_ENTRY_POINT_RENAME(umsg_autoQuoteApostrophe) #define umsg_clone U_ICU_ENTRY_POINT_RENAME(umsg_clone) @@ -1672,6 +1682,9 @@ #define uset_compact U_ICU_ENTRY_POINT_RENAME(uset_compact) #define uset_complement U_ICU_ENTRY_POINT_RENAME(uset_complement) #define uset_complementAll U_ICU_ENTRY_POINT_RENAME(uset_complementAll) +#define uset_complementAllCodePoints U_ICU_ENTRY_POINT_RENAME(uset_complementAllCodePoints) +#define uset_complementRange U_ICU_ENTRY_POINT_RENAME(uset_complementRange) +#define uset_complementString U_ICU_ENTRY_POINT_RENAME(uset_complementString) #define uset_contains U_ICU_ENTRY_POINT_RENAME(uset_contains) #define uset_containsAll U_ICU_ENTRY_POINT_RENAME(uset_containsAll) #define uset_containsAllCodePoints U_ICU_ENTRY_POINT_RENAME(uset_containsAllCodePoints) @@ -1695,12 +1708,15 @@ #define uset_openPatternOptions U_ICU_ENTRY_POINT_RENAME(uset_openPatternOptions) #define uset_remove U_ICU_ENTRY_POINT_RENAME(uset_remove) #define uset_removeAll U_ICU_ENTRY_POINT_RENAME(uset_removeAll) +#define uset_removeAllCodePoints U_ICU_ENTRY_POINT_RENAME(uset_removeAllCodePoints) #define uset_removeAllStrings U_ICU_ENTRY_POINT_RENAME(uset_removeAllStrings) #define uset_removeRange U_ICU_ENTRY_POINT_RENAME(uset_removeRange) #define uset_removeString U_ICU_ENTRY_POINT_RENAME(uset_removeString) #define uset_resemblesPattern U_ICU_ENTRY_POINT_RENAME(uset_resemblesPattern) #define uset_retain U_ICU_ENTRY_POINT_RENAME(uset_retain) #define uset_retainAll U_ICU_ENTRY_POINT_RENAME(uset_retainAll) +#define uset_retainAllCodePoints U_ICU_ENTRY_POINT_RENAME(uset_retainAllCodePoints) +#define uset_retainString U_ICU_ENTRY_POINT_RENAME(uset_retainString) #define uset_serialize U_ICU_ENTRY_POINT_RENAME(uset_serialize) #define uset_serializedContains U_ICU_ENTRY_POINT_RENAME(uset_serializedContains) #define uset_set U_ICU_ENTRY_POINT_RENAME(uset_set) diff --git a/thirdparty/icu4c/common/unicode/uset.h b/thirdparty/icu4c/common/unicode/uset.h index 502ea8dc14..1d0daf9d09 100644 --- a/thirdparty/icu4c/common/unicode/uset.h +++ b/thirdparty/icu4c/common/unicode/uset.h @@ -582,8 +582,8 @@ U_CAPI void U_EXPORT2 uset_addString(USet* set, const UChar* str, int32_t strLen); /** - * Adds each of the characters in this string to the set. Thus "ch" => {"c", "h"} - * If this set already any particular character, it has no effect on that character. + * Adds each of the characters in this string to the set. Note: "ch" => {"c", "h"} + * If this set already contains any particular character, it has no effect on that character. * A frozen set will not be modified. * @param set the object to which to add the character * @param str the source string @@ -628,6 +628,20 @@ uset_removeRange(USet* set, UChar32 start, UChar32 end); U_CAPI void U_EXPORT2 uset_removeString(USet* set, const UChar* str, int32_t strLen); +#ifndef U_HIDE_DRAFT_API +/** + * Removes EACH of the characters in this string. Note: "ch" == {"c", "h"} + * A frozen set will not be modified. + * + * @param set the object to be modified + * @param str the string + * @param length the length of the string, or -1 if NUL-terminated + * @draft ICU 69 + */ +U_CAPI void U_EXPORT2 +uset_removeAllCodePoints(USet *set, const UChar *str, int32_t length); +#endif // U_HIDE_DRAFT_API + /** * Removes from this set all of its elements that are contained in the * specified set. This operation effectively modifies this @@ -650,15 +664,41 @@ uset_removeAll(USet* set, const USet* removeSet); * A frozen set will not be modified. * * @param set the object for which to retain only the specified range - * @param start first character, inclusive, of range to be retained - * to this set. - * @param end last character, inclusive, of range to be retained - * to this set. + * @param start first character, inclusive, of range + * @param end last character, inclusive, of range * @stable ICU 3.2 */ U_CAPI void U_EXPORT2 uset_retain(USet* set, UChar32 start, UChar32 end); +#ifndef U_HIDE_DRAFT_API +/** + * Retains only the specified string from this set if it is present. + * Upon return this set will be empty if it did not contain s, or + * will only contain s if it did contain s. + * A frozen set will not be modified. + * + * @param set the object to be modified + * @param str the string + * @param length the length of the string, or -1 if NUL-terminated + * @draft ICU 69 + */ +U_CAPI void U_EXPORT2 +uset_retainString(USet *set, const UChar *str, int32_t length); + +/** + * Retains EACH of the characters in this string. Note: "ch" == {"c", "h"} + * A frozen set will not be modified. + * + * @param set the object to be modified + * @param str the string + * @param length the length of the string, or -1 if NUL-terminated + * @draft ICU 69 + */ +U_CAPI void U_EXPORT2 +uset_retainAllCodePoints(USet *set, const UChar *str, int32_t length); +#endif // U_HIDE_DRAFT_API + /** * Retains only the elements in this set that are contained in the * specified set. In other words, removes from this set all of @@ -696,6 +736,49 @@ uset_compact(USet* set); U_CAPI void U_EXPORT2 uset_complement(USet* set); +#ifndef U_HIDE_DRAFT_API +/** + * Complements the specified range in this set. Any character in + * the range will be removed if it is in this set, or will be + * added if it is not in this set. If start > end + * then an empty range is complemented, leaving the set unchanged. + * This is equivalent to a boolean logic XOR. + * A frozen set will not be modified. + * + * @param set the object to be modified + * @param start first character, inclusive, of range + * @param end last character, inclusive, of range + * @draft ICU 69 + */ +U_CAPI void U_EXPORT2 +uset_complementRange(USet *set, UChar32 start, UChar32 end); + +/** + * Complements the specified string in this set. + * The string will be removed if it is in this set, or will be added if it is not in this set. + * A frozen set will not be modified. + * + * @param set the object to be modified + * @param str the string + * @param length the length of the string, or -1 if NUL-terminated + * @draft ICU 69 + */ +U_CAPI void U_EXPORT2 +uset_complementString(USet *set, const UChar *str, int32_t length); + +/** + * Complements EACH of the characters in this string. Note: "ch" == {"c", "h"} + * A frozen set will not be modified. + * + * @param set the object to be modified + * @param str the string + * @param length the length of the string, or -1 if NUL-terminated + * @draft ICU 69 + */ +U_CAPI void U_EXPORT2 +uset_complementAllCodePoints(USet *set, const UChar *str, int32_t length); +#endif // U_HIDE_DRAFT_API + /** * Complements in this set all elements contained in the specified * set. Any character in the other set will be removed if it is diff --git a/thirdparty/icu4c/common/unicode/ushape.h b/thirdparty/icu4c/common/unicode/ushape.h index fed4869abd..14371edc8f 100644 --- a/thirdparty/icu4c/common/unicode/ushape.h +++ b/thirdparty/icu4c/common/unicode/ushape.h @@ -323,7 +323,7 @@ u_shapeArabic(const UChar *source, int32_t sourceLength, #define U_SHAPE_PRESERVE_PRESENTATION 0x8000 /** Presentation form option: * Replace Arabic Presentation Forms-A and Arabic Presentationo Forms-B with - * their unshaped correspondants in range 0+06xx, before shaping. + * their unshaped correspondents in range 0+06xx, before shaping. * @stable ICU 3.6 */ #define U_SHAPE_PRESERVE_PRESENTATION_NOOP 0 diff --git a/thirdparty/icu4c/common/unicode/utrace.h b/thirdparty/icu4c/common/unicode/utrace.h index 28c313c582..677486f473 100644 --- a/thirdparty/icu4c/common/unicode/utrace.h +++ b/thirdparty/icu4c/common/unicode/utrace.h @@ -173,24 +173,23 @@ typedef enum UTraceFunctionNumber { UTRACE_RES_DATA_LIMIT, #endif // U_HIDE_INTERNAL_API -#ifndef U_HIDE_DRAFT_API /** * The lowest break iterator location. - * @draft ICU 67 + * @stable ICU 67 */ UTRACE_UBRK_START=0x4000, /** * Indicates that a character instance of break iterator was created. * - * @draft ICU 67 + * @stable ICU 67 */ UTRACE_UBRK_CREATE_CHARACTER = UTRACE_UBRK_START, /** * Indicates that a word instance of break iterator was created. * - * @draft ICU 67 + * @stable ICU 67 */ UTRACE_UBRK_CREATE_WORD, @@ -200,21 +199,21 @@ typedef enum UTraceFunctionNumber { * Provides one C-style string to UTraceData: the lb value ("", * "loose", "strict", or "normal"). * - * @draft ICU 67 + * @stable ICU 67 */ UTRACE_UBRK_CREATE_LINE, /** * Indicates that a sentence instance of break iterator was created. * - * @draft ICU 67 + * @stable ICU 67 */ UTRACE_UBRK_CREATE_SENTENCE, /** * Indicates that a title instance of break iterator was created. * - * @draft ICU 67 + * @stable ICU 67 */ UTRACE_UBRK_CREATE_TITLE, @@ -224,12 +223,10 @@ typedef enum UTraceFunctionNumber { * Provides one C-style string to UTraceData: the script code of what * the break engine cover ("Hani", "Khmr", "Laoo", "Mymr", or "Thai"). * - * @draft ICU 67 + * @stable ICU 67 */ UTRACE_UBRK_CREATE_BREAK_ENGINE, -#endif // U_HIDE_DRAFT_API - #ifndef U_HIDE_INTERNAL_API /** * One more than the highest normal break iterator trace location. diff --git a/thirdparty/icu4c/common/unicode/uvernum.h b/thirdparty/icu4c/common/unicode/uvernum.h index a46481a3fe..b09d4943c1 100644 --- a/thirdparty/icu4c/common/unicode/uvernum.h +++ b/thirdparty/icu4c/common/unicode/uvernum.h @@ -60,13 +60,13 @@ * This value will change in the subsequent releases of ICU * @stable ICU 2.4 */ -#define U_ICU_VERSION_MAJOR_NUM 68 +#define U_ICU_VERSION_MAJOR_NUM 69 /** The current ICU minor version as an integer. * This value will change in the subsequent releases of ICU * @stable ICU 2.6 */ -#define U_ICU_VERSION_MINOR_NUM 2 +#define U_ICU_VERSION_MINOR_NUM 1 /** The current ICU patchlevel version as an integer. * This value will change in the subsequent releases of ICU @@ -86,7 +86,7 @@ * This value will change in the subsequent releases of ICU * @stable ICU 2.6 */ -#define U_ICU_VERSION_SUFFIX _68 +#define U_ICU_VERSION_SUFFIX _69 /** * \def U_DEF2_ICU_ENTRY_POINT_RENAME @@ -139,7 +139,7 @@ * This value will change in the subsequent releases of ICU * @stable ICU 2.4 */ -#define U_ICU_VERSION "68.2" +#define U_ICU_VERSION "69.1" /** * The current ICU library major version number as a string, for library name suffixes. @@ -152,13 +152,13 @@ * * @stable ICU 2.6 */ -#define U_ICU_VERSION_SHORT "68" +#define U_ICU_VERSION_SHORT "69" #ifndef U_HIDE_INTERNAL_API /** Data version in ICU4C. * @internal ICU 4.4 Internal Use Only **/ -#define U_ICU_DATA_VERSION "68.2" +#define U_ICU_DATA_VERSION "69.1" #endif /* U_HIDE_INTERNAL_API */ /*=========================================================================== diff --git a/thirdparty/icu4c/common/uniset.cpp b/thirdparty/icu4c/common/uniset.cpp index b73d612f24..461e5a7197 100644 --- a/thirdparty/icu4c/common/uniset.cpp +++ b/thirdparty/icu4c/common/uniset.cpp @@ -30,24 +30,6 @@ #include "bmpset.h" #include "unisetspan.h" -// Define UChar constants using hex for EBCDIC compatibility -// Used #define to reduce private static exports and memory access time. -#define SET_OPEN ((UChar)0x005B) /*[*/ -#define SET_CLOSE ((UChar)0x005D) /*]*/ -#define HYPHEN ((UChar)0x002D) /*-*/ -#define COMPLEMENT ((UChar)0x005E) /*^*/ -#define COLON ((UChar)0x003A) /*:*/ -#define BACKSLASH ((UChar)0x005C) /*\*/ -#define INTERSECTION ((UChar)0x0026) /*&*/ -#define UPPER_U ((UChar)0x0055) /*U*/ -#define LOWER_U ((UChar)0x0075) /*u*/ -#define OPEN_BRACE ((UChar)123) /*{*/ -#define CLOSE_BRACE ((UChar)125) /*}*/ -#define UPPER_P ((UChar)0x0050) /*P*/ -#define LOWER_P ((UChar)0x0070) /*p*/ -#define UPPER_N ((UChar)78) /*N*/ -#define EQUALS ((UChar)0x003D) /*=*/ - // HIGH_VALUE > all valid values. 110000 for codepoints #define UNICODESET_HIGH 0x0110000 @@ -444,7 +426,6 @@ UBool UnicodeSet::contains(UChar32 start, UChar32 end) const { * @return true if this set contains the specified string */ UBool UnicodeSet::contains(const UnicodeString& s) const { - if (s.length() == 0) return FALSE; int32_t cp = getSingleCP(s); if (cp < 0) { return stringsContains(s); @@ -559,11 +540,9 @@ UBool UnicodeSet::matchesIndexValue(uint8_t v) const { if (hasStrings()) { for (i=0; isize(); ++i) { const UnicodeString& s = *(const UnicodeString*)strings->elementAt(i); - //if (s.length() == 0) { - // // Empty strings match everything - // return TRUE; - //} - // assert(s.length() != 0); // We enforce this elsewhere + if (s.isEmpty()) { + continue; // skip the empty string + } UChar32 c = s.char32At(0); if ((c & 0xFF) == v) { return TRUE; @@ -582,9 +561,6 @@ UMatchDegree UnicodeSet::matches(const Replaceable& text, int32_t limit, UBool incremental) { if (offset == limit) { - // Strings, if any, have length != 0, so we don't worry - // about them here. If we ever allow zero-length strings - // we much check for them here. if (contains(U_ETHER)) { return incremental ? U_PARTIAL_MATCH : U_MATCH; } else { @@ -614,11 +590,9 @@ UMatchDegree UnicodeSet::matches(const Replaceable& text, for (i=0; isize(); ++i) { const UnicodeString& trial = *(const UnicodeString*)strings->elementAt(i); - - //if (trial.length() == 0) { - // return U_MATCH; // null-string always matches - //} - // assert(trial.length() != 0); // We ensure this elsewhere + if (trial.isEmpty()) { + continue; // skip the empty string + } UChar c = trial.charAt(forward ? 0 : trial.length() - 1); @@ -971,12 +945,12 @@ UnicodeSet& UnicodeSet::add(UChar32 c) { * present. If this set already contains the multicharacter, * the call leaves this set unchanged. * Thus "ch" => {"ch"} - *
Warning: you cannot add an empty string ("") to a UnicodeSet. + * * @param s the source string * @return the modified set, for chaining */ UnicodeSet& UnicodeSet::add(const UnicodeString& s) { - if (s.length() == 0 || isFrozen() || isBogus()) return *this; + if (isFrozen() || isBogus()) return *this; int32_t cp = getSingleCP(s); if (cp < 0) { if (!stringsContains(s)) { @@ -991,8 +965,7 @@ UnicodeSet& UnicodeSet::add(const UnicodeString& s) { /** * Adds the given string, in order, to 'strings'. The given string - * must have been checked by the caller to not be empty and to not - * already be in 'strings'. + * must have been checked by the caller to not already be in 'strings'. */ void UnicodeSet::_add(const UnicodeString& s) { if (isFrozen() || isBogus()) { @@ -1021,16 +994,13 @@ void UnicodeSet::_add(const UnicodeString& s) { * @param string to test */ int32_t UnicodeSet::getSingleCP(const UnicodeString& s) { - //if (s.length() < 1) { - // throw new IllegalArgumentException("Can't use zero-length strings in UnicodeSet"); - //} - if (s.length() > 2) return -1; - if (s.length() == 1) return s.charAt(0); - - // at this point, len = 2 - UChar32 cp = s.char32At(0); - if (cp > 0xFFFF) { // is surrogate pair - return cp; + int32_t sLength = s.length(); + if (sLength == 1) return s.charAt(0); + if (sLength == 2) { + UChar32 cp = s.char32At(0); + if (cp > 0xFFFF) { // is surrogate pair + return cp; + } } return -1; } @@ -1150,6 +1120,26 @@ UnicodeSet& UnicodeSet::retain(UChar32 c) { return retain(c, c); } +UnicodeSet& UnicodeSet::retain(const UnicodeString &s) { + if (isFrozen() || isBogus()) { return *this; } + UChar32 cp = getSingleCP(s); + if (cp < 0) { + bool isIn = stringsContains(s); + // Check for getRangeCount() first to avoid somewhat-expensive size() + // when there are single code points. + if (isIn && getRangeCount() == 0 && size() == 1) { + return *this; + } + clear(); + if (isIn) { + _add(s); + } + } else { + retain(cp, cp); + } + return *this; +} + /** * Removes the specified range from this set if it is present. * The set will not contain the specified range once the call @@ -1186,7 +1176,7 @@ UnicodeSet& UnicodeSet::remove(UChar32 c) { * @return the modified set, for chaining */ UnicodeSet& UnicodeSet::remove(const UnicodeString& s) { - if (s.length() == 0 || isFrozen() || isBogus()) return *this; + if (isFrozen() || isBogus()) return *this; int32_t cp = getSingleCP(s); if (cp < 0) { if (strings != nullptr && strings->removeElement((void*) &s)) { @@ -1252,12 +1242,12 @@ UnicodeSet& UnicodeSet::complement(void) { * Complement the specified string in this set. * The set will not contain the specified string once the call * returns. - *
Warning: you cannot add an empty string ("") to a UnicodeSet. + * * @param s the string to complement * @return this object, for chaining */ UnicodeSet& UnicodeSet::complement(const UnicodeString& s) { - if (s.length() == 0 || isFrozen() || isBogus()) return *this; + if (isFrozen() || isBogus()) return *this; int32_t cp = getSingleCP(s); if (cp < 0) { if (stringsContains(s)) { @@ -2001,22 +1991,22 @@ escapeUnprintable) { } // Okay to let ':' pass through switch (c) { - case SET_OPEN: - case SET_CLOSE: - case HYPHEN: - case COMPLEMENT: - case INTERSECTION: - case BACKSLASH: - case OPEN_BRACE: - case CLOSE_BRACE: - case COLON: + case u'[': + case u']': + case u'-': + case u'^': + case u'&': + case u'\\': + case u'{': + case u'}': + case u':': case SymbolTable::SYMBOL_REF: - buf.append(BACKSLASH); + buf.append(u'\\'); break; default: // Escape whitespace if (PatternProps::isWhiteSpace(c)) { - buf.append(BACKSLASH); + buf.append(u'\\'); } break; } @@ -2049,7 +2039,7 @@ UnicodeString& UnicodeSet::_toPattern(UnicodeString& result, backslashCount = 0; } else { result.append(c); - if (c == BACKSLASH) { + if (c == u'\\') { ++backslashCount; } else { backslashCount = 0; @@ -2082,13 +2072,13 @@ UnicodeString& UnicodeSet::toPattern(UnicodeString& result, UnicodeString& UnicodeSet::_generatePattern(UnicodeString& result, UBool escapeUnprintable) const { - result.append(SET_OPEN); + result.append(u'['); // // Check against the predefined categories. We implicitly build // // up ALL category sets the first time toPattern() is called. // for (int8_t cat=0; catsize(); ++i) { - result.append(OPEN_BRACE); + result.append(u'{'); _appendToPat(result, *(const UnicodeString*) strings->elementAt(i), escapeUnprintable); - result.append(CLOSE_BRACE); + result.append(u'}'); } } - return result.append(SET_CLOSE); + return result.append(u']'); } /** diff --git a/thirdparty/icu4c/common/uniset_props.cpp b/thirdparty/icu4c/common/uniset_props.cpp index 37277fcb75..8fde5abcdd 100644 --- a/thirdparty/icu4c/common/uniset_props.cpp +++ b/thirdparty/icu4c/common/uniset_props.cpp @@ -47,31 +47,6 @@ U_NAMESPACE_USE -// Define UChar constants using hex for EBCDIC compatibility -// Used #define to reduce private static exports and memory access time. -#define SET_OPEN ((UChar)0x005B) /*[*/ -#define SET_CLOSE ((UChar)0x005D) /*]*/ -#define HYPHEN ((UChar)0x002D) /*-*/ -#define COMPLEMENT ((UChar)0x005E) /*^*/ -#define COLON ((UChar)0x003A) /*:*/ -#define BACKSLASH ((UChar)0x005C) /*\*/ -#define INTERSECTION ((UChar)0x0026) /*&*/ -#define UPPER_U ((UChar)0x0055) /*U*/ -#define LOWER_U ((UChar)0x0075) /*u*/ -#define OPEN_BRACE ((UChar)123) /*{*/ -#define CLOSE_BRACE ((UChar)125) /*}*/ -#define UPPER_P ((UChar)0x0050) /*P*/ -#define LOWER_P ((UChar)0x0070) /*p*/ -#define UPPER_N ((UChar)78) /*N*/ -#define EQUALS ((UChar)0x003D) /*=*/ - -//static const UChar POSIX_OPEN[] = { SET_OPEN,COLON,0 }; // "[:" -static const UChar POSIX_CLOSE[] = { COLON,SET_CLOSE,0 }; // ":]" -//static const UChar PERL_OPEN[] = { BACKSLASH,LOWER_P,0 }; // "\\p" -//static const UChar PERL_CLOSE[] = { CLOSE_BRACE,0 }; // "}" -//static const UChar NAME_OPEN[] = { BACKSLASH,UPPER_N,0 }; // "\\N" -static const UChar HYPHEN_RIGHT_BRACE[] = {HYPHEN,SET_CLOSE,0}; /*-]*/ - // Special property set IDs static const char ANY[] = "ANY"; // [\u0000-\U0010FFFF] static const char ASCII[] = "ASCII"; // [\u0000-\u007F] @@ -81,12 +56,6 @@ static const char ASSIGNED[] = "Assigned"; // [:^Cn:] #define NAME_PROP "na" #define NAME_PROP_LENGTH 2 -/** - * Delimiter string used in patterns to close a category reference: - * ":]". Example: "[:Lu:]". - */ -//static const UChar CATEGORY_CLOSE[] = {COLON, SET_CLOSE, 0x0000}; /* ":]" */ - // Cached sets ------------------------------------------------------------- *** U_CDECL_BEGIN @@ -140,27 +109,27 @@ uniset_getUnicode32Instance(UErrorCode &errorCode) { static inline UBool isPerlOpen(const UnicodeString &pattern, int32_t pos) { UChar c; - return pattern.charAt(pos)==BACKSLASH && ((c=pattern.charAt(pos+1))==LOWER_P || c==UPPER_P); + return pattern.charAt(pos)==u'\\' && ((c=pattern.charAt(pos+1))==u'p' || c==u'P'); } /*static inline UBool isPerlClose(const UnicodeString &pattern, int32_t pos) { - return pattern.charAt(pos)==CLOSE_BRACE; + return pattern.charAt(pos)==u'}'; }*/ static inline UBool isNameOpen(const UnicodeString &pattern, int32_t pos) { - return pattern.charAt(pos)==BACKSLASH && pattern.charAt(pos+1)==UPPER_N; + return pattern.charAt(pos)==u'\\' && pattern.charAt(pos+1)==u'N'; } static inline UBool isPOSIXOpen(const UnicodeString &pattern, int32_t pos) { - return pattern.charAt(pos)==SET_OPEN && pattern.charAt(pos+1)==COLON; + return pattern.charAt(pos)==u'[' && pattern.charAt(pos+1)==u':'; } /*static inline UBool isPOSIXClose(const UnicodeString &pattern, int32_t pos) { - return pattern.charAt(pos)==COLON && pattern.charAt(pos+1)==SET_CLOSE; + return pattern.charAt(pos)==u':' && pattern.charAt(pos+1)==u']'; }*/ // TODO memory debugging provided inside uniset.cpp @@ -326,9 +295,8 @@ void UnicodeSet::applyPattern(RuleCharacterIterator& chars, while (mode != 2 && !chars.atEnd()) { U_ASSERT((lastItem == 0 && op == 0) || - (lastItem == 1 && (op == 0 || op == HYPHEN /*'-'*/)) || - (lastItem == 2 && (op == 0 || op == HYPHEN /*'-'*/ || - op == INTERSECTION /*'&'*/))); + (lastItem == 1 && (op == 0 || op == u'-')) || + (lastItem == 2 && (op == 0 || op == u'-' || op == u'&'))); UChar32 c = 0; UBool literal = FALSE; @@ -356,27 +324,27 @@ void UnicodeSet::applyPattern(RuleCharacterIterator& chars, c = chars.next(opts, literal, ec); if (U_FAILURE(ec)) return; - if (c == 0x5B /*'['*/ && !literal) { + if (c == u'[' && !literal) { if (mode == 1) { chars.setPos(backup); // backup setMode = 1; } else { // Handle opening '[' delimiter mode = 1; - patLocal.append((UChar) 0x5B /*'['*/); + patLocal.append(u'['); chars.getPos(backup); // prepare to backup c = chars.next(opts, literal, ec); if (U_FAILURE(ec)) return; - if (c == 0x5E /*'^'*/ && !literal) { + if (c == u'^' && !literal) { invert = TRUE; - patLocal.append((UChar) 0x5E /*'^'*/); + patLocal.append(u'^'); chars.getPos(backup); // prepare to backup c = chars.next(opts, literal, ec); if (U_FAILURE(ec)) return; } // Fall through to handle special leading '-'; // otherwise restart loop for nested [], \p{}, etc. - if (c == HYPHEN /*'-'*/) { + if (c == u'-') { literal = TRUE; // Fall through to handle literal '-' below } else { @@ -418,7 +386,7 @@ void UnicodeSet::applyPattern(RuleCharacterIterator& chars, op = 0; } - if (op == HYPHEN /*'-'*/ || op == INTERSECTION /*'&'*/) { + if (op == u'-' || op == u'&') { patLocal.append(op); } @@ -454,10 +422,10 @@ void UnicodeSet::applyPattern(RuleCharacterIterator& chars, } switch (op) { - case HYPHEN: /*'-'*/ + case u'-': removeAll(*nested); break; - case INTERSECTION: /*'&'*/ + case u'&': retainAll(*nested); break; case 0: @@ -483,24 +451,24 @@ void UnicodeSet::applyPattern(RuleCharacterIterator& chars, if (!literal) { switch (c) { - case 0x5D /*']'*/: + case u']': if (lastItem == 1) { add(lastChar, lastChar); _appendToPat(patLocal, lastChar, FALSE); } // Treat final trailing '-' as a literal - if (op == HYPHEN /*'-'*/) { + if (op == u'-') { add(op, op); patLocal.append(op); - } else if (op == INTERSECTION /*'&'*/) { + } else if (op == u'&') { // syntaxError(chars, "Trailing '&'"); ec = U_MALFORMED_SET; return; } - patLocal.append((UChar) 0x5D /*']'*/); + patLocal.append(u']'); mode = 2; continue; - case HYPHEN /*'-'*/: + case u'-': if (op == 0) { if (lastItem != 0) { op = (UChar) c; @@ -510,8 +478,8 @@ void UnicodeSet::applyPattern(RuleCharacterIterator& chars, add(c, c); c = chars.next(opts, literal, ec); if (U_FAILURE(ec)) return; - if (c == 0x5D /*']'*/ && !literal) { - patLocal.append(HYPHEN_RIGHT_BRACE, 2); + if (c == u']' && !literal) { + patLocal.append(u"-]", 2); mode = 2; continue; } @@ -520,7 +488,7 @@ void UnicodeSet::applyPattern(RuleCharacterIterator& chars, // syntaxError(chars, "'-' not after char or set"); ec = U_MALFORMED_SET; return; - case INTERSECTION /*'&'*/: + case u'&': if (lastItem == 2 && op == 0) { op = (UChar) c; continue; @@ -528,11 +496,11 @@ void UnicodeSet::applyPattern(RuleCharacterIterator& chars, // syntaxError(chars, "'&' not after set"); ec = U_MALFORMED_SET; return; - case 0x5E /*'^'*/: + case u'^': // syntaxError(chars, "'^' not after '['"); ec = U_MALFORMED_SET; return; - case 0x7B /*'{'*/: + case u'{': if (op != 0) { // syntaxError(chars, "Missing operand after operator"); ec = U_MALFORMED_SET; @@ -549,13 +517,13 @@ void UnicodeSet::applyPattern(RuleCharacterIterator& chars, while (!chars.atEnd()) { c = chars.next(opts, literal, ec); if (U_FAILURE(ec)) return; - if (c == 0x7D /*'}'*/ && !literal) { + if (c == u'}' && !literal) { ok = TRUE; break; } buf.append(c); } - if (buf.length() < 1 || !ok) { + if (!ok) { // syntaxError(chars, "Invalid multicharacter string"); ec = U_MALFORMED_SET; return; @@ -565,9 +533,9 @@ void UnicodeSet::applyPattern(RuleCharacterIterator& chars, // we don't need to drop through to the further // processing add(buf); - patLocal.append((UChar) 0x7B /*'{'*/); + patLocal.append(u'{'); _appendToPat(patLocal, buf, FALSE); - patLocal.append((UChar) 0x7D /*'}'*/); + patLocal.append(u'}'); continue; case SymbolTable::SYMBOL_REF: // symbols nosymbols @@ -580,7 +548,7 @@ void UnicodeSet::applyPattern(RuleCharacterIterator& chars, chars.getPos(backup); c = chars.next(opts, literal, ec); if (U_FAILURE(ec)) return; - UBool anchor = (c == 0x5D /*']'*/ && !literal); + UBool anchor = (c == u']' && !literal); if (symbols == 0 && !anchor) { c = SymbolTable::SYMBOL_REF; chars.setPos(backup); @@ -594,7 +562,7 @@ void UnicodeSet::applyPattern(RuleCharacterIterator& chars, add(U_ETHER); usePat = TRUE; patLocal.append((UChar) SymbolTable::SYMBOL_REF); - patLocal.append((UChar) 0x5D /*']'*/); + patLocal.append(u']'); mode = 2; continue; } @@ -617,7 +585,7 @@ void UnicodeSet::applyPattern(RuleCharacterIterator& chars, lastChar = c; break; case 1: - if (op == HYPHEN /*'-'*/) { + if (op == u'-') { if (lastChar >= c) { // Don't allow redundant (a-a) or empty (b-a) ranges; // these are most likely typos. @@ -1036,11 +1004,11 @@ UBool UnicodeSet::resemblesPropertyPattern(RuleCharacterIterator& chars, RuleCharacterIterator::Pos pos; chars.getPos(pos); UChar32 c = chars.next(iterOpts, literal, ec); - if (c == 0x5B /*'['*/ || c == 0x5C /*'\\'*/) { + if (c == u'[' || c == u'\\') { UChar32 d = chars.next(iterOpts & ~RuleCharacterIterator::SKIP_WHITESPACE, literal, ec); - result = (c == 0x5B /*'['*/) ? (d == 0x3A /*':'*/) : - (d == 0x4E /*'N'*/ || d == 0x70 /*'p'*/ || d == 0x50 /*'P'*/); + result = (c == u'[') ? (d == u':') : + (d == u'N' || d == u'p' || d == u'P'); } chars.setPos(pos); return result && U_SUCCESS(ec); @@ -1071,17 +1039,17 @@ UnicodeSet& UnicodeSet::applyPropertyPattern(const UnicodeString& pattern, posix = TRUE; pos += 2; pos = ICU_Utility::skipWhitespace(pattern, pos); - if (pos < pattern.length() && pattern.charAt(pos) == COMPLEMENT) { + if (pos < pattern.length() && pattern.charAt(pos) == u'^') { ++pos; invert = TRUE; } } else if (isPerlOpen(pattern, pos) || isNameOpen(pattern, pos)) { UChar c = pattern.charAt(pos+1); - invert = (c == UPPER_P); - isName = (c == UPPER_N); + invert = (c == u'P'); + isName = (c == u'N'); pos += 2; pos = ICU_Utility::skipWhitespace(pattern, pos); - if (pos == pattern.length() || pattern.charAt(pos++) != OPEN_BRACE) { + if (pos == pattern.length() || pattern.charAt(pos++) != u'{') { // Syntax error; "\p" or "\P" not followed by "{" FAIL(ec); } @@ -1093,9 +1061,9 @@ UnicodeSet& UnicodeSet::applyPropertyPattern(const UnicodeString& pattern, // Look for the matching close delimiter, either :] or } int32_t close; if (posix) { - close = pattern.indexOf(POSIX_CLOSE, 2, pos); + close = pattern.indexOf(u":]", 2, pos); } else { - close = pattern.indexOf(CLOSE_BRACE, pos); + close = pattern.indexOf(u'}', pos); } if (close < 0) { // Syntax error; close delimiter missing @@ -1105,7 +1073,7 @@ UnicodeSet& UnicodeSet::applyPropertyPattern(const UnicodeString& pattern, // Look for an '=' sign. If this is present, we will parse a // medium \p{gc=Cf} or long \p{GeneralCategory=Format} // pattern. - int32_t equals = pattern.indexOf(EQUALS, pos); + int32_t equals = pattern.indexOf(u'=', pos); UnicodeString propName, valueName; if (equals >= 0 && equals < close && !isName) { // Equals seen; parse medium/long pattern diff --git a/thirdparty/icu4c/common/unisetspan.cpp b/thirdparty/icu4c/common/unisetspan.cpp index 68e44d91ee..fe0d74f5b2 100644 --- a/thirdparty/icu4c/common/unisetspan.cpp +++ b/thirdparty/icu4c/common/unisetspan.cpp @@ -231,6 +231,9 @@ UnicodeSetStringSpan::UnicodeSetStringSpan(const UnicodeSet &set, const UnicodeString &string=*(const UnicodeString *)strings.elementAt(i); const UChar *s16=string.getBuffer(); int32_t length16=string.length(); + if (length16==0) { + continue; // skip the empty string + } UBool thisRelevant; spanLength=spanSet.span(s16, length16, USET_SPAN_CONTAINED); if(spanLength0) { // Relevant string. if(which&UTF16) { if(which&CONTAINED) { if(which&FWD) { @@ -362,7 +365,7 @@ UnicodeSetStringSpan::UnicodeSetStringSpan(const UnicodeSet &set, addToSpanNotSet(c); } } - } else { // Irrelevant string. + } else { // Irrelevant string. (Also the empty string.) if(which&UTF8) { if(which&CONTAINED) { // Only necessary for LONGEST_MATCH. uint8_t *s8=utf8+utf8Count; @@ -653,11 +656,12 @@ int32_t UnicodeSetStringSpan::span(const UChar *s, int32_t length, USetSpanCondi for(i=0; i0); // Try to match this string at pos-overlap..pos. if(overlap>=LONG_SPAN) { @@ -697,6 +701,9 @@ int32_t UnicodeSetStringSpan::span(const UChar *s, int32_t length, USetSpanCondi const UnicodeString &string=*(const UnicodeString *)strings.elementAt(i); const UChar *s16=string.getBuffer(); int32_t length16=string.length(); + if (length16==0) { + continue; // skip the empty string + } // Try to match this string at pos-overlap..pos. if(overlap>=LONG_SPAN) { @@ -817,11 +824,12 @@ int32_t UnicodeSetStringSpan::spanBack(const UChar *s, int32_t length, USetSpanC for(i=0; i0); // Try to match this string at pos-(length16-overlap)..pos-length16. if(overlap>=LONG_SPAN) { @@ -863,6 +871,9 @@ int32_t UnicodeSetStringSpan::spanBack(const UChar *s, int32_t length, USetSpanC const UnicodeString &string=*(const UnicodeString *)strings.elementAt(i); const UChar *s16=string.getBuffer(); int32_t length16=string.length(); + if (length16==0) { + continue; // skip the empty string + } // Try to match this string at pos-(length16-overlap)..pos-length16. if(overlap>=LONG_SPAN) { @@ -1358,11 +1369,12 @@ int32_t UnicodeSetStringSpan::spanNot(const UChar *s, int32_t length) const { // Try to match the strings at pos. for(i=0; i0); if(length16<=rest && matches16CPB(s, pos, length, s16, length16)) { return pos; // There is a set element at pos. } @@ -1401,11 +1413,12 @@ int32_t UnicodeSetStringSpan::spanNotBack(const UChar *s, int32_t length) const // it is easier and we only need to know whether the string is irrelevant // which is the same in either array. if(spanLengths[i]==ALL_CP_CONTAINED) { - continue; // Irrelevant string. + continue; // Irrelevant string. (Also the empty string.) } const UnicodeString &string=*(const UnicodeString *)strings.elementAt(i); const UChar *s16=string.getBuffer(); int32_t length16=string.length(); + U_ASSERT(length>0); if(length16<=pos && matches16CPB(s, pos-length16, length, s16, length16)) { return pos; // There is a set element at pos. } diff --git a/thirdparty/icu4c/common/uprops.h b/thirdparty/icu4c/common/uprops.h index 8bf929919f..09830bdeb9 100644 --- a/thirdparty/icu4c/common/uprops.h +++ b/thirdparty/icu4c/common/uprops.h @@ -310,55 +310,12 @@ u_isgraphPOSIX(UChar32 c); U_CFUNC UBool u_isprintPOSIX(UChar32 c); -/** Turn a bit index into a bit flag. @internal */ -#define FLAG(n) ((uint32_t)1<<(n)) - -/** Flags for general categories in the order of UCharCategory. @internal */ -#define _Cn FLAG(U_GENERAL_OTHER_TYPES) -#define _Lu FLAG(U_UPPERCASE_LETTER) -#define _Ll FLAG(U_LOWERCASE_LETTER) -#define _Lt FLAG(U_TITLECASE_LETTER) -#define _Lm FLAG(U_MODIFIER_LETTER) -/* #define _Lo FLAG(U_OTHER_LETTER) -- conflicts with MS Visual Studio 9.0 xiosbase */ -#define _Mn FLAG(U_NON_SPACING_MARK) -#define _Me FLAG(U_ENCLOSING_MARK) -#define _Mc FLAG(U_COMBINING_SPACING_MARK) -#define _Nd FLAG(U_DECIMAL_DIGIT_NUMBER) -#define _Nl FLAG(U_LETTER_NUMBER) -#define _No FLAG(U_OTHER_NUMBER) -#define _Zs FLAG(U_SPACE_SEPARATOR) -#define _Zl FLAG(U_LINE_SEPARATOR) -#define _Zp FLAG(U_PARAGRAPH_SEPARATOR) -#define _Cc FLAG(U_CONTROL_CHAR) -#define _Cf FLAG(U_FORMAT_CHAR) -#define _Co FLAG(U_PRIVATE_USE_CHAR) -#define _Cs FLAG(U_SURROGATE) -#define _Pd FLAG(U_DASH_PUNCTUATION) -#define _Ps FLAG(U_START_PUNCTUATION) -/* #define _Pe FLAG(U_END_PUNCTUATION) -- conflicts with MS Visual Studio 9.0 xlocnum */ -/* #define _Pc FLAG(U_CONNECTOR_PUNCTUATION) -- conflicts with MS Visual Studio 9.0 streambuf */ -#define _Po FLAG(U_OTHER_PUNCTUATION) -#define _Sm FLAG(U_MATH_SYMBOL) -#define _Sc FLAG(U_CURRENCY_SYMBOL) -#define _Sk FLAG(U_MODIFIER_SYMBOL) -#define _So FLAG(U_OTHER_SYMBOL) -#define _Pi FLAG(U_INITIAL_PUNCTUATION) -/* #define _Pf FLAG(U_FINAL_PUNCTUATION) -- conflicts with MS Visual Studio 9.0 streambuf */ - /** Some code points. @internal */ enum { TAB =0x0009, LF =0x000a, FF =0x000c, CR =0x000d, - U_A =0x0041, - U_F =0x0046, - U_Z =0x005a, - U_a =0x0061, - U_f =0x0066, - U_z =0x007a, - DEL =0x007f, - NL =0x0085, NBSP =0x00a0, CGJ =0x034f, FIGURESP=0x2007, @@ -367,15 +324,6 @@ enum { ZWJ =0x200d, RLM =0x200f, NNBSP =0x202f, - WJ =0x2060, - INHSWAP =0x206a, - NOMDIG =0x206f, - U_FW_A =0xff21, - U_FW_F =0xff26, - U_FW_Z =0xff3a, - U_FW_a =0xff41, - U_FW_f =0xff46, - U_FW_z =0xff5a, ZWNBSP =0xfeff }; diff --git a/thirdparty/icu4c/common/uresbund.cpp b/thirdparty/icu4c/common/uresbund.cpp index 2ece87897d..5ea4187100 100644 --- a/thirdparty/icu4c/common/uresbund.cpp +++ b/thirdparty/icu4c/common/uresbund.cpp @@ -91,6 +91,15 @@ static UBool chopLocale(char *name) { return FALSE; } +/** + * Called to check whether a name without '_' needs to be checked for a parent. + * Some code had assumed that locale IDs with '_' could not have a non-root parent. + * We may want a better way of doing this. + */ +static UBool mayHaveParent(char *name) { + return (name[0] != 0 && uprv_strstr("nb nn",name) != nullptr); +} + /** * Internal function */ @@ -529,8 +538,8 @@ loadParentsExceptRoot(UResourceDataEntry *&t1, char name[], int32_t nameCapacity, UBool usingUSRData, char usrDataPath[], UErrorCode *status) { if (U_FAILURE(*status)) { return FALSE; } - UBool hasChopped = TRUE; - while (hasChopped && t1->fParent == NULL && !t1->fData.noFallback && + UBool checkParent = TRUE; + while (checkParent && t1->fParent == NULL && !t1->fData.noFallback && res_getResource(&t1->fData,"%%ParentIsRoot") == RES_BOGUS) { Resource parentRes = res_getResource(&t1->fData, "%%Parent"); if (parentRes != RES_BOGUS) { // An explicit parent was found. @@ -573,7 +582,7 @@ loadParentsExceptRoot(UResourceDataEntry *&t1, } } t1 = t2; - hasChopped = chopLocale(name); + checkParent = chopLocale(name) || mayHaveParent(name); } return TRUE; } @@ -692,7 +701,7 @@ static UResourceDataEntry *entryOpen(const char* path, const char* localeID, } } } - if (hasChopped && !isRoot) { + if ((hasChopped || mayHaveParent(name)) && !isRoot) { if (!loadParentsExceptRoot(t1, name, UPRV_LENGTHOF(name), usingUSRData, usrDataPath, status)) { goto finish; } @@ -716,7 +725,7 @@ static UResourceDataEntry *entryOpen(const char* path, const char* localeID, hasRealData = TRUE; isDefault = TRUE; // TODO: Why not if (usingUSRData) { ... } like in the non-default-locale code path? - if (hasChopped && !isRoot) { + if ((hasChopped || mayHaveParent(name)) && !isRoot) { if (!loadParentsExceptRoot(t1, name, UPRV_LENGTHOF(name), usingUSRData, usrDataPath, status)) { goto finish; } @@ -1908,6 +1917,8 @@ ures_getByKeyWithFallback(const UResourceBundle *resB, } else { break; } + } else if (res == RES_BOGUS) { + break; } } while(*myPath); /* Continue until the whole path is consumed */ } @@ -3019,7 +3030,7 @@ ures_getKeywordValues(const char *path, const char *keyword, UErrorCode *status) U_CAPI UBool U_EXPORT2 ures_equal(const UResourceBundle* res1, const UResourceBundle* res2){ if(res1==NULL || res2==NULL){ - return res1==res2; /* pointer comparision */ + return res1==res2; /* pointer comparison */ } if(res1->fKey==NULL|| res2->fKey==NULL){ return (res1->fKey==res2->fKey); diff --git a/thirdparty/icu4c/common/uresdata.cpp b/thirdparty/icu4c/common/uresdata.cpp index ae731e4544..9af081be40 100644 --- a/thirdparty/icu4c/common/uresdata.cpp +++ b/thirdparty/icu4c/common/uresdata.cpp @@ -960,14 +960,6 @@ res_findResource(const ResourceData *pResData, Resource r, char** path, const ch if(URES_IS_TABLE(type)) { *key = pathP; t2 = res_getTableItemByKey(pResData, t1, &indexR, key); - if(t2 == RES_BOGUS) { - /* if we fail to get the resource by key, maybe we got an index */ - indexR = uprv_strtol(pathP, &closeIndex, 10); - if(indexR >= 0 && *closeIndex == 0 && (*pathP != '0' || closeIndex - pathP == 1)) { - /* if we indeed have an index, try to get the item by index */ - t2 = res_getTableItemByIndex(pResData, t1, indexR, key); - } // else t2 is already RES_BOGUS - } } else if(URES_IS_ARRAY(type)) { indexR = uprv_strtol(pathP, &closeIndex, 10); if(indexR >= 0 && *closeIndex == 0) { diff --git a/thirdparty/icu4c/common/uresimp.h b/thirdparty/icu4c/common/uresimp.h index 69d82566fe..f038dedace 100644 --- a/thirdparty/icu4c/common/uresimp.h +++ b/thirdparty/icu4c/common/uresimp.h @@ -270,11 +270,13 @@ ures_getByKeyWithFallback(const UResourceBundle *resB, * function can perform fallback on the sub-resources of the table. * @param resB a resource * @param inKey a key associated with the requested resource + * @param len if not NULL, used to return the length of the string * @param status: fills in the outgoing error code * could be U_MISSING_RESOURCE_ERROR if the key is not found * could be a non-failing error * e.g.: U_USING_FALLBACK_WARNING,U_USING_DEFAULT_WARNING - * @return a pointer to a UResourceBundle struct. If fill in param was NULL, caller must delete it + * @return returns a pointer to a zero-terminated UChar array which lives in a + * memory mapped/DLL file. */ U_CAPI const UChar* U_EXPORT2 ures_getStringByKeyWithFallback(const UResourceBundle *resB, diff --git a/thirdparty/icu4c/common/uset.cpp b/thirdparty/icu4c/common/uset.cpp index eae7981d52..a7e3046dbf 100644 --- a/thirdparty/icu4c/common/uset.cpp +++ b/thirdparty/icu4c/common/uset.cpp @@ -116,6 +116,12 @@ uset_removeString(USet* set, const UChar* str, int32_t strLen) { ((UnicodeSet*) set)->UnicodeSet::remove(s); } +U_CAPI void U_EXPORT2 +uset_removeAllCodePoints(USet *set, const UChar *str, int32_t length) { + UnicodeString s(length==-1, str, length); + ((UnicodeSet*) set)->UnicodeSet::removeAll(s); +} + U_CAPI void U_EXPORT2 uset_removeAll(USet* set, const USet* remove) { ((UnicodeSet*) set)->UnicodeSet::removeAll(*(const UnicodeSet*)remove); @@ -126,6 +132,18 @@ uset_retain(USet* set, UChar32 start, UChar32 end) { ((UnicodeSet*) set)->UnicodeSet::retain(start, end); } +U_CAPI void U_EXPORT2 +uset_retainString(USet *set, const UChar *str, int32_t length) { + UnicodeString s(length==-1, str, length); + ((UnicodeSet*) set)->UnicodeSet::retain(s); +} + +U_CAPI void U_EXPORT2 +uset_retainAllCodePoints(USet *set, const UChar *str, int32_t length) { + UnicodeString s(length==-1, str, length); + ((UnicodeSet*) set)->UnicodeSet::retainAll(s); +} + U_CAPI void U_EXPORT2 uset_retainAll(USet* set, const USet* retain) { ((UnicodeSet*) set)->UnicodeSet::retainAll(*(const UnicodeSet*)retain); @@ -141,6 +159,23 @@ uset_complement(USet* set) { ((UnicodeSet*) set)->UnicodeSet::complement(); } +U_CAPI void U_EXPORT2 +uset_complementRange(USet *set, UChar32 start, UChar32 end) { + ((UnicodeSet*) set)->UnicodeSet::complement(start, end); +} + +U_CAPI void U_EXPORT2 +uset_complementString(USet *set, const UChar *str, int32_t length) { + UnicodeString s(length==-1, str, length); + ((UnicodeSet*) set)->UnicodeSet::complement(s); +} + +U_CAPI void U_EXPORT2 +uset_complementAllCodePoints(USet *set, const UChar *str, int32_t length) { + UnicodeString s(length==-1, str, length); + ((UnicodeSet*) set)->UnicodeSet::complementAll(s); +} + U_CAPI void U_EXPORT2 uset_complementAll(USet* set, const USet* complement) { ((UnicodeSet*) set)->UnicodeSet::complementAll(*(const UnicodeSet*)complement); diff --git a/thirdparty/icu4c/common/usprep.cpp b/thirdparty/icu4c/common/usprep.cpp index 8351a77370..874ffc63a8 100644 --- a/thirdparty/icu4c/common/usprep.cpp +++ b/thirdparty/icu4c/common/usprep.cpp @@ -575,7 +575,7 @@ usprep_map( const UStringPrepProfile* profile, } }else if(type==USPREP_DELETE){ - // just consume the codepoint and contine + // just consume the codepoint and continue continue; } //copy the code point into destination diff --git a/thirdparty/icu4c/common/ustr_wcs.cpp b/thirdparty/icu4c/common/ustr_wcs.cpp index e9f278e969..89d0762480 100644 --- a/thirdparty/icu4c/common/ustr_wcs.cpp +++ b/thirdparty/icu4c/common/ustr_wcs.cpp @@ -364,7 +364,7 @@ _strFromWCS( UChar *dest, } /* we have found a null so convert the - * chunk from begining of non-null char to null + * chunk from beginning of non-null char to null */ retVal = uprv_wcstombs(pCSrc,pSrc,remaining); @@ -387,7 +387,7 @@ _strFromWCS( UChar *dest, * null terminate it and convert wchar_ts to chars */ if(nulLen >= _STACK_BUFFER_CAPACITY){ - /* Should rarely occcur */ + /* Should rarely occur */ /* allocate new buffer buffer */ pWStack =(wchar_t*) uprv_malloc(sizeof(wchar_t) * (nulLen + 1)); if(pWStack==NULL){ diff --git a/thirdparty/icu4c/common/utext.cpp b/thirdparty/icu4c/common/utext.cpp index 763b6684fb..d79f8141bb 100644 --- a/thirdparty/icu4c/common/utext.cpp +++ b/thirdparty/icu4c/common/utext.cpp @@ -382,7 +382,7 @@ utext_previous32From(UText *ut, int64_t index) { // UChar32 cPrev; // The character preceding cCurr, which is what we will return. - // Address the chunk containg the position preceding the incoming index + // Address the chunk containing the position preceding the incoming index // A tricky edge case: // We try to test the requested native index against the chunkNativeStart to determine // whether the character preceding the one at the index is in the current chunk. @@ -894,7 +894,7 @@ struct UTF8Buf { // one for a supplementary starting in the last normal position, // and one for an entry for the buffer limit position. uint8_t mapToUChars[UTF8_TEXT_CHUNK_SIZE*3+6]; // Map native offset from bufNativeStart to - // correspoding offset in filled part of buf. + // corresponding offset in filled part of buf. int32_t align; }; @@ -1545,7 +1545,7 @@ utf8TextMapOffsetToNative(const UText *ut) { } // -// Map a native index to the corrsponding chunk offset +// Map a native index to the corresponding chunk offset // static int32_t U_CALLCONV utf8TextMapIndexToUTF16(const UText *ut, int64_t index64) { diff --git a/thirdparty/icu4c/common/util.h b/thirdparty/icu4c/common/util.h index 9c3b76d9ed..b5fac383a2 100644 --- a/thirdparty/icu4c/common/util.h +++ b/thirdparty/icu4c/common/util.h @@ -13,10 +13,10 @@ #ifndef ICU_UTIL_H #define ICU_UTIL_H -#include "unicode/utypes.h" -#include "unicode/uobject.h" +#include "charstr.h" #include "unicode/unistr.h" - +#include "unicode/uobject.h" +#include "unicode/utypes.h" //-------------------------------------------------------------------- // class ICU_Utility // i18n utility functions, scoped into the class ICU_Utility. diff --git a/thirdparty/icu4c/common/utracimp.h b/thirdparty/icu4c/common/utracimp.h index f32fe1db39..945540d25a 100644 --- a/thirdparty/icu4c/common/utracimp.h +++ b/thirdparty/icu4c/common/utracimp.h @@ -193,7 +193,7 @@ UPRV_BLOCK_MACRO_BEGIN { \ * Trace statement for each exit point of a function that has a UTRACE_ENTRY() * statement, and that returns a value. * - * @param val The function's return value, int32_t or comatible type. + * @param val The function's return value, int32_t or compatible type. * * @internal */ diff --git a/thirdparty/icu4c/common/uvector.cpp b/thirdparty/icu4c/common/uvector.cpp index cf19edf646..9c7e74c6d5 100644 --- a/thirdparty/icu4c/common/uvector.cpp +++ b/thirdparty/icu4c/common/uvector.cpp @@ -312,7 +312,7 @@ int32_t UVector::indexOf(UElement key, int32_t startIndex, int8_t hint) const { } else { for (i=startIndex; i and a timezone - // behind UTC is Etc/GMT+. - int ret = snprintf(gmtOffsetTz, UPRV_LENGTHOF(gmtOffsetTz), "Etc/GMT%+ld", -utcOffsetMins / 60); + // Important note on the sign convention for zones: + // + // From https://en.wikipedia.org/wiki/Tz_database#Area + // "In order to conform with the POSIX style, those zone names beginning with "Etc/GMT" have their sign reversed + // from the standard ISO 8601 convention. In the "Etc" area, zones west of GMT have a positive sign and those + // east have a negative sign in their name (e.g "Etc/GMT-14" is 14 hours ahead of GMT)." + // + // Regarding the POSIX style, from https://www.gnu.org/software/libc/manual/html_node/TZ-Variable.html + // "The offset specifies the time value you must add to the local time to get a Coordinated Universal Time value." + // + // However, the Bias value in DYNAMIC_TIME_ZONE_INFORMATION *already* follows the POSIX convention. + // + // From https://docs.microsoft.com/en-us/windows/win32/api/timezoneapi/ns-timezoneapi-dynamic_time_zone_information + // "The bias is the difference, in minutes, between Coordinated Universal Time (UTC) and + // local time. All translations between UTC and local time are based on the following formula: + // UTC = local time + bias" + // + // For example, a time zone that is 3 hours ahead of UTC (UTC+03:00) would have a Bias value of -180, and the + // corresponding time zone ID would be "Etc/GMT-3". (So there is no need to negate utcOffsetMins below.) + int ret = snprintf(gmtOffsetTz, UPRV_LENGTHOF(gmtOffsetTz), "Etc/GMT%+ld", utcOffsetMins / 60); if (ret > 0 && ret < UPRV_LENGTHOF(gmtOffsetTz)) { return uprv_strdup(gmtOffsetTz); } diff --git a/thirdparty/icu4c/icudt68l.dat b/thirdparty/icu4c/icudt69l.dat similarity index 86% rename from thirdparty/icu4c/icudt68l.dat rename to thirdparty/icu4c/icudt69l.dat index 9ecea5d548e142cc34f7d3aa0d43d83e61e5545f..3101a49695e16488abfc1c27b1df2e09018d68d0 100644 GIT binary patch delta 184972 zcmX@`IRbrUW#K0hM zNr_<_69dD6D@qJ!LF%t6F}wlEFVbY-WM*LakgLU@#LQ67z;H&3!H$`M!9Yu!A(oke z;X#KsLp?~rD{Y4P%nS?x9y$z%m>C!xmg_Lw1gYDg!|oQcaFfcqY*Jqf*!oVPqrq8ezq;8Ks!xgD7P{hi>5YTAA(8kKZ zu%Xd_VHPU`gF}-6!)8_nhJ?8W3@1VIR)!2uSQ!`$c#Rl-vobJD*kHsU$i~1h!OoaL zpN)aRA=H?`lZ}C)A<38_j*Wq#;Ds?mjT%Tny*a~lHUa$rxriM$5_7%ra64OL8*vQuUIG zvf*yn$SlohIr%JD=^JK6M$5^3Eb@$&ll54X7%e9UvWPKSPR?MFMKYo&KfeUUp7|_d zNYcfrc_k<|oM!>q@R~)|1mTR5%#s`wcfbR&JijOfMY|2F9FoSW3}ma}x~ekbJreU! zoz=$*^34WT@p{V~{q)qll++@h%wiNZIr`~EiMhFnC7H>IIc}+mC8b5F#i$l!CYKhM zq+p1ZrJ_Vcj(&D(Wk_W~s!L)CN+jgy=Oj*6WfSzY%+b%u%udaz3@%M7NlZtxB{#Js zF)BX~-Exp{3Yv+N>)B)(Eho=qlN7Ve(J#m;ElSKmF>Uf0u!2`?QudZP`lWf9B`DH4 z`sJBhB1_lLo z1_lN_1_p+iP|N`;hZqeVmiNuf&cUj4TBDT zkQb~N3>XX;7#Iv0jHmzCFqqG5!C*dJKFnBox|Ex-#P$oC1_{jDZFCI|F*62EcQi6k zW;B|fYGe>z|B&Gs!%K!Y4DT5}F??nC!BEBUo8cb=BO?nVJ0lk(FQWjXFrzr56r%ux z8j}KM5h?l3%J*uv<=G=Xs)<2ObI#%l~x z3<-=1Oi_#~jJp`S7+*1-VtB`JhS7zIgUN_#1>+?~KBg}|3{Mz682uO}7#A@HFr_hm zV7$S|$dJP*%D~7_#OTC$f#DYe8v`3-1)~k40b>iJ9HS@zV|ui)fo8oGqa&jp zg98H-1BeyGpa*4{z*#{ICJZ27!qn(7SV7fTF*tx_F!lH_m_XI&F}OilZVWz97Q$?w zdL)GiV=)yLz}02Jt=D77f*NSWPyl5ij7I2~0(XKQ!xX4GH>i$!M@CY$AnQQ*6T7nz z9;ty^jBwThkhAK+!Cu3#04fc07qTUw2!KRS7Dx+N2g2`e@W{jF5#-><45J{1dTj9o zi|II|G!O@lX_yQ#X#nADRMil#Kpk7p=*Tz=9=FH}XF)?`6WkF^44a^0$i8ZVij~3D z#W9pY#oQSBpe%%rAci=oSRaD}Lp_RX7#$gjay6qPBO>PY7*e1HreI0o2=lNe!+Ln^ zMZn!}!Vm#9un8$-5ZMUkV}y<-xDJFr-54;{VVYd;$Y_O>s9;$Tp&1dZJ`80jX#kY_ zA)$wewjg*25b3yjMub9y>kxs9-EpvNh0q%Z4}k)B{33@1EbSw7_<(gl%RfZm!i=s# ziVj%bwL(fxu#iH;FDN-d!ULfO0`UMXYs*6oJTSh)lH%o*VQSmO-scfhY1Nc&I{C4=Dd5 zToc651WsbG3WXA@5HXEN8;BG!3+nB9M@BaWSW$y51h54fwkSdbvk%m0N5%z6RTZp& zM?@RAV1tzZaqyB2TY5(XF1E5BkyjAmh_D2kmyp%f!_vD6yb40Dp%94;mVpokA{X0; z5)d;i5$dv#(gw8Zu4hbv2R|ZlAU8-*Qv||#gukaC1v8?4hj|PUqKMQK0k0wIvE@tT z0D>8VNKVLwEyCZh!WLnP3EUDy8G(_SK67=(2Q2O=T{;lK`PI|fvY!*cf; zc)Q4i0aglR!LuO3F`#k-TK~nt3l4;1^x%#`BtUG=g63p!I}(;&5SCzzFhn+VtB03j z*cHMW9Egeq5x|Jz2bATIo2b~Ggc+4_4E3<8b_Y@|xC2^lxxsUC89Yc4mLe=cwEYkv zh42m{ED+HK*IUmBiUmlufrtcr#-y4VD|Qwe*og0c0_#w_(Dd2dn=;(#SE0>oQK;fLSYrec3efxy?u&ps z7KFPZ$iBkWApxm@RpJQmVF?ph{Daaev6>Kpj}(xM$UP=Zi*V_wN4O3VD3Gj&$km9> z7O10%-I?gRv9|UxBN66*GPOesD$E25%ZiAm7s8{+p##qU*nNsCa4{`|mHME<3VY~) z+5jLKSk8xM?|McnhFOU0!03pzKLF|np=w9OC#>Q{lyRU6npoA~{y(e^09gZxdqkrF z?oviXpNKrGKnWCP6FdrF@sHg?)F?n$izvlGy&YVBMJ>({xzKaBNsEUN)nM= z@W(eKyin^1nBkx@oC(NjWg%!3^55-z=V-=(toc=*w z5M;{`Zbc7T!d(qybFiftP+JS61{%`!jQBguL>NK91Vp|El^RG^GlH@`H2z`TVMuQn zq=;}VV^1UaiY$=1P=CY5oI&vq3lf->2tOnGX^37BdX%81c90b?a}YkqtPwzQ4=SGO zQ_zMSP&-c`<6tgE?LvWMU=|@9jN0b|sX^$5S&3*(q%b(Z%6~-qM)U$m>53s+1*(Q2 zIRp_lu)G3uGAxPLJ2HauK14aF+ktEluJH?y8kj+d0vj}l0g{3F7+aMFifV{mprH&# zhMamvm_aZXL55b54MO+=RGxukDANNQiUGB`>OscAT#WE9dOHtS3`6{aEhiu%4{xWw zo)P2+^u2qjpI!W@s#2a11?iI|~;t|yD39&4(ERznEOFf$#Z0fw66@#%p% z71V)+IuKI-A#y5u8HKA`4%H5BDNxcmugCNmEJQ$~`N-B_%cAHx1{Cy=G=Yc?kZ&Pk zSi%OD{}Ia3(>Q9E9J_`fPZjziM{N&nc| zDi!5Edd*>k;F5pu7x`#%?tBo)JU`!l?+oh|mKS z@tEqsBkG{^k6j_67y>Iq8Q(yp4Nw~nVl=2ig|HCjfeJT>7_vGahE=PW7_=GO7+0;T z-^>`t61SqjH1gNt!1n96c1k@X{GX$8S8Dh=O5a7Vh5a7zr5a5L- z=g-a%5W>z75XsIE5XX)hugUBT0U7KJ0lDl90Y&T#0p(EnuZ&UPbXCL75YWiZ5YWcX z5YWxe5HNwAp&lhcO=V{Yn8nTzFrS?vUGthvt#T>Is4u*hK4u*g%4u*hy4u*gd4u*hA4u*g_Gz*(K7y>#t7y^1Z7y>3?F=sjlL%LR}7W5G-`gaWDj2=3of8 z!NCx4mxCeT5eGxSb8zUuqN|?q4F^NOM-GO7ZyXE(zd0BJ7&u`G5~gNV{VHZoh5!yu zh5%kph5#W>h5&I+h5#8(NHBwxRWLFzDRMFdsBtm`Xmc_I7;rKKm?Fu8V%&<8A;6xK zA;5)`A;6Q9A;1sQqE*413;_|G3<0s63;{`;3<2q!3;{Wu^$-_ijzW4hJZ3o zhJb2LhJXf6hJaR1hJY?k)OhXZWC)nT$q+D;lObRpn%rVehJY2E3;}C783Hz;$!+Ik z2-w5P5O9!_A>bHDt{$2oDi~L-I?c%taDkH{;3_9Wz%4W%-sfZpc*4mL@RE}u;2kGJ zz-N$VhA42p1{K#oI2i)|axw%kaWMq2b76Xli;E$EpNk48F$7FQvv4*SL%;$qhJdA93<0aS5NQJxW$U>Z0=9551nlHu2-wHP5O5ex z{sb38z*#PafJbDmL%@HK zI5#3&g6c_-<(%9M0esvH0m9r20TSE{0n*$I0Sep<0jk`nj@0622+-$d2r%Jh2(aX4 z2(W|6*F(!@XKsc74{nA4Uv7qgAZ~_$aBkEfkKtwrNaSV+NaJP*$mWK`FC-X2&RDgo zfSVzpl$#--ikl&zo|_?{g_|Lu6U~f1Ziax#+zbITxETWGLgnf~DIXN?i?|sAmUA-% ztl?$|*vQQgz{KFsn9sOs)i!R1fZbRuJiyHmaFm-N;1oAQzcbVLw&$6ZiayWAlL9fe1)u#orfWShle3R zkcS~agohzOl7}Hc4vRWP9)+a z7y^8G>KOupuqX`WVF-xgVF-xlVF*a#VF*a)VF<{OG0%r3t1S|llgXDi$a$2=&F%Lt)3Lb`lwLA;~8+aH3 zw(>9p?BanWJV?lZ;=7)4KMzB|5gvwslROLoXLuL_F7hx0T;pK~xD7HC90edVA;Eo* zhauoG4@1BU9)^I|JPZLJco+h{Lel)J0{VCv0w(h^1We;)2$+p&Rz2eaUWS0BybJ-Wco_oL@-hT$ z;$;Zf&dU(62aC`5^D+b+;bjOo$;%LMhL<7WA}>S0H7x3G@-hV6<7EhV%*zn)jF%zc zH7`TJ2dFwwwuMB_s#Txsc^LwJ@G=Da4XZRQbF7h!1T;pR1 zxXH&5aF356;4vRVzzaTxfVX_8CFch|hJdep3<1CR7y|x79S=$LAoJ?$8Cm!l0yy~@ z0{HkD0tERP0>tGru+;6R#0`w z&1_qKh5#pih5&bdh5#RahJZkRhJY}TJ(ik1|Q*P2sp{l5O9v4A>blE zL%=nDNL)ig032M5xA_?Y9`G{+JmqHyc)`yQ@Rpw;;1fSXz;}2kKvaY3lwbS|0sr|K z0$2nX0yqU20(b-%0t5w6LKWoyRjb4V7y_gP7y=Xo7y^_97y>i|7y@(!u*bcD07HPO z07HP407HPS07HP207HPg07HO}07F2a0K~zt#0he8hyX)CqyR%eoB%^WvH(LsngByU zwg5vw0a$H4q?rx!KS*(@07F2P07F2%07F2F07F2#07F2J07Jk;uwq0H8I%mC2`~iA z7GMZiAixl?Sb!m5g#bgqS^2OS{6)F8+Z&??9f&?U$a&@0FgFiDUhV7eef zz#KtHS^)VT7FD2-nlH!@utbm{V5J~Kz&b&OfQ^C-0ow!_0(J{B1RQ|sfrKo`d{CsV zT6I{EA>f1{L%>-7Pg%|?Zgct(2g%|?(gct&Zg%|=PKw{uf067~HWzs?n0SZD40jfd_0UGr} z3<0`A3;{+$h@gc87z2~35JP~K5JP~y5JP~A5JP~c5JP~U5JNyPl3Iwd3``M13<0r1 z3;{_(3<2pv3;|g}3<3E<3;`ur98f955Kt$?5YQ~d5K!MH#1POe#1Jq6MIk7-R;`*W z#1Jq;h#_FE5JSKMA%=jZLJR?`P}D(uv|flIV2cn#z)m5CfIUJC0SAQ`0*+x(cT$KU z;G7Ucz-1wZfNMew0k?%1>H{7?eS?Undd9~>3;{2M7y{l3F$8=NVhH#u#1QaHh#}y= z5UeDGgb|Z4Ljb!lLjaF3Lx7+#Lx7ktW{Q^=>r$V z(Do0=zoxV+8sCJHkIOcRFr z3>2gFjI)Iq0u~4}1S}P12v{M^5U>_%5F(UTt=b^W5U^F4Az+sLr7y@iX80rI@L>L0xMPR;%DDx3v2nZBm2nZ8l2#6M82uMJaPZePZ$P!@)$QNM< zC=p=@s6>;m6JZEw7GVhJ5Mc=D6=4XNB!U_W(?u8p=7=x^EEK6{2v`PnC34WN7GVh3 zAi@x^RfHj6hX_N!UJ-_XLuiH^7hwoEBf=1HQG_Aj8kz%ci!cN{5Mc;-D#8%(N`xWc zJy>rPv;n(n)fW+lfS)1^0srbn7y_6@K?w)am*)^=2;dcE2oMrQ1TiE`R;>~jWeAWF zWe89dWe89cWeCs~We6}3MfI7fC_{jiC_{j~C_{h?nw+O7Lx7(sLqM=7LqG&n4&MKZ z6=euW5@iTT7i9>@fl7kh3yRx9QHFprQHFqOQHFp9G`Ut$hJY?nhJb!ihJY!e3<2{P zOc^~HTNt|;CowK!T*zBI9T{tL|CL)6j;<) zbXbg7ELiMVoLM|s{8>U-qFEAI(php@idiaI>RDP?x>zQ#Okd-m`pV`OU(}%ErpWD#R+mD#xnAs>N!+YQ}2A>cr~K>RZnm z%o@oW&zj1b&05G>&RWa5YLy-jgMtwcgMtkYgMu>;gMt?igF+AwgF+M!gF+GygF+S$ zgF+DxgF+P#gF+(@gF*)ngTf>p28EeC3u4}-#a z9tMSLJPZmCco-C3@h~WSr#5W~x$kiyHLkjKlQP{GTfP|wSt(8kN4(96r9Fol;vVGb{Y!eU+q zg|)m43fp-Z6!!5lD4gVFP`J#?pm2+qLE#ZEgTgCb28EBj3<^JZ85EfL7!X|pv2FhpvBLiV9sC9py0&Mpy0*Npb*5*pb*c`ppeGTpis!qpis@v zpwPKZC+Qeg*|j z0R{zO0R{yH0R{yv0R{yV0R{zo0R{zk0S1L20S1M50S1K}0S1LK0S1Kz0S1MxdI1K7 zsR9fN3j`PxRtYdDY!P5k*eAfCa6*7V;j#dO!fgQtg{J}x3LgX*6n+UXDEt>-P~a3~ zP!JSkP>>d6P>>g7P*4+OP|y`*P%sf>P_PqZQ1B3BPzVrYP>2v@P)HDDP)HYKP$(2+ zP^b`OP-qZjP-quqQ0Nh4P?#pjprA5WkU?RIAcMkcK?a3Qf(#1G3j;DYEfocVo7Fx zUNJ*TDnoL9Zb5!tYF-ILa$<2RLqTd0LqUEyh%8D?%dB81$;?eHW`JxMhbS)1OJRU) zjAuwIVyFjg>}NjI$j)ZS z&SS`~WXQ?PV#q0B$SGsU&0)wbV#rIXXUNN8$jfIaNMtC;VJIkJD9UFjDrG3nWGK#N zD9&LhE@CJyV<<^wC@Eqn&1NVqVkoU*Shb1)y49J1A)g_SA(erFA%!84p@bomp$yCe ziIp;xFr+dRF)%PBGvqVmGUS5Qf_RAxr3}Rki3~Xm4D}583`q<*44Djt45eVLX$+|h zxeS>Md0-4OI-MaE%tIKT!;sIAjA9|giUNjwhEj$+h7<+{hB6E_iC~+MoteT=pURMf zVo)MO3PUPGF+(xjFCcfKs>x)?LDL0tF1oHHG;=^c8JHMY z!Qu##g~5*@h#`U@o`DeznHfMPfK+-QsRXg1D(m4&8No`Qqgey7n0U*cgPr@I;V%Od z!)gXy24;rm3}y_U7?>GAV*8<@Y+zANhEELjQ4IDBEDRuRW(@WWOkiaYtq_tOuGE<^ z5Uh4P!&U}e1_7``&7cOGGcqxVGYEi9GGhQ4%nY_3Ci00PkO3wFF&FBfdImm*=L{1V zq8M@*N*Op9Qy3%|%^2z!+8LY~Pcq0eLKH(B@ri+x!JYx+446?+L!iC_MUyI&4bcH| z2uMB1i!f&kGCXI9V)z8MPmZCUlOdS_WGTeTy9~mN+KlpytYAeD>mXqQ3L}WmAbgk; zkR1rI4iusg>oFaS2zZbxCWh7Z47v;u#SqP)Ach!;P>K-aM2ZZ11`ftJ#>)&W3^1Q@ zFg#~aWdK<^lfj-LiUAZkpfmuBDolq9fVPT*;tdpZX3*G2_8CMgu0Ul6TV}@K%xKT> zoFR~b73`En;MBnkPbDBHU^5@&T(f#`VsT~+04FYV1CgDg%K(ZLGjQB-qB#{k1QB5Z z2}MwtfE)=k523yuJ$WFz6q2UF?gaZ3l=z|;0vSMtLIN5jf-uaP5frP)d{ETEECrbi z3rUa(;M7#l0MY_23>e}WR;?;zWSCIG$S|Rtkzqm=Bf|t_xmres2@Q-46Pg(rCbTg! zOkiU0WJqOLwMv$WK|zIyL4lE>l%bOm)LFJ?$YEHuN}Gv6L7$010oja6j0_W|GBQk< z!N@RSHe)^Lgp^bUQ>f;7NSbY!7!>T#G%sgln6QeGVZvHQh6x+c9JiT~VZt^>h6y_v z87AyOa-0hjgMv5I{QXGg2Qe`ygw->FT4y#4H4OC(hD;0!4onOR5n#nL7)~&P95;jE zG?YHa$S{GK!INPYLn%Wd6N5rB6N5r3SnULcbSBWjTr(I}F|1m3k&$5n=;#?nh8YZ3 zp?Ys3>CIzeP$*(zP$*$yP^br~Ekn|L2P6P)|9LXhLJe;O(=!+zLk)WYrC%c%+RDVB z(9Xo5&4dzb( z9d@Pw3VubfxF^F!sQ6_tJ%hmjEMCfR9Tfi{&)tMd7=tBdFjylwegea5Fg=684XVx)tj?1G6apWa7!*E(Q=FMWL6Vt4K^m-h0)s4=p25%nR$I!T z0_IO(P-8}<`er6rs`q5jg39ZG=^3EJH~|zLlaV}U#LS>z!VHf82@GaP22DpY$Ode{ z1O^8%J%eE$)B!GF{saa$Fg=4|Ay|9{!%8FzyqFmje8BP(82rHW42CsOb(>-8>KRt8 z3SnkY2m>pazz_kZXMj%41H1SDOd-RnRdLJ=3JGBO2@FYKdIl&Vg4LZvQkTKZppXTY zpTLlVTVwms-$?Q&M28CW`28Diz8TAa4!HgLU@4<%8VE6>q3`wc8 zm>Cr2faNDJ%tNy5D-*+nzhHHc5|5RcVFEWZB9AX&W>8oG)wc#r&tTwZ29+D744c6G z2@G4nbo~qlA+W>@22m(2!Hg(ab}%z2>|$n6*aKEPfngt#BV?EvCa8ifg*ZZ&nPGw< zm=AIMQDz2(lTdwU!SoCU6Q~_lP};U0$+FAL3<_7785FLA6;A*ibOAWW zn1-ZIn}tC^7c4)4K_AJ!nauSt-+3~aLKRrDFen%@^fD}G*ub!vVH?9vhCK{64Eq_n z7!ENUWvF2|!El=49K%J1D-72eZZX_tc);)&dV<*phR+P&7=AMRVffF$#K_9X!N|?X z$0*1s!U#IQOqNlBQI|oPQH@cPQHN2VF^7pkp&C^FH#0FPOkiSAn8w7Quz-m{VLcOr z!cHazg~Ln?3MZKu6wWg-C|qS?P`J&+pzxH5LE$|UgThZxyMdWOfs>g*fuET{L6n(6 zL5Z0`L4%n=!GM`T!HStd!HJnc!GoDWA&8klA%>YjA&r?qp@5k|p^=$Ep`DpQVFojU zLdqg$289jG3<}$r859mPGbmhSW>C1t%%JdsnL*(bGlRk(W(Ear76t`D76t`z76t`* z76t`P76t`l76t`ta8MdBv@on%6~n}!U<(dG1%`GO1_jVjb1*zTA>W`umX`rE8^*vO z$iToL4aLmhmIecZ^z^^^2HF~y3=9lr43-Rf42BGP3!4z(HD8R~<5Tr35;5PMv|lP@RDRbap4`+&azeYr7518K=MMF>qq`WC+}@*=u0S zHa%~$fx+};lMPnLW-}x*Br-5CWHY2NltJk#1_toBL-F+NDF(r;1q^u%N!xc%F?h?k zeZw>ZF-F!5hCGJ+?T4ouOyy?IWk}l|yx5?Yn>m%CYWnGQ2DaM;)*I~NWz5`uc#pwO zw(V_)4el`2A7JEW=Vy0kmtiSpf6d;`zMQ?E-JE|rYXtLr_6X)DQVz`Q90Dxr9GAtM zITj0KbIf7M=O`B`=g45L=g?u9%puOUo?|`BVUGPQ!kpVVzOXhkYjalf_;YUN&gKl~ zs^;Y8`ObNtLz=6F#hA;T)tu`vOEcGR=E+<(%$vE+3vI9Gy3ci|y&)v-3&b^wso4cBOGB-2Nbnf5m ztGO32Z|62=z0S?da-aJ%_haq?=J(vr-0D09EZRKV*}IwhnVorRSju^JFt6t^VLr^` z$jHtc&MnNlgr#1bmt9hs_dAO}uLnyoZwzxh?`P&@-v2D=yw6#(d2jPp^Im7~=QU?t z&ik3=IPV4K>%8+tUh@X9eCB=5Ezb9zMV(JbN}n&7&zY~AHJgu_zn|~8$ZS3Zmfd_k zEa&+y^WEnA&tt(-!7_oxgoT^+H48UCKdUtVYvvNR0Op;H8|sH^ZN#sZH8yag_^1`F(At`?Zgsm_|sd|tqu_r3r- z%X@+4tlF%~top3iS&Uh;nXOr~nUw{XbGi%WGZzak7VQ_jFFaZBy6AbqJ&d;ndzfDf zE@1gCn80i=w45tjsGgs{TIe*(cAM{uj|Qk%7S$&=naw5Yk1{@H-Y=fdc3RwB;=Fh;|6IlxGc>yv-6VDK5U8 z?J`TbL*OYRrk&&Dl$m~Ao3Zpqus$0bio-j`IbXIsva!2Div z4fA#(P}Rb~z$q&#%fKMQ@>$ZGftmfYBr^j$m=p$+za*KY>KMeqY-x5TDP{(F_Ro@0 z49Z{;bug(7CiU4rOL8(8vwxQKV6X(-$zW3$;xz`^g#P9{Fr=^q@Lo+i-L>?@z z%n6ECbue2W%r@q%2MKkseU{wJXbu*#29x$+(wP&K0NufCZ!j4QCc`;FzKI4K6we8A zVlr4fA50c=ewNHr z|6o~WuD_BJ42M}j35}iWv!op(Hy0=@kAqVTKbS4d1&SZb zC0XkkwZR;HFu9)#Yp{qt7rWFJ24^ta9ZY(I4fO}JgTZ7p7bvvi!R%x( znGPl+!09}j>$9XHLq1rf986YofugmZD_Xjgp`HbtN!qzUKI;Zc_j7@Y%pSJSk|m5b z%&JoS3^vR>Qg6XzFe8Y~1SYG%BqvyW5}2(9CPl#_%3!uWm~;h;+y;}DU{VoGE@H5$ zXLgqcNi3AU%`lzovt%;EX>gDxNr7BFn+sG>%;!p#R%BQV_Qz_jAClaR>$#RoEn-;D z3<|B?T%dfvAMEtQVDdPaJPjr%v+k5>XSfVzpJ(Bg?qZk#P63a(w4^pNyymJ0`FjS7 zf|LrwdoCua$qb*lK{aNx112;EFB|mqjOdx{+ z*wF?o8>IpmHNYX7!}3|uk|9#+vt%lxG&jhh_gO#*P#Mft2b0>|pX((R8H~9>iO8HA z9P3~SdobzF{X>$C!5hquVg4*>z~B#NUuFS?N;H@q4Kn zHz>#N=LR|AI5#M{Wix-4jAb|tmOac0Dpt>PgHrotun02?$j7(A>;mS`k`ovtSnkNo zV0;Z0`3@$3bAOi1uV?tr{aJD~13M2$13wQa41TbJDotS?P%0JY`7CM7Ak9-Ly^%p4 ztfqkFvt%~oX66G@feaUzEu~r*9)m5@2g~*|f0ndj>SvxI)yUw&3`#>T%rB%Y8O*`5 z)?l)L?X#pivptwyZ@~PLJ z()Ai_aRoD|kVyv1ri00BFqsb~i+MgvvNAd{g33fkMp5ZThI+7gGY=>fE$Z1mOKxXq z=K+=ck0C`P&u7UT21Vx2lDioC!Ad8C$v>>0CH0u5gW0orK1+UPm=9(z29wLdqzN;q zbXyJfz-As0dpi#(%65av{X9P;g&2BMk{6%>mRY@a1L7+>>%BIrF>_A}3CNh!wfVD@h?c@ zwDN-Lh$Y}A-FtADNrT1ZdH>c+vN3!I3#o&Jw0S{+sn7dal8I4=4U~n9!Q$3n(jH7Y zgGqNV=?x}5SX!j&7{Yl$EvRU)$bS}4lFSFQi+MjwHZzuk+4a1jI4_31o%-+rm%51yA zKHkp@3bVt!lcXmz{AO7r^`GH4%Qxv3hSR*DD(XB)eLcfv-p`WL7;M<)NV75A=lv{M z!SI;(vt$h8bC5K{dtOjbe+RRFgUSEApgh9C_E|ENiJ1=+yzF3-n-7%x`T0QkUKq^w z2bYf}%%FT!!VF4bAX13oJ~)D;`9Kj=zXHs82`+Bs`F=77K!Eq1%5mq z$ed)p{nE!6*y~wA+Rn3rB$A~*OKLKH2bW*Rz?P+hwUw}Zmh@!G=ld*az)%c!^#j(= zl0HmcQlBMj8Oyo`79a1G@lRL z{;2@h+3&z1u^249989j}`z$$!!GR5=c|BNUGnnLI`!B=KupP|q0oNV-!R*7}z&{RV zp9YiH!J%>=%(ejA@>vR0*t>uo`k3!?y(BZkbFlOkW>85t0UY3;!6M(mlmE*KT8HOxPz5?gGqmWP)LOH zgA!mgKdAf?W(E1?I@l5MU^U5LG9652^Z$_SWylBXD(3$zxs;(CEM5&J>p>2xXK3aJ z^-GxmdhFc~a9ogY+n&gKUtoZH|eX2bGXGK66{KgiLm!D=@1 zgYr%>^JhsmhVA@kW%wEPgVi4fJM=hM&3#sVDK>`F{GinK80_f!Kg=NCoCix^<_A@d z*TL);-~@FW%)ZY*S?U6lZh>bKJqCKbYJD?m&fu+0kG!9!w^K$#elw*^mu3G+*Ge zPyuWVb~HCw#2U<=!uDBm10%oSN9h&@VL?!Nx=9KY9`>L@ubx3%5Y*h325Z>C`dPA* zQC<)fTk2pDZ9$Mf^ucUnK|v{g25T_e9!xreNpCReFZf)VjUgD!4hNIbU~_h`fy|Ew zi^Q;jDx_pEI~`2cJA>P9&a7{w*%-3HLiu2_To6A z-`!wqIHW&IwlS)+e3tBCJi`i7dKj$XxF9IIo(8Mg!w8bSEC`A$Yj8*9x*#Y6_b@X_ z^)ucFJNmI8D7ifs1eF}#;K=o71%>DWmd}#QnBEK4gN*wOwmt#eqD^4_A^DH-x8P^V zOoq>3_x=aVG7EuY8ccG7Nq#UX3?{|Fq%@e62b0QRGMX8bCe(#M5vnZ&$|L$!p|(tieLx!In9L*}<%!Oyw>Fa-26nAV<;*`MT^am^K1<3n27|?agLQ?2 z*$yn9C7YO{g+5CrFvNpJl7&FNPZt7}`T0ViM90ALS+bR>7%W>Z1Wy0;U`{jGMeSgA zw-CtH{b2TFF!>*B%^o&g88(LLV3FBia=s9#ZMYcBUJfQ#gUR(^ax<6=X9cx(qFF)x z-#N^mC3P70gT)UEeU?u zpyI+@7*w-a3xi_FUigT#B7?IqsP1wHtMLbu!NQ;tFj^R7eLPqsSs0Yf(uMhDq#3fo zBKcslSQwOR%E9bvFj)^KXRv*ioXgY<;dFzAwu9Si{lcJj*<@i*_M0vYYSqjJ%lfc< zmORO@8q8*91Nm<~n7vsTlvKBa+4|sAVkQN0?qOk2Iyf#2Drg@tgHph0u$pvmhCdHx z8#9C3Kg`k~Yc7L@u7k(_m7CB}#^k;XH_4&v01;l-Z83F-g@i+!l$K zQDl&21Bu)h36<$$cn(s;u!6Zjij83fGbnk!76BC_*{sE&gvMGS!_V*@Eb^ZDv!oZ} zXOYj6yP3X&b)~R?nkWB7K>a{wQBc#3TNIS$`9;Bf1W{0=)c=+GBPGos59TO~f)b0m zD9Czk(OMZ1Mq{wJIhb^3@sVa@uoeXsO1V;?5fFQ@xVI=MsRo1D;b1aa6x1z`7X>vm zmV=w~$zbtp(aX{j4Eds<98oL^YO+?>gC%sNKy5b&yIu6NWFBKbSe%FDv*c{X$)cYn z3mK=2ewNH&TnrA<`C!@AqMs!fGM0nO^Yvhn&0x}>1>~S=)*q6A4BJIP$*`W)S1OGG z)Yq86uv-+A7xs&SMio!6)q^@;hebi1@Z+K&_Ia@DE{lRX;U;XKCEqaK2OIiW6qKEw zi-Jmp*P@^lZ~^R;&tTc_qM-gz5x8ytTNE^o^k4L|gB;nl3T1( z>HtFuI8=gJKG#b|G4P9liV<-!P{2xyfh>?03y@)BP!2@&L4JP}+LuxG-74_F3{W(`>N#d@)cmTnuKf28Y}Vmd}#> z%(tXK(YIa{lZNN&);}MZ#e6Ff%Cm90#jW76%R39AX6d ztN|>pF8)K(j!|12)JD<=n_v#sWi1YhdwX$^Y0hAgepXPLcNYhRnG73f24OmDJt#A5 z2d89jup)mj84M=F!DKX;Ob7eyG}sZd!JYPauy`_<%w_>~Lej-g$nZ1di-XK829xu_ zEnpuuPz$jftg>1h)U>G=2bG@rp!9FVXbw)*8Z1mwYZ*1bvo+0NrQKlC8Z67g0t)cS zU_+;a$zt#bPoorQ%x5)Nr9B&Hth^fR(Dh&uXRzMQ;-Iqc0P|e{a73{eDNI2eh(%;gUJpSP^0v_IEef${#o)i!+&v5K^_1~6ZH(!!DE<58 z1js4u5}>)sdT>yOfCrPgB|u5W8|)i?2~g09gGKz=K%o-M26C=6SVSI7DocQzr4D9m zOMI66%cKux8-qz}36RI^B`(SEGt?hp{Vb`*=nR(dmH-t*{t}-h(-?xmBH7Jp&{8Tx|}q#+DUGBSY-od#B44Yn*2EG`6Q$AHzdFo8^9 zX977Zo)I)a{U1D;EeRHvVFEdQ9ay~*NTgme1MC}BCQwS=0`@%z*zMX(AdB_SG6W#wQIXRwGHm<$42)(-Y-10yI3%)so!44_egbg*oF789t} z5(GO!1Z;6GQ-;)M$zrheonY}Yu+lWJ^_5JZHoO$rLG@rY-C)_NU`He{fac6+f>lmr z0u4R(g8e!jtY#(HS<2uro((oZt)B4&xK#u4>w2*CCa}`2-~gNlw*Ck>v50{!TL{*+ zgb~ylzQzO^GrI{E&u0L|v_9Ao_rc~o1)FmN?3CAFHSfUW9B_&;0-J2gSPu#o53n1V znL);FVAN&)EV&3Q!pRJBmIWhd&fXequ^l65M8lE+)Jx=K06CovOv*BXhE~-XKuK~f zBWNmGi(xa1o-`-Jb{1P{PKFd_CuueY6Xr!yehkN10;M?_yqUwKMH!~ovm{7sG4!)# zNzZ2h^;@4XfNFGKMi9FNoVBDFL36u0jG%0`oDnqOrUh1G%?N7M|72ih{VTZ(JkKl3 zD8Z61J%h2Gxdd!kwv-=31aqDA69#*!W@%}LdbSQ}Hii`D>C$WrOPH5Q^D){m*RPi5 zXJBXDAPw3NEiI+O02(s11d};nax$1yWVpe+Rr&yfmlUIPE#ngA-BNsv8<H9IFW7)$<^)?zT1WRTHfD3@ZDVPo)T<&xoKn9nRC z!_RPr*-na|A(&N8<|@N_R%IC{hV`r(GENMJQbsat4B@QiGHeXZtZdQ}44^J)y(>cs zvkjX_NXBChxWth#nPezoXo%yf~ z8^d);P>bj>^K}_f2GC$9cReGBI>zA5`cQ_ApB|z-e;I4QvxOgrHlkwnsp&HC?2Ul11V0JT@oB|%CoWjf`#m~?U7MTntwU|Lw zTK#khP_uBh1gHTyU*fam3#P?j>E#liB|k8%mH;(L)=PleeG=d?>&;-5+a*AgaJwZy z4U_#~^(|~5^~r3YHuPbz$Z-i!)tnA?oIQAI>%7Eg$+rxbB|xo#Y&KByL%)l%OswWlLK<#F3Fq
mr6Y$t=+>5`z3%a#PyjjO?G^1=I&E~}LpDmi{Hrqpn z`)ubK?lS&i_{tc_z{PZ)fp_}M_Xf%JpCuK+#RjC_4+j^%t64y`S_QbYp2x_~z{v2B z&6D{i+eyZ&Y-bqnvdPGvV7$V3j`1|(MMgeZ(6UnqE>~k)&!b*2F^}=l;=f-O|KRpj4dDwp zwL4TROyJz&-vXBx|MI;d=Mtb5EO2S@H>QJ&zaCrs`NZNc?pIE^8+qK2Q}Yx!viKw8 zp~XLsEq#YQyuD2F=tHh|alHXb2@JfLU@eHF(vuvvzfw$`| z1%9mECh%~*g}|4!Q|c3qQp{4V(gj|uJu2{gy{W*f^=1MO*PAm4<+_zfmzb1Vlsi3K z`||yI27$NhSsA~sXZyCEUEtw*j$E5Ohx~w|sA9(FYg=EhXAyY6_7BtJwSQl({r7e4 zf5u1a89%RQ68OBHIbAK?EW;|(F3T@R;Pcww0x#Eo5qQ4#E7PO3-@dN>UjJ?F55|XU zf4*G%E72k;BsnFO@y$|&PisH3JYD<0M<$a&l z?qYnncFU*r{EW}n3%pw|m@1oUm1CF7^sIh8-@CP|KCN9V@OeEq)5G<=kJm1HvUYi* zNs>h}YB=gWGjZ|kLh zu9x|>UiR(s?eEu%e^@W^dA%gl!}W5H*317~uTZimsC3DNGOm32r<_mM-g&t;@%`E- z`6fjcrHt>^KL4`zg}|4!PX*queU@mG>XR9klaR~!Z0)1(YwI5~Jzsn4<=Rv4*4}1( zy!P&gwf7hwuf6|m?E`_&YacSGm6pAf|HSuc_0i9(Pkvc_{(Jh*)%RbnUiEtQ#y6|C zzFWQf{p!6{Dph6=S9d;LJ^Q)di`B~n-mZScsHNv9RFwE=^&&>C)e8dzPOn~6YF8Fg zo>Fn#x6EedFWmn@mrZ?|QTP*4Ndy8DFfv^Ktdv?Aij) zg1ExGqN3ua61I;#A6M`EwEFVr)mOf(zWQYKg{P}8zFK{W>E-H!Z&x4swfeBY`_)I7 zzOFv@ZT0c*t52{zS$*o+>eJ6xpLwC@`X^u*vTDebIzuVH?&dd}O`bKkF?_ht2bftRZnFg;$q`2Ff7Uso?>db4`@ z$JHx7tzMbvk`$HPmcsmG_4MbfXS`TF^Xuwa%&%5=y;1AeLw4WIa<5vTP`igI>>%On9|D^MIb>WxQrAo|NtF?WX><`ik5xBHkpYi-^ zy{oHr-mDIOyE@|C>iGAoQ$OZD(R^a@bhY*K)ebLLd%j-n&#blD)Wyi#Dp)8p@5yQl zknO9@gfjA9tv0VPskE!|c(_{r@oFu`cdJ{!uWn;}v%3A$QXYXft2=Vm7S;O~MHH8m zw3POhv%cVbvAX`l>gI2&TOO@$c)Yst`RXQ?N2~K5uhx3EI{(w^f*(siF+Evb^n7*k z&($T2uUD6STwTucaCPO=)m5)oSASYv^Lce`j#qA4UQhla=K|&@tFzy%&iTAL_vi9b zmM5!2Uak&(vpVekYX6_B!&yIYepnszadmy{=hbl!S4X~D9rbQ?G|S`F39nZtepsFK zV|DV+)hR5`SEs#Ro&Irk#@E%EKUZg^+od~YL}cb=wPZ6rULEjhb>QdKLCgEX)HPgZ_;zVfTU=at{`O!B=77$2_u_Xq~eOY;*u~hBr%HK?n zSN?gv^6#&ezZpdGT`R@kbG~2c^>wwx_tnysI&W8VzgsOJ@O8CZzDM#o=UgM zw##FBzVg_+mB&A?JR$ISr``gMKQ2tq2{C#D~ua%{*R~EcoS@>>cQHe`wR9Qhe^XrwVpO%_`TbcHK zWjgcYl~K=DM!#Gc^J!%)^TU;KA6CYHTAA>9Wg^qVl}YdFS0?{lnUYzN=aT1?A6HOS zIH8E?$;z--E5qNfj9_`V((Tzw_m?X@UT@?5zS5KB;Y#nPD}7$9^!>cj@5f4i<_{|a zKCcY?vNGt$%3y&vD?>8vvi)*Wa+%(*bpE>1<;O}_re`ZH-mSF!zS4^MEDW zO68|3RbH=DWqG(#>*-4EcPn+?uhjjxQjg`uN`p5m4d1Uc`moaY=Sq{rxTHk^$%|rB z*k16wSSkN%rNXC`ia%B=JzOdCbfxUGm2%wgWWNi2U&;4V?bk{{B}PzFt{&8ud$+~# z{YswCD|w%DK3~cCawXU6mE4b4vOQVJ{%j=&%Zrsl?^gxsv_rF_tK;Y%dgC!QFPW9z+6^tKO?)kKGFXP*ln?J4G!t!$E)(uy6e&xo`D>tz`S-Je_$`$Wc zuKcia)z_7)1zxV~5O}|GjliRo>$1GE{cob_zwl$R@~zFIj=;M2+; zriUy09h%uAKCJ<>W-W*np}JE2}@QtogjM z_VLQ{XDcgSudD=BE-RbfuWbIhvgP5*`ll-!o~>+Te7v&0?eog^wBx~$>{NBsu58f^RST0&_P-XIP`N>DiF9^I@ z$;|j-CCjgstR;G-Mr8t@S277aU;dZ*;qw3QS2FxueD&8##w@Q~!(5|0r+l9xfyc{# zGre2>?)~!jAC`Y${Ji{A{nzE6SwC@pTK?nn@}Iw!|9Z9j>+9v;-Yox~Ws+@?!}xUh zn|I6K3Vc}plJVv8S6`ODPVq>|Ni9g9lL=~LEPwi9`LkEcpMPHd;^Fd#PnJJ=#;CRY zv5!z@?xW>T1RgEF#`b~d!}41nm*4)n{LZiCcb_c3{&e|`x65w|JYRl4(IhDt%YV}VD@O%wH!>{12ZEjMC%v|RV?a=lN>^%>tUH~6~TkU^vL zz}wd)pX|SBd|N*0`|>S6nY4@?eSCxxOWrL%#H6+SfHSDcwEU33x#b5zE#>70KP_+l zynNnQCaonYj!Uv4g;J|tE^l~k@n(6++vSz-mbbiL-pN=Gt$vs1vuG{Pbu@A|^R)66 zIJdk|;Mnp!fpg3A1uiWwsFJR-c(`=q^W_mQm#4g1p27TL`O#O)k9}Hx{LAtar8Z@G z<#iQ(m5fi9AO5lY2>V-}x69YQTfXkY^7WsWZ+NtP<&)*Bo-SYgYWW(b=gT*KTE6MW z^36=ImT!H(eA~z6_1nSf_k38s_xtjFzn1TRxO~Us$cf4= z$XgVi&+>A4*X!l&Z=7Rbx<|oTDpD)k)ygd8o@*Jl3%R@gc5Bs@1oayQE$Y;x=J}i&s_{jfp zdHm<)315~ceqWySYkBg+-Vmisb4UGDc{x&NEx0biB}rY+i z3}2Qre_hVH0d^ntmavq`YPk);m>jkhg* zC~$V^qa2GIn_RcNfc%_d#z)H;-z{gVXMDKy^Vg+c7@sWt`eo@imM2TUKVACc)zY8u zmi~Ib^f%MvrGH;7{r6?*|HO!-l9Y;!noLj(F8%Ok>BqNAKRsOf_Sw>R&zHVudA{`V z>!nZLE`9oa>9b!;p9?%%`aJ}sS=tDozaA5@T3m{!E{cxmU;r5zuZc70mf{dsARz=x%cOiz|Jzgyb!X=$s# z)1_?!pO>~L8l{D0CgccwTH3(+lH=vl(sxVC>c6BvTw3&KY4P)=C5$hZR=!ngZZcVAzNYP8R zOA~m#bTiY_rK{g9UGr(_TGscR@0V`;v{d)k(oK(+u6wm~{hOs567`aDk_A33UCH^D z|LxLw@0QO0zI4IQr3-&8UG#A2%x6nyJzqNe#nL&imd*uhU-on9@?T3=JY2f?+0rF% zmo7~{^euVO;*=$SQW=EGjo(SWvv|KW<@3_|v@c5|zb;N=)LNPlER>P>eQ9F3Nrgp~ z&C{hJZB`o-Wn>w$%5RYbB`aTdK(TerdqhrGWy^mj;!}mg<#xl?!}d>d*3U zsmJ4`o==u~JzwhmWvP$A!=-*j4#g!U%x{;vd|2xGd8ymarS42GbY3oX{JhkOQA-cn zAZOHCYVRy?ZmEO7qovLny1C-Ht5)RMw%?c93A|dWoS~O#lqK+V zsg=N!rRIzems)&WYMG*u5|$d3K0SubP*V8aQXR%8OZDC@)lbw*ib@uEyi|L72b-Zh zo7R%=iTmbl-^yml#Z-TWF;OR3FysBorGiBd*Pdo9&?*)z{gEk{`hMj@##Eh5!OWM- zB?LkBScpmJqV_PM#LSm#PqC)ErF&%rWHKgc6$!jpds5&Fqt@b$P6Ah41#_OSJtmOI z_%Pxni`MF8&PLv5K2{+DCsr>LIJf+&z=^fT1rDw~!Kk&=*H_@$QeX2#gVdTd!Mx{d zkFw?p=IZ4cl?i-VyjP~^@tM8>l+C;0Te_b9c@M!H}flq6X27 zA;uKDJjN%hEnYBct@iX0IKA3a;K|zkOzC<>7L@|;m+~<_S)KNN?E!&@tMdf&o~%8X zXqO(B!I-F3B=BVIK7sE`6Pa@Lii}DHKCM<0__R7k;L+N>f_dK;d$S~3q!BPOn$vug)v*JQsCjrQvxqm zUYK6UWhhy{N#NY_M1ix5&k5$gUl}2o`f}|C!JIE^HzqozmgLOJXH3z`6L`MVLEz=u z^~@PY*=BiGMFNl4t`>N;c7?#hwJRB)tjvG8b`?{KNuEU!+RK@NB8Iz>~FW z1S{XJv}Z}QNb*Sy$POzO%=o%?8)KeUk-($1TLhl0-7J{+WqyEQ`NOqa1wr}A{fMa7 zVSTS<2fUZv^kGhPOIG&ftPES3%p#rj45wfW&X0N5`lLNQr-tGL!!e) z!q;R)tjUWsh+;gr`s4N0@zW!@4Q17CU0;3t*6R9mYnPl~z4y}Uqo-6 zUF&set@pvTZb#R;A6x5jeD%Q-OKX{rt_?W9((CH-+1FP~d(ZP(!Uf;l;Ifm)0&i#&c|~?eUfRr`Ikxvv|e9wet_JwLY@e z=ICl&#-nQu&aR!ua&oQN<+bKlmjAiB*5cYqCg%f(+)~`a+|xW3`FgTm;=HtW?&alt zSC*?CUaNa#xxmr2icBY$R-a$mbZKb^&pGkSJeSvMTv@9*eJhWlM19G@waSN9e?Pi* z4$IlK+UM5lTw2a>WjXWJ~yKWL=|Ug%h{*Igv}8msWniy4>#CTE25@xzDfVxww}1BG4Qr+wU&SJ z5jeQ~i(tXy<+qqXS-V)^>+%-@kCs1Se7OA7qorpV6Ripa6W=jvE!Xi9xUgJ@F;}Zh z;NjXy0`J#OWX+SyGsrh95zKhGcB){?!{sf4MNb*EmUntH)?Zj_bZL2KqCtjBreMkE zwNn^#wDJTVuAMCKa%mJ(qF%01zQC*1<^rEqeirz|sI|P(Tj0d1a5JUz|FOi0+*IX3%py~#+oCMV~`8V{Lj};5G?(^ z^ou|q0teT2O*iB>RNxI~Owy_pc)PYm;NjZl z>2dsqa`iQgr&ce#w6!<0;ktjF&$Z3ae5`&xuy0@=hs$VUafs~wS?Ac z2}cVj8+RXX#^cKm+*)fQaAs{O)4{c6#}{|rTwKF=bmiGgYs;Ck_41601YWK!7I?e( znZW0zLQIKzsYXQtpVyWMyj{vF@M$TNV8NHA0)j$MGn>7Uj% zYAp(JTxICQnlGPkSL9O4n68x}@MJB>1%-kI?-&0ONMwAm^2N)w1&Ic!F&To{pV#Iy z=NRRh6*fn|yh7guv;w zDa=P!|313<_m#D&S66EXxdrEhED8^0KDheT@wIU`*T&yk{S}n8z~OX#we-=o0Vh_+ zpI_<4cUI~O&y}@dS654bi>HXQYlGn>)KMNtsRSvf4jQcfc6e>zk=4KW&PrY4xwQJ| zwbi$-FaB|Bb^Y1Z8_%tcJ->SIg|#s!cuuTdc53y))2la4j}kOgWd{{x7glymZxb|> zuLl)hx7NBrim%ISeL&?MsOUPq*7MBDSMc)8YmtZdA|IbcDZUIs=M=8;UtOtvZK*H3 z{5rSP{`}%k;PT7<%F4)N{Lmt7CEJdy-UPUN2x*J;95VXgR8$CS^ewg z+6b286HlzvI<+?Y+}hYnYjXrnuT7hNL&Q*)kM-R0!b@xIuddA$IKDP(IVJ$U)^c23&B}OqrNH(uQNu1q zUKLq}2~Xu1Cd@Ttn4mrVt(c+ob{=uV1#I<`xfmE2B=e3KmK@w&e&AyHqV|eK6Dt=j ztYXQr$X&JYp~Z`^uY#%XVujx3el``Xdf~yS)#@XbSn|#zF%K-Dz@*jcVFDNO1kI4Y zob*N5BQfub0{do>&01U3wwi5Y-F#yAX3Z^{+cX8XYHDe3P}``qiFNY{spSws*3Bp8 zLRdl`iFu5lJ->KPx05qW6<+dg(f#*}?tBp}`WpMt@9CuHtAeL*lQT@nmnb!>5c-+> z+*IgA>bqFRw~OL_3T5ZKGfgo{UGywl=s8H{NA7b|*4GlRH|_bfXx1;mqOUP9*E?4h zy)iA)t1@{mSoOkF=ymRAQ=!kLzf21crWY>SRJ6pum_g`8^he!~2A@p6Xnb9vI=xZe zP}R)rrQ7S2cS`R;A;Ofj#w0_jSm2YUVCp-N!NFpgc`tktOWv6ZCV%!U&?^WkiYShI zxQT!IHF-lhrVS#~zsVaOXB3{kPr*=1il;d0VaDgSFM zLg~F=)eBJSGZp$#^}bJ{1*ERigOY_oi!hoGqY2@-vj_$fBUAk{2G=u_%DPoei! zFHD6WrDeW}We_VpaNyabPoF?DHYsL7= zGTwQ;vwPq4X~Ad442@!e7n%Z}G^e+z8>-era!`m^X3`f(4odsvS!Psa_tfQuV8+W> z#-~bOK|w3@IQO}!V9{6445bW{EUR3<5}{WhkABL1Zp!#h>!Tn@8YJ*G_ql1JL6TXj z&|6S0eN+0$Q|MRXC(~7|451A144^a3y%;VkF+6x>$S~orp$fx<>q-m)^(qVkObiMP z{tT;Dol;^@P*q1h=xw^(MkOWL4o}E2Z>u;M7}lFWumd{-1L#n;_1kkb40&0Ya?`d~ z=ol)nZ(nL`D9Xl|xqZ8(VKv)!YX`%VT#T!>GkY7ZRTfQQ$Yn@lh-dI+03CD=V)-$+ zZ(o~dD9W_`Q-R?HCgBu@Oon&{M}~BU42C3zc!nT`(CvGR4HuhluUKuk#fZm&y^39d zL4`qsAx&X=jI@D_$wq|~h75*Td^rpS3?&Q|3^fc53@r>D3_T1J7~FZLFw9{1C^3g& z0Yj_e5{4BF^CZ?V>{XaPPuf7r=b%Eo^b>}+4Br@jG5lj-Vq|0FV&r3-s3^oJ#wf)o z$Ed`p#;C=p$7sYjQ_+mkijh;^j?szHjnRwIk8!SI5aU9{Fvd8>6viyZrHa%4NgL=f z?c$q0A=OM|x`T`Xi>R@{A4Ucy7A6iR9wq@M5he*H879N&-uDf)Rp+snFjX+sFf}l> zFtsyvGxal>3ruF3&NQ28KGR~RGZ9_G(!|!r*2OlPr;p7_ za{8HvhEny%*sjZ;Vtc}Oj%}jACAMp9TpUg^x7hmGggCmD?y)^$d&c&P?H$`Ewr^~z z{Ni%I*#5CGvCkA>W9MRD&cnw(S3rnej9rRdj$MgejeR|jrrc5iEp|P25iSANrwZQO zM(k$nR_u1{Zxx)_-Ppa@{n&%p!`P$PjDj#iGnik%$291}UFa?IqI z%dwDSDaT5VwHzBcwsP#`*vqj|;2_6Qj+6BqXE`o%T;*`&zsYfz;~~dWj+Y#7IX-fH z<@m|*mm`yjk&}~?pHrMunp2)rnNyupn^T|Dm@|~uoYR`qo->-;nbV!qo70~&m@}L+ znlqj=nKPX;n{zHpK4&>+EoUodH)lWRWX|cFvpMH;Iw~&aT+Vrpc{S&H&dr?LId^gH zHL-KXHEJ{Kff?lbws3i=RuFOPouZOP))aOPx!bOP|Y_OM}at z%bF`e&YsJe%bm-c%bzQlE1YYWbTrp$ws@{&u5_+!u6(W{t}?DFt~#zJt~RbNu0F0w zT+_JbPM3aSXkV|yeU3+sTZ>zd+lbqY`-FfMw;lI%B`0n-ZZGaiCO_^V?lA5s?z4(< z+)3PN+*#at+(q1hie=n2+%4Q4+&$bAxPK~4;hw=ghkF6{67Ch;Yq&RXZ{gm-eOP)A z_W|xB+!_2QxYPK~abM!T#(j(X9`_^eXWXy2-*JE9{>J@_`(Hgb6Av2?7ta|1J{}<+ zF&-%%IUXe*H6ASUf%X+IZY0x_J6{Ch<(;nZ+}YXA#dbo>e^ScsB8D)ajURGXCUS3{7UQu32URhp6 zUR7RAUR_>8UK3smUK`#Teg|F`UJu^WY(BgJydk`=gc`Ubcw=}Iczw81cr$o;6?1qC zcuROIcz^KL@V4-F@%Hgf;+@SqpLa3ua^BUv>v=cxZs*<2`%Hd+J?~-O*RA$=;fQpHxRux0P=v-(J3hd`I|B@SWkiz;}i3 zkH8JS2YfI1KJb0v6KDLv_lJ*xpM_skk%OOyUw~hPUxHtTUxD9Irc_adUxQzV-+?wf{{8%i`R^(o=ReJVp8uTiW&Z2@bEIzb z-{*hK|D69d|9gHO!B70(_{4n zJ4IlIz#M@E0!su|2wdS`Bd|eWi@*+n-2(ds4htL?I4#h`d0yZb$7O-*0=EV33p^Hh zF7R3)K;gZ>XMyhm3WC1{{tGY*vI}wxstEE63JZ!0N(;&hDhsL$Y76QM8c(-WFy^g~ zWAPUZ77Q1R7K|567VP3n7t9wd6|5F~!e1}gEEp!&F4!+PU2wkOa>4b2+XeRv9v3_> zcwO+m;B&$Eg5L%I3$hFG3yBNK3#kj~3z-Yq3%LvV3xx~C3#AL?3zZAi3AGCK2u&86 zCA3gzh0uDTZ9;p6jtHF=x+HX4=!wu

OpXP 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 delta 178523 zcmdnc`3<6r(457>n z33>$I`7(7`S7%t=)FvPMlFc{<;Fch*f zFdWD?VCVv=>oQkXdPn)HZ}%^3r@xi3TzAv z3<1Urrfduh53U+B1hX+PG-R7I;goRL_hmsFGulbD>#BrSo^pOUIqlv)gzT)-rT zB$=9rB6*HUlF?%F3nqDFCB-O8>kNU%*T+N zyntDP(PHvWW@!b4tvQ)_sqs1a`NgRy{{F(O$Y?QHj76T&VzL>F5|SSZP@FlrfJK(k zVsamg1d@`XQe-Dj-p3+gjj*sdHLoN-H3!)?xL->$5;HNKEyyYvfY4u_UzCDXGe{yn zz(3eC0;_aY28yGqSfv>)CQoBkl(fjvPf4r{NG;0DPeF~J3#{Ur7CHKv$)&|5Dag9P zVr8jC$YPTX*(Ag*a`bZ&^U^)@((+N{64<2lEOPX7Q%e$~^7B$rtbqupB$l8=^yC$6 zveFhg`UN?qMTt2+jH3Y+H=_X+jH0j+H=?i+jH23 z+H=^2+jH1O+H=@N+jH2(+H=^&+jH0@+H=??+jH2Z+H=^Y+jH1u+H=@t+jH3E+H=_D z+jH0z+H=?y+jH2J+H=^I+jH1e+H=@d+jH2}+H=^|+jH18+H=@7+jH2p+H=^ox970y zgshUC%)p?)&cMK+$H2fa3yL`yAYk(JyBl@pvsy6dF&J*I-K3+-SkKSE#*oEO$-u@S z!Jx&U$Y277(F_g@oeaJV91IQ&o(z5rkqoH}g$z{;4Gie&*%>A=OlO$Gu#jOH!)k^N zVBIDRF#RkH#taG!8Vs!rt5(foV3@$jz>u(tfgxZw1495fnA>%?=(Ou@(QVh=qPJal zi+*#S>=Ge}2ND<=7*+~F@H_?v21W)32JPu*l?=9SZ&fx}$1>ec!@!TxVtTWN!9;#T z24e;*1_K5I1_lNr2BYc9ng;WyugEZ#+Wtb*pn{pve0!*_!C7X;fa#e=2Fi^3(|e5! z!s{P1JY#st@P^?%!zYHX3{?z27=APSV_;-tVPt3IV&r8MU=(2#XXIv3U=m^a!^p$9 zk3og;5yL))044**7$$iJDTXkn3Pv`DYYcZ7)-k#;buq4B{J{8&;R1swLlmPFQwXCR z;}*si#wUzN7+x?OW3*#pV$xw+#CV30gXtZ^Jr71FMh`|I#yN~$ObLvy7%wrZFr+aG zFyt`WFrH%g0`f6q5u+KS7GoWw1fwQ{5z_?5X^b}*zcI2g`Z4k`sWBa3+{I|YgyJc6 z;yjf%o!8hvT(*s=fhm*4lsSWG71IW$C(OPqHq5V?m08X)En%vf?r3aa%HP9O!d${s z&CJ3)kLd(c()4y?1I>DKMmt751_uTv1`sQVK@Z9@fwO`bOc)p$G8tiN^cbw5YOEL> zz%rP6d>BliYV;V~pe#2AA1Di9wog5hLWHrH3d`W?vf$S1F=Rmvv|=cOvJgfibWDLe zL62byRGk}CN4*^*salYAApD8lSqP8RKrKc%YXQhv_26KyVORi_hPeyb5>Ny{q9+Ta z1*`+%cQ<(CAv}W6fgJp>2t-y_k1d{H3geK{KpZ%xVKT&|0c1xYq84TX)DiWJc8s&& zaf@v1ENF;qf;*y#VG~pg*;h?au>!cdIEDhKm>WYMl!ed{#1ID+>tk?WsD}hB)HRHD zj6}Jb(T))j^Lh*^Py25ITIoI-unrB5+|w*C0g)Ebm$&B_~)&A>tR5oFL(W&>O)3(~He> zDGVL;(3nOfq7HZvA`&GcJP<)`1y_f#ZVi%kYoI2_!PAfxLkCn0VM=`mJh+Ip4v``d z84Z!Cmces_9>X%Ibt&*f-UJU-XzBswe}rp-7@ELI3|65~Vih8$5orUFB4$CoU2n(e z#sDj7u!R7&K*JVAh+y`C8g0k80I8~i74V2?0~c(N@;?q8VNKVLwEyCZh!WLnP3EUDy8G(_SK6 z7=(2Q2O=T{;lK`PI|fvY!*cf;c)Q4i0aglR!LuO3F`#k-TK~nt3l4;1^x%#`BtUG= zg63p!I}(;&5SCzzFhn+VtB03j*cHN>3y6vZ5x|Jz2bATIo2b~Ggc+4_4E3<8b_Y@| zxC2^lxxsUC0X#?%mLe=cwEYkvh42m{ED+HK*IUmBiUmlufrtcqEh2nt(p{fBThqWzD^f(Qqiz*7mrx)h{vgXIQnEq&xr09g#`ZJ03V!RkMd zG;$0gdJyA3!oNB1RJ; z@R0(N5xK{NX%Q|x^@zYn1PUbUA#ydMvjwULu{#r8H`dlZW(tG(pG@u0f(kPYz_KEu z>4oqpa_E5bKX#wu3S3OfV5L6ptO{xafWi$a<{?h6XS8CNg~$$!c3ArZpnedlc0_!_ zDqchx2dbcnRSoX{!|DK#HITSRG#U_v3ZhR$o>ia(3bP3w1+e(XZXs$EAgo1{;-KCR zF2AA{X9(S(o)1h9IR269V=UD%{`iK37it{=GaOXL6X-L6`oAFMuzU}06oU&Q{Jnid zYDRY+_Kb(Cn65|Hj)-sc)Qqj+L3n@xJ$%r5gpl?>JUKuz1!D?QPYsrnL7fidkV1q2 zx^84Iz}h^B2tw^6Ld$VhC!hHxu-&=T%yAe)0N#emvcAT`jCu4lyG zVJ5-|0wy5xJ*d<`vYHW;?V<4x>kdPD!yrY3V;OrI!B=E~%!T?JHs%b9e^`*ftVH-3 z(N9D4g3zM`HMN7RfSH5vIcALjihEG;RG)%2zYa)fg0apGa(l??PKuT8(*(y-M1u1qAVFSx6Fek&3c)cAXDDOj*gSs8a2H_gN z0I7i)geb5(fLLaQN!Wtf=`(EvjaUYNC*dSFfkbzq?mgw%hCoQhsX;p&z{wS!v4X0rmVrd{{gpT#cE0V3`b2rXhy_%tVA25N1Ig3M&6m{SI+GLLtafh!}EL9cDCk zbueck9D|5FL|B1LM#=x!EWn@hu{T}tISx$+B>iJ+uYgeVh&V%NL1ZDs7%_Hru-+g-9Vj_N zOa{#^Kv;-Ktw)UKf$}m$8oSZ3rZj4(Ky)CSiqMNt2P)z*)q$s^KF$S6Bu(C zOBrhzSFJkC$`EjZl_B6PD?`8qR)&D9tPBCSSQ!FX!0JG%R;{|r$`J5~l_B6cD?`8= zG`Wwg3<2L*83KN@G6XQNF$Aze^-W_eWn^Vz2;gF42;gU9s1FcfV+fE$Qy|C25TMM) z5TL=v5TMJ(5MYERZ_dULV8g}`;K;@h;Ks%f;Eg69z{U^|%Ek~7#l{d2&&Cjtf+nBI z#t@Ll#t=}9E7jUk|&jUk|ijUiwn8$-Y}HdLR_W@89gz{U`;l#L-^ z6`I_7Him#LYzzTA*%$)$v0({WHim!`YzzTs*%$&Y)Uz=JTxDYjxP@lOT{eb*M{EoM z&)FCP-k`~SWMc^U#>Novn~foWfgROhtn3T{T$KQZPof`a`oj;voi$rurt)7B&dn( z3<1;F83JarGXyMvyB?$&URhJbf)L!6i(fwgMYXLg2wAM6YP zf7uxVm^c^$*f|&icsL+FhWSX4gCRhSgCRhggCRhHgCRhb12sCdI2Z!-IT!*=I2Zyf zIUvyi^A0FF?CLof0-QM*0z5bv0(?0b0)jXg0>VL-G59coEP**EhJzs>k%J*1je{W| zn}Z>sfP*2Rl!GCl3e7^0c`Y0a0i7HS0ex7^nasfuFoT03U@iwkz#q;8MKXqAz(KLL%;zJhJd3`mxCMx3!PIO3<2jk7y_UNF$q>ND$q*pS$q*pH2?=J9QKgK3 z8D%*c0+cuz0@OJf0(3YT0t}JlK{0N|$q-=8$q?Yc$q?Ym$q?Yh2?=Us2m5m}1cY!h z1VnN&1jKPN1SE4Z1Y~g5LllB60vQB~lUz=QfFe$YfO1ZTfErGQfJRP+fHqFlcNIh3P3aE`|VZE`|UBE`|V6E`|UpE`|VkE{1@5P`M8ZCQw2HIYNbtAwZLhAwZ9d zA;6f6A;5x*A;6Xk)%Q+Z3<2(33;{k|3;}^$3<2!W#0p6pe;LEL7y_cX7y=Tw7y?qc z7y`1m7y|OS7y?S54g=W-szLrTuBu;E$;A**$HfrP%*7DU!Nm~J%f%2d3C+UkTnqto zxEKN!axnxf<3gkjP?W9aVhGs4#SpNSiy>ea7el~)H2EW33;`#(7y{05F$7%ZVhFf_ zVs`ziRd=}<0v>TO1U%Nvq3)~C=SGgGin4t;!7B@q{eQt(;Cs4hR;u+Gm zc*)HW@Q#}y;4?QveZV(vhJfGP3;_&05MLoHWaeQA;NW2h;N@Wm5a3}55anSAkiw!) zmWLrgiH9LTorfVni-#dVpNAp91dBRz9)f};RrCM39T@h}A3=V1tV!ov{ooQEOc z4G%-WN2t1bh@lXLUw9Y-e)2E`{NrH=VB}>8VB=*7;0DoX2J-PT1PJpo1W52Q1W5BT z1Ss$_1gP?2I#Pp|AwZXxA;5^2A;6TEA;5~4A;6xOA;1Np7MA{N7~Odp0(^KG0s?s% z0z!Bh0wQ@C0^)cX0+JDmp?Rf-F^!iYAe)yVpn#VlpqQ5-pn{hnpq7^*potfj?I6By zWeB*>%MkF0mm%OeFGIi^s5($ig}7+ds`tDM0bh6- z0)Fx`1pMP=2w>!62w>xbyBicBrHtHs3;_as3<08i3;_~+3<0trMJT20s#QvS3<2tV z3;{ZP3;~9G3;||*3<1^%gTO5=2R?=XS3ZUSFFu9hJaQ+hJY?U zhJao^hJZeR5 z+=Vdr{RQ_&PVg}VoaJK(xWva0aFvfC;1(Z4z_s#806#;(QGSMi zQ~V48XZaZdF7ekx;u;bHkl?z`&k%5jpCRBOKSRJ1eujXT{0sr__!$B|!$Se08dQyZ z<7Wu?&Cd|PAixm7D!>rHA;1v8D*y>Cm?}_vMM!`lKwN+!Kt_NeKwf|$Kt+HdKog`M zwLpZ#y^a7wfS~|GfSCY8fTaLKfSmwCfU^KYfQJA>fUf|=!LY;$a&mwGLqMniLqL=O zLqNO$LqL)MLqNI!LqHA|wS@u<0c8RV0o4Kw0Sy8S0rkxS3;`Vi3<14R#V}WcoH9v( zAz-=yL%zz}dtfT2F%t^h;8BLRkh=b+#~Nj#7Q`AUEx;JpAtz!w3AfS&>k z0sjOT0vH7u0@wr@0=PjmQn~>JHJ>0ufUqD#fP^4JfV3b(fPx@HfGQSs8iEV~x`Oo# z0Y-uh0j7cs0ak(x0rrBJ!RsW*5a2Gz5a1)o5D+NH5D+5B5D+QI5D+H_E5#rU!DK;( zfDA!~fLuX_fFePLfO4o=kPwB0QjH)(K%*c-K${>#K&K!>KwrHeL%?J~hJYD@kdg{H zUO~Q@EyxhCK#(C|sUSnZDnW*TwSo)*n*3;}Ni83H~CG6Z}TWC-|$rVym= zuOLGJlMq7yyAVSFmk>h$zYs%!h!AFK7Z+j(kP%`CP!wVaP!VDX&=g__&;#j%MlU41 z{xTX0G1Lc`2{8m%3o!&Z2r&e>3NZwD2{8otBPoWI2!9zvgct%Mg%|?jgct&ng%|?T zgct&{g%|<~usEPph#{a#h#{a}h#{a!h#{a|h#{Z{MI9(QR;}t6s%Hq8BE%3dQ-~p8 zju1n@LLr8LWhe?EiEyx$un;L%>HNhJbHE3<1A|P!rWZA%*~EVTJ$> zVTJ%+VTJ%9VJyKd%n%?W%n+a`%n+a=%n+a{%n+a_jG2%Pg&6|Ogc$;?g&6`Igc$;y zg&6|sJ%kwoe6biBB+L*HF3b=RBg_yGFU$~-BFqqwDGX`w<}lVU<_I$c6bds0ltJ}^ z5-ucOSFNfPW(cSgW(a5&W(epIW(epNW(b%h4D%Q$LTebO3o``F5oV|lSSZX8utb<4 zU?tQbL@=#dwMLjBV52ZYz&2rqfStk&0sDj*0uBpe~BL%>(CTs>$Q5Y#zawd$8JL%@HKpa??%rwAmNLB0aH z7gW~si7*5Ri!cO8h%f}miZBEyh%f}GBB_J~ax?fHfd9Hi|F=Y!P7y*eSvgun*0U z!y*g;Cqx(m&WbPuTtaiebrFVuJ0c7L4@DRPo{2C7yaww9b*~^<>w^eGz*iB5fL|gE z0slon=?2n!XAxxx;1p#D;1dOha6Nd~2NEc&RtbwT1W1T71jvdq1Sp9z1gMKL1n7vO z`pi(2A;3(OA;4OcA;1Am&Q+8lz)O@Nz+aRhAOuY=Qj{SePLv@aS(G6l11?t&iThkp zhJYebhJbQWhJYHlBt))Jlp&x^lp&y7lp$b(C_}(J1|vo{#zw{t#(u{6jLR6;GHzkq z&3K6MB;y6fYm9dppD?~=WMSfF5@M2MQeaYN(ql4VvS#vT3Sx?6N?=N7%3~^Js$pto z>SUV0G~I$}9@A2$HB6hCb}=1fI>B_F=_=D5rpHXLm_9Q7VEWI*#>~qs!Ys|K$gIJv z&uqqQ%k0AJ%^buWIeq$b4xvnsNxv+A-Mvs$v+ zv%0W)u?Db)vBt0_v1YL5v6iq_v94OB&BLIe&%>Z#$-|)Fz{8;6&cmSKU(ds!5YEG( z5YNM)kj}%Pkk7-QP|m}kP{+fd(8|N0(9gr5FpY;nVJ;7Y!V(?^g>^g(3R`&?6!!2i zC>-HoP&mWGpm3RoLE$bBgTiwj28DM#3<^JZ7!(+I85G!g859J085CrA85ERx85Hz* z85B%;85Hb!85G=k859C}85HUxc^MQEc^MS4c^MQ+c^MRHco`I$c^MSCco`HX@-isQ z}28FqN3<}Hn7!)@0F(~ZjV^BE8$DnYLk3r!MAA`aZJ_d#N zd<+Ud`4|+K`56>=`56>M`56@C`56?{`56>U_!$)J`56@4`56@a`56>q_!$(E`56@Q z_!$%`_!$(M_!$%?@G~gP;IC&;SjNwwu#TTWVJAO>!eM>}g|qw&3b*(f6rS=kD16{& zQ25Qypui@;pdcW?pdc&2pr9_mpkOG#pkO1wpx`3Fpx`gSpb#U#ppYrRpinHppinEo zpwKSBpfE{*L1C@{gTitF28E3R3<|pi7!-~QFeqFQU{JUrz@YF*fI;DHy#Ry4cL4^4 zKLQL2Y=R65e1Z%L5`qj0GJ*^W%7P3ET7nD;hJp+V)`AQQu7V5-zJd%2p@Iwwv4RW= zDS`|Nd4dcIrGg9!wSo)^ErJXRoq`MslLZ+RW(hJVEEHr=SRu%uuwIZsftf*pL5fj_ zv7Ch=K!TMaV4EO=0%#j92Z#XS?FqRC4ouUU3=(Ad89+531A`y~1A`0{GefuG%1p0q zGSJol?;~blU@&67!1IefdOQZ4ub^)BLf=)8^iVsO$H9qvP$ZZjlD_?3=C@O z5X=fSQD?jEJOgt^W>1E|>520VT(_^8Z(zm7n#+*MP(1zdQUhbw0){+>r0K%T3|6yd zFyt}hPv5=FKz90rWd?rR&6XRyVq{KbsM;>Q(mQ7`91B>AIm$(N&Z2esezNkmu@PG3WAUwdOj`($2-qGM&qYc{|s6 zq22XdkGU>$&1SvL)z5aH%ZB+iS2?RN%WP3`?l~;d+zBko+>cp|xtT?>x!ak`xwBcD zx!bwBxz{uIbJufE=Vs=a&HbN!HTMGM?cCO^*SWb_?sI?Ue#~9K{GQvLTb-wbMVn_g zdpC1GvolWvOF7RT=Jh-#%!hd#8QFQGxrKRGu+)q5GD|A+{$}y#4PXi8jbV=G{mq=r z%gmb2`-&O2Y^HE#&ZXWr-B;(VW3)cN?N^!bAM zocSiRX7e%g_wyYWna#I?c{kq#mh*g<`EK+5=W$@EVVS~W!@|${o`suVm{pqpGjj!7 z0P{}9EiBB+Ecd4;-ZBucZ(&guaA8pwkY_a(cr4&8aGf<+-~e;Az;sS+)@6z z;or>O!spq;h0|Hvg%`8U7mgNLF09P6TUeb%n5~?HTO?dWU1YJawg@+y49gK_dy&K3 z-XbrU^F_*8XNw%?+${2i^}2`-%VUw>%)do4SlC7V*~LXGn59K4n4LvESlmUc`TRxo zMGrGOv#w^|&yp@`E?6$QQmVdNv{`gAvk1#+QDdIlqVGkS#pW;zi!pOVvv~6vi-j<| zi&d}~v%ThhSBFK5kWZWqty>=%D6K3jaZ z$b9k7%!|dZFjup@=UXnmT(p|mT;eF>Yv%pp#cZd=-6hV82lKCHozE&P!Cudz&b)^? zSt6V}U1B!#X4dB{%@R|XuQM00JeIgEahus(WHL*?h_Ylkm%5}iySC(U33o|l)?mr| zEa8&k;;Y%NvlL4*vs6n4Fgr8Pmh6^1%{E%UQNdK4v~Fd0g_gq&C}X zmIUV4k{g(J2|FlT=+>A_$RR^tp7cL$RiEPhfy8G_mWN%Am+gGDmf zlBA>=qS?Plnli@MgM}hk-b>mrB!k)MU@{v_=7Y&%Fj>w1UQ&nwqP`g{(#|d|&Bo9V zX76DJIc_@pH<>hs*|Z43FuVqfe+HA^ z!Q^i+>A?I&awCJal!CN0gSC{qOar5}RI1Dk26m43^^(jC5-h6HE{yyf?quz(!Y z&hcK-ow1t(6n*_*b0%}>OA9f~2C?fI=7T7P-C%8t!R+N=rK`d0^@Ul1>btIo?Zd zW32xU7W&Nra`k^Oo0$_7yzHDH_i}U2lwxDx=LGp|KMN>?a#;RJ1~3Y9g4ohvad}Qt zDJ_O(W{`+7SX`YG6e-$ZwlSD(4kmlp-b-#~v<9>7!K8CNm~!U?B|vX5+aFAZgUM)4 zkZp?=x!5nF3A*l+6^|Q zv(>?*HrIPeRz`g=+Zaq9X9bz;&-z}n-i*N>Eac3^EVYHf9nAIylm1{sgTd@@Fd5GU z3aw-?I~`1BgUJ|hI?v~NFR92-3>K*dll5GnXl>>Sm#$#o0OyfzE|ACi!LpON-b;Ga zGfZH6FImE9!>lO9&tSvMA@vqa1~Y=#OklDKOmc$7CxO{&U{Vw;q6}v1gGpDg$Zarb z2__Z6%%I@f&jrf&hrwQ7!z3DOC~XLbHA57!@v&~ z7v|2A31qMUyV`FTfES}8@Dg&y)?Dfp=CAAnPbHA7DWta~ZSqvtZgUJQV|0KH@7BC;Hm*Qtw z4;I?Z4a)2Lxk1(+=LRLTZ07fpu?(ldvZq-=1?qWjP&&U17U5ZcqvFpZmS!Y6f;5ka~U|knjJnf@(`)p7)aV>I~vM?_Q+{6xx< z!5l1W4JJ$2-b=bO+k@E_%%ED}HA|;78$$yNNWD7`i1Y@@)-(9?Y?3l&2nKN&!og%T z56GACJRoiF!4_9AgNm1AuxvV*%m$PBV6vD8l)oJrL4I{)6qIgZs0WKT^MFFphV8xN zc7}EyP?`T4Tqbt&yqC;pP-K2Dxr?E`AFOmTm}FpkFR8~g9n7B1^Iq~Z!+bD%F_>Hq zCQX<@<=Sen4>t3F*xPwPQMMaQ?&tX;Da3G`=e?u_<7u$^^E~e*TNo~b+1GhMso^#_ zyzldX%7(`fmpLQ8IT&B_fMV!9Slefw_mWbK-@)wPVDcikRm02+ zDl@ow!STuqsvTB<8*`t*VI~b0m*)i~$=_fRb+CvwFDNYadEZMiF&ePdgEEgXSi%}i z+Ji}FFzF5^y}@JvOM_G+LpU#}@e~afVFoA3d@#G1_q}8@V>y^z&kL$8o5AdMF#9~X zxa|gun1I_?lfjOd&I>O8XY+zmehABZ$$d=o!HO1x$?q)oQfv&X!R+;5HJicg?O;Fc z2K#tFFDT3o^Y%$kX86ytLh3)mf0pmk?F^@R!IcwO{bk?*E86#h)eBd z5C_Llu@oq_jKR|Etf2I14rW_}Nqas}2nUNq^ML|C zo)2VBGT#B|V+`D^AYIbn##y}7dr3{k|KNh_5ZJEzbg;GxmiLmLO!<7Elw1sU^%K_j zl0HmsQtu^e8Oy04h&Df{<*3gODyoga zBG&w%YH15ID0A*)1d;MA|0L%#*z>=aT*u(d|Gr)_kii|S)Ei9t^MgVnoF9|`qxnJQ zmpCiPH@8_q7RQ6tB!kIxFqzH&MY5M6AFQjG|Gnf=hH|iYHJGdiJE)l-)H!Jfi@ay% zm2ze1=6^34&)CoZUb0?@VKP`^IzOn=oXrnPIQPLx%!TE>WC+7@evqqIgVk*22W6gO z=J%3p4BPq7$?!Am2dh5}cIa`in#Zi#Qfv&T`9aC>IoQ!GEFjOE2g_dOe=n)Ua2?Ek z14>Wz47b6Y`~3Y<#~2=i+0Vgb4f8)qLB<+pP=*1K{0tyc8ccREyauaz%?gSFAGY_B z=1kJ8AZy-(#Xp0|?_lx<>rH8H#^3z!C7(0=2aB)^fWp!TTtV0SFn^I0VFZzB3_i@i zWf~dy!P3HDQXEWPU=5aHV`u?qQF(#)lI4u@;1JRV%PwK=lHz037XU?*IatJ60Mx*; z2eXw~-%E-!I)mBnVA3B<9su{8!t24DXfPQMCX>Nrx&Ww5%my2pFYsRSDnqdVC?A&# zfRZXimpa%HDJ-DIOS1qd>9vFPb_;+)rC$J)nJ0rqri01ZU^C}~+3&$oqs>|m%DceOl}8TzZ=Zn4<-+T$>U)1v;Zh&TowSuGz%N39=Q${zYQk&!J+jW%zh2F zcs_Fi%WBfsD$>2?NTK~Q|~S| z1Vxs*Ah`V376kc2A1rMw$ScLqU=3#5gGpyF=?y0R1z$+BF$9Cz;b77ooH_Tffh>py zizKjtDx`QYI~h!RgX>9e*0<7Z4C!EzY%p0Y_+HYuo}pZ@Op2eO8tjOAK~UY?EC{M9 z+QEvt!Q^y7P)#@+q=8{RSVV*klsOlJ*~`HspEM{3eFg{eYOu(9L6914a71hdi)&X zY!8m29wNeppZDgrYFP3FdZy18%)j@0<{wtgW1c$pa_mXp&n!)UDFu5DtbgSl(}h7ToY`RMBh2q5Pcp0qv)RGXu^!CcEDTDw+reyeaEdXK0y+1vFeptN7X}r& zFPK58;WSuHJ~;QE2eXaAR{oa)*>V{yavkEj+hEO)!9vz7APb&@t$7U=;Rjp)9uh)e zD?barmt4&B9W47BO#T-JRm#p_S#}XnbhxvCqJSUFZeRm>Mi|T%7XgV&gW2*T;P#KQ zNURhagA5Buk-o@dX;%hg5l}2zi$qA}GdP2lx`Ro75m2vh0UKzzHW(}tF9Pbci-Vo$ z4H?D-i>HIhY%p02Cab|@y~umXJ50@BcDo2T{i}dGk=Fx?StRYPN&P{osH-4sKrV2a6mAlc&L?4okEQ8^d`p`?3fq zubp564Q}5SNsy^mWRPbA3EdY7lj&l34py{=IY)|(VGT2=@^~!*DpHDBOJt-OididV z_!-`VMZPn?m-J%%Eb?A*H`8~pt_&7XQ{}%1$Z^b~pk^GmC@9VIi-IzquqY@}eoFn2 zl4g(xvz0~POB&QOsEdNE*A}gl5n(h2OPGU6e-;mEHU?`^Pyv-G1sVsj2a9`)f|6=5 zm>mu#qeVeo^mtKFqhmF=ZJ!Jl&lbHREy0j43d#}1qM+t$HCS9j3e=3N2ea$jMc+&2 zG4_KwA}sGEXERO~eJ@$aI9>F;WCr7WaFEUi%dQrEFS(ErRA6&5tOtv129v=oAO|(G zevu4h*e(i6hV87LQke|x;O^{hQBYpkFA5r4Ji`X+h#eLMb;ys4g4pNl!LGY33hI$t zu)UXj!+0NT=wne(c6u%fDivOff>OX4uv0#RWxtDp`bK%+cK&Zs&~Va!(f5)Um{Qo@ zOP*z77XztR1}8~wu~w-A3@PAH31v|c59Z8Zc`vz~aWa_Q4Q@6igA0>2Z0{v6GtCBz&ldwF z!^L3sYB5mAtzmgD$xrmti+pWjr%TM1l=eO6~`X90q&l zIEY=(a2iB0oClLWEbk>(G4`{rmYL6R9V~JiOx_m*H9#JN+0Vh`YcQD(cH(ETtuky3 z=4|gJ^%;MIBk=;bfcg(s!z>PpN_O%0l3N&3q(BANad2tDEeno%{{@@2I5(bl} znL)|tJXn#kIB4|d5F^NE4PbF~@h_5gjN0O$_L4r>2y?J5YjIHA+lzxta|Vk{X9cBs zcX3ddDX@X&5$1#Ig3aKB>PX?3uET9fa zy7);MeujK;PzEaolgq)a;Q%&JYq1=xvRWL}&H>rt!BEWdUebus8l0#NSpG?_Wi()^ z2bFQnV5Qw)(jF|$!vYHM$zVgLgUNChkTtbZpz)v8V3p2npb_(WutV2_Mcl!9H;aSH zz7x#vCBHCvv%Q!6$kfaNnm5`GHs>fKs65>bR)1I=T>c*y2T8NDfCk6f!Nz@*1jW;3 zu%ZvF?4VwEVA5Iw85N&ju>z<0U}-S4L0p1BZ&POEb^Wa)C&k^1ljwI;X5eUKQV#~{Q*`K1|}JqK!#2OYp4TT76}#? z0<&Yl>RFgTMzAx1oE6Uq8m9iw0GiB}1dGcsftH$k^%ONDibIPZvp$BgE5A= z{=K9&6UcRWU<;VQWDD40Td+1(uw@Qlb|E9kvU0G9Gg!n8Oa_51O9T70fe{o1W?=SV z2GH0*I#@P~2~=GPf*m0O4zpaQ6sh<1lEq-_JHZlVV5OO0>noW+t#>J~gX+O*y1}wj z!H!5^0L_`t1go6L1R8+s1^ab6Sj|eXvy{PsJR59+8si0U^#k(ida&#!u*&+a-~gNl zw*Ck>v50{!TL{*+gb~yZzQzO^I=cxLFJb`2v_9Ao_rV4|1sik&?3CAFHSfUW9B_&; z0-J0K4iyiu6PcMorfp!cT!@s0Y>PzKkGFJ2-<$F@k1zbr?aJZ8;-o@J)*W zq{f;N)T;l@#J*s^pfKZXeAD(NQ-)>8G-(hSXPEz)cZ zDa@0l*%+2EFOueCv|(N@&CkHix<*=*0W@x?!Vpl;EG}gU=H!FP$zW2E;Q{kD=>rUI zQh%jt8J93`m*QjG!hA}ali>j~s6F#o@}4w5Lo;)s6dO1tdozHF+foM5n3fCU24+wj z8dMJc2S>^}uy`X_jWk%~Fqq6_hybPkesEk)0tfq4FbRoEQ$|p;b25Xz<3|E+~r1%-4S>EW^eS z&uSsV#?Z~mBrU-J>XN!Lq%hmcurbVLbCS8lkk9Hbj_^9>nMhWE_8QrwIn@)$!f>m!h}B;Lr> zi!=Ub{s>aa!YbRv5Ge)fJV#1_>bh(R5PLJY_n!|go{Pa`GPqtS2eZ4u)m1f^T@NOw zfCnt6F#nU}XJ`kD^n*z)W>A$jSpw85oGt-sKhBnTFZrULX+BtbvBZ1H4-CsCKy8xM z5}<9biJ(ztTTpyN$jr%MCn$M~Rv%iC7e@lFk zJk0PP%vNCowVT-`L3JiKnB)hO)4`?*OM)yGmsFJEXOISqw}Z`*mjrb}y6eFlbFgJ6 zSV2KF9U>wLnr@m8cD21Es0wxlYxW0|%fV`*!R%mgXFDFuPL>3PT)HHvhFlL;lMNQ% z%m(W7&Idav9c(jg4c0Ij%-#=Xb4r8SIrG6H zi^1e_F!>+sv-4mzt0h5=_uZ@y%Cn6t)=WN&6UbFEqyk|>d{LJRf@SV+o;WyhK zhTCk(4FB1j7?|0kneMYaWOzLNFQZ{`J*XE7Y5-V*3)^roxt;}7msNwy=y{C%42%p< z**ux=vYlkS$##bEA)Bo13C1go=NL~jUS#B#1uauW;AS-j1_r6zGyEk-K9nCyFJH91 zVo6Ztl0#MexwTa>RR#~&&U&Hub-k^?!=;u?S~m4gXCyoX6Z04!E&lsu@egia)eydr zQ%6I!!UWDO{w;8M@h{&SasdHa!2*{Se`7kh`0KI7pHD3Q;(q0dyOGBYIU`SjBa1&W z9$NhK*y8uOMtNq%R+R#e*3J@mx!zjf>3SQ1w@Qp!EBTxS4zJ|T5YI5mG|RTi5qP`a zO5n%Z?E(+iThbCP_A2vbcso+MY+?% zwXfcG3e=}hjuhzbKv-a(~weLQyeb4k^?T3$RKYm*KN#Nz$ z&pdgyMT$jw#YW|RFV^!4JX$Zz@^J0Gm+M8|EY*LzUi8y?F@dM+#q&(^?Fty5F7N%c zb~oe0wOc=}7hrt8Uhv&|p;XyatDJhfT&8F1`QNQw{b}twfzRuCm>#a@d%Sk}leH@n zO_D5<8Q-rh{j|13;M;mGftTyKd2>CB4T=p)OlaYc(Yzp;N5!dRE1Q# z^m?akpB$#A>(!pGSAVl!L*UbTCB{$dmA|i75qQ5|HBm1qAw}THa%1){JYUvJe_Jo} zbG_`Z^>S~QZ+pL9;=_8$&+Da_9G|5*FV~)axAqR> zN(H#UaVd&@OJfMMlC%@p`ye`s~0nBtzHx$aC-IPQoFK{ z@|21*Zz~xeu73D!^&{pN^{cPHS$*T}>YE=|-(q^QeCM0hx4*8w!}wzL-H)s9W!DyX z7Q_|i6%`dXm9Tx}`M7%5r`1DB7XOfOd-db|4YuhmBc-mgB& z^mX;|Z>vvyUwxA0$?DV3R-bvk`s}OK=f1B#pY4Q_5SCp4}4sGkm=3p z`putKZ~3x%E7P;p+kdRy@pJV~#uux1{an3U;Kk~_scxxpX(j0u86BByuX$dtUiWtO z`uD3hd|SQo(c+EIRR2CGS@+{knP?)0@>R zKCWK*Y4xf^m!zoVwiMWPdmS5N!7dOCk`(sP~XPOn$L`n1;b7o%1iIAqt}oUXub zs9k@PNo)02M=fW8b8Bx299w%+;NjYR z)vpDqX0+6f*S5u8w@SI^q55w2!$@G@n>JU2XGx zwd2dxUawaNFl((gb20L^3Kq)Dd$QUR5qzDUZOL)txzOi|YN0B8p2&T1xxMSzmCzSl#epb<4Nat&dhWK3?7Qe04L+ zqt*G3S8KmpUGQmj;g6*snVzgJe!jZo=ju|%*Q?7vuC8EtxVq};>gw04Yd)>6{k*y^ z$1682uP1+za{=>{)j4lg=YC$D_j7p(%ahfiFIR`XSsngTn5v(6LKdg@ZxVk>> z^XmAAtD|16j()c~hUM|<#Mi5nKCDjuu{!1F>Qt8JtJ7bv&iJ@G^XuxYpR2Re?b4kx zA~N%`TC$lQuMYgQI_UH2VCILboj$L2{=VAf*J@Yhm#f`guXca8+T-hLPv$49y`Qi4 zd9&L0?P@=PPpkbCy^_k3+fo)~r!qfVZTn)i-OKvb_McZfuzlwFyjtbUYSnM6)qbs3 zf3{lj#cHLGtCg7^uGVHp8GO&{yLUTyehwUH8QkYJEr zun{=21kSJ47r44wS8KJ7p_Z?}(bal_=9^aQGCp2y^7gb>%OChbw;SoxFb;mR*hR(^fH z@|(ctmEZGB^1TWeAFllLe&uK8N6XJVU-|Cc%J*MZeh_%K@?)Aows^K)jzzA(=ap|6 zAFh1)e&s91hb!NFS*e$1l3|g__-5tv4=Y~?yjl5#@y*Kmr|(uiOY}>sOYTUSl*;mC z<-_+YAAMR{@Of#$kCl&Ep0B+6#^~+J8y{BQ{JQcMqt?o60YVu$A68yxe7W-W*Ohk| zpRBz5cI7?B$1CrDS^0pmRPF1^KTMBT{(Zjk->;Q_7)0`2E5+Y)zF+D6b+zR8)iRYj zZ&&lYTP-N?b+vrHO_5JYKz(UQIpgcqvhP>RF+Ex>@@%!}`_*Cs?^lZpyj?B9^mMh< z^VQOCS9)ifWZGnfWk==4qNdbOJA&1&Y)^{ZI~ z-mPZMT@;?T%r2k1MD{J`+ocOXtvvmC<+&2ADwD@64>LYodExcSivn*~UMdhT&?_=3 z7I?VwyujO)ry>GrmYRQCnf`rc2J_>U(a%=Kyj&UkX=NPq!%8_I;%_qt;4GU!l~LXDh9kU#_%yv(om%O1t{+EA5${u5|pc(&_U` z=Ty&ByR@wIwhX41D^1_5H2bvpKPcm^RQ)*CD-GX ztWQ?5JzL4n@?xdn`;|f;R|?t+dq1t*$M|;TmQO3UvbmAeEUt=y9pn{Slw zQIJxYQIu26{CeevcPlr(U%Bb?%FQfKR<3xua^<^~t3Iq;{dMIUftM>g1>Ub*EAVLL z`Yf+(zubsCmS-y$y;!;U^~xo0S1$dqa#_8=`;~JTpRb(ze&syI=PT#`TDc(2JS{3c zE+a1!9P~53uAKRE<*Z*TXFppx_2tTGuU1YM__VT@>EX)$M=K}1SvisE(aK3rS5E%E za!R6Ia#qTORHjEOyS}gN{;{$LY(Vvgl{Ft%)_z`D_jqN+vz3*vS5|>)nw8D(SGIgz zDcJgOWy8~zjn7s#F+N_|{&{7`^izC>QuUv|EdTv=`QL9V8J{n|`*QjHcgsJNi|6zW({NMZK|9>vN`fDXamRGJ} zu2G&-zE6?B}} zf6Fq-w#Z?uf4cnjyX9{LJ}iI1_;UHnFUw!0c%8s_>J}-a% zaQTBL%O5^t)LQ=NpL)LhG}F`N^%uS_zxaLmB?ifI z%h%$cc|I@a{jyy3>vGBO%hg^lO@Fss;r()@C!9}~^FLoM@^ZO&xfUp7*cjg~SO2_R zgYm_3&6mryvdnVDL4BKit0IAy%T)y4FP9g1v0PE$>vH8Ry=Yz%elFWq+W8qTyFerx#joeRz+H+dJmUt3p`wI zF7Rc!MY?#pNv2&ctK~;O zEkE{U`SDVlvb^%TioQz5r^^rhSbmuOEzjHKYu+ti`(gRI&&$_8TE61R@|91QuX?q7 zHPiFu8$K=H_+$AdrdP|iykEZc-e1f2JzT#1@$wx{m+ySDd{_2? z`l|)W1zv>(MQz24TuYcAEno6>`O^2xmwj5k9Gq$=d|N*8$MQ)}m-jwf-uHfaKl7vI zlbx4@){q3L(6Ny5m5JNdF6}cRqvNqvpinj@@#qQ z^X1|1mbZOa-kuhe=8+zek&(F|i}}g&jOWWUKQGVvxjdWc{qm4c%R_%I4`X_|JmT5% z`p6HEVpC*$oX-( z+mGe$KbLzvS?>IHxyy&;uFTJud%j-o^=7&Em*qapPwSWazF6+}X1V{DDO}BQnQCvPnW)Yx%Bn>rN0GUE@x3<)>?YsT+i7g zSm4Og2ZF}imOcMUG9bTV6nZPBG)7G9G(ua^G(vh-hKL{dpgMMg~~CD%W^-?2Pj`snr2$8VQD`M&h&ucglf9xZ(?@N?-4fuBoXF$k6hzvO?pwCdH;y7x;P zKP_$lxpZ2oQ`wYVd@pNhXhozmLmUew!+AZ*5X#>-f zrA_aaHh)^$BJgx+tH9@_ZHY!{VVMaz0-u)Fv%chbxwPcn($X*K50@4`T3YmcX))u= zr4?_NRx&+YTK#5e&6lOM3{v%Z^DAZF@Vr^N=iSl+Uzc9^w)94&&cmhCpDbO;_;Bf> zmrL&zTNT@tI+c}_Gd*5<`{mL*UzXk#_`dW!`zM}HORs!idiBTBYrmFWf3)=Ceu^OK*N!y7}|cTX|9WSw$?5mM(p4^mJ*|m!)UFFFnVowe+-)P-fnvrDvF) zEUiEIeCeV0OAoWZ<9WCA@Ta9GJ}*7_W$CFWOOHHTdi3SeV{expPq)cZ&a%k%$O+12 ze7khtx25};UN7DLZt0G%OLsE9Te|DR(%k~Dm+nnB$*{|0e6w`x+ojtW-!0wzercM( z=cQXxG*a|Z?a~BZFWtoSbm^*hOILqdx`y>V=li7_J}uS#RljuOqor$KEnW9!>H0*y zq?}}dPfJ&DzU6g|8wbrUrQH0Tsq^~(wWbf&U&$Q_N%3H!1|Z|T)OPn z(&Z1AE_$|f@!O?Kk`H}KUbHx6$)8jPp>pGQlJ6|uFHQcuH1*5Uh_8#&7`2wh2Mc8+ zeqWkUZc<@UW%G1t@SCMk^#bpg<_dgSnkVpZX@0I-u18)~QA=@03G=6=nO~M>eO;RU zV`&c4!==$Lm&Uwi)Y9`4%FchkG>%bgX{@`zxutQ8@0KQhT$&{Ca%l?F^QCF8m!^MR znvrCe=9KQ1&Gc|-`0J$+KbJ-dd|etO@N#Jg|D`JK} z7(1t*6*m-T%$@#J+|aRJtSG-y<|)V1rMlmi`uuXO1XX!U6&c?z_5ZpwK;Ze(z*5;# zy)v(If$vNGSRO8Qf4tP=$x_efOTE4<^%i)z)VIi?xTJ*n?Na9tOI2jp>EX z%cTyVmpU?P=|NlIj9N?WoCVG;wHJ7_)G6I1ODfAD&n2Jv(Nb&KmrG4PEVcQ*)K=i> zQY(R1OO?}2G7>TwA1<}{xYTm`ISE5a;U`PY6K#?*l8aKxQW>8t)qA&8fBG*8LwP=d z$4j*Z-YwP9TJk+{-;(X}l7?JN^=BCqb&>@$-mhFHSoCo18O8#wV!_fMnS!bBS3Y7) z)yWjhe7Rg)5L9=Cn1n8B4--nve7W{CYr0#yS4Kc4W0F>pz>Bq~1imn8E#BxPaK%+H z=lR;>0*QTr8%dZHWSbIX?;M$XnT1$O=1+FdiF;6r| ztw|Hid%pGUUg5_rD)emb}z^mO%%ughZu9<4nh@M-N)!JMzF z=S;sZZKzs*m@&mJkMYTB%NLAVtG#>#POtV7c(V2YQ@UP}MWw*|rF@J}R;RyTdr;uv z>U_bxCuI*~Yxnxr_$^xE&z$a*<5A>S%$Tl~EAVjb4uPjD z&kH8LUF{^8{Cc%2W42bMz{8cN1zxPYIQ_Pap=AALfpg0f1kNr#Cz$_!Wu##0%e5N? zbH1$Il<1UNk~1rxF-0p+;Q3N}ftPDHFlQKLo8?&*2|QlAM&Q-jl>!gfu3~($vf$;~ z)l4ZSc@{;CkJqkyzjnRAvz1l?Pu8v#tbDuDfhEx*$tN`+JFHkR8Qw>I(W;>q0SM6PjOTYdZb>JztCH=J9$^!)05msTG; zee}xd)tk?(jXAq|6U)K1%Z{&&ySz01=GypMtH1g+`E>;>@(Nm%8_aV~{0h&NwP9D6 z&$_lY{N~yv=hlXtU!8VoZRjb^Q}t_uPOlC)yEgdn+Q6f$>rbu@VLQ%qeD&LtYhBJP z^*+C{{@_~2!)u+6u65=*BXWiF%39y+D{tLgdf?2;*JsyyU0UmXaIM?XweH8(dK_PU z=)}?*=A&x^&ad>ox_s94)iU1md=@$TG6?{{(}YjrLy{eNXS)79n7&Ot7VoLpHib6#GW zdS&hOTWggLu9ZE!R_^H12>$a@*Lbe2mAJn8=gqaVZ!MKPzgG0ZTCq!O#jmdZbn;lw z$+bdf)(W3pD{^k_EY{PUr0>FUlM0*3Ue@`v1kX3`bV~IktAjnOv=<@rF7^ zg2o%xP8T%aw0xGp!<8!p-ZN?~|Lh}haQSD!g2&5mGJ*1WvB1~m&jlVWf6VxB`N>C1 z&oCxh6$mE2W7Jx%?Imzwxi(|2R++%VwUY(jubsr2CzofCZ&o6h@pA1n!IX!~n+1!W zGHNaF@Mf&Pu-53(@{UA<43|v7lFw_WGUjOI2|QdoMd0PqNTx)+T%&w}SF0@qKCS#B z@QG1td4;#YiRBgUCLW7oJcUXU-z?2yNp;JK%1JP&8E2?|8YkQ!wchtEaf9Rj^$s)4{cUr`PseUfVBlX6Z|TqicJ$mcDe>au+zX zwnyOL+V1I76%7^Y!x)paDh1xIZ54R9wuL2eQD(-Xiu^_G1&cZ>1&iKr`5K3agy@A@ zL1pOvlgzgKo>IYrH*1>(%O0|M zihCOQn)z7;2%KJgOyJzo*8*49HV9l;*{QYkwUd^cz^S$M0$0}72`0W?+bEd+X>HT= z`AUXjy2S!7*A@vDykGoBAd&IK%9k(K7A6{`#$*U)e_mU_oMV)0R%}%w@Oo{&z{|CH z(;q1r>M|xw7f?17tB({oy*7pU$m-umSO31UHudUiogla1oRCG~q09$YzdF7)4pI(* z@)bB3uCJCkx;Eg%>V)$vz4^{cK}w|6lHd|4;_TXBc%gKZ2T~550+&n&SARRaHt@*m zUwmh!F7aGieGF6#F8*;#a&^Pm)tk<(jXl45--Wd?CwNY*UVduzqSLE4Pv56(sLBp1 zx-P8joc>DLP`(~iVBK2l1}U&Euk`_yaG=8K^jgm|D__G)Ft0@(-iv&E7Nz(y2%S^7 z%71mG*0rTR@FMHnQoHkuKV4jFcWJHtm6cJ)_@RZ?O4c)rSDamZ?%-N0M7ec-t^S4O z+Uys2F03^&zO=mK`dZ^#YfX->H8{R}|B2-lXV)5XT;@kE(r&J`Jh=Sxp|z$b*P5MP z?KOS3ilJnE0dlE!X6egwOJ8$d;=8m~0aR9%UR|q*Tv{EUePXRV3#8n;xR&A4()Jrm z+qo}@T;{yIR^!TA&FgEmF056%xK{nr(x?+0C(_R>FFv_h%hK0dm-FvjuFAA|^}8*rKW|_C#lXbS z%ZPE~()gXLKQV7w{dV)x_^m5{>|FhhZ7cWI+1pot*s=QK&ZY4iSHIo7`u&#G4NN9_ zrgr86n^sFQZCd?@~AHV&qkoWti|nj$y)LLxu_Z z(*rdPrMG8j8ZKe0cjaPWV35o^qEK>hL-~PI<%=3B7IjrFnpMS|W0JdS!V8nHf~oIf zh2G|VHWjRTp}?fo>S5v|mRR!6BQfu@r(j|p)603E7rA~B@<_~M{OtZkfqk>cX00u1 zTg|qyZa%Sev*s4fZJGjGHMO)isBKi*#Jc&!M2Hyc<`eCkHHAUa5WSvXJcT_H^S;CY5c-+>+*IgA>bqFRw~L~F z3T5ZKGfgo{U34c~=s8H{NA7b|mZG4li05&i7WMxUEczP5sMQK~w{vCD8&jdzxt~pi zK9~LidCIf!U}E8-HAPE2ix~u8gnrchXzAIgI3v$=ePcr@ zDc0hshZ&#Sz6ch4S=7M3`N)yYt4?fLb#&{hL(`Lu4Vy*t-hs?xOwq|>eCPRIS>T~z z;)>Ggzl{x*Uy;J%unETl@{jg5f zA&;y@TeFw&<}BHe%OFse`Ofs+60T2vpG&?hn)MTEgs)g-?kBJjj2X-Pr`MPmO0syo zT*fthrir1ec-l*lS&1g8R%s5ILhnE!^&|JQ>GVG)hRYeJZ(m|+$i&FlGkv+4VKQU( zbZ&D)Ii_Xbr)!%V+A{J^&onpu8XK0hq$!yzU#Ci}%HaKytsrYX8DA*97p!^#3UJeW zg95W6q0ecbJcS;DjjwuPnqrY^m*JM>lP&Zp@l&kO`>GeF!jIB2-^2=iN`2=k^t0-P zDT8R~`bQnpk69R&n?BNeX7m~qV4(CNnD@rBbct-4Nu^bl-$S9|;-8vAZxTP5GQZGz zqxMeegJ9w(Q=vzRzos`^8rDkjl!d;qePQ>`=~LTh#te;Offt$rpELzCUdB!rvochz zPy6IqrdMV4RIuo)C*xD4ub|KndYt>*G)p?mAlIct=vD4#Q^t2%9|d!tn}Q|Z<~}z~ zGDtPc5c&j4eZN4~y-j@=yK2=cR)$c9c!o@d5(Y1Z8%hihJ{U4gU^Zfya9@c*pk0MQ zfQdnY!JlE(s*6et3R3EzW7OCnt5T*bG?**OctQ?OTg$<~u+s#B9oZQe7#SECc5auo zHsod5u4iv3$IeyEkegW?@0*&Ew%yasP=alHs*hm>8*^ew(e~>>hUd9h85mL-@}^&$ zX(+t?K&;^uz~`kg#54FZq%x#1q%p)Z z_%XO|uWUBF%CtSL&2XOi^pG|~f$e|x8tyUTabz!JS71 zVKHA0LjgkxLj^+(Ljyw#LkB|-!vux^o+%7782(GlVOYR0S#b%&3WhZjYZy)|Oy4JM zAjN!MA$PjrM?+z=`HDh}VvJIZa*RrhYK&TpdW=Sl%N5NStr*4S?HHXH-59+X{TNp( z1~INz3}cLAOkvDo+^jfVPR2lw=`i1P9~lD)Q5%6jj0{XHOdL!+Oae?IOcG2oO!m{S ze>BuqoyA_lRKZlk)WFoj)Xvn+)X(G~FqvsO(`=^sOpBS8Gp%M?&vbjb`X@tA=@cF( zW;bRpW1xpP}B0~d93(I$|4wfF4 z2`p1sX0SN$&0$%<@}Fx7%NmvqEI9&OSiBW?uc;BD>c<+y8payM8poQ%`iQ+zFpV{fHIKE3wTv}hri!(WwTZQjwTrcn zbrS0|)>*8Ma`RXhu`Xj>#k!7l6YDnCU99_953wF&J;i#C^%Cnf)?2LiSm*FOVtvN? ziq(Vf9qaUepA9AI)!DS!^x66ZjM>cDtl8|@oY~yjyxIKOg4n{?qS)ftlGxJNve-Vc z=dqQram!Y*S&FV;sbgzmYhzo&)5Yc?*~d1CZ5rDwws~xe*p{)aVq3?yiESI(F1CGa zhuEIVA7gvVcZzM6z&W-{Y-}6>GS}F;+4wkSD&1nc$M%Tr8QZILws&lw*!1{S<-W1~ zV*AIoNPvl*jeP?T7yB{+K6W8?F?K0-Id&!X9X#f8>jc!;wb(cVqWr_hS!Y4`YvF|F00op2VKUp2eQWUe8>_{*bqnefpm-hGsEmc%HJq zWPi*4k^L+CPxim;j2x^SoE*Fy5!`|tq8ySOK^(FiiX5sOnjHM>x*WzF)*Ox;?i{`x zfgIZeLOCKiVmT5y5}8stGC6WN3OPzSDmiYm)^ap*oK|e*nBMo*P|9PMz+R4n97j1$ za-8M3$l=9*mE$JIU54pvTXPGL@QPH9egPGwGYPHj$o z&NyCUPIFFc&J=EY&gmb%8j7gTWXa|%=B(swm27dIC_moS$&mo%3=mok?+mo}F^ zmkO6LmpNCSoHds{mot|;mp7L`S1{KJ>2R*)Y|&itT*+MNT-jWC(s=YGxop8GTRckbWZ|GAm#dDwZldH8vRd9DhG^GNf^^CD=PBkX=Sh{T=Bejd zsnpEV&eP4)&l4&!nP)oBY@Yc%i+PswtmawIvzcc*&u*UmJcoIX^PJ{6&vTjQ8qY1B zue|qo9`V#a<9WsNj^{AjC!TLSzj*%fF!8eSW-D^>^6?7sit$SE%JC}ks_|;^>hT)! zn(%o=FTgWS|Sjt<;Tg%(X z%gEQt+siwdcRKHE-X**%c-Qc5;N8NzgLe<_0p26LU+U#g@SfqlzJ{~>+zNP#ke4(Ned@_6rd@6kEeA;}IMfCZM`ONvO z`Rw_e`P})u`TY5U`NH|)_>%aTWz+bw`11IQ_>S_I@m29{R;c4^;@c|S#@EGHCEmw3 zi7!ZD8s99w`gwfyii`M`@vY)p$G3@Z8{aOzeSC-bj`5x1JIi;G?<(I-zPo&^f)Dv# z@_pp{$@iB}oRN{Am7kNJmtR>?kYAKvl3$izkzbWxliy#aSy7kYkl&QwlHZnJUD1)> zmEV)!mp_0%gg=5mhQD30M<#(kg+GHohrfVdn74$#g1@Gozk$DnU!1ptzlVPU{}lci z{B!sh@Gs#%&D5>9f`1+V7XDrQ2l$WhpWr{k|61_^{}uil{FjCA@IT;RCG~{=1^*lV z5By*FfAEV6{^tMB&n&<$z%9TpAS@s*AT1y-P{pe(FjYcbKwCgxz*xXsz*@jwz*)du zz+1pyAXp$=AX=b4UO-kbSs+~?TOePcSRjI{T%cZ{RiIO#S0GAZqQF#vnF5xwa|IR( zEEQNOuvTEBz+L{W0y_ov3LF$TB5*?BjKBqfD*|<#Hw3H+z#D-N0$&8; z6n+T&5nvG16l4+P5abaQ5EK#A6_gN^5mXRV5!4XW5i}4q5wxfmv=MX=bP@Cr^brgY z3=xcCi4cqtOb|>F%n+Q+mm^prSS8pX_?Ev#utP9Ku19c+;2gmvf@=h~2<{O)B6vpd zir^i=CxUMTzX<*jWD(*K5)qOSQW4S-G7+*7auMBEzT|>EFmwUEny;IE8!;LFA*UTFOepZD^Vg*Ezu;= zDKSA}ro;k?9@RPKZbdvOz z43dnLOpr{M%#$pYtdVS%?2?=;IY)AZCe)?q#0#6WcX#oWMpO3Wb|b$WE^F@WP)X)WRhiaWJ+b~ zWZI|8{xy_Te9Kze zr4=8`zLNbc`$v{lj!#ZpPC-sn&PdK$&PC2wE=(?7E<>(x`pmzE()Cy6?#Mlrdnfl@ zjzOMNUPxYAUPWG4-b~(J-a|e_K0!W5zEr+WzE!?QezN>5`Ni_9ap ziUoqN6yGU+Qv9a)SCLJLONmcugOZSvn39x|oKi8Dl9Gm!o|2i8jgpg+hf;u2gi@SR zic*$Rfl`@LjZ%|Rhf<%?6r~wFN^_JJC@oQ1p|nP6{dUX$hW1R;s~C+eRIUlGQ+y;C z$*@cDm?9&?2gXZ^_Y_|#ep6&)dMC)IB*P@7^h50rn@{Cc_8<~x4In#tDY0uMMrCl`rII~eU zW8HLP7Ncy&uIckxj700F2|dz(r~gZz&0vv`kb#_mnE@w{lYt12pFxyCn!!4uB7-`E zE`wb{(+n0FtTWhUaLnM6!99al2J$@L444d$Gw>No8LAl?8QK|o8HO1$Gbb5p@#Gm+ z8MYZtGUQ{PXLwFvo8ckDbB4DJpBer$6f=4z@Jv9-NYBX1$jvCoC~mqbtC4cOnX#X7 zlyREzF`-LBMaFf;UB;5k(~K7xuQT3de9YLC=aTU~V+WpB##*BHgkA}KGge_{GT}3k zGEpqh%IupNlR2Ncl=(UyHFG2LLS{R2 zFY_exJo6(w(=FJHV@sBysW~klC1Kq zs;sJn+pH#8&9iC~US+k-YLf6FtIf>ktZrF7v-)K9&x*@h%v#BMp0J*EyQc@QmGuh- zH|rqlIP2BCS=MFNP1b$Zv#gg{Z?ZmRea-rj^(x_C)pqv+1�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