@sot1986/appsync-precognition 0.0.2 → 0.0.4
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/dist/index.d.ts +13 -28
- package/dist/index.js +204 -64
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -1,45 +1,30 @@
|
|
|
1
1
|
import { Context } from "@aws-appsync/utils";
|
|
2
2
|
|
|
3
|
-
//#region rolldown:runtime
|
|
4
|
-
//#endregion
|
|
5
3
|
//#region src/types.d.ts
|
|
6
4
|
interface Rule<T = unknown> {
|
|
7
5
|
check: boolean;
|
|
8
6
|
message: string;
|
|
9
7
|
value: T;
|
|
10
8
|
}
|
|
11
|
-
type
|
|
9
|
+
type FullRule = "required" | "nullable" | "sometimes" | "number" | "boolean" | "string" | "array" | "object" | "date" | ["min", number] | ["max", number] | ["between", number, number] | "email" | "url" | "uuid" | "ulid" | ["regex", string] | ["in", ...(string | number | boolean | null)[]] | ["notIn", ...(string | number | boolean | null)[]] | ["after", string] | ["before", string] | ["afterOrEqual", string] | ["beforeOrEqual", string];
|
|
12
10
|
type ArrayKeys<T extends unknown[]> = T extends [unknown, ...unknown[]] ? T extends Record<infer Index, unknown> ? Index extends `${number}` ? Index : never : never : `${number}`;
|
|
13
11
|
type ObjectKeys<T extends object> = T extends unknown[] ? ArrayKeys<T> : keyof T & string;
|
|
14
12
|
interface HasConstructor {
|
|
15
13
|
new (...args: unknown[]): unknown;
|
|
16
14
|
}
|
|
17
15
|
type NestedKeyOf<T> = T extends Record<infer Key, unknown> ? T extends HasConstructor ? never : T extends CallableFunction ? never : Key extends string | number ? (ObjectKeys<T> | (T[Key] extends object ? `${ObjectKeys<Pick<T, Key>>}.${NestedKeyOf<T[Key]>}` : T extends unknown[] ? T extends [unknown, ...unknown[]] ? never : T[number] extends object ? `${number}.${NestedKeyOf<T[number]>}` : never : never)) : never : never;
|
|
18
|
-
declare namespace rules_d_exports {
|
|
19
|
-
export { names, parse, requiredRule };
|
|
20
|
-
}
|
|
21
|
-
declare const names: {
|
|
22
|
-
readonly required: "required";
|
|
23
|
-
readonly nullable: "nullable";
|
|
24
|
-
readonly sometimes: "sometimes";
|
|
25
|
-
readonly min: "min";
|
|
26
|
-
readonly max: "max";
|
|
27
|
-
readonly between: "between";
|
|
28
|
-
readonly email: "email";
|
|
29
|
-
readonly url: "url";
|
|
30
|
-
readonly uuid: "uuid";
|
|
31
|
-
readonly regex: "regex";
|
|
32
|
-
readonly in: "in";
|
|
33
|
-
readonly notIn: "notIn";
|
|
34
|
-
readonly before: "before";
|
|
35
|
-
readonly after: "after";
|
|
36
|
-
};
|
|
37
|
-
declare function parse<T>(value: T, rule: ShortRule<keyof typeof names>): Rule<T>;
|
|
38
|
-
declare function requiredRule<T>(value: T, ..._params: string[]): Rule<T>;
|
|
39
16
|
//#endregion
|
|
40
17
|
//#region src/index.d.ts
|
|
41
|
-
declare function validate<T extends object>(obj: T, checks: Partial<Record<NestedKeyOf<T>, (
|
|
42
|
-
|
|
18
|
+
declare function validate<T extends object>(obj: T, checks: Partial<Record<NestedKeyOf<T>, (FullRule | Rule)[]>>, options?: {
|
|
19
|
+
trim?: boolean;
|
|
20
|
+
allowEmptyString?: boolean;
|
|
21
|
+
}): T;
|
|
22
|
+
declare function precognitiveValidation<T extends object>(ctx: Context<T>, checks: Partial<Record<NestedKeyOf<T>, (FullRule | Rule)[]>>, options?: {
|
|
23
|
+
trim?: boolean;
|
|
24
|
+
allowEmptyString?: boolean;
|
|
25
|
+
skipTo?: "END" | "NEXT";
|
|
26
|
+
}): T;
|
|
27
|
+
declare function formatAttributeName(path: string): string;
|
|
43
28
|
//#endregion
|
|
44
|
-
export {
|
|
45
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,
|
|
29
|
+
export { formatAttributeName, precognitiveValidation, validate };
|
|
30
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi9zcmMvdHlwZXMudHMiLCIuLi9zcmMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOltdLCJtYXBwaW5ncyI6Ijs7O1VBRWlCOztFQUFqQixPQUFpQixFQUFBLE1BQUE7RUFNakIsS0FBWSxFQUhILENBR0c7QUF1Qkw7QUFHSCxLQTFCUSxRQUFBLEdBMEJSLFVBQUEsR0FBQSxVQUFBLEdBQUEsV0FBQSxHQUFBLFFBQUEsR0FBQSxTQUFBLEdBQUEsUUFBQSxHQUFBLE9BQUEsR0FBQSxRQUFBLEdBQUEsTUFBQSxHQUFBLENBQUEsS0FBQSxFQUFBLE1BQUEsQ0FBQSxHQUFBLENBQUEsS0FBQSxFQUFBLE1BQUEsQ0FBQSxHQUFBLENBQUEsU0FBQSxFQUFBLE1BQUEsRUFBQSxNQUFBLENBQUEsR0FBQSxPQUFBLEdBQUEsS0FBQSxHQUFBLE1BQUEsR0FBQSxNQUFBLEdBQUEsQ0FBQSxPQUFBLEVBQUEsTUFBQSxDQUFBLEdBQUEsQ0FBQSxJQUFBLEVBQUEsR0FBQSxDQUFBLE1BQUEsR0FBQSxNQUFBLEdBQUEsT0FBQSxHQUFBLElBQUEsQ0FBQSxFQUFBLENBQUEsR0FBQSxDQUFBLE9BQUEsRUFBQSxHQUFBLENBQUEsTUFBQSxHQUFBLE1BQUEsR0FBQSxPQUFBLEdBQUEsSUFBQSxDQUFBLEVBQUEsQ0FBQSxHQUFBLENBQUEsT0FBQSxFQUFBLE1BQUEsQ0FBQSxHQUFBLENBQUEsUUFBQSxFQUFBLE1BQUEsQ0FBQSxHQUFBLENBQUEsY0FBQSxFQUFBLE1BQUEsQ0FBQSxHQUFBLENBQUEsZUFBQSxFQUFBLE1BQUEsQ0FBQTtLQURDLFNBRUMsQ0FBQSxVQUFBLE9BQUEsRUFBQSxDQUFBLEdBREYsQ0FDRSxTQUFBLENBQUEsT0FBQSxFQUFBLEdBQUEsT0FBQSxFQUFBLENBQUEsR0FBQSxDQUFBLFNBQVUsTUFBVixDQUFBLEtBQUEsTUFBQSxFQUFBLE9BQUEsQ0FBQSxHQUFBLEtBQUEsU0FBQSxHQUFBLE1BQUEsRUFBQSxHQUFBLEtBQUEsR0FBQSxLQUFBLEdBQUEsS0FBQSxHQUFBLEdBQUEsTUFBQSxFQUFBO0tBT0QsVUFQVyxDQUFBLFVBQUEsTUFBQSxDQUFBLEdBUVosQ0FSWSxTQUFBLE9BQUEsRUFBQSxHQVNWLFNBVFUsQ0FTQSxDQVRBLENBQUEsR0FBQSxNQVVKLENBVkksR0FBQSxNQUFBO1VBWU4sY0FBQSxDQVpNO0VBQUEsS0FPWCxHQUFBLElBQUEsRUFBQSxPQUFBLEVBQUEsQ0FBQSxFQUFBLE9BQUE7O0FBRVcsS0FPSixXQVBJLENBQUEsQ0FBQSxDQUFBLEdBT2EsQ0FQYixTQU91QixNQVB2QixDQUFBLEtBQUEsSUFBQSxFQUFBLE9BQUEsQ0FBQSxHQVFaLENBUlksU0FRRixjQVJFLEdBQUEsS0FBQSxHQVVWLENBVlUsU0FVQSxnQkFWQSxHQUFBLEtBQUEsR0FBQSxHQUFBLFNBQUEsTUFBQSxHQUFBLE1BQUEsR0FBQSxDQWFMLFVBYkssQ0FhTSxDQWJOLENBQUEsR0FBQSxDQWFZLENBYlosQ0FhYyxHQWJkLENBQUEsU0FBQSxNQUFBLEdBQUEsR0FjQyxVQWRELENBY1ksSUFkWixDQWNpQixDQWRqQixFQWNvQixHQWRwQixDQUFBLENBQUEsSUFjNkIsV0FkN0IsQ0FjeUMsQ0FkekMsQ0FjMkMsR0FkM0MsQ0FBQSxDQUFBLEVBQUEsR0FlRixDQWZFLFNBQUEsT0FBQSxFQUFBLEdBZ0JBLENBaEJBLFNBQUEsQ0FBQSxPQUFBLEVBQUEsR0FBQSxPQUFBLEVBQUEsQ0FBQSxHQUFBLEtBQUEsR0FrQkUsQ0FsQkYsQ0FBQSxNQUFBLENBQUEsU0FBQSxNQUFBLEdBQUEsR0FBQSxNQUFBLElBbUJpQixXQW5CakIsQ0FtQjZCLENBbkI3QixDQUFBLE1BQUEsQ0FBQSxDQUFBLEVBQUEsR0FBQSxLQUFBLEdBQUEsS0FBQSxDQUFBLENBQUEsR0FBQSxLQUFBLEdBQUEsS0FBQTs7O2lCQ3RDQSxnQ0FDVCxXQUNHLFFBQVEsT0FBTyxZQUFZLEtBQUssV0FBVyxrQkR1QjlDO0VBN0JQLElBQWlCLENBQUEsRUFBQSxPQUFBO0VBTWpCLGdCQUFZLENBQUEsRUFBQSxPQUFBO0FBdUJMLENBQUEsQ0FBQSxFQ2xCSixDRG9CRTtBQUNELGlCQzhCWSxzQkQ5QlosQ0FBQSxVQUFBLE1BQUEsQ0FBQSxDQUFBLEdBQUEsRUMrQkcsT0QvQkgsQ0MrQlcsQ0QvQlgsQ0FBQSxFQUFBLE1BQUEsRUNnQ00sT0RoQ04sQ0NnQ2MsTURoQ2QsQ0NnQ3FCLFdEaENyQixDQ2dDaUMsQ0RoQ2pDLENBQUEsRUFBQSxDQ2dDc0MsUURoQ3RDLEdDZ0NpRCxJRGhDakQsQ0FBQSxFQUFBLENBQUEsQ0FBQSxFQUFBLE9BQ1ksQ0FEWixFQUFBO0VBQ0UsSUFBQSxDQUFBLEVBQUEsT0FBQTtFQUFVLGdCQUFBLENBQUEsRUFBQSxPQUFBO0VBQUEsTUFBQSxDQUFBLEVBQUEsS0FBQSxHQUFBLE1BQUE7QUFBQSxDQUFBLENBQUEsRUNxQ2IsQ0Q5QkU7QUFDRCxpQkNxRFksbUJBQUEsQ0RyRFosSUFBQSxFQUFBLE1BQUEsQ0FBQSxFQUFBLE1BQUEifQ==
|
package/dist/index.js
CHANGED
|
@@ -28,8 +28,10 @@ function precognitiveKeys(ctx) {
|
|
|
28
28
|
const keys = getHeader("Precognition-Validate-Only", ctx);
|
|
29
29
|
return keys ? keys.split(",").map((key) => key.trim()) : null;
|
|
30
30
|
}
|
|
31
|
-
function cleanString(value) {
|
|
31
|
+
function cleanString(value, options) {
|
|
32
|
+
if (options?.trim === false) return value;
|
|
32
33
|
let parsed = value.trim();
|
|
34
|
+
if (options?.allowEmptyString) return parsed;
|
|
33
35
|
if (parsed === "") parsed = null;
|
|
34
36
|
return parsed;
|
|
35
37
|
}
|
|
@@ -37,51 +39,61 @@ function cleanString(value) {
|
|
|
37
39
|
//#endregion
|
|
38
40
|
//#region src/rules.ts
|
|
39
41
|
function parse(value, rule) {
|
|
40
|
-
const [
|
|
41
|
-
switch (
|
|
42
|
+
const [name, ...params] = typeof rule === "string" ? [rule, void 0] : [rule[0], ...rule.slice(1)];
|
|
43
|
+
switch (name) {
|
|
42
44
|
case "required": return requiredRule(value);
|
|
43
45
|
case "nullable": return nullableRule(value);
|
|
44
46
|
case "sometimes": return sometimesRule(value);
|
|
45
|
-
case "min": return minRule(value,
|
|
46
|
-
case "max": return maxRule(value,
|
|
47
|
-
case "between": return betweenRule(value,
|
|
47
|
+
case "min": return minRule(value, params[0]);
|
|
48
|
+
case "max": return maxRule(value, params[0]);
|
|
49
|
+
case "between": return betweenRule(value, params[0], params[1]);
|
|
48
50
|
case "email": return emailRule(value);
|
|
49
51
|
case "url": return urlRule(value);
|
|
50
52
|
case "uuid": return uuidRule(value);
|
|
51
|
-
case "
|
|
52
|
-
case "
|
|
53
|
+
case "ulid": return ulidRule(value);
|
|
54
|
+
case "regex": return regexRule(value, params[0]);
|
|
55
|
+
case "in": return inRule(value, ...params);
|
|
56
|
+
case "notIn": return notInRule(value, ...params);
|
|
57
|
+
case "array": return arrayRule(value);
|
|
58
|
+
case "object": return objectRule(value);
|
|
59
|
+
case "boolean": return booleanRule(value);
|
|
60
|
+
case "number": return numberRule(value);
|
|
61
|
+
case "string": return stringRule(value);
|
|
62
|
+
case "date": return dateRule(value);
|
|
63
|
+
case "before": return beforeRule(value, params[0]);
|
|
64
|
+
case "after": return afterRule(value, params[0]);
|
|
65
|
+
case "beforeOrEqual": return beforeOrEqualRule(value, params[0]);
|
|
66
|
+
case "afterOrEqual": return afterOrEqualRule(value, params[0]);
|
|
53
67
|
default: return {
|
|
54
68
|
check: false,
|
|
55
|
-
message: `Unknown rule ${
|
|
69
|
+
message: `Unknown rule ${name}`,
|
|
56
70
|
value
|
|
57
71
|
};
|
|
58
72
|
}
|
|
59
73
|
}
|
|
60
|
-
function minRule(value,
|
|
61
|
-
const minValue = Number(params[0] ?? "0");
|
|
74
|
+
function minRule(value, minValue) {
|
|
62
75
|
const result = {
|
|
63
76
|
check: false,
|
|
64
77
|
message: `:attribute must be greater than or equal to ${minValue}`,
|
|
65
78
|
value
|
|
66
79
|
};
|
|
67
80
|
if (typeof value === "number") result.check = value >= minValue;
|
|
68
|
-
if (typeof
|
|
81
|
+
if (typeof value === "string") result.check = value.length >= minValue;
|
|
69
82
|
if (isArray(value)) {
|
|
70
83
|
result.check = value.length >= minValue;
|
|
71
84
|
result.message = `Array must contain at least ${minValue} elements`;
|
|
72
85
|
}
|
|
73
86
|
return result;
|
|
74
87
|
}
|
|
75
|
-
function maxRule(value,
|
|
76
|
-
const maxValue = Number(params[0] ?? "0");
|
|
88
|
+
function maxRule(value, maxValue) {
|
|
77
89
|
const result = {
|
|
78
90
|
check: false,
|
|
79
91
|
message: `:attribute must be less than or equal to ${maxValue}`,
|
|
80
92
|
value
|
|
81
93
|
};
|
|
82
94
|
if (typeof value === "number") result.check = value <= maxValue;
|
|
83
|
-
if (typeof
|
|
84
|
-
result.check =
|
|
95
|
+
if (typeof value === "string") {
|
|
96
|
+
result.check = value.length <= maxValue;
|
|
85
97
|
result.message = `String must contain at most ${maxValue} characters`;
|
|
86
98
|
}
|
|
87
99
|
if (isArray(value)) {
|
|
@@ -90,17 +102,15 @@ function maxRule(value, ...params) {
|
|
|
90
102
|
}
|
|
91
103
|
return result;
|
|
92
104
|
}
|
|
93
|
-
function betweenRule(value,
|
|
94
|
-
const minValue = Number(params[0] ?? "0");
|
|
95
|
-
const maxValue = Number(params[1] ?? "0");
|
|
105
|
+
function betweenRule(value, minValue, maxValue) {
|
|
96
106
|
const result = {
|
|
97
107
|
check: false,
|
|
98
108
|
message: `:attribute must be between ${minValue} and ${maxValue}`,
|
|
99
109
|
value
|
|
100
110
|
};
|
|
101
111
|
if (typeof value === "number") result.check = value >= minValue && value <= maxValue;
|
|
102
|
-
if (typeof
|
|
103
|
-
result.check =
|
|
112
|
+
if (typeof value === "string") {
|
|
113
|
+
result.check = value.length >= minValue && value.length <= maxValue;
|
|
104
114
|
result.message = `String must contain between ${minValue} and ${maxValue} characters`;
|
|
105
115
|
}
|
|
106
116
|
if (isArray(value)) {
|
|
@@ -115,7 +125,7 @@ function emailRule(value) {
|
|
|
115
125
|
message: ":attribute must be a valid email address",
|
|
116
126
|
value
|
|
117
127
|
};
|
|
118
|
-
if (typeof value === "string") result.check = util.matches("^[
|
|
128
|
+
if (typeof value === "string") result.check = util.matches("^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$", result.value);
|
|
119
129
|
return result;
|
|
120
130
|
}
|
|
121
131
|
function urlRule(value) {
|
|
@@ -124,7 +134,7 @@ function urlRule(value) {
|
|
|
124
134
|
message: ":attribute must be a valid URL",
|
|
125
135
|
value
|
|
126
136
|
};
|
|
127
|
-
if (typeof value === "string") result.check = util.matches("^(
|
|
137
|
+
if (typeof value === "string") result.check = util.matches("^https?:\\/\\/(www\\.)?[-a-zA-Z0-9@:%._\\+~#=]{1,256}\\.[a-zA-Z0-9()]{1,6}\\b([-a-zA-Z0-9()@:%_\\+.~#?&//=]*)$|^https?:\\/\\/(localhost|\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3})(:\\d+)?(\\/.*)?$", result.value);
|
|
128
138
|
return result;
|
|
129
139
|
}
|
|
130
140
|
function uuidRule(value) {
|
|
@@ -133,70 +143,189 @@ function uuidRule(value) {
|
|
|
133
143
|
message: ":attribute must be a valid UUID",
|
|
134
144
|
value
|
|
135
145
|
};
|
|
136
|
-
if (typeof
|
|
146
|
+
if (typeof value === "string") result.check = util.matches("^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$", value);
|
|
147
|
+
return result;
|
|
148
|
+
}
|
|
149
|
+
function ulidRule(value) {
|
|
150
|
+
const result = {
|
|
151
|
+
check: false,
|
|
152
|
+
message: ":attribute must be a valid ULID",
|
|
153
|
+
value
|
|
154
|
+
};
|
|
155
|
+
if (typeof value === "string") result.check = util.matches("^[0123456789ABCDEFGHJKMNPQRSTVWXYZ]{26}$", value);
|
|
137
156
|
return result;
|
|
138
157
|
}
|
|
139
|
-
function regexRule(value,
|
|
140
|
-
const regex = params[0] ?? "";
|
|
158
|
+
function regexRule(value, pattern) {
|
|
141
159
|
const result = {
|
|
142
160
|
check: false,
|
|
143
161
|
message: ":attribute must match the specified regular expression",
|
|
144
162
|
value
|
|
145
163
|
};
|
|
146
|
-
if (typeof
|
|
147
|
-
result.value =
|
|
148
|
-
result.check = util.matches(
|
|
164
|
+
if (typeof value === "string") {
|
|
165
|
+
result.value = value.trim();
|
|
166
|
+
result.check = util.matches(pattern, result.value);
|
|
149
167
|
}
|
|
150
168
|
return result;
|
|
151
169
|
}
|
|
152
170
|
function inRule(value, ...params) {
|
|
153
|
-
|
|
154
|
-
check:
|
|
171
|
+
return {
|
|
172
|
+
check: params.includes(value),
|
|
155
173
|
message: ":attribute must be one of the specified values",
|
|
156
174
|
value
|
|
157
175
|
};
|
|
158
|
-
if (typeof result.value === "string") result.check = params.includes(result.value);
|
|
159
|
-
if (typeof value === "number") result.check = params.map(Number).includes(value);
|
|
160
|
-
return result;
|
|
161
176
|
}
|
|
162
|
-
function
|
|
177
|
+
function notInRule(value, ...params) {
|
|
178
|
+
return {
|
|
179
|
+
check: !params.includes(value),
|
|
180
|
+
message: ":attribute must not be one of the specified values",
|
|
181
|
+
value
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
function requiredRule(value) {
|
|
163
185
|
const result = {
|
|
164
186
|
check: true,
|
|
165
187
|
message: ":attribute is required",
|
|
166
188
|
value
|
|
167
189
|
};
|
|
168
|
-
if (typeof
|
|
169
|
-
if (isArray(
|
|
170
|
-
if (typeof
|
|
171
|
-
if (
|
|
190
|
+
if (typeof value === "string") result.check = value.length > 0;
|
|
191
|
+
if (isArray(value)) result.check = value.length > 0;
|
|
192
|
+
if (typeof value === "number") result.check = true;
|
|
193
|
+
if (typeof value === "boolean") result.check = true;
|
|
194
|
+
if (typeof value === "object" && !result.value) {
|
|
195
|
+
result.message = ":attribute is not nullable";
|
|
196
|
+
result.check = false;
|
|
197
|
+
}
|
|
198
|
+
if (typeof value === "undefined") result.check = false;
|
|
172
199
|
return result;
|
|
173
200
|
}
|
|
174
|
-
function nullableRule(value
|
|
201
|
+
function nullableRule(value) {
|
|
175
202
|
return {
|
|
176
203
|
check: true,
|
|
177
204
|
message: "",
|
|
178
205
|
value
|
|
179
206
|
};
|
|
180
207
|
}
|
|
181
|
-
function sometimesRule(value
|
|
208
|
+
function sometimesRule(value) {
|
|
182
209
|
const result = {
|
|
183
210
|
check: true,
|
|
184
211
|
message: "",
|
|
185
212
|
value
|
|
186
213
|
};
|
|
187
|
-
if (typeof
|
|
188
|
-
|
|
214
|
+
if (typeof value === "undefined") return result;
|
|
215
|
+
if (typeof value === "object" && !result.value) {
|
|
216
|
+
result.message = ":attribute is not nullable";
|
|
217
|
+
result.check = false;
|
|
218
|
+
}
|
|
219
|
+
return requiredRule(value);
|
|
220
|
+
}
|
|
221
|
+
function arrayRule(value) {
|
|
222
|
+
const result = {
|
|
223
|
+
check: false,
|
|
224
|
+
message: ":attribute must be an array",
|
|
225
|
+
value
|
|
226
|
+
};
|
|
227
|
+
if (isArray(value)) result.check = true;
|
|
228
|
+
return result;
|
|
229
|
+
}
|
|
230
|
+
function objectRule(value) {
|
|
231
|
+
const result = {
|
|
232
|
+
check: false,
|
|
233
|
+
message: ":attribute must be an object",
|
|
234
|
+
value
|
|
235
|
+
};
|
|
236
|
+
if (typeof value === "object" && !isArray(result.value)) result.check = true;
|
|
237
|
+
return result;
|
|
238
|
+
}
|
|
239
|
+
function booleanRule(value) {
|
|
240
|
+
const result = {
|
|
241
|
+
check: false,
|
|
242
|
+
message: ":attribute must be a boolean",
|
|
243
|
+
value
|
|
244
|
+
};
|
|
245
|
+
if (typeof value === "boolean") result.check = true;
|
|
246
|
+
return result;
|
|
247
|
+
}
|
|
248
|
+
function numberRule(value) {
|
|
249
|
+
const result = {
|
|
250
|
+
check: false,
|
|
251
|
+
message: ":attribute must be a number",
|
|
252
|
+
value
|
|
253
|
+
};
|
|
254
|
+
if (typeof value === "number") result.check = true;
|
|
255
|
+
return result;
|
|
256
|
+
}
|
|
257
|
+
function stringRule(value) {
|
|
258
|
+
const result = {
|
|
259
|
+
check: false,
|
|
260
|
+
message: ":attribute must be a string",
|
|
261
|
+
value
|
|
262
|
+
};
|
|
263
|
+
if (typeof value === "string") result.check = true;
|
|
264
|
+
return result;
|
|
265
|
+
}
|
|
266
|
+
function dateRule(value) {
|
|
267
|
+
const result = {
|
|
268
|
+
check: false,
|
|
269
|
+
message: ":attribute must be a date",
|
|
270
|
+
value
|
|
271
|
+
};
|
|
272
|
+
if (typeof value === "string") result.check = util.matches("^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])T([01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(\\.\\d{1,6})?Z$", result.value);
|
|
273
|
+
if (typeof value === "number") result.check = true;
|
|
274
|
+
return result;
|
|
275
|
+
}
|
|
276
|
+
function beforeRule(value, start) {
|
|
277
|
+
const result = {
|
|
278
|
+
check: false,
|
|
279
|
+
message: `:attribute must be before ${start}`,
|
|
280
|
+
value
|
|
281
|
+
};
|
|
282
|
+
const startValue = util.time.parseISO8601ToEpochMilliSeconds(start);
|
|
283
|
+
if (typeof value === "string") result.check = util.time.parseISO8601ToEpochMilliSeconds(value) < startValue;
|
|
284
|
+
if (typeof value === "number") result.check = value < startValue;
|
|
285
|
+
return result;
|
|
286
|
+
}
|
|
287
|
+
function afterRule(value, start) {
|
|
288
|
+
const result = {
|
|
289
|
+
check: false,
|
|
290
|
+
message: `:attribute must be after ${start}`,
|
|
291
|
+
value
|
|
292
|
+
};
|
|
293
|
+
const startValue = util.time.parseISO8601ToEpochMilliSeconds(start);
|
|
294
|
+
if (typeof value === "string") result.check = util.time.parseISO8601ToEpochMilliSeconds(value) > startValue;
|
|
295
|
+
if (typeof value === "number") result.check = value > startValue;
|
|
296
|
+
return result;
|
|
297
|
+
}
|
|
298
|
+
function beforeOrEqualRule(value, start) {
|
|
299
|
+
const result = {
|
|
300
|
+
check: false,
|
|
301
|
+
message: `:attribute must be before or equal to ${start}`,
|
|
302
|
+
value
|
|
303
|
+
};
|
|
304
|
+
const startValue = util.time.parseISO8601ToEpochMilliSeconds(start);
|
|
305
|
+
if (typeof value === "string") result.check = util.time.parseISO8601ToEpochMilliSeconds(value) <= startValue;
|
|
306
|
+
if (typeof value === "number") result.check = value <= startValue;
|
|
307
|
+
return result;
|
|
308
|
+
}
|
|
309
|
+
function afterOrEqualRule(value, start) {
|
|
310
|
+
const result = {
|
|
311
|
+
check: false,
|
|
312
|
+
message: `:attribute must be after or equal to ${start}`,
|
|
313
|
+
value
|
|
314
|
+
};
|
|
315
|
+
const startValue = util.time.parseISO8601ToEpochMilliSeconds(start);
|
|
316
|
+
if (typeof value === "string") result.check = util.time.parseISO8601ToEpochMilliSeconds(value) >= startValue;
|
|
317
|
+
if (typeof value === "number") result.check = value >= startValue;
|
|
318
|
+
return result;
|
|
189
319
|
}
|
|
190
320
|
|
|
191
321
|
//#endregion
|
|
192
322
|
//#region src/index.ts
|
|
193
|
-
function validate(obj, checks) {
|
|
194
|
-
let
|
|
195
|
-
const errorMessages = [];
|
|
323
|
+
function validate(obj, checks, options) {
|
|
324
|
+
let error = {};
|
|
196
325
|
Object.keys(checks).forEach((path) => {
|
|
197
326
|
let value = getNestedValue(obj, path);
|
|
198
327
|
if (typeof value === "string") {
|
|
199
|
-
value = cleanString(value);
|
|
328
|
+
value = cleanString(value, options);
|
|
200
329
|
setNestedValue(obj, path, value);
|
|
201
330
|
}
|
|
202
331
|
let skip = false;
|
|
@@ -204,26 +333,31 @@ function validate(obj, checks) {
|
|
|
204
333
|
if (skip) return;
|
|
205
334
|
if (rule === "nullable" && value === null) skip = true;
|
|
206
335
|
if (rule === "sometimes" && typeof value === "undefined") skip = true;
|
|
207
|
-
const result = typeof rule === "string" ? parse(value, rule) : { ...rule };
|
|
336
|
+
const result = typeof rule === "string" || isArray(rule) ? parse(value, rule) : { ...rule };
|
|
208
337
|
if (result.check) return;
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
338
|
+
if (error.msg) util.appendError(error.msg, error.errorType, error.data, error.errorInfo);
|
|
339
|
+
result.message = result.message.replace(":attribute", formatAttributeName(path));
|
|
340
|
+
error = {
|
|
341
|
+
msg: result.message,
|
|
342
|
+
errorType: "ValidationError",
|
|
343
|
+
data: null,
|
|
344
|
+
errorInfo: {
|
|
345
|
+
path,
|
|
346
|
+
value
|
|
347
|
+
}
|
|
348
|
+
};
|
|
349
|
+
skip = true;
|
|
216
350
|
});
|
|
217
351
|
});
|
|
218
|
-
if (
|
|
219
|
-
|
|
352
|
+
if (!error.msg) return obj;
|
|
353
|
+
util.error(error.msg, error.errorType, error.data, error.errorInfo);
|
|
220
354
|
}
|
|
221
|
-
function
|
|
222
|
-
if (!isPrecognitiveRequest(ctx)) return validate(ctx.args, checks);
|
|
355
|
+
function precognitiveValidation(ctx, checks, options) {
|
|
356
|
+
if (!isPrecognitiveRequest(ctx)) return validate(ctx.args, checks, options);
|
|
223
357
|
const validationKeys = precognitiveKeys(ctx);
|
|
224
358
|
util.http.addResponseHeader("Precognition", "true");
|
|
225
359
|
if (!validationKeys) {
|
|
226
|
-
validate(ctx.args, checks);
|
|
360
|
+
validate(ctx.args, checks, options);
|
|
227
361
|
util.http.addResponseHeader("Precognition-Success", "true");
|
|
228
362
|
runtime.earlyReturn(null);
|
|
229
363
|
}
|
|
@@ -232,11 +366,17 @@ function precognition(ctx, checks) {
|
|
|
232
366
|
validationKeys.forEach((key) => {
|
|
233
367
|
precognitionChecks[key] = checks[key];
|
|
234
368
|
});
|
|
235
|
-
validate(ctx.args, precognitionChecks);
|
|
369
|
+
validate(ctx.args, precognitionChecks, options);
|
|
236
370
|
util.http.addResponseHeader("Precognition-Success", "true");
|
|
237
|
-
runtime.earlyReturn(null);
|
|
371
|
+
runtime.earlyReturn(null, { skipTo: options?.skipTo ?? "END" });
|
|
372
|
+
}
|
|
373
|
+
function formatAttributeName(path) {
|
|
374
|
+
return path.split(".").reduce((acc, part) => {
|
|
375
|
+
if (util.matches("^d+$", part)) return acc;
|
|
376
|
+
return acc ? `${acc} ${part.toLowerCase()}` : part.toLowerCase();
|
|
377
|
+
}, "");
|
|
238
378
|
}
|
|
239
379
|
|
|
240
380
|
//#endregion
|
|
241
|
-
export {
|
|
242
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJuYW1lcyI6WyJwYXJzZWQ6IHN0cmluZyB8IG51bGwiLCJyZXN1bHQ6IFJ1bGU8VD4iLCJlcnJvck1lc3NhZ2VzOiBzdHJpbmdbXSIsInJ1bGVzLnBhcnNlIl0sInNvdXJjZXMiOlsiLi4vc3JjL3V0aWxzLnRzIiwiLi4vc3JjL3J1bGVzLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQ29udGV4dCB9IGZyb20gJ0Bhd3MtYXBwc3luYy91dGlscydcbmltcG9ydCB0eXBlIHsgTmVzdGVkS2V5T2YgfSBmcm9tICcuL3R5cGVzJ1xuaW1wb3J0IHsgdXRpbCB9IGZyb20gJ0Bhd3MtYXBwc3luYy91dGlscydcblxuZXhwb3J0IGZ1bmN0aW9uIGlzU3RyaW5nKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgc3RyaW5nIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZydcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQXJyYXkodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyB1bmtub3duW10ge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAhIXZhbHVlICYmIE9iamVjdC5oYXNPd24odmFsdWUsICdsZW5ndGgnKSkge1xuICAgIHJldHVybiB0eXBlb2YgKHZhbHVlIGFzIHVua25vd25bXSkubGVuZ3RoID09PSAnbnVtYmVyJ1xuICB9XG4gIHJldHVybiBmYWxzZVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TmVzdGVkVmFsdWU8VCBleHRlbmRzIG9iamVjdD4ob2JqOiBULCBwYXRoOiBOZXN0ZWRLZXlPZjxUPik6IGFueSB7XG4gIHJldHVybiBwYXRoLnNwbGl0KCcuJykucmVkdWNlPHVua25vd24+KChjdXJyZW50LCBrZXkpID0+IHV0aWwubWF0Y2hlcygnXlxcZCskJywga2V5KVxuICAgID8gKGN1cnJlbnQgYXMgdW5rbm93bltdKVtOdW1iZXIoa2V5KV1cbiAgICA6IChjdXJyZW50IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldLCBvYmopXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXROZXN0ZWRWYWx1ZTxUIGV4dGVuZHMgb2JqZWN0PihvYmo6IFQsIHBhdGg6IE5lc3RlZEtleU9mPFQ+LCB2YWx1ZTogdW5rbm93bik6IHZvaWQge1xuICBjb25zdCBrZXlzID0gcGF0aC5zcGxpdCgnLicpXG4gIGlmIChrZXlzLmxlbmd0aCA9PT0gMSkge1xuICAgIG9ialtrZXlzWzBdIGFzIGtleW9mIHR5cGVvZiBvYmpdID0gdmFsdWUgYXMgYW55XG4gICAgcmV0dXJuXG4gIH1cbiAgY29uc3QgbGFzdEtleSA9IGtleXMucG9wKCkgYXMgc3RyaW5nXG4gIGNvbnN0IHBhcmVudE9iamVjdCA9IGdldE5lc3RlZFZhbHVlKG9iaiwga2V5cy5qb2luKCcuJykgYXMgTmVzdGVkS2V5T2Y8VD4pXG4gIGlmICh0eXBlb2YgcGFyZW50T2JqZWN0ID09PSAnb2JqZWN0JyAmJiAhIXBhcmVudE9iamVjdCkge1xuICAgIHBhcmVudE9iamVjdFtsYXN0S2V5XSA9IHZhbHVlXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEhlYWRlcihuYW1lOiBzdHJpbmcsIGN0eDogQ29udGV4dCk6IHN0cmluZyB8IG51bGwge1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMoY3R4LnJlcXVlc3QuaGVhZGVycylcbiAgICAucmVkdWNlKChwcmV2LCBba2V5LCB2YWx1ZV0pID0+IHR5cGVvZiBwcmV2ID09PSAnc3RyaW5nJ1xuICAgICAgPyBwcmV2XG4gICAgICA6IChrZXkudG9Mb3dlckNhc2UoKSA9PT0gbmFtZS50b0xvd2VyQ2FzZSgpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZydcbiAgICAgICAgICA/IHZhbHVlXG4gICAgICAgICAgOiBudWxsKSwgbnVsbCBhcyBzdHJpbmcgfCBudWxsKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNQcmVjb2duaXRpdmVSZXF1ZXN0KGN0eDogQ29udGV4dCk6IGJvb2xlYW4ge1xuICByZXR1cm4gZ2V0SGVhZGVyKCdwcmVjb2duaXRpb24nLCBjdHgpID09PSAndHJ1ZSdcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByZWNvZ25pdGl2ZUtleXMoY3R4OiBDb250ZXh0KTogc3RyaW5nW10gfCBudWxsIHtcbiAgY29uc3Qga2V5cyA9IGdldEhlYWRlcignUHJlY29nbml0aW9uLVZhbGlkYXRlLU9ubHknLCBjdHgpXG4gIHJldHVybiBrZXlzID8ga2V5cy5zcGxpdCgnLCcpLm1hcChrZXkgPT4ga2V5LnRyaW0oKSkgOiBudWxsXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGVhblN0cmluZyh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gIGxldCBwYXJzZWQ6IHN0cmluZyB8IG51bGwgPSB2YWx1ZS50cmltKClcbiAgaWYgKHBhcnNlZCA9PT0gJycpXG4gICAgcGFyc2VkID0gbnVsbFxuICByZXR1cm4gcGFyc2VkXG59XG4iLCJpbXBvcnQgdHlwZSB7IFJ1bGUsIFNob3J0UnVsZSB9IGZyb20gJy4vdHlwZXMnXG5pbXBvcnQgeyB1dGlsIH0gZnJvbSAnQGF3cy1hcHBzeW5jL3V0aWxzJ1xuaW1wb3J0IHsgaXNBcnJheSB9IGZyb20gJy4vdXRpbHMnXG5cbmV4cG9ydCBjb25zdCBuYW1lcyA9IHtcbiAgcmVxdWlyZWQ6ICdyZXF1aXJlZCcsXG4gIG51bGxhYmxlOiAnbnVsbGFibGUnLFxuICBzb21ldGltZXM6ICdzb21ldGltZXMnLFxuICBtaW46ICdtaW4nLFxuICBtYXg6ICdtYXgnLFxuICBiZXR3ZWVuOiAnYmV0d2VlbicsXG4gIGVtYWlsOiAnZW1haWwnLFxuICB1cmw6ICd1cmwnLFxuICB1dWlkOiAndXVpZCcsXG4gIHJlZ2V4OiAncmVnZXgnLFxuICBpbjogJ2luJyxcbiAgbm90SW46ICdub3RJbicsXG4gIGJlZm9yZTogJ2JlZm9yZScsXG4gIGFmdGVyOiAnYWZ0ZXInLFxufSBhcyBjb25zdFxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2U8VD4odmFsdWU6IFQsIHJ1bGU6IFNob3J0UnVsZTxrZXlvZiB0eXBlb2YgbmFtZXM+KTogUnVsZTxUPiB7XG4gIGNvbnN0IFtydWxlTmFtZSwgcGFyYW1zXSA9IHJ1bGUuaW5jbHVkZXMoJzonKSA/IHJ1bGUuc3BsaXQoJzonLCAyKSA6IFtydWxlLCAnJ11cblxuICBzd2l0Y2ggKHJ1bGVOYW1lIGFzIGtleW9mIHR5cGVvZiBuYW1lcykge1xuICAgIGNhc2UgJ3JlcXVpcmVkJzpcbiAgICAgIHJldHVybiByZXF1aXJlZFJ1bGUodmFsdWUpXG4gICAgY2FzZSAnbnVsbGFibGUnOlxuICAgICAgcmV0dXJuIG51bGxhYmxlUnVsZSh2YWx1ZSlcbiAgICBjYXNlICdzb21ldGltZXMnOlxuICAgICAgcmV0dXJuIHNvbWV0aW1lc1J1bGUodmFsdWUpXG4gICAgY2FzZSAnbWluJzpcbiAgICAgIHJldHVybiBtaW5SdWxlKHZhbHVlLCAuLi5wYXJhbXMuc3BsaXQoJywnKSlcbiAgICBjYXNlICdtYXgnOlxuICAgICAgcmV0dXJuIG1heFJ1bGUodmFsdWUsIC4uLnBhcmFtcy5zcGxpdCgnLCAnKSlcbiAgICBjYXNlICdiZXR3ZWVuJzpcbiAgICAgIHJldHVybiBiZXR3ZWVuUnVsZSh2YWx1ZSwgLi4ucGFyYW1zLnNwbGl0KCcsICcpKVxuICAgIGNhc2UgJ2VtYWlsJzpcbiAgICAgIHJldHVybiBlbWFpbFJ1bGUodmFsdWUpXG4gICAgY2FzZSAndXJsJzpcbiAgICAgIHJldHVybiB1cmxSdWxlKHZhbHVlKVxuICAgIGNhc2UgJ3V1aWQnOlxuICAgICAgcmV0dXJuIHV1aWRSdWxlKHZhbHVlKVxuICAgIGNhc2UgJ3JlZ2V4JzpcbiAgICAgIHJldHVybiByZWdleFJ1bGUodmFsdWUsIHBhcmFtcylcbiAgICBjYXNlICdpbic6XG4gICAgICByZXR1cm4gaW5SdWxlKHZhbHVlLCAuLi5wYXJhbXMuc3BsaXQoJywgJykpXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB7IGNoZWNrOiBmYWxzZSwgbWVzc2FnZTogYFVua25vd24gcnVsZSAke3J1bGVOYW1lfWAsIHZhbHVlIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBtaW5SdWxlPFQ+KHZhbHVlOiBULCAuLi5wYXJhbXM6IHN0cmluZ1tdKTogUnVsZTxUPiB7XG4gIGNvbnN0IG1pblZhbHVlID0gTnVtYmVyKHBhcmFtc1swXSA/PyAnMCcpXG4gIGNvbnN0IHJlc3VsdDogUnVsZTxUPiA9IHtcbiAgICBjaGVjazogZmFsc2UsXG4gICAgbWVzc2FnZTogYDphdHRyaWJ1dGUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJHttaW5WYWx1ZX1gLFxuICAgIHZhbHVlLFxuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgcmVzdWx0LmNoZWNrID0gdmFsdWUgPj0gbWluVmFsdWVcbiAgfVxuICBpZiAodHlwZW9mIHJlc3VsdC52YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXN1bHQuY2hlY2sgPSAocmVzdWx0LnZhbHVlKS5sZW5ndGggPj0gbWluVmFsdWVcbiAgfVxuICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICByZXN1bHQuY2hlY2sgPSB2YWx1ZS5sZW5ndGggPj0gbWluVmFsdWVcbiAgICByZXN1bHQubWVzc2FnZSA9IGBBcnJheSBtdXN0IGNvbnRhaW4gYXQgbGVhc3QgJHttaW5WYWx1ZX0gZWxlbWVudHNgXG4gIH1cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG5mdW5jdGlvbiBtYXhSdWxlPFQ+KHZhbHVlOiBULCAuLi5wYXJhbXM6IHN0cmluZ1tdKTogUnVsZTxUPiB7XG4gIGNvbnN0IG1heFZhbHVlID0gTnVtYmVyKHBhcmFtc1swXSA/PyAnMCcpXG4gIGNvbnN0IHJlc3VsdDogUnVsZTxUPiA9IHtcbiAgICBjaGVjazogZmFsc2UsXG4gICAgbWVzc2FnZTogYDphdHRyaWJ1dGUgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJHttYXhWYWx1ZX1gLFxuICAgIHZhbHVlLFxuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICByZXN1bHQuY2hlY2sgPSB2YWx1ZSA8PSBtYXhWYWx1ZVxuICB9XG4gIGlmICh0eXBlb2YgcmVzdWx0LnZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHJlc3VsdC5jaGVjayA9IHJlc3VsdC52YWx1ZS5sZW5ndGggPD0gbWF4VmFsdWVcbiAgICByZXN1bHQubWVzc2FnZSA9IGBTdHJpbmcgbXVzdCBjb250YWluIGF0IG1vc3QgJHttYXhWYWx1ZX0gY2hhcmFjdGVyc2BcbiAgfVxuICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICByZXN1bHQuY2hlY2sgPSB2YWx1ZS5sZW5ndGggPD0gbWF4VmFsdWVcbiAgICByZXN1bHQubWVzc2FnZSA9IGBBcnJheSBtdXN0IGNvbnRhaW4gYXQgbW9zdCAke21heFZhbHVlfSBlbGVtZW50c2BcbiAgfVxuICByZXR1cm4gcmVzdWx0XG59XG5cbmZ1bmN0aW9uIGJldHdlZW5SdWxlPFQ+KHZhbHVlOiBULCAuLi5wYXJhbXM6IHN0cmluZ1tdKTogUnVsZTxUPiB7XG4gIGNvbnN0IG1pblZhbHVlID0gTnVtYmVyKHBhcmFtc1swXSA/PyAnMCcpXG4gIGNvbnN0IG1heFZhbHVlID0gTnVtYmVyKHBhcmFtc1sxXSA/PyAnMCcpXG4gIGNvbnN0IHJlc3VsdDogUnVsZTxUPiA9IHtcbiAgICBjaGVjazogZmFsc2UsXG4gICAgbWVzc2FnZTogYDphdHRyaWJ1dGUgbXVzdCBiZSBiZXR3ZWVuICR7bWluVmFsdWV9IGFuZCAke21heFZhbHVlfWAsXG4gICAgdmFsdWUsXG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICByZXN1bHQuY2hlY2sgPSB2YWx1ZSA+PSBtaW5WYWx1ZSAmJiB2YWx1ZSA8PSBtYXhWYWx1ZVxuICB9XG4gIGlmICh0eXBlb2YgcmVzdWx0LnZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHJlc3VsdC5jaGVjayA9IHJlc3VsdC52YWx1ZS5sZW5ndGggPj0gbWluVmFsdWUgJiYgKHJlc3VsdC52YWx1ZSkubGVuZ3RoIDw9IG1heFZhbHVlXG4gICAgcmVzdWx0Lm1lc3NhZ2UgPSBgU3RyaW5nIG11c3QgY29udGFpbiBiZXR3ZWVuICR7bWluVmFsdWV9IGFuZCAke21heFZhbHVlfSBjaGFyYWN0ZXJzYFxuICB9XG4gIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgIHJlc3VsdC5jaGVjayA9IHZhbHVlLmxlbmd0aCA+PSBtaW5WYWx1ZSAmJiB2YWx1ZS5sZW5ndGggPD0gbWF4VmFsdWVcbiAgICByZXN1bHQubWVzc2FnZSA9IGBBcnJheSBtdXN0IGNvbnRhaW4gYmV0d2VlbiAke21pblZhbHVlfSBhbmQgJHttYXhWYWx1ZX0gZWxlbWVudHNgXG4gIH1cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG5mdW5jdGlvbiBlbWFpbFJ1bGU8VD4odmFsdWU6IFQpOiBSdWxlPFQ+IHtcbiAgY29uc3QgcmVzdWx0OiBSdWxlPFQ+ID0ge1xuICAgIGNoZWNrOiBmYWxzZSxcbiAgICBtZXNzYWdlOiAnOmF0dHJpYnV0ZSBtdXN0IGJlIGEgdmFsaWQgZW1haWwgYWRkcmVzcycsXG4gICAgdmFsdWUsXG4gIH1cblxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHJlc3VsdC5jaGVjayA9IHV0aWwubWF0Y2hlcygnXlteXFxzQF0rQFteXFxzQF0rXFwuW15cXHNAXSskJywgcmVzdWx0LnZhbHVlIGFzIHN0cmluZylcbiAgfVxuICByZXR1cm4gcmVzdWx0XG59XG5cbmZ1bmN0aW9uIHVybFJ1bGU8VD4odmFsdWU6IFQpOiBSdWxlPFQ+IHtcbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgIGNoZWNrOiBmYWxzZSxcbiAgICBtZXNzYWdlOiAnOmF0dHJpYnV0ZSBtdXN0IGJlIGEgdmFsaWQgVVJMJyxcbiAgICB2YWx1ZSxcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHJlc3VsdC5jaGVjayA9IHV0aWwubWF0Y2hlcyhcbiAgICAgICdeKGh0dHB8aHR0cHMpOlxcXFwvXFxcXC9bXFxcXHdcXFxcLV9dKyhcXFxcLltcXFxcd1xcXFwtX10rKSsoW1xcXFx3XFxcXC1cXFxcLixAP149JSY6L35cXFxcKyNdKltcXFxcd1xcXFwtXFxcXEA/Xj0lJi9+XFxcXCsjXSk/JCcsXG4gICAgICByZXN1bHQudmFsdWUgYXMgc3RyaW5nLFxuICAgIClcbiAgfVxuICByZXR1cm4gcmVzdWx0XG59XG5cbmZ1bmN0aW9uIHV1aWRSdWxlPFQ+KHZhbHVlOiBUKTogUnVsZTxUPiB7XG4gIGNvbnN0IHJlc3VsdDogUnVsZTxUPiA9IHtcbiAgICBjaGVjazogZmFsc2UsXG4gICAgbWVzc2FnZTogJzphdHRyaWJ1dGUgbXVzdCBiZSBhIHZhbGlkIFVVSUQnLFxuICAgIHZhbHVlLFxuICB9XG4gIGlmICh0eXBlb2YgcmVzdWx0LnZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHJlc3VsdC5jaGVjayA9IHV0aWwubWF0Y2hlcyhcbiAgICAgICdeWzAtOWEtZl17OH0tWzAtOWEtZl17NH0tWzEtNV1bMC05YS1mXXszfS1bODlhYl1bMC05YS1mXXszfS1bMC05YS1mXXsxMn0kJyxcbiAgICAgIHZhbHVlIGFzIHN0cmluZyxcbiAgICApXG4gIH1cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG5mdW5jdGlvbiByZWdleFJ1bGU8VD4odmFsdWU6IFQsIC4uLnBhcmFtczogc3RyaW5nW10pOiBSdWxlPFQ+IHtcbiAgY29uc3QgcmVnZXggPSBwYXJhbXNbMF0gPz8gJydcbiAgY29uc3QgcmVzdWx0OiBSdWxlPFQ+ID0ge1xuICAgIGNoZWNrOiBmYWxzZSxcbiAgICBtZXNzYWdlOiAnOmF0dHJpYnV0ZSBtdXN0IG1hdGNoIHRoZSBzcGVjaWZpZWQgcmVndWxhciBleHByZXNzaW9uJyxcbiAgICB2YWx1ZSxcbiAgfVxuICBpZiAodHlwZW9mIHJlc3VsdC52YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXN1bHQudmFsdWUgPSByZXN1bHQudmFsdWUudHJpbSgpIGFzIFRcbiAgICByZXN1bHQuY2hlY2sgPSB1dGlsLm1hdGNoZXMocmVnZXgsIHJlc3VsdC52YWx1ZSBhcyBzdHJpbmcpXG4gIH1cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG5mdW5jdGlvbiBpblJ1bGU8VD4odmFsdWU6IFQsIC4uLnBhcmFtczogc3RyaW5nW10pOiBSdWxlPFQ+IHtcbiAgY29uc3QgcmVzdWx0OiBSdWxlPFQ+ID0ge1xuICAgIGNoZWNrOiBmYWxzZSxcbiAgICBtZXNzYWdlOiAnOmF0dHJpYnV0ZSBtdXN0IGJlIG9uZSBvZiB0aGUgc3BlY2lmaWVkIHZhbHVlcycsXG4gICAgdmFsdWUsXG4gIH1cbiAgaWYgKHR5cGVvZiByZXN1bHQudmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmVzdWx0LmNoZWNrID0gcGFyYW1zLmluY2x1ZGVzKHJlc3VsdC52YWx1ZSlcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIHJlc3VsdC5jaGVjayA9IHBhcmFtcy5tYXAoTnVtYmVyKS5pbmNsdWRlcyh2YWx1ZSlcbiAgfVxuICByZXR1cm4gcmVzdWx0XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXF1aXJlZFJ1bGU8VD4odmFsdWU6IFQsIC4uLl9wYXJhbXM6IHN0cmluZ1tdKTogUnVsZTxUPiB7XG4gIGNvbnN0IHJlc3VsdDogUnVsZTxUPiA9IHtcbiAgICBjaGVjazogdHJ1ZSxcbiAgICBtZXNzYWdlOiAnOmF0dHJpYnV0ZSBpcyByZXF1aXJlZCcsXG4gICAgdmFsdWUsXG4gIH1cbiAgaWYgKHR5cGVvZiByZXN1bHQudmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmVzdWx0LmNoZWNrID0gcmVzdWx0LnZhbHVlLmxlbmd0aCA+IDBcbiAgfVxuICBpZiAoaXNBcnJheShyZXN1bHQudmFsdWUpKSB7XG4gICAgcmVzdWx0LmNoZWNrID0gcmVzdWx0LnZhbHVlLmxlbmd0aCA+IDBcbiAgfVxuICBpZiAodHlwZW9mIHJlc3VsdC52YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICByZXN1bHQuY2hlY2sgPSB0cnVlXG4gIH1cbiAgaWYgKHJlc3VsdC5jaGVjayA9PT0gZmFsc2UpIHtcbiAgICByZXN1bHQubWVzc2FnZSA9ICc6YXR0cmlidXRlIGlzIHJlcXVpcmVkJ1xuICB9XG4gIHJldHVybiByZXN1bHRcbn1cblxuZnVuY3Rpb24gbnVsbGFibGVSdWxlPFQ+KHZhbHVlOiBULCAuLi5fcGFyYW1zOiBzdHJpbmdbXSk6IFJ1bGU8VD4ge1xuICBjb25zdCByZXN1bHQ6IFJ1bGU8VD4gPSB7XG4gICAgY2hlY2s6IHRydWUsXG4gICAgbWVzc2FnZTogJycsXG4gICAgdmFsdWUsXG4gIH1cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG5mdW5jdGlvbiBzb21ldGltZXNSdWxlPFQ+KHZhbHVlOiBULCAuLi5fcGFyYW1zOiBzdHJpbmdbXSk6IFJ1bGU8VD4ge1xuICBjb25zdCByZXN1bHQ6IFJ1bGU8VD4gPSB7XG4gICAgY2hlY2s6IHRydWUsXG4gICAgbWVzc2FnZTogJycsXG4gICAgdmFsdWUsXG4gIH1cbiAgaWYgKHR5cGVvZiByZXN1bHQudmFsdWUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG4gIHJldHVybiByZXF1aXJlZFJ1bGUodmFsdWUsIC4uLl9wYXJhbXMpXG59XG4iLCJpbXBvcnQgdHlwZSB7IENvbnRleHQgfSBmcm9tICdAYXdzLWFwcHN5bmMvdXRpbHMnXG5pbXBvcnQgdHlwZSB7IE5lc3RlZEtleU9mLCBSdWxlLCBTaG9ydFJ1bGUgfSBmcm9tICcuL3R5cGVzJ1xuaW1wb3J0IHsgcnVudGltZSwgdXRpbCB9IGZyb20gJ0Bhd3MtYXBwc3luYy91dGlscydcbmltcG9ydCAqIGFzIHJ1bGVzIGZyb20gJy4vcnVsZXMnXG5pbXBvcnQgeyBjbGVhblN0cmluZywgZ2V0TmVzdGVkVmFsdWUsIGlzUHJlY29nbml0aXZlUmVxdWVzdCwgcHJlY29nbml0aXZlS2V5cywgc2V0TmVzdGVkVmFsdWUgfSBmcm9tICcuL3V0aWxzJ1xuXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGU8VCBleHRlbmRzIG9iamVjdD4oXG4gIG9iajogVCxcbiAgY2hlY2tzOiBQYXJ0aWFsPFJlY29yZDxOZXN0ZWRLZXlPZjxUPiwgKFNob3J0UnVsZTxrZXlvZiB0eXBlb2YgcnVsZXNbJ25hbWVzJ10+IHwgUnVsZSlbXT4+LFxuKTogVCB7XG4gIGxldCBoYXNFcnJvcnMgPSBmYWxzZVxuICBjb25zdCBlcnJvck1lc3NhZ2VzOiBzdHJpbmdbXSA9IFtdXG5cbiAgT2JqZWN0LmtleXMoY2hlY2tzKS5mb3JFYWNoKChwYXRoKSA9PiB7XG4gICAgbGV0IHZhbHVlID0gZ2V0TmVzdGVkVmFsdWUob2JqLCBwYXRoIGFzIE5lc3RlZEtleU9mPFQ+KVxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICB2YWx1ZSA9IGNsZWFuU3RyaW5nKHZhbHVlKVxuICAgICAgc2V0TmVzdGVkVmFsdWUob2JqLCBwYXRoIGFzIE5lc3RlZEtleU9mPFQ+LCB2YWx1ZSlcbiAgICB9XG5cbiAgICBsZXQgc2tpcCA9IGZhbHNlXG4gICAgY2hlY2tzW3BhdGggYXMgTmVzdGVkS2V5T2Y8VD5dPy5mb3JFYWNoKChydWxlKSA9PiB7XG4gICAgICBpZiAoc2tpcCkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgaWYgKHJ1bGUgPT09ICdudWxsYWJsZScgJiYgdmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgc2tpcCA9IHRydWVcbiAgICAgIH1cbiAgICAgIGlmIChydWxlID09PSAnc29tZXRpbWVzJyAmJiB0eXBlb2YgdmFsdWUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHNraXAgPSB0cnVlXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9ICh0eXBlb2YgcnVsZSA9PT0gJ3N0cmluZycpID8gcnVsZXMucGFyc2UodmFsdWUsIHJ1bGUpIDogeyAuLi5ydWxlIH1cbiAgICAgIGlmIChyZXN1bHQuY2hlY2spXG4gICAgICAgIHJldHVyblxuICAgICAgaGFzRXJyb3JzID0gdHJ1ZVxuICAgICAgZXJyb3JNZXNzYWdlcy5wdXNoKHJlc3VsdC5tZXNzYWdlKVxuICAgICAgdXRpbC5hcHBlbmRFcnJvcihyZXN1bHQubWVzc2FnZSwgJ1ZhbGlkYXRpb25FcnJvcicsIG51bGwsIHsgcGF0aCwgdmFsdWUgfSlcbiAgICAgIGlmIChydWxlID09PSAncmVxdWlyZWQnKSB7XG4gICAgICAgIHNraXAgPSB0cnVlXG4gICAgICB9XG4gICAgfSlcbiAgfSlcblxuICBpZiAoaGFzRXJyb3JzKSB7XG4gICAgdXRpbC5lcnJvcihlcnJvck1lc3NhZ2VzWzBdLCAnVmFsaWRhdGlvbkVycm9yJylcbiAgfVxuXG4gIHJldHVybiBvYmpcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByZWNvZ25pdGlvbjxUIGV4dGVuZHMgb2JqZWN0PihcbiAgY3R4OiBDb250ZXh0PFQ+LFxuICBjaGVja3M6IFBhcnRpYWw8UmVjb3JkPE5lc3RlZEtleU9mPFQ+LCAoU2hvcnRSdWxlPGtleW9mIHR5cGVvZiBydWxlc1snbmFtZXMnXT4gfCBSdWxlKVtdPj4sXG4pOiBUIHtcbiAgaWYgKCFpc1ByZWNvZ25pdGl2ZVJlcXVlc3QoY3R4KSkge1xuICAgIHJldHVybiB2YWxpZGF0ZShjdHguYXJncywgY2hlY2tzKVxuICB9XG4gIGNvbnN0IHZhbGlkYXRpb25LZXlzID0gcHJlY29nbml0aXZlS2V5cyhjdHgpXG4gIHV0aWwuaHR0cC5hZGRSZXNwb25zZUhlYWRlcignUHJlY29nbml0aW9uJywgJ3RydWUnKVxuXG4gIGlmICghdmFsaWRhdGlvbktleXMpIHtcbiAgICB2YWxpZGF0ZShjdHguYXJncywgY2hlY2tzKVxuICAgIHV0aWwuaHR0cC5hZGRSZXNwb25zZUhlYWRlcignUHJlY29nbml0aW9uLVN1Y2Nlc3MnLCAndHJ1ZScpXG4gICAgcnVudGltZS5lYXJseVJldHVybihudWxsKVxuICB9XG5cbiAgdXRpbC5odHRwLmFkZFJlc3BvbnNlSGVhZGVyKCdQcmVjb2duaXRpb24tVmFsaWRhdGUtT25seScsIHZhbGlkYXRpb25LZXlzLmpvaW4oJywnKSlcbiAgY29uc3QgcHJlY29nbml0aW9uQ2hlY2tzID0ge30gYXMgUGFydGlhbDx0eXBlb2YgY2hlY2tzPlxuICB2YWxpZGF0aW9uS2V5cy5mb3JFYWNoKChrZXkpID0+IHtcbiAgICBwcmVjb2duaXRpb25DaGVja3Nba2V5IGFzIE5lc3RlZEtleU9mPFQ+XSA9IGNoZWNrc1trZXkgYXMgTmVzdGVkS2V5T2Y8VD5dXG4gIH0pXG5cbiAgdmFsaWRhdGUoY3R4LmFyZ3MsIHByZWNvZ25pdGlvbkNoZWNrcylcbiAgdXRpbC5odHRwLmFkZFJlc3BvbnNlSGVhZGVyKCdQcmVjb2duaXRpb24tU3VjY2VzcycsICd0cnVlJylcbiAgcnVudGltZS5lYXJseVJldHVybihudWxsKVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7QUFRQSxTQUFnQixRQUFRLE9BQW9DO0FBQzFELEtBQUksT0FBTyxVQUFVLFlBQVksQ0FBQyxDQUFDLFNBQVMsT0FBTyxPQUFPLE9BQU8sU0FBUyxDQUN4RSxRQUFPLE9BQVEsTUFBb0IsV0FBVztBQUVoRCxRQUFPOztBQUdULFNBQWdCLGVBQWlDLEtBQVEsTUFBMkI7QUFDbEYsUUFBTyxLQUFLLE1BQU0sSUFBSSxDQUFDLFFBQWlCLFNBQVMsUUFBUSxLQUFLLFFBQVEsUUFBUyxJQUFJLEdBQzlFLFFBQXNCLE9BQU8sSUFBSSxJQUNqQyxRQUFvQyxNQUFNLElBQUk7O0FBR3JELFNBQWdCLGVBQWlDLEtBQVEsTUFBc0IsT0FBc0I7Q0FDbkcsTUFBTSxPQUFPLEtBQUssTUFBTSxJQUFJO0FBQzVCLEtBQUksS0FBSyxXQUFXLEdBQUc7QUFDckIsTUFBSSxLQUFLLE1BQTBCO0FBQ25DOztDQUVGLE1BQU0sVUFBVSxLQUFLLEtBQUs7Q0FDMUIsTUFBTSxlQUFlLGVBQWUsS0FBSyxLQUFLLEtBQUssSUFBSSxDQUFtQjtBQUMxRSxLQUFJLE9BQU8saUJBQWlCLFlBQVksQ0FBQyxDQUFDLGFBQ3hDLGNBQWEsV0FBVzs7QUFJNUIsU0FBZ0IsVUFBVSxNQUFjLEtBQTZCO0FBQ25FLFFBQU8s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
|
|
381
|
+
export { formatAttributeName, precognitiveValidation, validate };
|
|
382
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJuYW1lcyI6WyJwYXJzZWQ6IHN0cmluZyB8IG51bGwiLCJyZXN1bHQ6IFJ1bGU8VD4iLCJlcnJvcjogeyBtc2c/OiBzdHJpbmcsIGVycm9yVHlwZT86IHN0cmluZywgZGF0YT86IGFueSwgZXJyb3JJbmZvPzogYW55IH0iLCJydWxlcy5wYXJzZSJdLCJzb3VyY2VzIjpbIi4uL3NyYy91dGlscy50cyIsIi4uL3NyYy9ydWxlcy50cyIsIi4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IENvbnRleHQgfSBmcm9tICdAYXdzLWFwcHN5bmMvdXRpbHMnXG5pbXBvcnQgdHlwZSB7IE5lc3RlZEtleU9mIH0gZnJvbSAnLi90eXBlcydcbmltcG9ydCB7IHV0aWwgfSBmcm9tICdAYXdzLWFwcHN5bmMvdXRpbHMnXG5cbmV4cG9ydCBmdW5jdGlvbiBpc1N0cmluZyh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIHN0cmluZyB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0FycmF5KHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgdW5rbm93bltdIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgISF2YWx1ZSAmJiBPYmplY3QuaGFzT3duKHZhbHVlLCAnbGVuZ3RoJykpIHtcbiAgICByZXR1cm4gdHlwZW9mICh2YWx1ZSBhcyB1bmtub3duW10pLmxlbmd0aCA9PT0gJ251bWJlcidcbiAgfVxuICByZXR1cm4gZmFsc2Vcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldE5lc3RlZFZhbHVlPFQgZXh0ZW5kcyBvYmplY3Q+KG9iajogVCwgcGF0aDogTmVzdGVkS2V5T2Y8VD4pOiBhbnkge1xuICByZXR1cm4gcGF0aC5zcGxpdCgnLicpLnJlZHVjZTx1bmtub3duPigoY3VycmVudCwga2V5KSA9PiB1dGlsLm1hdGNoZXMoJ15cXGQrJCcsIGtleSlcbiAgICA/IChjdXJyZW50IGFzIHVua25vd25bXSlbTnVtYmVyKGtleSldXG4gICAgOiAoY3VycmVudCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XSwgb2JqKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0TmVzdGVkVmFsdWU8VCBleHRlbmRzIG9iamVjdD4ob2JqOiBULCBwYXRoOiBOZXN0ZWRLZXlPZjxUPiwgdmFsdWU6IHVua25vd24pOiB2b2lkIHtcbiAgY29uc3Qga2V5cyA9IHBhdGguc3BsaXQoJy4nKVxuICBpZiAoa2V5cy5sZW5ndGggPT09IDEpIHtcbiAgICBvYmpba2V5c1swXSBhcyBrZXlvZiB0eXBlb2Ygb2JqXSA9IHZhbHVlIGFzIGFueVxuICAgIHJldHVyblxuICB9XG4gIGNvbnN0IGxhc3RLZXkgPSBrZXlzLnBvcCgpIGFzIHN0cmluZ1xuICBjb25zdCBwYXJlbnRPYmplY3QgPSBnZXROZXN0ZWRWYWx1ZShvYmosIGtleXMuam9pbignLicpIGFzIE5lc3RlZEtleU9mPFQ+KVxuICBpZiAodHlwZW9mIHBhcmVudE9iamVjdCA9PT0gJ29iamVjdCcgJiYgISFwYXJlbnRPYmplY3QpIHtcbiAgICBwYXJlbnRPYmplY3RbbGFzdEtleV0gPSB2YWx1ZVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRIZWFkZXIobmFtZTogc3RyaW5nLCBjdHg6IENvbnRleHQpOiBzdHJpbmcgfCBudWxsIHtcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKGN0eC5yZXF1ZXN0LmhlYWRlcnMpXG4gICAgLnJlZHVjZSgocHJldiwgW2tleSwgdmFsdWVdKSA9PiB0eXBlb2YgcHJldiA9PT0gJ3N0cmluZydcbiAgICAgID8gcHJldlxuICAgICAgOiAoa2V5LnRvTG93ZXJDYXNlKCkgPT09IG5hbWUudG9Mb3dlckNhc2UoKSAmJiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnXG4gICAgICAgICAgPyB2YWx1ZVxuICAgICAgICAgIDogbnVsbCksIG51bGwgYXMgc3RyaW5nIHwgbnVsbClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzUHJlY29nbml0aXZlUmVxdWVzdChjdHg6IENvbnRleHQpOiBib29sZWFuIHtcbiAgcmV0dXJuIGdldEhlYWRlcigncHJlY29nbml0aW9uJywgY3R4KSA9PT0gJ3RydWUnXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmVjb2duaXRpdmVLZXlzKGN0eDogQ29udGV4dCk6IHN0cmluZ1tdIHwgbnVsbCB7XG4gIGNvbnN0IGtleXMgPSBnZXRIZWFkZXIoJ1ByZWNvZ25pdGlvbi1WYWxpZGF0ZS1Pbmx5JywgY3R4KVxuICByZXR1cm4ga2V5cyA/IGtleXMuc3BsaXQoJywnKS5tYXAoa2V5ID0+IGtleS50cmltKCkpIDogbnVsbFxufVxuXG5leHBvcnQgZnVuY3Rpb24gY2xlYW5TdHJpbmcodmFsdWU6IHN0cmluZywgb3B0aW9ucz86IHtcbiAgdHJpbT86IGJvb2xlYW5cbiAgYWxsb3dFbXB0eVN0cmluZz86IGJvb2xlYW5cbn0pOiBzdHJpbmcgfCBudWxsIHtcbiAgaWYgKG9wdGlvbnM/LnRyaW0gPT09IGZhbHNlKVxuICAgIHJldHVybiB2YWx1ZVxuXG4gIGxldCBwYXJzZWQ6IHN0cmluZyB8IG51bGwgPSB2YWx1ZS50cmltKClcblxuICBpZiAob3B0aW9ucz8uYWxsb3dFbXB0eVN0cmluZylcbiAgICByZXR1cm4gcGFyc2VkXG5cbiAgaWYgKHBhcnNlZCA9PT0gJycpXG4gICAgcGFyc2VkID0gbnVsbFxuXG4gIHJldHVybiBwYXJzZWRcbn1cbiIsImltcG9ydCB0eXBlIHsgRnVsbFJ1bGUsIFJ1bGUgfSBmcm9tICcuL3R5cGVzJ1xuaW1wb3J0IHsgdXRpbCB9IGZyb20gJ0Bhd3MtYXBwc3luYy91dGlscydcbmltcG9ydCB7IGlzQXJyYXkgfSBmcm9tICcuL3V0aWxzJ1xuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2U8VD4odmFsdWU6IFQsIHJ1bGU6IEZ1bGxSdWxlKTogUnVsZTxUPiB7XG4gIGNvbnN0IFtuYW1lLCAuLi5wYXJhbXNdID0gdHlwZW9mIHJ1bGUgPT09ICdzdHJpbmcnXG4gICAgPyBbcnVsZSwgdW5kZWZpbmVkXVxuICAgIDogW3J1bGVbMF0sIC4uLnJ1bGUuc2xpY2UoMSldXG5cbiAgc3dpdGNoIChuYW1lKSB7XG4gICAgY2FzZSAncmVxdWlyZWQnOlxuICAgICAgcmV0dXJuIHJlcXVpcmVkUnVsZSh2YWx1ZSlcbiAgICBjYXNlICdudWxsYWJsZSc6XG4gICAgICByZXR1cm4gbnVsbGFibGVSdWxlKHZhbHVlKVxuICAgIGNhc2UgJ3NvbWV0aW1lcyc6XG4gICAgICByZXR1cm4gc29tZXRpbWVzUnVsZSh2YWx1ZSlcbiAgICBjYXNlICdtaW4nOlxuICAgICAgcmV0dXJuIG1pblJ1bGUodmFsdWUsIChwYXJhbXNbMF0hIGFzIG51bWJlcikpXG4gICAgY2FzZSAnbWF4JzpcbiAgICAgIHJldHVybiBtYXhSdWxlKHZhbHVlLCAocGFyYW1zWzBdIGFzIG51bWJlcikpXG4gICAgY2FzZSAnYmV0d2Vlbic6XG4gICAgICByZXR1cm4gYmV0d2VlblJ1bGUodmFsdWUsIChwYXJhbXNbMF0gYXMgbnVtYmVyKSwgcGFyYW1zWzFdIGFzIG51bWJlcilcbiAgICBjYXNlICdlbWFpbCc6XG4gICAgICByZXR1cm4gZW1haWxSdWxlKHZhbHVlKVxuICAgIGNhc2UgJ3VybCc6XG4gICAgICByZXR1cm4gdXJsUnVsZSh2YWx1ZSlcbiAgICBjYXNlICd1dWlkJzpcbiAgICAgIHJldHVybiB1dWlkUnVsZSh2YWx1ZSlcbiAgICBjYXNlICd1bGlkJzpcbiAgICAgIHJldHVybiB1bGlkUnVsZSh2YWx1ZSlcbiAgICBjYXNlICdyZWdleCc6XG4gICAgICByZXR1cm4gcmVnZXhSdWxlKHZhbHVlLCBwYXJhbXNbMF0gYXMgc3RyaW5nKVxuICAgIGNhc2UgJ2luJzpcbiAgICAgIHJldHVybiBpblJ1bGUodmFsdWUsIC4uLnBhcmFtcylcbiAgICBjYXNlICdub3RJbic6XG4gICAgICByZXR1cm4gbm90SW5SdWxlKHZhbHVlLCAuLi5wYXJhbXMpXG4gICAgY2FzZSAnYXJyYXknOlxuICAgICAgcmV0dXJuIGFycmF5UnVsZSh2YWx1ZSlcbiAgICBjYXNlICdvYmplY3QnOlxuICAgICAgcmV0dXJuIG9iamVjdFJ1bGUodmFsdWUpXG4gICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICByZXR1cm4gYm9vbGVhblJ1bGUodmFsdWUpXG4gICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgIHJldHVybiBudW1iZXJSdWxlKHZhbHVlKVxuICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICByZXR1cm4gc3RyaW5nUnVsZSh2YWx1ZSlcbiAgICBjYXNlICdkYXRlJzpcbiAgICAgIHJldHVybiBkYXRlUnVsZSh2YWx1ZSlcbiAgICBjYXNlICdiZWZvcmUnOlxuICAgICAgcmV0dXJuIGJlZm9yZVJ1bGUodmFsdWUsIHBhcmFtc1swXSBhcyBzdHJpbmcpXG4gICAgY2FzZSAnYWZ0ZXInOlxuICAgICAgcmV0dXJuIGFmdGVyUnVsZSh2YWx1ZSwgcGFyYW1zWzBdIGFzIHN0cmluZylcbiAgICBjYXNlICdiZWZvcmVPckVxdWFsJzpcbiAgICAgIHJldHVybiBiZWZvcmVPckVxdWFsUnVsZSh2YWx1ZSwgcGFyYW1zWzBdIGFzIHN0cmluZylcbiAgICBjYXNlICdhZnRlck9yRXF1YWwnOlxuICAgICAgcmV0dXJuIGFmdGVyT3JFcXVhbFJ1bGUodmFsdWUsIHBhcmFtc1swXSBhcyBzdHJpbmcpXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB7IGNoZWNrOiBmYWxzZSwgbWVzc2FnZTogYFVua25vd24gcnVsZSAke25hbWV9YCwgdmFsdWUgfVxuICB9XG59XG5cbmZ1bmN0aW9uIG1pblJ1bGU8VD4odmFsdWU6IFQsIG1pblZhbHVlOiBudW1iZXIpOiBSdWxlPFQ+IHtcbiAgY29uc3QgcmVzdWx0OiBSdWxlPFQ+ID0ge1xuICAgIGNoZWNrOiBmYWxzZSxcbiAgICBtZXNzYWdlOiBgOmF0dHJpYnV0ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAke21pblZhbHVlfWAsXG4gICAgdmFsdWUsXG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICByZXN1bHQuY2hlY2sgPSB2YWx1ZSA+PSBtaW5WYWx1ZVxuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmVzdWx0LmNoZWNrID0gdmFsdWUubGVuZ3RoID49IG1pblZhbHVlXG4gIH1cbiAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgcmVzdWx0LmNoZWNrID0gdmFsdWUubGVuZ3RoID49IG1pblZhbHVlXG4gICAgcmVzdWx0Lm1lc3NhZ2UgPSBgQXJyYXkgbXVzdCBjb250YWluIGF0IGxlYXN0ICR7bWluVmFsdWV9IGVsZW1lbnRzYFxuICB9XG4gIHJldHVybiByZXN1bHRcbn1cblxuZnVuY3Rpb24gbWF4UnVsZTxUPih2YWx1ZTogVCwgbWF4VmFsdWU6IG51bWJlcik6IFJ1bGU8VD4ge1xuICBjb25zdCByZXN1bHQ6IFJ1bGU8VD4gPSB7XG4gICAgY2hlY2s6IGZhbHNlLFxuICAgIG1lc3NhZ2U6IGA6YXR0cmlidXRlIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICR7bWF4VmFsdWV9YCxcbiAgICB2YWx1ZSxcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgcmVzdWx0LmNoZWNrID0gdmFsdWUgPD0gbWF4VmFsdWVcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHJlc3VsdC5jaGVjayA9IHZhbHVlLmxlbmd0aCA8PSBtYXhWYWx1ZVxuICAgIHJlc3VsdC5tZXNzYWdlID0gYFN0cmluZyBtdXN0IGNvbnRhaW4gYXQgbW9zdCAke21heFZhbHVlfSBjaGFyYWN0ZXJzYFxuICB9XG4gIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgIHJlc3VsdC5jaGVjayA9IHZhbHVlLmxlbmd0aCA8PSBtYXhWYWx1ZVxuICAgIHJlc3VsdC5tZXNzYWdlID0gYEFycmF5IG11c3QgY29udGFpbiBhdCBtb3N0ICR7bWF4VmFsdWV9IGVsZW1lbnRzYFxuICB9XG4gIHJldHVybiByZXN1bHRcbn1cblxuZnVuY3Rpb24gYmV0d2VlblJ1bGU8VD4odmFsdWU6IFQsIG1pblZhbHVlOiBudW1iZXIsIG1heFZhbHVlOiBudW1iZXIpOiBSdWxlPFQ+IHtcbiAgY29uc3QgcmVzdWx0OiBSdWxlPFQ+ID0ge1xuICAgIGNoZWNrOiBmYWxzZSxcbiAgICBtZXNzYWdlOiBgOmF0dHJpYnV0ZSBtdXN0IGJlIGJldHdlZW4gJHttaW5WYWx1ZX0gYW5kICR7bWF4VmFsdWV9YCxcbiAgICB2YWx1ZSxcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIHJlc3VsdC5jaGVjayA9IHZhbHVlID49IG1pblZhbHVlICYmIHZhbHVlIDw9IG1heFZhbHVlXG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXN1bHQuY2hlY2sgPSB2YWx1ZS5sZW5ndGggPj0gbWluVmFsdWUgJiYgdmFsdWUubGVuZ3RoIDw9IG1heFZhbHVlXG4gICAgcmVzdWx0Lm1lc3NhZ2UgPSBgU3RyaW5nIG11c3QgY29udGFpbiBiZXR3ZWVuICR7bWluVmFsdWV9IGFuZCAke21heFZhbHVlfSBjaGFyYWN0ZXJzYFxuICB9XG4gIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgIHJlc3VsdC5jaGVjayA9IHZhbHVlLmxlbmd0aCA+PSBtaW5WYWx1ZSAmJiB2YWx1ZS5sZW5ndGggPD0gbWF4VmFsdWVcbiAgICByZXN1bHQubWVzc2FnZSA9IGBBcnJheSBtdXN0IGNvbnRhaW4gYmV0d2VlbiAke21pblZhbHVlfSBhbmQgJHttYXhWYWx1ZX0gZWxlbWVudHNgXG4gIH1cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG5mdW5jdGlvbiBlbWFpbFJ1bGU8VD4odmFsdWU6IFQpOiBSdWxlPFQ+IHtcbiAgY29uc3QgcmVzdWx0OiBSdWxlPFQ+ID0ge1xuICAgIGNoZWNrOiBmYWxzZSxcbiAgICBtZXNzYWdlOiAnOmF0dHJpYnV0ZSBtdXN0IGJlIGEgdmFsaWQgZW1haWwgYWRkcmVzcycsXG4gICAgdmFsdWUsXG4gIH1cblxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHJlc3VsdC5jaGVjayA9IHV0aWwubWF0Y2hlcygnXlthLXpBLVowLTkuXyUrLV0rQFthLXpBLVowLTkuLV0rXFxcXC5bYS16QS1aXXsyLH0kJywgcmVzdWx0LnZhbHVlIGFzIHN0cmluZylcbiAgfVxuICByZXR1cm4gcmVzdWx0XG59XG5cbmZ1bmN0aW9uIHVybFJ1bGU8VD4odmFsdWU6IFQpOiBSdWxlPFQ+IHtcbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgIGNoZWNrOiBmYWxzZSxcbiAgICBtZXNzYWdlOiAnOmF0dHJpYnV0ZSBtdXN0IGJlIGEgdmFsaWQgVVJMJyxcbiAgICB2YWx1ZSxcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHJlc3VsdC5jaGVjayA9IHV0aWwubWF0Y2hlcyhcbiAgICAgICdeaHR0cHM/OlxcXFwvXFxcXC8od3d3XFxcXC4pP1stYS16QS1aMC05QDolLl9cXFxcK34jPV17MSwyNTZ9XFxcXC5bYS16QS1aMC05KCldezEsNn1cXFxcYihbLWEtekEtWjAtOSgpQDolX1xcXFwrLn4jPyYvLz1dKikkfF5odHRwcz86XFxcXC9cXFxcLyhsb2NhbGhvc3R8XFxcXGR7MSwzfVxcXFwuXFxcXGR7MSwzfVxcXFwuXFxcXGR7MSwzfVxcXFwuXFxcXGR7MSwzfSkoOlxcXFxkKyk/KFxcXFwvLiopPyQnLFxuICAgICAgcmVzdWx0LnZhbHVlIGFzIHN0cmluZyxcbiAgICApXG4gIH1cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG5mdW5jdGlvbiB1dWlkUnVsZTxUPih2YWx1ZTogVCk6IFJ1bGU8VD4ge1xuICBjb25zdCByZXN1bHQ6IFJ1bGU8VD4gPSB7XG4gICAgY2hlY2s6IGZhbHNlLFxuICAgIG1lc3NhZ2U6ICc6YXR0cmlidXRlIG11c3QgYmUgYSB2YWxpZCBVVUlEJyxcbiAgICB2YWx1ZSxcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHJlc3VsdC5jaGVjayA9IHV0aWwubWF0Y2hlcyhcbiAgICAgICdeWzAtOWEtZl17OH0tWzAtOWEtZl17NH0tWzEtNV1bMC05YS1mXXszfS1bODlhYl1bMC05YS1mXXszfS1bMC05YS1mXXsxMn0kJyxcbiAgICAgIHZhbHVlIGFzIHN0cmluZyxcbiAgICApXG4gIH1cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG5mdW5jdGlvbiB1bGlkUnVsZTxUPih2YWx1ZTogVCk6IFJ1bGU8VD4ge1xuICBjb25zdCByZXN1bHQ6IFJ1bGU8VD4gPSB7XG4gICAgY2hlY2s6IGZhbHNlLFxuICAgIG1lc3NhZ2U6ICc6YXR0cmlidXRlIG11c3QgYmUgYSB2YWxpZCBVTElEJyxcbiAgICB2YWx1ZSxcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIC8vIFVMSUQgZm9ybWF0OiAyNiBjaGFyYWN0ZXJzLCBiYXNlMzIgZW5jb2RlZCAoMC05LCBBLVogZXhjbHVkaW5nIEksIEwsIE8sIFUpXG4gICAgcmVzdWx0LmNoZWNrID0gdXRpbC5tYXRjaGVzKFxuICAgICAgJ15bMDEyMzQ1Njc4OUFCQ0RFRkdISktNTlBRUlNUVldYWVpdezI2fSQnLFxuICAgICAgdmFsdWUgYXMgc3RyaW5nLFxuICAgIClcbiAgfVxuICByZXR1cm4gcmVzdWx0XG59XG5cbmZ1bmN0aW9uIHJlZ2V4UnVsZTxUPih2YWx1ZTogVCwgcGF0dGVybjogc3RyaW5nKTogUnVsZTxUPiB7XG4gIGNvbnN0IHJlc3VsdDogUnVsZTxUPiA9IHtcbiAgICBjaGVjazogZmFsc2UsXG4gICAgbWVzc2FnZTogJzphdHRyaWJ1dGUgbXVzdCBtYXRjaCB0aGUgc3BlY2lmaWVkIHJlZ3VsYXIgZXhwcmVzc2lvbicsXG4gICAgdmFsdWUsXG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXN1bHQudmFsdWUgPSB2YWx1ZS50cmltKCkgYXMgVFxuICAgIHJlc3VsdC5jaGVjayA9IHV0aWwubWF0Y2hlcyhwYXR0ZXJuLCByZXN1bHQudmFsdWUgYXMgc3RyaW5nKVxuICB9XG4gIHJldHVybiByZXN1bHRcbn1cblxuZnVuY3Rpb24gaW5SdWxlPFQ+KHZhbHVlOiBULCAuLi5wYXJhbXM6IHVua25vd25bXSk6IFJ1bGU8VD4ge1xuICByZXR1cm4ge1xuICAgIGNoZWNrOiBwYXJhbXMuaW5jbHVkZXModmFsdWUpLFxuICAgIG1lc3NhZ2U6ICc6YXR0cmlidXRlIG11c3QgYmUgb25lIG9mIHRoZSBzcGVjaWZpZWQgdmFsdWVzJyxcbiAgICB2YWx1ZSxcbiAgfVxufVxuXG5mdW5jdGlvbiBub3RJblJ1bGU8VD4odmFsdWU6IFQsIC4uLnBhcmFtczogdW5rbm93bltdKTogUnVsZTxUPiB7XG4gIHJldHVybiB7XG4gICAgY2hlY2s6ICFwYXJhbXMuaW5jbHVkZXModmFsdWUpLFxuICAgIG1lc3NhZ2U6ICc6YXR0cmlidXRlIG11c3Qgbm90IGJlIG9uZSBvZiB0aGUgc3BlY2lmaWVkIHZhbHVlcycsXG4gICAgdmFsdWUsXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlcXVpcmVkUnVsZTxUPih2YWx1ZTogVCk6IFJ1bGU8VD4ge1xuICBjb25zdCByZXN1bHQ6IFJ1bGU8VD4gPSB7XG4gICAgY2hlY2s6IHRydWUsXG4gICAgbWVzc2FnZTogJzphdHRyaWJ1dGUgaXMgcmVxdWlyZWQnLFxuICAgIHZhbHVlLFxuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmVzdWx0LmNoZWNrID0gdmFsdWUubGVuZ3RoID4gMFxuICB9XG4gIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgIHJlc3VsdC5jaGVjayA9IHZhbHVlLmxlbmd0aCA+IDBcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIHJlc3VsdC5jaGVjayA9IHRydWVcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHtcbiAgICByZXN1bHQuY2hlY2sgPSB0cnVlXG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgIXJlc3VsdC52YWx1ZSkge1xuICAgIHJlc3VsdC5tZXNzYWdlID0gJzphdHRyaWJ1dGUgaXMgbm90IG51bGxhYmxlJ1xuICAgIHJlc3VsdC5jaGVjayA9IGZhbHNlXG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXN1bHQuY2hlY2sgPSBmYWxzZVxuICB9XG4gIHJldHVybiByZXN1bHRcbn1cblxuZnVuY3Rpb24gbnVsbGFibGVSdWxlPFQ+KHZhbHVlOiBUKTogUnVsZTxUPiB7XG4gIGNvbnN0IHJlc3VsdDogUnVsZTxUPiA9IHtcbiAgICBjaGVjazogdHJ1ZSxcbiAgICBtZXNzYWdlOiAnJyxcbiAgICB2YWx1ZSxcbiAgfVxuICByZXR1cm4gcmVzdWx0XG59XG5cbmZ1bmN0aW9uIHNvbWV0aW1lc1J1bGU8VD4odmFsdWU6IFQpOiBSdWxlPFQ+IHtcbiAgY29uc3QgcmVzdWx0OiBSdWxlPFQ+ID0ge1xuICAgIGNoZWNrOiB0cnVlLFxuICAgIG1lc3NhZ2U6ICcnLFxuICAgIHZhbHVlLFxuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmICFyZXN1bHQudmFsdWUpIHtcbiAgICByZXN1bHQubWVzc2FnZSA9ICc6YXR0cmlidXRlIGlzIG5vdCBudWxsYWJsZSdcbiAgICByZXN1bHQuY2hlY2sgPSBmYWxzZVxuICB9XG4gIHJldHVybiByZXF1aXJlZFJ1bGUodmFsdWUpXG59XG5cbmZ1bmN0aW9uIGFycmF5UnVsZTxUPih2YWx1ZTogVCk6IFJ1bGU8VD4ge1xuICBjb25zdCByZXN1bHQ6IFJ1bGU8VD4gPSB7XG4gICAgY2hlY2s6IGZhbHNlLFxuICAgIG1lc3NhZ2U6ICc6YXR0cmlidXRlIG11c3QgYmUgYW4gYXJyYXknLFxuICAgIHZhbHVlLFxuICB9XG4gIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgIHJlc3VsdC5jaGVjayA9IHRydWVcbiAgfVxuICByZXR1cm4gcmVzdWx0XG59XG5cbmZ1bmN0aW9uIG9iamVjdFJ1bGU8VD4odmFsdWU6IFQpOiBSdWxlPFQ+IHtcbiAgY29uc3QgcmVzdWx0OiBSdWxlPFQ+ID0ge1xuICAgIGNoZWNrOiBmYWxzZSxcbiAgICBtZXNzYWdlOiAnOmF0dHJpYnV0ZSBtdXN0IGJlIGFuIG9iamVjdCcsXG4gICAgdmFsdWUsXG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgIWlzQXJyYXkocmVzdWx0LnZhbHVlKSkge1xuICAgIHJlc3VsdC5jaGVjayA9IHRydWVcbiAgfVxuICByZXR1cm4gcmVzdWx0XG59XG5cbmZ1bmN0aW9uIGJvb2xlYW5SdWxlPFQ+KHZhbHVlOiBUKTogUnVsZTxUPiB7XG4gIGNvbnN0IHJlc3VsdDogUnVsZTxUPiA9IHtcbiAgICBjaGVjazogZmFsc2UsXG4gICAgbWVzc2FnZTogJzphdHRyaWJ1dGUgbXVzdCBiZSBhIGJvb2xlYW4nLFxuICAgIHZhbHVlLFxuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJykge1xuICAgIHJlc3VsdC5jaGVjayA9IHRydWVcbiAgfVxuICByZXR1cm4gcmVzdWx0XG59XG5cbmZ1bmN0aW9uIG51bWJlclJ1bGU8VD4odmFsdWU6IFQpOiBSdWxlPFQ+IHtcbiAgY29uc3QgcmVzdWx0OiBSdWxlPFQ+ID0ge1xuICAgIGNoZWNrOiBmYWxzZSxcbiAgICBtZXNzYWdlOiAnOmF0dHJpYnV0ZSBtdXN0IGJlIGEgbnVtYmVyJyxcbiAgICB2YWx1ZSxcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIHJlc3VsdC5jaGVjayA9IHRydWVcbiAgfVxuICByZXR1cm4gcmVzdWx0XG59XG5cbmZ1bmN0aW9uIHN0cmluZ1J1bGU8VD4odmFsdWU6IFQpOiBSdWxlPFQ+IHtcbiAgY29uc3QgcmVzdWx0OiBSdWxlPFQ+ID0ge1xuICAgIGNoZWNrOiBmYWxzZSxcbiAgICBtZXNzYWdlOiAnOmF0dHJpYnV0ZSBtdXN0IGJlIGEgc3RyaW5nJyxcbiAgICB2YWx1ZSxcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHJlc3VsdC5jaGVjayA9IHRydWVcbiAgfVxuICByZXR1cm4gcmVzdWx0XG59XG5cbmZ1bmN0aW9uIGRhdGVSdWxlPFQ+KHZhbHVlOiBUKTogUnVsZTxUPiB7XG4gIGNvbnN0IHJlc3VsdDogUnVsZTxUPiA9IHtcbiAgICBjaGVjazogZmFsc2UsXG4gICAgbWVzc2FnZTogJzphdHRyaWJ1dGUgbXVzdCBiZSBhIGRhdGUnLFxuICAgIHZhbHVlLFxuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmVzdWx0LmNoZWNrID0gdXRpbC5tYXRjaGVzKFxuICAgICAgJ15cXFxcZHs0fS0oMFsxLTldfDFbMC0yXSktKDBbMS05XXxbMTJdXFxcXGR8M1swMV0pVChbMDFdXFxcXGR8MlswLTNdKTpbMC01XVxcXFxkOlswLTVdXFxcXGQoXFxcXC5cXFxcZHsxLDZ9KT9aJCcsXG4gICAgICByZXN1bHQudmFsdWUgYXMgc3RyaW5nLFxuICAgIClcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIHJlc3VsdC5jaGVjayA9IHRydWVcbiAgfVxuICByZXR1cm4gcmVzdWx0XG59XG5cbmZ1bmN0aW9uIGJlZm9yZVJ1bGU8VD4odmFsdWU6IFQsIHN0YXJ0OiBzdHJpbmcpOiBSdWxlPFQ+IHtcbiAgY29uc3QgcmVzdWx0OiBSdWxlPFQ+ID0ge1xuICAgIGNoZWNrOiBmYWxzZSxcbiAgICBtZXNzYWdlOiBgOmF0dHJpYnV0ZSBtdXN0IGJlIGJlZm9yZSAke3N0YXJ0fWAsXG4gICAgdmFsdWUsXG4gIH1cbiAgY29uc3Qgc3RhcnRWYWx1ZSA9IHV0aWwudGltZS5wYXJzZUlTTzg2MDFUb0Vwb2NoTWlsbGlTZWNvbmRzKHN0YXJ0KVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgY29uc3QgZGF0ZSA9IHV0aWwudGltZS5wYXJzZUlTTzg2MDFUb0Vwb2NoTWlsbGlTZWNvbmRzKHZhbHVlKVxuICAgIHJlc3VsdC5jaGVjayA9IGRhdGUgPCBzdGFydFZhbHVlXG4gIH1cblxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIHJlc3VsdC5jaGVjayA9IHZhbHVlIDwgc3RhcnRWYWx1ZVxuICB9XG4gIHJldHVybiByZXN1bHRcbn1cblxuZnVuY3Rpb24gYWZ0ZXJSdWxlPFQ+KHZhbHVlOiBULCBzdGFydDogc3RyaW5nKTogUnVsZTxUPiB7XG4gIGNvbnN0IHJlc3VsdDogUnVsZTxUPiA9IHtcbiAgICBjaGVjazogZmFsc2UsXG4gICAgbWVzc2FnZTogYDphdHRyaWJ1dGUgbXVzdCBiZSBhZnRlciAke3N0YXJ0fWAsXG4gICAgdmFsdWUsXG4gIH1cbiAgY29uc3Qgc3RhcnRWYWx1ZSA9IHV0aWwudGltZS5wYXJzZUlTTzg2MDFUb0Vwb2NoTWlsbGlTZWNvbmRzKHN0YXJ0KVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgY29uc3QgZGF0ZSA9IHV0aWwudGltZS5wYXJzZUlTTzg2MDFUb0Vwb2NoTWlsbGlTZWNvbmRzKHZhbHVlKVxuICAgIHJlc3VsdC5jaGVjayA9IGRhdGUgPiBzdGFydFZhbHVlXG4gIH1cblxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIHJlc3VsdC5jaGVjayA9IHZhbHVlID4gc3RhcnRWYWx1ZVxuICB9XG4gIHJldHVybiByZXN1bHRcbn1cblxuZnVuY3Rpb24gYmVmb3JlT3JFcXVhbFJ1bGU8VD4odmFsdWU6IFQsIHN0YXJ0OiBzdHJpbmcpOiBSdWxlPFQ+IHtcbiAgY29uc3QgcmVzdWx0OiBSdWxlPFQ+ID0ge1xuICAgIGNoZWNrOiBmYWxzZSxcbiAgICBtZXNzYWdlOiBgOmF0dHJpYnV0ZSBtdXN0IGJlIGJlZm9yZSBvciBlcXVhbCB0byAke3N0YXJ0fWAsXG4gICAgdmFsdWUsXG4gIH1cbiAgY29uc3Qgc3RhcnRWYWx1ZSA9IHV0aWwudGltZS5wYXJzZUlTTzg2MDFUb0Vwb2NoTWlsbGlTZWNvbmRzKHN0YXJ0KVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgY29uc3QgZGF0ZSA9IHV0aWwudGltZS5wYXJzZUlTTzg2MDFUb0Vwb2NoTWlsbGlTZWNvbmRzKHZhbHVlKVxuICAgIHJlc3VsdC5jaGVjayA9IGRhdGUgPD0gc3RhcnRWYWx1ZVxuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICByZXN1bHQuY2hlY2sgPSB2YWx1ZSA8PSBzdGFydFZhbHVlXG4gIH1cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG5mdW5jdGlvbiBhZnRlck9yRXF1YWxSdWxlPFQ+KHZhbHVlOiBULCBzdGFydDogc3RyaW5nKTogUnVsZTxUPiB7XG4gIGNvbnN0IHJlc3VsdDogUnVsZTxUPiA9IHtcbiAgICBjaGVjazogZmFsc2UsXG4gICAgbWVzc2FnZTogYDphdHRyaWJ1dGUgbXVzdCBiZSBhZnRlciBvciBlcXVhbCB0byAke3N0YXJ0fWAsXG4gICAgdmFsdWUsXG4gIH1cbiAgY29uc3Qgc3RhcnRWYWx1ZSA9IHV0aWwudGltZS5wYXJzZUlTTzg2MDFUb0Vwb2NoTWlsbGlTZWNvbmRzKHN0YXJ0KVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgY29uc3QgZGF0ZSA9IHV0aWwudGltZS5wYXJzZUlTTzg2MDFUb0Vwb2NoTWlsbGlTZWNvbmRzKHZhbHVlKVxuICAgIHJlc3VsdC5jaGVjayA9IGRhdGUgPj0gc3RhcnRWYWx1ZVxuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICByZXN1bHQuY2hlY2sgPSB2YWx1ZSA+PSBzdGFydFZhbHVlXG4gIH1cbiAgcmV0dXJuIHJlc3VsdFxufVxuIiwiaW1wb3J0IHR5cGUgeyBDb250ZXh0IH0gZnJvbSAnQGF3cy1hcHBzeW5jL3V0aWxzJ1xuaW1wb3J0IHR5cGUgeyBGdWxsUnVsZSwgTmVzdGVkS2V5T2YsIFJ1bGUgfSBmcm9tICcuL3R5cGVzJ1xuaW1wb3J0IHsgcnVudGltZSwgdXRpbCB9IGZyb20gJ0Bhd3MtYXBwc3luYy91dGlscydcbmltcG9ydCAqIGFzIHJ1bGVzIGZyb20gJy4vcnVsZXMnXG5pbXBvcnQgeyBjbGVhblN0cmluZywgZ2V0TmVzdGVkVmFsdWUsIGlzQXJyYXksIGlzUHJlY29nbml0aXZlUmVxdWVzdCwgcHJlY29nbml0aXZlS2V5cywgc2V0TmVzdGVkVmFsdWUgfSBmcm9tICcuL3V0aWxzJ1xuXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGU8VCBleHRlbmRzIG9iamVjdD4oXG4gIG9iajogVCxcbiAgY2hlY2tzOiBQYXJ0aWFsPFJlY29yZDxOZXN0ZWRLZXlPZjxUPiwgKEZ1bGxSdWxlIHwgUnVsZSlbXT4+LFxuICBvcHRpb25zPzoge1xuICAgIHRyaW0/OiBib29sZWFuXG4gICAgYWxsb3dFbXB0eVN0cmluZz86IGJvb2xlYW5cbiAgfSxcbik6IFQge1xuICBsZXQgZXJyb3I6IHsgbXNnPzogc3RyaW5nLCBlcnJvclR5cGU/OiBzdHJpbmcsIGRhdGE/OiBhbnksIGVycm9ySW5mbz86IGFueSB9ID0ge31cblxuICBPYmplY3Qua2V5cyhjaGVja3MpLmZvckVhY2goKHBhdGgpID0+IHtcbiAgICBsZXQgdmFsdWUgPSBnZXROZXN0ZWRWYWx1ZShvYmosIHBhdGggYXMgTmVzdGVkS2V5T2Y8VD4pXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHZhbHVlID0gY2xlYW5TdHJpbmcodmFsdWUsIG9wdGlvbnMpXG4gICAgICBzZXROZXN0ZWRWYWx1ZShvYmosIHBhdGggYXMgTmVzdGVkS2V5T2Y8VD4sIHZhbHVlKVxuICAgIH1cblxuICAgIGxldCBza2lwID0gZmFsc2VcbiAgICBjaGVja3NbcGF0aCBhcyBOZXN0ZWRLZXlPZjxUPl0/LmZvckVhY2goKHJ1bGUpID0+IHtcbiAgICAgIGlmIChza2lwKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBpZiAocnVsZSA9PT0gJ251bGxhYmxlJyAmJiB2YWx1ZSA9PT0gbnVsbClcbiAgICAgICAgc2tpcCA9IHRydWVcblxuICAgICAgaWYgKHJ1bGUgPT09ICdzb21ldGltZXMnICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ3VuZGVmaW5lZCcpXG4gICAgICAgIHNraXAgPSB0cnVlXG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9ICh0eXBlb2YgcnVsZSA9PT0gJ3N0cmluZycgfHwgaXNBcnJheShydWxlKSlcbiAgICAgICAgPyBydWxlcy5wYXJzZSh2YWx1ZSwgcnVsZSlcbiAgICAgICAgOiB7IC4uLnJ1bGUgfVxuXG4gICAgICBpZiAocmVzdWx0LmNoZWNrKVxuICAgICAgICByZXR1cm5cblxuICAgICAgaWYgKGVycm9yLm1zZylcbiAgICAgICAgdXRpbC5hcHBlbmRFcnJvcihlcnJvci5tc2csIGVycm9yLmVycm9yVHlwZSwgZXJyb3IuZGF0YSwgZXJyb3IuZXJyb3JJbmZvKVxuXG4gICAgICByZXN1bHQubWVzc2FnZSA9IHJlc3VsdC5tZXNzYWdlLnJlcGxhY2UoJzphdHRyaWJ1dGUnLCBmb3JtYXRBdHRyaWJ1dGVOYW1lKHBhdGgpKVxuICAgICAgZXJyb3IgPSB7XG4gICAgICAgIG1zZzogcmVzdWx0Lm1lc3NhZ2UsXG4gICAgICAgIGVycm9yVHlwZTogJ1ZhbGlkYXRpb25FcnJvcicsXG4gICAgICAgIGRhdGE6IG51bGwsXG4gICAgICAgIGVycm9ySW5mbzogeyBwYXRoLCB2YWx1ZSB9LFxuICAgICAgfVxuXG4gICAgICBza2lwID0gdHJ1ZVxuICAgIH0pXG4gIH0pXG5cbiAgaWYgKCFlcnJvci5tc2cpIHtcbiAgICByZXR1cm4gb2JqXG4gIH1cblxuICB1dGlsLmVycm9yKGVycm9yLm1zZywgZXJyb3IuZXJyb3JUeXBlLCBlcnJvci5kYXRhLCBlcnJvci5lcnJvckluZm8pXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmVjb2duaXRpdmVWYWxpZGF0aW9uPFQgZXh0ZW5kcyBvYmplY3Q+KFxuICBjdHg6IENvbnRleHQ8VD4sXG4gIGNoZWNrczogUGFydGlhbDxSZWNvcmQ8TmVzdGVkS2V5T2Y8VD4sIChGdWxsUnVsZSB8IFJ1bGUpW10+PixcbiAgb3B0aW9ucz86IHtcbiAgICB0cmltPzogYm9vbGVhblxuICAgIGFsbG93RW1wdHlTdHJpbmc/OiBib29sZWFuXG4gICAgc2tpcFRvPzogJ0VORCcgfCAnTkVYVCdcbiAgfSxcbik6IFQge1xuICBpZiAoIWlzUHJlY29nbml0aXZlUmVxdWVzdChjdHgpKSB7XG4gICAgcmV0dXJuIHZhbGlkYXRlKGN0eC5hcmdzLCBjaGVja3MsIG9wdGlvbnMpXG4gIH1cbiAgY29uc3QgdmFsaWRhdGlvbktleXMgPSBwcmVjb2duaXRpdmVLZXlzKGN0eClcbiAgdXRpbC5odHRwLmFkZFJlc3BvbnNlSGVhZGVyKCdQcmVjb2duaXRpb24nLCAndHJ1ZScpXG5cbiAgaWYgKCF2YWxpZGF0aW9uS2V5cykge1xuICAgIHZhbGlkYXRlKGN0eC5hcmdzLCBjaGVja3MsIG9wdGlvbnMpXG4gICAgdXRpbC5odHRwLmFkZFJlc3BvbnNlSGVhZGVyKCdQcmVjb2duaXRpb24tU3VjY2VzcycsICd0cnVlJylcbiAgICBydW50aW1lLmVhcmx5UmV0dXJuKG51bGwpXG4gIH1cblxuICB1dGlsLmh0dHAuYWRkUmVzcG9uc2VIZWFkZXIoJ1ByZWNvZ25pdGlvbi1WYWxpZGF0ZS1Pbmx5JywgdmFsaWRhdGlvbktleXMuam9pbignLCcpKVxuICBjb25zdCBwcmVjb2duaXRpb25DaGVja3MgPSB7fSBhcyBQYXJ0aWFsPHR5cGVvZiBjaGVja3M+XG4gIHZhbGlkYXRpb25LZXlzLmZvckVhY2goKGtleSkgPT4ge1xuICAgIHByZWNvZ25pdGlvbkNoZWNrc1trZXkgYXMgTmVzdGVkS2V5T2Y8VD5dID0gY2hlY2tzW2tleSBhcyBOZXN0ZWRLZXlPZjxUPl1cbiAgfSlcblxuICB2YWxpZGF0ZShjdHguYXJncywgcHJlY29nbml0aW9uQ2hlY2tzLCBvcHRpb25zKVxuICB1dGlsLmh0dHAuYWRkUmVzcG9uc2VIZWFkZXIoJ1ByZWNvZ25pdGlvbi1TdWNjZXNzJywgJ3RydWUnKVxuICBydW50aW1lLmVhcmx5UmV0dXJuKG51bGwsIHsgc2tpcFRvOiBvcHRpb25zPy5za2lwVG8gPz8gJ0VORCcgfSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdEF0dHJpYnV0ZU5hbWUocGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHBhdGguc3BsaXQoJy4nKS5yZWR1Y2UoKGFjYywgcGFydCkgPT4ge1xuICAgIGlmICh1dGlsLm1hdGNoZXMoJ15cXGQrJCcsIHBhcnQpKSB7XG4gICAgICByZXR1cm4gYWNjXG4gICAgfVxuICAgIHJldHVybiBhY2MgPyBgJHthY2N9ICR7cGFydC50b0xvd2VyQ2FzZSgpfWAgOiBwYXJ0LnRvTG93ZXJDYXNlKClcbiAgfSwgJycpXG59XG4iXSwibWFwcGluZ3MiOiI7OztBQVFBLFNBQWdCLFFBQVEsT0FBb0M7QUFDMUQsS0FBSSxPQUFPLFVBQVUsWUFBWSxDQUFDLENBQUMsU0FBUyxPQUFPLE9BQU8sT0FBTyxTQUFTLENBQ3hFLFFBQU8sT0FBUSxNQUFvQixXQUFXO0FBRWhELFFBQU87O0FBR1QsU0FBZ0IsZUFBaUMsS0FBUSxNQUEyQjtBQUNsRixRQUFPLEtBQUssTUFBTSxJQUFJLENBQUMsUUFBaUIsU0FBUyxRQUFRLEtBQUssUUFBUSxRQUFTLElBQUksR0FDOUUsUUFBc0IsT0FBTyxJQUFJLElBQ2pDLFFBQW9DLE1BQU0sSUFBSTs7QUFHckQsU0FBZ0IsZUFBaUMsS0FBUSxNQUFzQixPQUFzQjtDQUNuRyxNQUFNLE9BQU8sS0FBSyxNQUFNLElBQUk7QUFDNUIsS0FBSSxLQUFLLFdBQVcsR0FBRztBQUNyQixNQUFJLEtBQUssTUFBMEI7QUFDbkM7O0NBRUYsTUFBTSxVQUFVLEtBQUssS0FB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
|