From d9c72f4c0adf097a5bf2d4c8d866af8c583730d0 Mon Sep 17 00:00:00 2001
From: zoldar
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])
Give
Queries the ClickHouse database for the monthly pageview usage. If the given user's
subscription is active
, past_due
, or a deleted
(but not yet expired), a map
-with the following structure is returned:
%{
- current_cycle: usage_cycle(),
- last_cycle: usage_cycle(),
- penultimate_cycle: usage_cycle()
-}
In all other cases of the subscription status (or a free_10k
subscription which
-does not have a last_bill_date
defined) - the following structure is returned:
%{last_30_days: usage_cycle()}
Given only a user as input, the usage is queried from across all the sites that the +with the following structure is returned:
%{
+ current_cycle: usage_cycle(),
+ last_cycle: usage_cycle(),
+ penultimate_cycle: usage_cycle()
+}
In all other cases of the subscription status (or a free_10k
subscription which
+does not have a last_bill_date
defined) - the following structure is returned:
%{last_30_days: usage_cycle()}
Given only a user as input, the usage is queried from across all the sites that the
user owns. Alternatively, given an optional argument of site_ids
, the usage from
across all those sites is queried instead.
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 @@ wuth 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 @@ wuth 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 ad6c0fd8e..259f4705b 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 8b0c8e7f1..ce12039c6 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 44407fabc..38e620bb5 100644
--- a/Plausible.Cldr.Number.Cardinal.html
+++ b/Plausible.Cldr.Number.Cardinal.html
@@ -455,31 +455,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 0be290ff8..798df3c55 100644
--- a/Plausible.Cldr.Number.Format.html
+++ b/Plausible.Cldr.Number.Format.html
@@ -468,7 +468,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¤)",
@@ -478,7 +478,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",
@@ -535,7 +535,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 c681f800f..7b3208d7c 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 a997011b0..fbfdbac01 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"}}
@@ -613,20 +613,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.
@@ -673,16 +673,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 39cf4eb6f..d2440cbd8 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,14 +1294,14 @@ 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")
-{:error,
- {Cldr.UnknownLocaleError,
- "Locale #Cldr.LanguageTag<de [validated]> does not map to a known gettext locale name"}}
+iex> Plausible.Cldr.put_gettext_locale(~l"de")
+{:error,
+ {Cldr.UnknownLocaleError,
+ "Locale #Cldr.LanguageTag<de [validated]> does not map to a known gettext locale name"}}
@@ -1345,29 +1345,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"}}
@@ -1416,10 +1416,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」"
@@ -1550,47 +1550,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"}}
@@ -1660,23 +1660,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 5b3245332..da61003d3 100644
--- a/Plausible.ClickhouseRepo.html
+++ b/Plausible.ClickhouseRepo.html
@@ -855,23 +855,23 @@ pool to disconnect within the given interval.
diff --git a/Plausible.DataMigration.Repo.html b/Plausible.DataMigration.Repo.html
index 8cfebe47e..507f72f36 100644
--- a/Plausible.DataMigration.Repo.html
+++ b/Plausible.DataMigration.Repo.html
@@ -1162,23 +1162,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 3ee3db584..0decfa653 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"
@@ -705,7 +705,7 @@ tables into the format of imported_*
tables for a we
stream_archive(conn, named_queries, opts \\ [])
-
+
View Source
@@ -724,14 +724,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 bdb8fb75c..ea982c284 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 600853380..d510fa696 100644
--- a/Plausible.ImportDeletionRepo.html
+++ b/Plausible.ImportDeletionRepo.html
@@ -1153,23 +1153,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 b2d3aae10..f28cc497b 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 $PERSISTENT_CACHE_DIR
(if set) and falls back to /tmp
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 $PERSISTENT_CACHE_DIR
(if set) and falls back to /tmp
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 0c8f2df25..5a1835d99 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 a289214b3..abb46090d 100644
--- a/Plausible.IngestRepo.html
+++ b/Plausible.IngestRepo.html
@@ -1153,23 +1153,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 09c2f7859..1eb9dc8c1 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 fc47f8a36..c9bac6254 100644
--- a/Plausible.Stats.Filters.html
+++ b/Plausible.Stats.Filters.html
@@ -283,14 +283,14 @@ Pages
Examples:
-iex> Filters.parse("{\"page\":\"/blog/**\"}")
-%{"event:page" => {:matches, "/blog/**"}}
+iex> Filters.parse("{\"page\":\"/blog/**\"}")
+%{"event:page" => {:matches, "/blog/**"}}
-iex> Filters.parse("visit:browser!=Chrome")
-%{"visit:browser" => {:is_not, "Chrome"}}
+iex> Filters.parse("visit:browser!=Chrome")
+%{"visit:browser" => {:is_not, "Chrome"}}
-iex> Filters.parse(nil)
-%{}
+iex> Filters.parse(nil)
+%{}
diff --git a/Plausible.epub b/Plausible.epub
index 4c49f82db5552ecc509bf22848f917cfb220f3a9..1f4028c65c00dbf41e175bf87f36789f772e15f9 100644
GIT binary patch
delta 143574
zcmY&@|teOZWdL$zgmGeH1PiOGM
zgp*GZli7v+BJA9n>CTGo7gq5)CXUl)DaR#_J}RM{dhZ7K{5Ns0WE_9pY8aW2)#J2r
z#HfR9E(J4&i4r3oo=Fs!Q`FvvOovi|xgVyOWCoh%zZyCXXJ{T9RHp9ZJsL4hXDqT=
zA{)8N9rQ-2oJX&IRfG2G>B&pEq-66k6H{}uPqU#fX8mDSwI<#hjM1hP+28QL$?M%n
zb248d2TVUge*Z%uPY0W0I7n27)p?QCWWjrjqMOcN~`F7W&hqtql16D$_#fI
z6SL`2=PinbmCl7Kx^p``A8Zz8ue(VT`AcFyHC!jCD{F*hQhNO3V~xa%!kEd}(S*j~
z+Ov7uzs#hY0-y5;{fqPqOOjbs4~}2qi48{_%vr9QVCT&6QrSDJ$P5l?4)Gq1-6j0`
zEv5943eT6QOPs3o8ne~7Ps4zRz1IAzSR)#pvoOQ^vewzIVts|t4
z(!be-aOpEn#C{P25zDl&m9S~Rz3}L9%udPUJt&(LVXEzDOu5>qNPMS2Yo3Oa*fAc3
zf*)hqvkh-)4;B5NBfnEu_%#c};wmZ6!y(i(KSiI1yLECv#iaTfCxuP$6$&oi?v02h
z-uIe-O;p9^y;6Hr(}Zr0?FnwPen;4DqJ5%axn3c`;!!58HK&k+
z{`hB};#hl2>%_kcRevA75U!e`>s^tWBlz}{k3Jr~ChFi-p=xNaOB?4Jj||8ndfckJ&pOu4@gi1v2}g6WKVdR>&3rZ(`dkucmtTdE
zwkrbD;rGlb#udKMzihl?)uy3UTL_^_JG;G0Kd0%aBeWvI*Rzf)y_EimbzzvGa#fSK
z(Vqf+Lt$DzgpsJTMxkDwRo53_r5L-($Q;D1Xq7Xv_I!0Qv;98mX5NT>wcyAtnfvA9
z?yfsiPHUczsPEt}k-^6ausoG7S(>WVm`eSjMmp8Q+7RWWfbsx_J%W)RfTr&Vux!u<
zm_i;}f`d6xA3$ZqFwhbhgN%;zZ$**2J$@R2frNBT4?ofelc(j!AlFx==3zXDYvn3p
zJpgzaBi;jOZ^i(O41BHw0Ib^%P`TMR1UP~ic?NmVO}jXQg9AZAlE8p}4FZwF+u1Qt
z>t)8-0eR;saR8LgcmRN6p&a~RrEf7C(2%(qCWsA2LaKoL(?DIHu)+yQwEnIJ`nYWF
z0_&*B_98H9sRJFrv*gqN;$U@o2z_v96s1Ep5sHMAKmZRhLncnEIVFL+@nGQ9zrD?T
z=!_7CfEEDRPe};3SP&9Y2^fw?0U?KLvxBe^ifEwR2XlxubdWF5#T*A@51?-ZATt25
zk%FQDR8I*C1&|mW$OAwXOrT%@aj}DJ0CR%OTd7y~u|mdy(}zKb;bQ_A42UUi5EKwx
z;0JL62tx$)0ze@WAWs0DNrSureUyz8o&T#Kl
zbK$`G2JYYReUOL{યMAF{$OJ%3&Y(yDIe6TM3;*BL!;1;7LcQ-Si-Uxu1pi72
z;(+ISfH2{u;uu75Y32KHi}?I+{Ez(q7w*QO|3%_=2p>krkY4E=
zd=|YQXD109-|&7WJxFVR1);&+q%p7&`Ar}>K+sN|nZ&kdHwHE}Ohx!ofv|)x}>3ct(lEFQgf#?w-)G@&tfSw#&upXdi)Ux~P
zpuo`)3zK~E3v2GndagH?d{@7$!+(trQ{
ziACV_Z@~Y(Ei-m78O+stz6t+!#3JOlq}i7u_08@~Eu$w3{NmM?>4t!Jzt0srB!!cJ
z80`>kEWO10t{wAr`fp5?2vx5$)Io5K`zQ~|m(`v;^SjgSpB+n!X{Mx7=OpW4E|@%%
zh@_#CI-we3e$`-(IvPaKkoMLQ=g36UxyO*|7P;c^$vM(8
zr*XRO>oJb&QgwD#&@3+lF6pwOn8{{$XqvAP<{Qu0oE8IiVUuszkAMEWM2o3
z#UwK~)Lo(%GuUA7ttyHhv*+o5fqx#C#Nj|4qek*a-g%!V@SZVD9x2Dwn0V-5>F)S;
z_~l0h&Uto2l^#_M{S2zOwt%zs?n0cp9@P@bRF85#YgZ%?
zAsM0k&ZiB*&hZ;292oeuroe#x$h#8)g5lzt0gS9^D%~vDMXu|$$yRI(7B<(w%!iu@
zIRzsfFE(xAhE6XH3}^Z+^~ksn@j5GJBa>F?zerV0y~Nme%F{8PeP1dw9gKak-WIu)
zBdfEnUx1SH6DfU@7(ZXA7!`uy+&J+10Bty2|1EQ`XfDKf;&FgP>0Dsf7KU=aV`!&(
zzSamThpw)+T%{NwJ|e{>&R~emrzP2O1qx98tweckw|lp@cGJU!K#zV5p-u
z=i9F|QzR!}is!B3V)9*mf+jdq2T|cQoL~;vpI#gi22IPvqChvn8(qt9lf~WLS_H8j
z>Z%gOeAwERbi%i*behCy#n0LOYI>fFc2P|{p;2!Z5?Aw*7l&h$ye1?NOC(p&&gf4`
zMNY;h+{&%U!B|mb(A&)6-bC3>ZKB>FG}9@-`lV)}9IspO@u%+fZTJo;86i%v5b=2e
z3{ysAF?fblcd4*9ssDA&;Oy%j+aC%(I0Y=5j8Lt#JM8Cf|Hp<&UUdeD9&Sh#k*HYymddouR1-Hp-D!r`ylw+M+w^4+Foi#+XFruEeO4QItn6rZ*8%c|+_SyKdw&T@?%%+#>
z*7IkQv@*FL)cS28X%qwur19=mR&4Qdc0S#J+aEUNRSh|>^j)JglS9r*0zcQq+>*J#
zG{n?I@?M%Wz4DD%3l8u(yFPs+c@66uCG@6K+dK=NOuCd+n}1oLu3J6gqL8$Qm6Nne
zcjg=6eQ*HF)_;^41K-llrX*^nl@Pki+!t)a?`s*c9zbejF6~UEpNI~V{`&C=?E-CO
z&|?Nm!bdB?R2G($#mne4FSQ0JTO^$dXM7{<4XIkVt2u1Av6jLv-hQNH6ZVAN669Fs
zNNpq3EiFA}`U~c>NxVkKbkn`{?Y{9+r{>ix{oq9InC>;MC&KqV9r670G@q!~Dag5B
zbjnkmJ4V0xgSdmjV}r3*)C6jg1i|agNe;ON}_?m&8G0gVHzduLoJ=Iu=urK(
z2CJ>4&~}!)y`0wuor4KU@L_bW?w0w
zCe(Gl{(<>zC~EQO#`euop06Fk^110L$nmtmjt4#8ukqu3D{=dXdn7+9TO>c5Li;wN
z#$R3iTEgLcIk@5qGE}B49{3v7v>xHYK_WpjCin!WypVI3`SDuhfZ!XCC5pTAQ*Mc#
zNxg-nrWCVx>OG|IeOr6+YhZn@1yxU+P8^Z>B?bUVN*!-mjXkW$jjZ(tC8(&3U_uk$G__W3a$D+5K9{
zWMQ@82038z$X}Gan%?bLmcr^vGkMkGb*hxui`71uw9E3{ea?J$w`OFPG$%$BwDHu4
zrVQ+uip2Q+jr=Fhs&hvejiLO{r#1u%TvU<`)F_|k?mqvxWFRNV92%GYbb>^Gek1Yc
zowc)aPX24cD!7sLT^BV#1dYS)hELVv}AC`Ro@p6uSur*v75UOYnyaC&9W*LC|r3s!t1Y@b&{JAmU3
zfx`A^ZeBagAxypUojKwq&Uh{b&!hghtZW3xi;*vN)=>9UkZZEc+?5WiLY}UB!AkK1
zEhJsMs+cxonQ9MA=^a4h0hVvg!&H66A~qOk@mv9P4{AK}R;kt!fFPM8I;d-CwpQcv|sbU1Ou
zBwlYrSC)uRK{N~Tgts$mAyasIO~-&4SDOQvEn-)DZ-_L^!$r=cX8vssH_zhQY#XHH~(5B_;doXp@q$0F1Z}uT;J4Ht^3WQ9QoE;%|nIKr15$b9>)h9W8m5x1hO3(hka^85UuE
zdm~=UND|-7-Gw)A)R8jiRY*uq;v=heycslm67eZGuDESupIuaT@s!SvQU(kEX7kN(
zM!k_kFs&&uGU`;Q1h;Y@G-c%m*u`)M_PqC385~>!np2Y~=s2k{(>aMPcRnMqeeRGPVUCs7I2?asBo?asAs?kWR8@7gm%?a3pPG
z5X*Cl43*riPF0g00ZG>0Xf~ys=n&;tW)Y5vb1o^vtj%zJMTa%zuX0|`x@37R-TlES
zD+Q6xibF6_hcM(8^@7KA0xaLXN9Xwo-&2x)npYE3X)tg}LhICuM4k()o%7?j0*ZzNIOzXB^Za(=~N**1Lrq$2UNJ^H1_`kAMo!#9(g
zqu54$*oKLgr+8kROm2&5&aRBPNr_Bt|DYwU~oC`
zw2#<|Fy-ElD)2+C2F@1_#zQ!Ug7X1Cu)@L3fa-5iU}E$KkA5YC1py-@Z@~Qj8O{Q0
z11L8Ke2n+N#miL$E8=mHkf3lRB!+)noCMKW1%CffhenvUgM;uN)GdyHv4QC9kAvd@
zB|+0*O#qF|f=3_9Gl={JFgjqiavAIa&@S37upuDlw+sFQj3}Z8d{l^aUy!i|h;+Wr
zePpW-!IckXCxqDzm=`dY1cKp@!3uKu{6wI1nko<7;9F
z3Sb_Y0+Iu;%)iwRrbPFupI`v=&_y4E5`M204{<^R!2wiXJe^o1{=YI92muBNA257d
zW{4Reh#l6#?tafT|2&1`!|%%{!3G#Oh(Bx)f1u33zPRIne6NQL19&`q|M;IRd_B;QcCI=1B-eHMH3Ex`X`;ip0=doS;Rc1YO0^@~zXZ@$%2^($408x^R7fu@hf(
zvvCNOqVNRL-;i;m{aRwtjb_x;VZiDevRSKvf0N=8
z;})j$LMzJ;bTcaKqK9|!m8ys5V3TrIm+)bIkJCx@)|Mzn#%w51vfzGqZh5{ryme9<
zOeos*5>%yo8Us$$LE_~@w-aN59ioP@`?IQL(0Tc^F+Cr4>j`~ag13o8IBonTOBU(F
zbD?iWbJ$lXlW-|+>%A|H+KN^K)tqAt*alw`67*T-*jRdl>+8(%0tW9E7my4vV4>iH~+yjmxK_$G{h6)6ATWVm2e(Yh{b-6*%zR;M$2PC_?AhV
zEMWmfKwjhmI}Rf{wGW1G&+it$JKOjee`>iGxsZK=?bE??f@EV^dk2d|j(UUr
zC(u``G+PUcw7=^X11H-V-kXC1DtIHvk2Tyne_xh4xGH=EM@8bS$
zf7W+#bh2e4?tc$nd0Vlcl4tc;&FzxzrK+Rohb&nRGriA9l*`1-Pjs{W!!EqcN+!o>
zF6q=#>B?#kowC=DYj)>|V@~qMKRxX#f%#cE*#=XFo(}Cb
z#a(;*#ew?M+?kYH+Y?J2h)o$vTL#4p`$u-oRn9l0y5vSqfeP&6bTI2IWn=jS*Y^`x
ze8jdVHVn(mbFY}!$SyAw1l!tswKJsU@*{*KCs(4quy-QJ=G@G>dDWoAc0#;jO+4mo
zM#C(nglw4LoZ-x86YMFy?ZdiMcOp%el{UsuUygUVc~X*+kGAq2;a&w_56g&Id)#bS
zmt{v#yU*?07*A8FmBKQw52}Lq|3ep9P>lY1_~
z;PSXBop2{)1-rL`MY#6IYfCZQ-3|Qj0#Vy3y_@Ts$qODE_oq{~?7B_|%8w2j{0q5_
z`P4Y^9j`=jG8MT~(jE2ty$i)D?ITC|ncFlSjWlovsToTA{T`ydma
zpgG#iy_a9tLN1V!FYlhU*6coBglulJ248RFQvM;K+h0^Wa0m>5wH6)iJ=zfYb$2!1
z!SyTS7f5^i1?0WgdS9Q#3f?X9Kgze8`Q0s>k0|os4-v+e4$6t>Y&?XK*1+n#)$Hf||9gQf^hYAw(UY|41LvE@iX
zufmqxQI~=}$JJ@7;!5u?$@nLp(huf1$SNvEw>%ma-75h4vnKIL6t`B9eV}e??RH!H
z5oj=((B0%I$JkJzGUJI2*YEETht+io37>%ZH|mE4Jg0(|=$itrFZ2AfBL5PL|J5r~
zLQY(vJmPwW!|AmV>}U8&L}B$OY2m`o=az~j)T&MvG2vB%P3a2@?Sup8q{iB1{KP{f6bo*`gpq=nt?xc>o(FM7G#wI6aEa2o
zIg+G{PuC4p8mu$EFI%lOvgj2kjjiwe^%i0qdc+!6Tj0#|L&%JJsGy4%R7|)Mv$q2>qThIk@TQ^pLT?W7HsgX
zdmw3Oe`D3_4&jvuO{%IFId|0{X75QkMA65X>iC2y9v`pF%a30=z?*ldzaBvXM5w=3
zhg2D1P+LlWi$wL7C;m3kU&5q4&>lM?>;FP0mDIbP!c$<4+I?%=nZiP9NT{ZDFG1N7g7Kq
zNk2#qfad%mMF4so06_zC%{Uk&9pD}1_Qu2o_o~Oi|BfpkRNo)mnPN~Q96}%!KtGbO
zd*>b!b~_h!5~IvkGzss7|hd1U;NKBk)=wY(Sf2I|TEgN2y8|1n8jN
z2O$9%h3ybz4e(E63~~t|l}QL6AQw0TAx3-fk5Ti;aOD2%_zVS(|LXpvi|!PHf@u8(
zSp{qqtU~^yBUkGXZ-6a%976shHFqbFM8I6~C4>V|-F^d^MMwL0!nS(o7zTfb3gw5H
zBuyw01ut3flM!>H&G)066Huvfw|>(9kk3PBP#(^5t|HY#gDbeIQ5bu-C`dEEgJ-V*
z=3?XEb+#S33EU7+@YuLsoA?21Z=s7B89$`sgME`yYo-v7nSQ?cw|;gg8@tU^^X7JT
zHcLiSD3P9`BwgzXjz^S`1#0p2(^xWCC|j?Zmk}4s`{E+=gYMA?FL@g@f_zUSFBEbI
z)xvO97=>CW!Ji#9RQTG{}i00SUNqx=(ay4OPMbq(|}y&&F75osTk;~#Z`HAd9~4B
zSGQ|2sViv?rJpD4@D#g@6bHOGTHnjw=*S6RcIP%yOhwm7kDufEm?ur!2ERswvS0^w
zuB_w1%t?jS_F04Ayy#Fbm_baTf%$<*xaLLWEmk1K+yd29!GSjYiLtfokLKrknm+Ue
zdwNBr)qD{L;oYx}0&u>kdS&P)ME`CkY}CX(fUgVHDrz+7>>aq<ZTj`#W2W(Kuu+I#m8-K4kJweWIwx<|kiPtKDEqXjQ0WE>0k4DQR&dYM-lA
z=}|N+psHHT)p0qNeWrqnilo@m2>#|9w=+u2AzkYpjM2>vB6Q4f0^*^zVJ)!8i36Y>t*wI;_t@AV)T1BPe{
zyZi^T0G)T2h3{ge*M!U*NZ4UH>((+w@qgJV5o|+Pdcjjf+Z{AR2cP|f9KZt}D=m|e
zL)GZ$#f33@CMbelS)>9^Ut#RUIy7Mwrl;!6ET3!GTbw)R$0uPptp?k
zIXe22RM8Iy++-|>7CVlvzY%`i)K--msC!FAMw;z+G~QQ(VgD<;3(xEw33>UeX#VcN
z)t+{J-D3L1UhiXf^AjQz7NzvC;SqZqzNNT<^ELa`
zPgQX>&WJy*B5881!%cjpS<1_=&Pab=2U_jTp1UoLd2F8
z-#ZzFQJZ}EB88%i1~(nq3}A!S9?)^RGJPS6dHaHcFAzibbV^;8)rPM_bV^ITL#fX8
zInA=K*@oL0nQcI>i^0yeL{}rep2p9zA#WqvaFHclcVOzzWZ5}`t_L>w9~%q
zS7Du~q;jH0m3h%1GpE0|<||D#7+4~^Nd8E}=H1WN4H^R)pUqvR7L6#?O74)>JOlOo
z`OXqIt||=sNY}Rg;B$U$Pa8bzN<@aFcuBMO)`A{gtEL
zOP=3EthRo3I)&R~L(3o5;6=W=mTxFXNP7(bu2~Sn>Fh9Y;jiuPHzrLS=r~Z&VMMi?
z+q_?=Ls5ZE=w1dJp-l{h086_e859%PoHdrC$TaSED<#Z-WjHE0%pL1(OFF5461%hKd4hlVZ?vV7Cg9
zfsz1iZ{?vZ_zwdz4b7m=zfX7hnc<*p^!w`*u23jqQxDnzY!>;(P)@XmO4*1N6b^KD
zu!a72=V8+k`Uz;ubA^%tn@Wo(^uH}f#Rr-R_}@4qSR{&ugmf$c_ZWhZ!Vj&WPdQN6l>9syV>S^*+q)
zj{%HMU@an_PaQ2$p+a0erk72%M*lHwK=Zq+C>o4dMGaxbW$~`&LP8~pBI#qDGuD=U
z-X+Y&0C_1%3_hn*OCt#ml12f4!m3*o==?O#;#BvS7&4{Y8mM1
zkGh@BJ6Q6$g~R5MsRa#S)Q2AMs#VVU8s;)XruA<#~NWmwhpvMpNk7fcBA6TRe+y
zOMH-rhQN`d$v{mpN01=y8)y5M`tj6b@=OZ5<$z8BhVMcfhAIVR$!J(`rgjmJ3-&0DTx=NaJDEk|w|tnlNUjaq
z-i!WtfvTwCq0?EKkx%-WlQs&3V@8gnnr>pM%>S{_)#T}m-r5o7vJL&qgq|G1kX26}
zV~=0--26|moHwO;+G;+xRa~vA(3s)3!;*gScS+3F(;NDQ{n`GA{gq36SIX%bH>M0e
z8fN}iwzTeWmFF)mx3C;TR6CSei$Cyl-Kq(O+oq2>hnDCTk0IseVkYxFqf`8fRY-N#
zY6fi}kTU%1@NSGvjsssj?mM*7Gi8)uUWV-4082HcF-T7<|LA)2Lu-7mzg?|{cL~ff
z@;%PGkHnT?zj=1CL-kCeDTQaB=nX^{O)Jph6ML?l3kmW@=lPHRO>Y(LC33tcQLEA4
zH!&nEQaqu{Ab!0eeN1V@fDD0YmvT3(IK7x^L_C`M3BHa~pyC^A3S0;y!Q4CNj7Sac
z7@Cjis@R)KGjn*NE=SA~{Els+j`?Du_Glc5QL)0o%EB0LI7PfM=Nkw1ILgsqpBVkU
zS}+!sY@L}PkOd$U0En;6=O5e$@y$Xb#&cQlzBQIC!Z+T@iK*@_yp_m@n-K%w#bm
zZ`_Sov8&2Htc4$W#%8-Wr}E7G$!EJgw-G!IX2DT;;bGIj-Q3ybX)0=cgRX^gSBEmr
zvZ)h2TpX&{oABN*N__Z(Ihp(!h8!GS2CAx8p@NyU&wk3<$~K}cCKzg@SD^e1#;6P1
zOL!;p5*HbsL_Vb=z4e#@yUvRR2gcXuQs!73icXkD*OQJKujxckzC<5aYTxemQ9fNh
z?`poR_jHb_u@%u_zTm^TF@}##d9G+>g^P`{qcn7uuI!!EK&sD&hW!;H*3w%}
zLuiU|Go{8$HOXX{G(uRD!Q_l}DX96=_#(t4Nr#6yo+{FVTxGdGG1a#$-)3mtuWU@+
zC}|B1Q!su<7raz?e2hgE@w*hFwRppZsSwF+D_Nm$$?_6xKL_S9qU&Q_<_oA;lThd+@;)E$$wTeAS7HxCm
z=}e$*Xn%@yoWI>55;KJP2T}Wt@#E2G8n>%Nxl=;DaUZrX>U^)nGY*aMMgyd#iSo4w
zy}}|J^^3E#b3W~O;d6W4-&yWWr)w4aUk4YLPt2DN{FmLFBh4>%)p$;KbYOv3e=hs9
zNQ;iL2h%zcNw3gG-fjRi?IhW
za~4=88837!-fK#NsR-Zy#3u=l0-B!=LsrX+U=%1}O6AKlN|`RB5Z8nvtO!2%Qb>N8
z!E
z!i&|&G^GB9c{6s%mLRQczSriF`rc3O1U;Oh72*ktI11PV=QmwlSxbEGGVL6vOe2Qc
zwp#glr!5BNEbTA!V=sF7^-vI~m_e~(nYKG|$icz!&}F0Qxkp24k_>7FO2%
zUw&hcXlAGfogejWdZc|%Slbi!oo;9owGcICKl>Fg+I+5LqC1O5cO`Yfsdnl(1XXj0
z?uh-vJ(2{Y5PwSPf1YQ5BR03hQB;UDup;Oa)$IHx`WkPi@3`!kCbT5pr2B%qEc!f_
zJ3Q|_mA5xvIQtsE;ZaKpH3(bonYsC9!;4*aZ|_lxoeK=L7{^50Q;>!F)^@a&qaDL&
z?P>gHV_QyRH~T)4f>a&J=k(J9-QxmXx|EWYBK!m}lU44$$A|CNT(R^9JZmx2YgXvD
zC#Rb*V>^*?F<`5jCb5pPuV_=mSLqzEj7)Vl?)kFwZs-3!VxKosLfj&f!7qXJ`UI+
zF1D*M90QvTiNDn8h%apfj>HS#pE>HbT6{SBNBFH8i<*^%wx%RA9J|osFYqBk$3=`o
zoptP?jQ9>xzecwCtaP>lJM1X3JO`Stz_+$vi5=uGvCTN@lx6W*yi}1?$`aAuDZEAd
z
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