nmce-func 1.3.2 → 1.4.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/README.md +24 -24
- package/_func/currencyFunc.d.ts +16 -6
- package/_func/dateFunc.d.ts +75 -78
- package/_func/index.d.ts +0 -1
- package/esm2022/_func/addressFunc.mjs +1 -1
- package/esm2022/_func/currencyFunc.mjs +45 -33
- package/esm2022/_func/dateFunc.mjs +193 -201
- package/esm2022/_func/htmlPrintFunc.mjs +6 -6
- package/esm2022/_func/index.mjs +1 -2
- package/esm2022/_func/jsonFunc.mjs +6 -4
- package/esm2022/_func/stringAusFunc.mjs +1 -1
- package/esm2022/_func/stringFunc.mjs +1 -1
- package/esm2022/_func/uuidFunc.mjs +1 -3
- package/esm2022/public-api.mjs +1 -1
- package/fesm2022/nmce-func.mjs +247 -291
- package/fesm2022/nmce-func.mjs.map +1 -1
- package/package.json +1 -1
- package/_func/authentication.service.d.ts +0 -27
- package/esm2022/_func/authentication.service.mjs +0 -48
package/README.md
CHANGED
|
@@ -1,24 +1,24 @@
|
|
|
1
|
-
# NmceFunc
|
|
2
|
-
|
|
3
|
-
This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 11.2.5.
|
|
4
|
-
|
|
5
|
-
## Code scaffolding
|
|
6
|
-
|
|
7
|
-
Run `ng generate component component-name --project nmce-func` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module --project nmce-func`.
|
|
8
|
-
> Note: Don't forget to add `--project nmce-func` or else it will be added to the default project in your `angular.json` file.
|
|
9
|
-
|
|
10
|
-
## Build
|
|
11
|
-
|
|
12
|
-
Run `ng build nmce-func` to build the project. The build artifacts will be stored in the `dist/` directory.
|
|
13
|
-
|
|
14
|
-
## Publishing
|
|
15
|
-
|
|
16
|
-
After building your library with `ng build nmce-func`, go to the dist folder `cd dist/nmce-func` and run `npm publish`.
|
|
17
|
-
|
|
18
|
-
## Running unit tests
|
|
19
|
-
|
|
20
|
-
Run `ng test nmce-func` to execute the unit tests via [Karma](https://karma-runner.github.io).
|
|
21
|
-
|
|
22
|
-
## Further help
|
|
23
|
-
|
|
24
|
-
To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI Overview and Command Reference](https://angular.io/cli) page.
|
|
1
|
+
# NmceFunc
|
|
2
|
+
|
|
3
|
+
This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 11.2.5.
|
|
4
|
+
|
|
5
|
+
## Code scaffolding
|
|
6
|
+
|
|
7
|
+
Run `ng generate component component-name --project nmce-func` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module --project nmce-func`.
|
|
8
|
+
> Note: Don't forget to add `--project nmce-func` or else it will be added to the default project in your `angular.json` file.
|
|
9
|
+
|
|
10
|
+
## Build
|
|
11
|
+
|
|
12
|
+
Run `ng build nmce-func` to build the project. The build artifacts will be stored in the `dist/` directory.
|
|
13
|
+
|
|
14
|
+
## Publishing
|
|
15
|
+
|
|
16
|
+
After building your library with `ng build nmce-func`, go to the dist folder `cd dist/nmce-func` and run `npm publish`.
|
|
17
|
+
|
|
18
|
+
## Running unit tests
|
|
19
|
+
|
|
20
|
+
Run `ng test nmce-func` to execute the unit tests via [Karma](https://karma-runner.github.io).
|
|
21
|
+
|
|
22
|
+
## Further help
|
|
23
|
+
|
|
24
|
+
To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI Overview and Command Reference](https://angular.io/cli) page.
|
package/_func/currencyFunc.d.ts
CHANGED
|
@@ -1,20 +1,30 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Currency calculations. Undefined input of number is considered zero, just like null.
|
|
3
|
+
* Simple functions for currency before you decide to use more comprehensive ones:
|
|
4
|
+
* https://github.com/scurker/currency.js
|
|
5
|
+
* https://github.com/dinerojs/dinero.js Up to date and popular
|
|
3
6
|
*/
|
|
4
7
|
export declare class CurrencyFunc {
|
|
5
8
|
private static DECIMAL_SEPARATOR;
|
|
6
9
|
private static THOUSANDS_SEPARATOR;
|
|
7
10
|
private static PADDING;
|
|
8
11
|
/**
|
|
9
|
-
*
|
|
12
|
+
* Banker rounding
|
|
10
13
|
* @param num
|
|
11
|
-
* @param
|
|
14
|
+
* @param decimalPlace default 0
|
|
15
|
+
*/
|
|
16
|
+
static bankerRound(num: number | null | undefined, decimalPlace?: number): number;
|
|
17
|
+
/**
|
|
18
|
+
* Banker rounding to 5 cents
|
|
19
|
+
* @param num
|
|
20
|
+
* @returns
|
|
12
21
|
*/
|
|
13
|
-
static bankerRound(num: number | null | undefined, decimalPlaces?: number): number;
|
|
14
22
|
static bankerRoundTo5cents(num: number | null | undefined): number;
|
|
15
|
-
static ceilTo5cents(num: number | null | undefined): number;
|
|
16
|
-
static transformCurrency(value: number | string | undefined, fractionSize?: number): string;
|
|
17
|
-
static parseCurrency(value: string | undefined, fractionSize?: number): string;
|
|
18
23
|
static pad(num: number | null | undefined, size: number): string;
|
|
24
|
+
/**
|
|
25
|
+
* Sum array of numbers
|
|
26
|
+
* @param ns
|
|
27
|
+
* @returns
|
|
28
|
+
*/
|
|
19
29
|
static sum(ns: (number | null | undefined)[]): number;
|
|
20
30
|
}
|
package/_func/dateFunc.d.ts
CHANGED
|
@@ -1,121 +1,118 @@
|
|
|
1
|
-
import moment from 'moment';
|
|
2
1
|
export declare class DateFunc {
|
|
2
|
+
/**
|
|
3
|
+
* At runtime, there's no simple guarantee that the input is Date. Sometimes you codes expect date, but the response from the Web service may give you string or number.
|
|
4
|
+
* This function give you safe parse of date data from I/O, not of your control.
|
|
5
|
+
* If the data is invalid, throws RangeError or TypeError.
|
|
6
|
+
* @param dt
|
|
7
|
+
* @returns
|
|
8
|
+
*/
|
|
9
|
+
static dateDataToDate(dt: Date | string | number): Date;
|
|
10
|
+
/**
|
|
11
|
+
* Similar to dateDataToDate, but allow null and defined semantically.
|
|
12
|
+
* @param dt
|
|
13
|
+
* @returns
|
|
14
|
+
*/
|
|
15
|
+
static dateDataToDateOrNull(dt: Date | string | number | null | undefined): Date | null | undefined;
|
|
3
16
|
/**
|
|
4
17
|
* Transform UTC DateTime to local date without H, M and S. For example, the month day of 2018-01-23T22:00:00Z is 24 in Australia.
|
|
5
18
|
* @param dtUtc
|
|
6
|
-
* @param offsetMinutes if not defined, it will be new Date().getTimezoneOffset(). //https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getTimezoneOffset
|
|
7
19
|
*/
|
|
8
|
-
static dateTimeUtcToLocalDateNumber(dtUtc: Date | null | undefined): number;
|
|
20
|
+
static dateTimeUtcToLocalDateNumber(dtUtc: Date | string | number | null | undefined): number | null | undefined;
|
|
9
21
|
/**
|
|
10
22
|
* Date only. However, the date may still be in UTC.
|
|
11
23
|
* @param dtUtc
|
|
24
|
+
* @returns new Date object.
|
|
12
25
|
*/
|
|
13
|
-
static dateTimeUtcToLocalDate(dtUtc: Date | null | undefined): Date;
|
|
14
|
-
static localISODateString(dtUtc: Date | null | undefined): string;
|
|
26
|
+
static dateTimeUtcToLocalDate(dtUtc: Date | string | number | null | undefined): Date | null | undefined;
|
|
15
27
|
/**
|
|
16
|
-
*
|
|
17
|
-
* @param
|
|
28
|
+
* '2018-01-23T22:00:00Z' will become '2018-01-24' in Australia.
|
|
29
|
+
* @param dtUtc
|
|
30
|
+
* @returns new Date object.
|
|
18
31
|
*/
|
|
19
|
-
static
|
|
20
|
-
static getTimezoneOffset(): number;
|
|
32
|
+
static localISODateString(dtUtc: Date | string | number | null | undefined): string | null | undefined;
|
|
21
33
|
/**
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
34
|
+
* local date ONLY (no time) to UTC date.
|
|
35
|
+
* The input could be a string of yyyy-MM-dd, or a Date Object.
|
|
36
|
+
* https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date
|
|
37
|
+
* While the time value at the heart of a Date object is UTC, the basic methods to fetch the date and time
|
|
38
|
+
* or its components all work in the local (i.e. host system) time zone and offset.
|
|
39
|
+
* @param dt if dt contain time info, it will become dt.setHours(0, 0, 0, 0)
|
|
25
40
|
*/
|
|
26
|
-
static
|
|
27
|
-
static
|
|
28
|
-
static
|
|
29
|
-
static
|
|
30
|
-
static
|
|
31
|
-
static
|
|
32
|
-
static
|
|
33
|
-
static
|
|
34
|
-
static getStartOfDate(dt: Date | null | undefined): Date;
|
|
35
|
-
static getEndOfToday(): Date;
|
|
41
|
+
static localDateToUtc(d: Date | string | number | null | undefined | string): Date | null | undefined;
|
|
42
|
+
static getEndOfWeek(dt: Date | string | number): Date;
|
|
43
|
+
static getStartOfWeek(dt: Date | string | number): Date;
|
|
44
|
+
static getEndOfMonth(dt: Date | string | number): Date;
|
|
45
|
+
static getStartOfMonth(dt: Date | string | number): Date;
|
|
46
|
+
static getEndOfDate(dt: Date | string | number): Date;
|
|
47
|
+
static getStartOfDate(dt: Date | string | number): Date;
|
|
48
|
+
static getEndOfToday(): Date | null | undefined;
|
|
36
49
|
static getStartOfToday(): Date;
|
|
37
|
-
static
|
|
38
|
-
static
|
|
50
|
+
static getDaysBetween(d1: Date | string | number, d2: Date | string | number): number;
|
|
51
|
+
static addDays(dt: Date | string | number, days: number): Date;
|
|
39
52
|
/**
|
|
40
53
|
* Start of today
|
|
41
54
|
*/
|
|
42
55
|
static get today(): Date;
|
|
43
56
|
static get now(): Date;
|
|
57
|
+
/**
|
|
58
|
+
* From now, next 5 minute mark. For example 2:23:44 will be 2:25:00;
|
|
59
|
+
* @returns
|
|
60
|
+
*/
|
|
44
61
|
static getNext5MinuteMark(): Date;
|
|
45
|
-
static getYMD(d: Date): string;
|
|
46
|
-
static getDMYWithSlash(d: Date): string;
|
|
47
|
-
static getDMYHmWithSlash(d: Date): string;
|
|
48
|
-
static getMcpTime(dt: Date | null | undefined): string;
|
|
62
|
+
static getYMD(d: Date | string | number): string;
|
|
63
|
+
static getDMYWithSlash(d: Date | string | number): string;
|
|
64
|
+
static getDMYHmWithSlash(d: Date | string | number): string;
|
|
49
65
|
/**
|
|
50
|
-
*
|
|
51
|
-
* @param dtUtc
|
|
66
|
+
*
|
|
67
|
+
* @param dtUtc In 24 hour format, and the date separator depending on the system or Luxon default locale
|
|
68
|
+
* @returns
|
|
52
69
|
*/
|
|
53
|
-
static
|
|
70
|
+
static getDateTime24Simple(dtUtc: Date | string | number | null | undefined): string | null | undefined;
|
|
71
|
+
static setDefaultLocale(locale: string): void;
|
|
72
|
+
static getDefaultLocale(): string;
|
|
73
|
+
static setDefaultZone(zone: string): void;
|
|
74
|
+
static getDefaultZone(): string;
|
|
75
|
+
static isZoneValid(): boolean;
|
|
54
76
|
/**
|
|
55
|
-
*
|
|
77
|
+
* For example, in AEST, it is -600.
|
|
78
|
+
* @returns
|
|
56
79
|
*/
|
|
57
|
-
static
|
|
58
|
-
static getDaysBetween(d1?: Date | number | null | undefined, d2?: Date | number | null | undefined): number;
|
|
80
|
+
static getLocalTimezoneOffset(): number;
|
|
59
81
|
/**
|
|
60
82
|
* Get hour of the date. If Date is not defined, the hour will be current hour.
|
|
61
83
|
* @param dtUtc
|
|
62
84
|
*/
|
|
63
|
-
static getHour(dtUtc: Date |
|
|
64
|
-
static getMinute(dtUtc: Date |
|
|
65
|
-
static
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
static
|
|
70
|
-
static
|
|
85
|
+
static getHour(dtUtc: Date | string | number): number;
|
|
86
|
+
static getMinute(dtUtc: Date | string | number): number;
|
|
87
|
+
static GetHM(dtUtc: Date | string | number): {
|
|
88
|
+
h: number;
|
|
89
|
+
m: number;
|
|
90
|
+
};
|
|
91
|
+
static composeDateTime(dt: Date | string | number, h?: number, minute?: number, second?: number): Date;
|
|
92
|
+
static olderThan24Hours(d: Date | string | number): boolean;
|
|
93
|
+
static olderThanHours(d: Date | string | number, hours: number): boolean;
|
|
94
|
+
static olderThanMinutes(d: Date | string | number, minutes: number): boolean;
|
|
71
95
|
/**
|
|
72
96
|
* It could be 11PM yesterday, and 1 AM today. Actually based on local today.
|
|
73
97
|
*/
|
|
74
|
-
static olderThan1Day(dtUtc: Date |
|
|
75
|
-
static getHourAge(d: Date): number;
|
|
76
|
-
static getHourAgeUtc(dtUtc: Date | null | undefined): number;
|
|
98
|
+
static olderThan1Day(dtUtc: Date | string | number): boolean;
|
|
99
|
+
static getHourAge(d: Date | string | number): number;
|
|
77
100
|
/**
|
|
78
|
-
* Compare
|
|
101
|
+
* Compare date with now.
|
|
79
102
|
* @param dtUtc
|
|
80
103
|
*/
|
|
81
|
-
static
|
|
104
|
+
static getDayAge(d: Date | string | number): number;
|
|
82
105
|
/**
|
|
83
106
|
* How many years from now.
|
|
84
107
|
* @param d
|
|
85
108
|
* @returns
|
|
86
109
|
*/
|
|
87
|
-
static getAge(d: Date): number;
|
|
88
|
-
/**
|
|
89
|
-
* Year of date.
|
|
90
|
-
* @param d
|
|
91
|
-
* @returns
|
|
92
|
-
*/
|
|
93
|
-
static getYear(d: Date): number;
|
|
94
|
-
static getUtcNow(): Date;
|
|
95
|
-
static addMinutes(d: Date, m: number): Date;
|
|
96
|
-
static addMonth(d: Date, m: number): Date;
|
|
97
|
-
static getDuration(d1: Date, d2: Date): moment.Duration;
|
|
110
|
+
static getAge(d: Date | string | number): number;
|
|
98
111
|
/**
|
|
99
112
|
* Convert minutes from midnight to HH:mm text
|
|
100
|
-
* @param
|
|
101
|
-
*/
|
|
102
|
-
static getHMFromMins(mins: number): string;
|
|
103
|
-
static getMinutesSinceMidnight(d: Date | null | undefined): number;
|
|
104
|
-
static getMinutesBetween(start: Date | null | undefined, end: Date | null | undefined): number;
|
|
105
|
-
/**
|
|
106
|
-
* Parse json string with date serialized into string, and get proper date object back
|
|
107
|
-
* @param s
|
|
108
|
-
*/
|
|
109
|
-
static dateSafeJsonParse(s: string): any;
|
|
110
|
-
private static dateReviver;
|
|
111
|
-
private static isSerializedDate;
|
|
112
|
-
private static isString;
|
|
113
|
-
static dateSafeParse(s: string | Date): Date;
|
|
114
|
-
static composeDateWithMinutes(d: Date, minute: number): Date;
|
|
115
|
-
/**
|
|
116
|
-
* Safe compare since date data may be considered as string rather than date.
|
|
117
|
-
* @param d1
|
|
118
|
-
* @param d2
|
|
113
|
+
* @param minutes
|
|
119
114
|
*/
|
|
120
|
-
static
|
|
115
|
+
static getHMFromMins(minutes: number): string;
|
|
116
|
+
static getMinutesSinceMidnight(d: Date | string | number): number;
|
|
117
|
+
static getMinutesBetween(start: Date | string | number, end: Date | string | number): number;
|
|
121
118
|
}
|
package/_func/index.d.ts
CHANGED
|
@@ -46,4 +46,4 @@ export class AddressFunc {
|
|
|
46
46
|
return googleBaseUrl + ss;
|
|
47
47
|
}
|
|
48
48
|
}
|
|
49
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
49
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkcmVzc0Z1bmMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9ubWNlLWZ1bmMvc3JjL19mdW5jL2FkZHJlc3NGdW5jLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sT0FBTyxXQUFXO0lBQ3ZCOzs7Ozs7O09BT0c7SUFDSCxNQUFNLENBQUMscUJBQXFCLENBQUMsR0FBdUIsRUFBRSxHQUF1QixFQUFFLElBQXdCLEVBQUUsS0FBeUIsRUFBRSxRQUE0QjtRQUMvSixPQUFPLFdBQVcsQ0FBQyxjQUFjLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUMxRSxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQyxHQUF1QixFQUFFLEdBQXVCLEVBQUUsSUFBd0IsRUFBRSxLQUF5QixFQUFFLFFBQTRCO1FBQ2pLLE9BQU8sV0FBVyxDQUFDLGNBQWMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzFFLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNILE1BQU0sQ0FBQyxjQUFjLENBQUMsR0FBdUIsRUFBRSxHQUF1QixFQUFFLElBQXdCLEVBQUUsS0FBeUIsRUFBRSxRQUE0QixFQUFFLEdBQXVCO1FBQ2pMLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDdkosT0FBTyxDQUFDLENBQUM7SUFDVixDQUFDO0lBRUQsTUFBTSxDQUFDLHNCQUFzQixDQUFDLEdBQXVCLEVBQUUsR0FBdUIsRUFBRSxJQUF3QixFQUFFLEtBQXlCLEVBQUUsT0FBMkI7UUFDL0osTUFBTSxhQUFhLEdBQUcseUNBQXlDLENBQUM7UUFDaEUsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFxQixFQUFVLEVBQUU7WUFDN0MsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUNSLE9BQU8sRUFBRSxDQUFDO1lBQ1gsQ0FBQztZQUVELE9BQU8sR0FBRyxHQUFHLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQzVELENBQUMsQ0FBQztRQUVGLE1BQU0sRUFBRSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdkUsT0FBTyxhQUFhLEdBQUcsRUFBRSxDQUFDO0lBQzNCLENBQUM7Q0FFRCIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjbGFzcyBBZGRyZXNzRnVuYyB7XHJcblx0LyoqXHJcblx0ICogQ29tcG9zZSB0byBvbmUgbGluZSBzZXBhcmF0ZWQgYnkgY29tbWFcclxuXHQgKiBAcGFyYW0gc3QxXHJcblx0ICogQHBhcmFtIHN0MlxyXG5cdCAqIEBwYXJhbSBjaXR5XHJcblx0ICogQHBhcmFtIHN0YXRlXHJcblx0ICogQHBhcmFtIHBvc3Rjb2RlXHJcblx0ICovXHJcblx0c3RhdGljIGNvbXBvc2VPbmVMaW5lQWRkcmVzcyhzdDE6IHN0cmluZyB8IHVuZGVmaW5lZCwgc3QyOiBzdHJpbmcgfCB1bmRlZmluZWQsIGNpdHk6IHN0cmluZyB8IHVuZGVmaW5lZCwgc3RhdGU6IHN0cmluZyB8IHVuZGVmaW5lZCwgcG9zdGNvZGU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XHJcblx0XHRyZXR1cm4gQWRkcmVzc0Z1bmMuY29tcG9zZUFkZHJlc3Moc3QxLCBzdDIsIGNpdHksIHN0YXRlLCBwb3N0Y29kZSwgJywgJyk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb21wb3NlIHRvIG11bHRpcGxlIHNlcGFyYXRlZCBieSBcXG5cclxuXHQgKiBAcGFyYW0gc3QxXHJcblx0ICogQHBhcmFtIHN0MlxyXG5cdCAqIEBwYXJhbSBjaXR5XHJcblx0ICogQHBhcmFtIHN0YXRlXHJcblx0ICogQHBhcmFtIHBvc3Rjb2RlXHJcblx0ICovXHJcblx0c3RhdGljIGNvbXBvc2VNdWx0aUxpbmVBZGRyZXNzKHN0MTogc3RyaW5nIHwgdW5kZWZpbmVkLCBzdDI6IHN0cmluZyB8IHVuZGVmaW5lZCwgY2l0eTogc3RyaW5nIHwgdW5kZWZpbmVkLCBzdGF0ZTogc3RyaW5nIHwgdW5kZWZpbmVkLCBwb3N0Y29kZTogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcclxuXHRcdHJldHVybiBBZGRyZXNzRnVuYy5jb21wb3NlQWRkcmVzcyhzdDEsIHN0MiwgY2l0eSwgc3RhdGUsIHBvc3Rjb2RlLCAnXFxuJyk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb21wb3NlIHdpdGggc2VwYXJhdG9yXHJcblx0ICogQHBhcmFtIHN0MVxyXG5cdCAqIEBwYXJhbSBzdDJcclxuXHQgKiBAcGFyYW0gY2l0eVxyXG5cdCAqIEBwYXJhbSBzdGF0ZVxyXG5cdCAqIEBwYXJhbSBwb3N0Y29kZVxyXG5cdCAqIEBwYXJhbSBzZXBcclxuXHQgKi9cclxuXHRzdGF0aWMgY29tcG9zZUFkZHJlc3Moc3QxOiBzdHJpbmcgfCB1bmRlZmluZWQsIHN0Mjogc3RyaW5nIHwgdW5kZWZpbmVkLCBjaXR5OiBzdHJpbmcgfCB1bmRlZmluZWQsIHN0YXRlOiBzdHJpbmcgfCB1bmRlZmluZWQsIHBvc3Rjb2RlOiBzdHJpbmcgfCB1bmRlZmluZWQsIHNlcDogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcclxuXHRcdGNvbnN0IHIgPSAoc3QxID8gKHN0MSArIHNlcCkgOiAnJykgKyAoc3QyID8gKHN0MiArIHNlcCkgOiAnJykgKyAoY2l0eSA/IChjaXR5ICsgc2VwKSA6ICcnKSArIChzdGF0ZSA/IChzdGF0ZSArICcgJykgOiAnJykgKyAocG9zdGNvZGUgPyBwb3N0Y29kZSA6ICcnKTtcclxuXHRcdHJldHVybiByO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGNvbXBvc2VHb29nbGVNYXBzQXVVcmwoc3QxOiBzdHJpbmcgfCB1bmRlZmluZWQsIHN0Mjogc3RyaW5nIHwgdW5kZWZpbmVkLCBjaXR5OiBzdHJpbmcgfCB1bmRlZmluZWQsIHN0YXRlOiBzdHJpbmcgfCB1bmRlZmluZWQsIGNvdW50cnk6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XHJcblx0XHRjb25zdCBnb29nbGVCYXNlVXJsID0gJ2h0dHBzOi8vd3d3Lmdvb2dsZS5jb20uYXUvbWFwcz9obD1lbiZxPSc7XHJcblx0XHRjb25zdCBmZmYgPSAoczogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nID0+IHtcclxuXHRcdFx0aWYgKCFzKSB7XHJcblx0XHRcdFx0cmV0dXJuICcnO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZXR1cm4gJysnICsgZW5jb2RlVVJJQ29tcG9uZW50KHMucmVwbGFjZSgnICcsICcrJykpICsgJywnO1xyXG5cdFx0fTtcclxuXHJcblx0XHRjb25zdCBzcyA9IGZmZihzdDEpICsgZmZmKHN0MikgKyBmZmYoY2l0eSkgKyBmZmYoc3RhdGUpICsgZmZmKGNvdW50cnkpO1xyXG5cdFx0cmV0dXJuIGdvb2dsZUJhc2VVcmwgKyBzcztcclxuXHR9XHJcblxyXG59XHJcbiJdfQ==
|
|
@@ -1,20 +1,23 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Currency calculations. Undefined input of number is considered zero, just like null.
|
|
3
|
+
* Simple functions for currency before you decide to use more comprehensive ones:
|
|
4
|
+
* https://github.com/scurker/currency.js
|
|
5
|
+
* https://github.com/dinerojs/dinero.js Up to date and popular
|
|
3
6
|
*/
|
|
4
7
|
export class CurrencyFunc {
|
|
5
8
|
static DECIMAL_SEPARATOR = '.';
|
|
6
9
|
static THOUSANDS_SEPARATOR = ',';
|
|
7
10
|
static PADDING = '000000';
|
|
8
11
|
/**
|
|
9
|
-
*
|
|
12
|
+
* Banker rounding
|
|
10
13
|
* @param num
|
|
11
|
-
* @param
|
|
14
|
+
* @param decimalPlace default 0
|
|
12
15
|
*/
|
|
13
|
-
static bankerRound(num,
|
|
16
|
+
static bankerRound(num, decimalPlace) {
|
|
14
17
|
if (!num) {
|
|
15
18
|
return 0;
|
|
16
19
|
}
|
|
17
|
-
const d =
|
|
20
|
+
const d = decimalPlace || 0;
|
|
18
21
|
const m = Math.pow(10, d);
|
|
19
22
|
const n = +(d ? num * m : num).toFixed(8); // Avoid rounding errors
|
|
20
23
|
const i = Math.floor(n), f = n - i;
|
|
@@ -22,51 +25,60 @@ export class CurrencyFunc {
|
|
|
22
25
|
const r = (f > 0.5 - e && f < 0.5 + e) ?
|
|
23
26
|
((i % 2 === 0) ? i : i + 1) : Math.round(n);
|
|
24
27
|
return d ? r / m : r;
|
|
28
|
+
// http://stackoverflow.com/questions/3108986/gaussian-bankers-rounding-in-javascript
|
|
25
29
|
}
|
|
30
|
+
/**
|
|
31
|
+
* Banker rounding to 5 cents
|
|
32
|
+
* @param num
|
|
33
|
+
* @returns
|
|
34
|
+
*/
|
|
26
35
|
static bankerRoundTo5cents(num) {
|
|
27
36
|
if (!num) {
|
|
28
37
|
return 0;
|
|
29
38
|
}
|
|
30
|
-
const r = this.bankerRound(Math.
|
|
39
|
+
const r = this.bankerRound(Math.round(num / 0.05) * 0.05, 2);
|
|
31
40
|
return r;
|
|
32
41
|
}
|
|
33
|
-
static
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
}
|
|
50
|
-
static parseCurrency(value, fractionSize = 2) {
|
|
51
|
-
let [integer, fraction = ''] = (value || '').split(this.DECIMAL_SEPARATOR);
|
|
52
|
-
integer = integer.replace(new RegExp(this.THOUSANDS_SEPARATOR, 'g'), '');
|
|
53
|
-
fraction = parseInt(fraction, 10) > 0 && fractionSize > 0
|
|
54
|
-
? this.DECIMAL_SEPARATOR + (fraction + this.PADDING).substring(0, fractionSize)
|
|
55
|
-
: '';
|
|
56
|
-
return integer + fraction;
|
|
57
|
-
}
|
|
42
|
+
// static transformCurrency(value: number | string | undefined, fractionSize: number = 2): string { In favour of dinerojs
|
|
43
|
+
// let [integer, fraction = ''] = (value || '').toString()
|
|
44
|
+
// .split(this.DECIMAL_SEPARATOR);
|
|
45
|
+
// fraction = fractionSize > 0
|
|
46
|
+
// ? this.DECIMAL_SEPARATOR + (fraction + this.PADDING).substring(0, fractionSize)
|
|
47
|
+
// : '';
|
|
48
|
+
// integer = integer.replace(/\B(?=(\d{3})+(?!\d))/g, this.THOUSANDS_SEPARATOR);
|
|
49
|
+
// return integer + fraction;
|
|
50
|
+
// }
|
|
51
|
+
// static parseCurrency(value: string | undefined, fractionSize: number = 2): string {
|
|
52
|
+
// let [integer, fraction = ''] = (value || '').split(this.DECIMAL_SEPARATOR);
|
|
53
|
+
// integer = integer.replace(new RegExp(this.THOUSANDS_SEPARATOR, 'g'), '');
|
|
54
|
+
// fraction = parseInt(fraction, 10) > 0 && fractionSize > 0
|
|
55
|
+
// ? this.DECIMAL_SEPARATOR + (fraction + this.PADDING).substring(0, fractionSize)
|
|
56
|
+
// : '';
|
|
57
|
+
// return integer + fraction;
|
|
58
|
+
// }
|
|
58
59
|
//http://stackoverflow.com/questions/2998784/how-to-output-integers-with-leading-zeros-in-javascript
|
|
59
60
|
static pad(num, size) {
|
|
60
|
-
num
|
|
61
|
-
|
|
61
|
+
if (num == null) {
|
|
62
|
+
return '';
|
|
63
|
+
}
|
|
64
|
+
if (num === 0) {
|
|
65
|
+
return '0';
|
|
66
|
+
}
|
|
67
|
+
const numText = num.toString();
|
|
68
|
+
let s = numText + '';
|
|
62
69
|
while (s.length < size) {
|
|
63
70
|
s = '0' + s;
|
|
64
71
|
}
|
|
65
72
|
return s;
|
|
66
73
|
}
|
|
74
|
+
/**
|
|
75
|
+
* Sum array of numbers
|
|
76
|
+
* @param ns
|
|
77
|
+
* @returns
|
|
78
|
+
*/
|
|
67
79
|
static sum(ns) {
|
|
68
80
|
const r = ns.reduce((a, b) => (a ?? 0) + (b ?? 0), 0);
|
|
69
81
|
return r;
|
|
70
82
|
}
|
|
71
83
|
}
|
|
72
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
84
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VycmVuY3lGdW5jLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbm1jZS1mdW5jL3NyYy9fZnVuYy9jdXJyZW5jeUZ1bmMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7O0dBS0c7QUFDSCxNQUFNLE9BQU8sWUFBWTtJQUNoQixNQUFNLENBQUMsaUJBQWlCLEdBQUcsR0FBRyxDQUFDO0lBQy9CLE1BQU0sQ0FBQyxtQkFBbUIsR0FBRyxHQUFHLENBQUM7SUFFakMsTUFBTSxDQUFDLE9BQU8sR0FBRyxRQUFRLENBQUM7SUFFbEM7Ozs7T0FJRztJQUNILE1BQU0sQ0FBQyxXQUFXLENBQUMsR0FBOEIsRUFBRSxZQUFxQjtRQUN2RSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDVixPQUFPLENBQUMsQ0FBQztRQUNWLENBQUM7UUFFRCxNQUFNLENBQUMsR0FBRyxZQUFZLElBQUksQ0FBQyxDQUFDO1FBQzVCLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzFCLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLHdCQUF3QjtRQUNuRSxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ25DLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLGlDQUFpQztRQUNqRCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN2QyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0MsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNyQixxRkFBcUY7SUFDdEYsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxNQUFNLENBQUMsbUJBQW1CLENBQUMsR0FBOEI7UUFDeEQsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ1YsT0FBTyxDQUFDLENBQUM7UUFDVixDQUFDO1FBRUQsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDN0QsT0FBTyxDQUFDLENBQUM7SUFDVixDQUFDO0lBRUQseUhBQXlIO0lBQ3pILDJEQUEyRDtJQUMzRCxvQ0FBb0M7SUFFcEMsK0JBQStCO0lBQy9CLG9GQUFvRjtJQUNwRixVQUFVO0lBRVYsaUZBQWlGO0lBRWpGLDhCQUE4QjtJQUM5QixJQUFJO0lBRUosc0ZBQXNGO0lBQ3RGLCtFQUErRTtJQUUvRSw2RUFBNkU7SUFFN0UsNkRBQTZEO0lBQzdELG9GQUFvRjtJQUNwRixVQUFVO0lBRVYsOEJBQThCO0lBQzlCLElBQUk7SUFHSixvR0FBb0c7SUFDcEcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUE4QixFQUFFLElBQVk7UUFDdEQsSUFBSSxHQUFHLElBQUksSUFBSSxFQUFDLENBQUM7WUFDZixPQUFPLEVBQUUsQ0FBQztRQUNaLENBQUM7UUFFRCxJQUFJLEdBQUcsS0FBSSxDQUFDLEVBQUMsQ0FBQztZQUNiLE9BQU8sR0FBRyxDQUFDO1FBQ1osQ0FBQztRQUVELE1BQU0sT0FBTyxHQUFHLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUMvQixJQUFJLENBQUMsR0FBRyxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ3JCLE9BQU8sQ0FBQyxDQUFDLE1BQU0sR0FBRyxJQUFJLEVBQUUsQ0FBQztZQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO1FBQUMsQ0FBQztRQUN4QyxPQUFPLENBQUMsQ0FBQztJQUNWLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFpQztRQUMzQyxNQUFNLENBQUMsR0FBVyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDOUQsT0FBTyxDQUFDLENBQUM7SUFDVixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXHJcbiAqIEN1cnJlbmN5IGNhbGN1bGF0aW9ucy4gVW5kZWZpbmVkIGlucHV0IG9mIG51bWJlciBpcyBjb25zaWRlcmVkIHplcm8sIGp1c3QgbGlrZSBudWxsLlxyXG4gKiBTaW1wbGUgZnVuY3Rpb25zIGZvciBjdXJyZW5jeSBiZWZvcmUgeW91IGRlY2lkZSB0byB1c2UgbW9yZSBjb21wcmVoZW5zaXZlIG9uZXM6XHJcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9zY3Vya2VyL2N1cnJlbmN5LmpzXHJcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9kaW5lcm9qcy9kaW5lcm8uanMgVXAgdG8gZGF0ZSBhbmQgcG9wdWxhclxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIEN1cnJlbmN5RnVuYyB7XHJcblx0cHJpdmF0ZSBzdGF0aWMgREVDSU1BTF9TRVBBUkFUT1IgPSAnLic7XHJcblx0cHJpdmF0ZSBzdGF0aWMgVEhPVVNBTkRTX1NFUEFSQVRPUiA9ICcsJztcclxuXHJcblx0cHJpdmF0ZSBzdGF0aWMgUEFERElORyA9ICcwMDAwMDAnO1xyXG5cclxuXHQvKipcclxuXHQgKiBCYW5rZXIgcm91bmRpbmdcclxuXHQgKiBAcGFyYW0gbnVtXHJcblx0ICogQHBhcmFtIGRlY2ltYWxQbGFjZSBkZWZhdWx0IDBcclxuXHQgKi9cclxuXHRzdGF0aWMgYmFua2VyUm91bmQobnVtOiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkLCBkZWNpbWFsUGxhY2U/OiBudW1iZXIpOiBudW1iZXIge1xyXG5cdFx0aWYgKCFudW0pIHtcclxuXHRcdFx0cmV0dXJuIDA7XHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgZCA9IGRlY2ltYWxQbGFjZSB8fCAwO1xyXG5cdFx0Y29uc3QgbSA9IE1hdGgucG93KDEwLCBkKTtcclxuXHRcdGNvbnN0IG4gPSArKGQgPyBudW0gKiBtIDogbnVtKS50b0ZpeGVkKDgpOyAvLyBBdm9pZCByb3VuZGluZyBlcnJvcnNcclxuXHRcdGNvbnN0IGkgPSBNYXRoLmZsb29yKG4pLCBmID0gbiAtIGk7XHJcblx0XHRjb25zdCBlID0gMWUtODsgLy8gQWxsb3cgZm9yIHJvdW5kaW5nIGVycm9ycyBpbiBmXHJcblx0XHRjb25zdCByID0gKGYgPiAwLjUgLSBlICYmIGYgPCAwLjUgKyBlKSA/XHJcblx0XHRcdCgoaSAlIDIgPT09IDApID8gaSA6IGkgKyAxKSA6IE1hdGgucm91bmQobik7XHJcblx0XHRyZXR1cm4gZCA/IHIgLyBtIDogcjtcclxuXHRcdC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMzEwODk4Ni9nYXVzc2lhbi1iYW5rZXJzLXJvdW5kaW5nLWluLWphdmFzY3JpcHRcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEJhbmtlciByb3VuZGluZyB0byA1IGNlbnRzXHJcblx0ICogQHBhcmFtIG51bSBcclxuXHQgKiBAcmV0dXJucyBcclxuXHQgKi9cclxuXHRzdGF0aWMgYmFua2VyUm91bmRUbzVjZW50cyhudW06IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQpOiBudW1iZXIge1xyXG5cdFx0aWYgKCFudW0pIHtcclxuXHRcdFx0cmV0dXJuIDA7XHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgciA9IHRoaXMuYmFua2VyUm91bmQoTWF0aC5yb3VuZChudW0gLyAwLjA1KSAqIDAuMDUsIDIpO1xyXG5cdFx0cmV0dXJuIHI7XHJcblx0fVxyXG5cclxuXHQvLyBzdGF0aWMgdHJhbnNmb3JtQ3VycmVuY3kodmFsdWU6IG51bWJlciB8IHN0cmluZyB8IHVuZGVmaW5lZCwgZnJhY3Rpb25TaXplOiBudW1iZXIgPSAyKTogc3RyaW5nIHsgSW4gZmF2b3VyIG9mIGRpbmVyb2pzXHJcblx0Ly8gXHRsZXQgW2ludGVnZXIsIGZyYWN0aW9uID0gJyddID0gKHZhbHVlIHx8ICcnKS50b1N0cmluZygpXHJcblx0Ly8gXHRcdC5zcGxpdCh0aGlzLkRFQ0lNQUxfU0VQQVJBVE9SKTtcclxuXHJcblx0Ly8gXHRmcmFjdGlvbiA9IGZyYWN0aW9uU2l6ZSA+IDBcclxuXHQvLyBcdFx0PyB0aGlzLkRFQ0lNQUxfU0VQQVJBVE9SICsgKGZyYWN0aW9uICsgdGhpcy5QQURESU5HKS5zdWJzdHJpbmcoMCwgZnJhY3Rpb25TaXplKVxyXG5cdC8vIFx0XHQ6ICcnO1xyXG5cclxuXHQvLyBcdGludGVnZXIgPSBpbnRlZ2VyLnJlcGxhY2UoL1xcQig/PShcXGR7M30pKyg/IVxcZCkpL2csIHRoaXMuVEhPVVNBTkRTX1NFUEFSQVRPUik7XHJcblxyXG5cdC8vIFx0cmV0dXJuIGludGVnZXIgKyBmcmFjdGlvbjtcclxuXHQvLyB9XHJcblxyXG5cdC8vIHN0YXRpYyBwYXJzZUN1cnJlbmN5KHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQsIGZyYWN0aW9uU2l6ZTogbnVtYmVyID0gMik6IHN0cmluZyB7XHJcblx0Ly8gXHRsZXQgW2ludGVnZXIsIGZyYWN0aW9uID0gJyddID0gKHZhbHVlIHx8ICcnKS5zcGxpdCh0aGlzLkRFQ0lNQUxfU0VQQVJBVE9SKTtcclxuXHJcblx0Ly8gXHRpbnRlZ2VyID0gaW50ZWdlci5yZXBsYWNlKG5ldyBSZWdFeHAodGhpcy5USE9VU0FORFNfU0VQQVJBVE9SLCAnZycpLCAnJyk7XHJcblxyXG5cdC8vIFx0ZnJhY3Rpb24gPSBwYXJzZUludChmcmFjdGlvbiwgMTApID4gMCAmJiBmcmFjdGlvblNpemUgPiAwXHJcblx0Ly8gXHRcdD8gdGhpcy5ERUNJTUFMX1NFUEFSQVRPUiArIChmcmFjdGlvbiArIHRoaXMuUEFERElORykuc3Vic3RyaW5nKDAsIGZyYWN0aW9uU2l6ZSlcclxuXHQvLyBcdFx0OiAnJztcclxuXHJcblx0Ly8gXHRyZXR1cm4gaW50ZWdlciArIGZyYWN0aW9uO1xyXG5cdC8vIH1cclxuXHJcblxyXG5cdC8vaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8yOTk4Nzg0L2hvdy10by1vdXRwdXQtaW50ZWdlcnMtd2l0aC1sZWFkaW5nLXplcm9zLWluLWphdmFzY3JpcHRcclxuXHRzdGF0aWMgcGFkKG51bTogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCwgc2l6ZTogbnVtYmVyKTogc3RyaW5nIHtcclxuXHRcdGlmIChudW0gPT0gbnVsbCl7XHJcblx0XHRcdCByZXR1cm4gJyc7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKG51bSA9PT0wKXtcclxuXHRcdFx0cmV0dXJuICcwJztcclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBudW1UZXh0ID0gbnVtLnRvU3RyaW5nKCk7XHJcblx0XHRsZXQgcyA9IG51bVRleHQgKyAnJztcclxuXHRcdHdoaWxlIChzLmxlbmd0aCA8IHNpemUpIHsgcyA9ICcwJyArIHM7IH1cclxuXHRcdHJldHVybiBzO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU3VtIGFycmF5IG9mIG51bWJlcnNcclxuXHQgKiBAcGFyYW0gbnMgXHJcblx0ICogQHJldHVybnMgXHJcblx0ICovXHJcblx0c3RhdGljIHN1bShuczogKG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQpW10pOiBudW1iZXIge1xyXG5cdFx0Y29uc3QgciA9IDxudW1iZXI+bnMucmVkdWNlKChhLCBiKSA9PiAoYSA/PyAwKSArIChiID8/IDApLCAwKTtcclxuXHRcdHJldHVybiByO1xyXG5cdH1cclxuXHJcbn1cclxuIl19
|