2021-08-24 19:50:18 -04:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								/*
  
						 
					
						
							
								
									
										
										
										
											2022-01-31 13:07:22 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 *  Copyright  ( c )  2021 - 2022 ,  Tim  Flynn  < trflynn89 @ serenityos . org > 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-24 19:50:18 -04:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  SPDX - License - Identifier :  BSD - 2 - Clause 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 10:27:46 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "../LibUnicode/GeneratorUtil.h"   // FIXME: Move this somewhere common.
  
						 
					
						
							
								
									
										
										
										
											2021-08-24 19:50:18 -04:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								# include  <AK/AllOf.h> 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  <AK/CharacterTypes.h> 
  
						 
					
						
							
								
									
										
										
										
											2022-12-04 18:02:33 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  <AK/DeprecatedString.h> 
  
						 
					
						
							
								
									
										
										
										
											2022-12-06 02:57:24 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  <AK/Error.h> 
  
						 
					
						
							
								
									
										
										
										
											2021-08-24 19:50:18 -04:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								# include  <AK/Format.h> 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  <AK/HashMap.h> 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  <AK/JsonObject.h> 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  <AK/JsonParser.h> 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  <AK/JsonValue.h> 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  <AK/LexicalPath.h> 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  <AK/QuickSort.h> 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  <AK/SourceGenerator.h> 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  <AK/StringBuilder.h> 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  <LibCore/ArgsParser.h> 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  <LibCore/DirIterator.h> 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  <LibCore/File.h> 
  
						 
					
						
							
								
									
										
										
										
											2022-02-06 15:55:17 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  <LibCore/Stream.h> 
  
						 
					
						
							
								
									
										
										
										
											2021-08-24 19:50:18 -04:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-12-04 18:02:33 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  DeprecatedString  format_identifier ( StringView  owner ,  DeprecatedString  identifier )  
						 
					
						
							
								
									
										
										
										
											2021-12-13 12:58:40 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2022-07-05 22:33:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    identifier  =  identifier . replace ( " - " sv ,  " _ " sv ,  ReplaceMode : : All ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-12-13 12:58:40 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( all_of ( identifier ,  is_ascii_digit ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2022-12-04 18:02:33 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        return  DeprecatedString : : formatted ( " {}_{} " ,  owner [ 0 ] ,  identifier ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-12-13 12:58:40 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  ( is_ascii_lower_alpha ( identifier [ 0 ] ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2022-12-04 18:02:33 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        return  DeprecatedString : : formatted ( " {:c}{} " ,  to_ascii_uppercase ( identifier [ 0 ] ) ,  identifier . substring_view ( 1 ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-12-13 12:58:40 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    return  identifier ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-01-13 13:10:24 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								struct  DisplayPattern  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    unsigned  hash ( )  const 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  pair_int_hash ( locale_pattern ,  locale_separator ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    bool  operator = = ( DisplayPattern  const &  other )  const 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  ( locale_pattern  = =  other . locale_pattern ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            & &  ( locale_separator  = =  other . locale_separator ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-11-18 11:04:33 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    size_t  locale_pattern  {  0  } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    size_t  locale_separator  {  0  } ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-01-13 13:10:24 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								} ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								template < >  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								struct  AK : : Formatter < DisplayPattern >  :  Formatter < FormatString >  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ErrorOr < void >  format ( FormatBuilder &  builder ,  DisplayPattern  const &  patterns ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  Formatter < FormatString > : : format ( builder , 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-11 17:32:29 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            " {{ {}, {} }} " sv , 
							 
						 
					
						
							
								
									
										
										
										
											2022-01-13 13:10:24 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            patterns . locale_pattern , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            patterns . locale_separator ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								} ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								template < >  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								struct  AK : : Traits < DisplayPattern >  :  public  GenericTraits < DisplayPattern >  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    static  unsigned  hash ( DisplayPattern  const &  p )  {  return  p . hash ( ) ;  } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								} ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-09-06 13:56:44 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								struct  ListPatterns  {  
						 
					
						
							
								
									
										
										
										
											2021-12-13 12:58:40 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    unsigned  hash ( )  const 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        auto  hash  =  pair_int_hash ( type . hash ( ) ,  style . hash ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        hash  =  pair_int_hash ( hash ,  start ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        hash  =  pair_int_hash ( hash ,  middle ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        hash  =  pair_int_hash ( hash ,  end ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        hash  =  pair_int_hash ( hash ,  pair ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  hash ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    bool  operator = = ( ListPatterns  const &  other )  const 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  ( type  = =  other . type ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            & &  ( style  = =  other . style ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            & &  ( start  = =  other . start ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            & &  ( middle  = =  other . middle ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            & &  ( end  = =  other . end ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            & &  ( pair  = =  other . pair ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    StringView  type ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    StringView  style ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-11-18 11:04:33 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    size_t  start  {  0  } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    size_t  middle  {  0  } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    size_t  end  {  0  } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    size_t  pair  {  0  } ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-06 13:56:44 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								} ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-12-13 12:58:40 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								template < >  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								struct  AK : : Formatter < ListPatterns >  :  Formatter < FormatString >  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ErrorOr < void >  format ( FormatBuilder &  builder ,  ListPatterns  const &  patterns ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  Formatter < FormatString > : : format ( builder , 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-11 17:32:29 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            " {{ ListPatternType::{}, Style::{}, {}, {}, {}, {} }} " sv , 
							 
						 
					
						
							
								
									
										
										
										
											2021-12-13 12:58:40 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            format_identifier ( { } ,  patterns . type ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            format_identifier ( { } ,  patterns . style ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            patterns . start , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            patterns . middle , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            patterns . end , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            patterns . pair ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								} ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								template < >  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								struct  AK : : Traits < ListPatterns >  :  public  GenericTraits < ListPatterns >  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    static  unsigned  hash ( ListPatterns  const &  p )  {  return  p . hash ( ) ;  } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								} ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-07-05 19:40:40 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								struct  TextLayout  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    unsigned  hash ( )  const 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  character_order . hash ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    bool  operator = = ( TextLayout  const &  other )  const 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  character_order  = =  other . character_order ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    StringView  character_order ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								} ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								template < >  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								struct  AK : : Formatter < TextLayout >  :  Formatter < FormatString >  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ErrorOr < void >  format ( FormatBuilder &  builder ,  TextLayout  const &  patterns ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  Formatter < FormatString > : : format ( builder , 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-11 17:32:29 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            " {{ CharacterOrder::{} }} " sv , 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-05 19:40:40 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            format_identifier ( { } ,  patterns . character_order ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								} ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								template < >  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								struct  AK : : Traits < TextLayout >  :  public  GenericTraits < TextLayout >  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    static  unsigned  hash ( TextLayout  const &  t )  {  return  t . hash ( ) ;  } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								} ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-11-18 11:04:33 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								using  LanguageList  =  Vector < size_t > ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								using  TerritoryList  =  Vector < size_t > ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								using  ScriptList  =  Vector < size_t > ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								using  CurrencyList  =  Vector < size_t > ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								using  CalendarList  =  Vector < size_t > ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								using  DateFieldList  =  Vector < size_t > ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								using  KeywordList  =  Vector < size_t > ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								using  ListPatternList  =  Vector < size_t > ;  
						 
					
						
							
								
									
										
										
										
											2021-12-13 11:59:21 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 11:48:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								struct  LocaleData  {  
						 
					
						
							
								
									
										
										
										
											2022-12-04 18:02:33 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    DeprecatedString  language ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    Optional < DeprecatedString >  territory ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    Optional < DeprecatedString >  variant ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-11-18 11:04:33 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    size_t  display_patterns  {  0  } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    size_t  languages  {  0  } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    size_t  territories  {  0  } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    size_t  scripts  {  0  } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    size_t  long_currencies  {  0  } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    size_t  short_currencies  {  0  } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    size_t  narrow_currencies  {  0  } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    size_t  numeric_currencies  {  0  } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    size_t  calendars  {  0  } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    size_t  long_date_fields  {  0  } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    size_t  short_date_fields  {  0  } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    size_t  narrow_date_fields  {  0  } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    size_t  calendar_keywords  {  0  } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    size_t  collation_case_keywords  {  0  } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    size_t  collation_numeric_keywords  {  0  } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    size_t  number_system_keywords  {  0  } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    size_t  list_patterns  {  0  } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    size_t  text_layout  {  0  } ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-24 19:50:18 -04:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								} ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-09-02 17:46:35 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								struct  LanguageMapping  {  
						 
					
						
							
								
									
										
										
										
											2022-11-18 11:04:33 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    CanonicalLanguageID  key  { } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    CanonicalLanguageID  alias  { } ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-02 17:46:35 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								} ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 11:48:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								struct  CLDR  {  
						 
					
						
							
								
									
										
										
										
											2022-11-18 11:04:33 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    UniqueStringStorage  unique_strings ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    UniqueStorage < DisplayPattern >  unique_display_patterns ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    UniqueStorage < LanguageList >  unique_language_lists ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    UniqueStorage < TerritoryList >  unique_territory_lists ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    UniqueStorage < ScriptList >  unique_script_lists ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    UniqueStorage < CurrencyList >  unique_currency_lists ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    UniqueStorage < CalendarList >  unique_calendar_lists ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    UniqueStorage < DateFieldList >  unique_date_field_lists ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    UniqueStorage < KeywordList >  unique_keyword_lists ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    UniqueStorage < ListPatterns >  unique_list_patterns ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    UniqueStorage < ListPatternList >  unique_list_pattern_lists ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    UniqueStorage < TextLayout >  unique_text_layouts ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-17 08:20:19 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-12-04 18:02:33 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    HashMap < DeprecatedString ,  LocaleData >  locales ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-17 08:20:19 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    Vector < Alias >  locale_aliases ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-12-04 18:02:33 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    Vector < DeprecatedString >  languages ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    Vector < DeprecatedString >  territories ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    Vector < DeprecatedString >  scripts ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    Vector < DeprecatedString >  variants ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    Vector < DeprecatedString >  currencies ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    Vector < DeprecatedString >  date_fields ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-01-12 17:16:12 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    Vector < Alias >  date_field_aliases  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        // ECMA-402 and the CLDR refer to some date fields with different names. Defining these aliases
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        // means we can remain agnostic about the naming differences elsewhere.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        {  " dayperiod " sv ,  " dayPeriod " sv  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        {  " week " sv ,  " weekOfYear " sv  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        {  " zone " sv ,  " timeZoneName " sv  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-15 12:23:26 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-12-04 18:02:33 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    HashMap < DeprecatedString ,  Vector < DeprecatedString > >  keywords ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    HashMap < DeprecatedString ,  Vector < Alias > >  keyword_aliases ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    HashMap < DeprecatedString ,  DeprecatedString >  keyword_names ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    Vector < DeprecatedString >  list_pattern_types ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    Vector < DeprecatedString >  character_orders ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    HashMap < DeprecatedString ,  size_t >  language_aliases ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    HashMap < DeprecatedString ,  size_t >  territory_aliases ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    HashMap < DeprecatedString ,  size_t >  script_aliases ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    HashMap < DeprecatedString ,  size_t >  variant_aliases ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    HashMap < DeprecatedString ,  size_t >  subdivision_aliases ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-02 17:46:35 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    Vector < LanguageMapping >  complex_mappings ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    Vector < LanguageMapping >  likely_subtags ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    size_t  max_variant_size  {  0  } ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-24 19:50:18 -04:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								} ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-11-23 11:54:53 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								// Some parsing is expected to fail. For example, the CLDR contains language mappings
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// with locales such as "en-GB-oed" that are canonically invalid locale IDs.
  
						 
					
						
							
								
									
										
										
										
											2023-01-14 16:34:44 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# define TRY_OR_DISCARD(expression)                                                                   \ 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ( {                                                                                                \
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        auto  _temporary_result  =  ( expression ) ;                                                        \
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( _temporary_result . is_error ( ) )                                                             \
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return ;                                                                                   \
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        static_assert ( ! : : AK : : Detail : : IsLvalueReference < decltype ( _temporary_result . release_value ( ) ) > ,  \
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            " Do not return a reference from a fallible expression " ) ;                                  \
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        _temporary_result . release_value ( ) ;                                                            \
							 
						 
					
						
							
								
									
										
										
										
											2021-11-23 11:54:53 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 11:48:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  ErrorOr < LanguageMapping >  parse_language_mapping ( CLDR &  cldr ,  StringView  key ,  StringView  alias )  
						 
					
						
							
								
									
										
										
										
											2021-09-02 17:46:35 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2022-11-18 11:04:33 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    auto  parsed_key  =  TRY ( CanonicalLanguageID : : parse ( cldr . unique_strings ,  key ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    auto  parsed_alias  =  TRY ( CanonicalLanguageID : : parse ( cldr . unique_strings ,  alias ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-23 11:54:53 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    return  LanguageMapping  {  move ( parsed_key ) ,  move ( parsed_alias )  } ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-02 17:46:35 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-12-04 18:02:33 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  ErrorOr < void >  parse_core_aliases ( DeprecatedString  core_supplemental_path ,  CLDR &  cldr )  
						 
					
						
							
								
									
										
										
										
											2021-08-30 14:56:23 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    LexicalPath  core_aliases_path ( move ( core_supplemental_path ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    core_aliases_path  =  core_aliases_path . append ( " aliases.json " sv ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-02-06 15:55:17 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    auto  core_aliases  =  TRY ( read_json_file ( core_aliases_path . string ( ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-12-21 11:42:06 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    auto  const &  supplemental_object  =  core_aliases . as_object ( ) . get_deprecated ( " supplemental " sv ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    auto  const &  metadata_object  =  supplemental_object . as_object ( ) . get_deprecated ( " metadata " sv ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    auto  const &  alias_object  =  metadata_object . as_object ( ) . get_deprecated ( " alias " sv ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-30 14:56:23 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-09-02 17:46:35 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    auto  append_aliases  =  [ & ] ( auto &  alias_object ,  auto &  alias_map )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-30 14:56:23 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        alias_object . as_object ( ) . for_each_member ( [ & ] ( auto  const &  key ,  JsonValue  const &  value )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-12-21 11:42:06 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            auto  alias  =  value . as_object ( ) . get_deprecated ( " _replacement " sv ) . as_string ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-31 10:03:49 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-09-02 17:46:35 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            if  ( key . contains ( ' - ' ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 11:48:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                auto  mapping  =  TRY_OR_DISCARD ( parse_language_mapping ( cldr ,  key ,  alias ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                cldr . max_variant_size  =  max ( mapping . key . variants . size ( ) ,  cldr . max_variant_size ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                cldr . max_variant_size  =  max ( mapping . alias . variants . size ( ) ,  cldr . max_variant_size ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                cldr . complex_mappings . append ( move ( mapping ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-02 17:46:35 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            }  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 11:48:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                alias_map . set ( key ,  cldr . unique_strings . ensure ( alias ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-02 17:46:35 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-30 14:56:23 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        } ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-12-21 11:42:06 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    append_aliases ( alias_object . as_object ( ) . get_deprecated ( " languageAlias " sv ) ,  cldr . language_aliases ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    append_aliases ( alias_object . as_object ( ) . get_deprecated ( " territoryAlias " sv ) ,  cldr . territory_aliases ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    append_aliases ( alias_object . as_object ( ) . get_deprecated ( " scriptAlias " sv ) ,  cldr . script_aliases ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    append_aliases ( alias_object . as_object ( ) . get_deprecated ( " variantAlias " sv ) ,  cldr . variant_aliases ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    append_aliases ( alias_object . as_object ( ) . get_deprecated ( " subdivisionAlias " sv ) ,  cldr . subdivision_aliases ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-23 10:51:10 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  { } ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-30 14:56:23 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-12-04 18:02:33 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  ErrorOr < void >  parse_likely_subtags ( DeprecatedString  core_supplemental_path ,  CLDR &  cldr )  
						 
					
						
							
								
									
										
										
										
											2021-08-31 09:40:24 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    LexicalPath  likely_subtags_path ( move ( core_supplemental_path ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    likely_subtags_path  =  likely_subtags_path . append ( " likelySubtags.json " sv ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-02-06 15:55:17 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    auto  likely_subtags  =  TRY ( read_json_file ( likely_subtags_path . string ( ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-12-21 11:42:06 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    auto  const &  supplemental_object  =  likely_subtags . as_object ( ) . get_deprecated ( " supplemental " sv ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    auto  const &  likely_subtags_object  =  supplemental_object . as_object ( ) . get_deprecated ( " likelySubtags " sv ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-31 09:40:24 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    likely_subtags_object . as_object ( ) . for_each_member ( [ & ] ( auto  const &  key ,  JsonValue  const &  value )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 11:48:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        auto  mapping  =  TRY_OR_DISCARD ( parse_language_mapping ( cldr ,  key ,  value . as_string ( ) ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        cldr . max_variant_size  =  max ( mapping . key . variants . size ( ) ,  cldr . max_variant_size ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        cldr . max_variant_size  =  max ( mapping . alias . variants . size ( ) ,  cldr . max_variant_size ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        cldr . likely_subtags . append ( move ( mapping ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-31 09:40:24 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-23 10:51:10 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  { } ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-31 09:40:24 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-12-04 18:02:33 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  ErrorOr < void >  parse_identity ( DeprecatedString  locale_path ,  CLDR &  cldr ,  LocaleData &  locale )  
						 
					
						
							
								
									
										
										
										
											2021-08-24 19:50:18 -04:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    LexicalPath  languages_path ( move ( locale_path ) ) ;  // Note: Every JSON file defines identity data, so we can use any of them.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    languages_path  =  languages_path . append ( " languages.json " sv ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-02-06 15:55:17 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    auto  languages  =  TRY ( read_json_file ( languages_path . string ( ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-12-21 11:42:06 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    auto  const &  main_object  =  languages . as_object ( ) . get_deprecated ( " main " sv ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    auto  const &  locale_object  =  main_object . as_object ( ) . get_deprecated ( languages_path . parent ( ) . basename ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    auto  const &  identity_object  =  locale_object . as_object ( ) . get_deprecated ( " identity " sv ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    auto  const &  language_string  =  identity_object . as_object ( ) . get_deprecated ( " language " sv ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    auto  const &  territory_string  =  identity_object . as_object ( ) . get_deprecated ( " territory " sv ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    auto  const &  script_string  =  identity_object . as_object ( ) . get_deprecated ( " script " sv ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    auto  const &  variant_string  =  identity_object . as_object ( ) . get_deprecated ( " variant " sv ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-24 19:50:18 -04:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    locale . language  =  language_string . as_string ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( territory_string . is_string ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        locale . territory  =  territory_string . as_string ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 11:48:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ( ! cldr . territories . contains_slow ( * locale . territory ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            cldr . territories . append ( * locale . territory ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-24 19:50:18 -04:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-12-13 11:59:21 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  ( script_string . is_string ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        auto  script  =  script_string . as_string ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 11:48:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ( ! cldr . scripts . contains_slow ( script ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            cldr . scripts . append ( script ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-12-13 11:59:21 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-08-24 19:50:18 -04:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    if  ( variant_string . is_string ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        locale . variant  =  variant_string . as_string ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 11:48:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ( ! cldr . variants . contains_slow ( * locale . variant ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            cldr . variants . append ( * locale . variant ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-24 19:50:18 -04:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-23 10:51:10 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  { } ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-24 19:50:18 -04:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-12-04 18:02:33 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  ErrorOr < void >  parse_locale_display_patterns ( DeprecatedString  locale_path ,  CLDR &  cldr ,  LocaleData &  locale )  
						 
					
						
							
								
									
										
										
										
											2022-01-13 13:10:24 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    LexicalPath  locale_display_names_path ( move ( locale_path ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    locale_display_names_path  =  locale_display_names_path . append ( " localeDisplayNames.json " sv ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-02-06 15:55:17 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    auto  locale_display_names  =  TRY ( read_json_file ( locale_display_names_path . string ( ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-12-21 11:42:06 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    auto  const &  main_object  =  locale_display_names . as_object ( ) . get_deprecated ( " main " sv ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    auto  const &  locale_object  =  main_object . as_object ( ) . get_deprecated ( locale_display_names_path . parent ( ) . basename ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    auto  const &  locale_display_names_object  =  locale_object . as_object ( ) . get_deprecated ( " localeDisplayNames " sv ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    auto  const &  locale_display_patterns_object  =  locale_display_names_object . as_object ( ) . get_deprecated ( " localeDisplayPattern " sv ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    auto  const &  locale_pattern  =  locale_display_patterns_object . as_object ( ) . get_deprecated ( " localePattern " sv ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    auto  const &  locale_separator  =  locale_display_patterns_object . as_object ( ) . get_deprecated ( " localeSeparator " sv ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-01-13 13:10:24 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    DisplayPattern  patterns  { } ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 11:48:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    patterns . locale_pattern  =  cldr . unique_strings . ensure ( locale_pattern . as_string ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    patterns . locale_separator  =  cldr . unique_strings . ensure ( locale_separator . as_string ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-01-13 13:10:24 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 11:48:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    locale . display_patterns  =  cldr . unique_display_patterns . ensure ( move ( patterns ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-01-13 13:10:24 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    return  { } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-12-04 18:02:33 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  ErrorOr < void >  preprocess_languages ( DeprecatedString  locale_path ,  CLDR &  cldr )  
						 
					
						
							
								
									
										
										
										
											2022-01-13 14:02:12 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    LexicalPath  languages_path ( move ( locale_path ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    languages_path  =  languages_path . append ( " languages.json " sv ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-02-06 15:55:17 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    auto  locale_languages  =  TRY ( read_json_file ( languages_path . string ( ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-12-21 11:42:06 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    auto  const &  main_object  =  locale_languages . as_object ( ) . get_deprecated ( " main " sv ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    auto  const &  locale_object  =  main_object . as_object ( ) . get_deprecated ( languages_path . parent ( ) . basename ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    auto  const &  locale_display_names_object  =  locale_object . as_object ( ) . get_deprecated ( " localeDisplayNames " sv ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    auto  const &  languages_object  =  locale_display_names_object . as_object ( ) . get_deprecated ( " languages " sv ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-01-13 14:02:12 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    languages_object . as_object ( ) . for_each_member ( [ & ] ( auto  const &  key ,  auto  const & )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 11:48:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ( ! key . contains ( " -alt- " sv )  & &  ! cldr . languages . contains_slow ( key ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            cldr . languages . append ( key ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-01-13 14:02:12 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  { } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-12-04 18:02:33 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  ErrorOr < void >  parse_unicode_extension_keywords ( DeprecatedString  bcp47_path ,  CLDR &  cldr )  
						 
					
						
							
								
									
										
										
										
											2022-02-15 12:23:26 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2022-07-14 09:37:36 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    constexpr  auto  desired_keywords  =  Array  {  " ca " sv ,  " co " sv ,  " hc " sv ,  " kf " sv ,  " kn " sv ,  " nu " sv  } ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-15 12:23:26 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    auto  keywords  =  TRY ( read_json_file ( bcp47_path ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-12-21 11:42:06 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    auto  const &  keyword_object  =  keywords . as_object ( ) . get_deprecated ( " keyword " sv ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    auto  const &  unicode_object  =  keyword_object . as_object ( ) . get_deprecated ( " u " sv ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-15 12:23:26 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  ( unicode_object . is_null ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  { } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    unicode_object . as_object ( ) . for_each_member ( [ & ] ( auto  const &  key ,  auto  const &  value )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( ! desired_keywords . span ( ) . contains_slow ( key ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-12-21 11:42:06 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        auto  const &  name  =  value . as_object ( ) . get_deprecated ( " _alias " sv ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 11:48:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        cldr . keyword_names . set ( key ,  name . as_string ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-15 12:23:26 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 11:48:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        auto &  keywords  =  cldr . keywords . ensure ( key ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-15 12:23:26 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-07-14 09:37:36 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        // FIXME: ECMA-402 requires the list of supported collation types to include "default", but
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        //        that type does not appear in collation.json.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( key  = =  " co "  & &  ! keywords . contains_slow ( " default " sv ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            keywords . append ( " default " sv ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-02-15 12:23:26 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        value . as_object ( ) . for_each_member ( [ & ] ( auto  const &  keyword ,  auto  const &  properties )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  ( ! properties . is_object ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-07-14 09:37:36 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            // Filter out values not permitted by ECMA-402.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            // https://tc39.es/ecma402/#sec-intl-collator-internal-slots
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  ( key  = =  " co " sv  & &  keyword . is_one_of ( " search " sv ,  " standard " sv ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            // https://tc39.es/ecma402/#sec-intl.numberformat-internal-slots
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  ( key  = =  " nu " sv  & &  keyword . is_one_of ( " finance " sv ,  " native " sv ,  " traditio " sv ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-12-21 11:42:06 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            if  ( auto  const &  preferred  =  properties . as_object ( ) . get_deprecated ( " _preferred " sv ) ;  preferred . is_string ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 11:48:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                cldr . keyword_aliases . ensure ( key ) . append ( {  preferred . as_string ( ) ,  keyword  } ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-15 12:23:26 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-12-21 11:42:06 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            if  ( auto  const &  alias  =  properties . as_object ( ) . get_deprecated ( " _alias " sv ) ;  alias . is_string ( ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 11:48:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                cldr . keyword_aliases . ensure ( key ) . append ( {  keyword ,  alias . as_string ( )  } ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-14 09:37:36 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-02-15 12:23:26 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            keywords . append ( keyword ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  { } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-12-04 18:02:33 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  Optional < DeprecatedString >  find_keyword_alias ( StringView  key ,  StringView  calendar ,  CLDR &  cldr )  
						 
					
						
							
								
									
										
										
										
											2022-02-15 12:23:26 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2022-09-02 11:48:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    auto  it  =  cldr . keyword_aliases . find ( key ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( it  = =  cldr . keyword_aliases . end ( ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-15 12:23:26 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        return  { } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    auto  alias  =  it - > value . find_if ( [ & ] ( auto  const &  alias )  {  return  calendar  = =  alias . alias ;  } ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( alias  = =  it - > value . end ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  { } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  alias - > name ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-12-04 18:02:33 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  ErrorOr < void >  parse_locale_languages ( DeprecatedString  locale_path ,  CLDR &  cldr ,  LocaleData &  locale )  
						 
					
						
							
								
									
										
										
										
											2021-08-26 08:17:01 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    LexicalPath  languages_path ( move ( locale_path ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    languages_path  =  languages_path . append ( " languages.json " sv ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-02-06 15:55:17 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    auto  locale_languages  =  TRY ( read_json_file ( languages_path . string ( ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-12-21 11:42:06 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    auto  const &  main_object  =  locale_languages . as_object ( ) . get_deprecated ( " main " sv ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    auto  const &  locale_object  =  main_object . as_object ( ) . get_deprecated ( languages_path . parent ( ) . basename ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    auto  const &  locale_display_names_object  =  locale_object . as_object ( ) . get_deprecated ( " localeDisplayNames " sv ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    auto  const &  languages_object  =  locale_display_names_object . as_object ( ) . get_deprecated ( " languages " sv ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-26 08:17:01 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-12-13 11:59:21 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    LanguageList  languages ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 11:48:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    languages . resize ( cldr . languages . size ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-10 11:31:49 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-12-13 11:59:21 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    languages_object . as_object ( ) . for_each_member ( [ & ] ( auto  const &  key ,  JsonValue  const &  value )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-01-13 14:02:12 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ( key . contains ( " -alt- " sv ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 11:48:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        auto  index  =  cldr . languages . find_first_index ( key ) . value ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        languages [ index ]  =  cldr . unique_strings . ensure ( value . as_string ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-26 08:17:01 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-23 10:51:10 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 11:48:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    locale . languages  =  cldr . unique_language_lists . ensure ( move ( languages ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-23 10:51:10 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    return  { } ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-26 08:17:01 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-12-04 18:02:33 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  ErrorOr < void >  parse_locale_territories ( DeprecatedString  locale_path ,  CLDR &  cldr ,  LocaleData &  locale )  
						 
					
						
							
								
									
										
										
										
											2021-08-24 19:50:18 -04:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    LexicalPath  territories_path ( move ( locale_path ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    territories_path  =  territories_path . append ( " territories.json " sv ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-02-06 15:55:17 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    auto  locale_territories  =  TRY ( read_json_file ( territories_path . string ( ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-12-21 11:42:06 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    auto  const &  main_object  =  locale_territories . as_object ( ) . get_deprecated ( " main " sv ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    auto  const &  locale_object  =  main_object . as_object ( ) . get_deprecated ( territories_path . parent ( ) . basename ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    auto  const &  locale_display_names_object  =  locale_object . as_object ( ) . get_deprecated ( " localeDisplayNames " sv ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    auto  const &  territories_object  =  locale_display_names_object . as_object ( ) . get_deprecated ( " territories " sv ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-24 19:50:18 -04:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-12-13 11:59:21 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    TerritoryList  territories ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 11:48:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    territories . resize ( cldr . territories . size ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-10 11:31:49 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-12-13 11:59:21 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    territories_object . as_object ( ) . for_each_member ( [ & ] ( auto  const &  key ,  JsonValue  const &  value )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 11:48:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ( auto  index  =  cldr . territories . find_first_index ( key ) ;  index . has_value ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            territories [ * index ]  =  cldr . unique_strings . ensure ( value . as_string ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-24 19:50:18 -04:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    } ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-23 10:51:10 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 11:48:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    locale . territories  =  cldr . unique_territory_lists . ensure ( move ( territories ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-23 10:51:10 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    return  { } ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-24 19:50:18 -04:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-12-04 18:02:33 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  ErrorOr < void >  parse_locale_scripts ( DeprecatedString  locale_path ,  CLDR &  cldr ,  LocaleData &  locale )  
						 
					
						
							
								
									
										
										
										
											2021-08-26 08:29:39 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    LexicalPath  scripts_path ( move ( locale_path ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    scripts_path  =  scripts_path . append ( " scripts.json " sv ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-02-06 15:55:17 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    auto  locale_scripts  =  TRY ( read_json_file ( scripts_path . string ( ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-12-21 11:42:06 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    auto  const &  main_object  =  locale_scripts . as_object ( ) . get_deprecated ( " main " sv ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    auto  const &  locale_object  =  main_object . as_object ( ) . get_deprecated ( scripts_path . parent ( ) . basename ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    auto  const &  locale_display_names_object  =  locale_object . as_object ( ) . get_deprecated ( " localeDisplayNames " sv ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    auto  const &  scripts_object  =  locale_display_names_object . as_object ( ) . get_deprecated ( " scripts " sv ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-26 08:29:39 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-12-13 11:59:21 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    ScriptList  scripts ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 11:48:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    scripts . resize ( cldr . scripts . size ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-10 11:41:13 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-12-13 11:59:21 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    scripts_object . as_object ( ) . for_each_member ( [ & ] ( auto  const &  key ,  JsonValue  const &  value )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 11:48:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ( auto  index  =  cldr . scripts . find_first_index ( key ) ;  index . has_value ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            scripts [ * index ]  =  cldr . unique_strings . ensure ( value . as_string ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-26 08:29:39 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-23 10:51:10 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 11:48:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    locale . scripts  =  cldr . unique_script_lists . ensure ( move ( scripts ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-23 10:51:10 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    return  { } ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-26 08:29:39 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-12-04 18:02:33 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  ErrorOr < void >  parse_locale_list_patterns ( DeprecatedString  misc_path ,  CLDR &  cldr ,  LocaleData &  locale )  
						 
					
						
							
								
									
										
										
										
											2021-09-06 13:56:44 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    LexicalPath  list_patterns_path ( move ( misc_path ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    list_patterns_path  =  list_patterns_path . append ( " listPatterns.json " sv ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-02-06 15:55:17 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    auto  locale_list_patterns  =  TRY ( read_json_file ( list_patterns_path . string ( ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-12-21 11:42:06 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    auto  const &  main_object  =  locale_list_patterns . as_object ( ) . get_deprecated ( " main " sv ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    auto  const &  locale_object  =  main_object . as_object ( ) . get_deprecated ( list_patterns_path . parent ( ) . basename ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    auto  const &  list_patterns_object  =  locale_object . as_object ( ) . get_deprecated ( " listPatterns " sv ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-06 13:56:44 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    auto  list_pattern_type  =  [ ] ( StringView  key )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( key . contains ( " type-standard " sv ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  " conjunction " sv ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( key . contains ( " type-or " sv ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  " disjunction " sv ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( key . contains ( " type-unit " sv ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  " unit " sv ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        VERIFY_NOT_REACHED ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    auto  list_pattern_style  =  [ ] ( StringView  key )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( key . contains ( " short " sv ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  " short " sv ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( key . contains ( " narrow " sv ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  " narrow " sv ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  " long " sv ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-12-13 12:58:40 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    ListPatternList  list_patterns ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    list_patterns . ensure_capacity ( list_patterns_object . as_object ( ) . size ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-09-06 13:56:44 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    list_patterns_object . as_object ( ) . for_each_member ( [ & ] ( auto  const &  key ,  JsonValue  const &  value )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        auto  type  =  list_pattern_type ( key ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        auto  style  =  list_pattern_style ( key ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-12-21 11:42:06 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        auto  start  =  cldr . unique_strings . ensure ( value . as_object ( ) . get_deprecated ( " start " sv ) . as_string ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        auto  middle  =  cldr . unique_strings . ensure ( value . as_object ( ) . get_deprecated ( " middle " sv ) . as_string ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        auto  end  =  cldr . unique_strings . ensure ( value . as_object ( ) . get_deprecated ( " end " sv ) . as_string ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        auto  pair  =  cldr . unique_strings . ensure ( value . as_object ( ) . get_deprecated ( " 2 " sv ) . as_string ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-06 13:56:44 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 11:48:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ( ! cldr . list_pattern_types . contains_slow ( type ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            cldr . list_pattern_types . append ( type ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-06 13:56:44 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-12-13 12:58:40 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        ListPatterns  list_pattern  {  type ,  style ,  start ,  middle ,  end ,  pair  } ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 11:48:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        list_patterns . append ( cldr . unique_list_patterns . ensure ( move ( list_pattern ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-06 13:56:44 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-23 10:51:10 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 11:48:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    locale . list_patterns  =  cldr . unique_list_pattern_lists . ensure ( move ( list_patterns ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-23 10:51:10 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    return  { } ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-06 13:56:44 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-12-04 18:02:33 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  ErrorOr < void >  parse_locale_layout ( DeprecatedString  misc_path ,  CLDR &  cldr ,  LocaleData &  locale )  
						 
					
						
							
								
									
										
										
										
											2022-07-05 19:40:40 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    LexicalPath  layout_path ( move ( misc_path ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    layout_path  =  layout_path . append ( " layout.json " sv ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    auto  locale_layout  =  TRY ( read_json_file ( layout_path . string ( ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-12-21 11:42:06 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    auto  const &  main_object  =  locale_layout . as_object ( ) . get_deprecated ( " main " sv ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    auto  const &  locale_object  =  main_object . as_object ( ) . get_deprecated ( layout_path . parent ( ) . basename ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    auto  const &  layout_object  =  locale_object . as_object ( ) . get_deprecated ( " layout " sv ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    auto  const &  orientation_object  =  layout_object . as_object ( ) . get_deprecated ( " orientation " sv ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-05 19:40:40 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    auto  text_layout_character_order  =  [ ] ( StringView  key )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( key  = =  " left-to-right " sv ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  " ltr " sv ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( key  = =  " right-to-left " sv ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  " rtl " sv ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        VERIFY_NOT_REACHED ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-12-21 11:42:06 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    auto  const &  character_order_string  =  orientation_object . as_object ( ) . get_deprecated ( " characterOrder " sv ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-05 19:40:40 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    auto  const &  character_order  =  character_order_string . as_string ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    TextLayout  layout  { } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    layout . character_order  =  text_layout_character_order ( character_order ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 11:48:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  ( ! cldr . character_orders . contains_slow ( layout . character_order ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        cldr . character_orders . append ( layout . character_order ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-05 19:40:40 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 11:48:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    locale . text_layout  =  cldr . unique_text_layouts . ensure ( move ( layout ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-05 19:40:40 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    return  { } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-12-04 18:02:33 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  ErrorOr < void >  parse_locale_currencies ( DeprecatedString  numbers_path ,  CLDR &  cldr ,  LocaleData &  locale )  
						 
					
						
							
								
									
										
										
										
											2021-08-24 19:50:18 -04:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2021-08-26 08:38:54 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    LexicalPath  currencies_path ( move ( numbers_path ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    currencies_path  =  currencies_path . append ( " currencies.json " sv ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-02-06 15:55:17 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    auto  locale_currencies  =  TRY ( read_json_file ( currencies_path . string ( ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-12-21 11:42:06 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    auto  const &  main_object  =  locale_currencies . as_object ( ) . get_deprecated ( " main " sv ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    auto  const &  locale_object  =  main_object . as_object ( ) . get_deprecated ( currencies_path . parent ( ) . basename ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    auto  const &  locale_numbers_object  =  locale_object . as_object ( ) . get_deprecated ( " numbers " sv ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    auto  const &  currencies_object  =  locale_numbers_object . as_object ( ) . get_deprecated ( " currencies " sv ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-26 08:38:54 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-12-13 12:12:18 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    currencies_object . as_object ( ) . for_each_member ( [ & ] ( auto  const &  key ,  JsonValue  const & )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 11:48:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ( ! cldr . currencies . contains_slow ( key ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            cldr . currencies . append ( key ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-12-13 12:12:18 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    CurrencyList  long_currencies  { } ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 11:48:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    long_currencies . resize ( cldr . currencies . size ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-12-13 12:12:18 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    CurrencyList  short_currencies  { } ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 11:48:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    short_currencies . resize ( cldr . currencies . size ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-12-13 12:12:18 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    CurrencyList  narrow_currencies  { } ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 11:48:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    narrow_currencies . resize ( cldr . currencies . size ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-12-13 12:12:18 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    CurrencyList  numeric_currencies  { } ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 11:48:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    numeric_currencies . resize ( cldr . currencies . size ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-12-13 12:12:18 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-08-26 08:38:54 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    currencies_object . as_object ( ) . for_each_member ( [ & ] ( auto  const &  key ,  JsonValue  const &  value )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-12-21 11:42:06 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        auto  const &  long_name  =  value . as_object ( ) . get_deprecated ( " displayName " sv ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        auto  const &  short_name  =  value . as_object ( ) . get_deprecated ( " symbol " sv ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        auto  const &  narrow_name  =  value . as_object ( ) . get_deprecated ( " symbol-alt-narrow " sv ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        auto  const &  numeric_name  =  value . as_object ( ) . get_deprecated ( " displayName-count-other " sv ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-10 11:41:13 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 11:48:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        auto  index  =  cldr . currencies . find_first_index ( key ) . value ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        long_currencies [ index ]  =  cldr . unique_strings . ensure ( long_name . as_string ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        short_currencies [ index ]  =  cldr . unique_strings . ensure ( short_name . as_string ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        narrow_currencies [ index ]  =  narrow_name . is_null ( )  ?  0  :  cldr . unique_strings . ensure ( narrow_name . as_string ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        numeric_currencies [ index ]  =  cldr . unique_strings . ensure ( numeric_name . is_null ( )  ?  long_name . as_string ( )  :  numeric_name . as_string ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-26 08:38:54 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-23 10:51:10 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 11:48:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    locale . long_currencies  =  cldr . unique_currency_lists . ensure ( move ( long_currencies ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    locale . short_currencies  =  cldr . unique_currency_lists . ensure ( move ( short_currencies ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    locale . narrow_currencies  =  cldr . unique_currency_lists . ensure ( move ( narrow_currencies ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    locale . numeric_currencies  =  cldr . unique_currency_lists . ensure ( move ( numeric_currencies ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-23 10:51:10 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    return  { } ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-26 08:38:54 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-12-04 18:02:33 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  ErrorOr < void >  parse_locale_calendars ( DeprecatedString  locale_path ,  CLDR &  cldr ,  LocaleData &  locale )  
						 
					
						
							
								
									
										
										
										
											2022-01-12 16:15:41 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    LexicalPath  locale_display_names_path ( move ( locale_path ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    locale_display_names_path  =  locale_display_names_path . append ( " localeDisplayNames.json " sv ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-02-06 15:55:17 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    auto  locale_display_names  =  TRY ( read_json_file ( locale_display_names_path . string ( ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-12-21 11:42:06 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    auto  const &  main_object  =  locale_display_names . as_object ( ) . get_deprecated ( " main " sv ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    auto  const &  locale_object  =  main_object . as_object ( ) . get_deprecated ( locale_display_names_path . parent ( ) . basename ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    auto  const &  locale_display_names_object  =  locale_object . as_object ( ) . get_deprecated ( " localeDisplayNames " sv ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    auto  const &  types_object  =  locale_display_names_object . as_object ( ) . get_deprecated ( " types " sv ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    auto  const &  calendar_object  =  types_object . as_object ( ) . get_deprecated ( " calendar " sv ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-01-12 16:15:41 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 11:48:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    auto  const &  supported_calendars  =  cldr . keywords . find ( " ca " sv ) - > value ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-01-12 16:15:41 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    CalendarList  calendars ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-15 12:23:26 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    calendars . resize ( supported_calendars . size ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-01-12 16:15:41 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    calendar_object . as_object ( ) . for_each_member ( [ & ] ( auto  const &  key ,  auto  const &  calendar )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-15 12:23:26 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        auto  index  =  supported_calendars . find_first_index ( key ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( ! index . has_value ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 11:48:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            auto  alias  =  find_keyword_alias ( " ca " sv ,  key ,  cldr ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-15 12:23:26 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            index  =  supported_calendars . find_first_index ( * alias ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 11:48:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        calendars [ * index ]  =  cldr . unique_strings . ensure ( calendar . as_string ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-01-12 16:15:41 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 11:48:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    locale . calendars  =  cldr . unique_calendar_lists . ensure ( move ( calendars ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-01-12 16:15:41 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    return  { } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-12-04 18:02:33 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  ErrorOr < void >  parse_locale_date_fields ( DeprecatedString  dates_path ,  CLDR &  cldr ,  LocaleData &  locale )  
						 
					
						
							
								
									
										
										
										
											2022-01-12 17:16:12 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    LexicalPath  date_fields_path ( move ( dates_path ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    date_fields_path  =  date_fields_path . append ( " dateFields.json " sv ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-02-06 15:55:17 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    auto  locale_date_fields  =  TRY ( read_json_file ( date_fields_path . string ( ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-12-21 11:42:06 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    auto  const &  main_object  =  locale_date_fields . as_object ( ) . get_deprecated ( " main " sv ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    auto  const &  locale_object  =  main_object . as_object ( ) . get_deprecated ( date_fields_path . parent ( ) . basename ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    auto  const &  dates_object  =  locale_object . as_object ( ) . get_deprecated ( " dates " sv ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    auto  const &  fields_object  =  dates_object . as_object ( ) . get_deprecated ( " fields " sv ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-01-12 17:16:12 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    auto  is_sanctioned_field  =  [ ] ( StringView  field )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        // This is a copy of the units sanctioned for use within ECMA-402, with names adjusted for the names used by the CLDR.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        // https://tc39.es/ecma402/#table-validcodeforDateField
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  field . is_one_of ( " era " sv ,  " year " sv ,  " quarter " sv ,  " month " sv ,  " week " sv ,  " weekday " sv ,  " day " sv ,  " dayperiod " sv ,  " hour " sv ,  " minute " sv ,  " second " sv ,  " zone " sv ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    fields_object . as_object ( ) . for_each_member ( [ & ] ( auto  const &  key ,  JsonValue  const & )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( ! is_sanctioned_field ( key ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 11:48:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ( ! cldr . date_fields . contains_slow ( key ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            cldr . date_fields . append ( key ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-01-12 17:16:12 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 11:48:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    quick_sort ( cldr . date_fields ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-01-12 17:16:12 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    DateFieldList  long_date_fields  { } ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 11:48:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    long_date_fields . resize ( cldr . date_fields . size ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-01-12 17:16:12 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    DateFieldList  short_date_fields  { } ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 11:48:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    short_date_fields . resize ( cldr . date_fields . size ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-01-12 17:16:12 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    DateFieldList  narrow_date_fields  { } ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 11:48:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    narrow_date_fields . resize ( cldr . date_fields . size ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-01-12 17:16:12 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    fields_object . as_object ( ) . for_each_member ( [ & ] ( auto  const &  key ,  JsonValue  const &  value )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( ! is_sanctioned_field ( key ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-12-21 11:42:06 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        auto  const &  long_name  =  value . as_object ( ) . get_deprecated ( " displayName " sv ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        auto  const &  short_name  =  fields_object . as_object ( ) . get_deprecated ( DeprecatedString : : formatted ( " {}-short " ,  key ) ) . as_object ( ) . get_deprecated ( " displayName " sv ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        auto  const &  narrow_name  =  fields_object . as_object ( ) . get_deprecated ( DeprecatedString : : formatted ( " {}-narrow " ,  key ) ) . as_object ( ) . get_deprecated ( " displayName " sv ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-01-12 17:16:12 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 11:48:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        auto  index  =  cldr . date_fields . find_first_index ( key ) . value ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        long_date_fields [ index ]  =  cldr . unique_strings . ensure ( long_name . as_string ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        short_date_fields [ index ]  =  cldr . unique_strings . ensure ( short_name . as_string ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        narrow_date_fields [ index ]  =  cldr . unique_strings . ensure ( narrow_name . as_string ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-01-12 17:16:12 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 11:48:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    locale . long_date_fields  =  cldr . unique_date_field_lists . ensure ( move ( long_date_fields ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    locale . short_date_fields  =  cldr . unique_date_field_lists . ensure ( move ( short_date_fields ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    locale . narrow_date_fields  =  cldr . unique_date_field_lists . ensure ( move ( narrow_date_fields ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-01-12 17:16:12 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    return  { } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-12-04 18:02:33 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  ErrorOr < void >  parse_number_system_keywords ( DeprecatedString  locale_numbers_path ,  CLDR &  cldr ,  LocaleData &  locale )  
						 
					
						
							
								
									
										
										
										
											2021-09-10 09:56:11 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    LexicalPath  numbers_path ( move ( locale_numbers_path ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    numbers_path  =  numbers_path . append ( " numbers.json " sv ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-02-06 15:55:17 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    auto  numbers  =  TRY ( read_json_file ( numbers_path . string ( ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-12-21 11:42:06 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    auto  const &  main_object  =  numbers . as_object ( ) . get_deprecated ( " main " sv ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    auto  const &  locale_object  =  main_object . as_object ( ) . get_deprecated ( numbers_path . parent ( ) . basename ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    auto  const &  locale_numbers_object  =  locale_object . as_object ( ) . get_deprecated ( " numbers " sv ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    auto  const &  default_numbering_system_object  =  locale_numbers_object . as_object ( ) . get_deprecated ( " defaultNumberingSystem " sv ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    auto  const &  other_numbering_systems_object  =  locale_numbers_object . as_object ( ) . get_deprecated ( " otherNumberingSystems " sv ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-10 09:56:11 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-02-15 12:23:26 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    KeywordList  keywords  { } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-12-04 18:02:33 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    auto  append_numbering_system  =  [ & ] ( DeprecatedString  system_name )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 11:48:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ( auto  system_alias  =  find_keyword_alias ( " nu " sv ,  system_name ,  cldr ) ;  system_alias . has_value ( ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-15 12:23:26 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            system_name  =  system_alias . release_value ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 11:48:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        auto  index  =  cldr . unique_strings . ensure ( move ( system_name ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-15 12:23:26 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ( ! keywords . contains_slow ( index ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            keywords . append ( move ( index ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    append_numbering_system ( default_numbering_system_object . as_string ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-10 09:56:11 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    other_numbering_systems_object . as_object ( ) . for_each_member ( [ & ] ( auto  const & ,  JsonValue  const &  value )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-15 12:23:26 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        append_numbering_system ( value . as_string ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-10 09:56:11 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-11-10 14:49:03 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    locale_numbers_object . as_object ( ) . for_each_member ( [ & ] ( auto  const &  key ,  JsonValue  const &  value )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( ! key . starts_with ( " defaultNumberingSystem-alt- " sv ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-15 12:23:26 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        append_numbering_system ( value . as_string ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-10 14:49:03 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 11:48:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    locale . number_system_keywords  =  cldr . unique_keyword_lists . ensure ( move ( keywords ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-23 10:51:10 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    return  { } ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-10 09:56:11 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-12-04 18:02:33 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  ErrorOr < void >  parse_calendar_keywords ( DeprecatedString  locale_dates_path ,  CLDR &  cldr ,  LocaleData &  locale )  
						 
					
						
							
								
									
										
										
										
											2021-11-28 10:39:55 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    auto  calendars_iterator  =  TRY ( path_to_dir_iterator ( locale_dates_path ,  { } ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-15 12:23:26 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    KeywordList  keywords  { } ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-28 10:39:55 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    while  ( calendars_iterator . has_next ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        auto  locale_calendars_path  =  TRY ( next_path_from_dir_iterator ( calendars_iterator ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        LexicalPath  calendars_path ( move ( locale_calendars_path ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( ! calendars_path . basename ( ) . starts_with ( " ca- " sv ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            continue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-02-06 15:55:17 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        auto  calendars  =  TRY ( read_json_file ( calendars_path . string ( ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-12-21 11:42:06 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        auto  const &  main_object  =  calendars . as_object ( ) . get_deprecated ( " main " sv ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        auto  const &  locale_object  =  main_object . as_object ( ) . get_deprecated ( calendars_path . parent ( ) . basename ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        auto  const &  dates_object  =  locale_object . as_object ( ) . get_deprecated ( " dates " sv ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        auto  const &  calendars_object  =  dates_object . as_object ( ) . get_deprecated ( " calendars " sv ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-28 10:39:55 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-02-15 12:23:26 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        calendars_object . as_object ( ) . for_each_member ( [ & ] ( auto  calendar_name ,  JsonValue  const & )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-30 21:23:13 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            // The generic calendar is not a supported Unicode calendar key, so skip it:
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Locale/calendar#unicode_calendar_keys
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  ( calendar_name  = =  " generic " sv ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                return ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-28 10:39:55 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 11:48:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            if  ( auto  calendar_alias  =  find_keyword_alias ( " ca " sv ,  calendar_name ,  cldr ) ;  calendar_alias . has_value ( ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-15 12:23:26 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                calendar_name  =  calendar_alias . release_value ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 11:48:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            keywords . append ( cldr . unique_strings . ensure ( calendar_name ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-28 10:39:55 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        } ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 11:48:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    locale . calendar_keywords  =  cldr . unique_keyword_lists . ensure ( move ( keywords ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-28 10:39:55 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    return  { } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 11:48:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  void  fill_in_collation_keywords ( CLDR &  cldr ,  LocaleData &  locale )  
						 
					
						
							
								
									
										
										
										
											2022-01-29 10:59:59 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2022-02-15 12:23:26 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    // FIXME: If collation data becomes available in the CLDR, parse per-locale ordering from there.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    auto  create_list_with_default_first  =  [ & ] ( auto  key ,  auto  default_value )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 11:48:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        auto &  values  =  cldr . keywords . find ( key ) - > value ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-15 12:23:26 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        quick_sort ( values ,  [ & ] ( auto  const &  lhs ,  auto  const &  rhs )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  ( lhs  = =  default_value ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                return  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  ( rhs  = =  default_value ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                return  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  lhs  <  rhs ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-01-29 10:59:59 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-02-15 12:23:26 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        KeywordList  keywords ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        keywords . ensure_capacity ( values . size ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        for  ( auto  const &  value  :  values ) 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 11:48:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            keywords . append ( cldr . unique_strings . ensure ( value ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-15 12:23:26 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 11:48:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        return  cldr . unique_keyword_lists . ensure ( move ( keywords ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-15 12:23:26 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    static  auto  kf_index  =  create_list_with_default_first ( " kf " sv ,  " upper " sv ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    static  auto  kn_index  =  create_list_with_default_first ( " kn " sv ,  " true " sv ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    locale . collation_case_keywords  =  kf_index ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    locale . collation_numeric_keywords  =  kn_index ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-01-29 10:59:59 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-12-04 18:02:33 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  ErrorOr < void >  parse_default_content_locales ( DeprecatedString  core_path ,  CLDR &  cldr )  
						 
					
						
							
								
									
										
										
										
											2021-11-17 08:20:19 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    LexicalPath  default_content_path ( move ( core_path ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    default_content_path  =  default_content_path . append ( " defaultContent.json " sv ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-02-06 15:55:17 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    auto  default_content  =  TRY ( read_json_file ( default_content_path . string ( ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-12-21 11:42:06 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    auto  const &  default_content_array  =  default_content . as_object ( ) . get_deprecated ( " defaultContent " sv ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-17 08:20:19 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    default_content_array . as_array ( ) . for_each ( [ & ] ( JsonValue  const &  value )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        auto  locale  =  value . as_string ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        StringView  default_locale  =  locale ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        while  ( true )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 11:48:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            if  ( cldr . locales . contains ( default_locale ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-17 08:20:19 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            auto  pos  =  default_locale . find_last ( ' - ' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  ( ! pos . has_value ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            default_locale  =  default_locale . substring_view ( 0 ,  * pos ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( default_locale  ! =  locale ) 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 11:48:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            cldr . locale_aliases . append ( {  default_locale ,  move ( locale )  } ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-17 08:20:19 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-23 10:51:10 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  { } ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-17 08:20:19 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 11:48:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  ErrorOr < void >  define_aliases_without_scripts ( CLDR &  cldr )  
						 
					
						
							
								
									
										
										
										
											2021-11-17 09:56:16 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    // From ECMA-402: https://tc39.es/ecma402/#sec-internal-slots
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    //
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    //     For locales that include a script subtag in addition to language and region, the
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    //     corresponding locale without a script subtag must also be supported.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    //
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    // So we define aliases for locales that contain all three subtags, but we must also take
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    // care to handle when the locale itself or the locale without a script subtag are an alias
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    // by way of default-content locales.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    auto  find_alias  =  [ & ] ( auto  const &  locale )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 11:48:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        return  cldr . locale_aliases . find_if ( [ & ] ( auto  const &  alias )  {  return  locale  = =  alias . alias ;  } ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-17 09:56:16 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-11-23 11:54:53 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    auto  append_alias_without_script  =  [ & ] ( auto  const &  locale )  - >  ErrorOr < void >  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-11-18 11:04:33 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        auto  parsed_locale  =  TRY ( CanonicalLanguageID : : parse ( cldr . unique_strings ,  locale ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-23 11:54:53 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ( ( parsed_locale . language  = =  0 )  | |  ( parsed_locale . script  = =  0 )  | |  ( parsed_locale . region  = =  0 ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  { } ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-17 09:56:16 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-12-04 18:02:33 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        auto  locale_without_script  =  DeprecatedString : : formatted ( " {}-{} " , 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 11:48:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            cldr . unique_strings . get ( parsed_locale . language ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            cldr . unique_strings . get ( parsed_locale . region ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-17 09:56:16 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 11:48:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ( cldr . locales . contains ( locale_without_script ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-23 11:54:53 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            return  { } ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 11:48:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ( find_alias ( locale_without_script )  ! =  cldr . locale_aliases . end ( ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-23 11:54:53 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            return  { } ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-17 09:56:16 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 11:48:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ( auto  it  =  find_alias ( locale ) ;  it  ! =  cldr . locale_aliases . end ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            cldr . locale_aliases . append ( {  it - > name ,  locale_without_script  } ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-17 09:56:16 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        else 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 11:48:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            cldr . locale_aliases . append ( {  locale ,  locale_without_script  } ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-23 11:54:53 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  { } ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-17 09:56:16 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 11:48:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    for  ( auto  const &  locale  :  cldr . locales ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-23 11:54:53 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        TRY ( append_alias_without_script ( locale . key ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 11:48:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    for  ( auto  const &  locale  :  cldr . locale_aliases ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-23 11:54:53 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        TRY ( append_alias_without_script ( locale . alias ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  { } ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-17 09:56:16 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-12-04 18:02:33 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  ErrorOr < void >  parse_all_locales ( DeprecatedString  bcp47_path ,  DeprecatedString  core_path ,  DeprecatedString  locale_names_path ,  DeprecatedString  misc_path ,  DeprecatedString  numbers_path ,  DeprecatedString  dates_path ,  CLDR &  cldr )  
						 
					
						
							
								
									
										
										
										
											2021-08-26 08:38:54 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2022-02-15 12:23:26 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    auto  bcp47_iterator  =  TRY ( path_to_dir_iterator ( move ( bcp47_path ) ,  " bcp47 " sv ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-23 11:54:53 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    auto  identity_iterator  =  TRY ( path_to_dir_iterator ( locale_names_path ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-01-13 14:02:12 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    auto  preprocess_iterator  =  TRY ( path_to_dir_iterator ( locale_names_path ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-23 11:54:53 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    auto  locale_names_iterator  =  TRY ( path_to_dir_iterator ( move ( locale_names_path ) ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    auto  misc_iterator  =  TRY ( path_to_dir_iterator ( move ( misc_path ) ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    auto  numbers_iterator  =  TRY ( path_to_dir_iterator ( move ( numbers_path ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-28 10:39:55 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    auto  dates_iterator  =  TRY ( path_to_dir_iterator ( move ( dates_path ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-26 08:38:54 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										
											
												LibUnicode: Parse the CLDR's defaultContent.json locale list
This file contains the list of locales which default to their parent
locale's values. In the core CLDR dataset, these locales have their own
files, but they are empty (except for identity data). For example:
https://github.com/unicode-org/cldr/blob/main/common/main/en_US.xml
In the JSON export, these files are excluded, so we currently are not
recognizing these locales just by iterating the locale files.
This is a prerequisite for upgrading to CLDR version 40. One of these
default-content locales is the popular "en-US" locale, which defaults to
"en" values. We were previously inferring the existence of this locale
from the "en-US-POSIX" locale (many implementations, including ours,
strip variants such as POSIX). However, v40 removes the "en-US-POSIX"
locale entirely, meaning that without this change, we wouldn't know that
"en-US" exists (we would default to "en").
For more detail on this and other v40 changes, see:
https://cldr.unicode.org/index/downloads/cldr-40#h.nssoo2lq3cba
											 
										 
										
											2021-11-09 13:32:23 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    LexicalPath  core_supplemental_path ( core_path ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-30 14:56:23 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    core_supplemental_path  =  core_supplemental_path . append ( " supplemental " sv ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    VERIFY ( Core : : File : : is_directory ( core_supplemental_path . string ( ) ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 11:48:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    TRY ( parse_core_aliases ( core_supplemental_path . string ( ) ,  cldr ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    TRY ( parse_likely_subtags ( core_supplemental_path . string ( ) ,  cldr ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-30 14:56:23 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-12-04 18:02:33 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    auto  remove_variants_from_path  =  [ & ] ( DeprecatedString  path )  - >  ErrorOr < DeprecatedString >  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-11-18 11:04:33 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        auto  parsed_locale  =  TRY ( CanonicalLanguageID : : parse ( cldr . unique_strings ,  LexicalPath : : basename ( path ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-06 15:33:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        StringBuilder  builder ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 11:48:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        builder . append ( cldr . unique_strings . get ( parsed_locale . language ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( auto  script  =  cldr . unique_strings . get ( parsed_locale . script ) ;  ! script . is_empty ( ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-10 13:56:33 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            builder . appendff ( " -{} " ,  script ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 11:48:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ( auto  region  =  cldr . unique_strings . get ( parsed_locale . region ) ;  ! region . is_empty ( ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-10 13:56:33 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            builder . appendff ( " -{} " ,  region ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-06 15:33:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  builder . build ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-10-10 11:31:49 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    while  ( identity_iterator . has_next ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-23 11:54:53 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        auto  locale_path  =  TRY ( next_path_from_dir_iterator ( identity_iterator ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        auto  language  =  TRY ( remove_variants_from_path ( locale_path ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-10 11:31:49 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 11:48:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        auto &  locale  =  cldr . locales . ensure ( language ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        TRY ( parse_identity ( locale_path ,  cldr ,  locale ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-10 11:31:49 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-01-13 14:02:12 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    while  ( preprocess_iterator . has_next ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        auto  locale_path  =  TRY ( next_path_from_dir_iterator ( preprocess_iterator ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 11:48:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        TRY ( preprocess_languages ( locale_path ,  cldr ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-01-13 14:02:12 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 11:48:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    quick_sort ( cldr . languages ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    quick_sort ( cldr . territories ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    quick_sort ( cldr . scripts ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-12-13 11:59:21 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-02-15 12:23:26 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    while  ( bcp47_iterator . has_next ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        auto  bcp47_path  =  TRY ( next_path_from_dir_iterator ( bcp47_iterator ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 11:48:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        TRY ( parse_unicode_extension_keywords ( move ( bcp47_path ) ,  cldr ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-15 12:23:26 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
									
										
										
										
											2021-12-13 12:33:10 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-08-26 08:38:54 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    while  ( locale_names_iterator . has_next ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-23 11:54:53 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        auto  locale_path  =  TRY ( next_path_from_dir_iterator ( locale_names_iterator ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        auto  language  =  TRY ( remove_variants_from_path ( locale_path ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-06 15:33:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 11:48:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        auto &  locale  =  cldr . locales . ensure ( language ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        TRY ( parse_locale_display_patterns ( locale_path ,  cldr ,  locale ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        TRY ( parse_locale_languages ( locale_path ,  cldr ,  locale ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        TRY ( parse_locale_territories ( locale_path ,  cldr ,  locale ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        TRY ( parse_locale_scripts ( locale_path ,  cldr ,  locale ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        TRY ( parse_locale_calendars ( locale_path ,  cldr ,  locale ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-24 19:50:18 -04:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-26 08:38:54 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-09-06 13:56:44 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    while  ( misc_iterator . has_next ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-23 11:54:53 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        auto  misc_path  =  TRY ( next_path_from_dir_iterator ( misc_iterator ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        auto  language  =  TRY ( remove_variants_from_path ( misc_path ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-06 13:56:44 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 11:48:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        auto &  locale  =  cldr . locales . ensure ( language ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        TRY ( parse_locale_list_patterns ( misc_path ,  cldr ,  locale ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        TRY ( parse_locale_layout ( misc_path ,  cldr ,  locale ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-06 13:56:44 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-08-26 08:38:54 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    while  ( numbers_iterator . has_next ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-23 11:54:53 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        auto  numbers_path  =  TRY ( next_path_from_dir_iterator ( numbers_iterator ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        auto  language  =  TRY ( remove_variants_from_path ( numbers_path ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-06 15:33:56 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 11:48:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        auto &  locale  =  cldr . locales . ensure ( language ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        TRY ( parse_locale_currencies ( numbers_path ,  cldr ,  locale ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        TRY ( parse_number_system_keywords ( numbers_path ,  cldr ,  locale ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        fill_in_collation_keywords ( cldr ,  locale ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-26 08:38:54 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
									
										
											 
										
											
												LibUnicode: Parse the CLDR's defaultContent.json locale list
This file contains the list of locales which default to their parent
locale's values. In the core CLDR dataset, these locales have their own
files, but they are empty (except for identity data). For example:
https://github.com/unicode-org/cldr/blob/main/common/main/en_US.xml
In the JSON export, these files are excluded, so we currently are not
recognizing these locales just by iterating the locale files.
This is a prerequisite for upgrading to CLDR version 40. One of these
default-content locales is the popular "en-US" locale, which defaults to
"en" values. We were previously inferring the existence of this locale
from the "en-US-POSIX" locale (many implementations, including ours,
strip variants such as POSIX). However, v40 removes the "en-US-POSIX"
locale entirely, meaning that without this change, we wouldn't know that
"en-US" exists (we would default to "en").
For more detail on this and other v40 changes, see:
https://cldr.unicode.org/index/downloads/cldr-40#h.nssoo2lq3cba
											 
										 
										
											2021-11-09 13:32:23 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-11-28 10:39:55 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    while  ( dates_iterator . has_next ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        auto  dates_path  =  TRY ( next_path_from_dir_iterator ( dates_iterator ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        auto  language  =  TRY ( remove_variants_from_path ( dates_path ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 11:48:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        auto &  locale  =  cldr . locales . ensure ( language ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        TRY ( parse_locale_date_fields ( dates_path ,  cldr ,  locale ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        TRY ( parse_calendar_keywords ( dates_path ,  cldr ,  locale ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-28 10:39:55 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 11:48:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    TRY ( parse_default_content_locales ( move ( core_path ) ,  cldr ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    TRY ( define_aliases_without_scripts ( cldr ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-23 10:51:10 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  { } ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-24 19:50:18 -04:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 11:48:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  ErrorOr < void >  generate_unicode_locale_header ( Core : : Stream : : BufferedFile &  file ,  CLDR &  cldr )  
						 
					
						
							
								
									
										
										
										
											2021-08-24 19:50:18 -04:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    StringBuilder  builder ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    SourceGenerator  generator  {  builder  } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    generator . append ( R " ~~~( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# pragma once 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  <AK/Types.h> 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 12:01:10 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								namespace  Locale  {  
						 
					
						
							
								
									
										
										
										
											2021-08-24 19:50:18 -04:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								) ~ ~ ~ " );  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 11:48:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    auto  locales  =  cldr . locales . keys ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    auto  keywords  =  cldr . keywords . keys ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    generate_enum ( generator ,  format_identifier ,  " Locale " sv ,  " None " sv ,  locales ,  cldr . locale_aliases ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    generate_enum ( generator ,  format_identifier ,  " Language " sv ,  { } ,  cldr . languages ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    generate_enum ( generator ,  format_identifier ,  " Territory " sv ,  { } ,  cldr . territories ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    generate_enum ( generator ,  format_identifier ,  " ScriptTag " sv ,  { } ,  cldr . scripts ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    generate_enum ( generator ,  format_identifier ,  " Currency " sv ,  { } ,  cldr . currencies ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    generate_enum ( generator ,  format_identifier ,  " DateField " sv ,  { } ,  cldr . date_fields ,  cldr . date_field_aliases ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    generate_enum ( generator ,  format_identifier ,  " Variant " sv ,  { } ,  cldr . variants ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    generate_enum ( generator ,  format_identifier ,  " ListPatternType " sv ,  { } ,  cldr . list_pattern_types ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    generate_enum ( generator ,  format_identifier ,  " CharacterOrder " sv ,  { } ,  cldr . character_orders ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-15 12:23:26 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    generate_enum ( generator ,  format_identifier ,  " Key " sv ,  { } ,  keywords ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 11:48:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    for  ( auto &  keyword  :  cldr . keywords )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        auto  const &  keyword_name  =  cldr . keyword_names . find ( keyword . key ) - > value ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-12-04 18:02:33 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        auto  enum_name  =  DeprecatedString : : formatted ( " Keyword{} " ,  format_identifier ( { } ,  keyword_name ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-15 12:23:26 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 11:48:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ( auto  aliases  =  cldr . keyword_aliases . find ( keyword . key ) ;  aliases  ! =  cldr . keyword_aliases . end ( ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-15 12:23:26 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            generate_enum ( generator ,  format_identifier ,  enum_name ,  { } ,  keyword . value ,  aliases - > value ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            generate_enum ( generator ,  format_identifier ,  enum_name ,  { } ,  keyword . value ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-24 19:50:18 -04:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    generator . append ( R " ~~~( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								) ~ ~ ~ " );  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-02-06 15:55:17 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    TRY ( file . write ( generator . as_string_view ( ) . bytes ( ) ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  { } ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-24 19:50:18 -04:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 11:48:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  ErrorOr < void >  generate_unicode_locale_implementation ( Core : : Stream : : BufferedFile &  file ,  CLDR &  cldr )  
						 
					
						
							
								
									
										
										
										
											2021-08-24 19:50:18 -04:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2022-11-18 11:04:33 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    auto  string_index_type  =  cldr . unique_strings . type_that_fits ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-08-24 19:50:18 -04:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    StringBuilder  builder ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    SourceGenerator  generator  {  builder  } ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-11-18 11:04:33 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    generator . set ( " string_index_type " sv ,  string_index_type ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-12-04 18:02:33 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    generator . set ( " locales_size " sv ,  DeprecatedString : : number ( cldr . locales . size ( ) ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    generator . set ( " territories_size " ,  DeprecatedString : : number ( cldr . territories . size ( ) ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    generator . set ( " variants_size " ,  DeprecatedString : : number ( cldr . max_variant_size ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-24 19:50:18 -04:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    generator . append ( R " ~~~( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  <AK/Array.h> 
  
						 
					
						
							
								
									
										
										
										
											2021-10-12 12:22:47 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  <AK/BinarySearch.h> 
  
						 
					
						
							
								
									
										
										
										
											2021-12-15 19:48:13 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  <AK/Optional.h> 
  
						 
					
						
							
								
									
										
										
										
											2021-08-26 06:56:17 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  <AK/Span.h> 
  
						 
					
						
							
								
									
										
										
										
											2023-01-19 10:53:20 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  <AK/String.h> 
  
						 
					
						
							
								
									
										
										
										
											2021-12-15 19:48:13 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  <AK/StringView.h> 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  <AK/Vector.h> 
  
						 
					
						
							
								
									
										
										
										
											2022-09-02 12:11:30 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  <LibLocale/DateTimeFormat.h> 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  <LibLocale/Locale.h> 
  
						 
					
						
							
								
									
										
										
										
											2022-09-02 11:04:53 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  <LibLocale/LocaleData.h> 
  
						 
					
						
							
								
									
										
										
										
											2022-01-30 16:51:29 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  <LibUnicode/CurrencyCode.h> 
  
						 
					
						
							
								
									
										
										
										
											2021-08-24 19:50:18 -04:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 12:01:10 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								namespace  Locale  {  
						 
					
						
							
								
									
										
										
										
											2022-01-13 13:10:24 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								) ~ ~ ~ " );  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 11:48:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    cldr . unique_strings . generate ( generator ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-01-13 13:10:24 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    generator . append ( R " ~~~( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								struct  DisplayPatternImpl  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    DisplayPattern  to_display_pattern ( )  const 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        DisplayPattern  display_patterns  { } ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-15 13:01:42 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        display_patterns . locale_pattern  =  decode_string ( locale_pattern ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        display_patterns . locale_separator  =  decode_string ( locale_separator ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-01-13 13:10:24 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  display_patterns ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    @ string_index_type @  locale_pattern  {  0  } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    @ string_index_type @  locale_separator  {  0  } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								} ;  
						 
					
						
							
								
									
										
										
										
											2021-09-06 13:56:44 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								struct  Patterns  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ListPatternType  type ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-01-25 11:38:55 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    Style  style ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-14 18:31:09 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    @ string_index_type @  start  {  0  } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    @ string_index_type @  middle  {  0  } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    @ string_index_type @  end  {  0  } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    @ string_index_type @  pair  {  0  } ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-06 13:56:44 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								} ;  
						 
					
						
							
								
									
										
										
										
											2022-07-05 19:40:40 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								struct  TextLayout  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    CharacterOrder  character_order ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								} ;  
						 
					
						
							
								
									
										
										
										
											2021-10-10 11:41:13 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								) ~ ~ ~ " );  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 11:48:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    generate_available_values ( generator ,  " get_available_calendars " sv ,  cldr . keywords . find ( " ca " sv ) - > value ,  cldr . keyword_aliases . find ( " ca " sv ) - > value , 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-14 09:37:36 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        [ ] ( auto  calendar )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            // FIXME: Remove this filter when we support all calendars.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  calendar . is_one_of ( " gregory " sv ,  " iso8601 " sv ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 11:48:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    generate_available_values ( generator ,  " get_available_collation_case_orderings " sv ,  cldr . keywords . find ( " kf " sv ) - > value ,  cldr . keyword_aliases . find ( " kf " sv ) - > value ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    generate_available_values ( generator ,  " get_available_collation_numeric_orderings " sv ,  cldr . keywords . find ( " kn " sv ) - > value ,  cldr . keyword_aliases . find ( " kn " sv ) - > value ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    generate_available_values ( generator ,  " get_available_collation_types " sv ,  cldr . keywords . find ( " co " sv ) - > value ,  cldr . keyword_aliases . find ( " co " sv ) - > value , 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-14 09:37:36 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        [ ] ( auto  collation )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            // FIXME: Remove this filter when we support all collation types.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  collation  = =  " default " sv ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 11:48:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    generate_available_values ( generator ,  " get_available_hour_cycles " sv ,  cldr . keywords . find ( " hc " sv ) - > value ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    generate_available_values ( generator ,  " get_available_number_systems " sv ,  cldr . keywords . find ( " nu " sv ) - > value ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    generate_available_values ( generator ,  " get_available_currencies " sv ,  cldr . currencies ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-01-30 16:51:29 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-07-14 14:06:17 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    generator . append ( R " ~~~( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								Span < StringView  const >  get_available_keyword_values ( StringView  key )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    auto  key_value  =  key_from_string ( key ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( ! key_value . has_value ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  { } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    switch  ( * key_value )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    case  Key : : Ca : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  get_available_calendars ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    case  Key : : Co : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  get_available_collation_types ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    case  Key : : Hc : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  get_available_hour_cycles ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    case  Key : : Kf : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  get_available_collation_case_orderings ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    case  Key : : Kn : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  get_available_collation_numeric_orderings ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    case  Key : : Nu : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  get_available_number_systems ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    VERIFY_NOT_REACHED ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								) ~ ~ ~ " );  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 11:48:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    cldr . unique_display_patterns . generate ( generator ,  " DisplayPatternImpl " sv ,  " s_display_patterns " sv ,  30 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-11-18 11:04:33 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    cldr . unique_language_lists . generate ( generator ,  string_index_type ,  " s_language_lists " sv ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    cldr . unique_territory_lists . generate ( generator ,  string_index_type ,  " s_territory_lists " sv ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    cldr . unique_script_lists . generate ( generator ,  string_index_type ,  " s_script_lists " sv ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    cldr . unique_currency_lists . generate ( generator ,  string_index_type ,  " s_currency_lists " sv ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    cldr . unique_calendar_lists . generate ( generator ,  string_index_type ,  " s_calendar_lists " sv ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    cldr . unique_date_field_lists . generate ( generator ,  string_index_type ,  " s_date_field_lists " sv ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    cldr . unique_keyword_lists . generate ( generator ,  string_index_type ,  " s_keyword_lists " sv ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 11:48:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    cldr . unique_list_patterns . generate ( generator ,  " Patterns " sv ,  " s_list_patterns " sv ,  10 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-11-18 11:04:33 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    cldr . unique_list_pattern_lists . generate ( generator ,  cldr . unique_list_patterns . type_that_fits ( ) ,  " s_list_pattern_lists " sv ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 11:48:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    cldr . unique_text_layouts . generate ( generator ,  " TextLayout " sv ,  " s_text_layouts " sv ,  30 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-10 11:41:13 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-10-14 18:31:09 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    auto  append_index  =  [ & ] ( auto  index )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-12-04 18:02:33 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        generator . append ( DeprecatedString : : formatted ( " , {} " ,  index ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-02 17:46:35 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    auto  append_list_and_size  =  [ & ] ( auto  const &  list )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( list . is_empty ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            generator . append ( " , {}, 0 " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        bool  first  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        generator . append ( " , { " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        for  ( auto  const &  item  :  list )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-11 17:32:29 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            generator . append ( first  ?  "   " sv  :  " ,  " sv ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-12-04 18:02:33 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            generator . append ( DeprecatedString : : number ( item ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-02 17:46:35 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            first  =  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
									
										
										
										
											2022-12-04 18:02:33 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        generator . append ( DeprecatedString : : formatted ( "  }}, {} " ,  list . size ( ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-02 17:46:35 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-12-13 11:59:21 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    auto  append_mapping  =  [ & ] ( auto  const &  keys ,  auto  const &  map ,  auto  type ,  auto  name ,  auto  mapping_getter )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        generator . set ( " type " ,  type ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        generator . set ( " name " ,  name ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-12-04 18:02:33 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        generator . set ( " size " ,  DeprecatedString : : number ( keys . size ( ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-12-13 11:59:21 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        generator . append ( R " ~~~( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  constexpr  Array < @ type @ ,  @ size @ >  @ name @  {  { ) ~ ~ ~ " );  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        bool  first  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        for  ( auto  const &  key  :  keys )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            auto  const &  value  =  map . find ( key ) - > value ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            auto  mapping  =  mapping_getter ( value ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-07-11 17:32:29 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            generator . append ( first  ?  "   " sv  :  " ,  " sv ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-12-04 18:02:33 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            generator . append ( DeprecatedString : : number ( mapping ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-12-13 11:59:21 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            first  =  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        generator . append ( "  } }; " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 11:48:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    auto  locales  =  cldr . locales . keys ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-12-13 11:59:21 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    quick_sort ( locales ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-11-18 11:04:33 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    append_mapping ( locales ,  cldr . locales ,  cldr . unique_display_patterns . type_that_fits ( ) ,  " s_locale_display_patterns " sv ,  [ & ] ( auto  const &  locale )  {  return  locale . display_patterns ;  } ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    append_mapping ( locales ,  cldr . locales ,  cldr . unique_language_lists . type_that_fits ( ) ,  " s_languages " sv ,  [ & ] ( auto  const &  locale )  {  return  locale . languages ;  } ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    append_mapping ( locales ,  cldr . locales ,  cldr . unique_territory_lists . type_that_fits ( ) ,  " s_territories " sv ,  [ & ] ( auto  const &  locale )  {  return  locale . territories ;  } ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    append_mapping ( locales ,  cldr . locales ,  cldr . unique_script_lists . type_that_fits ( ) ,  " s_scripts " sv ,  [ & ] ( auto  const &  locale )  {  return  locale . scripts ;  } ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    append_mapping ( locales ,  cldr . locales ,  cldr . unique_currency_lists . type_that_fits ( ) ,  " s_long_currencies " sv ,  [ & ] ( auto  const &  locale )  {  return  locale . long_currencies ;  } ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    append_mapping ( locales ,  cldr . locales ,  cldr . unique_currency_lists . type_that_fits ( ) ,  " s_short_currencies " sv ,  [ & ] ( auto  const &  locale )  {  return  locale . short_currencies ;  } ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    append_mapping ( locales ,  cldr . locales ,  cldr . unique_currency_lists . type_that_fits ( ) ,  " s_narrow_currencies " sv ,  [ & ] ( auto  const &  locale )  {  return  locale . narrow_currencies ;  } ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    append_mapping ( locales ,  cldr . locales ,  cldr . unique_currency_lists . type_that_fits ( ) ,  " s_numeric_currencies " sv ,  [ & ] ( auto  const &  locale )  {  return  locale . numeric_currencies ;  } ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    append_mapping ( locales ,  cldr . locales ,  cldr . unique_calendar_lists . type_that_fits ( ) ,  " s_calendars " sv ,  [ & ] ( auto  const &  locale )  {  return  locale . calendars ;  } ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    append_mapping ( locales ,  cldr . locales ,  cldr . unique_date_field_lists . type_that_fits ( ) ,  " s_long_date_fields " sv ,  [ & ] ( auto  const &  locale )  {  return  locale . long_date_fields ;  } ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    append_mapping ( locales ,  cldr . locales ,  cldr . unique_date_field_lists . type_that_fits ( ) ,  " s_short_date_fields " sv ,  [ & ] ( auto  const &  locale )  {  return  locale . short_date_fields ;  } ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    append_mapping ( locales ,  cldr . locales ,  cldr . unique_date_field_lists . type_that_fits ( ) ,  " s_narrow_date_fields " sv ,  [ & ] ( auto  const &  locale )  {  return  locale . narrow_date_fields ;  } ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    append_mapping ( locales ,  cldr . locales ,  cldr . unique_keyword_lists . type_that_fits ( ) ,  " s_calendar_keywords " sv ,  [ & ] ( auto  const &  locale )  {  return  locale . calendar_keywords ;  } ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    append_mapping ( locales ,  cldr . locales ,  cldr . unique_keyword_lists . type_that_fits ( ) ,  " s_collation_case_keywords " sv ,  [ & ] ( auto  const &  locale )  {  return  locale . collation_case_keywords ;  } ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    append_mapping ( locales ,  cldr . locales ,  cldr . unique_keyword_lists . type_that_fits ( ) ,  " s_collation_numeric_keywords " sv ,  [ & ] ( auto  const &  locale )  {  return  locale . collation_numeric_keywords ;  } ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    append_mapping ( locales ,  cldr . locales ,  cldr . unique_keyword_lists . type_that_fits ( ) ,  " s_number_system_keywords " sv ,  [ & ] ( auto  const &  locale )  {  return  locale . number_system_keywords ;  } ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    append_mapping ( locales ,  cldr . locales ,  cldr . unique_list_pattern_lists . type_that_fits ( ) ,  " s_locale_list_patterns " sv ,  [ & ] ( auto  const &  locale )  {  return  locale . list_patterns ;  } ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    append_mapping ( locales ,  cldr . locales ,  cldr . unique_text_layouts . type_that_fits ( ) ,  " s_locale_text_layouts " sv ,  [ & ] ( auto  const &  locale )  {  return  locale . text_layout ;  } ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-24 19:50:18 -04:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-08-31 10:03:49 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    generator . append ( R " ~~~( 
							 
						 
					
						
							
								
									
										
										
										
											2021-12-13 12:58:40 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-01-19 10:53:20 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								struct  CanonicalLanguageID  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ErrorOr < LanguageID >  to_unicode_language_id ( )  const 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-02 17:46:35 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    { 
							 
						 
					
						
							
								
									
										
										
										
											2022-01-04 12:22:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        LanguageID  language_id  { } ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-01-19 10:53:20 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        TRY ( language_id . variants . try_ensure_capacity ( variants_size ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-02 17:46:35 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-01-19 10:53:20 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        language_id . language  =  TRY ( String : : from_utf8 ( decode_string ( language ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-10 13:56:33 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ( script  ! =  0 ) 
							 
						 
					
						
							
								
									
										
										
										
											2023-01-19 10:53:20 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            language_id . script  =  TRY ( String : : from_utf8 ( decode_string ( script ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-10 13:56:33 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ( region  ! =  0 ) 
							 
						 
					
						
							
								
									
										
										
										
											2023-01-19 10:53:20 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            language_id . region  =  TRY ( String : : from_utf8 ( decode_string ( region ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-02 17:46:35 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        for  ( size_t  i  =  0 ;  i  <  variants_size ;  + + i ) 
							 
						 
					
						
							
								
									
										
										
										
											2023-01-19 10:53:20 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            language_id . variants . append ( TRY ( String : : from_utf8 ( decode_string ( variants [ i ] ) ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-02 17:46:35 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  language_id ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-01-19 10:53:20 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    bool  matches_variants ( Vector < String >  const &  other_variants )  const  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-02 17:46:35 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ( variants_size  = =  0 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( other_variants . size ( )  ! =  variants_size ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        for  ( size_t  i  =  0 ;  i  <  variants_size ;  + + i )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-15 13:01:42 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            if  ( decode_string ( variants [ i ] )  ! =  other_variants [ i ] ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-02 17:46:35 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                return  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-10-14 18:31:09 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    @ string_index_type @  language  {  0  } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    @ string_index_type @  script  {  0  } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    @ string_index_type @  region  {  0  } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    Array < @ string_index_type @ ,  @ variants_size @ >  variants  { } ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-02 17:46:35 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    size_t  variants_size  {  0  } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								} ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-08-31 10:03:49 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								struct  LanguageMapping  {  
						 
					
						
							
								
									
										
										
										
											2021-09-02 17:46:35 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    CanonicalLanguageID  key ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    CanonicalLanguageID  alias ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-31 10:03:49 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								} ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								) ~ ~ ~ " );  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-09-02 17:46:35 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    auto  append_complex_mapping  =  [ & ] ( StringView  name ,  auto &  mappings )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-12-04 18:02:33 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        generator . set ( " size " ,  DeprecatedString : : number ( mappings . size ( ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-31 10:03:49 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        generator . set ( " name " sv ,  name ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-09-02 17:46:35 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        generator . append ( R " ~~~( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  constexpr  Array < LanguageMapping ,  @ size @ >  s_ @ name @  {  {  
						 
					
						
							
								
									
										
										
										
											2021-08-31 10:03:49 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								) ~ ~ ~ " );  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-10-10 13:56:33 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        quick_sort ( mappings ,  [ & ] ( auto  const &  lhs ,  auto  const &  rhs )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 11:48:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            auto  const &  lhs_language  =  cldr . unique_strings . get ( lhs . key . language ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            auto  const &  rhs_language  =  cldr . unique_strings . get ( rhs . key . language ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-02 17:46:35 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-08-31 10:03:49 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            // Sort the keys such that "und" language tags are at the end, as those are less specific.
 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-02 17:46:35 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            if  ( lhs_language . starts_with ( " und " sv )  & &  ! rhs_language . starts_with ( " und " sv ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-31 10:03:49 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                return  false ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-02 17:46:35 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            if  ( ! lhs_language . starts_with ( " und " sv )  & &  rhs_language . starts_with ( " und " sv ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-31 10:03:49 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                return  true ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-02 17:46:35 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            return  lhs_language  <  rhs_language ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-31 10:03:49 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        } ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-09-02 17:46:35 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        for  ( auto  const &  mapping  :  mappings )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-12-04 18:02:33 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            generator . set ( " language " sv ,  DeprecatedString : : number ( mapping . key . language ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-10 13:56:33 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            generator . append ( "     { { @language@ " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-31 10:03:49 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-10-10 13:56:33 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            append_index ( mapping . key . script ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            append_index ( mapping . key . region ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-02 17:46:35 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            append_list_and_size ( mapping . key . variants ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-31 10:03:49 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-12-04 18:02:33 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            generator . set ( " language " sv ,  DeprecatedString : : number ( mapping . alias . language ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-10 13:56:33 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            generator . append ( "  }, { @language@ " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-02 17:46:35 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-10-10 13:56:33 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            append_index ( mapping . alias . script ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            append_index ( mapping . alias . region ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-02 17:46:35 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            append_list_and_size ( mapping . alias . variants ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            generator . append ( "  } }, \n " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        generator . append ( " } }; \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-31 10:03:49 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 11:48:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    append_complex_mapping ( " complex_alias " sv ,  cldr . complex_mappings ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    append_complex_mapping ( " likely_subtags " sv ,  cldr . likely_subtags ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-31 10:03:49 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-08-26 06:56:17 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    generator . append ( R " ~~~( 
							 
						 
					
						
							
								
									
										
										
										
											2022-01-04 12:22:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  LanguageMapping  const *  resolve_likely_subtag ( LanguageID  const &  language_id )  
						 
					
						
							
								
									
										
										
										
											2021-08-31 09:40:24 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    // https://unicode.org/reports/tr35/#Likely_Subtags
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    enum  class  State  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        LanguageScriptRegion , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        LanguageRegion , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        LanguageScript , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        Language , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        UndScript , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        Done , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    auto  state  =  State : : LanguageScriptRegion ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    while  ( state  ! =  State : : Done )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-01-04 12:22:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        LanguageID  search_key ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-31 09:40:24 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        switch  ( state )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        case  State : : LanguageScriptRegion : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            state  =  State : : LanguageRegion ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  ( ! language_id . script . has_value ( )  | |  ! language_id . region . has_value ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                continue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-09-02 17:46:35 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            search_key . language  =  * language_id . language ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            search_key . script  =  * language_id . script ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            search_key . region  =  * language_id . region ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-31 09:40:24 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        case  State : : LanguageRegion : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            state  =  State : : LanguageScript ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  ( ! language_id . region . has_value ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                continue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-09-02 17:46:35 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            search_key . language  =  * language_id . language ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            search_key . region  =  * language_id . region ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-31 09:40:24 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        case  State : : LanguageScript : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            state  =  State : : Language ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  ( ! language_id . script . has_value ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                continue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-09-02 17:46:35 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            search_key . language  =  * language_id . language ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            search_key . script  =  * language_id . script ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-31 09:40:24 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        case  State : : Language : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            state  =  State : : UndScript ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-02 17:46:35 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            search_key . language  =  * language_id . language ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-31 09:40:24 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        case  State : : UndScript : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            state  =  State : : Done ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  ( ! language_id . script . has_value ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                continue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-01-19 10:53:20 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            search_key . language  =  String : : from_utf8 ( " und " sv ) . release_value_but_fixme_should_propagate_errors ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-02 17:46:35 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            search_key . script  =  * language_id . script ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-31 09:40:24 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        default : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            VERIFY_NOT_REACHED ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-09-02 17:46:35 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        for  ( auto  const &  map  :  s_likely_subtags )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-15 13:01:42 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            auto  const &  key_language  =  decode_string ( map . key . language ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            auto  const &  key_script  =  decode_string ( map . key . script ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            auto  const &  key_region   =  decode_string ( map . key . region ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-10 13:56:33 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  ( key_language  ! =  search_key . language ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-31 09:40:24 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                continue ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-10 13:56:33 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            if  ( ! key_script . is_empty ( )  | |  search_key . script . has_value ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if  ( key_script  ! =  search_key . script ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    continue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  ( ! key_region . is_empty ( )  | |  search_key . region . has_value ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if  ( key_region  ! =  search_key . region ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    continue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-31 09:40:24 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-09-02 18:21:42 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            return  & map ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-31 09:40:24 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  nullptr ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-08-26 06:56:17 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								) ~ ~ ~ " );  
						 
					
						
							
								
									
										
										
										
											2021-08-24 19:50:18 -04:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-12-13 12:33:10 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    auto  append_mapping_search  =  [ & ] ( StringView  enum_snake ,  StringView  from_string_name ,  StringView  collection_name ,  StringView  unique_list )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-26 06:56:17 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        generator . set ( " enum_snake " ,  enum_snake ) ; 
							 
						 
					
						
							
								
									
										
											 
										
											
												LibJS+LibUnicode: Generate all styles of currency localizations
Currently, LibUnicode is only parsing and generating the "long" style of
currency display names. However, the CLDR contains "short" and "narrow"
forms as well that need to be handled. Parse these, and update LibJS to
actually respect the "style" option provided by the user for displaying
currencies with Intl.DisplayNames.
Note: There are some discrepencies between the engines on how style is
handled. In particular, running:
new Intl.DisplayNames('en', {type:'currency', style:'narrow'}).of('usd')
Gives:
  SpiderMoney: "USD"
  V8: "US Dollar"
  LibJS: "$"
And running:
new Intl.DisplayNames('en', {type:'currency', style:'short'}).of('usd')
Gives:
  SpiderMonkey: "$"
  V8: "US Dollar"
  LibJS: "$"
My best guess is V8 isn't handling style, and just returning the long
form (which is what LibJS did before this commit). And SpiderMoney can
handle some styles, but if they don't have a value for the requested
style, they fall back to the canonicalized code passed into of().
											 
										 
										
											2021-11-12 13:11:30 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        generator . set ( " from_string_name " ,  from_string_name ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-26 06:56:17 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        generator . set ( " collection_name " ,  collection_name ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-12-13 12:33:10 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        generator . set ( " unique_list " ,  unique_list ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-08-26 06:56:17 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        generator . append ( R " ~~~( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								Optional < StringView >  get_locale_ @ enum_snake @ _mapping ( StringView  locale ,  StringView  @ enum_snake @ )  
						 
					
						
							
								
									
										
										
										
											2021-08-24 19:50:18 -04:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2021-08-26 06:56:17 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    auto  locale_value  =  locale_from_string ( locale ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( ! locale_value . has_value ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  { } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										
											
												LibJS+LibUnicode: Generate all styles of currency localizations
Currently, LibUnicode is only parsing and generating the "long" style of
currency display names. However, the CLDR contains "short" and "narrow"
forms as well that need to be handled. Parse these, and update LibJS to
actually respect the "style" option provided by the user for displaying
currencies with Intl.DisplayNames.
Note: There are some discrepencies between the engines on how style is
handled. In particular, running:
new Intl.DisplayNames('en', {type:'currency', style:'narrow'}).of('usd')
Gives:
  SpiderMoney: "USD"
  V8: "US Dollar"
  LibJS: "$"
And running:
new Intl.DisplayNames('en', {type:'currency', style:'short'}).of('usd')
Gives:
  SpiderMonkey: "$"
  V8: "US Dollar"
  LibJS: "$"
My best guess is V8 isn't handling style, and just returning the long
form (which is what LibJS did before this commit). And SpiderMoney can
handle some styles, but if they don't have a value for the requested
style, they fall back to the canonicalized code passed into of().
											 
										 
										
											2021-11-12 13:11:30 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    auto  @ enum_snake @ _value  =  @ from_string_name @ _from_string ( @ enum_snake @ ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-26 06:56:17 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  ( ! @ enum_snake @ _value . has_value ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  { } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    auto  locale_index  =  to_underlying ( * locale_value )  -  1 ;  // Subtract 1 because 0 == Locale::None.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    auto  @ enum_snake @ _index  =  to_underlying ( * @ enum_snake @ _value ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-12-13 11:59:21 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    auto  mapping_index  =  @ collection_name @ . at ( locale_index ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    auto  const &  mappings  =  @ unique_list @ . at ( mapping_index ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-10-10 11:41:13 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    auto  @ enum_snake @ _string_index  =  mappings . at ( @ enum_snake @ _index ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-15 13:01:42 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    auto  @ enum_snake @ _mapping  =  decode_string ( @ enum_snake @ _string_index ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-26 06:56:17 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( @ enum_snake @ _mapping . is_empty ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  { } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  @ enum_snake @ _mapping ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-24 19:50:18 -04:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								) ~ ~ ~ " );  
						 
					
						
							
								
									
										
										
										
											2021-08-26 06:56:17 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-24 19:50:18 -04:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-12-06 02:57:24 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    auto  append_from_string  =  [ & ] ( StringView  enum_title ,  StringView  enum_snake ,  auto  const &  values ,  Vector < Alias >  const &  aliases  =  { } )  - >  ErrorOr < void >  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-12-04 18:02:33 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        HashValueMap < DeprecatedString >  hashes ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-12-06 02:57:24 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        TRY ( hashes . try_ensure_capacity ( values . size ( ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-24 19:50:18 -04:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-10-12 12:22:47 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        for  ( auto  const &  value  :  values ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            hashes . set ( value . hash ( ) ,  format_identifier ( enum_title ,  value ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-17 08:20:19 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        for  ( auto  const &  alias  :  aliases ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            hashes . set ( alias . alias . hash ( ) ,  format_identifier ( enum_title ,  alias . alias ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-24 19:50:18 -04:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-01-04 12:22:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        generate_value_from_string ( generator ,  " {}_from_string " sv ,  enum_title ,  enum_snake ,  move ( hashes ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-12-06 02:57:24 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  { } ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-24 19:50:18 -04:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-12-06 02:57:24 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    auto  append_alias_search  =  [ & ] ( StringView  enum_snake ,  auto  const &  aliases )  - >  ErrorOr < void >  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-11-18 11:04:33 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        HashValueMap < size_t >  hashes ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-12-06 02:57:24 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        TRY ( hashes . try_ensure_capacity ( aliases . size ( ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-30 14:56:23 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-10-12 12:22:47 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        for  ( auto  const &  alias  :  aliases ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            hashes . set ( alias . key . hash ( ) ,  alias . value ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-31 10:03:49 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-01-10 12:19:58 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        ValueFromStringOptions  options  { } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        options . return_type  =  " StringView " sv ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-15 13:01:42 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        options . return_format  =  " decode_string({}) " sv ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-01-10 12:19:58 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-11-18 11:04:33 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        generate_value_from_string ( generator ,  " resolve_{}_alias " sv ,  string_index_type ,  enum_snake ,  move ( hashes ) ,  options ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-12-06 02:57:24 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  { } ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-30 14:56:23 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-12-06 02:57:24 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    TRY ( append_from_string ( " Locale " sv ,  " locale " sv ,  cldr . locales . keys ( ) ,  cldr . locale_aliases ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-26 08:17:01 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-12-06 02:57:24 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    TRY ( append_from_string ( " Language " sv ,  " language " sv ,  cldr . languages ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-12-15 19:48:13 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    append_mapping_search ( " language " sv ,  " language " sv ,  " s_languages " sv ,  " s_language_lists " sv ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-12-06 02:57:24 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    TRY ( append_alias_search ( " language " sv ,  cldr . language_aliases ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-26 06:56:17 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-12-06 02:57:24 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    TRY ( append_from_string ( " Territory " sv ,  " territory " sv ,  cldr . territories ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-12-15 19:48:13 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    append_mapping_search ( " territory " sv ,  " territory " sv ,  " s_territories " sv ,  " s_territory_lists " sv ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-12-06 02:57:24 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    TRY ( append_alias_search ( " territory " sv ,  cldr . territory_aliases ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-24 19:50:18 -04:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-12-06 02:57:24 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    TRY ( append_from_string ( " ScriptTag " sv ,  " script_tag " sv ,  cldr . scripts ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-01-04 12:22:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    append_mapping_search ( " script " sv ,  " script_tag " sv ,  " s_scripts " sv ,  " s_script_lists " sv ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-12-06 02:57:24 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    TRY ( append_alias_search ( " script_tag " sv ,  cldr . script_aliases ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-26 08:29:39 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-12-06 02:57:24 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    TRY ( append_from_string ( " Currency " sv ,  " currency " sv ,  cldr . currencies ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-12-13 12:12:18 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    append_mapping_search ( " long_currency " sv ,  " currency " sv ,  " s_long_currencies " sv ,  " s_currency_lists " sv ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    append_mapping_search ( " short_currency " sv ,  " currency " sv ,  " s_short_currencies " sv ,  " s_currency_lists " sv ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    append_mapping_search ( " narrow_currency " sv ,  " currency " sv ,  " s_narrow_currencies " sv ,  " s_currency_lists " sv ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    append_mapping_search ( " numeric_currency " sv ,  " currency " sv ,  " s_numeric_currencies " sv ,  " s_currency_lists " sv ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-26 08:38:54 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-12-06 02:57:24 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    TRY ( append_from_string ( " DateField " sv ,  " date_field " sv ,  cldr . date_fields ,  cldr . date_field_aliases ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-01-12 17:16:12 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    append_mapping_search ( " long_date_field " sv ,  " date_field " sv ,  " s_long_date_fields " sv ,  " s_date_field_lists " sv ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    append_mapping_search ( " short_date_field " sv ,  " date_field " sv ,  " s_short_date_fields " sv ,  " s_date_field_lists " sv ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    append_mapping_search ( " narrow_date_field " sv ,  " date_field " sv ,  " s_narrow_date_fields " sv ,  " s_date_field_lists " sv ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-12-06 02:57:24 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    TRY ( append_from_string ( " Key " sv ,  " key " sv ,  cldr . keywords . keys ( ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-15 12:23:26 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 11:48:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    for  ( auto  const &  keyword  :  cldr . keywords )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        auto  const &  keyword_name  =  cldr . keyword_names . find ( keyword . key ) - > value ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-12-04 18:02:33 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        auto  enum_name  =  DeprecatedString : : formatted ( " Keyword{} " ,  format_identifier ( { } ,  keyword_name ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        auto  enum_snake  =  DeprecatedString : : formatted ( " keyword_{} " ,  keyword . key ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-15 12:23:26 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 11:48:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ( auto  aliases  =  cldr . keyword_aliases . find ( keyword . key ) ;  aliases  ! =  cldr . keyword_aliases . end ( ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2022-12-06 02:57:24 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            TRY ( append_from_string ( enum_name ,  enum_snake ,  keyword . value ,  aliases - > value ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-15 12:23:26 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        else 
							 
						 
					
						
							
								
									
										
										
										
											2022-12-06 02:57:24 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            TRY ( append_from_string ( enum_name ,  enum_snake ,  keyword . value ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-15 12:23:26 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    append_mapping_search ( " calendar " sv ,  " keyword_ca " sv ,  " s_calendars " sv ,  " s_calendar_lists " sv ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-10 09:56:11 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-12-06 02:57:24 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    TRY ( append_alias_search ( " variant " sv ,  cldr . variant_aliases ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    TRY ( append_alias_search ( " subdivision " sv ,  cldr . subdivision_aliases ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-30 14:56:23 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-12-06 02:57:24 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    TRY ( append_from_string ( " ListPatternType " sv ,  " list_pattern_type " sv ,  cldr . list_pattern_types ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-06 13:56:44 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-12-06 02:57:24 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    TRY ( append_from_string ( " CharacterOrder " sv ,  " character_order " sv ,  cldr . character_orders ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 11:48:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    generate_value_to_string ( generator ,  " {}_to_string " sv ,  " CharacterOrder " sv ,  " character_order " sv ,  format_identifier ,  cldr . character_orders ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-05 19:40:40 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-08-24 19:50:18 -04:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    generator . append ( R " ~~~( 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-14 13:14:11 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  Span < @ string_index_type @  const >  find_keyword_indices ( StringView  locale ,  StringView  key )  
						 
					
						
							
								
									
										
										
										
											2022-02-15 12:23:26 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    auto  locale_value  =  locale_from_string ( locale ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( ! locale_value . has_value ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  { } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    auto  key_value  =  key_from_string ( key ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( ! key_value . has_value ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  { } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    auto  locale_index  =  to_underlying ( * locale_value )  -  1 ;  // Subtract 1 because 0 == Locale::None.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    size_t  keywords_index  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    switch  ( * key_value )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    case  Key : : Ca : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        keywords_index  =  s_calendar_keywords . at ( locale_index ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    case  Key : : Kf : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        keywords_index  =  s_collation_case_keywords . at ( locale_index ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    case  Key : : Kn : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        keywords_index  =  s_collation_numeric_keywords . at ( locale_index ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    case  Key : : Nu : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        keywords_index  =  s_number_system_keywords . at ( locale_index ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    default : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        VERIFY_NOT_REACHED ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-07-14 13:14:11 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    return  s_keyword_lists . at ( keywords_index ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								Optional < StringView >  get_preferred_keyword_value_for_locale ( StringView  locale ,  StringView  key )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    // Hour cycle keywords are region-based rather than locale-based, so they need to be handled specially.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    // FIXME: Calendar keywords are also region-based, and will need to be handled here when we support non-Gregorian calendars:
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    //        https://github.com/unicode-org/cldr-json/blob/main/cldr-json/cldr-core/supplemental/calendarPreferenceData.json
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( key  = =  " hc " sv )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        auto  hour_cycles  =  get_locale_hour_cycles ( locale ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( hour_cycles . is_empty ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  { } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  hour_cycle_to_string ( hour_cycles [ 0 ] ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    // FIXME: Generate locale-preferred collation data when available in the CLDR.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( key  = =  " co " sv )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        auto  collations  =  get_available_collation_types ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( collations . is_empty ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  { } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  collations [ 0 ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    auto  keyword_indices  =  find_keyword_indices ( locale ,  key ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( keyword_indices . is_empty ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  { } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-08-15 13:01:42 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    return  decode_string ( keyword_indices [ 0 ] ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-14 13:14:11 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								Vector < StringView >  get_keywords_for_locale ( StringView  locale ,  StringView  key )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    // Hour cycle keywords are region-based rather than locale-based, so they need to be handled specially.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    // FIXME: Calendar keywords are also region-based, and will need to be handled here when we support non-Gregorian calendars:
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    //        https://github.com/unicode-org/cldr-json/blob/main/cldr-json/cldr-core/supplemental/calendarPreferenceData.json
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( key  = =  " hc " sv )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        auto  hour_cycles  =  get_locale_hour_cycles ( locale ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        Vector < StringView >  values ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        values . ensure_capacity ( hour_cycles . size ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        for  ( auto  hour_cycle  :  hour_cycles ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            values . unchecked_append ( hour_cycle_to_string ( hour_cycle ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  values ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    // FIXME: Generate locale-preferred collation data when available in the CLDR.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( key  = =  " co " sv ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  Vector < StringView >  {  get_available_collation_types ( )  } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    auto  keyword_indices  =  find_keyword_indices ( locale ,  key ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-15 12:23:26 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    Vector < StringView >  keywords ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    keywords . ensure_capacity ( keyword_indices . size ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    for  ( auto  keyword  :  keyword_indices ) 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-15 13:01:42 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        keywords . unchecked_append ( decode_string ( keyword ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-15 12:23:26 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  keywords ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-01-13 13:10:24 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								Optional < DisplayPattern >  get_locale_display_patterns ( StringView  locale )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    auto  locale_value  =  locale_from_string ( locale ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( ! locale_value . has_value ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  { } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    auto  locale_index  =  to_underlying ( * locale_value )  -  1 ;  // Subtract 1 because 0 == Locale::None.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    auto  display_patterns_index  =  s_locale_display_patterns . at ( locale_index ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    auto  const &  display_patterns  =  s_display_patterns . at ( display_patterns_index ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  display_patterns . to_display_pattern ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-01-25 11:38:55 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								Optional < ListPatterns >  get_locale_list_patterns ( StringView  locale ,  StringView  list_pattern_type ,  Style  list_pattern_style )  
						 
					
						
							
								
									
										
										
										
											2021-09-06 13:56:44 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    auto  locale_value  =  locale_from_string ( locale ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( ! locale_value . has_value ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  { } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    auto  type_value  =  list_pattern_type_from_string ( list_pattern_type ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( ! type_value . has_value ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  { } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    auto  locale_index  =  to_underlying ( * locale_value )  -  1 ;  // Subtract 1 because 0 == Locale::None.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-12-13 12:58:40 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    auto  list_patterns_list_index  =  s_locale_list_patterns . at ( locale_index ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    auto  const &  locale_list_patterns  =  s_list_pattern_lists . at ( list_patterns_list_index ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    for  ( auto  list_patterns_index  :  locale_list_patterns )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        auto  const &  list_patterns  =  s_list_patterns . at ( list_patterns_index ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-01-25 11:38:55 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ( ( list_patterns . type  = =  type_value )  & &  ( list_patterns . style  = =  list_pattern_style ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-15 13:01:42 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            auto  const &  start  =  decode_string ( list_patterns . start ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            auto  const &  middle  =  decode_string ( list_patterns . middle ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            auto  const &  end  =  decode_string ( list_patterns . end ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            auto  const &  pair  =  decode_string ( list_patterns . pair ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-10 11:58:55 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  ListPatterns  {  start ,  middle ,  end ,  pair  } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-06 13:56:44 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  { } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-07-05 19:40:40 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  Optional < TextLayout >  text_layout_for_locale ( StringView  locale )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    auto  locale_value  =  locale_from_string ( locale ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( ! locale_value . has_value ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  { } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    auto  locale_index  =  to_underlying ( * locale_value )  -  1 ;  // Subtract 1 because 0 == Locale::None.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    auto  text_layouts_index  =  s_locale_text_layouts . at ( locale_index ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  s_text_layouts . at ( text_layouts_index ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								Optional < CharacterOrder >  character_order_for_locale ( StringView  locale )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( auto  text_layout  =  text_layout_for_locale ( locale ) ;  text_layout . has_value ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  text_layout - > character_order ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  { } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-01-04 12:22:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  resolve_complex_language_aliases ( LanguageID &  language_id )  
						 
					
						
							
								
									
										
										
										
											2021-08-31 10:03:49 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2021-09-02 17:46:35 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    for  ( auto  const &  map  :  s_complex_alias )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-01-19 10:53:20 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        auto  key_language  =  decode_string ( map . key . language ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        auto  key_script  =  decode_string ( map . key . script ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        auto  key_region   =  decode_string ( map . key . region ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-10 13:56:33 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( ( key_language  ! =  language_id . language )  & &  ( key_language  ! =  " und " sv ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-31 10:03:49 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            continue ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-10 13:56:33 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ( ! key_script . is_empty ( )  & &  ( key_script  ! =  language_id . script ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-31 10:03:49 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            continue ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-10 13:56:33 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ( ! key_region . is_empty ( )  & &  ( key_region  ! =  language_id . region ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-31 10:03:49 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            continue ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-02 17:46:35 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ( ! map . key . matches_variants ( language_id . variants ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-31 10:03:49 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            continue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-01-19 10:53:20 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        auto  alias  =  map . alias . to_unicode_language_id ( ) . release_value_but_fixme_should_propagate_errors ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-02 17:46:35 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-08-31 10:03:49 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ( alias . language  = =  " und " sv ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            alias . language  =  move ( language_id . language ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-10 13:56:33 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ( key_script . is_empty ( )  & &  ! alias . script . has_value ( ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-31 10:03:49 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            alias . script  =  move ( language_id . script ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-10 13:56:33 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ( key_region . is_empty ( )  & &  ! alias . region . has_value ( ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-31 10:03:49 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            alias . region  =  move ( language_id . region ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-02 17:46:35 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ( map . key . variants_size  = =  0  & &  alias . variants . is_empty ( ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-31 10:03:49 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            alias . variants  =  move ( language_id . variants ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        language_id  =  move ( alias ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-01-04 12:22:25 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								Optional < LanguageID >  add_likely_subtags ( LanguageID  const &  language_id )  
						 
					
						
							
								
									
										
										
										
											2021-09-02 18:21:42 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    // https://www.unicode.org/reports/tr35/#Likely_Subtags
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    auto  const *  likely_subtag  =  resolve_likely_subtag ( language_id ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( likely_subtag  = =  nullptr ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  { } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    auto  maximized  =  language_id ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-10 13:56:33 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-01-19 10:53:20 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    auto  key_script  =  decode_string ( likely_subtag - > key . script ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    auto  key_region  =  decode_string ( likely_subtag - > key . region ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-10 13:56:33 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-01-19 10:53:20 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    auto  alias_language  =  decode_string ( likely_subtag - > alias . language ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    auto  alias_script  =  decode_string ( likely_subtag - > alias . script ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    auto  alias_region  =  decode_string ( likely_subtag - > alias . region ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-02 18:21:42 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( maximized . language  = =  " und " sv ) 
							 
						 
					
						
							
								
									
										
										
										
											2023-01-19 10:53:20 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        maximized . language  =  String : : from_utf8 ( alias_language ) . release_value_but_fixme_should_propagate_errors ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-10 13:56:33 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  ( ! maximized . script . has_value ( )  | |  ( ! key_script . is_empty ( )  & &  ! alias_script . is_empty ( ) ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2023-01-19 10:53:20 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        maximized . script  =  String : : from_utf8 ( alias_script ) . release_value_but_fixme_should_propagate_errors ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-10 13:56:33 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  ( ! maximized . region . has_value ( )  | |  ( ! key_region . is_empty ( )  & &  ! alias_region . is_empty ( ) ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2023-01-19 10:53:20 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        maximized . region  =  String : : from_utf8 ( alias_region ) . release_value_but_fixme_should_propagate_errors ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-02 18:21:42 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  maximized ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-12-04 18:02:33 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								Optional < DeprecatedString >  resolve_most_likely_territory ( LanguageID  const &  language_id )  
						 
					
						
							
								
									
										
										
										
											2021-08-31 09:40:24 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( auto  const *  likely_subtag  =  resolve_likely_subtag ( language_id ) ;  likely_subtag  ! =  nullptr ) 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-15 13:01:42 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        return  decode_string ( likely_subtag - > alias . region ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-31 09:40:24 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    return  { } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-08-24 19:50:18 -04:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								) ~ ~ ~ " );  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-02-06 15:55:17 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    TRY ( file . write ( generator . as_string_view ( ) . bytes ( ) ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  { } ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-24 19:50:18 -04:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-11-23 10:51:10 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								ErrorOr < int >  serenity_main ( Main : : Arguments  arguments )  
						 
					
						
							
								
									
										
										
										
											2021-08-24 19:50:18 -04:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2021-11-28 10:39:55 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    StringView  generated_header_path ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    StringView  generated_implementation_path ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-15 12:20:58 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    StringView  bcp47_path ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-28 10:39:55 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    StringView  core_path ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    StringView  locale_names_path ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    StringView  misc_path ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    StringView  numbers_path ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    StringView  dates_path ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-24 19:50:18 -04:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    Core : : ArgsParser  args_parser ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    args_parser . add_option ( generated_header_path ,  " Path to the Unicode locale header file to generate " ,  " generated-header-path " ,  ' h ' ,  " generated-header-path " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    args_parser . add_option ( generated_implementation_path ,  " Path to the Unicode locale implementation file to generate " ,  " generated-implementation-path " ,  ' c ' ,  " generated-implementation-path " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-15 12:20:58 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    args_parser . add_option ( bcp47_path ,  " Path to cldr-bcp47 directory " ,  " bcp47-path " ,  ' b ' ,  " bcp47-path " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-30 08:56:28 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    args_parser . add_option ( core_path ,  " Path to cldr-core directory " ,  " core-path " ,  ' r ' ,  " core-path " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-24 19:50:18 -04:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    args_parser . add_option ( locale_names_path ,  " Path to cldr-localenames directory " ,  " locale-names-path " ,  ' l ' ,  " locale-names-path " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-05 22:46:03 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    args_parser . add_option ( misc_path ,  " Path to cldr-misc directory " ,  " misc-path " ,  ' m ' ,  " misc-path " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-26 08:31:31 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    args_parser . add_option ( numbers_path ,  " Path to cldr-numbers directory " ,  " numbers-path " ,  ' n ' ,  " numbers-path " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-28 10:39:55 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    args_parser . add_option ( dates_path ,  " Path to cldr-dates directory " ,  " dates-path " ,  ' d ' ,  " dates-path " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-23 10:51:10 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    args_parser . parse ( arguments ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-24 19:50:18 -04:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-02-06 15:55:17 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    auto  generated_header_file  =  TRY ( open_file ( generated_header_path ,  Core : : Stream : : OpenMode : : Write ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    auto  generated_implementation_file  =  TRY ( open_file ( generated_implementation_path ,  Core : : Stream : : OpenMode : : Write ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-24 19:50:18 -04:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 11:48:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    CLDR  cldr ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    TRY ( parse_all_locales ( bcp47_path ,  core_path ,  locale_names_path ,  misc_path ,  numbers_path ,  dates_path ,  cldr ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-24 19:50:18 -04:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-02 11:48:05 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    TRY ( generate_unicode_locale_header ( * generated_header_file ,  cldr ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    TRY ( generate_unicode_locale_implementation ( * generated_implementation_file ,  cldr ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-24 19:50:18 -04:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}