From 818e7ceac8e9f0bb29b6f85ccd7b143058af9d05 Mon Sep 17 00:00:00 2001
From: "github-merge-queue[bot]"
See
- Similar to Example: Similar to Example:insert_all/2
but with the following differences:Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
+
insert_all/2
but with the following differences:
+{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
-defmodule Demo do
+defmodule Demo do
use Ecto.Schema
@primary_key false
- schema "ecto_ch_demo" do
+ schema "ecto_ch_demo" do
field :a, Ch, type: "UInt64"
field :b, :string
- end
-end
+ end
+end
-rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
-{100_000, nil} = Repo.insert_stream(Demo, rows)
+rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
+{100_000, nil} = Repo.insert_stream(Demo, rows)
# schemaless
-{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])
Cldr.LanguageTag
.
The format of an Accept-Language
header is as follows in ABNF
format:
Accept-Language = "Accept-Language" ":"
1#( language-range [ ";" "q" "=" qvalue ] )
- language-range = ( ( 1*8ALPHA *( "-" 1*8ALPHA ) ) | "*" )
Each language-range MAY be given an associated quality value which represents an + language-range = ( ( 1*8ALPHA *( "-" 1*8ALPHA ) ) | "*" )
Each language-range MAY be given an associated quality value which represents an estimate of the user's preference for the languages specified by that range. The quality value defaults to "q=1". For example,
Accept-Language: da, en-gb;q=0.8, en;q=0.7
would mean: "I prefer Danish, but will accept British English and other types of English."
@@ -261,54 +261,54 @@ a configuredExamples
-iex> Plausible.Cldr.AcceptLanguage.best_match("da;q=0.1,zh-TW;q=0.3", TestBackend.Cldr)
-{:ok,
- %Cldr.LanguageTag{
+iex> Plausible.Cldr.AcceptLanguage.best_match("da;q=0.1,zh-TW;q=0.3", TestBackend.Cldr)
+{:ok,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "zh-TW",
cldr_locale_name: :"zh-Hant",
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "zh",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :"zh-Hant",
requested_locale_name: "zh-TW",
script: :Hant,
territory: :TW,
- transform: %{},
- language_variants: []
- }}
+ transform: %{},
+ language_variants: []
+ }}
-iex> Plausible.Cldr.AcceptLanguage.best_match("da;q=0.1,zh-TW;q=0.3", TestBackend.Cldr)
-{:ok,
- %Cldr.LanguageTag{
+iex> Plausible.Cldr.AcceptLanguage.best_match("da;q=0.1,zh-TW;q=0.3", TestBackend.Cldr)
+{:ok,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "zh-TW",
cldr_locale_name: :"zh-Hant",
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "zh",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :"zh-Hant",
requested_locale_name: "zh-TW",
script: :Hant,
territory: :TW,
- transform: %{},
- language_variants: []
- }}
+ transform: %{},
+ language_variants: []
+ }}
-iex> Plausible.Cldr.AcceptLanguage.best_match("xx,yy;q=0.3")
-{:error,
- {Cldr.NoMatchingLocale,
- "No configured locale could be matched to \"xx,yy;q=0.3\""}}
+iex> Plausible.Cldr.AcceptLanguage.best_match("xx,yy;q=0.3")
+{:error,
+ {Cldr.NoMatchingLocale,
+ "No configured locale could be matched to \"xx,yy;q=0.3\""}}
-iex> Plausible.Cldr.AcceptLanguage.best_match("invalid_tag")
-{:error, {Cldr.LanguageTag.ParseError,
- "Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11"}}
+iex> Plausible.Cldr.AcceptLanguage.best_match("invalid_tag")
+{:error, {Cldr.LanguageTag.ParseError,
+ "Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11"}}
@@ -369,95 +369,95 @@ with an error tuple for each invalid tag added at the end of the list.
Example
-iex> Cldr.AcceptLanguage.parse("da,zh-TW;q=0.3", TestBackend.Cldr)
-{:ok,
- [
- {1.0,
- %Cldr.LanguageTag{
+iex> Cldr.AcceptLanguage.parse("da,zh-TW;q=0.3", TestBackend.Cldr)
+{:ok,
+ [
+ {1.0,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "da",
cldr_locale_name: :da,
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "da",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :da,
requested_locale_name: "da",
script: :Latn,
territory: :DK,
- transform: %{},
- language_variants: []
- }},
- {0.3,
- %Cldr.LanguageTag{
+ transform: %{},
+ language_variants: []
+ }},
+ {0.3,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "zh-TW",
cldr_locale_name: :"zh-Hant",
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "zh",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :"zh-Hant",
requested_locale_name: "zh-TW",
script: :Hant,
territory: :TW,
- transform: %{},
- language_variants: []
- }}
- ]}
+ transform: %{},
+ language_variants: []
+ }}
+ ]}
-iex> Plausible.Cldr.AcceptLanguage.parse("invalid_tag")
-{:error,
- {Cldr.LanguageTag.ParseError,
- "Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11"}}
+iex> Plausible.Cldr.AcceptLanguage.parse("invalid_tag")
+{:error,
+ {Cldr.LanguageTag.ParseError,
+ "Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11"}}
-iex> Plausible.Cldr.AcceptLanguage.parse("da,zh-TW;q=0.3,invalid_tag")
-{:ok,
- [
- {1.0,
- %Cldr.LanguageTag{
+iex> Plausible.Cldr.AcceptLanguage.parse("da,zh-TW;q=0.3,invalid_tag")
+{:ok,
+ [
+ {1.0,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "da",
cldr_locale_name: :da,
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "da",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :da,
requested_locale_name: "da",
script: :Latn,
territory: :DK,
- transform: %{},
- language_variants: []
- }},
- {0.3,
- %Cldr.LanguageTag{
+ transform: %{},
+ language_variants: []
+ }},
+ {0.3,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "zh-TW",
cldr_locale_name: :"zh-Hant",
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "zh",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :"zh-Hant",
requested_locale_name: "zh-TW",
script: :Hant,
territory: :TW,
- transform: %{},
- language_variants: []
- }},
- {:error,
- {Cldr.LanguageTag.ParseError,
- "Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11"}}
- ]}
+ transform: %{},
+ language_variants: []
+ }},
+ {:error,
+ {Cldr.LanguageTag.ParseError,
+ "Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11"}}
+ ]}
@@ -502,92 +502,92 @@ with an error tuple for each invalid tag added at the end of the list.
Example
-iex> Plausible.Cldr.AcceptLanguage.parse!("da,zh-TW;q=0.3")
-[
- {1.0,
- %Cldr.LanguageTag{
+iex> Plausible.Cldr.AcceptLanguage.parse!("da,zh-TW;q=0.3")
+[
+ {1.0,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "da",
cldr_locale_name: :da,
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "da",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :da,
requested_locale_name: "da",
script: :Latn,
territory: :DK,
- transform: %{},
- language_variants: []
- }},
- {0.3,
- %Cldr.LanguageTag{
+ transform: %{},
+ language_variants: []
+ }},
+ {0.3,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "zh-TW",
cldr_locale_name: :"zh-Hant",
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "zh",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :"zh-Hant",
requested_locale_name: "zh-TW",
script: :Hant,
territory: :TW,
- transform: %{},
- language_variants: []
- }}
-]
+ transform: %{},
+ language_variants: []
+ }}
+]
Plausible.Cldr.AcceptLanguage.parse! "invalid_tag"
** (Cldr.AcceptLanguageError) "Expected a BCP47 language tag. Could not parse the remaining "g" starting at position 11
(ex_cldr) lib/cldr/accept_language.ex:304: Cldr.AcceptLanguage.parse!/1
-iex> Plausible.Cldr.AcceptLanguage.parse!("da,zh-TW;q=0.3,invalid_tag")
-[
- {1.0,
- %Cldr.LanguageTag{
+iex> Plausible.Cldr.AcceptLanguage.parse!("da,zh-TW;q=0.3,invalid_tag")
+[
+ {1.0,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "da",
cldr_locale_name: :da,
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "da",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :da,
requested_locale_name: "da",
script: :Latn,
territory: :DK,
- transform: %{},
- language_variants: []
- }},
- {0.3,
- %Cldr.LanguageTag{
+ transform: %{},
+ language_variants: []
+ }},
+ {0.3,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "zh-TW",
cldr_locale_name: :"zh-Hant",
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "zh",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :"zh-Hant",
requested_locale_name: "zh-TW",
script: :Hant,
territory: :TW,
- transform: %{},
- language_variants: []
- }},
- {:error,
- {Cldr.LanguageTag.ParseError,
- "Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11"}}
-]
+ transform: %{},
+ language_variants: []
+ }},
+ {:error,
+ {Cldr.LanguageTag.ParseError,
+ "Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11"}}
+]
diff --git a/Plausible.Cldr.Currency.html b/Plausible.Cldr.Currency.html
index fe17b4aa4..a376142ab 100644
--- a/Plausible.Cldr.Currency.html
+++ b/Plausible.Cldr.Currency.html
@@ -419,11 +419,11 @@ The default is :all
. See FJD: %Cldr.Currency{
+ %{ FJD: %Cldr.Currency{
cash_digits: 2,
cash_rounding: 0,
code: "FJD",
- count: %{one: "Fijian dollar", other: "Fijian dollars"},
+ count: %{one: "Fijian dollar", other: "Fijian dollars"},
digits: 2,
from: nil,
iso_digits: 2,
@@ -433,12 +433,12 @@ The default is :all
. See symbol: "FJD",
tender: true,
to: nil
- },
- SUR: %Cldr.Currency{
+ },
+ SUR: %Cldr.Currency{
cash_digits: 2,
cash_rounding: 0,
code: "SUR",
- count: %{one: "Soviet rouble", other: "Soviet roubles"},
+ count: %{one: "Soviet rouble", other: "Soviet roubles"},
digits: 2,
from: nil,
iso_digits: nil,
@@ -448,7 +448,7 @@ The default is :all
. See symbol: "SUR",
tender: true,
to: nil
- },
+ },
...
}}
@@ -499,11 +499,11 @@ The default is :all
. See Example
MyApp.Cldr.Currency.currencies_for_locale!("en")
- => %{
FJD: %Cldr.Currency{
+ => %{FJD: %Cldr.Currency{
cash_digits: 2,
cash_rounding: 0,
code: "FJD",
- count: %{one: "Fijian dollar", other: "Fijian dollars"},
+ count: %{one: "Fijian dollar", other: "Fijian dollars"},
digits: 2,
from: nil,
iso_digits: 2,
@@ -513,12 +513,12 @@ The default is :all
. See symbol: "FJD",
tender: true,
to: nil
-},
-SUR: %Cldr.Currency{
+},
+SUR: %Cldr.Currency{
cash_digits: 2,
cash_rounding: 0,
code: "SUR",
- count: %{one: "Soviet rouble", other: "Soviet roubles"},
+ count: %{one: "Soviet rouble", other: "Soviet roubles"},
digits: 2,
from: nil,
iso_digits: nil,
@@ -528,7 +528,7 @@ The default is :all
. See symbol: "SUR",
tender: true,
to: nil
-},
+},
...
}
@@ -586,13 +586,13 @@ or a
Examples
-iex> Plausible.Cldr.Currency.currency_for_code("AUD")
-{:ok,
- %Cldr.Currency{
+iex> Plausible.Cldr.Currency.currency_for_code("AUD")
+{:ok,
+ %Cldr.Currency{
cash_digits: 2,
cash_rounding: 0,
code: "AUD",
- count: %{one: "Australian dollar", other: "Australian dollars"},
+ count: %{one: "Australian dollar", other: "Australian dollars"},
digits: 2,
iso_digits: 2,
name: "Australian Dollar",
@@ -600,15 +600,15 @@ or a rounding: 0,
symbol: "A$",
tender: true
-}}
+}}
-iex> Plausible.Cldr.Currency.currency_for_code("THB")
-{:ok,
- %Cldr.Currency{
+iex> Plausible.Cldr.Currency.currency_for_code("THB")
+{:ok,
+ %Cldr.Currency{
cash_digits: 2,
cash_rounding: 0,
code: "THB",
- count: %{one: "Thai baht", other: "Thai baht"},
+ count: %{one: "Thai baht", other: "Thai baht"},
digits: 2,
iso_digits: 2,
name: "Thai Baht",
@@ -616,7 +616,7 @@ or a rounding: 0,
symbol: "THB",
tender: true
-}}
+}}
@@ -675,12 +675,12 @@ or a
Examples
-iex> Plausible.Cldr.Currency.currency_for_code!("AUD")
-%Cldr.Currency{
+iex> Plausible.Cldr.Currency.currency_for_code!("AUD")
+%Cldr.Currency{
cash_digits: 2,
cash_rounding: 0,
code: "AUD",
- count: %{one: "Australian dollar", other: "Australian dollars"},
+ count: %{one: "Australian dollar", other: "Australian dollars"},
digits: 2,
iso_digits: 2,
name: "Australian Dollar",
@@ -688,14 +688,14 @@ or a rounding: 0,
symbol: "A$",
tender: true
-}
+}
-iex> Plausible.Cldr.Currency.currency_for_code!("THB")
-%Cldr.Currency{
+iex> Plausible.Cldr.Currency.currency_for_code!("THB")
+%Cldr.Currency{
cash_digits: 2,
cash_rounding: 0,
code: "THB",
- count: %{one: "Thai baht", other: "Thai baht"},
+ count: %{one: "Thai baht", other: "Thai baht"},
digits: 2,
iso_digits: 2,
name: "Thai Baht",
@@ -703,7 +703,7 @@ or a rounding: 0,
symbol: "THB",
tender: true
-}
+}
@@ -744,15 +744,15 @@ or a
Examples
-iex> {:ok, locale} = Plausible.Cldr.validate_locale("en")
+iex> {:ok, locale} = Plausible.Cldr.validate_locale("en")
iex> Plausible.Cldr.Currency.currency_from_locale locale
:USD
-iex> {:ok, locale} = Plausible.Cldr.validate_locale("en-AU")
+iex> {:ok, locale} = Plausible.Cldr.validate_locale("en-AU")
iex> Plausible.Cldr.Currency.currency_from_locale locale
:AUD
-iex> Plausible.Cldr.Currency.currency_from_locale("en-GB")
+iex> Plausible.Cldr.Currency.currency_from_locale("en-GB")
:GBP
@@ -796,14 +796,14 @@ or a
Example
-iex> MyApp.Cldr.Currency.currency_history_for_locale("en")
-{:ok,
- %{
- USD: %{from: ~D[1792-01-01], to: nil},
- USN: %{tender: false},
- USS: %{from: nil, tender: false, to: ~D[2014-03-01]}
- }
-}
+iex> MyApp.Cldr.Currency.currency_history_for_locale("en")
+{:ok,
+ %{
+ USD: %{from: ~D[1792-01-01], to: nil},
+ USN: %{tender: false},
+ USS: %{from: nil, tender: false, to: ~D[2014-03-01]}
+ }
+}
@@ -862,9 +862,9 @@ The default is :all
. See Example
-MyApp.Cldr.Currency.currency_strings("en")
-=> {:ok,
- %{
+MyApp.Cldr.Currency.currency_strings("en")
+=> {:ok,
+ %{
"mexican silver pesos" => :MXP,
"sudanese dinar" => :SDD,
"bad" => :BAD,
@@ -874,7 +874,7 @@ The default is :all
. See "guyanaese dollars" => :GYD,
"equatorial guinean ekwele" => :GQE,
...
- }}
+ }}
@@ -933,8 +933,8 @@ The default is :all
. See Example
-MyApp.Cldr.Currency.currency_strings!("en")
-=> %{
+MyApp.Cldr.Currency.currency_strings!("en")
+=> %{
"mexican silver pesos" => :MXP,
"sudanese dinar" => :SDD,
"bad" => :BAD,
@@ -944,7 +944,7 @@ The default is :all
. See "guyanaese dollars" => :GYD,
"equatorial guinean ekwele" => :GQE,
...
- }
+ }
@@ -982,10 +982,10 @@ or a
Example
-iex> MyApp.Cldr.Currency.current_currency_from_locale("en")
+iex> MyApp.Cldr.Currency.current_currency_from_locale("en")
:USD
-iex> MyApp.Cldr.Currency.current_currency_from_locale("en-AU")
+iex> MyApp.Cldr.Currency.current_currency_from_locale("en-AU")
:AUD
@@ -1033,7 +1033,7 @@ mapping is returned for that territory.Example
-iex> Plausible.Cldr.Currency.current_territory_currencies()
+iex> Plausible.Cldr.Currency.current_territory_currencies()
@@ -1125,11 +1125,11 @@ currency codeExamples
-iex> Plausible.Cldr.Currency.known_currency_code("AUD")
-{:ok, :AUD}
+iex> Plausible.Cldr.Currency.known_currency_code("AUD")
+{:ok, :AUD}
-iex> Plausible.Cldr.Currency.known_currency_code("GGG")
-{:error, {Cldr.UnknownCurrencyError, "The currency \"GGG\" is invalid"}}
+iex> Plausible.Cldr.Currency.known_currency_code("GGG")
+{:error, {Cldr.UnknownCurrencyError, "The currency \"GGG\" is invalid"}}
@@ -1176,13 +1176,13 @@ currency codeExamples
-iex> Plausible.Cldr.Currency.known_currency_code?("AUD")
+iex> Plausible.Cldr.Currency.known_currency_code?("AUD")
true
-iex> Plausible.Cldr.Currency.known_currency_code?("GGG")
+iex> Plausible.Cldr.Currency.known_currency_code?("GGG")
false
-iex> Plausible.Cldr.Currency.known_currency_code?(:XCV)
+iex> Plausible.Cldr.Currency.known_currency_code?(:XCV)
false
@@ -1217,7 +1217,7 @@ currency codeExample
-iex> Plausible.Cldr.Currency.known_currency_codes()
+iex> Plausible.Cldr.Currency.known_currency_codes()
@@ -1276,14 +1276,14 @@ such as 0.05
. Optional.Example
-iex> Plausible.Cldr.Currency.new(:XAE, name: "Custom Name", digits: 0)
-{:ok,
- %Cldr.Currency{
+iex> Plausible.Cldr.Currency.new(:XAE, name: "Custom Name", digits: 0)
+{:ok,
+ %Cldr.Currency{
alt_code: :XAE,
cash_digits: 0,
cash_rounding: nil,
code: :XAE,
- count: %{other: "Custom Name"},
+ count: %{other: "Custom Name"},
digits: 0,
from: nil,
iso_digits: 0,
@@ -1293,11 +1293,11 @@ such as 0.05
. Optional.symbol
: "XAE",
tender: false,
to: nil
- }}
-iex> MyApp.Cldr.Currency.new(:XAH, name: "Custom Name")
-{:error, "Required options are missing. Required options are [:name, :digits]"}
-iex> Plausible.Cldr.Currency.new(:XAE, name: "XAE", digits: 0)
-{:error, {Cldr.CurrencyAlreadyDefined, "Currency :XAE is already defined."}}
+ }}
+iex> MyApp.Cldr.Currency.new(:XAH, name: "Custom Name")
+{:error, "Required options are missing. Required options are [:name, :digits]"}
+iex> Plausible.Cldr.Currency.new(:XAE, name: "XAE", digits: 0)
+{:error, {Cldr.CurrencyAlreadyDefined, "Currency :XAE is already defined."}}
@@ -1355,20 +1355,20 @@ default is Plaus
Examples
-iex> Plausible.Cldr.Currency.pluralize(1, :USD)
-{:ok, "US dollar"}
+iex> Plausible.Cldr.Currency.pluralize(1, :USD)
+{:ok, "US dollar"}
-iex> Plausible.Cldr.Currency.pluralize(3, :USD)
-{:ok, "US dollars"}
+iex> Plausible.Cldr.Currency.pluralize(3, :USD)
+{:ok, "US dollars"}
-iex> Plausible.Cldr.Currency.pluralize(12, :USD, locale: "zh")
-{:ok, "美元"}
+iex> Plausible.Cldr.Currency.pluralize(12, :USD, locale: "zh")
+{:ok, "美元"}
-iex> Plausible.Cldr.Currency.pluralize(12, :USD, locale: "fr")
-{:ok, "dollars des États-Unis"}
+iex> Plausible.Cldr.Currency.pluralize(12, :USD, locale: "fr")
+{:ok, "dollars des États-Unis"}
-iex> Plausible.Cldr.Currency.pluralize(1, :USD, locale: "fr")
-{:ok, "dollar des États-Unis"}
+iex> Plausible.Cldr.Currency.pluralize(1, :USD, locale: "fr")
+{:ok, "dollar des États-Unis"}
@@ -1410,8 +1410,8 @@ or a
Example
-iex> MyApp.Cldr.Currency.strings_for_currency :AUD,("en")
-["a$", "australian dollars", "aud", "australian dollar"]
+iex> MyApp.Cldr.Currency.strings_for_currency :AUD,("en")
+["a$", "australian dollars", "aud", "australian dollar"]
diff --git a/Plausible.Cldr.Locale.html b/Plausible.Cldr.Locale.html
index c7d8b91e1..ecabea40f 100644
--- a/Plausible.Cldr.Locale.html
+++ b/Plausible.Cldr.Locale.html
@@ -326,16 +326,16 @@ this specific locale..Examples
-iex> Plausible.Cldr.Locale.fallback_locale_names(:"fr-CA")
-{:ok, [:"fr-CA", :fr, :und]}
+iex> Plausible.Cldr.Locale.fallback_locale_names(:"fr-CA")
+{:ok, [:"fr-CA", :fr, :und]}
# Fallbacks are typically formed by progressively
# stripping variant, territory and script from the
# given locale name. But not always - there are
# certain fallbacks that take a different path.
-iex> Plausible.Cldr.Locale.fallback_locale_names(:nb)
-{:ok, [:nb, :no, :und]}
+iex> Plausible.Cldr.Locale.fallback_locale_names(:nb)
+{:ok, [:nb, :no, :und]}
@@ -389,20 +389,20 @@ this specific locale.Examples
-Plausible.Cldr.Locale.fallback_locales(:"fr-CA")
-=> {:ok,
- [#Cldr.LanguageTag<fr-CA [validated]>, #Cldr.LanguageTag<fr [validated]>,
- #Cldr.LanguageTag<und [validated]>]}
+Plausible.Cldr.Locale.fallback_locales(:"fr-CA")
+=> {:ok,
+ [#Cldr.LanguageTag<fr-CA [validated]>, #Cldr.LanguageTag<fr [validated]>,
+ #Cldr.LanguageTag<und [validated]>]}
# Fallbacks are typically formed by progressively
# stripping variant, territory and script from the
# given locale name. But not always - there are
# certain fallbacks that take a different path.
-Plausible.Cldr.Locale.fallback_locales(:nb))
-=> {:ok,
- [#Cldr.LanguageTag<nb [validated]>, #Cldr.LanguageTag<no [validated]>,
- #Cldr.LanguageTag<und [validated]>]}
+Plausible.Cldr.Locale.fallback_locales(:nb))
+=> {:ok,
+ [#Cldr.LanguageTag<nb [validated]>, #Cldr.LanguageTag<no [validated]>,
+ #Cldr.LanguageTag<und [validated]>]}
@@ -533,15 +533,15 @@ generic top-level domain names.Examples
iex> Plausible.Cldr.Locale.locale_from_host "a.b.com.au"
-Elixir.Plausible.Cldr.validate_locale(:"en-AU")
+Elixir.Plausible.Cldr.validate_locale(:"en-AU")
-iex> Plausible.Cldr.Locale.locale_from_host("a.b.com.tv")
-{:error,
- {Cldr.UnknownLocaleError, "No locale was identified for territory \"tv\""}}
+iex> Plausible.Cldr.Locale.locale_from_host("a.b.com.tv")
+{:error,
+ {Cldr.UnknownLocaleError, "No locale was identified for territory \"tv\""}}
-iex> Plausible.Cldr.Locale.locale_from_host("a.b.com")
-{:error,
- {Cldr.UnknownLocaleError, "No locale was identified for territory \"com\""}}
+iex> Plausible.Cldr.Locale.locale_from_host("a.b.com")
+{:error,
+ {Cldr.UnknownLocaleError, "No locale was identified for territory \"com\""}}
@@ -683,12 +683,12 @@ be a territory.Examples
-iex> Cldr.Locale.territory_from_host("a.b.com.au")
-{:ok, :AU}
+iex> Cldr.Locale.territory_from_host("a.b.com.au")
+{:ok, :AU}
-iex> Cldr.Locale.territory_from_host("a.b.com")
-{:error,
- {Cldr.UnknownLocaleError, "No locale was identified for territory \"com\""}}
+iex> Cldr.Locale.territory_from_host("a.b.com")
+{:error,
+ {Cldr.UnknownLocaleError, "No locale was identified for territory \"com\""}}
diff --git a/Plausible.Cldr.Number.Cardinal.html b/Plausible.Cldr.Number.Cardinal.html
index 3b1d62f89..f5d86fc9b 100644
--- a/Plausible.Cldr.Number.Cardinal.html
+++ b/Plausible.Cldr.Number.Cardinal.html
@@ -461,31 +461,31 @@ The valid substitution keys are :zero
, Examples
-iex> Plausible.Cldr.Number.Cardinal.pluralize 1, "en", %{one: "one"}
+iex> Plausible.Cldr.Number.Cardinal.pluralize 1, "en", %{one: "one"}
"one"
-iex> Plausible.Cldr.Number.Cardinal.pluralize 2, "en", %{one: "one"}
+iex> Plausible.Cldr.Number.Cardinal.pluralize 2, "en", %{one: "one"}
nil
-iex> Plausible.Cldr.Number.Cardinal.pluralize 2, "en", %{one: "one", two: "two", other: "other"}
+iex> Plausible.Cldr.Number.Cardinal.pluralize 2, "en", %{one: "one", two: "two", other: "other"}
"other"
-iex> Plausible.Cldr.Number.Cardinal.pluralize 22, "en", %{one: "one", two: "two", other: "other"}
+iex> Plausible.Cldr.Number.Cardinal.pluralize 22, "en", %{one: "one", two: "two", other: "other"}
"other"
-iex> Plausible.Cldr.Number.Cardinal.pluralize Decimal.new(1), "en", %{one: "one"}
+iex> Plausible.Cldr.Number.Cardinal.pluralize Decimal.new(1), "en", %{one: "one"}
"one"
-iex> Plausible.Cldr.Number.Cardinal.pluralize Decimal.new(2), "en", %{one: "one"}
+iex> Plausible.Cldr.Number.Cardinal.pluralize Decimal.new(2), "en", %{one: "one"}
nil
-iex> Plausible.Cldr.Number.Cardinal.pluralize Decimal.new(2), "en", %{one: "one", two: "two"}
+iex> Plausible.Cldr.Number.Cardinal.pluralize Decimal.new(2), "en", %{one: "one", two: "two"}
nil
-iex> Plausible.Cldr.Number.Cardinal.pluralize 1..10, "ar", %{one: "one", few: "few", other: "other"}
+iex> Plausible.Cldr.Number.Cardinal.pluralize 1..10, "ar", %{one: "one", few: "few", other: "other"}
"few"
-iex> Plausible.Cldr.Number.Cardinal.pluralize 1..10, "en", %{one: "one", few: "few", other: "other"}
+iex> Plausible.Cldr.Number.Cardinal.pluralize 1..10, "en", %{one: "one", few: "few", other: "other"}
"other"
diff --git a/Plausible.Cldr.Number.Format.html b/Plausible.Cldr.Number.Format.html
index bde729a9e..46baf671c 100644
--- a/Plausible.Cldr.Number.Format.html
+++ b/Plausible.Cldr.Number.Format.html
@@ -465,7 +465,7 @@ to precompile all the known formats at compile time.Example
#=> Plausible.Cldr.Number.Format.Format.decimal_format_list
-["#", "#,##,##0%",
+["#", "#,##,##0%",
"#,##,##0.###", "#,##,##0.00¤", "#,##,##0.00¤;(#,##,##0.00¤)",
"#,##,##0 %", "#,##0%", "#,##0.###", "#,##0.00 ¤",
"#,##0.00 ¤;(#,##0.00 ¤)", "#,##0.00¤", "#,##0.00¤;(#,##0.00¤)",
@@ -475,7 +475,7 @@ to precompile all the known formats at compile time."000 B ¤"
, "000 E ¤", "000 K ¤", "000 MRD ¤", "000 Md ¤", "000 Mio'.' ¤",
"000 Mio ¤", "000 Mld ¤", "000 Mln ¤", "000 Mn ¤", "000 Mrd'.' ¤",
"000 Mrd ¤", "000 Mr ¤", "000 M ¤", "000 NT ¤", "000 N ¤", "000 Tn ¤",
-"000 Tr ¤", ...]
+"000 Tr ¤", ...]
iex> Plausible.Cldr.Number.Format.decimal_format_list_for(:en)
-{:ok, ["#,##0%", "#,##0.###", "#,##0.00", "#,##0.00;(#,##0.00)","#E0",
+iex> Plausible.Cldr.Number.Format.decimal_format_list_for(:en)
+{:ok, ["#,##0%", "#,##0.###", "#,##0.00", "#,##0.00;(#,##0.00)","#E0",
"0 billion", "0 million", "0 thousand",
"0 trillion", "00 billion", "00 million", "00 thousand", "00 trillion",
"000 billion", "000 million", "000 thousand", "000 trillion", "000B", "000K",
@@ -532,7 +532,7 @@ the known formats at compile time. Its use is not otherwise recommended."¤#,##0.00", "¤#,##0.00;(¤#,##0.00)", "¤000B", "¤000K", "¤000M",
"¤000T", "¤00B", "¤00K", "¤00M", "¤00T", "¤0B", "¤0K", "¤0M", "¤0T",
"¤ #,##0.00", "¤ #,##0.00;(¤ #,##0.00)", "¤ 000B", "¤ 000K", "¤ 000M",
- "¤ 000T", "¤ 00B", "¤ 00K", "¤ 00M", "¤ 00T", "¤ 0B", "¤ 0K", "¤ 0M", "¤ 0T"]}
+ "¤ 000T", "¤ 00B", "¤ 00K", "¤ 00M", "¤ 00T", "¤ 0B", "¤ 0K", "¤ 0M", "¤ 0T"]}
Plausible.Cld
Examples
-iex> Plausible.Cldr.Number.Format.default_grouping_for(:en)
-{:ok, %{fraction: %{first: 0, rest: 0}, integer: %{first: 3, rest: 3}}}
+iex> Plausible.Cldr.Number.Format.default_grouping_for(:en)
+{:ok, %{fraction: %{first: 0, rest: 0}, integer: %{first: 3, rest: 3}}}
Plausible.Cld
Examples
-iex> Plausible.Cldr.Number.Format.default_grouping_for!(:en)
-%{fraction: %{first: 0, rest: 0}, integer: %{first: 3, rest: 3}}
+iex> Plausible.Cldr.Number.Format.default_grouping_for!(:en)
+%{fraction: %{first: 0, rest: 0}, integer: %{first: 3, rest: 3}}
percent: "#,##0 %",
scientific: "#E0",
standard: "#,##0.###"
- currency_short: [{"1000", [one: "0 k ¤", other: "0 k ¤"]},
- {"10000", [one: "00 k ¤", other: "00 k ¤"]},
- {"100000", [one: "000 k ¤", other: "000 k ¤"]},
- {"1000000", [one: "0 M ¤", other: "0 M ¤"]},
- {"10000000", [one: "00 M ¤", other: "00 M ¤"]},
- {"100000000", [one: "000 M ¤", other: "000 M ¤"]},
- {"1000000000", [one: "0 Md ¤", other: "0 Md ¤"]},
- {"10000000000", [one: "00 Md ¤", other: "00 Md ¤"]},
- {"100000000000", [one: "000 Md ¤", other: "000 Md ¤"]},
- {"1000000000000", [one: "0 Bn ¤", other: "0 Bn ¤"]},
- {"10000000000000", [one: "00 Bn ¤", other: "00 Bn ¤"]},
- {"100000000000000", [one: "000 Bn ¤", other: "000 Bn ¤"]}],
+ currency_short: [{"1000", [one: "0 k ¤", other: "0 k ¤"]},
+ {"10000", [one: "00 k ¤", other: "00 k ¤"]},
+ {"100000", [one: "000 k ¤", other: "000 k ¤"]},
+ {"1000000", [one: "0 M ¤", other: "0 M ¤"]},
+ {"10000000", [one: "00 M ¤", other: "00 M ¤"]},
+ {"100000000", [one: "000 M ¤", other: "000 M ¤"]},
+ {"1000000000", [one: "0 Md ¤", other: "0 Md ¤"]},
+ {"10000000000", [one: "00 Md ¤", other: "00 Md ¤"]},
+ {"100000000000", [one: "000 Md ¤", other: "000 Md ¤"]},
+ {"1000000000000", [one: "0 Bn ¤", other: "0 Bn ¤"]},
+ {"10000000000000", [one: "00 Bn ¤", other: "00 Bn ¤"]},
+ {"100000000000000", [one: "000 Bn ¤", other: "000 Bn ¤"]}],
...
}
Plausible.Cld
Examples
-iex> Plausible.Cldr.Number.Format.minimum_grouping_digits_for("en")
-{:ok, 1}
+iex> Plausible.Cldr.Number.Format.minimum_grouping_digits_for("en")
+{:ok, 1}
Plausible.Cld
Examples
-iex> Plausible.Cldr.Number.Format.minimum_grouping_digits_for!("en")
+iex> Plausible.Cldr.Number.Format.minimum_grouping_digits_for!("en")
1
:zero
, Examples
-iex> Plausible.Cldr.Number.Ordinal.pluralize 1, :en, %{one: "one"}
+iex> Plausible.Cldr.Number.Ordinal.pluralize 1, :en, %{one: "one"}
"one"
-iex> Plausible.Cldr.Number.Ordinal.pluralize 2, :en, %{one: "one"}
+iex> Plausible.Cldr.Number.Ordinal.pluralize 2, :en, %{one: "one"}
nil
-iex> Plausible.Cldr.Number.Ordinal.pluralize 2, :en, %{one: "one", two: "two"}
+iex> Plausible.Cldr.Number.Ordinal.pluralize 2, :en, %{one: "one", two: "two"}
"two"
-iex> Plausible.Cldr.Number.Ordinal.pluralize 22, :en, %{one: "one", two: "two", other: "other"}
+iex> Plausible.Cldr.Number.Ordinal.pluralize 22, :en, %{one: "one", two: "two", other: "other"}
"two"
-iex> Plausible.Cldr.Number.Ordinal.pluralize Decimal.new(1), :en, %{one: "one"}
+iex> Plausible.Cldr.Number.Ordinal.pluralize Decimal.new(1), :en, %{one: "one"}
"one"
-iex> Plausible.Cldr.Number.Ordinal.pluralize Decimal.new(2), :en, %{one: "one"}
+iex> Plausible.Cldr.Number.Ordinal.pluralize Decimal.new(2), :en, %{one: "one"}
nil
-iex> Plausible.Cldr.Number.Ordinal.pluralize Decimal.new(2), :en, %{one: "one", two: "two"}
+iex> Plausible.Cldr.Number.Ordinal.pluralize Decimal.new(2), :en, %{one: "one", two: "two"}
"two"
-iex> Plausible.Cldr.Number.Ordinal.pluralize 1..10, "ar", %{one: "one", few: "few", other: "other"}
+iex> Plausible.Cldr.Number.Ordinal.pluralize 1..10, "ar", %{one: "one", few: "few", other: "other"}
"other"
-iex> Plausible.Cldr.Number.Ordinal.pluralize 1..10, "en", %{one: "one", few: "few", other: "other"}
+iex> Plausible.Cldr.Number.Ordinal.pluralize 1..10, "en", %{one: "one", few: "few", other: "other"}
"other"
diff --git a/Plausible.Cldr.Number.Symbol.html b/Plausible.Cldr.Number.Symbol.html
index 8ade790d0..375d35127 100644
--- a/Plausible.Cldr.Number.Symbol.html
+++ b/Plausible.Cldr.Number.Symbol.html
@@ -378,9 +378,9 @@ is Plausible.Cld
Example:
-iex> Plausible.Cldr.Number.Symbol.number_symbols_for(:th)
-{:ok, %{
- latn: %Cldr.Number.Symbol{
+iex> Plausible.Cldr.Number.Symbol.number_symbols_for(:th)
+{:ok, %{
+ latn: %Cldr.Number.Symbol{
decimal: ".",
exponential: "E",
group: ",",
@@ -393,8 +393,8 @@ is Plausible.Cld
plus_sign: "+",
superscripting_exponent: "×",
time_separator: ":"
- },
- thai: %Cldr.Number.Symbol{
+ },
+ thai: %Cldr.Number.Symbol{
decimal: ".",
exponential: "E",
group: ",",
@@ -407,8 +407,8 @@ is Plausible.Cld
plus_sign: "+",
superscripting_exponent: "×",
time_separator: ":"
- }
- }}
+ }
+ }}
diff --git a/Plausible.Cldr.Number.System.html b/Plausible.Cldr.Number.System.html
index 2b53658bf..6757a2a6d 100644
--- a/Plausible.Cldr.Number.System.html
+++ b/Plausible.Cldr.Number.System.html
@@ -317,23 +317,23 @@ it is returned as is.Examples
iex> Plausible.Cldr.Number.System.number_system_for "th", :latn
-{:ok, %{digits: "0123456789", type: :numeric}}
+{:ok, %{digits: "0123456789", type: :numeric}}
iex> Plausible.Cldr.Number.System.number_system_for "en", :default
-{:ok, %{digits: "0123456789", type: :numeric}}
+{:ok, %{digits: "0123456789", type: :numeric}}
iex> Plausible.Cldr.Number.System.number_system_for "he", :traditional
-{:ok, %{rules: "hebrew", type: :algorithmic}}
+{:ok, %{rules: "hebrew", type: :algorithmic}}
iex> Plausible.Cldr.Number.System.number_system_for "en", :native
-{:ok, %{digits: "0123456789", type: :numeric}}
+{:ok, %{digits: "0123456789", type: :numeric}}
iex> Plausible.Cldr.Number.System.number_system_for "en", :finance
-{
+{
:error,
- {Cldr.UnknownNumberSystemError,
- "The number system :finance is unknown for the locale named :en. Valid number systems are %{default: :latn, native: :latn}"}
-}
+ {Cldr.UnknownNumberSystemError,
+ "The number system :finance is unknown for the locale named :en. Valid number systems are %{default: :latn, native: :latn}"}
+}
@@ -424,10 +424,10 @@ or a Examples
iex> Plausible.Cldr.Number.System.number_system_names_for "en"
-{:ok, [:latn]}
+{:ok, [:latn]}
iex> Plausible.Cldr.Number.System.number_system_names_for "zz"
-{:error, {Cldr.InvalidLanguageError, "The language \"zz\" is invalid"}}
+{:error, {Cldr.InvalidLanguageError, "The language \"zz\" is invalid"}}
@@ -509,13 +509,13 @@ or a Examples
iex> Plausible.Cldr.Number.System.number_systems_for "en"
-{:ok, %{default: :latn, native: :latn}}
+{:ok, %{default: :latn, native: :latn}}
iex> Plausible.Cldr.Number.System.number_systems_for "th"
-{:ok, %{default: :latn, native: :thai}}
+{:ok, %{default: :latn, native: :thai}}
iex> Plausible.Cldr.Number.System.number_systems_for "zz"
-{:error, {Cldr.InvalidLanguageError, "The language \"zz\" is invalid"}}
+{:error, {Cldr.InvalidLanguageError, "The language \"zz\" is invalid"}}
@@ -614,20 +614,20 @@ actual system name.Examples
-ex> Plausible.Cldr.Number.System.system_name_from(:default, "en")
-{:ok, :latn}
+ex> Plausible.Cldr.Number.System.system_name_from(:default, "en")
+{:ok, :latn}
-iex> Plausible.Cldr.Number.System.system_name_from("latn", "en")
-{:ok, :latn}
+iex> Plausible.Cldr.Number.System.system_name_from("latn", "en")
+{:ok, :latn}
-iex> Plausible.Cldr.Number.System.system_name_from(:native, "en")
-{:ok, :latn}
+iex> Plausible.Cldr.Number.System.system_name_from(:native, "en")
+{:ok, :latn}
-iex> Plausible.Cldr.Number.System.system_name_from(:nope, "en")
-{
+iex> Plausible.Cldr.Number.System.system_name_from(:nope, "en")
+{
:error,
- {Cldr.UnknownNumberSystemError, "The number system :nope is unknown"}
-}
Note that return value is not guaranteed to be a valid
+
{Cldr.UnknownNumberSystemError, "The number system :nope is unknown"}
+}
Note that return value is not guaranteed to be a valid
number system for the given locale as demonstrated in the third example.
@@ -674,16 +674,16 @@ is recommended.Examples
iex> Plausible.Cldr.Number.System.to_system 123456, :hebr
-{:ok, "קכ״ג׳תנ״ו"}
+{:ok, "קכ״ג׳תנ״ו"}
iex> Plausible.Cldr.Number.System.to_system 123, :hans
-{:ok, "一百二十三"}
+{:ok, "一百二十三"}
iex> Plausible.Cldr.Number.System.to_system 123, :hant
-{:ok, "一百二十三"}
+{:ok, "一百二十三"}
iex> Plausible.Cldr.Number.System.to_system 123, :hansfin
-{:ok, "壹佰贰拾叁"}
+{:ok, "壹佰贰拾叁"}
To configure these transliteration pairs, add the to the use Cldr
configuration
-in a backend module:
defmodule MyApp.Cldr do
+in a backend module:defmodule MyApp.Cldr do
use Cldr,
- locale: ["en", "fr", "th"],
+ locale: ["en", "fr", "th"],
default_locale: "en",
- precompile_transliterations: [{:latn, :thai}, {:arab, :thai}]
-end
Where each tuple in the list configures one transliteration map. In this example, two maps are
+
precompile_transliterations: [{:latn, :thai}, {:arab, :thai}]
+end
Where each tuple in the list configures one transliteration map. In this example, two maps are
configured: from :latn
to :thai
and from :arab
to :thai
.
A list of configurable number systems is returned by Cldr.Number.System.numeric_systems/0
.
If a transliteration is requested between two number pairs that have not been configured for precompilation, a warning is logged.
Examples
-iex> Plausible.Cldr.Number.Transliterate.transliterate("123556")
+iex> Plausible.Cldr.Number.Transliterate.transliterate("123556")
"123556"
-iex> Plausible.Cldr.Number.Transliterate.transliterate("123,556.000", "fr", :default)
+iex> Plausible.Cldr.Number.Transliterate.transliterate("123,556.000", "fr", :default)
"123 556,000"
-iex> Plausible.Cldr.Number.Transliterate.transliterate("123556", "th", :default)
+iex> Plausible.Cldr.Number.Transliterate.transliterate("123556", "th", :default)
"123556"
-iex> Plausible.Cldr.Number.Transliterate.transliterate("123556", "th", "thai")
+iex> Plausible.Cldr.Number.Transliterate.transliterate("123556", "th", "thai")
"๑๒๓๕๕๖"
-iex> Plausible.Cldr.Number.Transliterate.transliterate("123556", "th", :native)
+iex> Plausible.Cldr.Number.Transliterate.transliterate("123556", "th", :native)
"๑๒๓๕๕๖"
-iex> Plausible.Cldr.Number.Transliterate.transliterate("Some number is: 123556", "th", "thai")
+iex> Plausible.Cldr.Number.Transliterate.transliterate("Some number is: 123556", "th", "thai")
"Some number is: ๑๒๓๕๕๖"
diff --git a/Plausible.Cldr.Number.html b/Plausible.Cldr.Number.html
index 5a9b45e52..52cd9ea3c 100644
--- a/Plausible.Cldr.Number.html
+++ b/Plausible.Cldr.Number.html
@@ -441,19 +441,19 @@ using the Elixir standard library functions.
Examples
-iex> Plausible.Cldr.Number.parse("+1.000,34", locale: "de")
-{:ok, 1000.34}
+iex> Plausible.Cldr.Number.parse("+1.000,34", locale: "de")
+{:ok, 1000.34}
-iex> Plausible.Cldr.Number.parse("-1_000_000.34")
-{:ok, -1000000.34}
+iex> Plausible.Cldr.Number.parse("-1_000_000.34")
+{:ok, -1000000.34}
-iex> Plausible.Cldr.Number.parse("1.000", locale: "de", number: :integer)
-{:ok, 1000}
+iex> Plausible.Cldr.Number.parse("1.000", locale: "de", number: :integer)
+{:ok, 1000}
-iex> Plausible.Cldr.Number.parse("+1.000,34", locale: "de", number: :integer)
-{:error,
- {Cldr.Number.ParseError,
- "The string \"+1.000,34\" could not be parsed as a number"}}
+iex> Plausible.Cldr.Number.parse("+1.000,34", locale: "de", number: :integer)
+{:error,
+ {Cldr.Number.ParseError,
+ "The string \"+1.000,34\" could not be parsed as a number"}}
@@ -525,17 +525,17 @@ financial instruments.
Examples
-iex> Plausible.Cldr.Number.scan("100 US dollars")
+iex> Plausible.Cldr.Number.scan("100 US dollars")
...> |> Plausible.Cldr.Number.resolve_currencies
-[100, :USD]
+[100, :USD]
-iex> Plausible.Cldr.Number.scan("100 eurosports")
-...> |> Plausible.Cldr.Number.resolve_currencies(fuzzy: 0.75)
-[100, :EUR]
+iex> Plausible.Cldr.Number.scan("100 eurosports")
+...> |> Plausible.Cldr.Number.resolve_currencies(fuzzy: 0.75)
+[100, :EUR]
-iex> Plausible.Cldr.Number.scan("100 dollars des États-Unis")
-...> |> Plausible.Cldr.Number.resolve_currencies(locale: "fr")
-[100, :USD]
+iex> Plausible.Cldr.Number.scan("100 dollars des États-Unis")
+...> |> Plausible.Cldr.Number.resolve_currencies(locale: "fr")
+[100, :USD]
@@ -612,19 +612,19 @@ financial instruments.Examples
-iex> Plausible.Cldr.Number.resolve_currency("US dollars")
-[:USD]
+iex> Plausible.Cldr.Number.resolve_currency("US dollars")
+[:USD]
-iex> Plausible.Cldr.Number.resolve_currency("100 eurosports", fuzzy: 0.75)
-[:EUR]
+iex> Plausible.Cldr.Number.resolve_currency("100 eurosports", fuzzy: 0.75)
+[:EUR]
-iex> Plausible.Cldr.Number.resolve_currency("dollars des États-Unis", locale: "fr")
-[:USD]
+iex> Plausible.Cldr.Number.resolve_currency("dollars des États-Unis", locale: "fr")
+[:USD]
-iex> Plausible.Cldr.Number.resolve_currency("not a known currency", locale: "fr")
-{:error,
- {Cldr.UnknownCurrencyError,
- "The currency \"not a known currency\" is unknown or not supported"}}
+iex> Plausible.Cldr.Number.resolve_currency("not a known currency", locale: "fr")
+{:error,
+ {Cldr.UnknownCurrencyError,
+ "The currency \"not a known currency\" is unknown or not supported"}}
@@ -688,13 +688,13 @@ The default is options[:backend].get_locale()
Examples
iex> Plausible.Cldr.Number.resolve_per "11%"
-["11", :percent]
+["11", :percent]
iex> Plausible.Cldr.Number.resolve_per "% of linguists"
-[:percent, " of linguists"]
+[:percent, " of linguists"]
iex> Plausible.Cldr.Number.resolve_per "% of linguists %"
-[:percent, " of linguists ", :percent]
+[:percent, " of linguists ", :percent]
@@ -751,9 +751,9 @@ The default is options[:backend].get_locale()
Examples
-iex> Plausible.Cldr.Number.scan("100%")
-...> |> Plausible.Cldr.Number.resolve_pers()
-[100, :percent]
+iex> Plausible.Cldr.Number.scan("100%")
+...> |> Plausible.Cldr.Number.resolve_pers()
+[100, :percent]
iex> Plausible.Cldr.Number.scan("£1_000_000.34")
-["£", 1000000.34]
+iex> Plausible.Cldr.Number.scan("£1_000_000.34")
+["£", 1000000.34]
-iex> Plausible.Cldr.Number.scan("I want £1_000_000 dollars")
-["I want £", 1000000, " dollars"]
+iex> Plausible.Cldr.Number.scan("I want £1_000_000 dollars")
+["I want £", 1000000, " dollars"]
-iex> Plausible.Cldr.Number.scan("The prize is 23")
-["The prize is ", 23]
+iex> Plausible.Cldr.Number.scan("The prize is 23")
+["The prize is ", 23]
-iex> Plausible.Cldr.Number.scan("The lottery number is 23 for the next draw")
-["The lottery number is ", 23, " for the next draw"]
+iex> Plausible.Cldr.Number.scan("The lottery number is 23 for the next draw")
+["The lottery number is ", 23, " for the next draw"]
-iex> Plausible.Cldr.Number.scan("The loss is -1.000 euros", locale: "de", number: :integer)
-["The loss is ", -1000, " euros"]
+iex> Plausible.Cldr.Number.scan("The loss is -1.000 euros", locale: "de", number: :integer)
+["The loss is ", -1000, " euros"]
iex> Plausible.Cldr.Number.to_approx_string 1234
-{:ok, "~1,234"}
+{:ok, "~1,234"}
iex> Plausible.Cldr.Number.to_at_least_string 1234
-{:ok, "1,234+"}
+{:ok, "1,234+"}
iex> Plausible.Cldr.Number.to_at_most_string 1234
-{:ok, "≤1,234"}
+{:ok, "≤1,234"}
iex> Plausible.Cldr.Number.to_range_string 1234..5678
-{:ok, "1,234–5,678"}
+{:ok, "1,234–5,678"}
iex> Cldr.Number.to_string(100, format: :currency, currency: :USD, wrapper: fn
...> string, :currency_symbol -> "<span class=\"symbol\">" <> string <> "</span>"
...> string, :number -> "<span class=\"number\">" <> string <> "</span>"
...> string, :currency_space -> "<span>" <> string <> "</span>"
...> string, _other -> string
-...> end)
-{:ok, "<span class=\"symbol\">$</span><span class=\"number\">100.00</span>"}
It is also possible and recommended to use the Phoenix.HTML.Tag.content_tag/3
+
It is also possible and recommended to use the Phoenix.HTML.Tag.content_tag/3
function if wrapping HTML tags since these will ensure HTML entities are
-correctly encoded. For example:
iex> Cldr.Number.to_string(100, format: :currency, currency: :USD, wrapper: fn
-...> string, :currency_symbol -> Phoenix.HTML.Tag.content_tag(:span, string, class: "symbol")
-...> string, :number -> Phoenix.HTML.Tag.content_tag(:span, string, class: "number")
-...> string, :currency_space -> Phoenix.HTML.Tag.content_tag(:span, string)
+correctly encoded. For example:iex> Cldr.Number.to_string(100, format: :currency, currency: :USD, wrapper: fn
+...> string, :currency_symbol -> Phoenix.HTML.Tag.content_tag(:span, string, class: "symbol")
+...> string, :number -> Phoenix.HTML.Tag.content_tag(:span, string, class: "number")
+...> string, :currency_space -> Phoenix.HTML.Tag.content_tag(:span, string)
...> string, _other -> string
-...> end)
-{:ok, "<span class=\"symbol\">$</span><span class=\"number\">100.00</span>"}
When formatting a number the format is parsed into format elements that might include
+
...> end)
+{:ok, "<span class=\"symbol\">$</span><span class=\"number\">100.00</span>"}
When formatting a number the format is parsed into format elements that might include a currency symbol, a literal string, inserted text between a currency symbol and the currency amount, a percent sign, the number itself and several other elements. In some cases it is helpful to be apply specific formatting to each element. @@ -1168,80 +1168,80 @@ inserted in the final formatted number.
iex> Plausible.Cldr.Number.to_string 12345
-{:ok, "12,345"}
+{:ok, "12,345"}
iex> Plausible.Cldr.Number.to_string 12345, locale: "fr"
-{:ok, "12 345"}
+{:ok, "12 345"}
iex> Plausible.Cldr.Number.to_string 1345.32, currency: :EUR, locale: "es", minimum_grouping_digits: 1
-{:ok, "1.345,32 €"}
+{:ok, "1.345,32 €"}
iex> Plausible.Cldr.Number.to_string 1345.32, currency: :EUR, locale: "es"
-{:ok, "1345,32 €"}
+{:ok, "1345,32 €"}
iex> Plausible.Cldr.Number.to_string 12345, locale: "fr", currency: "USD"
-{:ok, "12 345,00 $US"}
+{:ok, "12 345,00 $US"}
iex> Plausible.Cldr.Number.to_string 12345, format: "#E0"
-{:ok, "1.2345E4"}
+{:ok, "1.2345E4"}
iex> Plausible.Cldr.Number.to_string 12345, format: :accounting, currency: "THB"
-{:ok, "THB 12,345.00"}
+{:ok, "THB 12,345.00"}
iex> Plausible.Cldr.Number.to_string -12345, format: :accounting, currency: "THB"
-{:ok, "(THB 12,345.00)"}
+{:ok, "(THB 12,345.00)"}
iex> Plausible.Cldr.Number.to_string 12345, format: :accounting, currency: "THB",
...> locale: "th"
-{:ok, "฿12,345.00"}
+{:ok, "฿12,345.00"}
iex> Plausible.Cldr.Number.to_string 12345, format: :accounting, currency: "THB",
...> locale: "th", number_system: :native
-{:ok, "฿๑๒,๓๔๕.๐๐"}
+{:ok, "฿๑๒,๓๔๕.๐๐"}
iex> Plausible.Cldr.Number.to_string 1244.30, format: :long
-{:ok, "1 thousand"}
+{:ok, "1 thousand"}
iex> Plausible.Cldr.Number.to_string 1244.30, format: :long, currency: "USD"
-{:ok, "1,244 US dollars"}
+{:ok, "1,244 US dollars"}
iex> Plausible.Cldr.Number.to_string 1244.30, format: :short
-{:ok, "1K"}
+{:ok, "1K"}
iex> Plausible.Cldr.Number.to_string 1244.30, format: :short, currency: "EUR"
-{:ok, "€1K"}
+{:ok, "€1K"}
iex> Plausible.Cldr.Number.to_string 1234, format: :spellout
-{:ok, "one thousand two hundred thirty-four"}
+{:ok, "one thousand two hundred thirty-four"}
iex> Plausible.Cldr.Number.to_string 1234, format: :spellout_verbose
-{:ok, "one thousand two hundred and thirty-four"}
+{:ok, "one thousand two hundred and thirty-four"}
iex> Plausible.Cldr.Number.to_string 1989, format: :spellout_year
-{:ok, "nineteen eighty-nine"}
+{:ok, "nineteen eighty-nine"}
iex> Plausible.Cldr.Number.to_string 123, format: :ordinal
-{:ok, "123rd"}
+{:ok, "123rd"}
iex> Plausible.Cldr.Number.to_string 123, format: :roman
-{:ok, "CXXIII"}
+{:ok, "CXXIII"}
iex> Plausible.Cldr.Number.to_string 123, locale: "th-u-nu-thai"
-{:ok, "๑๒๓"}
An error tuple {:error, reason}
will be returned if an error is detected.
-The two most likely causes of an error return are:
iex> Plausible.Cldr.Number.to_string(12345, format: "0#")
- {:error, {Cldr.FormatCompileError,
- "Decimal format compiler: syntax error before: \"#\""}}
locale
and
+The two most likely causes of an error return are: iex> Plausible.Cldr.Number.to_string(12345, format: "0#")
+ {:error, {Cldr.FormatCompileError,
+ "Decimal format compiler: syntax error before: \"#\""}}
locale
and
number_system
. This happens typically when the number system is
:algorithmic
rather than the more common :numeric
. In this case the error
-return looks like: iex> Plausible.Cldr.Number.to_string(1234, locale: "he", number_system: "hebr", format: :percent)
- {:error, {Cldr.UnknownFormatError,
- "The locale :he with number system :hebr does not define a format :percent"}}
+return looks like: iex> Plausible.Cldr.Number.to_string(1234, locale: "he", number_system: "hebr", format: :percent)
+ {:error, {Cldr.UnknownFormatError,
+ "The locale :he with number system :hebr does not define a format :percent"}}
iex> Plausible.Cldr.Number.validate_number_system "en", :latn
-{:ok, :latn}
+{:ok, :latn}
iex> Plausible.Cldr.Number.validate_number_system "en", :default
-{:ok, :latn}
+{:ok, :latn}
iex> Plausible.Cldr.Number.validate_number_system "en", :unknown
-{:error,
- {Cldr.UnknownNumberSystemError, "The number system :unknown is unknown"}}
+{:error,
+ {Cldr.UnknownNumberSystemError, "The number system :unknown is unknown"}}
iex> Plausible.Cldr.Number.validate_number_system "zz", :default
-{:error, {Cldr.InvalidLanguageError, "The language \"zz\" is invalid"}}
+{:error, {Cldr.InvalidLanguageError, "The language \"zz\" is invalid"}}
Functions to implement the number system rule-based-number-format rules of CLDR.
These rules are defined only on the "und" locale and represent specialised number formatting.
The standard public API for RBNF is via the Cldr.Number.to_string/2
function.
The functions on this module are defined at compile time based upon the RBNF rules -defined in the Unicode CLDR data repository. Available rules are identified by:
iex> Plausible.Cldr.Rbnf.NumberSystem.rule_sets(:und)
-...> |> Enum.sort()
-[
+defined in the Unicode CLDR data repository. Available rules are identified by:iex> Plausible.Cldr.Rbnf.NumberSystem.rule_sets(:und)
+...> |> Enum.sort()
+[
:armenian_lower,
:armenian_upper,
:cyrillic_lower,
@@ -161,9 +161,9 @@ defined in the Unicode CLDR data repository. Available rules are identified by:
:roman_upper,
:tamil,
:zz_default
-]
A rule can then be invoked on an available rule_set. For example
iex> Plausible.Cldr.Rbnf.NumberSystem.roman_upper(123, :und)
-"CXXIII"
This particular call is equivalent to the call through the public API of:
iex> Plausible.Cldr.Number.to_string(123, format: :roman)
-{:ok, "CXXIII"}
+]
A rule can then be invoked on an available rule_set. For example
iex> Plausible.Cldr.Rbnf.NumberSystem.roman_upper(123, :und)
+"CXXIII"
This particular call is equivalent to the call through the public API of:
iex> Plausible.Cldr.Number.to_string(123, format: :roman)
+{:ok, "CXXIII"}
Functions to implement the ordinal rule-based-number-format rules of CLDR.
As CLDR notes, the data is incomplete or non-existent for many languages. It is considered complete for English however.
The standard public API for RBNF is via the Cldr.Number.to_string/2
function.
The functions on this module are defined at compile time based upon the RBNF rules -defined in the Unicode CLDR data repository. Available rules are identified by:
iex> Plausible.Cldr.Rbnf.Ordinal.rule_sets(:en)
-[:digits_ordinal]
+defined in the Unicode CLDR data repository. Available rules are identified by:iex> Plausible.Cldr.Rbnf.Ordinal.rule_sets(:en)
+[:digits_ordinal]
-iex> Plausible.Cldr.Rbnf.Ordinal.rule_sets("fr")
-...> |> Enum.sort()
-[
+iex> Plausible.Cldr.Rbnf.Ordinal.rule_sets("fr")
+...> |> Enum.sort()
+[
:digits_ordinal,
:digits_ordinal_feminine,
:digits_ordinal_feminine_plural,
:digits_ordinal_masculine,
:digits_ordinal_masculine_plural
-]
A rule can then be invoked on an available rule_set. For example
iex> Plausible.Cldr.Rbnf.Ordinal.digits_ordinal(123, :en)
-"123rd"
This call is equivalent to the call through the public API of:
iex> Plausible.Cldr.Number.to_string(123, format: :ordinal)
-{:ok, "123rd"}
+]
A rule can then be invoked on an available rule_set. For example
iex> Plausible.Cldr.Rbnf.Ordinal.digits_ordinal(123, :en)
+"123rd"
This call is equivalent to the call through the public API of:
iex> Plausible.Cldr.Number.to_string(123, format: :ordinal)
+{:ok, "123rd"}
Functions to implement the spellout rule-based-number-format rules of CLDR.
As CLDR notes, the data is incomplete or non-existent for many languages. It is considered complete for English however.
The standard public API for RBNF is via the Cldr.Number.to_string/2
function.
The functions on this module are defined at compile time based upon the RBNF rules -defined in the Unicode CLDR data repository. Available rules are identified by:
iex> Plausible.Cldr.Rbnf.Spellout.rule_sets("en")
-...> |> Enum.sort()
-[
+defined in the Unicode CLDR data repository. Available rules are identified by:iex> Plausible.Cldr.Rbnf.Spellout.rule_sets("en")
+...> |> Enum.sort()
+[
:spellout_cardinal,
:spellout_cardinal_verbose,
:spellout_numbering,
@@ -155,9 +155,9 @@ defined in the Unicode CLDR data repository. Available rules are identified by:
:spellout_numbering_year,
:spellout_ordinal,
:spellout_ordinal_verbose
-]
A rule can then be invoked on an available rule_set. For example:
iex> Plausible.Cldr.Rbnf.Spellout.spellout_ordinal(123, "en")
-"one hundred twenty-third"
This call is equivalent to the call through the public API of:
iex> Plausible.Cldr.Number.to_string(123, format: :spellout)
-{:ok, "one hundred twenty-three"}
+]
A rule can then be invoked on an available rule_set. For example:
iex> Plausible.Cldr.Rbnf.Spellout.spellout_ordinal(123, "en")
+"one hundred twenty-third"
This call is equivalent to the call through the public API of:
iex> Plausible.Cldr.Number.to_string(123, format: :spellout)
+{:ok, "one hundred twenty-three"}
iex> Plausible.Cldr.default_locale()
-%Cldr.LanguageTag{
+iex> Plausible.Cldr.default_locale()
+%Cldr.LanguageTag{
backend: Plausible.Cldr,
canonical_locale_name: "en-001",
cldr_locale_name: :"en-001",
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: "en",
language: "en",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :en,
requested_locale_name: "en-001",
script: :Latn,
territory: :"001",
- transform: %{},
- language_variants: []
-}
+ transform: %{},
+ language_variants: []
+}
iex> Plausible.Cldr.default_territory()
+iex> Plausible.Cldr.default_territory()
:"001"
iex> Plausible.Cldr.ellipsis("And furthermore")
+iex> Plausible.Cldr.ellipsis("And furthermore")
"And furthermore…"
-iex> Plausible.Cldr.ellipsis(["And furthermore", "there is much to be done"], locale: :ja)
+iex> Plausible.Cldr.ellipsis(["And furthermore", "there is much to be done"], locale: :ja)
"And furthermore…there is much to be done"
-iex> Plausible.Cldr.ellipsis("And furthermore", format: :word)
+iex> Plausible.Cldr.ellipsis("And furthermore", format: :word)
"And furthermore …"
-iex> Plausible.Cldr.ellipsis(["And furthermore", "there is much to be done"], locale: :ja, format: :word)
+iex> Plausible.Cldr.ellipsis(["And furthermore", "there is much to be done"], locale: :ja, format: :word)
"And furthermore … there is much to be done"
@@ -715,23 +715,23 @@ take an optional locale parameter for which a locale is not supplied.
Example
-iex> Plausible.Cldr.put_locale("pl")
-iex> Plausible.Cldr.get_locale()
-%Cldr.LanguageTag{
+iex> Plausible.Cldr.put_locale("pl")
+iex> Plausible.Cldr.get_locale()
+%Cldr.LanguageTag{
backend: Elixir.Plausible.Cldr,
canonical_locale_name: "pl",
cldr_locale_name: :pl,
- extensions: %{},
+ extensions: %{},
language: "pl",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :pl,
territory: :PL,
requested_locale_name: "pl",
script: :Latn,
- transform: %{},
- language_variants: []
- }
+ transform: %{},
+ language_variants: []
+ }
@@ -818,10 +818,10 @@ take an optional locale parameter for which a locale is not supplied.
Examples
-iex> Plausible.Cldr.known_gettext_locale_name("en")
+iex> Plausible.Cldr.known_gettext_locale_name("en")
"en"
-iex> Plausible.Cldr.known_gettext_locale_name("en-SA")
+iex> Plausible.Cldr.known_gettext_locale_name("en-SA")
false
@@ -864,10 +864,10 @@ name is configured and available in Gettext.Examples
-iex> Plausible.Cldr.known_gettext_locale_name?("en")
+iex> Plausible.Cldr.known_gettext_locale_name?("en")
true
-iex> Plausible.Cldr.known_gettext_locale_name?("!!")
+iex> Plausible.Cldr.known_gettext_locale_name?("!!")
false
@@ -941,10 +941,10 @@ to return the first known locale name from a list.Examples
-iex> Plausible.Cldr.known_locale_name(:"en-AU")
+iex> Plausible.Cldr.known_locale_name(:"en-AU")
:"en-AU"
-iex> Plausible.Cldr.known_locale_name(:"en-SA")
+iex> Plausible.Cldr.known_locale_name(:"en-SA")
false
@@ -986,10 +986,10 @@ name is configured and available in Cldr.Examples
-iex> Plausible.Cldr.known_locale_name?(:en)
+iex> Plausible.Cldr.known_locale_name?(:en)
true
-iex> Plausible.Cldr.known_locale_name?(:"!!")
+iex> Plausible.Cldr.known_locale_name?(:"!!")
false
@@ -1043,8 +1043,8 @@ in this module or in
Example
-iex> Plausible.Cldr.known_number_system_types()
-[:default, :finance, :native, :traditional]
+iex> Plausible.Cldr.known_number_system_types()
+[:default, :finance, :native, :traditional]
@@ -1109,10 +1109,10 @@ and has RBNF rules defined.
Examples
-iex> Plausible.Cldr.known_rbnf_locale_name(:en)
+iex> Plausible.Cldr.known_rbnf_locale_name(:en)
:en
-iex> Plausible.Cldr.known_rbnf_locale_name(:"en-SA")
+iex> Plausible.Cldr.known_rbnf_locale_name(:"en-SA")
false
@@ -1155,10 +1155,10 @@ rules based number formats (RBNF).Examples
-iex> Plausible.Cldr.known_rbnf_locale_name?(:en)
+iex> Plausible.Cldr.known_rbnf_locale_name?(:en)
true
-iex> Plausible.Cldr.known_rbnf_locale_name?(:"!!")
+iex> Plausible.Cldr.known_rbnf_locale_name?(:"!!")
false
@@ -1294,18 +1294,18 @@ CLDR backend defined by the t:Cldr.LanguageTag
is se
Examples
iex> import Cldr.LanguageTag.Sigil
-iex> Plausible.Cldr.put_gettext_locale(~l"en")
-{:ok, "en"}
+iex> Plausible.Cldr.put_gettext_locale(~l"en")
+{:ok, "en"}
iex> import Cldr.LanguageTag.Sigil
-iex> Plausible.Cldr.put_gettext_locale(~l"de")
-{
+iex> Plausible.Cldr.put_gettext_locale(~l"de")
+{
:error,
- {
+ {
Cldr.UnknownLocaleError,
"Locale TestBackend.Cldr.Locale.new!(\"de-DE\") does not map to a known gettext locale name"
- }
-}
+ }
+}
@@ -1349,29 +1349,29 @@ of a language tag.
Examples
-iex> Plausible.Cldr.put_locale("en")
-{:ok,
- %Cldr.LanguageTag{
+iex> Plausible.Cldr.put_locale("en")
+{:ok,
+ %Cldr.LanguageTag{
backend: Plausible.Cldr,
canonical_locale_name: "en",
cldr_locale_name: :en,
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: "en",
language: "en",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :en,
requested_locale_name: "en",
script: :Latn,
territory: :US,
- transform: %{},
- language_variants: []
- }}
+ transform: %{},
+ language_variants: []
+ }}
-iex> Plausible.Cldr.put_locale("invalid-locale!")
-{:error, {Cldr.LanguageTag.ParseError,
- "Expected a BCP47 language tag. Could not parse the remaining \"!\" starting at position 15"}}
+iex> Plausible.Cldr.put_locale("invalid-locale!")
+{:error, {Cldr.LanguageTag.ParseError,
+ "Expected a BCP47 language tag. Could not parse the remaining \"!\" starting at position 15"}}
@@ -1420,10 +1420,10 @@ The default is Examples
-iex> Plausible.Cldr.quote("Quoted String")
+iex> Plausible.Cldr.quote("Quoted String")
"“Quoted String”"
-iex> Plausible.Cldr.quote("Quoted String", locale: :ja)
+iex> Plausible.Cldr.quote("Quoted String", locale: :ja)
"「Quoted String」"
@@ -1554,47 +1554,47 @@ of a language tag.Examples
-iex> Plausible.Cldr.validate_locale(:en)
-{:ok,
-%Cldr.LanguageTag{
+iex> Plausible.Cldr.validate_locale(:en)
+{:ok,
+%Cldr.LanguageTag{
backend: Plausible.Cldr,
canonical_locale_name: "en",
cldr_locale_name: :en,
- extensions: %{},
+ extensions: %{},
gettext_locale_name: "en",
language: "en",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :en,
requested_locale_name: "en",
script: :Latn,
territory: :US,
- transform: %{},
- language_variants: []
-}}
+ transform: %{},
+ language_variants: []
+}}
-iex> Plausible.Cldr.validate_locale Plausible.Cldr.default_locale()
-{:ok,
-%Cldr.LanguageTag{
+iex> Plausible.Cldr.validate_locale Plausible.Cldr.default_locale()
+{:ok,
+%Cldr.LanguageTag{
backend: Plausible.Cldr,
canonical_locale_name: "en-001",
cldr_locale_name: :"en-001",
- extensions: %{},
+ extensions: %{},
gettext_locale_name: "en",
language: "en",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :en,
requested_locale_name: "en-001",
script: :Latn,
territory: :"001",
- transform: %{},
- language_variants: []
-}}
+ transform: %{},
+ language_variants: []
+}}
-iex> Plausible.Cldr.validate_locale("zzz")
-{:error, {Cldr.InvalidLanguageError, "The language \"zzz\" is invalid"}}
+iex> Plausible.Cldr.validate_locale("zzz")
+{:error, {Cldr.InvalidLanguageError, "The language \"zzz\" is invalid"}}
@@ -1664,23 +1664,23 @@ of a language tag.Examples
-iex> Plausible.Cldr.validate_number_system_type(:default)
-{:ok, :default}
+iex> Plausible.Cldr.validate_number_system_type(:default)
+{:ok, :default}
-iex> Plausible.Cldr.validate_number_system_type(:traditional)
-{:ok, :traditional}
+iex> Plausible.Cldr.validate_number_system_type(:traditional)
+{:ok, :traditional}
-iex> Plausible.Cldr.validate_number_system_type(:latn)
-{
+iex> Plausible.Cldr.validate_number_system_type(:latn)
+{
:error,
- {Cldr.UnknownNumberSystemTypeError, "The number system type :latn is unknown"}
-}
+ {Cldr.UnknownNumberSystemTypeError, "The number system type :latn is unknown"}
+}
-iex> Plausible.Cldr.validate_number_system_type("bork")
-{
+iex> Plausible.Cldr.validate_number_system_type("bork")
+{
:error,
- {Cldr.UnknownNumberSystemTypeError, "The number system type \"bork\" is invalid"}
-}
+ {Cldr.UnknownNumberSystemTypeError, "The number system type \"bork\" is invalid"}
+}
diff --git a/Plausible.ClickhouseRepo.html b/Plausible.ClickhouseRepo.html
index c661a11ef..38f155455 100644
--- a/Plausible.ClickhouseRepo.html
+++ b/Plausible.ClickhouseRepo.html
@@ -879,23 +879,23 @@ pool to disconnect within the given interval.
diff --git a/Plausible.DataMigration.Repo.html b/Plausible.DataMigration.Repo.html
index 8d451438e..232ee20c2 100644
--- a/Plausible.DataMigration.Repo.html
+++ b/Plausible.DataMigration.Repo.html
@@ -1196,23 +1196,23 @@ pool to disconnect within the given interval.See
-Similar to insert_all/2
but with the following differences:
- accepts rows as streams or lists
- sends rows as a chunked request
- doesn't autogenerate ids or does any other preprocessing
Example:
Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
+Similar to insert_all/2
but with the following differences:
- accepts rows as streams or lists
- sends rows as a chunked request
- doesn't autogenerate ids or does any other preprocessing
Example:
Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
-defmodule Demo do
+defmodule Demo do
use Ecto.Schema
@primary_key false
- schema "ecto_ch_demo" do
+ schema "ecto_ch_demo" do
field :a, Ch, type: "UInt64"
field :b, :string
- end
-end
+ end
+end
-rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
-{100_000, nil} = Repo.insert_stream(Demo, rows)
+rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
+{100_000, nil} = Repo.insert_stream(Demo, rows)
# schemaless
-{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])
+{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])
diff --git a/Plausible.Exports.html b/Plausible.Exports.html
index a81e36050..ed2614633 100644
--- a/Plausible.Exports.html
+++ b/Plausible.Exports.html
@@ -381,7 +381,7 @@ tables into the format of imported_*
tables for a we
-Renders export archive filename.
Examples:
iex> archive_filename("plausible.io", _created_on = ~D[2024-12-31])
+Renders export archive filename.
Examples:
iex> archive_filename("plausible.io", _created_on = ~D[2024-12-31])
"plausible_io_20241231.zip"
@@ -404,10 +404,10 @@ tables into the format of imported_*
tables for a we
-Safely renders content disposition for an arbitrary export filename.
Examples:
iex> content_disposition("plausible_io_20241231.zip")
+Safely renders content disposition for an arbitrary export filename.
Examples:
iex> content_disposition("plausible_io_20241231.zip")
"attachment; filename=\"plausible_io_20241231.zip\""
-iex> content_disposition("📊.zip")
+iex> content_disposition("📊.zip")
"attachment; filename=\"plausible-export.zip\"; filename*=utf-8''%F0%9F%93%8A.zip"
@@ -726,14 +726,14 @@ tables into the format of imported_*
tables for a we
-Creates a streamable Zip archive from the provided (named) Ecto queries.
Example usage:
{:ok, pool} = Ch.start_link(pool_size: 1)
+Creates a streamable Zip archive from the provided (named) Ecto queries.
Example usage:
{:ok, pool} = Ch.start_link(pool_size: 1)
-DBConnection.run(pool, fn conn ->
+DBConnection.run(pool, fn conn ->
conn
- |> stream_archive(export_queries(_site_id = 1), format: "CSVWithNames")
- |> Stream.into(File.stream!("export.zip"))
- |> Stream.run()
-end)
+ |> stream_archive(export_queries(_site_id = 1), format: "CSVWithNames")
+ |> Stream.into(File.stream!("export.zip"))
+ |> Stream.run()
+end)
diff --git a/Plausible.Geo.html b/Plausible.Geo.html
index 9a270e1cf..50b1dea39 100644
--- a/Plausible.Geo.html
+++ b/Plausible.Geo.html
@@ -260,8 +260,8 @@ and MaxMind license key.
Examples
- In the case of a DB-IP database:
iex> database_type()
-"DBIP-City-Lite"
In the case of a MaxMind database:
iex> database_type()
+ In the case of a DB-IP database:
iex> database_type()
+"DBIP-City-Lite"
In the case of a MaxMind database:
iex> database_type()
"GeoLite2-City"
@@ -302,8 +302,8 @@ asynchronously.
Examples
- Loading from a local file:
iex> load_db(path: "/etc/plausible/dbip-city.mmdb")
-:ok
Downloading a MaxMind DB (this license key is no longer active):
iex> load_db(license_key: "LNpsJCCKPis6XvBP", edition: "GeoLite2-City", async: true)
+ Loading from a local file:
iex> load_db(path: "/etc/plausible/dbip-city.mmdb")
+:ok
Downloading a MaxMind DB (this license key is no longer active):
iex> load_db(license_key: "LNpsJCCKPis6XvBP", edition: "GeoLite2-City", async: true)
:ok
@@ -332,21 +332,21 @@ asynchronously.
Examples
-iex> lookup("8.7.6.5")
-%{
- "city" => %{
+iex> lookup("8.7.6.5")
+%{
+ "city" => %{
"geoname_id" => 5349755,
- "names" => %{
+ "names" => %{
"de" => "Fontana",
"en" => "Fontana",
"ja" => "フォンタナ",
"ru" => "Фонтана"
- }
- },
- "continent" => %{
+ }
+ },
+ "continent" => %{
"code" => "NA",
"geoname_id" => 6255149,
- "names" => %{
+ "names" => %{
"de" => "Nordamerika",
"en" => "North America",
"es" => "Norteamérica",
@@ -355,12 +355,12 @@ asynchronously."pt-BR" => "América do Norte",
"ru" => "Северная Америка",
"zh-CN" => "北美洲"
- }
- },
- "country" => %{
+ }
+ },
+ "country" => %{
"geoname_id" => 6252001,
"iso_code" => "US",
- "names" => %{
+ "names" => %{
"de" => "Vereinigte Staaten",
"en" => "United States",
"es" => "Estados Unidos",
@@ -369,20 +369,20 @@ asynchronously."pt-BR" => "EUA",
"ru" => "США",
"zh-CN" => "美国"
- }
- },
- "location" => %{
+ }
+ },
+ "location" => %{
"accuracy_radius" => 50,
"latitude" => 34.1211,
"longitude" => -117.4362,
"metro_code" => 803,
"time_zone" => "America/Los_Angeles"
- },
- "postal" => %{"code" => "92336"},
- "registered_country" => %{
+ },
+ "postal" => %{"code" => "92336"},
+ "registered_country" => %{
"geoname_id" => 6252001,
"iso_code" => "US",
- "names" => %{
+ "names" => %{
"de" => "Vereinigte Staaten",
"en" => "United States",
"es" => "Estados Unidos",
@@ -391,13 +391,13 @@ asynchronously."pt-BR" => "EUA",
"ru" => "США",
"zh-CN" => "美国"
- }
- },
- "subdivisions" => [
- %{
+ }
+ },
+ "subdivisions" => [
+ %{
"geoname_id" => 5332921,
"iso_code" => "CA",
- "names" => %{
+ "names" => %{
"de" => "Kalifornien",
"en" => "California",
"es" => "California",
@@ -406,10 +406,10 @@ asynchronously."pt-BR" => "Califórnia",
"ru" => "Калифорния",
"zh-CN" => "加州"
- }
- }
- ]
-}
+ }
+ }
+ ]
+}
diff --git a/Plausible.ImportDeletionRepo.html b/Plausible.ImportDeletionRepo.html
index 7af0db513..119a9aa91 100644
--- a/Plausible.ImportDeletionRepo.html
+++ b/Plausible.ImportDeletionRepo.html
@@ -1187,23 +1187,23 @@ pool to disconnect within the given interval.See
-Similar to insert_all/2
but with the following differences:
- accepts rows as streams or lists
- sends rows as a chunked request
- doesn't autogenerate ids or does any other preprocessing
Example:
Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
+Similar to insert_all/2
but with the following differences:
- accepts rows as streams or lists
- sends rows as a chunked request
- doesn't autogenerate ids or does any other preprocessing
Example:
Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
-defmodule Demo do
+defmodule Demo do
use Ecto.Schema
@primary_key false
- schema "ecto_ch_demo" do
+ schema "ecto_ch_demo" do
field :a, Ch, type: "UInt64"
field :b, :string
- end
-end
+ end
+end
-rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
-{100_000, nil} = Repo.insert_stream(Demo, rows)
+rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
+{100_000, nil} = Repo.insert_stream(Demo, rows)
# schemaless
-{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])
+{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])
diff --git a/Plausible.Imported.CSVImporter.html b/Plausible.Imported.CSVImporter.html
index 7b0800f18..03c751761 100644
--- a/Plausible.Imported.CSVImporter.html
+++ b/Plausible.Imported.CSVImporter.html
@@ -257,13 +257,13 @@ or from local storage for which it uses iex> date_range([
-...> %{"filename" => "imported_devices_20190101_20210101.csv"},
+Extracts min/max date range from a list of uploads.
Examples:
iex> date_range([
+...> %{"filename" => "imported_devices_20190101_20210101.csv"},
...> "pages_20200101_20220101.csv"
-...> ])
-Date.range(~D[2019-01-01], ~D[2022-01-01])
+...> ])
+Date.range(~D[2019-01-01], ~D[2022-01-01])
-iex> date_range([])
+iex> date_range([])
nil
@@ -292,13 +292,13 @@ or from local storage for which it uses iex> extract_table("my_data.csv")
+Extracts the table name from the provided filename.
Raises if the filename doesn't conform to the expected format.
Examples:
iex> extract_table("my_data.csv")
** (ArgumentError) invalid filename
-iex> extract_table("imported_devices_00010101_20250101.csv")
+iex> extract_table("imported_devices_00010101_20250101.csv")
"imported_devices"
-iex> extract_table("devices_00010101_20250101.csv")
+iex> extract_table("devices_00010101_20250101.csv")
"imported_devices"
@@ -321,8 +321,8 @@ or from local storage for which it uses
-Returns local directory for CSV imports storage.
Builds upon $DATA_DIR
, $PERSISTENT_CACHE_DIR
or $DEFAULT_DATA_DIR
(if set) and falls back to /tmp.
$DEFAULT_DATA_DIR
is set to /var/lib/plausible
in container images.
Examples:
iex> local_dir = local_dir(_site_id = 37)
-iex> String.ends_with?(local_dir, "/plausible-imports/37")
+Returns local directory for CSV imports storage.
Builds upon $DATA_DIR
, $PERSISTENT_CACHE_DIR
or $DEFAULT_DATA_DIR
(if set) and falls back to /tmp.
$DEFAULT_DATA_DIR
is set to /var/lib/plausible
in container images.
Examples:
iex> local_dir = local_dir(_site_id = 37)
+iex> String.ends_with?(local_dir, "/plausible-imports/37")
true
@@ -382,14 +382,14 @@ or from local storage for which it uses iex> parse_filename!("my_data.csv")
+Extracts table name and min/max dates from the filename.
Examples:
iex> parse_filename!("my_data.csv")
** (ArgumentError) invalid filename
-iex> parse_filename!("imported_devices_00010101_20250101.csv")
-{"imported_devices", ~D[0001-01-01], ~D[2025-01-01]}
+iex> parse_filename!("imported_devices_00010101_20250101.csv")
+{"imported_devices", ~D[0001-01-01], ~D[2025-01-01]}
-iex> parse_filename!("devices_00010101_20250101.csv")
-{"imported_devices", ~D[0001-01-01], ~D[2025-01-01]}
+iex> parse_filename!("devices_00010101_20250101.csv")
+{"imported_devices", ~D[0001-01-01], ~D[2025-01-01]}
@@ -417,13 +417,13 @@ or from local storage for which it uses iex> valid_filename?("my_data.csv")
+Checks if the provided filename conforms to the expected format.
Examples:
iex> valid_filename?("my_data.csv")
false
-iex> valid_filename?("imported_devices_00010101_20250101.csv")
+iex> valid_filename?("imported_devices_00010101_20250101.csv")
true
-iex> valid_filename?("devices_00010101_20250101.csv")
+iex> valid_filename?("devices_00010101_20250101.csv")
true
diff --git a/Plausible.Imported.Importer.html b/Plausible.Imported.Importer.html
index 13df9b173..a1c9308b7 100644
--- a/Plausible.Imported.Importer.html
+++ b/Plausible.Imported.Importer.html
@@ -183,30 +183,30 @@ scope of importer logic and is expected to be implemented separately.
In case it's necessary to run the whole import job fully synchronously, the
Plausible.Workers.ImportAnalytics
worker sends an Oban.Notifier
message
-on completion, failure or transient failure of the import.
A basic usage scenario looks like this:
{:ok, job} = Plausible.Imported.NoopImporter.new_import(
+on completion, failure or transient failure of the import.A basic usage scenario looks like this:
{:ok, job} = Plausible.Imported.NoopImporter.new_import(
site,
user,
start_date: ~D[2005-01-01],
- end_date: Date.utc_today(),
+ end_date: Date.utc_today(),
# this option is necessary to setup the calling process as listener
listen?: true
-)
+)
-import_id = job.args[:import_id]
+import_id = job.args[:import_id]
-receive do
- {:notification, :analytics_imports_jobs, %{"event" => "complete", "import_id" => ^import_id}} ->
- IO.puts("Job completed")
+receive do
+ {:notification, :analytics_imports_jobs, %{"event" => "complete", "import_id" => ^import_id}} ->
+ IO.puts("Job completed")
- {:notification, :analytics_imports_jobs, %{"event" => "transient_fail", "import_id" => ^import_id}} ->
- IO.puts("Job failed transiently")
+ {:notification, :analytics_imports_jobs, %{"event" => "transient_fail", "import_id" => ^import_id}} ->
+ IO.puts("Job failed transiently")
- {:notification, :analytics_imports_jobs, %{"event" => "fail", "import_id" => ^import_id}} ->
- IO.puts("Job failed permanently")
-after
+ {:notification, :analytics_imports_jobs, %{"event" => "fail", "import_id" => ^import_id}} ->
+ IO.puts("Job failed permanently")
+after
15_000 ->
- IO.puts("Job didn't finish in 15 seconds")
-end
In a more realistic scenario, job scheduling will be done inside a GenServer process
+
IO.puts("Job didn't finish in 15 seconds")
+end
In a more realistic scenario, job scheduling will be done inside a GenServer process
like LiveView, where notifications can be listened for via handle_info/2
.
diff --git a/Plausible.IngestRepo.html b/Plausible.IngestRepo.html
index c117bd6d7..079230632 100644
--- a/Plausible.IngestRepo.html
+++ b/Plausible.IngestRepo.html
@@ -1217,23 +1217,23 @@ pool to disconnect within the given interval.See
-Similar to insert_all/2
but with the following differences:
- accepts rows as streams or lists
- sends rows as a chunked request
- doesn't autogenerate ids or does any other preprocessing
Example:
Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
+Similar to insert_all/2
but with the following differences:
- accepts rows as streams or lists
- sends rows as a chunked request
- doesn't autogenerate ids or does any other preprocessing
Example:
Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
-defmodule Demo do
+defmodule Demo do
use Ecto.Schema
@primary_key false
- schema "ecto_ch_demo" do
+ schema "ecto_ch_demo" do
field :a, Ch, type: "UInt64"
field :b, :string
- end
-end
+ end
+end
-rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
-{100_000, nil} = Repo.insert_stream(Demo, rows)
+rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
+{100_000, nil} = Repo.insert_stream(Demo, rows)
# schemaless
-{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])
+{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])
diff --git a/Plausible.S3.html b/Plausible.S3.html
index b9c76a269..e6cfa92e3 100644
--- a/Plausible.S3.html
+++ b/Plausible.S3.html
@@ -316,7 +316,7 @@ The URL expires in 300 seconds, which should be enough for a redirect.
In
Returns the pre-configured S3 bucket for CSV exports.
config :plausible, Plausible.S3,
- exports_bucket: System.fetch_env!("S3_EXPORTS_BUCKET")
Example:
iex> exports_bucket()
+ exports_bucket: System.fetch_env!("S3_EXPORTS_BUCKET")
Example:
iex> exports_bucket()
"test-exports"
@@ -348,8 +348,8 @@ The URL expires in 300 seconds, which should be enough for a redirect.In
-
Returns access_key_id
and secret_access_key
to be used by ClickHouse during imports from S3.
Example:
iex> import_clickhouse_credentials()
-%{access_key_id: "minioadmin", secret_access_key: "minioadmin"}
+Returns access_key_id
and secret_access_key
to be used by ClickHouse during imports from S3.
Example:
iex> import_clickhouse_credentials()
+%{access_key_id: "minioadmin", secret_access_key: "minioadmin"}
@@ -371,9 +371,9 @@ The URL expires in 300 seconds, which should be enough for a redirect.In
-Presigns an upload for an imported file.
In the current implementation the bucket always goes into the path component.
Example:
iex> upload = import_presign_upload(_site_id = 123, _filename = "imported_browsers.csv")
-iex> true = String.ends_with?(upload.s3_url, "/test-imports/123/imported_browsers.csv")
-iex> true = String.contains?(upload.presigned_url, "/test-imports/123/imported_browsers.csv?X-Amz-Algorithm=AWS4-HMAC-SHA256&")
+Presigns an upload for an imported file.
In the current implementation the bucket always goes into the path component.
Example:
iex> upload = import_presign_upload(_site_id = 123, _filename = "imported_browsers.csv")
+iex> true = String.ends_with?(upload.s3_url, "/test-imports/123/imported_browsers.csv")
+iex> true = String.contains?(upload.presigned_url, "/test-imports/123/imported_browsers.csv?X-Amz-Algorithm=AWS4-HMAC-SHA256&")
@@ -402,7 +402,7 @@ The URL expires in 300 seconds, which should be enough for a redirect.In
Returns the pre-configured S3 bucket for CSV imports.
config :plausible, Plausible.S3,
- imports_bucket: System.fetch_env!("S3_IMPORTS_BUCKET")
Example:
iex> imports_bucket()
+ imports_bucket: System.fetch_env!("S3_IMPORTS_BUCKET")
Example:
iex> imports_bucket()
"test-imports"
diff --git a/Plausible.Stats.Filters.html b/Plausible.Stats.Filters.html
index 5f9188968..22a04d97d 100644
--- a/Plausible.Stats.Filters.html
+++ b/Plausible.Stats.Filters.html
@@ -396,14 +396,14 @@ does not handle AND/OR/NOT!
Examples:
-iex> Filters.parse("{\"page\":\"/blog/**\"}")
-[[:matches_wildcard, "event:page", ["/blog/**"]]]
+iex> Filters.parse("{\"page\":\"/blog/**\"}")
+[[:matches_wildcard, "event:page", ["/blog/**"]]]
-iex> Filters.parse("visit:browser!=Chrome")
-[[:is_not, "visit:browser", ["Chrome"]]]
+iex> Filters.parse("visit:browser!=Chrome")
+[[:is_not, "visit:browser", ["Chrome"]]]
-iex> Filters.parse(nil)
-[]
+iex> Filters.parse(nil)
+[]
diff --git a/Plausible.Stats.SQL.Fragments.html b/Plausible.Stats.SQL.Fragments.html
index 50a2af50a..ac70eaaa2 100644
--- a/Plausible.Stats.SQL.Fragments.html
+++ b/Plausible.Stats.SQL.Fragments.html
@@ -668,12 +668,12 @@ boundary, not_before
is returned.not_before
boundary is set to the past Saturday, which is before the
weekstart, therefore the cap does not apply. > this_wednesday = ~D[2022-11-09]
> past_saturday = ~D[2022-11-05]
- > weekstart_not_before(this_wednesday, past_saturday)
+ > weekstart_not_before(this_wednesday, past_saturday)
~D[2022-11-07]
In this other example, the fragment returns Tuesday and not the weekstart.
The not_before
boundary is set to Tuesday, which is past the weekstart,
therefore the cap applies.
> this_wednesday = ~D[2022-11-09]
> this_tuesday = ~D[2022-11-08]
- > weekstart_not_before(this_wednesday, this_tuesday)
+ > weekstart_not_before(this_wednesday, this_tuesday)
~D[2022-11-08]
diff --git a/Plausible.epub b/Plausible.epub
index 4fc749fc2f61b88b48ae5ff1107e0a12066facd9..4c661782fd4ed68407b95b8ae9e2a7f056fbc50b 100644
GIT binary patch
delta 143584
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⋘wXVjXofUcct)^w4?fWpBk-Dh%uZgrG
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%0D*zBEWsd{X@J-SL-O{}&&mJKbz13^x>
zZIqRnEc%!&Hw0ElKaE~g9#P>zxTrnK*8P8n+ppVhs_a|7pH~{!_^X|!b_doz
z{LvwwHagP!(IuQET-@u+w;@wh3zArN*O!kipACLubLS7wd8Vy)m58;Hzc{j-Q~AJF
zjm~uBr@uN>V{PWl*|jbhuk;a-q84iZ9IU|*{o^f5W^Rs%RNNdg2ATaU3sET1Y>cn%
zwJNndsqKZ$GC`cyPybM!Wsuq7p~dJcF*ib7n+z9K*@?$+G0C@N&DRhxk+S6eoTs1!
ze0WZ*!-Im^9U#=gR7-_#jJ9;H%uF)HF!Nyszb2K29OIf^ZOQOBnEZn|7dVb0)0I?l
zwLdP&rZmrLh{%U=T4y*z2mfDp
zzxGbHPPiBRX`EfycZpqBqP9_S4IqC?`CcEKbE*8ryt=Yq=cy1^sD`;8;x86LIMOOG
ze`C{q|C{%a>~3*ac1rlYC)teuk|fheztoHO9Rlg1sL#RuyaKtCKQ=`1_<28{mGr_+
zXMV4uUd&hTFYjsI_$(QRk&8OK;|BbaoOX1^%fP2Nv`CCp+sI`WU8vWYCbO-3Z?uo)
z9q-ka6vNqlJP(C^e?&IZwrXqQQ1fy+*5zn(938d?zNsV?
z={|cn)oG`?Wd792B_0TAp-^8o{&*+cQeREIzLTd@OFin;BNh5S%^;UGRQ_^NOj;Nk
z*1bFv*@3T7>o2Zf{d4@j7H?T?_v)8*=Zf#V=&tj(L-E2;=V5PKT7v8$7hJbGBrhRq
z&&K7;Y47i!E|x!ZyS2e
z%o0zK7B#w+qfDluGA7gI?Mg*-0R9J(5AA%GG)Cv0m+w0jX!6rBW2c~*xJYD>xFnTe
zY6TQYJGthCmoz=JzUN+%IAq|w6bLGMZn!jW0YefGxl!UwDVc~GSkN4=M2}3gYaTOs
zL`Iout5V^+zdm+@hn4SU?w=p|%lF;1ExJK#^^m;)(W}ur%}ejmp;64
zdcs$UH$O-^Z#TuV2*c%K>o3@iXHbtA{q`0Ib!PrE5o&4Cg)x(%L!GOWg4a)z%chq*
zUJKqoPcL#UJZnaF7EZm%ME4Aq%d7V)Qd-{j?HRx8!7Qyn#0faO`^fm0!6t-}zt`;B
z4bpaGe0F(**v)8NAPMv@9+CuxWxSVvbYU<5cV52_P&s@gF-U`><07K$TFATbPVeHI
z7<&mn>Lk()8aoUFW6c{q>?4Q$>|K_u#t;T?Ej7Mx8Uhq-EM|5@EVcv5rTE%R6eC5-
z>?uD(vX(BFyfHb@@ysWIB6Pu)D697IC&WmzR!LU8L1go~c9_9V)*D#5R@)*spcKKb
zHUfLnMc`7l3dCBS2kY<{w^emnt)jr%m|%`=AN;usI)rDxjCQQKg*lWO*NN}b$nrBI
zg(cqxGm<3Nj;hB$)25rzPU`x(2@9{f1TK@i5`tpsdz2jMOq6=xlNpVDSai+nUbp0P
z3s59=vGjpt^~)XVx5!KJ0n9aGofVPWi}FJp)k|(LTF76fjWX96NfMB49Xqy;6%r&NM2w-W>r7*{GWDFO8+d7?Y`{cXH$_8y+@7tN!7-QhjxUjoDQp3;^`fY8w%;JY?rvm>(~4q?hIMG&WYE`-goHvaeI5OdguMPb(ujqu_|gSn5+FVPcV04N;}@`5^f8pC{scA{
z@Lw1Tz3Fq_|C0sD`n8+#Jjnk6Fxq0sim%KDd28-QH-T4iJua^mZXj7doCFE)*|_Ioot0SHL@MN)Se1V$6VGNcnC5U+#`r60C!
z&02AwboN}RK$(!;T(=b+ryrBofOlu~7xYJmvn3IGO&w{DxxioSi8tPd^pu)x(iz4!
zXl4so2YeCi)uPZ8{g_`}<)P~czjn4bpMxiQC*+FtjUDWUDi8E1W|VK)#S97+h@|8U
ztv>@+Nl2uK_qe^B*G}Siz$qiFUn2GbVtCl2-3e0k$5AIm(t~KUdn81>?a-xqd|CHk
z-}Imq<(AZN3`Jsqni~J8KH9J;N4*QP{qnDiPTm;^1uqs2g~GhmtRYsxvn~NOp^M?T
z%nr5Xj`*;7R}oeF1-i)qe{-4M@FJ?gv@UZ%2Y<&ODqJ;pYpD5op<*5{>|!3axT7XWHLAk^vC2vxuqmVr_=iS`HDxCQn3TVU~#)qFoY+keY{DP;X!(A+s!qYidE@DghU@&{jra>ZQ?dF0Yf
z_aAUKcfBW7rA8*+>_)e>?c;U@?RL~e)r;~f!x>c@8=pIb(rW0&*?Te-P0ynNweQ^}
z5@SsZ9JGGvGVz(ou_oVqXD44@e>(|-twQNDz^n8J#S_~Ppi{+`z5FX%`g?w8LCT}9
zZ=H5p7w(qO1$^S=CE;QRugRjcp#KPE&1#OAk3b+BSM11{Z{;1iDc)=O=xf+=5c4sZ
z;lH7+2|M#PZFogIug!~7IiQcT`Vrs%9IVxY1NCbWe5xx={{zY)@m*@-3bD*=6iSzr{Ne14M90sYdM+
zxIytV^U+zspD`_WxqgHdN&H$b(w-_++_vLQPZwgDpl{>NwjQCYL@m4bkA)nP4cOn|9l93nr2kx|4WBoRApnAUxJL(rn5>Xjh{jO1X`5a
zy}l|Ek0M56)ri+h!?YAJRz3k2sOgTbD3j7XYNzO}#FKAvOd9I&Ito6019
znYoMHc?<-T^sJq1OhrF(`)uguXDUVSZUwrob>bd{xx7ryIYx9)zZ1Oo_XxD
z9`H3Rh{*Lgknw=(^=_kf+sC(F0^(M(WQr(|?rHt=oJWuj07h_6XUzcz1;E
zn;ZU{8d&y^c=%5P$cF!EvE75W&R-pFm!rzspNkJdPN!8&&?kqi1G7sh&A_siJIJ;k
zJBn|=FzB0>x8mW&Ctxp#t?n?RGXU|Kg%T~0za?;ZaO`d5tF%}fhh9x(_3}W@3B(8N
z9b(Jkw8i~*Sn}iG?0fjz0<(Xzm@qXjA~~Iy
ztxUw()@yfQVtF>-*pe3eMiQoB)4KBy4aTxD)OIY`r7r^4%u8W#9hTIFn~9V
zIvF8*Fg(T$J&?z|)__M=m_R}lM!E@3um`%0g>`BxF~lkvby!HW36Yl8ia#x)cFY+e
zYhqoiF?m|}(tEa;7y>xz1(R&K^_I~?=SBmQzz=&&TuR0QhQGM&s3HhA0OCaSx+#fh
zSK(7(imI_b3;rByN>WlFAK{4INgi$`evLe(#XRVPtB|q*b;p*A?Lq%`z>GK|fRs6r
zx95TVZnSV?uQtXKS662=$N1Pv+bj~Liazi#-=I!|rQpQEB?V;h75bh6S-)?mM55uh
zOIFOidvr83&-SL|-TFQ8jD<9R>hR6|_PjSPouDNBe)mUi;jlR^lQf=r>MJgnw2ZQB
z9EE_Vg>ULBi-@#nY&;*F%FOwzg)&=J;mbhnhm+^HuCJkD1qyKV
z#X=7t0non2Bi*=(+(r}-kOj>zPMPuVXS)psIso;jgPF$(T`Z>+{B3M*l8!AUj314i
zYB`w#F;!KQ$a&ocuEMlAeg$xMnke{p2;TVL6jzq?(Rcg%=f1R$*T>i-Q*;3Sx93~4
zq+oOa3HcB4KUOzH1qYzJJp!9>-*49~aB#aOzlpN$5HIu-73Aj#^dHp;PWDtRGF;zim2dSe
zJJ7>+$)KBc8Sh5`Qv)4XNw1gyEZ~U0eDt425i5l62qFU+v_h6A67TEeEGBFm{LNG?
zOU5@=lnei!Fjvbhx$#By$TzJ2^h)vFELMq5ip|MqP^`SvaJn+PnIU<$+_JgTb^9M{7EOMzuJ)<+=
zCL0FC{Jpi^8eJZgP*7U&&tO30^;J+GK%cf!BKGi0vro3~d3V1bncA9Cjq5$yy?k6q
z8pQ&Tz#h=N;(9F|V|W2KlAf>tA)wkxe%Js$(3hlcY=8x*WD*??z!a1tDG>)igVQ3~
zkUcQDL(h5*Ki=w>g8^0?0xR1k6zX=Cw1NY01PxA-!v*}u+|z^$2!)SoCi156z!toe
zGr5{dlEDKAL2G}9o9i04_<5L=iU**A$cRIvL2$F7oruJo+n5?>ihWnT2ORQ*bFYL-@NZpW6irq`^TmA3Y8XI|=pQR#11sdElK^-$~n_pvj1ElWdtMeTITz9mI&c(dH6R%S@!I6ZA*>63?
zc2BH5l#YRK1I43pLCvM3J1vCg_&@Hy)gM)5$;?>2+b37NQ>G=>w1WrZ(K*$5blsr;oEndH9o%@VvhICQWvm
zg)?yY^at4w@`PVoWcqp2voafZ6e#OD1RZ4TX5=q=P#vKMou_ovP0Maci&OtL!f0_S
zoLqnang2gRX(hWOiu68SrA9{$20Z|+75N>AS+0`cmMdaTmhWX*-$-$lcvsohMlQVY
za*@$sxPvr+6xkE9Be{J#GRk5z5zfL+J0?b&%w%#K8k?-XKUP1?5;b6Q`?$N?J7mk~
z0X&5_Ln^De7zga^S8%~QL7A-#weGeTbsscJ_D|}OChRE^FpVTwCgI^(cTI=pBMk#d
zQDH~Evuv3a*0aTRDw}2sdKBeQus-IjDd3#G#nHSVR|+g&+woL%FRfd)@idH!6{LW`
zrp;NO?MOHttwBd+4UmfXbuQ17!JCstK`$o_#m(Fj
zgw=M2y?;B$G^%%r6lxa&&Q!u8NlP%qCbJe7JGOb)rk}QB6Kl23S;%6r;t)P^xFE`W
z(MXg6=QzBp8Z+945NoE{dC?apO?P;<-mW0y*KIp}@t~_t8H5P^d(^O{$=w6^JQYio
zv`XqP$&7{aEhe_c)lw@+7Ed+$kNitaC}<~hM3%ZOJ@ogIX?|A5Zun_FCSi*C@Aarm<$|K1@8mx}Yta3zrl@PsAw{-q&e#
z!_mRw6hmgsag)A{Rle1-xx{77^cyT*s#gAT*~iL(_nB;D*NIwR7hMciyCDG
zdoXt6jIOE7?b!*dShR`RSLsd~(A_*k*$DQoE0W%Qrd;s!lE{WXvGt$~ytK1uIsOJi
zBi9}dM@wkRGYw5Kr(lb-N=+PEdqzY4RE;vsO1RsLOghk1GG(ipYCOXQ{)ijh$4O;h
zJH`+2)(H%$k<$DKPE?H4!>E?1_DEfMxsP7-15-IOoK^F&`0;_rPuzDYMZ0-IkbCoD
zA*YIX+KDy!d&IF}VSBRweB@cN8c8?|H|#FyCez4F({}B8#7CjlCGFq0cRl#!v;FrG
z5mbR>UVGt{Scj%G`aOk2U^~`mxY;+z3*|*xiJg(gD<6|fQAE4bQVHP#1NVfRVaTVZ*}b)r23ne44y;%*aDDdl`Q~4;;n}X-L6-dJkVAMRbpm@I38k
z*~$Uwd@t)l41n>p1Wrt2@>-^=?dxjs9TKdb>cBl0HAr$rjuOxaire9!7o!NPxG#*w
z?kenYo6jzVDz0fAVk26ygs4hIK0G@6`QfIfTGPF0yt^u*_iLP&46148U(4Vc8X;jX
z7u&4%3%pv3spv6QP_Uz;=+@8}@4zqmz5ew^Oq)&k2ir2kuC5ZO
z2F)AMrc;anauSN$AY9a61LTdMJp-zG5B*lj86KMYMUT_n{Dvnd3l)v5XkC1UiiyXG
zL5W@t6*pd*HOL6OM7}4)CLvNl+!vvXgR}6T*Rj#Q*$HInLMM
zmh{L7AO_Y`8CsY*5Uy}WMC1;h&D*+=p1+qNd2WxD=JF#o4NXI$Q6
zQiE$t@}^4=TD=bY4AGbdpi9Guded0r;MKgDhv
zqq0KVEEANkJsM&%J5*SN>*ZHT&x0-wkYoZ60sr;WTw@EC@rU0w5EifnWza6
ztxnIYdDEj^IfcPuBa8Bh^UwYX?2tk<-$gMaNJ22zqc-u+kLOr{YUa!PKN&!?DbWMr
z1F!{CumWOehgyUytx930sJKR?jIi;aZ)@X6*%OKLdNk)_WOOnia1bR0dOhW7*{WN0
z(sMU)v~1aF@~oCI9dQg(>=pPFj}``E!@0sS4TN|k)IyL5BEplg&+Q#Jqy+;#Yl;l1
zK_Q*@Z0Oc8nMR3Amuc-}4>r5vz(jzojo*2H4TDZ2)E;+>`9v*(@4eF|Oq6CVyPcRu
z({|NVHbL^6zqFy^ps*b^g2UX}t*Z~4LI%4f+B%7QZs+xE@cHFxx}7SngNU^>(NNC9
z+}Q;6X@be~*BL2-j|%oObxb-KaXkw&>7HW;Cy(~4gFD$kgzOat8t6vwbVLEwNLJGJ
zt$U?s>3-6O?h6RrSBhD-XD9WA8+Oj$8mO;tl$0{qiM?H){^ZDZ5HXNE!~^_mLkgBj
zb=PDfE53)CG}Q1NMKuK@1C_0@6e%GXY;Ch~U0dD0FVj*wez)+=zExbL%PVeSbChdn
z6C*4zr;eLlXZu!GROb~nr;PTQoj#?G;m!@9FVdI@hx6y^Gv@cq
z`o}NpDuHH_Ul1y0>x$PcjS*x!!qMte?rlln=G3x)Oiy#4W^Ew-y=wN4Kv^L_?2LnS
zNvv<&GH3smpn{&-0WnXIv414ok*f&FLE;aj%Mm*PRytCRJ?iNn8abXEI7|`~8vqv=E@9Z~)H5{qcebYo1unA)Mesx9
z=zus!;`&D=DK(J;dT4^M(>;k{)=@R>9l@g}nEIB2ta{*frSUl{MneVh(G?KZrw%28-;68S3BT5V6WG~pxtx3NhI`lduKzk0o$MKR3&NkM^D49L=6=Opx=w_
zc9x?z6RxL{$mvWw2eK5&voM_v?={m7j0Y-#^rzB}5>0)ycrUxLZo=UiGEEytPOa6p
zt>*gO@s^0@YbBkH!heAu(9{#@AZ03mKiqu+8Fzp+3Cok=`x$8*Bbzu|Lk3)KY4^zk
z6-n5Qa`&u8N1H?3^Pd!i$|Wfo^shEt&K3!*zM2|;(k&`<2yJOnHxl34a037w*Z~tj
z4bd&`g0UQ)#d@ThuJBbI&&q~E=Iz(=yFUjiHGiJ0()6DH
ziF!9#1wxXr%6yVo?c5!cV{Q!}#x4v!tvv!^a7nl;O2X0Pc!u||l|%5s@_AWo?P
z1*lOSi<%D3`2WoNwDtt>q!JmUU2T$UHJ^Ka|ErnTnwk3!!uc@2<$-y5e-62>ITL%l
zfzF;!+VE5Swb^l3_tQ-G@o}d9e@sfVIbxw=wR`zPTEDbYUDTQkXkvl&4825?C|1Zh
zViEZ$xY`dZ&c$hT12VZUx&{>PlSTsdN^
z@mo?;$lvMrlgC)$6L^3I2D{|R_DNGyJ?c?CdhzOhw&$(rOar_{Nco*^&r^4BZ7fpJSNQ{@|
z{}&-}oP{*Wqe`jD3MSHPM{HtBOUljt77X*7GG7l}Hkid$k#KO`C|(5SHx&`$XoETa
z)vL~X)Ig9)Q1{hJoR3B0+Zo%y`e!ZmMrJ1b2PbSKLX;OieKZl0KK%VMoX_`O
ziLBc;G%g-_j$xh5Y&d??A+{ixk-OkpLJAHIN%a>6)o?Qj+-RUr)1D%;=Z~qXE{M^Z
zefKSN(ZN~A>7UceJ)24r7`mU7
zab1SPnQ|i+XKNzI6>OI5Diuw2xT|lhQOj%`j`M0hmtqh}(Wtsj9nnqwa2zZ18`gO?
zzn>;PhWx$Q5Q*BPxUFrf7F)wEE6VkIhDkTftAh2QWP(R|GZNKViz*3|6lr|aOfZ;h
zZSB?Pk(*3_=pk6l_BZ+XsCdZg^P#Qrd=``RG5q6PRj}hcE=;cC1JQZ?*bLN)$~-s;
z1CvWb(tE~#8q|l3YtHLwj&4r&*gSE6hYnhiDpYhh+I<8{x(^w4A1O%)vTY1Eb$3>&
zBtg_vLw3m*3fyMFds3ljRO?$6JS6mFC^D9@MEvOiW*&7o@g#QE7mZo5H#JVdZ1+kH
zj00>#{y^P)Q`M)I4H=p>?G;CDqRc(NFmj?Y+NCv6u^=1AIDQb|%6i^@brWOiS-nd?
z&)jJN_SD^^VX=9i^r1YlbiKoN2}=;$AYm>uG#xndbrJN`IiMLLWPF=~N08JcBh;H_
z7)6l-667mLk;=oU*yIrLNs6D7Kx84Su-4y*j0||F=;TX~rtN;cTsZsFu064GRGATfoXDMmeP;;hX_5ZEW;A78K9%^f4YAA{
zA4f~9g(%&(;w%3M#)31~stb4m$(w$gYqh>EnbRm3A|kUrVuc~4F*?rKo=Ha;pk&er54fHHp;4b8A_o5=GXF#h50FyYx(AP;vYp)rFE@C*
zei(=uEx0+2uie%ekwA3miZJqPc>(z9GTW)ZB(
zJAM9|Aczx59xSv!R>*~73Hkev8y5<-=v)cfJXh6yl9^~%URe&s7AVj?WOes}ILNjc
zf_mS=7;5=pAmSOnt3`*fLi`cRpz`ULr`#qe`5@6`YzWbl&Q8#pdW`cXYndz9LJC+n
zup$fq(w^VBy%VDY`{v>x&i$4ZU{8JTqBSRng;+XY41cY_O1_iiOQYPw&k-w+-
zEWwYZ)13anGPXT<3lbqPP{RMrC12U%d37CZUC15k@7ud}R~>8?4wVwhRAX=4khjPw
z&s?<&8Da;lGv4FF)|$MZc|H)p`Oj8N-zy
zgWd&trhLtXQ(=)%hXkl--Xi2=}{9$C6tv#IS#G#FW!7#-MyW6)=~;1
zJRm&oq9br@m{dm-AjS9L6veoM&}pQ1f}|1XKYKou8r$dE-
zf`e#rG!)J7s3mcXCV~M9q;#-G@$AXaq>pZ8N50wny7-8=z}j}lKuEeW{qYSjb*W;c#JHrgh5qn
z`M^>A`=&l>OQp6>*>q;t+eB)tyJrORn(NqJ5<94*ZtptE)NvwrnVma9V#3uGX!YkQ
zcjjjDXp848ae^u#RQlV<18uW~AH{jIbZVWl$=X)-x=opM)3R$-@YD#?RJjcY$$}Z;Jc(S$Pj4pAF4Z)xEQ5TV?BPm>IEG;d8!?;&}2IV0<|b6
z{lr<)YH$W?*lVn*X+F0YS=sJja2vDkX|EIvQ7?F*Ll5N)e
zB&1w_o2H3Lr^P!0h%mYo<<1kNr9fva*nQC?kxiQv=eViIvlZ0~9a%6fAQ+^!Ok)2}
z54whzkR4k)yh!4$kWSMgUZMU2x2{3LPU?sKJ9P0utG+17*8r|x#X~j)@eMDAFs-Nd
z8Y;UdoND>3GWv-p_3_ocagGS^fHzon`|t?^-J`)5N7edghbt>y;mZ17N!p$z)@5zh
z2j#7()S^3Cu;1;CRc0W{fsy~wh?!dIR<)_jEFTh
zS$oPlG_A(4w*Fj?;AsZymxvWcDN;+?FiUyA@e8O>Ye139>Pnx8SVe
z@z)Q!IRuSb*#6TQE)k;uTZ|@EnULsTu|j~`l*M1Rg9*i)FJGPb7Y%d>0IAcp=hbdXitBChU1-e}_ZQx=Z8u>-Tzv4?_SiTT+v3fpaZKU*G
zqgCL(5>oQNj)x}lP2R$pJx6Y<36c~zfgFb&o!;F<_#QNJqs>f+s`=+Jq%4_q2EFSW
z=PbEsK=p}XJSUn<+T^hqv{}dPgSX6IdcME6s!RB%NuR3ng(1rPjM?+-QfhP6${)x!
zUvZjmQM6jd^}SGhr0oJOgwrY?UA~BxrT#!F+J=IfB4THZyRxW$@{|qRsnk)uuD9*wC8cPZNj9lNS$LxG4RXT_{(^IZ)%@k+$o!wT$4H3DWKBJk!ngwpx^;B=!k7Plk_=HjeH6y8vaqlx%OO38Bk4GGMC>p0E
zLNlx??*kP^seYywEoeI<$RbrE?Lj4tiE!0a=Zp#8Ou9$QkM6;5V7?wwVhXf<=fA{v
znUGA`hFtS>p%Vc^Po`G3uIcv_bI)FPouThS?}_{wLoC;q9~8c0R)Ea0B65u(-zs>7
zsdrq|+$Hth#A{^F(A42|>^Uem_*6J}U!ND&Wa`2gf4KyGzct(B=q_=Xqj3|GZ=YJ`
zyn?1qlxwh&%`Vx6vsd%XQUJKJ9!ZyrF6I}n9Kg$`pVHc|D@n^SIOzq}JPG6R4F1E*
zYidq$L3!+&K%J}1u*7^fX6~@_(A=@K2dAC#WQp41_9CB+JGOC@Yig|X$>Wwh0cjUL*R5%F4R0bGMC>n@qvv~-aKHS<
z1Fu-$wkq3Eh(zlqimtU{;d_!Q6QU~5)Q2$3g?CN`nlWQ*ENZdi`{_&~KH!DTGV@iK2)N@Gx^{^#P
zIssst_e3jEeOu4P|)-l2qhx^
zikRxA0RTyxU7wX;h*5z5^*F4?19ZPO_ahA;|Lwo+Ur>OhhuzOQ_OAbW5M!zUm`zQY
zfV;0;QB^5m>T7wz{-o5bPvguW+Lzg{s^`<}*H{H8`C7%jV7O=r{xkcd1pTGa`{UoBL$yI3?qox49cXgeaWGsfE$G
zlBSS;ctw$})O3rZ9vYjZVWvN7{q#H_Nq*nEUI>f&=y3gol2M>vs!4~Bf8Pb36j(9@UE-z%Yt&)h9*BZvk0*A$CJAqY
zX1a#h;OtYoQ<^{!V$F&9P@pS)@`9YpB$2WEdi8Y>~d|E3{-n`)Eo^latsJk?wqt_~#~VUuSzFZKA_%>CEv
zqbck8LqNFD2NlMh@0*NV4ogOei*#;0HE%jIXqMe5w7lbd9I?LL8%n3O;hw**(V~u#)gB)`hGeZ#f=h!2lgoG08}=mJLbQjbX{PBKSyIc(amZh{6g7=aSe@PE`6S
zv(a-4@rRx)%+*p#1y=`Fyo4a(5tg?~jN6{9(g8DmA!qtLn0o|F1=mXRIGi1LWJXP4{TZ$;`*Yux#N`Tn_1Wi+rY44pqc9ST2Nos)Y2RmLDmyw4y_K8dSv1iVFtZlmw|kaXMq9Z?e*x7f$j*4s>T~lT!XFX6kw5hO_r`oC=NZkAZ4);wxu%KE1W30n|IIYet+45;0
zL{_k!b`CL+ZkWKDMRTVM36LfNE^#+BP{0WPuO1#+&C8WOKkzX=StllzOETw|tCUwx
znJ(75j5;_T{95<(oII+t$U1bYt6kT%Ce8p#og23Of~ial2}d(>{{hfwN`rtL+`VePgKvwlI8f)&1zW@=gXcT;5U-h7<^pQ#gjN+A=4#oLN}Q=4*Q!YJOr
zH`bS~6lbfTR{q#+v@*d}Mt|kjSarUiH_`dw&(L9po6XRJV52U^4WYwk8L_b)n^cjp
zG8`_}N-2V|vnn-;
zIGZ*Zrz$$vM{xnm5z4^erK=7pkP><;Dl!8zSD@?p&T9`3f}1{ehcE9JX;Vzk%|8MI?lxT*GsFAycDf1Fni7DSL3i#*kh?K`?mV*-sj3kv
zEgSjfS}Gka*ms+)cjy$eF0azE#j0&qi4LXY1sC_tMF_=bZn`$iZ>dR1b@O`E)3&M1
zGweL7i!igntEd#kuUtu>KGGZ-wt5fe?0MlMtb{!Rc_q3MkH0QlawbQ`nfeR
z{u@B5OekP$8#^y}UIA<5{HDw67C@B=$~8~%OqTdHKt+^!(4nGdloYe*~mce%j+
z+*nrwdqg7pkd#ilG%C|f!f}BegFsb+n%#SnkP}Vd_u5Rb5X*mVE&g0|3YZE-C-Z}p
zZ$Ft1gGHfN`=zXVj2&|MJO3=yNLxl)1?p5)nSZ6w8^>6zP<~NSyF(Ec#Q19hPpV)mU+lPciIY6+HcNi5W#mlxE~~P5!t6SN
zvRwQCT+l6+FwJa4&v>=v#m39PBZz9MRDf9^TsUoo3oO!PFB!i)mZk>5XDhVjHEbc&
z4^Sg-;wbY(S+uF>HI?aGoB#b(OUvj`nI`>oosPG7RyfrP<+TeYo566oY^)OG?s7x%
z^C_=;YinxAg%RhR_i0}3(HFe={a59?m)+G35MJ@;>&g48@j^7}^zzC**6Gi1_sUu)=E83B-3go)prh7t!_B
z2dcFSb$VZ8`&;W8#v7PG8;=ZzDXl=hlB7)ty}x^iy%T?n{-K3Vg5VJtZ!Sni*S+-P
zmYwPXgw7kG7|b2{fen4NVWx3i0mC?ND=6CyPkIIKNDKw4URaAMUmVpQl#g7P0;X!p
z7E_-#L}5Xjr`SzW9Ww5l4}WYsIb1!$9MGh3t&lrd16|kgEILPQ3gbKbcJP_SF-=>a
z@W?sIu$8DLg+_fyarAn^*s%tBB&3LEH(h)LA((jbk$?4Mc(l2(sB>DZyPl@-G{qz?
z0-)Iujjm)5R*LpFHV(R4xV=yisfY?c6Zv20hH$B3i;2VbF%pGJ=AVzue-1N4SPkd72tXzrBvE&z_o`j3-?ibXjY3FvBFXw9g>u=y#4pS>
zH(2w;(lV?^f8BAP|5D__GBau@2o|JCm@iqt8LxGnub{rIjDS^`Y;&VPdEPfKkS|e9
z&kMWB@BBf3NFXJ`ZCHzQ`=jM26)qOdC{v*9-MbNFoSvl%RJ$?t^OAu*QX=pMxsX4(
zp;tcXR6z?tB1v#UT}R!5bKE~ZD>ID@LY{^3JI#!-5e$HQj~~zZv0!sKoyHZG8K_YR
zg506UzpgJQDt=LsjtUOjZN!?(iw(`@NzZsNaU5W^7Id0Z`r`Z
zwh`WI*_wx4yW{-nAec(Uuo&2!=~FS%GN~W?921&vN@D@*&NzQ?
zrnicMf_p}KMmxD>n(YWOuSna;Umgo{j)ozy_Amj{w;V@iSYaaUOaf*LKJBK3r+Bj!
zq#OHgGqh>P?2>t_iw22desWXwbGZHqN)NPlSc_=np3@7rGjxOChZK-*WlNUG3+*FC
z`<>t;=3t8+>e))qvqsq~vAi?q9C(oycNORUSgti?
zM73PkW=d1vRq;h93o0-{A043lPS+&TP>9Qe*=)k>XMAh+YMR4a#FS3x#Yfp?Td7mI
zWvSJ%Wz_TQ=%bqK*$4R9xApNcmLwZC!;cko@rFjWnK{}ho?6*wm5m`A3P`#mQ811(
zb0Qu3Hzd4-u5Z>}oUQYhGWbM%Eo@Ujz=`1nqBe^dturw0I1osX>c2n18qk0{yWmV1tOa#c
zL$OLfpq->5Db;|J|44e^Iz_8Ls0D+O^o-j<_5Qj1TsPPoQLQqRV
zBf;T1DwSKiB9a}#3j@u%sC0)ffp9#@T{4+zB6teIZWaUVw%I!xE?u=w>Qp3(I>5m}
zY-@{4oC4#OH{?_obNjbj9{k(e)@F#0T|CB53MP#Q4Fo3Rm2Oy1l15v46;C(^*>0-d
z5v^|k@|j*Cr%0^`-Zt
zCwEAFfc|98
z;^fhJX_KHNH7W$f^w6d;`<(6bS|(+QdsxK^0b^MpNnAz;EQM|_6^~cnt<(LDVL}fzfh!jc;ZmZC&(oHY{$b%
z^63VkC3*b&bZ);b0RGowm$m|cNBM8BQIO$uKvMM?fEM_l7{`02Zg+`V5?l=W3dD4C
zBqOVM8yJKNtC>#)9r))9D;iNsVwDV>89F_GDa043S!a+-H|~ewAGO4LebOHyJ7YcVAf>=ZEcZ88^VhMM6r$QgrXP`
z=QbLnpMWgXqWP2*bbPE-g`zWhHa0&u18xNu8D*el1nV5qQ3K@D4TwXyZzb672;C@)
z38+h%Q91@~sg6j$x5v452gDBky2Ih#I61p}-su`MHHihSu7aTf~binKq2M1%?D~22^acPIm69nwmIj87F2Z9PSpc$L~H2L2|I^Eu2gyhC&sAm3WA#K}5S9pNYDJ3lKTf
zf}$pzcOe_$9Wbc5h0c{=IWhssIfz#Sp$;)`s+wZy$kIT+Kiu)pT!_8*sp_SRsWXam
zkPCoUmG3a||9dF~4F86=3=~hDTan<`qxA3{3{rgA_i(R<n(N{
zS(4OK5)p^%kU9&nyIAjEsd$RHW-&yDecpLV^$l71JL0`*@h!>+pkP~eqo~`o@{l&<
zoaA{+oRf%x!bKWcM8OjOnx`B`9%F&wAokc%b{NW*4XH8s3J6yxTOO8Zl18ixC54KU
z*{&37gZh8|5zc?FiEmNIlL;y#x}B7i+TtsZ3y@v!EkhPR^t&82k{-I``YT;yjcSca
ze`0!DL+XpNB%f*J^E>1kEOh@&^LBsjj^ABtnl|Q;G!UbZxpsOCD$^M=r(z9w=&>mw
z@63}CTM3~tY)u8v0q*a^H3mQ`$D{dIw1#6^$>-a&G%>DL&;|MADLz
ztmf{ZGPZRLH87H3<~yk09nRl?daqe7F|v$dw`+mbk^P-lj-C&l$c#mM!W(Q9iFfqM
z$UC7jX5nSVAM6thJMo7WrfsPzibaanDFWcs)M03y%yKI^4Dbr4uiH3=@#fb#L6q7^SZ^}ARxQ8B>mq3ZxcyIs
zC^ROPsaq;Mtz$7_?tYoe0_AtN7nAPRqAsm1VAKoNbf}@Np1!GkUgrX=l=q6Mr2ak*
zxukALzfS0CyY86sFS$m57&^@cV3UBBVSOF~vpn^pvuFLtlu_+rQ$EpzJfdXzgv2HALgd(1rNmWcK{^U|
z!7{ED{zXt*=ojJ2>pt7Ur92nPzJY~X*jlQYlb90M3&|zz&``|*v1FXCL<9_u*oM&w
zFl|*k{Jlo#%K5kQl{TLlBC<&^Nmy}m2tU9hAXJV_*~F+)EUMf@2o~jSFTudw-5e2G
zEKt^IDLwz5WoS?4pLl+kF4`}r)1Ffh!sV2Jh(T7tJ>rGL8qYqmG^@a*X+LE6XIj`G
z`E16b3y*I4TCoicOk}+;dot_(4X#Sa{JrOR;~Do+IvPE7&0Jn1Ztd7bV@Ub=M6YuX
z>jnpI5zD*MuzPu&TxyYN=P${3Cuwnx-=YV{9LB#)_D`_w>$omBj3?f@A4W3MB0o(R
zMv*sQ8XYljgu{(&b%R#`1&qPzE(yE=6n35|b!nRg6`KQAX7R-ny$d
zUWCKgqn*5!v9I2^y*}^^ojxG#MW(fGgod35(oVc!o-vyaZUIrCKy&B&hqpJsJkN>y
z@@|>9=z7R1di%;qlL14qr%9Wa4HvHghaWTL$vVG#*T{2df=4St^$KjUiu5k8Xd&N3
zp)XgL#+E@hBiJh-oo{v%xUAt(bxCI5wR7GdvN}K9gpJ-l6phYEG*uCgwGtNIv?5M>
zRW&p63~wx6Jl$Uofp7QnCNGy`wVj{E9+$sZe75pqL&H&xvlgC0D5X$g&60eBhLB7R
zq_j4u7vW5;>~OBLHGHxYVHA#0IEnODKebB^6ZCDZ_Go@k)vaTD(0rSE0A#@~ki}#|4z)e+ejlUHK5AJ!
z4jX#UV_2#;M~7aYt$`>30^S~?6j-z;nIK1JD;X0qBy6#5RHCUQt}4x9;N)zOK&}az
z$XY)}WW<>y1Y^WWE|}I_*Vcr0^825np$TYF>#&ukpS>75Wn1w|JL04!<3FycKw9s)
zKuP{vfB`EN&@B7f8XKmWEggw-Q%cYPX$Q|J-H;yNO)TrYii{+QKXlrbKDQjFLWbA3
z57rrecvJu0dElTel!KhpW5w4i>h?7eC
z9h}tO3xiYxi6YxStF`#wgM}j#Hby~BqR=7X72h
zJWbcw4i9=CWX^;MZ4JeqHKTlIv_%zuGK>j~&>|^-tS)IWYWmAXrGxY>$w7iO1a2A%
zmzsl15(-}w^*cmmC0rF3?q?BxLg8Z&q+@iPoP2+uGsd~w
zqw1or-c{?}Yp(g+Zn@uFzJmbg(EBfk%Ipf*AO5*^&JabmL{h~^lOrN?&m6WU^;q9D
zN4s3RnXhT5n=Cj^?tMj`&ueZr#sADhXB^Nhc?8JR3HvNY3#wEhMTFM;o|5)2=+=$z
zO-f6q8A&T6ims@4ffoSg;(K;lg{}82&hMK(=^*rbyMt~rma>4}NZdrU|8WFtR(KNaQSUFW($N
zOcy|L-@vcjf}nr8hxBlhbj@$=S@HQTefTeF&H6vx*~gVZUxlX8j}+7m&!wgiBQ17A
zN_HD?ZbMrlMP%E$c*&5W`6A2DH+r%cA_*rt3M~kdPg0e`wi@S|IgQ$M;|9zx(0&8?8;}-BknH(aF8&GmFgw$d8GLZp%g+C(8uV^S5APLilKzY
z6-zUGXy(|`_3Iilc6j@+;-Pb_{n?s@8%(!MXcwCMxziC1=OhhbmdXfg_bCSpj
z69)q=+6Rmhi))+DVJg&k1tVE
zvhKeNQ6qDIK9=AOUq~MTMF>?0E}_uba@$icpAp{Sj$);YBiMphvSw#tq>?22W{K^y
z2`{=^Im@n$ZxT1-lBolUKtD+|Zc9)6zFYupUyaTU?ZG>yK6a0^@Ju`KFWkAXoTLC(qyZ+V&55K_1sJ_Slw@B+kFVPv4=GNc<#IgN3f*xz5JZpa
zYL_c&%DxC!!>@OXg*D@HQt)CND|$_VO=zcdWuZXZMF*Hm?4FErj!f5CjZJ*bF8}`U`7rhNow#6?-c_+}piTg`1~
zxUK*XFt-}B(4NlBV6d&UjFEAn*}0(YWj8(j)waKb&G+@4==JqQGtNLaJ0)AER?o=9
z+{DVl+{`$aYV-x+`#*`y-WNo}zdM9fP{@aWr&uV+&wo?$I5^0of1Y}G1jzrJmHmYR
zIq^?N=_={I9q}!ZQNR5M1lGbq!neF*K$ar_S~c^^X;D|N@_P%yz%Pq+Fj?7}AytZm
zmF3=_@T8lGDV*51TPbZgM}^S8CGy8pBqOz9P)niYFgFWp6)Qaqebvvheg2R`G7xrx
zvU_+hcOmbOPim9(N=}YK6+LN*ll?xzEY~pZ6RX0nm055hV_HaAWWz?f&P{j9oa`z9
zvtcKCHWjDkddaqvg>MP()4YXQKBI_7=lgp=C~j7!B2{#3E969yreZ5uSs*e)moN}O
z+Jn%&q!GlTUOslv>A=>MR2Diu3b%Wdn2b%azv@tld;#?#*h{Ctdh#%_gQj&`)PbE@
zyUJpIoyx558$e`u=RV=Jc6inhDRNeXjlyoC5(0|{tEhw
z=EKbK*VL571NL)(*c@}I_SV6LrPC<)#`D>`Oyk(umC9~~wVo*uDlHS_9NOjXa8`4e
z7Ly#fkI_s_IY9FyN4Jq6_Xo&Kae-(F3U)y;&6G1$Nq~Tx+#g~?w&u%1SPy7`+my8_KU}f^d#O^Z9ts@;}?FwJk%wH&J&rNZV8HC+xPzH2c59Y!*ExLXNu|
zS53B^V&qPAsI7x8a=~0d1HHCa?G=}sCxl4Jn|}ORgVSq~(VJNwr(Eoy-_swr2FcCY
zwzBZGNmPEm7jqMB_dfqyQ)c@U;2{|E=oVG^B%k~!uW8oRFdeIA-o*h^<*ryPhoqdQ
z)-j}BwcROW{|8Q9%?Vh4Cj!=qpUv&Of*%Lb299QCXERnY97m{ADyr$0=qQ{|6
z3LsHYM>l)!0?5;A<)bB3hb1#(1U*(?dtt!o@f{Tc)i)bQAm!ve${VUc6$7WeffF;@*dS03x7
zu5XR`OIt1Ti5r_9;9C}%UH5UUdnxO_lEUg(Q~XT>J{WWyxwR~E+_L#)*JN89BdfM!
zV2V0#K=tH}85-OPn1zL-I^F#)NR){VIZ1oN_+Nkb|0!k~Z-BlDKw6yzO$J*6=m*QK
zzw_uIbWG?}}k-bz8cS7&G8v
ziyBF74&*y8rzjwmi{e}2I}!1vG#t8hr$z2@_@7c3`zO`r68rYh|3d|_RLOdjL;!ia
zjM{K@=1|ewmJv!<;m1746Y&-T?eLJ(My$5Z<51DUE1y+RN%;4kyty+Ygo-D9A6BhX
z;6~6S%r}#r<~XIN+P>V5-Tre6_VoFL5QeEglRToG^ymyNgfm92@Mj}d?BVs>e_z1=
zonWH)>nq#O%`KP9t%Kt3+A(d|GXN+{4j_R^#kyn^j+3%S+#YFM5~$t%kx6X?En{nW
zVKJI5#^*k_N_r1{QZ)t(zR8#H`k#3wSx*YGkR>kx_9Wc+2s>~f9c%iUgU!~jbYzOr
z8%_5Y;6FZaV)APNp!N+2M*ar~
z(&3eU1A>^v0%s|6_xW?)Wdw2aazR4BZcsA?g!i{FVvykWDlY=3oLVXdN;OG@iE0C=
zBrI!d=~g^S4=3_tQjL;~wE)LNzodM+0?m192%@Qsj?oJuN<6@JG63Irpt)$kpTK0S
z3y^fhqQA*S5BE-xzeoY26OtLm&4JqJm>J`e2L+&3(u(s3(RN0Q?J?zBtIInj7A>Rw
z!;o~0wq%e}YpQg^JBexvj(N@Wi^n?G$B!Q4NiGEYzCQvkF2#cAq&V*tL-2p4
zWzaF9!A$~Ce12@-3X``2KOyQ(AS!r%)9_kljs&ytMNe+)BP}4UMGA(`DoAG%{kKI4
zl3eRz56DXG;$swoPC|~c>GTs2E4tfa>;nc>Jq&lf@WF;>VK4xsPIl`ZcshXvEFp)CFtjbBwSM6L
z(SgrE+W?=WCBD?9*h9Vw>Z)PnrNR7)F~B#mpz6xziMlL;wtTolWzC$>I7wEQf(3ko3>E^Y*WEZWGU*;lGz7O4|7cE)$CK39C89UHtH<
z8(WYF8unj6EoTgn4gbKqTy{v8e*+M7UPzLEEeo$8UppF0I|5_ZhA)jCY{~T9OHHMg#
z&fku!#7RrO5X{-X|1CC{Zpi5T=hF_RQYI@W8?OE8E;Qk3CRvZ)%@=Ftr8?faz3RBW
zl7zOJq+8|%Vwr;cz3oRSh-RKuxaFv88-
z46zbZQubMjl|+>))-KRXmygYGL#ezSUO#wY`YNDnUI!*VO`q|*-+JnGA5}6V?mc+T
z-I(=4H4vjz|uBA1lQS6i=xS851?n{-cRC6o(_rfz{FE@`s{AMubZ?&Y{ua-(CQyh
zYn-ueo9G$)&cN2{9#+hI+%j$PlUOMQ=J&)iXULjDz{j=Z$P{M-N0g1~Bdgwu4ZWmF
z10S>GjnV*TM9Dfq{Jz2j0tTW++`4;_Im|z&ZM9|J>c;ywshn$3l%k@#g6h$+jR%0W4emtq8?T!SliNExy*_+SM
zw>F@t>((c+9yq4=IQZ+JF6V@#Y8h<^xqUH|*mnZb{z`pBSFEdXNqIV2rZuBLrq5N{
zRbE0j;@Q1zbasMlM$}qMU&(#@?l?`cE{UqHdgg0!x=&v_53n#)J7kyDXQ>$!hxU#t
zjAt8bPw|05H(4l6h!*)UMWJ%1(#)96%r2m*sX-$^DOh9ECo*M-3c%I4*df1}tlp3ue}aHNGW>WAS_pS_PL_2S?zD+SEMgH4#DpzrM+;PoHv
zJNft%4Vzk9#EjJWDd5gkk-QFahfbVcEUkbxPd;og5!rTEY4Ai1187q~G_bD!K>JT(
zCp{PB(!^lX3YocU0U4h5t9+_<8ZL)`v@DT~Iff9#WG|dB`tzhKnZPAlT4Y&d_6b#G
z$m2QDraa);Yr- t~y=#HHh(i#Akd+L;`Ef-c
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