@tsi-developpement/tsi-shared-ui 1.9.13 → 1.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/functions/currency-state.functions.mjs +203 -0
- package/esm2022/lib/pipes/tsi-currency.pipe.mjs +17 -19
- package/esm2022/lib/tsi-components/input-components/editable-grid/editable-grid.component.mjs +3 -3
- package/esm2022/lib/tsi-components/input-components/tsi-currency-other-input/tsi-currency-other-input.component.mjs +49 -28
- package/esm2022/lib/tsi-components/input-components/tsi-currency-societe-input/tsi-currency-societe-input.component.mjs +46 -28
- package/esm2022/lib/tsi-components/output-components/tsi-currency-other-display/tsi-currency-other-display.component.mjs +37 -10
- package/esm2022/lib/tsi-components/output-components/tsi-currency-societe-display/tsi-currency-societe-display.component.mjs +33 -40
- package/esm2022/lib/tsi-components/output-components/tsi-display-grid/tsi-display-grid.component.mjs +3 -3
- package/esm2022/lib/tsi-components/output-components/tsi-generic-grid/tsi-generic-grid.component.mjs +3 -3
- package/esm2022/lib/tsi-components/poc/locale-poc/locale-poc.component.mjs +68 -36
- package/esm2022/lib/tsi-components/tsi-generic-form/tsi-generic-form.component.mjs +1 -1
- package/esm2022/lib/tsi-components/tsi-kanban/tsi-kanban.component.mjs +1 -1
- package/esm2022/lib/tsi-components/tsi-search-box/tsi-search-box.component.mjs +1 -1
- package/fesm2022/tsi-developpement-tsi-shared-ui.mjs +595 -319
- package/fesm2022/tsi-developpement-tsi-shared-ui.mjs.map +1 -1
- package/lib/consts/app-providers.d.ts +1 -1
- package/lib/functions/currency-state.functions.d.ts +80 -0
- package/lib/pipes/tsi-currency.pipe.d.ts +6 -4
- package/lib/providers/shared-ui-tsi.provider.d.ts +1 -1
- package/lib/tsi-components/input-components/tsi-currency-other-input/tsi-currency-other-input.component.d.ts +15 -10
- package/lib/tsi-components/input-components/tsi-currency-societe-input/tsi-currency-societe-input.component.d.ts +13 -10
- package/lib/tsi-components/output-components/tsi-currency-other-display/tsi-currency-other-display.component.d.ts +16 -6
- package/lib/tsi-components/output-components/tsi-currency-societe-display/tsi-currency-societe-display.component.d.ts +12 -13
- package/lib/tsi-components/poc/locale-poc/locale-poc.component.d.ts +39 -21
- package/package.json +1 -1
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Internal currency-state resolution shared by the four currency components
|
|
3
|
+
* (Tsi-Currency-Other-Input/Display, Tsi-Currency-Societe-Input/Display).
|
|
4
|
+
*
|
|
5
|
+
* This module is intentionally NOT re-exported from `functions/index.ts`, so it
|
|
6
|
+
* is an internal implementation detail and not part of the library public API.
|
|
7
|
+
*
|
|
8
|
+
* A currency "state" combines two independent checks:
|
|
9
|
+
* 1. Is the currency code a recognized ISO-4217 code?
|
|
10
|
+
* 2. Does the value carry more decimal places than the currency supports?
|
|
11
|
+
* The result drives a two-tier visual state in the components:
|
|
12
|
+
* - `error` → invalid/missing code, or (inputs) a value that exceeds the
|
|
13
|
+
* currency's decimals and therefore cannot be safely edited;
|
|
14
|
+
* - `warning` → (displays) a value that exceeds the currency's decimals, shown
|
|
15
|
+
* raw so no precision is hidden.
|
|
16
|
+
*/
|
|
17
|
+
/**
|
|
18
|
+
* i18n keys resolved by the host app's `LocalizePipe`. Centralized here so the
|
|
19
|
+
* components and the backend translation files (FR/EN/AR) stay in sync.
|
|
20
|
+
*/
|
|
21
|
+
export const CurrencyStateKeys = {
|
|
22
|
+
noCurrencySupplied: 'sharedUi-currency-error-noCurrencySupplied',
|
|
23
|
+
invalidCurrencySupplied: 'sharedUi-currency-error-invalidCurrencySupplied',
|
|
24
|
+
valueExceedsDecimalsError: 'sharedUi-currency-error-valueExceedsDecimals',
|
|
25
|
+
valueExceedsDecimalsWarning: 'sharedUi-currency-warning-valueExceedsDecimals',
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* Placeholders replaced when building a message, so the currency and the decimal
|
|
29
|
+
* figures are named inline. Translations must include the tokens they need
|
|
30
|
+
* (see the FR/EN/AR translation files):
|
|
31
|
+
* - `{devise}` → the currency code
|
|
32
|
+
* - `{decimals}` → the value's decimal-place count (mismatch messages only)
|
|
33
|
+
* - `{allowed}` → the decimals the currency allows (mismatch messages only)
|
|
34
|
+
*/
|
|
35
|
+
export const CurrencyPlaceholder = '{devise}';
|
|
36
|
+
export const ValueDecimalsPlaceholder = '{decimals}';
|
|
37
|
+
export const AllowedDecimalsPlaceholder = '{allowed}';
|
|
38
|
+
/**
|
|
39
|
+
* English fallbacks used when a translation key is missing, so a raw key slug is
|
|
40
|
+
* never displayed to the user. Currency-referencing messages embed the
|
|
41
|
+
* placeholders above.
|
|
42
|
+
*/
|
|
43
|
+
const Fallbacks = {
|
|
44
|
+
[CurrencyStateKeys.noCurrencySupplied]: 'No currency provided',
|
|
45
|
+
[CurrencyStateKeys.invalidCurrencySupplied]: `Unrecognized currency: ${CurrencyPlaceholder}`,
|
|
46
|
+
[CurrencyStateKeys.valueExceedsDecimalsError]: `This amount has ${ValueDecimalsPlaceholder} decimals but the ${CurrencyPlaceholder} currency allows only ${AllowedDecimalsPlaceholder} — it cannot be edited`,
|
|
47
|
+
[CurrencyStateKeys.valueExceedsDecimalsWarning]: `This amount has ${ValueDecimalsPlaceholder} decimals but the ${CurrencyPlaceholder} currency allows only ${AllowedDecimalsPlaceholder}`,
|
|
48
|
+
};
|
|
49
|
+
const WELL_FORMED_CODE = /^[A-Z]{3}$/;
|
|
50
|
+
/**
|
|
51
|
+
* Memoized set of ISO-4217 codes the runtime recognizes, via
|
|
52
|
+
* `Intl.supportedValuesOf('currency')`. Returns `null` on runtimes that do not
|
|
53
|
+
* support the API, so callers can fall back to a well-formedness check.
|
|
54
|
+
*/
|
|
55
|
+
let _supportedCurrencies;
|
|
56
|
+
function getSupportedCurrencies() {
|
|
57
|
+
if (_supportedCurrencies !== undefined) {
|
|
58
|
+
return _supportedCurrencies;
|
|
59
|
+
}
|
|
60
|
+
const intl = Intl;
|
|
61
|
+
if (typeof intl.supportedValuesOf === 'function') {
|
|
62
|
+
try {
|
|
63
|
+
_supportedCurrencies = new Set(intl.supportedValuesOf('currency'));
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
_supportedCurrencies = null;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
_supportedCurrencies = null;
|
|
71
|
+
}
|
|
72
|
+
return _supportedCurrencies;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Returns `true` when `code` is a recognized ISO-4217 currency code.
|
|
76
|
+
*
|
|
77
|
+
* Prefers the exact `Intl.supportedValuesOf('currency')` list; on older runtimes
|
|
78
|
+
* falls back to a 3-letter well-formedness check plus `Intl.NumberFormat`.
|
|
79
|
+
* Case-insensitive (the code is upper-cased before checking).
|
|
80
|
+
*/
|
|
81
|
+
export function isValidCurrency(code) {
|
|
82
|
+
if (!code) {
|
|
83
|
+
return false;
|
|
84
|
+
}
|
|
85
|
+
const normalized = code.toUpperCase();
|
|
86
|
+
const supported = getSupportedCurrencies();
|
|
87
|
+
if (supported) {
|
|
88
|
+
return supported.has(normalized);
|
|
89
|
+
}
|
|
90
|
+
if (!WELL_FORMED_CODE.test(normalized)) {
|
|
91
|
+
return false;
|
|
92
|
+
}
|
|
93
|
+
try {
|
|
94
|
+
// eslint-disable-next-line no-new
|
|
95
|
+
new Intl.NumberFormat('en', { style: 'currency', currency: normalized });
|
|
96
|
+
return true;
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
return false;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
/** Number of fraction digits the given currency supports (ISO/locale default). */
|
|
103
|
+
function getCurrencyDecimals(code, locale) {
|
|
104
|
+
try {
|
|
105
|
+
return new Intl.NumberFormat(locale, { style: 'currency', currency: code })
|
|
106
|
+
.resolvedOptions().maximumFractionDigits ?? 2;
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
return 2;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Counts the number of decimal places carried by a finite number, using its
|
|
114
|
+
* shortest round-trip string representation (handles exponential notation).
|
|
115
|
+
*/
|
|
116
|
+
function countDecimals(value) {
|
|
117
|
+
if (!Number.isFinite(value)) {
|
|
118
|
+
return 0;
|
|
119
|
+
}
|
|
120
|
+
const str = Math.abs(value).toString();
|
|
121
|
+
if (str.indexOf('e-') !== -1) {
|
|
122
|
+
const [mantissa, exponent] = str.split('e-');
|
|
123
|
+
const mantissaDecimals = mantissa.includes('.') ? mantissa.split('.')[1].length : 0;
|
|
124
|
+
return mantissaDecimals + Number(exponent);
|
|
125
|
+
}
|
|
126
|
+
const dotIndex = str.indexOf('.');
|
|
127
|
+
return dotIndex === -1 ? 0 : str.length - dotIndex - 1;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Resolves the display state for a (currency code, value) pair.
|
|
131
|
+
*
|
|
132
|
+
* @param code ISO-4217 currency code supplied to the component.
|
|
133
|
+
* @param value the monetary value being shown/edited.
|
|
134
|
+
* @param locale locale used to derive the currency's fraction digits.
|
|
135
|
+
* @param mismatchSeverity severity applied when the value exceeds the currency's
|
|
136
|
+
* decimals: `'error'` for inputs (renders read-only),
|
|
137
|
+
* `'warning'` for displays (renders the raw value).
|
|
138
|
+
*/
|
|
139
|
+
export function resolveCurrencyState(code, value, locale, mismatchSeverity) {
|
|
140
|
+
if (!code) {
|
|
141
|
+
return {
|
|
142
|
+
severity: 'error',
|
|
143
|
+
isValid: false,
|
|
144
|
+
tooltipKey: CurrencyStateKeys.noCurrencySupplied,
|
|
145
|
+
isoDecimals: -1,
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
const normalized = code.toUpperCase();
|
|
149
|
+
if (!isValidCurrency(normalized)) {
|
|
150
|
+
return {
|
|
151
|
+
severity: 'error',
|
|
152
|
+
isValid: false,
|
|
153
|
+
tooltipKey: CurrencyStateKeys.invalidCurrencySupplied,
|
|
154
|
+
isoDecimals: -1,
|
|
155
|
+
currencyCode: normalized,
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
const isoDecimals = getCurrencyDecimals(normalized, locale);
|
|
159
|
+
if (value != null && Number.isFinite(value)) {
|
|
160
|
+
const valueDecimals = countDecimals(value);
|
|
161
|
+
if (valueDecimals > isoDecimals) {
|
|
162
|
+
return {
|
|
163
|
+
severity: mismatchSeverity,
|
|
164
|
+
isValid: true,
|
|
165
|
+
tooltipKey: mismatchSeverity === 'warning'
|
|
166
|
+
? CurrencyStateKeys.valueExceedsDecimalsWarning
|
|
167
|
+
: CurrencyStateKeys.valueExceedsDecimalsError,
|
|
168
|
+
isoDecimals,
|
|
169
|
+
valueDecimals,
|
|
170
|
+
currencyCode: normalized,
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
return {
|
|
175
|
+
severity: 'ok',
|
|
176
|
+
isValid: true,
|
|
177
|
+
tooltipKey: '',
|
|
178
|
+
isoDecimals,
|
|
179
|
+
currencyCode: normalized,
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Builds the tooltip message for a resolved state using the supplied `translate`
|
|
184
|
+
* callback (typically `LocalizePipe.transform`). Falls back to a built-in
|
|
185
|
+
* English message when the key resolves to itself (missing translation), so a
|
|
186
|
+
* raw key slug is never shown. Any {@link CurrencyPlaceholder} token in the
|
|
187
|
+
* message is replaced with the currency code, so the offending currency is named
|
|
188
|
+
* inline.
|
|
189
|
+
*/
|
|
190
|
+
export function localizeCurrencyState(state, translate) {
|
|
191
|
+
if (state.severity === 'ok' || !state.tooltipKey) {
|
|
192
|
+
return '';
|
|
193
|
+
}
|
|
194
|
+
const translated = translate(state.tooltipKey);
|
|
195
|
+
const message = !translated || translated === state.tooltipKey
|
|
196
|
+
? (Fallbacks[state.tooltipKey] ?? '')
|
|
197
|
+
: translated;
|
|
198
|
+
return message
|
|
199
|
+
.split(CurrencyPlaceholder).join(state.currencyCode ?? '')
|
|
200
|
+
.split(ValueDecimalsPlaceholder).join(state.valueDecimals != null ? String(state.valueDecimals) : '')
|
|
201
|
+
.split(AllowedDecimalsPlaceholder).join(state.isoDecimals >= 0 ? String(state.isoDecimals) : '');
|
|
202
|
+
}
|
|
203
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VycmVuY3ktc3RhdGUuZnVuY3Rpb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdHNpLXNoYXJlZC11aS9zcmMvbGliL2Z1bmN0aW9ucy9jdXJyZW5jeS1zdGF0ZS5mdW5jdGlvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUg7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUc7SUFDL0Isa0JBQWtCLEVBQUUsNENBQTRDO0lBQ2hFLHVCQUF1QixFQUFFLGlEQUFpRDtJQUMxRSx5QkFBeUIsRUFBRSw4Q0FBOEM7SUFDekUsMkJBQTJCLEVBQUUsZ0RBQWdEO0NBQ3JFLENBQUM7QUFFWDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsVUFBVSxDQUFDO0FBQzlDLE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixHQUFHLFlBQVksQ0FBQztBQUNyRCxNQUFNLENBQUMsTUFBTSwwQkFBMEIsR0FBRyxXQUFXLENBQUM7QUFFdEQ7Ozs7R0FJRztBQUNILE1BQU0sU0FBUyxHQUEyQjtJQUN4QyxDQUFDLGlCQUFpQixDQUFDLGtCQUFrQixDQUFDLEVBQUUsc0JBQXNCO0lBQzlELENBQUMsaUJBQWlCLENBQUMsdUJBQXVCLENBQUMsRUFBRSwwQkFBMEIsbUJBQW1CLEVBQUU7SUFDNUYsQ0FBQyxpQkFBaUIsQ0FBQyx5QkFBeUIsQ0FBQyxFQUMzQyxtQkFBbUIsd0JBQXdCLHFCQUFxQixtQkFBbUIseUJBQXlCLDBCQUEwQix3QkFBd0I7SUFDaEssQ0FBQyxpQkFBaUIsQ0FBQywyQkFBMkIsQ0FBQyxFQUM3QyxtQkFBbUIsd0JBQXdCLHFCQUFxQixtQkFBbUIseUJBQXlCLDBCQUEwQixFQUFFO0NBQzNJLENBQUM7QUFtQkYsTUFBTSxnQkFBZ0IsR0FBRyxZQUFZLENBQUM7QUFFdEM7Ozs7R0FJRztBQUNILElBQUksb0JBQW9ELENBQUM7QUFDekQsU0FBUyxzQkFBc0I7SUFDN0IsSUFBSSxvQkFBb0IsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUN2QyxPQUFPLG9CQUFvQixDQUFDO0lBQzlCLENBQUM7SUFDRCxNQUFNLElBQUksR0FBRyxJQUFvRSxDQUFDO0lBQ2xGLElBQUksT0FBTyxJQUFJLENBQUMsaUJBQWlCLEtBQUssVUFBVSxFQUFFLENBQUM7UUFDakQsSUFBSSxDQUFDO1lBQ0gsb0JBQW9CLEdBQUcsSUFBSSxHQUFHLENBQVMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7UUFDN0UsQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNQLG9CQUFvQixHQUFHLElBQUksQ0FBQztRQUM5QixDQUFDO0lBQ0gsQ0FBQztTQUFNLENBQUM7UUFDTixvQkFBb0IsR0FBRyxJQUFJLENBQUM7SUFDOUIsQ0FBQztJQUNELE9BQU8sb0JBQW9CLENBQUM7QUFDOUIsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxlQUFlLENBQUMsSUFBYTtJQUMzQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDVixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFDRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFFdEMsTUFBTSxTQUFTLEdBQUcsc0JBQXNCLEVBQUUsQ0FBQztJQUMzQyxJQUFJLFNBQVMsRUFBRSxDQUFDO1FBQ2QsT0FBTyxTQUFTLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7UUFDdkMsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBQ0QsSUFBSSxDQUFDO1FBQ0gsa0NBQWtDO1FBQ2xDLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDO1FBQ3pFLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztBQUNILENBQUM7QUFFRCxrRkFBa0Y7QUFDbEYsU0FBUyxtQkFBbUIsQ0FBQyxJQUFZLEVBQUUsTUFBYztJQUN2RCxJQUFJLENBQUM7UUFDSCxPQUFPLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQzthQUN4RSxlQUFlLEVBQUUsQ0FBQyxxQkFBcUIsSUFBSSxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE9BQU8sQ0FBQyxDQUFDO0lBQ1gsQ0FBQztBQUNILENBQUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFTLGFBQWEsQ0FBQyxLQUFhO0lBQ2xDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDNUIsT0FBTyxDQUFDLENBQUM7SUFDWCxDQUFDO0lBQ0QsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUN2QyxJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUM3QixNQUFNLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDN0MsTUFBTSxnQkFBZ0IsR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3BGLE9BQU8sZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFDRCxNQUFNLFFBQVEsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2xDLE9BQU8sUUFBUSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsUUFBUSxHQUFHLENBQUMsQ0FBQztBQUN6RCxDQUFDO0FBRUQ7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxVQUFVLG9CQUFvQixDQUNsQyxJQUF3QixFQUN4QixLQUFnQyxFQUNoQyxNQUFjLEVBQ2QsZ0JBQXFDO0lBRXJDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNWLE9BQU87WUFDTCxRQUFRLEVBQUUsT0FBTztZQUNqQixPQUFPLEVBQUUsS0FBSztZQUNkLFVBQVUsRUFBRSxpQkFBaUIsQ0FBQyxrQkFBa0I7WUFDaEQsV0FBVyxFQUFFLENBQUMsQ0FBQztTQUNoQixDQUFDO0lBQ0osQ0FBQztJQUVELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUN0QyxJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7UUFDakMsT0FBTztZQUNMLFFBQVEsRUFBRSxPQUFPO1lBQ2pCLE9BQU8sRUFBRSxLQUFLO1lBQ2QsVUFBVSxFQUFFLGlCQUFpQixDQUFDLHVCQUF1QjtZQUNyRCxXQUFXLEVBQUUsQ0FBQyxDQUFDO1lBQ2YsWUFBWSxFQUFFLFVBQVU7U0FDekIsQ0FBQztJQUNKLENBQUM7SUFFRCxNQUFNLFdBQVcsR0FBRyxtQkFBbUIsQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDNUQsSUFBSSxLQUFLLElBQUksSUFBSSxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUM1QyxNQUFNLGFBQWEsR0FBRyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDM0MsSUFBSSxhQUFhLEdBQUcsV0FBVyxFQUFFLENBQUM7WUFDaEMsT0FBTztnQkFDTCxRQUFRLEVBQUUsZ0JBQWdCO2dCQUMxQixPQUFPLEVBQUUsSUFBSTtnQkFDYixVQUFVLEVBQUUsZ0JBQWdCLEtBQUssU0FBUztvQkFDeEMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLDJCQUEyQjtvQkFDL0MsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLHlCQUF5QjtnQkFDL0MsV0FBVztnQkFDWCxhQUFhO2dCQUNiLFlBQVksRUFBRSxVQUFVO2FBQ3pCLENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU87UUFDTCxRQUFRLEVBQUUsSUFBSTtRQUNkLE9BQU8sRUFBRSxJQUFJO1FBQ2IsVUFBVSxFQUFFLEVBQUU7UUFDZCxXQUFXO1FBQ1gsWUFBWSxFQUFFLFVBQVU7S0FDekIsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxVQUFVLHFCQUFxQixDQUNuQyxLQUFvQixFQUNwQixTQUFrQztJQUVsQyxJQUFJLEtBQUssQ0FBQyxRQUFRLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2pELE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVELE1BQU0sVUFBVSxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDL0MsTUFBTSxPQUFPLEdBQUcsQ0FBQyxVQUFVLElBQUksVUFBVSxLQUFLLEtBQUssQ0FBQyxVQUFVO1FBQzVELENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3JDLENBQUMsQ0FBQyxVQUFVLENBQUM7SUFFZixPQUFPLE9BQU87U0FDWCxLQUFLLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksSUFBSSxFQUFFLENBQUM7U0FDekQsS0FBSyxDQUFDLHdCQUF3QixDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7U0FDcEcsS0FBSyxDQUFDLDBCQUEwQixDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNyRyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXHJcbiAqIEludGVybmFsIGN1cnJlbmN5LXN0YXRlIHJlc29sdXRpb24gc2hhcmVkIGJ5IHRoZSBmb3VyIGN1cnJlbmN5IGNvbXBvbmVudHNcclxuICogKFRzaS1DdXJyZW5jeS1PdGhlci1JbnB1dC9EaXNwbGF5LCBUc2ktQ3VycmVuY3ktU29jaWV0ZS1JbnB1dC9EaXNwbGF5KS5cclxuICpcclxuICogVGhpcyBtb2R1bGUgaXMgaW50ZW50aW9uYWxseSBOT1QgcmUtZXhwb3J0ZWQgZnJvbSBgZnVuY3Rpb25zL2luZGV4LnRzYCwgc28gaXRcclxuICogaXMgYW4gaW50ZXJuYWwgaW1wbGVtZW50YXRpb24gZGV0YWlsIGFuZCBub3QgcGFydCBvZiB0aGUgbGlicmFyeSBwdWJsaWMgQVBJLlxyXG4gKlxyXG4gKiBBIGN1cnJlbmN5IFwic3RhdGVcIiBjb21iaW5lcyB0d28gaW5kZXBlbmRlbnQgY2hlY2tzOlxyXG4gKiAgMS4gSXMgdGhlIGN1cnJlbmN5IGNvZGUgYSByZWNvZ25pemVkIElTTy00MjE3IGNvZGU/XHJcbiAqICAyLiBEb2VzIHRoZSB2YWx1ZSBjYXJyeSBtb3JlIGRlY2ltYWwgcGxhY2VzIHRoYW4gdGhlIGN1cnJlbmN5IHN1cHBvcnRzP1xyXG4gKiBUaGUgcmVzdWx0IGRyaXZlcyBhIHR3by10aWVyIHZpc3VhbCBzdGF0ZSBpbiB0aGUgY29tcG9uZW50czpcclxuICogIC0gYGVycm9yYCAgIOKGkiBpbnZhbGlkL21pc3NpbmcgY29kZSwgb3IgKGlucHV0cykgYSB2YWx1ZSB0aGF0IGV4Y2VlZHMgdGhlXHJcbiAqICAgICAgICAgICAgICAgIGN1cnJlbmN5J3MgZGVjaW1hbHMgYW5kIHRoZXJlZm9yZSBjYW5ub3QgYmUgc2FmZWx5IGVkaXRlZDtcclxuICogIC0gYHdhcm5pbmdgIOKGkiAoZGlzcGxheXMpIGEgdmFsdWUgdGhhdCBleGNlZWRzIHRoZSBjdXJyZW5jeSdzIGRlY2ltYWxzLCBzaG93blxyXG4gKiAgICAgICAgICAgICAgICByYXcgc28gbm8gcHJlY2lzaW9uIGlzIGhpZGRlbi5cclxuICovXHJcblxyXG4vKipcclxuICogaTE4biBrZXlzIHJlc29sdmVkIGJ5IHRoZSBob3N0IGFwcCdzIGBMb2NhbGl6ZVBpcGVgLiBDZW50cmFsaXplZCBoZXJlIHNvIHRoZVxyXG4gKiBjb21wb25lbnRzIGFuZCB0aGUgYmFja2VuZCB0cmFuc2xhdGlvbiBmaWxlcyAoRlIvRU4vQVIpIHN0YXkgaW4gc3luYy5cclxuICovXHJcbmV4cG9ydCBjb25zdCBDdXJyZW5jeVN0YXRlS2V5cyA9IHtcclxuICBub0N1cnJlbmN5U3VwcGxpZWQ6ICdzaGFyZWRVaS1jdXJyZW5jeS1lcnJvci1ub0N1cnJlbmN5U3VwcGxpZWQnLFxyXG4gIGludmFsaWRDdXJyZW5jeVN1cHBsaWVkOiAnc2hhcmVkVWktY3VycmVuY3ktZXJyb3ItaW52YWxpZEN1cnJlbmN5U3VwcGxpZWQnLFxyXG4gIHZhbHVlRXhjZWVkc0RlY2ltYWxzRXJyb3I6ICdzaGFyZWRVaS1jdXJyZW5jeS1lcnJvci12YWx1ZUV4Y2VlZHNEZWNpbWFscycsXHJcbiAgdmFsdWVFeGNlZWRzRGVjaW1hbHNXYXJuaW5nOiAnc2hhcmVkVWktY3VycmVuY3ktd2FybmluZy12YWx1ZUV4Y2VlZHNEZWNpbWFscycsXHJcbn0gYXMgY29uc3Q7XHJcblxyXG4vKipcclxuICogUGxhY2Vob2xkZXJzIHJlcGxhY2VkIHdoZW4gYnVpbGRpbmcgYSBtZXNzYWdlLCBzbyB0aGUgY3VycmVuY3kgYW5kIHRoZSBkZWNpbWFsXHJcbiAqIGZpZ3VyZXMgYXJlIG5hbWVkIGlubGluZS4gVHJhbnNsYXRpb25zIG11c3QgaW5jbHVkZSB0aGUgdG9rZW5zIHRoZXkgbmVlZFxyXG4gKiAoc2VlIHRoZSBGUi9FTi9BUiB0cmFuc2xhdGlvbiBmaWxlcyk6XHJcbiAqICAtIGB7ZGV2aXNlfWAgICDihpIgdGhlIGN1cnJlbmN5IGNvZGVcclxuICogIC0gYHtkZWNpbWFsc31gIOKGkiB0aGUgdmFsdWUncyBkZWNpbWFsLXBsYWNlIGNvdW50IChtaXNtYXRjaCBtZXNzYWdlcyBvbmx5KVxyXG4gKiAgLSBge2FsbG93ZWR9YCAg4oaSIHRoZSBkZWNpbWFscyB0aGUgY3VycmVuY3kgYWxsb3dzIChtaXNtYXRjaCBtZXNzYWdlcyBvbmx5KVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IEN1cnJlbmN5UGxhY2Vob2xkZXIgPSAne2RldmlzZX0nO1xyXG5leHBvcnQgY29uc3QgVmFsdWVEZWNpbWFsc1BsYWNlaG9sZGVyID0gJ3tkZWNpbWFsc30nO1xyXG5leHBvcnQgY29uc3QgQWxsb3dlZERlY2ltYWxzUGxhY2Vob2xkZXIgPSAne2FsbG93ZWR9JztcclxuXHJcbi8qKlxyXG4gKiBFbmdsaXNoIGZhbGxiYWNrcyB1c2VkIHdoZW4gYSB0cmFuc2xhdGlvbiBrZXkgaXMgbWlzc2luZywgc28gYSByYXcga2V5IHNsdWcgaXNcclxuICogbmV2ZXIgZGlzcGxheWVkIHRvIHRoZSB1c2VyLiBDdXJyZW5jeS1yZWZlcmVuY2luZyBtZXNzYWdlcyBlbWJlZCB0aGVcclxuICogcGxhY2Vob2xkZXJzIGFib3ZlLlxyXG4gKi9cclxuY29uc3QgRmFsbGJhY2tzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xyXG4gIFtDdXJyZW5jeVN0YXRlS2V5cy5ub0N1cnJlbmN5U3VwcGxpZWRdOiAnTm8gY3VycmVuY3kgcHJvdmlkZWQnLFxyXG4gIFtDdXJyZW5jeVN0YXRlS2V5cy5pbnZhbGlkQ3VycmVuY3lTdXBwbGllZF06IGBVbnJlY29nbml6ZWQgY3VycmVuY3k6ICR7Q3VycmVuY3lQbGFjZWhvbGRlcn1gLFxyXG4gIFtDdXJyZW5jeVN0YXRlS2V5cy52YWx1ZUV4Y2VlZHNEZWNpbWFsc0Vycm9yXTpcclxuICAgIGBUaGlzIGFtb3VudCBoYXMgJHtWYWx1ZURlY2ltYWxzUGxhY2Vob2xkZXJ9IGRlY2ltYWxzIGJ1dCB0aGUgJHtDdXJyZW5jeVBsYWNlaG9sZGVyfSBjdXJyZW5jeSBhbGxvd3Mgb25seSAke0FsbG93ZWREZWNpbWFsc1BsYWNlaG9sZGVyfSDigJQgaXQgY2Fubm90IGJlIGVkaXRlZGAsXHJcbiAgW0N1cnJlbmN5U3RhdGVLZXlzLnZhbHVlRXhjZWVkc0RlY2ltYWxzV2FybmluZ106XHJcbiAgICBgVGhpcyBhbW91bnQgaGFzICR7VmFsdWVEZWNpbWFsc1BsYWNlaG9sZGVyfSBkZWNpbWFscyBidXQgdGhlICR7Q3VycmVuY3lQbGFjZWhvbGRlcn0gY3VycmVuY3kgYWxsb3dzIG9ubHkgJHtBbGxvd2VkRGVjaW1hbHNQbGFjZWhvbGRlcn1gLFxyXG59O1xyXG5cclxuZXhwb3J0IHR5cGUgQ3VycmVuY3lTdGF0ZVNldmVyaXR5ID0gJ29rJyB8ICdlcnJvcicgfCAnd2FybmluZyc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEN1cnJlbmN5U3RhdGUge1xyXG4gIC8qKiBPdmVyYWxsIHNldmVyaXR5IG9mIHRoZSBjdXJyZW50IChjb2RlLCB2YWx1ZSkgcGFpci4gKi9cclxuICBzZXZlcml0eTogQ3VycmVuY3lTdGF0ZVNldmVyaXR5O1xyXG4gIC8qKiBXaGV0aGVyIHRoZSBjdXJyZW5jeSBjb2RlIGl0c2VsZiBpcyBhIHJlY29nbml6ZWQgSVNPLTQyMTcgY29kZS4gKi9cclxuICBpc1ZhbGlkOiBib29sZWFuO1xyXG4gIC8qKiBUcmFuc2xhdGlvbiBrZXkgZm9yIHRoZSB0b29sdGlwIG1lc3NhZ2UgKGVtcHR5IHdoZW4gc2V2ZXJpdHkgPT09ICdvaycpLiAqL1xyXG4gIHRvb2x0aXBLZXk6IHN0cmluZztcclxuICAvKiogRnJhY3Rpb24gZGlnaXRzIHRoZSBjdXJyZW5jeSBzdXBwb3J0cyAoSVNPL2xvY2FsZSBkZWZhdWx0KTsgLTEgaWYgdW5rbm93bi4gKi9cclxuICBpc29EZWNpbWFsczogbnVtYmVyO1xyXG4gIC8qKiBEZWNpbWFsIHBsYWNlcyB0aGUgdmFsdWUgY2Fycmllczsgc2V0IG9ubHkgb24gYSBkZWNpbWFscyBtaXNtYXRjaC4gKi9cclxuICB2YWx1ZURlY2ltYWxzPzogbnVtYmVyO1xyXG4gIC8qKiBOb3JtYWxpemVkICh1cHBlci1jYXNlZCkgY3VycmVuY3kgY29kZSwgd2hlbiBvbmUgd2FzIHN1cHBsaWVkLiAqL1xyXG4gIGN1cnJlbmN5Q29kZT86IHN0cmluZztcclxufVxyXG5cclxuY29uc3QgV0VMTF9GT1JNRURfQ09ERSA9IC9eW0EtWl17M30kLztcclxuXHJcbi8qKlxyXG4gKiBNZW1vaXplZCBzZXQgb2YgSVNPLTQyMTcgY29kZXMgdGhlIHJ1bnRpbWUgcmVjb2duaXplcywgdmlhXHJcbiAqIGBJbnRsLnN1cHBvcnRlZFZhbHVlc09mKCdjdXJyZW5jeScpYC4gUmV0dXJucyBgbnVsbGAgb24gcnVudGltZXMgdGhhdCBkbyBub3RcclxuICogc3VwcG9ydCB0aGUgQVBJLCBzbyBjYWxsZXJzIGNhbiBmYWxsIGJhY2sgdG8gYSB3ZWxsLWZvcm1lZG5lc3MgY2hlY2suXHJcbiAqL1xyXG5sZXQgX3N1cHBvcnRlZEN1cnJlbmNpZXM6IFNldDxzdHJpbmc+IHwgbnVsbCB8IHVuZGVmaW5lZDtcclxuZnVuY3Rpb24gZ2V0U3VwcG9ydGVkQ3VycmVuY2llcygpOiBTZXQ8c3RyaW5nPiB8IG51bGwge1xyXG4gIGlmIChfc3VwcG9ydGVkQ3VycmVuY2llcyAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICByZXR1cm4gX3N1cHBvcnRlZEN1cnJlbmNpZXM7XHJcbiAgfVxyXG4gIGNvbnN0IGludGwgPSBJbnRsIGFzIHVua25vd24gYXMgeyBzdXBwb3J0ZWRWYWx1ZXNPZj86IChrZXk6IHN0cmluZykgPT4gc3RyaW5nW10gfTtcclxuICBpZiAodHlwZW9mIGludGwuc3VwcG9ydGVkVmFsdWVzT2YgPT09ICdmdW5jdGlvbicpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIF9zdXBwb3J0ZWRDdXJyZW5jaWVzID0gbmV3IFNldDxzdHJpbmc+KGludGwuc3VwcG9ydGVkVmFsdWVzT2YoJ2N1cnJlbmN5JykpO1xyXG4gICAgfSBjYXRjaCB7XHJcbiAgICAgIF9zdXBwb3J0ZWRDdXJyZW5jaWVzID0gbnVsbDtcclxuICAgIH1cclxuICB9IGVsc2Uge1xyXG4gICAgX3N1cHBvcnRlZEN1cnJlbmNpZXMgPSBudWxsO1xyXG4gIH1cclxuICByZXR1cm4gX3N1cHBvcnRlZEN1cnJlbmNpZXM7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIGB0cnVlYCB3aGVuIGBjb2RlYCBpcyBhIHJlY29nbml6ZWQgSVNPLTQyMTcgY3VycmVuY3kgY29kZS5cclxuICpcclxuICogUHJlZmVycyB0aGUgZXhhY3QgYEludGwuc3VwcG9ydGVkVmFsdWVzT2YoJ2N1cnJlbmN5JylgIGxpc3Q7IG9uIG9sZGVyIHJ1bnRpbWVzXHJcbiAqIGZhbGxzIGJhY2sgdG8gYSAzLWxldHRlciB3ZWxsLWZvcm1lZG5lc3MgY2hlY2sgcGx1cyBgSW50bC5OdW1iZXJGb3JtYXRgLlxyXG4gKiBDYXNlLWluc2Vuc2l0aXZlICh0aGUgY29kZSBpcyB1cHBlci1jYXNlZCBiZWZvcmUgY2hlY2tpbmcpLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRDdXJyZW5jeShjb2RlPzogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgaWYgKCFjb2RlKSB7XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSBjb2RlLnRvVXBwZXJDYXNlKCk7XHJcblxyXG4gIGNvbnN0IHN1cHBvcnRlZCA9IGdldFN1cHBvcnRlZEN1cnJlbmNpZXMoKTtcclxuICBpZiAoc3VwcG9ydGVkKSB7XHJcbiAgICByZXR1cm4gc3VwcG9ydGVkLmhhcyhub3JtYWxpemVkKTtcclxuICB9XHJcblxyXG4gIGlmICghV0VMTF9GT1JNRURfQ09ERS50ZXN0KG5vcm1hbGl6ZWQpKSB7XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG4gIHRyeSB7XHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmV3XHJcbiAgICBuZXcgSW50bC5OdW1iZXJGb3JtYXQoJ2VuJywgeyBzdHlsZTogJ2N1cnJlbmN5JywgY3VycmVuY3k6IG5vcm1hbGl6ZWQgfSk7XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9IGNhdGNoIHtcclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcbn1cclxuXHJcbi8qKiBOdW1iZXIgb2YgZnJhY3Rpb24gZGlnaXRzIHRoZSBnaXZlbiBjdXJyZW5jeSBzdXBwb3J0cyAoSVNPL2xvY2FsZSBkZWZhdWx0KS4gKi9cclxuZnVuY3Rpb24gZ2V0Q3VycmVuY3lEZWNpbWFscyhjb2RlOiBzdHJpbmcsIGxvY2FsZTogc3RyaW5nKTogbnVtYmVyIHtcclxuICB0cnkge1xyXG4gICAgcmV0dXJuIG5ldyBJbnRsLk51bWJlckZvcm1hdChsb2NhbGUsIHsgc3R5bGU6ICdjdXJyZW5jeScsIGN1cnJlbmN5OiBjb2RlIH0pXHJcbiAgICAgIC5yZXNvbHZlZE9wdGlvbnMoKS5tYXhpbXVtRnJhY3Rpb25EaWdpdHMgPz8gMjtcclxuICB9IGNhdGNoIHtcclxuICAgIHJldHVybiAyO1xyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIENvdW50cyB0aGUgbnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzIGNhcnJpZWQgYnkgYSBmaW5pdGUgbnVtYmVyLCB1c2luZyBpdHNcclxuICogc2hvcnRlc3Qgcm91bmQtdHJpcCBzdHJpbmcgcmVwcmVzZW50YXRpb24gKGhhbmRsZXMgZXhwb25lbnRpYWwgbm90YXRpb24pLlxyXG4gKi9cclxuZnVuY3Rpb24gY291bnREZWNpbWFscyh2YWx1ZTogbnVtYmVyKTogbnVtYmVyIHtcclxuICBpZiAoIU51bWJlci5pc0Zpbml0ZSh2YWx1ZSkpIHtcclxuICAgIHJldHVybiAwO1xyXG4gIH1cclxuICBjb25zdCBzdHIgPSBNYXRoLmFicyh2YWx1ZSkudG9TdHJpbmcoKTtcclxuICBpZiAoc3RyLmluZGV4T2YoJ2UtJykgIT09IC0xKSB7XHJcbiAgICBjb25zdCBbbWFudGlzc2EsIGV4cG9uZW50XSA9IHN0ci5zcGxpdCgnZS0nKTtcclxuICAgIGNvbnN0IG1hbnRpc3NhRGVjaW1hbHMgPSBtYW50aXNzYS5pbmNsdWRlcygnLicpID8gbWFudGlzc2Euc3BsaXQoJy4nKVsxXS5sZW5ndGggOiAwO1xyXG4gICAgcmV0dXJuIG1hbnRpc3NhRGVjaW1hbHMgKyBOdW1iZXIoZXhwb25lbnQpO1xyXG4gIH1cclxuICBjb25zdCBkb3RJbmRleCA9IHN0ci5pbmRleE9mKCcuJyk7XHJcbiAgcmV0dXJuIGRvdEluZGV4ID09PSAtMSA/IDAgOiBzdHIubGVuZ3RoIC0gZG90SW5kZXggLSAxO1xyXG59XHJcblxyXG4vKipcclxuICogUmVzb2x2ZXMgdGhlIGRpc3BsYXkgc3RhdGUgZm9yIGEgKGN1cnJlbmN5IGNvZGUsIHZhbHVlKSBwYWlyLlxyXG4gKlxyXG4gKiBAcGFyYW0gY29kZSAgICAgICAgICAgICBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIHN1cHBsaWVkIHRvIHRoZSBjb21wb25lbnQuXHJcbiAqIEBwYXJhbSB2YWx1ZSAgICAgICAgICAgIHRoZSBtb25ldGFyeSB2YWx1ZSBiZWluZyBzaG93bi9lZGl0ZWQuXHJcbiAqIEBwYXJhbSBsb2NhbGUgICAgICAgICAgIGxvY2FsZSB1c2VkIHRvIGRlcml2ZSB0aGUgY3VycmVuY3kncyBmcmFjdGlvbiBkaWdpdHMuXHJcbiAqIEBwYXJhbSBtaXNtYXRjaFNldmVyaXR5IHNldmVyaXR5IGFwcGxpZWQgd2hlbiB0aGUgdmFsdWUgZXhjZWVkcyB0aGUgY3VycmVuY3knc1xyXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICBkZWNpbWFsczogYCdlcnJvcidgIGZvciBpbnB1dHMgKHJlbmRlcnMgcmVhZC1vbmx5KSxcclxuICogICAgICAgICAgICAgICAgICAgICAgICAgYCd3YXJuaW5nJ2AgZm9yIGRpc3BsYXlzIChyZW5kZXJzIHRoZSByYXcgdmFsdWUpLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVDdXJyZW5jeVN0YXRlKFxyXG4gIGNvZGU6IHN0cmluZyB8IHVuZGVmaW5lZCxcclxuICB2YWx1ZTogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCxcclxuICBsb2NhbGU6IHN0cmluZyxcclxuICBtaXNtYXRjaFNldmVyaXR5OiAnZXJyb3InIHwgJ3dhcm5pbmcnXHJcbik6IEN1cnJlbmN5U3RhdGUge1xyXG4gIGlmICghY29kZSkge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgc2V2ZXJpdHk6ICdlcnJvcicsXHJcbiAgICAgIGlzVmFsaWQ6IGZhbHNlLFxyXG4gICAgICB0b29sdGlwS2V5OiBDdXJyZW5jeVN0YXRlS2V5cy5ub0N1cnJlbmN5U3VwcGxpZWQsXHJcbiAgICAgIGlzb0RlY2ltYWxzOiAtMSxcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBjb25zdCBub3JtYWxpemVkID0gY29kZS50b1VwcGVyQ2FzZSgpO1xyXG4gIGlmICghaXNWYWxpZEN1cnJlbmN5KG5vcm1hbGl6ZWQpKSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBzZXZlcml0eTogJ2Vycm9yJyxcclxuICAgICAgaXNWYWxpZDogZmFsc2UsXHJcbiAgICAgIHRvb2x0aXBLZXk6IEN1cnJlbmN5U3RhdGVLZXlzLmludmFsaWRDdXJyZW5jeVN1cHBsaWVkLFxyXG4gICAgICBpc29EZWNpbWFsczogLTEsXHJcbiAgICAgIGN1cnJlbmN5Q29kZTogbm9ybWFsaXplZCxcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBjb25zdCBpc29EZWNpbWFscyA9IGdldEN1cnJlbmN5RGVjaW1hbHMobm9ybWFsaXplZCwgbG9jYWxlKTtcclxuICBpZiAodmFsdWUgIT0gbnVsbCAmJiBOdW1iZXIuaXNGaW5pdGUodmFsdWUpKSB7XHJcbiAgICBjb25zdCB2YWx1ZURlY2ltYWxzID0gY291bnREZWNpbWFscyh2YWx1ZSk7XHJcbiAgICBpZiAodmFsdWVEZWNpbWFscyA+IGlzb0RlY2ltYWxzKSB7XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgc2V2ZXJpdHk6IG1pc21hdGNoU2V2ZXJpdHksXHJcbiAgICAgICAgaXNWYWxpZDogdHJ1ZSxcclxuICAgICAgICB0b29sdGlwS2V5OiBtaXNtYXRjaFNldmVyaXR5ID09PSAnd2FybmluZydcclxuICAgICAgICAgID8gQ3VycmVuY3lTdGF0ZUtleXMudmFsdWVFeGNlZWRzRGVjaW1hbHNXYXJuaW5nXHJcbiAgICAgICAgICA6IEN1cnJlbmN5U3RhdGVLZXlzLnZhbHVlRXhjZWVkc0RlY2ltYWxzRXJyb3IsXHJcbiAgICAgICAgaXNvRGVjaW1hbHMsXHJcbiAgICAgICAgdmFsdWVEZWNpbWFscyxcclxuICAgICAgICBjdXJyZW5jeUNvZGU6IG5vcm1hbGl6ZWQsXHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZXR1cm4ge1xyXG4gICAgc2V2ZXJpdHk6ICdvaycsXHJcbiAgICBpc1ZhbGlkOiB0cnVlLFxyXG4gICAgdG9vbHRpcEtleTogJycsXHJcbiAgICBpc29EZWNpbWFscyxcclxuICAgIGN1cnJlbmN5Q29kZTogbm9ybWFsaXplZCxcclxuICB9O1xyXG59XHJcblxyXG4vKipcclxuICogQnVpbGRzIHRoZSB0b29sdGlwIG1lc3NhZ2UgZm9yIGEgcmVzb2x2ZWQgc3RhdGUgdXNpbmcgdGhlIHN1cHBsaWVkIGB0cmFuc2xhdGVgXHJcbiAqIGNhbGxiYWNrICh0eXBpY2FsbHkgYExvY2FsaXplUGlwZS50cmFuc2Zvcm1gKS4gRmFsbHMgYmFjayB0byBhIGJ1aWx0LWluXHJcbiAqIEVuZ2xpc2ggbWVzc2FnZSB3aGVuIHRoZSBrZXkgcmVzb2x2ZXMgdG8gaXRzZWxmIChtaXNzaW5nIHRyYW5zbGF0aW9uKSwgc28gYVxyXG4gKiByYXcga2V5IHNsdWcgaXMgbmV2ZXIgc2hvd24uIEFueSB7QGxpbmsgQ3VycmVuY3lQbGFjZWhvbGRlcn0gdG9rZW4gaW4gdGhlXHJcbiAqIG1lc3NhZ2UgaXMgcmVwbGFjZWQgd2l0aCB0aGUgY3VycmVuY3kgY29kZSwgc28gdGhlIG9mZmVuZGluZyBjdXJyZW5jeSBpcyBuYW1lZFxyXG4gKiBpbmxpbmUuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gbG9jYWxpemVDdXJyZW5jeVN0YXRlKFxyXG4gIHN0YXRlOiBDdXJyZW5jeVN0YXRlLFxyXG4gIHRyYW5zbGF0ZTogKGtleTogc3RyaW5nKSA9PiBzdHJpbmdcclxuKTogc3RyaW5nIHtcclxuICBpZiAoc3RhdGUuc2V2ZXJpdHkgPT09ICdvaycgfHwgIXN0YXRlLnRvb2x0aXBLZXkpIHtcclxuICAgIHJldHVybiAnJztcclxuICB9XHJcblxyXG4gIGNvbnN0IHRyYW5zbGF0ZWQgPSB0cmFuc2xhdGUoc3RhdGUudG9vbHRpcEtleSk7XHJcbiAgY29uc3QgbWVzc2FnZSA9ICF0cmFuc2xhdGVkIHx8IHRyYW5zbGF0ZWQgPT09IHN0YXRlLnRvb2x0aXBLZXlcclxuICAgID8gKEZhbGxiYWNrc1tzdGF0ZS50b29sdGlwS2V5XSA/PyAnJylcclxuICAgIDogdHJhbnNsYXRlZDtcclxuXHJcbiAgcmV0dXJuIG1lc3NhZ2VcclxuICAgIC5zcGxpdChDdXJyZW5jeVBsYWNlaG9sZGVyKS5qb2luKHN0YXRlLmN1cnJlbmN5Q29kZSA/PyAnJylcclxuICAgIC5zcGxpdChWYWx1ZURlY2ltYWxzUGxhY2Vob2xkZXIpLmpvaW4oc3RhdGUudmFsdWVEZWNpbWFscyAhPSBudWxsID8gU3RyaW5nKHN0YXRlLnZhbHVlRGVjaW1hbHMpIDogJycpXHJcbiAgICAuc3BsaXQoQWxsb3dlZERlY2ltYWxzUGxhY2Vob2xkZXIpLmpvaW4oc3RhdGUuaXNvRGVjaW1hbHMgPj0gMCA/IFN0cmluZyhzdGF0ZS5pc29EZWNpbWFscykgOiAnJyk7XHJcbn1cclxuIl19
|
|
@@ -1,29 +1,27 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { CurrencyPipe } from '@angular/common';
|
|
2
|
+
import { inject, Pipe } from '@angular/core';
|
|
3
|
+
import { LocalizationService } from '../services/localization/localization.service';
|
|
3
4
|
import * as i0 from "@angular/core";
|
|
4
|
-
import * as i1 from "@angular/common";
|
|
5
5
|
export class TsiCurrencyPipe {
|
|
6
|
-
|
|
7
|
-
|
|
6
|
+
// Ctor
|
|
7
|
+
constructor() {
|
|
8
|
+
// Local props
|
|
9
|
+
this._display = 'symbol';
|
|
10
|
+
// DI
|
|
11
|
+
this._localizationService = inject(LocalizationService);
|
|
12
|
+
this._currencyPipe = inject(CurrencyPipe);
|
|
13
|
+
this._locale = this._localizationService.locale;
|
|
8
14
|
}
|
|
9
|
-
transform(value, currencyCode
|
|
10
|
-
|
|
11
|
-
if (locale != locals.arabicLocal) {
|
|
12
|
-
return formattedValue;
|
|
13
|
-
}
|
|
14
|
-
if (!formattedValue)
|
|
15
|
-
return null;
|
|
16
|
-
const currencySymbol = formattedValue.match(/[^0-9,.]/g)?.join('') || '';
|
|
17
|
-
formattedValue = formattedValue.replace(currencySymbol, '');
|
|
18
|
-
return `${formattedValue} ${currencySymbol}`;
|
|
15
|
+
transform(value, currencyCode) {
|
|
16
|
+
return this._currencyPipe.transform(value, currencyCode, this._display, undefined, this._locale);
|
|
19
17
|
}
|
|
20
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TsiCurrencyPipe, deps: [
|
|
18
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TsiCurrencyPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
|
|
21
19
|
static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "17.3.12", ngImport: i0, type: TsiCurrencyPipe, name: "tsiCurrency" }); }
|
|
22
20
|
}
|
|
23
21
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TsiCurrencyPipe, decorators: [{
|
|
24
22
|
type: Pipe,
|
|
25
23
|
args: [{
|
|
26
|
-
name: 'tsiCurrency'
|
|
24
|
+
name: 'tsiCurrency'
|
|
27
25
|
}]
|
|
28
|
-
}], ctorParameters: () => [
|
|
29
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
26
|
+
}], ctorParameters: () => [] });
|
|
27
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHNpLWN1cnJlbmN5LnBpcGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90c2ktc2hhcmVkLXVpL3NyYy9saWIvcGlwZXMvdHNpLWN1cnJlbmN5LnBpcGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFpQixNQUFNLGVBQWUsQ0FBQztBQUU1RCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQzs7QUFLcEYsTUFBTSxPQUFPLGVBQWU7SUFTMUIsT0FBTztJQUNQO1FBVEEsY0FBYztRQUNHLGFBQVEsR0FBVyxRQUFRLENBQUM7UUFHN0MsS0FBSztRQUNHLHlCQUFvQixHQUF3QixNQUFNLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUN4RSxrQkFBYSxHQUFpQixNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7UUFLekQsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsTUFBTSxDQUFDO0lBQ2xELENBQUM7SUFFRCxTQUFTLENBQUMsS0FBeUIsRUFBRSxZQUFvQjtRQUN2RCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxZQUFZLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ25HLENBQUM7K0dBakJVLGVBQWU7NkdBQWYsZUFBZTs7NEZBQWYsZUFBZTtrQkFIM0IsSUFBSTttQkFBQztvQkFDSixJQUFJLEVBQUUsYUFBYTtpQkFDcEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDdXJyZW5jeVBpcGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBpbmplY3QsIFBpcGUsIFBpcGVUcmFuc2Zvcm0gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTG9jYWxlQ29kZSB9IGZyb20gJy4uL2VudW1zL0xhbmd1YWdlJztcclxuaW1wb3J0IHsgTG9jYWxpemF0aW9uU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2xvY2FsaXphdGlvbi9sb2NhbGl6YXRpb24uc2VydmljZSc7XHJcblxyXG5AUGlwZSh7XHJcbiAgbmFtZTogJ3RzaUN1cnJlbmN5J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgVHNpQ3VycmVuY3lQaXBlIGltcGxlbWVudHMgUGlwZVRyYW5zZm9ybSB7XHJcbiAgLy8gTG9jYWwgcHJvcHNcclxuICBwcml2YXRlIHJlYWRvbmx5IF9kaXNwbGF5OiBzdHJpbmcgPSAnc3ltYm9sJztcclxuICBwcml2YXRlIF9sb2NhbGU6IExvY2FsZUNvZGU7XHJcblxyXG4gIC8vIERJXHJcbiAgcHJpdmF0ZSBfbG9jYWxpemF0aW9uU2VydmljZTogTG9jYWxpemF0aW9uU2VydmljZSA9IGluamVjdChMb2NhbGl6YXRpb25TZXJ2aWNlKTtcclxuICBwcml2YXRlIF9jdXJyZW5jeVBpcGU6IEN1cnJlbmN5UGlwZSA9IGluamVjdChDdXJyZW5jeVBpcGUpO1xyXG5cclxuICAvLyBDdG9yXHJcbiAgY29uc3RydWN0b3IoKVxyXG4gIHtcclxuICAgIHRoaXMuX2xvY2FsZSA9IHRoaXMuX2xvY2FsaXphdGlvblNlcnZpY2UubG9jYWxlO1xyXG4gIH1cclxuXHJcbiAgdHJhbnNmb3JtKHZhbHVlOiBudW1iZXIgfCB1bmRlZmluZWQsIGN1cnJlbmN5Q29kZTogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XHJcbiAgICByZXR1cm4gdGhpcy5fY3VycmVuY3lQaXBlLnRyYW5zZm9ybSh2YWx1ZSwgY3VycmVuY3lDb2RlLCB0aGlzLl9kaXNwbGF5LCB1bmRlZmluZWQsIHRoaXMuX2xvY2FsZSk7XHJcbiAgfVxyXG59Il19
|