@gnwebsoft/ui 4.0.1 → 4.0.3
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 +98 -74
- package/dist/chunk-BXWPG6VW.js +108 -0
- package/dist/chunk-DKD73ADK.cjs +2281 -0
- package/dist/{chunk-YUVXLOSA.cjs → chunk-DS524L7W.cjs} +3 -15
- package/dist/chunk-EOUSOGZ6.js +2281 -0
- package/dist/chunk-EYXPJMEF.cjs +108 -0
- package/dist/chunk-FYU2OIMD.js +15 -0
- package/dist/chunk-GHW77WIM.cjs +1 -1
- package/dist/chunk-GVWCGJ3F.js +140 -0
- package/dist/chunk-LUW7V5GI.cjs +15 -0
- package/dist/chunk-M3NVOZ7L.cjs +2512 -0
- package/dist/chunk-MVPLBJRK.cjs +1 -1
- package/dist/chunk-PUQIPRL2.js +467 -0
- package/dist/chunk-Y3QTSDLJ.cjs +140 -0
- package/dist/chunk-YAYXHYKC.js +2512 -0
- package/dist/core/index.cjs +3 -3
- package/dist/core/index.js +3 -3
- package/dist/hooks/index.cjs +3 -3
- package/dist/hooks/index.js +1 -1
- package/dist/i18n/index.cjs +21 -0
- package/dist/i18n/index.js +21 -0
- package/dist/index.cjs +28 -6
- package/dist/index.js +31 -9
- package/dist/types/index.cjs +1 -1
- package/dist/utils/index.cjs +5 -3
- package/dist/utils/index.js +4 -2
- package/dist/wrappers/index.cjs +8 -4
- package/dist/wrappers/index.js +8 -4
- package/package.json +7 -1
- package/dist/chunk-246MYJX6.js +0 -479
- package/dist/chunk-CE4CSA36.cjs +0 -2262
- package/dist/chunk-DJSMLHFO.js +0 -140
- package/dist/chunk-L3QQX3BK.js +0 -1596
- package/dist/chunk-NC3JINIM.cjs +0 -1596
- package/dist/chunk-R45OPW5A.js +0 -2262
- package/dist/chunk-UEBN47RB.cjs +0 -140
package/dist/chunk-246MYJX6.js
DELETED
|
@@ -1,479 +0,0 @@
|
|
|
1
|
-
// src/utils/api.ts
|
|
2
|
-
var makeRequest = async (url, options) => {
|
|
3
|
-
const response = await fetch(url, options);
|
|
4
|
-
if (response.ok) {
|
|
5
|
-
const apiData = await response.json();
|
|
6
|
-
return {
|
|
7
|
-
apiData,
|
|
8
|
-
status: response.status
|
|
9
|
-
};
|
|
10
|
-
} else if (response.status === 404) {
|
|
11
|
-
const apiData = await response.json();
|
|
12
|
-
const data = {
|
|
13
|
-
status: response.status,
|
|
14
|
-
title: apiData.title
|
|
15
|
-
};
|
|
16
|
-
return data;
|
|
17
|
-
}
|
|
18
|
-
const apiResponse = await response.json();
|
|
19
|
-
return apiResponse;
|
|
20
|
-
};
|
|
21
|
-
var api = class {
|
|
22
|
-
static async filter(url, postModel) {
|
|
23
|
-
const alteredOptions = {
|
|
24
|
-
headers: {
|
|
25
|
-
"Content-Type": "application/json",
|
|
26
|
-
Authorization: `Bearer ${localStorage.getItem("serviceToken")}`
|
|
27
|
-
},
|
|
28
|
-
body: JSON.stringify({ ...postModel, ...postModel.filterModel }),
|
|
29
|
-
method: "POST"
|
|
30
|
-
};
|
|
31
|
-
const apiResponse = await makeRequest(url, alteredOptions);
|
|
32
|
-
return apiResponse;
|
|
33
|
-
}
|
|
34
|
-
static async post(url, body = {}) {
|
|
35
|
-
const alteredOptions = {
|
|
36
|
-
headers: {
|
|
37
|
-
"Content-Type": "application/json",
|
|
38
|
-
Authorization: `Bearer ${localStorage.getItem("serviceToken")}`
|
|
39
|
-
},
|
|
40
|
-
body: JSON.stringify(body),
|
|
41
|
-
method: "POST"
|
|
42
|
-
};
|
|
43
|
-
const apiResponse = await makeRequest(url, alteredOptions);
|
|
44
|
-
return apiResponse;
|
|
45
|
-
}
|
|
46
|
-
static async get(url) {
|
|
47
|
-
const alteredOptions = {
|
|
48
|
-
headers: {
|
|
49
|
-
"Content-Type": "application/json",
|
|
50
|
-
Authorization: `Bearer ${localStorage.getItem("serviceToken")}`
|
|
51
|
-
},
|
|
52
|
-
method: "GET"
|
|
53
|
-
};
|
|
54
|
-
const data = await makeRequest(url, alteredOptions);
|
|
55
|
-
return data;
|
|
56
|
-
}
|
|
57
|
-
static async delete(url) {
|
|
58
|
-
const alteredOptions = {
|
|
59
|
-
headers: {
|
|
60
|
-
"Content-Type": "application/json",
|
|
61
|
-
Authorization: `Bearer ${localStorage.getItem("serviceToken")}`
|
|
62
|
-
},
|
|
63
|
-
method: "DELETE"
|
|
64
|
-
};
|
|
65
|
-
const data = await makeRequest(url, alteredOptions);
|
|
66
|
-
return data;
|
|
67
|
-
}
|
|
68
|
-
static async put(url, body = {}) {
|
|
69
|
-
const alteredOptions = {
|
|
70
|
-
headers: {
|
|
71
|
-
"Content-Type": "application/json",
|
|
72
|
-
Authorization: `Bearer ${localStorage.getItem("serviceToken")}`
|
|
73
|
-
},
|
|
74
|
-
body: JSON.stringify(body),
|
|
75
|
-
method: "PUT"
|
|
76
|
-
};
|
|
77
|
-
const apiResponse = await makeRequest(url, alteredOptions);
|
|
78
|
-
return apiResponse;
|
|
79
|
-
}
|
|
80
|
-
static async fetch(url, options = {}) {
|
|
81
|
-
const alteredOptions = {
|
|
82
|
-
headers: {
|
|
83
|
-
"Content-Type": "application/json",
|
|
84
|
-
Authorization: `Bearer ${localStorage.getItem("serviceToken")}`
|
|
85
|
-
},
|
|
86
|
-
...options
|
|
87
|
-
};
|
|
88
|
-
const result = await fetch(url, alteredOptions);
|
|
89
|
-
return result;
|
|
90
|
-
}
|
|
91
|
-
static async tempFetch(url, options = { method: "GET" }) {
|
|
92
|
-
const alteredOptions = {
|
|
93
|
-
headers: {
|
|
94
|
-
"Content-Type": "application/json"
|
|
95
|
-
},
|
|
96
|
-
...options
|
|
97
|
-
};
|
|
98
|
-
const apiResponse = await makeRequest(url, alteredOptions);
|
|
99
|
-
return apiResponse;
|
|
100
|
-
}
|
|
101
|
-
static async upload(url, formData) {
|
|
102
|
-
const alteredOptions = {
|
|
103
|
-
headers: {
|
|
104
|
-
Authorization: `Bearer ${localStorage.getItem("serviceToken")}`
|
|
105
|
-
},
|
|
106
|
-
body: formData,
|
|
107
|
-
method: "POST"
|
|
108
|
-
};
|
|
109
|
-
const apiResponse = await makeRequest(url, alteredOptions);
|
|
110
|
-
return apiResponse;
|
|
111
|
-
}
|
|
112
|
-
};
|
|
113
|
-
|
|
114
|
-
// src/utils/api2.ts
|
|
115
|
-
var makeRequest2 = async (url, options) => {
|
|
116
|
-
const response = await fetch(url, options);
|
|
117
|
-
if (response.ok) {
|
|
118
|
-
const apiData = await response.json();
|
|
119
|
-
return {
|
|
120
|
-
apiData,
|
|
121
|
-
status: response.status
|
|
122
|
-
};
|
|
123
|
-
} else if (response.status === 404) {
|
|
124
|
-
const apiData = await response.json();
|
|
125
|
-
const data = {
|
|
126
|
-
status: response.status,
|
|
127
|
-
title: apiData.title
|
|
128
|
-
};
|
|
129
|
-
return data;
|
|
130
|
-
}
|
|
131
|
-
const apiResponse = await response.json();
|
|
132
|
-
return apiResponse;
|
|
133
|
-
};
|
|
134
|
-
var api2 = class {
|
|
135
|
-
static async filter(url, postModel) {
|
|
136
|
-
const alteredOptions = {
|
|
137
|
-
headers: {
|
|
138
|
-
"Content-Type": "application/json",
|
|
139
|
-
Authorization: `Bearer ${sessionStorage.getItem("serviceToken")}`
|
|
140
|
-
},
|
|
141
|
-
body: JSON.stringify({ ...postModel, ...postModel.filterModel }),
|
|
142
|
-
method: "POST"
|
|
143
|
-
};
|
|
144
|
-
const apiResponse = await makeRequest2(url, alteredOptions);
|
|
145
|
-
return apiResponse;
|
|
146
|
-
}
|
|
147
|
-
static async post(url, body = {}) {
|
|
148
|
-
const alteredOptions = {
|
|
149
|
-
headers: {
|
|
150
|
-
"Content-Type": "application/json",
|
|
151
|
-
Authorization: `Bearer ${sessionStorage.getItem("serviceToken")}`
|
|
152
|
-
},
|
|
153
|
-
body: JSON.stringify(body),
|
|
154
|
-
method: "POST"
|
|
155
|
-
};
|
|
156
|
-
const apiResponse = await makeRequest2(url, alteredOptions);
|
|
157
|
-
return apiResponse;
|
|
158
|
-
}
|
|
159
|
-
static async get(url) {
|
|
160
|
-
const alteredOptions = {
|
|
161
|
-
headers: {
|
|
162
|
-
"Content-Type": "application/json",
|
|
163
|
-
Authorization: `Bearer ${sessionStorage.getItem("serviceToken")}`
|
|
164
|
-
},
|
|
165
|
-
method: "GET"
|
|
166
|
-
};
|
|
167
|
-
const data = await makeRequest2(url, alteredOptions);
|
|
168
|
-
return data;
|
|
169
|
-
}
|
|
170
|
-
static async delete(url) {
|
|
171
|
-
const alteredOptions = {
|
|
172
|
-
headers: {
|
|
173
|
-
"Content-Type": "application/json",
|
|
174
|
-
Authorization: `Bearer ${sessionStorage.getItem("serviceToken")}`
|
|
175
|
-
},
|
|
176
|
-
method: "DELETE"
|
|
177
|
-
};
|
|
178
|
-
const data = await makeRequest2(url, alteredOptions);
|
|
179
|
-
return data;
|
|
180
|
-
}
|
|
181
|
-
static async put(url, body = {}) {
|
|
182
|
-
const alteredOptions = {
|
|
183
|
-
headers: {
|
|
184
|
-
"Content-Type": "application/json",
|
|
185
|
-
Authorization: `Bearer ${sessionStorage.getItem("serviceToken")}`
|
|
186
|
-
},
|
|
187
|
-
body: JSON.stringify(body),
|
|
188
|
-
method: "PUT"
|
|
189
|
-
};
|
|
190
|
-
const apiResponse = await makeRequest2(url, alteredOptions);
|
|
191
|
-
return apiResponse;
|
|
192
|
-
}
|
|
193
|
-
static async fetch(url, options = {}) {
|
|
194
|
-
const alteredOptions = {
|
|
195
|
-
headers: {
|
|
196
|
-
"Content-Type": "application/json",
|
|
197
|
-
Authorization: `Bearer ${sessionStorage.getItem("serviceToken")}`
|
|
198
|
-
},
|
|
199
|
-
...options
|
|
200
|
-
};
|
|
201
|
-
const result = await fetch(url, alteredOptions);
|
|
202
|
-
return result;
|
|
203
|
-
}
|
|
204
|
-
static async tempFetch(url, options = { method: "GET" }) {
|
|
205
|
-
const alteredOptions = {
|
|
206
|
-
headers: {
|
|
207
|
-
"Content-Type": "application/json"
|
|
208
|
-
},
|
|
209
|
-
...options
|
|
210
|
-
};
|
|
211
|
-
const apiResponse = await makeRequest2(url, alteredOptions);
|
|
212
|
-
return apiResponse;
|
|
213
|
-
}
|
|
214
|
-
static async upload(url, formData) {
|
|
215
|
-
const alteredOptions = {
|
|
216
|
-
headers: {
|
|
217
|
-
Authorization: `Bearer ${sessionStorage.getItem("serviceToken")}`
|
|
218
|
-
},
|
|
219
|
-
body: formData,
|
|
220
|
-
method: "POST"
|
|
221
|
-
};
|
|
222
|
-
const apiResponse = await makeRequest2(url, alteredOptions);
|
|
223
|
-
return apiResponse;
|
|
224
|
-
}
|
|
225
|
-
};
|
|
226
|
-
|
|
227
|
-
// src/utils/flattenObjectKeys.ts
|
|
228
|
-
var isNested = (obj) => typeof obj === "object" && obj !== null && !Array.isArray(obj);
|
|
229
|
-
var isArray = (obj) => Array.isArray(obj);
|
|
230
|
-
var flattenObjectKeys = (obj, prefix = "") => {
|
|
231
|
-
if (!isNested(obj)) {
|
|
232
|
-
return {
|
|
233
|
-
[prefix]: obj
|
|
234
|
-
};
|
|
235
|
-
}
|
|
236
|
-
return Object.keys(obj).reduce((acc, key) => {
|
|
237
|
-
const currentPrefix = prefix.length ? `${prefix}.` : "";
|
|
238
|
-
if (isNested(obj[key]) && Object.keys(obj[key]).length) {
|
|
239
|
-
if (isArray(obj[key]) && obj[key].length) {
|
|
240
|
-
obj[key].forEach((item, index) => {
|
|
241
|
-
Object.assign(
|
|
242
|
-
acc,
|
|
243
|
-
flattenObjectKeys(item, `${currentPrefix + key}.${index}`)
|
|
244
|
-
);
|
|
245
|
-
});
|
|
246
|
-
} else {
|
|
247
|
-
Object.assign(acc, flattenObjectKeys(obj[key], currentPrefix + key));
|
|
248
|
-
}
|
|
249
|
-
acc[currentPrefix + key] = obj[key];
|
|
250
|
-
} else {
|
|
251
|
-
acc[currentPrefix + key] = obj[key];
|
|
252
|
-
}
|
|
253
|
-
return acc;
|
|
254
|
-
}, {});
|
|
255
|
-
};
|
|
256
|
-
|
|
257
|
-
// src/utils/getTimezone.ts
|
|
258
|
-
function getTimezone(adapter, value) {
|
|
259
|
-
return value == null || !adapter.utils.isValid(value) ? null : adapter.utils.getTimezone(value);
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
// src/utils/handleServerErrors.ts
|
|
263
|
-
var handleServerErrors = function handleServerErrors2(args) {
|
|
264
|
-
const { errors, setError } = args;
|
|
265
|
-
for (const key in errors) {
|
|
266
|
-
const isKeyInVariables = Object.keys(flattenObjectKeys(errors)).includes(
|
|
267
|
-
key
|
|
268
|
-
);
|
|
269
|
-
if (!isKeyInVariables) {
|
|
270
|
-
continue;
|
|
271
|
-
}
|
|
272
|
-
const fieldError = errors[key];
|
|
273
|
-
let errorMessage = "";
|
|
274
|
-
if (Array.isArray(fieldError)) {
|
|
275
|
-
errorMessage = fieldError.join(" ");
|
|
276
|
-
}
|
|
277
|
-
if (typeof fieldError === "string") {
|
|
278
|
-
errorMessage = fieldError;
|
|
279
|
-
}
|
|
280
|
-
if (typeof fieldError === "boolean" && fieldError) {
|
|
281
|
-
errorMessage = "Field is not valid.";
|
|
282
|
-
}
|
|
283
|
-
setError(key, {
|
|
284
|
-
message: errorMessage
|
|
285
|
-
});
|
|
286
|
-
}
|
|
287
|
-
};
|
|
288
|
-
|
|
289
|
-
// src/utils/propertyExists.ts
|
|
290
|
-
function propertyExists(obj, prop) {
|
|
291
|
-
return typeof obj === "object" && obj !== null && Object.prototype.hasOwnProperty.call(obj, prop);
|
|
292
|
-
}
|
|
293
|
-
|
|
294
|
-
// src/utils/readValueAsDate.ts
|
|
295
|
-
function readValueAsDate(adapter, value) {
|
|
296
|
-
if (typeof value === "string") {
|
|
297
|
-
if (value === "") {
|
|
298
|
-
return null;
|
|
299
|
-
}
|
|
300
|
-
return adapter.utils.date(value);
|
|
301
|
-
}
|
|
302
|
-
return value;
|
|
303
|
-
}
|
|
304
|
-
|
|
305
|
-
// src/utils/removeLeadingTrailingSlashes.ts
|
|
306
|
-
var removeLeadingTrailingSlashes = (route) => {
|
|
307
|
-
return route.replace(/^\/|\/$/g, "");
|
|
308
|
-
};
|
|
309
|
-
|
|
310
|
-
// src/utils/schemaTools.ts
|
|
311
|
-
import dayjs from "dayjs";
|
|
312
|
-
import { z } from "zod";
|
|
313
|
-
var schemaTools = {
|
|
314
|
-
// Date validations
|
|
315
|
-
date: ({ message } = {}) => z.coerce.string().transform((c) => c === "null" || c === "undefined" ? null : c).refine((c) => !!c, { message: message || "Date is required" }).refine((c) => c ? dayjs(c).isValid() : true, {
|
|
316
|
-
message: message || "Invalid date"
|
|
317
|
-
}),
|
|
318
|
-
nullableDate: ({ message } = {}) => z.coerce.string().transform((c) => c === "null" ? null : c).transform((c) => c === "undefined" ? null : c).refine((c) => !c && c !== null ? dayjs(c).isValid() : true, {
|
|
319
|
-
message: message || "Invalid date"
|
|
320
|
-
}),
|
|
321
|
-
dateRange: ({ message } = {}) => z.object({
|
|
322
|
-
start: z.coerce.date(),
|
|
323
|
-
end: z.coerce.date()
|
|
324
|
-
}).refine((data) => data.start <= data.end, {
|
|
325
|
-
message: message || "Start date must be before or equal to end date"
|
|
326
|
-
}),
|
|
327
|
-
// String validations
|
|
328
|
-
requiredString: ({ message, min, max } = {}) => z.string().trim().min(min || 1, message || `String must be at least ${min || 1} characters`).max(max || 255, message || `String must be at most ${max || 255} characters`),
|
|
329
|
-
email: ({ message } = {}) => z.string().email(message || "Invalid email address").max(254, "Email must be at most 254 characters"),
|
|
330
|
-
url: ({ message } = {}) => z.string().url(message || "Invalid URL format"),
|
|
331
|
-
phone: ({ message } = {}) => z.string().regex(/^[\+]?[1-9][\d]{0,15}$/, message || "Invalid phone number format"),
|
|
332
|
-
alphanumeric: ({ message } = {}) => z.string().regex(/^[a-zA-Z0-9]+$/, message || "Only letters and numbers are allowed"),
|
|
333
|
-
slug: ({ message } = {}) => z.string().regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/, message || "Invalid slug format"),
|
|
334
|
-
// Number validations
|
|
335
|
-
positiveNumber: ({ message, min, max } = {}) => z.number().positive(message || "Number must be positive").min(min || 0.01, `Number must be at least ${min || 0.01}`).max(max || Number.MAX_SAFE_INTEGER, `Number must be at most ${max || Number.MAX_SAFE_INTEGER}`),
|
|
336
|
-
nonNegativeNumber: ({ message, max } = {}) => z.number().min(0, message || "Number must be non-negative").max(max || Number.MAX_SAFE_INTEGER, `Number must be at most ${max || Number.MAX_SAFE_INTEGER}`),
|
|
337
|
-
integer: ({ message, min, max } = {}) => z.number().int(message || "Must be an integer").min(min || Number.MIN_SAFE_INTEGER, `Number must be at least ${min || Number.MIN_SAFE_INTEGER}`).max(max || Number.MAX_SAFE_INTEGER, `Number must be at most ${max || Number.MAX_SAFE_INTEGER}`),
|
|
338
|
-
percentage: ({ message } = {}) => z.number().min(0, message || "Percentage must be between 0 and 100").max(100, message || "Percentage must be between 0 and 100"),
|
|
339
|
-
// Array validations
|
|
340
|
-
nonEmptyArray: (schema, { message } = {}) => z.array(schema).min(1, message || "At least one item is required"),
|
|
341
|
-
uniqueArray: (schema, { message } = {}) => z.array(schema).refine((items) => new Set(items).size === items.length, {
|
|
342
|
-
message: message || "All items must be unique"
|
|
343
|
-
}),
|
|
344
|
-
// Boolean validations
|
|
345
|
-
requiredBoolean: ({ message } = {}) => z.boolean({
|
|
346
|
-
message: message || "This field is required"
|
|
347
|
-
}),
|
|
348
|
-
// Object validations
|
|
349
|
-
nonEmptyObject: (schema, { message } = {}) => schema.refine((obj) => Object.keys(obj).length > 0, {
|
|
350
|
-
message: message || "Object cannot be empty"
|
|
351
|
-
}),
|
|
352
|
-
// File validations
|
|
353
|
-
fileSize: ({ maxSize, message }) => z.instanceof(File).refine((file) => file.size <= maxSize, {
|
|
354
|
-
message: message || `File size must be less than ${Math.round(maxSize / 1024 / 1024)}MB`
|
|
355
|
-
}),
|
|
356
|
-
fileType: ({ allowedTypes, message }) => z.instanceof(File).refine((file) => allowedTypes.includes(file.type), {
|
|
357
|
-
message: message || `File type must be one of: ${allowedTypes.join(", ")}`
|
|
358
|
-
}),
|
|
359
|
-
// Custom validators
|
|
360
|
-
conditional: (condition, trueSchema, falseSchema) => z.union([trueSchema, falseSchema]).superRefine((data, ctx) => {
|
|
361
|
-
const shouldUseTrue = condition(data);
|
|
362
|
-
const schema = shouldUseTrue ? trueSchema : falseSchema;
|
|
363
|
-
const result = schema.safeParse(data);
|
|
364
|
-
if (!result.success) {
|
|
365
|
-
ctx.addIssue({
|
|
366
|
-
code: z.ZodIssueCode.custom,
|
|
367
|
-
message: result.error.message
|
|
368
|
-
});
|
|
369
|
-
}
|
|
370
|
-
}),
|
|
371
|
-
transform: {
|
|
372
|
-
toLowerCase: z.string().transform((val) => val.toLowerCase()),
|
|
373
|
-
toUpperCase: z.string().transform((val) => val.toUpperCase()),
|
|
374
|
-
trim: z.string().transform((val) => val.trim()),
|
|
375
|
-
toNumber: z.string().transform((val) => Number(val)),
|
|
376
|
-
toBoolean: z.string().transform((val) => val === "true"),
|
|
377
|
-
parseJson: (schema) => z.string().transform((val, ctx) => {
|
|
378
|
-
try {
|
|
379
|
-
const parsed = JSON.parse(val);
|
|
380
|
-
const result = schema.safeParse(parsed);
|
|
381
|
-
if (result.success) return result.data;
|
|
382
|
-
ctx.addIssue({
|
|
383
|
-
code: z.ZodIssueCode.custom,
|
|
384
|
-
message: result.error.message
|
|
385
|
-
});
|
|
386
|
-
return z.NEVER;
|
|
387
|
-
} catch {
|
|
388
|
-
ctx.addIssue({
|
|
389
|
-
code: z.ZodIssueCode.custom,
|
|
390
|
-
message: "Invalid JSON"
|
|
391
|
-
});
|
|
392
|
-
return z.NEVER;
|
|
393
|
-
}
|
|
394
|
-
})
|
|
395
|
-
}
|
|
396
|
-
};
|
|
397
|
-
|
|
398
|
-
// src/utils/typeGuards.ts
|
|
399
|
-
function isRecord(value) {
|
|
400
|
-
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
401
|
-
}
|
|
402
|
-
function hasProperty(obj, key) {
|
|
403
|
-
return isRecord(obj) && key in obj;
|
|
404
|
-
}
|
|
405
|
-
function isNonEmptyString(value) {
|
|
406
|
-
return typeof value === "string" && value.length > 0;
|
|
407
|
-
}
|
|
408
|
-
function isArray2(value) {
|
|
409
|
-
return Array.isArray(value);
|
|
410
|
-
}
|
|
411
|
-
function isNonEmptyArray(value) {
|
|
412
|
-
return Array.isArray(value) && value.length > 0;
|
|
413
|
-
}
|
|
414
|
-
function isFunction(value) {
|
|
415
|
-
return typeof value === "function";
|
|
416
|
-
}
|
|
417
|
-
function isString(value) {
|
|
418
|
-
return typeof value === "string";
|
|
419
|
-
}
|
|
420
|
-
function isNumber(value) {
|
|
421
|
-
return typeof value === "number" && !isNaN(value);
|
|
422
|
-
}
|
|
423
|
-
function isBoolean(value) {
|
|
424
|
-
return typeof value === "boolean";
|
|
425
|
-
}
|
|
426
|
-
function isNull(value) {
|
|
427
|
-
return value === null;
|
|
428
|
-
}
|
|
429
|
-
function isUndefined(value) {
|
|
430
|
-
return value === void 0;
|
|
431
|
-
}
|
|
432
|
-
function isNullish(value) {
|
|
433
|
-
return value === null || value === void 0;
|
|
434
|
-
}
|
|
435
|
-
function isDefined(value) {
|
|
436
|
-
return value !== null && value !== void 0;
|
|
437
|
-
}
|
|
438
|
-
function isDate(value) {
|
|
439
|
-
return value instanceof Date && !isNaN(value.getTime());
|
|
440
|
-
}
|
|
441
|
-
function isPromise(value) {
|
|
442
|
-
return value instanceof Promise || isRecord(value) && typeof value.then === "function";
|
|
443
|
-
}
|
|
444
|
-
function isError(error) {
|
|
445
|
-
return error instanceof Error;
|
|
446
|
-
}
|
|
447
|
-
function matches(value, validator) {
|
|
448
|
-
return validator(value);
|
|
449
|
-
}
|
|
450
|
-
|
|
451
|
-
export {
|
|
452
|
-
api,
|
|
453
|
-
api2,
|
|
454
|
-
flattenObjectKeys,
|
|
455
|
-
getTimezone,
|
|
456
|
-
handleServerErrors,
|
|
457
|
-
propertyExists,
|
|
458
|
-
readValueAsDate,
|
|
459
|
-
removeLeadingTrailingSlashes,
|
|
460
|
-
schemaTools,
|
|
461
|
-
isRecord,
|
|
462
|
-
hasProperty,
|
|
463
|
-
isNonEmptyString,
|
|
464
|
-
isArray2 as isArray,
|
|
465
|
-
isNonEmptyArray,
|
|
466
|
-
isFunction,
|
|
467
|
-
isString,
|
|
468
|
-
isNumber,
|
|
469
|
-
isBoolean,
|
|
470
|
-
isNull,
|
|
471
|
-
isUndefined,
|
|
472
|
-
isNullish,
|
|
473
|
-
isDefined,
|
|
474
|
-
isDate,
|
|
475
|
-
isPromise,
|
|
476
|
-
isError,
|
|
477
|
-
matches
|
|
478
|
-
};
|
|
479
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3V0aWxzL2FwaS50cyIsICIuLi9zcmMvdXRpbHMvYXBpMi50cyIsICIuLi9zcmMvdXRpbHMvZmxhdHRlbk9iamVjdEtleXMudHMiLCAiLi4vc3JjL3V0aWxzL2dldFRpbWV6b25lLnRzIiwgIi4uL3NyYy91dGlscy9oYW5kbGVTZXJ2ZXJFcnJvcnMudHMiLCAiLi4vc3JjL3V0aWxzL3Byb3BlcnR5RXhpc3RzLnRzIiwgIi4uL3NyYy91dGlscy9yZWFkVmFsdWVBc0RhdGUudHMiLCAiLi4vc3JjL3V0aWxzL3JlbW92ZUxlYWRpbmdUcmFpbGluZ1NsYXNoZXMudHMiLCAiLi4vc3JjL3V0aWxzL3NjaGVtYVRvb2xzLnRzIiwgIi4uL3NyYy91dGlscy90eXBlR3VhcmRzLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgdHlwZSB7IEFwaVJlc3BvbnNlIH0gZnJvbSAnLi4vY29yZS9hcGkvdHlwZXMvQXBpUmVzcG9uc2UnO1xuaW1wb3J0IHR5cGUgeyBMaXN0UmVzcG9uc2UsIFBvc3RNb2RlbCB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB0eXBlIHsgUmVxdWVzdE9wdGlvbnMsIEpzb25PYmplY3QgfSBmcm9tICcuLi90eXBlcy9hcGknO1xuXG5jb25zdCBtYWtlUmVxdWVzdCA9IGFzeW5jIDxUPihcbiAgdXJsOiBzdHJpbmcsXG4gIG9wdGlvbnM6IFJlcXVlc3RPcHRpb25zXG4pOiBQcm9taXNlPEFwaVJlc3BvbnNlPFQ+PiA9PiB7XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCBvcHRpb25zKTtcblxuICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICBjb25zdCBhcGlEYXRhOiBUID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGFwaURhdGEsXG4gICAgICBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cyxcbiAgICB9O1xuICB9IGVsc2UgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gNDA0KSB7XG4gICAgY29uc3QgYXBpRGF0YTogQXBpUmVzcG9uc2U8VD4gPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG5cbiAgICBjb25zdCBkYXRhOiBBcGlSZXNwb25zZTxUPiA9IHtcbiAgICAgIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLFxuICAgICAgdGl0bGU6IGFwaURhdGEudGl0bGUsXG4gICAgfTtcblxuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgY29uc3QgYXBpUmVzcG9uc2U6IEFwaVJlc3BvbnNlPFQ+ID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuXG4gIHJldHVybiBhcGlSZXNwb25zZTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIGFwaSB7XG4gIHN0YXRpYyBhc3luYyBmaWx0ZXI8VCwgVEZpbHRlcj4oXG4gICAgdXJsOiBzdHJpbmcsXG4gICAgcG9zdE1vZGVsOiBQb3N0TW9kZWw8VEZpbHRlcj5cbiAgKTogUHJvbWlzZTxBcGlSZXNwb25zZTxMaXN0UmVzcG9uc2U8VD4+PiB7XG4gICAgY29uc3QgYWx0ZXJlZE9wdGlvbnM6IFJlcXVlc3RPcHRpb25zID0ge1xuICAgICAgaGVhZGVyczoge1xuICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7bG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3NlcnZpY2VUb2tlbicpfWAsXG4gICAgICB9LFxuXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IC4uLnBvc3RNb2RlbCwgLi4ucG9zdE1vZGVsLmZpbHRlck1vZGVsIH0pLFxuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgfTtcblxuICAgIGNvbnN0IGFwaVJlc3BvbnNlID0gYXdhaXQgbWFrZVJlcXVlc3Q8TGlzdFJlc3BvbnNlPFQ+Pih1cmwsIGFsdGVyZWRPcHRpb25zKTtcblxuICAgIHJldHVybiBhcGlSZXNwb25zZTtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBwb3N0PFQ+KFxuICAgIHVybDogc3RyaW5nLFxuICAgIGJvZHk6IEpzb25PYmplY3QgPSB7fVxuICApOiBQcm9taXNlPEFwaVJlc3BvbnNlPFQ+PiB7XG4gICAgY29uc3QgYWx0ZXJlZE9wdGlvbnM6IFJlcXVlc3RPcHRpb25zID0ge1xuICAgICAgaGVhZGVyczoge1xuICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7bG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3NlcnZpY2VUb2tlbicpfWAsXG4gICAgICB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoYm9keSksXG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICB9O1xuXG4gICAgY29uc3QgYXBpUmVzcG9uc2UgPSBhd2FpdCBtYWtlUmVxdWVzdDxUPih1cmwsIGFsdGVyZWRPcHRpb25zKTtcblxuICAgIHJldHVybiBhcGlSZXNwb25zZTtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBnZXQ8VD4odXJsOiBzdHJpbmcpOiBQcm9taXNlPEFwaVJlc3BvbnNlPFQ+PiB7XG4gICAgY29uc3QgYWx0ZXJlZE9wdGlvbnM6IFJlcXVlc3RPcHRpb25zID0ge1xuICAgICAgaGVhZGVyczoge1xuICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7bG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3NlcnZpY2VUb2tlbicpfWAsXG4gICAgICB9LFxuICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICB9O1xuXG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IG1ha2VSZXF1ZXN0PFQ+KHVybCwgYWx0ZXJlZE9wdGlvbnMpO1xuXG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgZGVsZXRlPFQ+KHVybDogc3RyaW5nKTogUHJvbWlzZTxBcGlSZXNwb25zZTxUPj4ge1xuICAgIGNvbnN0IGFsdGVyZWRPcHRpb25zOiBSZXF1ZXN0T3B0aW9ucyA9IHtcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke2xvY2FsU3RvcmFnZS5nZXRJdGVtKCdzZXJ2aWNlVG9rZW4nKX1gLFxuICAgICAgfSxcbiAgICAgIG1ldGhvZDogJ0RFTEVURScsXG4gICAgfTtcblxuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBtYWtlUmVxdWVzdDxUPih1cmwsIGFsdGVyZWRPcHRpb25zKTtcblxuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIHB1dDxUPihcbiAgICB1cmw6IHN0cmluZyxcbiAgICBib2R5OiBKc29uT2JqZWN0ID0ge31cbiAgKTogUHJvbWlzZTxBcGlSZXNwb25zZTxUPj4ge1xuICAgIGNvbnN0IGFsdGVyZWRPcHRpb25zOiBSZXF1ZXN0T3B0aW9ucyA9IHtcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke2xvY2FsU3RvcmFnZS5nZXRJdGVtKCdzZXJ2aWNlVG9rZW4nKX1gLFxuICAgICAgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGJvZHkpLFxuICAgICAgbWV0aG9kOiAnUFVUJyxcbiAgICB9O1xuXG4gICAgY29uc3QgYXBpUmVzcG9uc2UgPSBhd2FpdCBtYWtlUmVxdWVzdDxUPih1cmwsIGFsdGVyZWRPcHRpb25zKTtcblxuICAgIHJldHVybiBhcGlSZXNwb25zZTtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBmZXRjaChcbiAgICB1cmw6IHN0cmluZyxcbiAgICBvcHRpb25zOiBSZXF1ZXN0SW5pdCA9IHt9XG4gICk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICBjb25zdCBhbHRlcmVkT3B0aW9uczogUmVxdWVzdEluaXQgPSB7XG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHtsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnc2VydmljZVRva2VuJyl9YCxcbiAgICAgIH0sXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH07XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBmZXRjaCh1cmwsIGFsdGVyZWRPcHRpb25zKTtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgdGVtcEZldGNoPFQ+KFxuICAgIHVybDogc3RyaW5nLFxuICAgIG9wdGlvbnM6IFJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdHRVQnIH1cbiAgKTogUHJvbWlzZTxBcGlSZXNwb25zZTxUPj4ge1xuICAgIGNvbnN0IGFsdGVyZWRPcHRpb25zOiBSZXF1ZXN0T3B0aW9ucyA9IHtcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgIH0sXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH07XG4gICAgY29uc3QgYXBpUmVzcG9uc2UgPSBhd2FpdCBtYWtlUmVxdWVzdDxUPih1cmwsIGFsdGVyZWRPcHRpb25zKTtcblxuICAgIHJldHVybiBhcGlSZXNwb25zZTtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyB1cGxvYWQ8VD4oXG4gICAgdXJsOiBzdHJpbmcsXG4gICAgZm9ybURhdGE6IEZvcm1EYXRhXG4gICk6IFByb21pc2U8QXBpUmVzcG9uc2U8VD4+IHtcbiAgICBjb25zdCBhbHRlcmVkT3B0aW9uczogUmVxdWVzdE9wdGlvbnMgPSB7XG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHtsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnc2VydmljZVRva2VuJyl9YCxcbiAgICAgIH0sXG4gICAgICBib2R5OiBmb3JtRGF0YSxcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgIH07XG5cbiAgICBjb25zdCBhcGlSZXNwb25zZSA9IGF3YWl0IG1ha2VSZXF1ZXN0PFQ+KHVybCwgYWx0ZXJlZE9wdGlvbnMpO1xuXG4gICAgcmV0dXJuIGFwaVJlc3BvbnNlO1xuICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBBcGlSZXNwb25zZSB9IGZyb20gJy4uL2NvcmUvYXBpL3R5cGVzL0FwaVJlc3BvbnNlJztcbmltcG9ydCB0eXBlIHsgTGlzdFJlc3BvbnNlLCBQb3N0TW9kZWwgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgdHlwZSB7IFJlcXVlc3RPcHRpb25zLCBKc29uT2JqZWN0IH0gZnJvbSAnLi4vdHlwZXMvYXBpJztcblxuY29uc3QgbWFrZVJlcXVlc3QgPSBhc3luYyA8VD4oXG4gIHVybDogc3RyaW5nLFxuICBvcHRpb25zOiBSZXF1ZXN0T3B0aW9uc1xuKTogUHJvbWlzZTxBcGlSZXNwb25zZTxUPj4gPT4ge1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwgb3B0aW9ucyk7XG5cbiAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgY29uc3QgYXBpRGF0YTogVCA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcblxuICAgIHJldHVybiB7XG4gICAgICBhcGlEYXRhLFxuICAgICAgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMsXG4gICAgfTtcbiAgfSBlbHNlIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDQwNCkge1xuICAgIGNvbnN0IGFwaURhdGE6IEFwaVJlc3BvbnNlPFQ+ID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuXG4gICAgY29uc3QgZGF0YTogQXBpUmVzcG9uc2U8VD4gPSB7XG4gICAgICBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cyxcbiAgICAgIHRpdGxlOiBhcGlEYXRhLnRpdGxlLFxuICAgIH07XG5cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIGNvbnN0IGFwaVJlc3BvbnNlOiBBcGlSZXNwb25zZTxUPiA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcblxuICByZXR1cm4gYXBpUmVzcG9uc2U7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBhcGkyIHtcbiAgc3RhdGljIGFzeW5jIGZpbHRlcjxULCBURmlsdGVyPihcbiAgICB1cmw6IHN0cmluZyxcbiAgICBwb3N0TW9kZWw6IFBvc3RNb2RlbDxURmlsdGVyPlxuICApOiBQcm9taXNlPEFwaVJlc3BvbnNlPExpc3RSZXNwb25zZTxUPj4+IHtcbiAgICBjb25zdCBhbHRlcmVkT3B0aW9uczogUmVxdWVzdE9wdGlvbnMgPSB7XG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHtzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKCdzZXJ2aWNlVG9rZW4nKX1gLFxuICAgICAgfSxcblxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyAuLi5wb3N0TW9kZWwsIC4uLnBvc3RNb2RlbC5maWx0ZXJNb2RlbCB9KSxcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgIH07XG5cbiAgICBjb25zdCBhcGlSZXNwb25zZSA9IGF3YWl0IG1ha2VSZXF1ZXN0PExpc3RSZXNwb25zZTxUPj4odXJsLCBhbHRlcmVkT3B0aW9ucyk7XG5cbiAgICByZXR1cm4gYXBpUmVzcG9uc2U7XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgcG9zdDxUPihcbiAgICB1cmw6IHN0cmluZyxcbiAgICBib2R5OiBKc29uT2JqZWN0ID0ge31cbiAgKTogUHJvbWlzZTxBcGlSZXNwb25zZTxUPj4ge1xuICAgIGNvbnN0IGFsdGVyZWRPcHRpb25zOiBSZXF1ZXN0T3B0aW9ucyA9IHtcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke3Nlc3Npb25TdG9yYWdlLmdldEl0ZW0oJ3NlcnZpY2VUb2tlbicpfWAsXG4gICAgICB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoYm9keSksXG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICB9O1xuXG4gICAgY29uc3QgYXBpUmVzcG9uc2UgPSBhd2FpdCBtYWtlUmVxdWVzdDxUPih1cmwsIGFsdGVyZWRPcHRpb25zKTtcblxuICAgIHJldHVybiBhcGlSZXNwb25zZTtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBnZXQ8VD4odXJsOiBzdHJpbmcpOiBQcm9taXNlPEFwaVJlc3BvbnNlPFQ+PiB7XG4gICAgY29uc3QgYWx0ZXJlZE9wdGlvbnM6IFJlcXVlc3RPcHRpb25zID0ge1xuICAgICAgaGVhZGVyczoge1xuICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7c2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgnc2VydmljZVRva2VuJyl9YCxcbiAgICAgIH0sXG4gICAgICBtZXRob2Q6ICdHRVQnLFxuICAgIH07XG5cbiAgICBjb25zdCBkYXRhID0gYXdhaXQgbWFrZVJlcXVlc3Q8VD4odXJsLCBhbHRlcmVkT3B0aW9ucyk7XG5cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBkZWxldGU8VD4odXJsOiBzdHJpbmcpOiBQcm9taXNlPEFwaVJlc3BvbnNlPFQ+PiB7XG4gICAgY29uc3QgYWx0ZXJlZE9wdGlvbnM6IFJlcXVlc3RPcHRpb25zID0ge1xuICAgICAgaGVhZGVyczoge1xuICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7c2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgnc2VydmljZVRva2VuJyl9YCxcbiAgICAgIH0sXG4gICAgICBtZXRob2Q6ICdERUxFVEUnLFxuICAgIH07XG5cbiAgICBjb25zdCBkYXRhID0gYXdhaXQgbWFrZVJlcXVlc3Q8VD4odXJsLCBhbHRlcmVkT3B0aW9ucyk7XG5cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBwdXQ8VD4oXG4gICAgdXJsOiBzdHJpbmcsXG4gICAgYm9keTogSnNvbk9iamVjdCA9IHt9XG4gICk6IFByb21pc2U8QXBpUmVzcG9uc2U8VD4+IHtcbiAgICBjb25zdCBhbHRlcmVkT3B0aW9uczogUmVxdWVzdE9wdGlvbnMgPSB7XG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHtzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKCdzZXJ2aWNlVG9rZW4nKX1gLFxuICAgICAgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGJvZHkpLFxuICAgICAgbWV0aG9kOiAnUFVUJyxcbiAgICB9O1xuXG4gICAgY29uc3QgYXBpUmVzcG9uc2UgPSBhd2FpdCBtYWtlUmVxdWVzdDxUPih1cmwsIGFsdGVyZWRPcHRpb25zKTtcblxuICAgIHJldHVybiBhcGlSZXNwb25zZTtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBmZXRjaChcbiAgICB1cmw6IHN0cmluZyxcbiAgICBvcHRpb25zOiBSZXF1ZXN0SW5pdCA9IHt9XG4gICk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICBjb25zdCBhbHRlcmVkT3B0aW9uczogUmVxdWVzdEluaXQgPSB7XG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHtzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKCdzZXJ2aWNlVG9rZW4nKX1gLFxuICAgICAgfSxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGZldGNoKHVybCwgYWx0ZXJlZE9wdGlvbnMpO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyB0ZW1wRmV0Y2g8VD4oXG4gICAgdXJsOiBzdHJpbmcsXG4gICAgb3B0aW9uczogUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ0dFVCcgfVxuICApOiBQcm9taXNlPEFwaVJlc3BvbnNlPFQ+PiB7XG4gICAgY29uc3QgYWx0ZXJlZE9wdGlvbnM6IFJlcXVlc3RPcHRpb25zID0ge1xuICAgICAgaGVhZGVyczoge1xuICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgfSxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfTtcbiAgICBjb25zdCBhcGlSZXNwb25zZSA9IGF3YWl0IG1ha2VSZXF1ZXN0PFQ+KHVybCwgYWx0ZXJlZE9wdGlvbnMpO1xuXG4gICAgcmV0dXJuIGFwaVJlc3BvbnNlO1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIHVwbG9hZDxUPihcbiAgICB1cmw6IHN0cmluZyxcbiAgICBmb3JtRGF0YTogRm9ybURhdGFcbiAgKTogUHJvbWlzZTxBcGlSZXNwb25zZTxUPj4ge1xuICAgIGNvbnN0IGFsdGVyZWRPcHRpb25zOiBSZXF1ZXN0T3B0aW9ucyA9IHtcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke3Nlc3Npb25TdG9yYWdlLmdldEl0ZW0oJ3NlcnZpY2VUb2tlbicpfWAsXG4gICAgICB9LFxuICAgICAgYm9keTogZm9ybURhdGEsXG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICB9O1xuXG4gICAgY29uc3QgYXBpUmVzcG9uc2UgPSBhd2FpdCBtYWtlUmVxdWVzdDxUPih1cmwsIGFsdGVyZWRPcHRpb25zKTtcblxuICAgIHJldHVybiBhcGlSZXNwb25zZTtcbiAgfVxufVxuIiwgIi8qKlxuICogQ2hlY2tzIGlmIGEgdmFsdWUgaXMgYSBuZXN0ZWQgb2JqZWN0IChub3QgbnVsbCBhbmQgbm90IGFuIGFycmF5KS5cbiAqXG4gKiBAcGFyYW0gb2JqIC0gVGhlIHZhbHVlIHRvIGNoZWNrXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSB2YWx1ZSBpcyBhIG5lc3RlZCBvYmplY3RcbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuY29uc3QgaXNOZXN0ZWQgPSAob2JqOiB1bmtub3duKTogb2JqIGlzIFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0+IFxuICB0eXBlb2Ygb2JqID09PSBcIm9iamVjdFwiICYmIG9iaiAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheShvYmopO1xuXG4vKipcbiAqIENoZWNrcyBpZiBhIHZhbHVlIGlzIGFuIGFycmF5LlxuICpcbiAqIEBwYXJhbSBvYmogLSBUaGUgdmFsdWUgdG8gY2hlY2tcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIHZhbHVlIGlzIGFuIGFycmF5XG4gKlxuICogQGludGVybmFsXG4gKi9cbmNvbnN0IGlzQXJyYXkgPSAob2JqOiB1bmtub3duKTogb2JqIGlzIHVua25vd25bXSA9PiBBcnJheS5pc0FycmF5KG9iaik7XG5cbi8qKlxuICogUmVjdXJzaXZlbHkgZmxhdHRlbnMgYW4gb2JqZWN0IGludG8gYSBmbGF0IHN0cnVjdHVyZSB3aXRoIGRvdC1ub3RhdGlvbiBrZXlzLlxuICpcbiAqIFRoaXMgdXRpbGl0eSBmdW5jdGlvbiB0YWtlcyBhIG5lc3RlZCBvYmplY3QgYW5kIGNvbnZlcnRzIGl0IGludG8gYSBmbGF0IG9iamVjdFxuICogd2hlcmUgbmVzdGVkIHByb3BlcnRpZXMgYXJlIHJlcHJlc2VudGVkIHVzaW5nIGRvdCBub3RhdGlvbi4gSXQgaGFuZGxlcyBib3RoXG4gKiBuZXN0ZWQgb2JqZWN0cyBhbmQgYXJyYXlzLCBwcmVzZXJ2aW5nIGFsbCBsZXZlbHMgb2YgdGhlIG9yaWdpbmFsIHN0cnVjdHVyZVxuICogYXMgc2VwYXJhdGUga2V5cyBpbiB0aGUgcmVzdWx0LlxuICpcbiAqIEBleGFtcGxlXG4gKiBCYXNpYyBvYmplY3QgZmxhdHRlbmluZzpcbiAqIGBgYHRzeFxuICogY29uc3QgbmVzdGVkID0ge1xuICogICB1c2VyOiB7XG4gKiAgICAgbmFtZTogJ0pvaG4nLFxuICogICAgIGFkZHJlc3M6IHtcbiAqICAgICAgIGNpdHk6ICdOZXcgWW9yaycsXG4gKiAgICAgICB6aXA6ICcxMDAwMSdcbiAqICAgICB9XG4gKiAgIH1cbiAqIH07XG4gKlxuICogY29uc3QgZmxhdHRlbmVkID0gZmxhdHRlbk9iamVjdEtleXMobmVzdGVkKTtcbiAqIC8vIFJlc3VsdDpcbiAqIC8vIHtcbiAqIC8vICAgJ3VzZXInOiB7IG5hbWU6ICdKb2huJywgYWRkcmVzczogeyBjaXR5OiAnTmV3IFlvcmsnLCB6aXA6ICcxMDAwMScgfSB9LFxuICogLy8gICAndXNlci5uYW1lJzogJ0pvaG4nLFxuICogLy8gICAndXNlci5hZGRyZXNzJzogeyBjaXR5OiAnTmV3IFlvcmsnLCB6aXA6ICcxMDAwMScgfSxcbiAqIC8vICAgJ3VzZXIuYWRkcmVzcy5jaXR5JzogJ05ldyBZb3JrJyxcbiAqIC8vICAgJ3VzZXIuYWRkcmVzcy56aXAnOiAnMTAwMDEnXG4gKiAvLyB9XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogQXJyYXkgaGFuZGxpbmc6XG4gKiBgYGB0c3hcbiAqIGNvbnN0IHdpdGhBcnJheXMgPSB7XG4gKiAgIGl0ZW1zOiBbXG4gKiAgICAgeyBpZDogMSwgbmFtZTogJ0l0ZW0gMScgfSxcbiAqICAgICB7IGlkOiAyLCBuYW1lOiAnSXRlbSAyJyB9XG4gKiAgIF1cbiAqIH07XG4gKlxuICogY29uc3QgZmxhdHRlbmVkID0gZmxhdHRlbk9iamVjdEtleXMod2l0aEFycmF5cyk7XG4gKiAvLyBSZXN1bHQgaW5jbHVkZXM6XG4gKiAvLyB7XG4gKiAvLyAgICdpdGVtcyc6IFsuLi5dLFxuICogLy8gICAnaXRlbXMuMCc6IHsgaWQ6IDEsIG5hbWU6ICdJdGVtIDEnIH0sXG4gKiAvLyAgICdpdGVtcy4wLmlkJzogMSxcbiAqIC8vICAgJ2l0ZW1zLjAubmFtZSc6ICdJdGVtIDEnLFxuICogLy8gICAnaXRlbXMuMSc6IHsgaWQ6IDIsIG5hbWU6ICdJdGVtIDInIH0sXG4gKiAvLyAgICdpdGVtcy4xLmlkJzogMixcbiAqIC8vICAgJ2l0ZW1zLjEubmFtZSc6ICdJdGVtIDInXG4gKiAvLyB9XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gb2JqIC0gVGhlIG9iamVjdCB0byBmbGF0dGVuXG4gKiBAcGFyYW0gcHJlZml4IC0gSW50ZXJuYWwgcGFyYW1ldGVyIGZvciBidWlsZGluZyBrZXkgcGF0aHMgKHVzZWQgaW4gcmVjdXJzaW9uKVxuICogQHJldHVybnMgQSBmbGF0IG9iamVjdCB3aXRoIGRvdC1ub3RhdGlvbiBrZXlzIHJlcHJlc2VudGluZyB0aGUgb3JpZ2luYWwgc3RydWN0dXJlXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgZmxhdHRlbk9iamVjdEtleXMgPSAob2JqOiB1bmtub3duLCBwcmVmaXggPSBcIlwiKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT4ge1xuICBpZiAoIWlzTmVzdGVkKG9iaikpIHtcbiAgICByZXR1cm4ge1xuICAgICAgW3ByZWZpeF06IG9iaixcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIE9iamVjdC5rZXlzKG9iaikucmVkdWNlKChhY2MsIGtleSkgPT4ge1xuICAgIGNvbnN0IGN1cnJlbnRQcmVmaXggPSBwcmVmaXgubGVuZ3RoID8gYCR7cHJlZml4fS5gIDogXCJcIjtcblxuICAgIGlmIChpc05lc3RlZChvYmpba2V5XSkgJiYgT2JqZWN0LmtleXMob2JqW2tleV0pLmxlbmd0aCkge1xuICAgICAgaWYgKGlzQXJyYXkob2JqW2tleV0pICYmIG9ialtrZXldLmxlbmd0aCkge1xuICAgICAgICBvYmpba2V5XS5mb3JFYWNoKChpdGVtLCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICAgIGFjYyxcbiAgICAgICAgICAgIGZsYXR0ZW5PYmplY3RLZXlzKGl0ZW0sIGAke2N1cnJlbnRQcmVmaXggKyBrZXl9LiR7aW5kZXh9YClcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24oYWNjLCBmbGF0dGVuT2JqZWN0S2V5cyhvYmpba2V5XSwgY3VycmVudFByZWZpeCArIGtleSkpO1xuICAgICAgfVxuXG4gICAgICAvLyBFdmVuIGlmIGl0J3MgYSBuZXN0ZWQgb2JqZWN0LCBpdCBzaG91bGQgYmUgdHJlYXRlZCBhcyBhIGtleSBhcyB3ZWxsXG4gICAgICBhY2NbY3VycmVudFByZWZpeCArIGtleV0gPSBvYmpba2V5XTtcbiAgICB9IGVsc2Uge1xuICAgICAgYWNjW2N1cnJlbnRQcmVmaXggKyBrZXldID0gb2JqW2tleV07XG4gICAgfVxuXG4gICAgcmV0dXJuIGFjYztcbiAgfSwge30gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xufTtcbiIsICJpbXBvcnQgdHlwZSB7IFBpY2tlclZhbGlkRGF0ZSB9IGZyb20gXCJAbXVpL3gtZGF0ZS1waWNrZXJzXCI7XG5pbXBvcnQgdHlwZSB7IHVzZUxvY2FsaXphdGlvbkNvbnRleHQgfSBmcm9tIFwiQG11aS94LWRhdGUtcGlja2Vycy9pbnRlcm5hbHNcIjtcbmltcG9ydCB0eXBlIHsgRGF5anMgfSBmcm9tIFwiZGF5anNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRpbWV6b25lPFREYXRlIGV4dGVuZHMgUGlja2VyVmFsaWREYXRlPihcbiAgYWRhcHRlcjogUmV0dXJuVHlwZTx0eXBlb2YgdXNlTG9jYWxpemF0aW9uQ29udGV4dD4sXG4gIHZhbHVlOiBURGF0ZVxuKTogc3RyaW5nIHwgbnVsbCB7XG4gIHJldHVybiB2YWx1ZSA9PSBudWxsIHx8ICFhZGFwdGVyLnV0aWxzLmlzVmFsaWQodmFsdWUgYXMgdW5rbm93biBhcyBEYXlqcylcbiAgICA/IG51bGxcbiAgICA6IGFkYXB0ZXIudXRpbHMuZ2V0VGltZXpvbmUodmFsdWUgYXMgdW5rbm93biBhcyBEYXlqcyk7XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBGaWVsZFZhbHVlcywgUGF0aCwgVXNlRm9ybVNldEVycm9yIH0gZnJvbSBcInJlYWN0LWhvb2stZm9ybVwiO1xuXG5pbXBvcnQgeyBmbGF0dGVuT2JqZWN0S2V5cyB9IGZyb20gXCIuL2ZsYXR0ZW5PYmplY3RLZXlzXCI7XG5cbmltcG9ydCB0eXBlIHsgVmFsaWRhdGlvbkVycm9ycyB9IGZyb20gXCJAL3R5cGVzXCI7XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgaGFuZGxlU2VydmVyRXJyb3JzIGZ1bmN0aW9uLlxuICpcbiAqIEB0ZW1wbGF0ZSBURmllbGRWYWx1ZXMgLSBUaGUgZm9ybSB2YWx1ZXMgdHlwZVxuICpcbiAqIEBwdWJsaWNcbiAqL1xuaW50ZXJmYWNlIEhhbmRsZVNlcnZlckVycm9yc1R5cGU8VEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcz4ge1xuICAvKipcbiAgICogU2VydmVyIHZhbGlkYXRpb24gZXJyb3JzIG9iamVjdCBjb250YWluaW5nIGZpZWxkLXNwZWNpZmljIGVycm9yIG1lc3NhZ2VzXG4gICAqIEBleGFtcGxlIHsgZW1haWw6ICdFbWFpbCBpcyBhbHJlYWR5IHRha2VuJywgcGFzc3dvcmQ6IFsnVG9vIHNob3J0JywgJ011c3QgY29udGFpbiBudW1iZXJzJ10gfVxuICAgKi9cbiAgZXJyb3JzPzogVmFsaWRhdGlvbkVycm9ycztcbiAgLyoqXG4gICAqIFRoZSBzZXRFcnJvciBmdW5jdGlvbiBmcm9tIHJlYWN0LWhvb2stZm9ybSBmb3Igc2V0dGluZyBmaWVsZCBlcnJvcnNcbiAgICovXG4gIHNldEVycm9yOiBVc2VGb3JtU2V0RXJyb3I8VEZpZWxkVmFsdWVzPjtcbn1cblxuLyoqXG4gKiBQcm9jZXNzZXMgc2VydmVyIHZhbGlkYXRpb24gZXJyb3JzIGFuZCBhcHBsaWVzIHRoZW0gdG8gcmVhY3QtaG9vay1mb3JtIGZpZWxkcy5cbiAqXG4gKiBUaGlzIHV0aWxpdHkgZnVuY3Rpb24gdGFrZXMgdmFsaWRhdGlvbiBlcnJvcnMgZnJvbSBhIHNlcnZlciByZXNwb25zZSBhbmQgYXV0b21hdGljYWxseVxuICogYXBwbGllcyB0aGVtIHRvIHRoZSBjb3JyZXNwb25kaW5nIGZvcm0gZmllbGRzIHVzaW5nIHJlYWN0LWhvb2stZm9ybSdzIHNldEVycm9yIGZ1bmN0aW9uLlxuICogSXQgc3VwcG9ydHMgdmFyaW91cyBlcnJvciBmb3JtYXRzIGluY2x1ZGluZyBzdHJpbmdzLCBhcnJheXMgb2Ygc3RyaW5ncywgYW5kIGJvb2xlYW4gZmxhZ3MuXG4gKlxuICogVGhlIGZ1bmN0aW9uIHVzZXMgb2JqZWN0IGZsYXR0ZW5pbmcgdG8gaGFuZGxlIG5lc3RlZCBlcnJvciBzdHJ1Y3R1cmVzIGFuZCBlbnN1cmVzXG4gKiB0aGF0IG9ubHkgdmFsaWQgZmllbGQgcGF0aHMgYXJlIHByb2Nlc3NlZC5cbiAqXG4gKiBAZXhhbXBsZVxuICogQmFzaWMgdXNhZ2Ugd2l0aCBzZXJ2ZXIgcmVzcG9uc2U6XG4gKiBgYGB0c3hcbiAqIGNvbnN0IHsgc2V0RXJyb3IgfSA9IHVzZUZvcm0oKTtcbiAqXG4gKiB0cnkge1xuICogICBhd2FpdCBzdWJtaXRGb3JtKGRhdGEpO1xuICogfSBjYXRjaCAoZXJyb3IpIHtcbiAqICAgaGFuZGxlU2VydmVyRXJyb3JzKHtcbiAqICAgICBlcnJvcnM6IGVycm9yLnJlc3BvbnNlLmRhdGEuZXJyb3JzLFxuICogICAgIHNldEVycm9yXG4gKiAgIH0pO1xuICogfVxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIFdpdGggZGlmZmVyZW50IGVycm9yIGZvcm1hdHM6XG4gKiBgYGB0c3hcbiAqIGNvbnN0IHNlcnZlckVycm9ycyA9IHtcbiAqICAgZW1haWw6ICdFbWFpbCBpcyBhbHJlYWR5IHRha2VuJyxcbiAqICAgcGFzc3dvcmQ6IFsnVG9vIHNob3J0JywgJ011c3QgY29udGFpbiBudW1iZXJzJ10sXG4gKiAgIHRlcm1zOiB0cnVlIC8vIEJvb2xlYW4gZmxhZyBpbmRpY2F0aW5nIGludmFsaWRcbiAqIH07XG4gKlxuICogaGFuZGxlU2VydmVyRXJyb3JzKHsgZXJyb3JzOiBzZXJ2ZXJFcnJvcnMsIHNldEVycm9yIH0pO1xuICogLy8gUmVzdWx0cyBpbjpcbiAqIC8vIC0gZW1haWwgZmllbGQgc2hvd3M6IFwiRW1haWwgaXMgYWxyZWFkeSB0YWtlblwiXG4gKiAvLyAtIHBhc3N3b3JkIGZpZWxkIHNob3dzOiBcIlRvbyBzaG9ydCBNdXN0IGNvbnRhaW4gbnVtYmVyc1wiXG4gKiAvLyAtIHRlcm1zIGZpZWxkIHNob3dzOiBcIkZpZWxkIGlzIG5vdCB2YWxpZC5cIlxuICogYGBgXG4gKlxuICogQHRlbXBsYXRlIFRGaWVsZFZhbHVlcyAtIFRoZSBmb3JtIHZhbHVlcyB0eXBlXG4gKlxuICogQHBhcmFtIGFyZ3MgLSBDb25maWd1cmF0aW9uIG9iamVjdCBjb250YWluaW5nIGVycm9ycyBhbmQgc2V0RXJyb3IgZnVuY3Rpb25cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBoYW5kbGVTZXJ2ZXJFcnJvcnMgPSBmdW5jdGlvbiBoYW5kbGVTZXJ2ZXJFcnJvcnM8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXNcbj4oYXJnczogSGFuZGxlU2VydmVyRXJyb3JzVHlwZTxURmllbGRWYWx1ZXM+KSB7XG4gIGNvbnN0IHsgZXJyb3JzLCBzZXRFcnJvciB9ID0gYXJncztcblxuICBmb3IgKGNvbnN0IGtleSBpbiBlcnJvcnMpIHtcbiAgICBjb25zdCBpc0tleUluVmFyaWFibGVzID0gT2JqZWN0LmtleXMoZmxhdHRlbk9iamVjdEtleXMoZXJyb3JzKSkuaW5jbHVkZXMoXG4gICAgICBrZXlcbiAgICApO1xuXG4gICAgaWYgKCFpc0tleUluVmFyaWFibGVzKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBmaWVsZEVycm9yID0gZXJyb3JzW2tleV07XG5cbiAgICBsZXQgZXJyb3JNZXNzYWdlID0gXCJcIjtcblxuICAgIGlmIChBcnJheS5pc0FycmF5KGZpZWxkRXJyb3IpKSB7XG4gICAgICBlcnJvck1lc3NhZ2UgPSBmaWVsZEVycm9yLmpvaW4oXCIgXCIpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgZmllbGRFcnJvciA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgZXJyb3JNZXNzYWdlID0gZmllbGRFcnJvcjtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGZpZWxkRXJyb3IgPT09IFwiYm9vbGVhblwiICYmIGZpZWxkRXJyb3IpIHtcbiAgICAgIGVycm9yTWVzc2FnZSA9IFwiRmllbGQgaXMgbm90IHZhbGlkLlwiO1xuICAgIH1cblxuICAgIHNldEVycm9yKGtleSBhcyBQYXRoPFRGaWVsZFZhbHVlcz4sIHtcbiAgICAgIG1lc3NhZ2U6IGVycm9yTWVzc2FnZSxcbiAgICB9KTtcbiAgfVxufTtcbiIsICIvKipcbiAqIFR5cGUtc2FmZSBwcm9wZXJ0eSBleGlzdGVuY2UgY2hlY2tlciB0aGF0IGFjdHMgYXMgYSB0eXBlIGd1YXJkLlxuICpcbiAqIENoZWNrcyBpZiBhIGdpdmVuIHByb3BlcnR5IGV4aXN0cyBvbiBhbiBvYmplY3QgYW5kIG5hcnJvd3MgdGhlIFR5cGVTY3JpcHQgdHlwZVxuICogdG8gaW5jbHVkZSB0aGF0IHByb3BlcnR5LiBUaGlzIGlzIHVzZWZ1bCBmb3Igc2FmZWx5IGFjY2Vzc2luZyBwcm9wZXJ0aWVzIG9uXG4gKiBvYmplY3RzIG9mIHVua25vd24gc3RydWN0dXJlIHdoaWxlIG1haW50YWluaW5nIHR5cGUgc2FmZXR5LlxuICpcbiAqIEB0ZW1wbGF0ZSBYIC0gVGhlIHR5cGUgb2YgdGhlIG9iamVjdCBiZWluZyBjaGVja2VkXG4gKiBAdGVtcGxhdGUgWSAtIFRoZSB0eXBlIG9mIHRoZSBwcm9wZXJ0eSBrZXkgKGV4dGVuZHMgUHJvcGVydHlLZXkpXG4gKlxuICogQHBhcmFtIG9iaiAtIFRoZSBvYmplY3QgdG8gY2hlY2sgZm9yIHRoZSBwcm9wZXJ0eVxuICogQHBhcmFtIHByb3AgLSBUaGUgcHJvcGVydHkga2V5IHRvIGNoZWNrIGZvciBleGlzdGVuY2VcbiAqXG4gKiBAcmV0dXJucyBBIHR5cGUgcHJlZGljYXRlIGluZGljYXRpbmcgd2hldGhlciB0aGUgcHJvcGVydHkgZXhpc3RzIG9uIHRoZSBvYmplY3QuXG4gKiAgICAgICAgICBJZiB0cnVlLCB0aGUgb2JqZWN0IHR5cGUgaXMgbmFycm93ZWQgdG8gaW5jbHVkZSB0aGUgc3BlY2lmaWVkIHByb3BlcnR5LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBkYXRhOiB1bmtub3duID0geyBuYW1lOiBcIkpvaG5cIiwgYWdlOiAzMCB9O1xuICpcbiAqIGlmIChwcm9wZXJ0eUV4aXN0cyhkYXRhLCBcIm5hbWVcIikpIHtcbiAqICAgLy8gVHlwZVNjcmlwdCBub3cga25vd3MgZGF0YSBoYXMgYSAnbmFtZScgcHJvcGVydHlcbiAqICAgY29uc29sZS5sb2coZGF0YS5uYW1lKTsgLy8gVHlwZS1zYWZlIGFjY2Vzc1xuICogfVxuICpcbiAqIC8vIENoZWNrIGZvciBuZXN0ZWQgcHJvcGVydHkgZXhpc3RlbmNlXG4gKiBpZiAocHJvcGVydHlFeGlzdHMob2JqLCBcInVzZXJcIikgJiYgcHJvcGVydHlFeGlzdHMob2JqLnVzZXIsIFwiaWRcIikpIHtcbiAqICAgY29uc29sZS5sb2cob2JqLnVzZXIuaWQpOyAvLyBTYWZlIG5lc3RlZCBhY2Nlc3NcbiAqIH1cbiAqIGBgYFxuICpcbiAqIEBzaW5jZSAyLjE4LjQ1XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm9wZXJ0eUV4aXN0czxYLCBZIGV4dGVuZHMgUHJvcGVydHlLZXk+KFxuICAgIG9iajogWCxcbiAgICBwcm9wOiBZXG4pOiBvYmogaXMgWCAmIFJlY29yZDxZLCB1bmtub3duPiB7XG4gICAgcmV0dXJuIChcbiAgICAgICAgdHlwZW9mIG9iaiA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgICBvYmogIT09IG51bGwgJiZcbiAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcClcbiAgICApO1xufVxuIiwgImltcG9ydCB0eXBlIHsgUGlja2VyVmFsaWREYXRlIH0gZnJvbSBcIkBtdWkveC1kYXRlLXBpY2tlcnNcIjtcbmltcG9ydCB0eXBlIHsgdXNlTG9jYWxpemF0aW9uQ29udGV4dCB9IGZyb20gXCJAbXVpL3gtZGF0ZS1waWNrZXJzL2ludGVybmFsc1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gcmVhZFZhbHVlQXNEYXRlPFREYXRlIGV4dGVuZHMgUGlja2VyVmFsaWREYXRlPihcbiAgYWRhcHRlcjogUmV0dXJuVHlwZTx0eXBlb2YgdXNlTG9jYWxpemF0aW9uQ29udGV4dD4sXG4gIHZhbHVlOiBzdHJpbmcgfCBudWxsIHwgVERhdGVcbik6IFREYXRlIHwgbnVsbCB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICBpZiAodmFsdWUgPT09IFwiXCIpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBhZGFwdGVyLnV0aWxzLmRhdGUodmFsdWUpIGFzIFREYXRlO1xuICB9XG5cbiAgcmV0dXJuIHZhbHVlO1xufVxuIiwgImV4cG9ydCBjb25zdCByZW1vdmVMZWFkaW5nVHJhaWxpbmdTbGFzaGVzID0gKHJvdXRlOiBzdHJpbmcpID0+IHtcbiAgcmV0dXJuIHJvdXRlLnJlcGxhY2UoL15cXC98XFwvJC9nLCBcIlwiKTtcbn07XG4iLCAiaW1wb3J0IGRheWpzIGZyb20gXCJkYXlqc1wiO1xuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcblxuZXhwb3J0IGNvbnN0IHNjaGVtYVRvb2xzID0ge1xuICAvLyBEYXRlIHZhbGlkYXRpb25zXG4gIGRhdGU6ICh7IG1lc3NhZ2UgfTogeyBtZXNzYWdlPzogc3RyaW5nIH0gPSB7fSkgPT5cbiAgICB6LmNvZXJjZVxuICAgICAgLnN0cmluZygpXG4gICAgICAudHJhbnNmb3JtKChjKSA9PiAoYyA9PT0gXCJudWxsXCIgfHwgYyA9PT0gXCJ1bmRlZmluZWRcIiA/IG51bGwgOiBjKSlcbiAgICAgIC5yZWZpbmUoKGMpID0+ICEhYywgeyBtZXNzYWdlOiBtZXNzYWdlIHx8IFwiRGF0ZSBpcyByZXF1aXJlZFwiIH0pXG4gICAgICAucmVmaW5lKChjKSA9PiAoYyA/IGRheWpzKGMpLmlzVmFsaWQoKSA6IHRydWUpLCB7XG4gICAgICAgIG1lc3NhZ2U6IG1lc3NhZ2UgfHwgXCJJbnZhbGlkIGRhdGVcIixcbiAgICAgIH0pLFxuXG4gIG51bGxhYmxlRGF0ZTogKHsgbWVzc2FnZSB9OiB7IG1lc3NhZ2U/OiBzdHJpbmcgfSA9IHt9KSA9PlxuICAgIHouY29lcmNlXG4gICAgICAuc3RyaW5nKClcbiAgICAgIC50cmFuc2Zvcm0oKGMpID0+IChjID09PSBcIm51bGxcIiA/IG51bGwgOiBjKSlcbiAgICAgIC50cmFuc2Zvcm0oKGMpID0+IChjID09PSBcInVuZGVmaW5lZFwiID8gbnVsbCA6IGMpKVxuICAgICAgLnJlZmluZSgoYykgPT4gKCFjICYmIGMgIT09IG51bGwgPyBkYXlqcyhjKS5pc1ZhbGlkKCkgOiB0cnVlKSwge1xuICAgICAgICBtZXNzYWdlOiBtZXNzYWdlIHx8IFwiSW52YWxpZCBkYXRlXCIsXG4gICAgICB9KSxcblxuICBkYXRlUmFuZ2U6ICh7IG1lc3NhZ2UgfTogeyBtZXNzYWdlPzogc3RyaW5nIH0gPSB7fSkgPT5cbiAgICB6Lm9iamVjdCh7XG4gICAgICBzdGFydDogei5jb2VyY2UuZGF0ZSgpLFxuICAgICAgZW5kOiB6LmNvZXJjZS5kYXRlKCksXG4gICAgfSkucmVmaW5lKChkYXRhKSA9PiBkYXRhLnN0YXJ0IDw9IGRhdGEuZW5kLCB7XG4gICAgICBtZXNzYWdlOiBtZXNzYWdlIHx8IFwiU3RhcnQgZGF0ZSBtdXN0IGJlIGJlZm9yZSBvciBlcXVhbCB0byBlbmQgZGF0ZVwiLFxuICAgIH0pLFxuXG4gIC8vIFN0cmluZyB2YWxpZGF0aW9uc1xuICByZXF1aXJlZFN0cmluZzogKHsgbWVzc2FnZSwgbWluLCBtYXggfTogeyBtZXNzYWdlPzogc3RyaW5nOyBtaW4/OiBudW1iZXI7IG1heD86IG51bWJlciB9ID0ge30pID0+XG4gICAgei5zdHJpbmcoKVxuICAgICAgLnRyaW0oKVxuICAgICAgLm1pbihtaW4gfHwgMSwgbWVzc2FnZSB8fCBgU3RyaW5nIG11c3QgYmUgYXQgbGVhc3QgJHttaW4gfHwgMX0gY2hhcmFjdGVyc2ApXG4gICAgICAubWF4KG1heCB8fCAyNTUsIG1lc3NhZ2UgfHwgYFN0cmluZyBtdXN0IGJlIGF0IG1vc3QgJHttYXggfHwgMjU1fSBjaGFyYWN0ZXJzYCksXG5cbiAgZW1haWw6ICh7IG1lc3NhZ2UgfTogeyBtZXNzYWdlPzogc3RyaW5nIH0gPSB7fSkgPT5cbiAgICB6LnN0cmluZygpXG4gICAgICAuZW1haWwobWVzc2FnZSB8fCBcIkludmFsaWQgZW1haWwgYWRkcmVzc1wiKVxuICAgICAgLm1heCgyNTQsIFwiRW1haWwgbXVzdCBiZSBhdCBtb3N0IDI1NCBjaGFyYWN0ZXJzXCIpLFxuXG4gIHVybDogKHsgbWVzc2FnZSB9OiB7IG1lc3NhZ2U/OiBzdHJpbmcgfSA9IHt9KSA9PlxuICAgIHouc3RyaW5nKClcbiAgICAgIC51cmwobWVzc2FnZSB8fCBcIkludmFsaWQgVVJMIGZvcm1hdFwiKSxcblxuICBwaG9uZTogKHsgbWVzc2FnZSB9OiB7IG1lc3NhZ2U/OiBzdHJpbmcgfSA9IHt9KSA9PlxuICAgIHouc3RyaW5nKClcbiAgICAgIC5yZWdleCgvXltcXCtdP1sxLTldW1xcZF17MCwxNX0kLywgbWVzc2FnZSB8fCBcIkludmFsaWQgcGhvbmUgbnVtYmVyIGZvcm1hdFwiKSxcblxuICBhbHBoYW51bWVyaWM6ICh7IG1lc3NhZ2UgfTogeyBtZXNzYWdlPzogc3RyaW5nIH0gPSB7fSkgPT5cbiAgICB6LnN0cmluZygpXG4gICAgICAucmVnZXgoL15bYS16QS1aMC05XSskLywgbWVzc2FnZSB8fCBcIk9ubHkgbGV0dGVycyBhbmQgbnVtYmVycyBhcmUgYWxsb3dlZFwiKSxcblxuICBzbHVnOiAoeyBtZXNzYWdlIH06IHsgbWVzc2FnZT86IHN0cmluZyB9ID0ge30pID0+XG4gICAgei5zdHJpbmcoKVxuICAgICAgLnJlZ2V4KC9eW2EtejAtOV0rKD86LVthLXowLTldKykqJC8sIG1lc3NhZ2UgfHwgXCJJbnZhbGlkIHNsdWcgZm9ybWF0XCIpLFxuXG4gIC8vIE51bWJlciB2YWxpZGF0aW9uc1xuICBwb3NpdGl2ZU51bWJlcjogKHsgbWVzc2FnZSwgbWluLCBtYXggfTogeyBtZXNzYWdlPzogc3RyaW5nOyBtaW4/OiBudW1iZXI7IG1heD86IG51bWJlciB9ID0ge30pID0+XG4gICAgei5udW1iZXIoKVxuICAgICAgLnBvc2l0aXZlKG1lc3NhZ2UgfHwgXCJOdW1iZXIgbXVzdCBiZSBwb3NpdGl2ZVwiKVxuICAgICAgLm1pbihtaW4gfHwgMC4wMSwgYE51bWJlciBtdXN0IGJlIGF0IGxlYXN0ICR7bWluIHx8IDAuMDF9YClcbiAgICAgIC5tYXgobWF4IHx8IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSLCBgTnVtYmVyIG11c3QgYmUgYXQgbW9zdCAke21heCB8fCBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUn1gKSxcblxuICBub25OZWdhdGl2ZU51bWJlcjogKHsgbWVzc2FnZSwgbWF4IH06IHsgbWVzc2FnZT86IHN0cmluZzsgbWF4PzogbnVtYmVyIH0gPSB7fSkgPT5cbiAgICB6Lm51bWJlcigpXG4gICAgICAubWluKDAsIG1lc3NhZ2UgfHwgXCJOdW1iZXIgbXVzdCBiZSBub24tbmVnYXRpdmVcIilcbiAgICAgIC5tYXgobWF4IHx8IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSLCBgTnVtYmVyIG11c3QgYmUgYXQgbW9zdCAke21heCB8fCBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUn1gKSxcblxuICBpbnRlZ2VyOiAoeyBtZXNzYWdlLCBtaW4sIG1heCB9OiB7IG1lc3NhZ2U/OiBzdHJpbmc7IG1pbj86IG51bWJlcjsgbWF4PzogbnVtYmVyIH0gPSB7fSkgPT5cbiAgICB6Lm51bWJlcigpXG4gICAgICAuaW50KG1lc3NhZ2UgfHwgXCJNdXN0IGJlIGFuIGludGVnZXJcIilcbiAgICAgIC5taW4obWluIHx8IE51bWJlci5NSU5fU0FGRV9JTlRFR0VSLCBgTnVtYmVyIG11c3QgYmUgYXQgbGVhc3QgJHttaW4gfHwgTnVtYmVyLk1JTl9TQUZFX0lOVEVHRVJ9YClcbiAgICAgIC5tYXgobWF4IHx8IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSLCBgTnVtYmVyIG11c3QgYmUgYXQgbW9zdCAke21heCB8fCBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUn1gKSxcblxuICBwZXJjZW50YWdlOiAoeyBtZXNzYWdlIH06IHsgbWVzc2FnZT86IHN0cmluZyB9ID0ge30pID0+XG4gICAgei5udW1iZXIoKVxuICAgICAgLm1pbigwLCBtZXNzYWdlIHx8IFwiUGVyY2VudGFnZSBtdXN0IGJlIGJldHdlZW4gMCBhbmQgMTAwXCIpXG4gICAgICAubWF4KDEwMCwgbWVzc2FnZSB8fCBcIlBlcmNlbnRhZ2UgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDEwMFwiKSxcblxuICAvLyBBcnJheSB2YWxpZGF0aW9uc1xuICBub25FbXB0eUFycmF5OiA8VD4oc2NoZW1hOiB6LlpvZFNjaGVtYTxUPiwgeyBtZXNzYWdlIH06IHsgbWVzc2FnZT86IHN0cmluZyB9ID0ge30pID0+XG4gICAgei5hcnJheShzY2hlbWEpXG4gICAgICAubWluKDEsIG1lc3NhZ2UgfHwgXCJBdCBsZWFzdCBvbmUgaXRlbSBpcyByZXF1aXJlZFwiKSxcblxuICB1bmlxdWVBcnJheTogPFQ+KHNjaGVtYTogei5ab2RTY2hlbWE8VD4sIHsgbWVzc2FnZSB9OiB7IG1lc3NhZ2U/OiBzdHJpbmcgfSA9IHt9KSA9PlxuICAgIHouYXJyYXkoc2NoZW1hKVxuICAgICAgLnJlZmluZSgoaXRlbXMpID0+IG5ldyBTZXQoaXRlbXMpLnNpemUgPT09IGl0ZW1zLmxlbmd0aCwge1xuICAgICAgICBtZXNzYWdlOiBtZXNzYWdlIHx8IFwiQWxsIGl0ZW1zIG11c3QgYmUgdW5pcXVlXCIsXG4gICAgICB9KSxcblxuICAvLyBCb29sZWFuIHZhbGlkYXRpb25zXG4gIHJlcXVpcmVkQm9vbGVhbjogKHsgbWVzc2FnZSB9OiB7IG1lc3NhZ2U/OiBzdHJpbmcgfSA9IHt9KSA9PlxuICAgIHouYm9vbGVhbih7XG4gICAgICBtZXNzYWdlOiBtZXNzYWdlIHx8IFwiVGhpcyBmaWVsZCBpcyByZXF1aXJlZFwiLFxuICAgIH0pLFxuXG4gIC8vIE9iamVjdCB2YWxpZGF0aW9uc1xuICBub25FbXB0eU9iamVjdDogPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oc2NoZW1hOiB6LlpvZFNjaGVtYTxUPiwgeyBtZXNzYWdlIH06IHsgbWVzc2FnZT86IHN0cmluZyB9ID0ge30pID0+XG4gICAgc2NoZW1hLnJlZmluZSgob2JqKSA9PiBPYmplY3Qua2V5cyhvYmopLmxlbmd0aCA+IDAsIHtcbiAgICAgIG1lc3NhZ2U6IG1lc3NhZ2UgfHwgXCJPYmplY3QgY2Fubm90IGJlIGVtcHR5XCIsXG4gICAgfSksXG5cbiAgLy8gRmlsZSB2YWxpZGF0aW9uc1xuICBmaWxlU2l6ZTogKHsgbWF4U2l6ZSwgbWVzc2FnZSB9OiB7IG1heFNpemU6IG51bWJlcjsgbWVzc2FnZT86IHN0cmluZyB9KSA9PlxuICAgIHouaW5zdGFuY2VvZihGaWxlKVxuICAgICAgLnJlZmluZSgoZmlsZSkgPT4gZmlsZS5zaXplIDw9IG1heFNpemUsIHtcbiAgICAgICAgbWVzc2FnZTogbWVzc2FnZSB8fCBgRmlsZSBzaXplIG11c3QgYmUgbGVzcyB0aGFuICR7TWF0aC5yb3VuZChtYXhTaXplIC8gMTAyNCAvIDEwMjQpfU1CYCxcbiAgICAgIH0pLFxuXG4gIGZpbGVUeXBlOiAoeyBhbGxvd2VkVHlwZXMsIG1lc3NhZ2UgfTogeyBhbGxvd2VkVHlwZXM6IHN0cmluZ1tdOyBtZXNzYWdlPzogc3RyaW5nIH0pID0+XG4gICAgei5pbnN0YW5jZW9mKEZpbGUpXG4gICAgICAucmVmaW5lKChmaWxlKSA9PiBhbGxvd2VkVHlwZXMuaW5jbHVkZXMoZmlsZS50eXBlKSwge1xuICAgICAgICBtZXNzYWdlOiBtZXNzYWdlIHx8IGBGaWxlIHR5cGUgbXVzdCBiZSBvbmUgb2Y6ICR7YWxsb3dlZFR5cGVzLmpvaW4oXCIsIFwiKX1gLFxuICAgICAgfSksXG5cbiAgLy8gQ3VzdG9tIHZhbGlkYXRvcnNcbiAgY29uZGl0aW9uYWw6IDxULCBVPihcbiAgICBjb25kaXRpb246IChkYXRhOiBUKSA9PiBib29sZWFuLFxuICAgIHRydWVTY2hlbWE6IHouWm9kU2NoZW1hPFU+LFxuICAgIGZhbHNlU2NoZW1hOiB6LlpvZFNjaGVtYTxVPlxuICApID0+XG4gICAgei51bmlvbihbdHJ1ZVNjaGVtYSwgZmFsc2VTY2hlbWFdKVxuICAgICAgLnN1cGVyUmVmaW5lKChkYXRhLCBjdHgpID0+IHtcbiAgICAgICAgY29uc3Qgc2hvdWxkVXNlVHJ1ZSA9IGNvbmRpdGlvbihkYXRhIGFzIHVua25vd24gYXMgVCk7XG4gICAgICAgIGNvbnN0IHNjaGVtYSA9IHNob3VsZFVzZVRydWUgPyB0cnVlU2NoZW1hIDogZmFsc2VTY2hlbWE7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHNjaGVtYS5zYWZlUGFyc2UoZGF0YSk7XG4gICAgICAgIFxuICAgICAgICBpZiAoIXJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgICAgY3R4LmFkZElzc3VlKHtcbiAgICAgICAgICAgIGNvZGU6IHouWm9kSXNzdWVDb2RlLmN1c3RvbSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHJlc3VsdC5lcnJvci5tZXNzYWdlLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KSxcblxuICB0cmFuc2Zvcm06IHtcbiAgICB0b0xvd2VyQ2FzZTogei5zdHJpbmcoKS50cmFuc2Zvcm0oKHZhbCkgPT4gdmFsLnRvTG93ZXJDYXNlKCkpLFxuICAgIHRvVXBwZXJDYXNlOiB6LnN0cmluZygpLnRyYW5zZm9ybSgodmFsKSA9PiB2YWwudG9VcHBlckNhc2UoKSksXG4gICAgdHJpbTogei5zdHJpbmcoKS50cmFuc2Zvcm0oKHZhbCkgPT4gdmFsLnRyaW0oKSksXG4gICAgdG9OdW1iZXI6IHouc3RyaW5nKCkudHJhbnNmb3JtKCh2YWwpID0+IE51bWJlcih2YWwpKSxcbiAgICB0b0Jvb2xlYW46IHouc3RyaW5nKCkudHJhbnNmb3JtKCh2YWwpID0+IHZhbCA9PT0gXCJ0cnVlXCIpLFxuICAgIHBhcnNlSnNvbjogPFQ+KHNjaGVtYTogei5ab2RTY2hlbWE8VD4pID0+IFxuICAgICAgei5zdHJpbmcoKS50cmFuc2Zvcm0oKHZhbCwgY3R4KSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZSh2YWwpO1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHNjaGVtYS5zYWZlUGFyc2UocGFyc2VkKTtcblxuICAgICAgICAgIGlmIChyZXN1bHQuc3VjY2VzcykgcmV0dXJuIHJlc3VsdC5kYXRhO1xuICAgICAgICAgIFxuICAgICAgICAgIGN0eC5hZGRJc3N1ZSh7XG4gICAgICAgICAgICBjb2RlOiB6LlpvZElzc3VlQ29kZS5jdXN0b20sXG4gICAgICAgICAgICBtZXNzYWdlOiByZXN1bHQuZXJyb3IubWVzc2FnZSxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHJldHVybiB6Lk5FVkVSO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICBjdHguYWRkSXNzdWUoe1xuICAgICAgICAgICAgY29kZTogei5ab2RJc3N1ZUNvZGUuY3VzdG9tLFxuICAgICAgICAgICAgbWVzc2FnZTogXCJJbnZhbGlkIEpTT05cIixcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHJldHVybiB6Lk5FVkVSO1xuICAgICAgICB9XG4gICAgICB9KSxcbiAgfSxcbn07XG4iLCAiLyoqXG4gKiBUeXBlIGd1YXJkIHV0aWxpdGllcyBmb3IgcnVudGltZSB0eXBlIGNoZWNraW5nXG4gKiBcbiAqIEBwYWNrYWdlRG9jdW1lbnRhdGlvblxuICovXG5cbi8qKlxuICogVHlwZSBndWFyZCB0byBjaGVjayBpZiBhIHZhbHVlIGlzIGEgbm9uLW51bGwgb2JqZWN0IChleGNsdWRpbmcgYXJyYXlzKVxuICogXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gY2hlY2tcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIHZhbHVlIGlzIGEgcGxhaW4gb2JqZWN0XG4gKiBcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpZiAoaXNSZWNvcmQodmFsdWUpKSB7XG4gKiAgIC8vIHZhbHVlIGlzIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gKiAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyh2YWx1ZSk7XG4gKiB9XG4gKiBgYGBcbiAqIFxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNSZWNvcmQodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KHZhbHVlKTtcbn1cblxuLyoqXG4gKiBUeXBlIGd1YXJkIHRvIGNoZWNrIGlmIGFuIG9iamVjdCBoYXMgYSBzcGVjaWZpYyBwcm9wZXJ0eVxuICogXG4gKiBAcGFyYW0gb2JqIC0gVGhlIG9iamVjdCB0byBjaGVja1xuICogQHBhcmFtIGtleSAtIFRoZSBwcm9wZXJ0eSBrZXkgdG8gbG9vayBmb3JcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIG9iamVjdCBoYXMgdGhlIHByb3BlcnR5XG4gKiBcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpZiAoaGFzUHJvcGVydHkob2JqLCAnbmFtZScpKSB7XG4gKiAgIC8vIG9iaiBpcyBSZWNvcmQ8J25hbWUnLCB1bmtub3duPlxuICogICBjb25zb2xlLmxvZyhvYmoubmFtZSk7XG4gKiB9XG4gKiBgYGBcbiAqIFxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzUHJvcGVydHk8SyBleHRlbmRzIFByb3BlcnR5S2V5PihcbiAgb2JqOiB1bmtub3duLFxuICBrZXk6IEtcbik6IG9iaiBpcyBSZWNvcmQ8SywgdW5rbm93bj4ge1xuICByZXR1cm4gaXNSZWNvcmQob2JqKSAmJiBrZXkgaW4gb2JqO1xufVxuXG4vKipcbiAqIFR5cGUgZ3VhcmQgdG8gY2hlY2sgaWYgYSB2YWx1ZSBpcyBhIG5vbi1lbXB0eSBzdHJpbmdcbiAqIFxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNoZWNrXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSB2YWx1ZSBpcyBhIG5vbi1lbXB0eSBzdHJpbmdcbiAqIFxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGlmIChpc05vbkVtcHR5U3RyaW5nKHZhbHVlKSkge1xuICogICAvLyB2YWx1ZSBpcyBzdHJpbmcgd2l0aCBsZW5ndGggPiAwXG4gKiAgIGNvbnNvbGUubG9nKHZhbHVlLnRvVXBwZXJDYXNlKCkpO1xuICogfVxuICogYGBgXG4gKiBcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTm9uRW1wdHlTdHJpbmcodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBzdHJpbmcge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS5sZW5ndGggPiAwO1xufVxuXG4vKipcbiAqIFR5cGUgZ3VhcmQgdG8gY2hlY2sgaWYgYSB2YWx1ZSBpcyBhIHZhbGlkIGFycmF5XG4gKiBcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBjaGVja1xuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgdmFsdWUgaXMgYW4gYXJyYXlcbiAqIFxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICogICAvLyB2YWx1ZSBpcyB1bmtub3duW11cbiAqICAgdmFsdWUuZm9yRWFjaChpdGVtID0+IGNvbnNvbGUubG9nKGl0ZW0pKTtcbiAqIH1cbiAqIGBgYFxuICogXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0FycmF5PFQgPSB1bmtub3duPih2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFRbXSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKTtcbn1cblxuLyoqXG4gKiBUeXBlIGd1YXJkIHRvIGNoZWNrIGlmIGEgdmFsdWUgaXMgYSBub24tZW1wdHkgYXJyYXlcbiAqIFxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNoZWNrXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSB2YWx1ZSBpcyBhIG5vbi1lbXB0eSBhcnJheVxuICogXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaWYgKGlzTm9uRW1wdHlBcnJheShpdGVtcykpIHtcbiAqICAgLy8gaXRlbXMgaXMgW1QsIC4uLlRbXV0gLSBndWFyYW50ZWVkIHRvIGhhdmUgYXQgbGVhc3Qgb25lIGVsZW1lbnRcbiAqICAgY29uc3QgZmlyc3QgPSBpdGVtc1swXTsgIC8vIFNhZmUgYWNjZXNzXG4gKiB9XG4gKiBgYGBcbiAqIFxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNOb25FbXB0eUFycmF5PFQ+KHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgW1QsIC4uLlRbXV0ge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID4gMDtcbn1cblxuLyoqXG4gKiBUeXBlIGd1YXJkIHRvIGNoZWNrIGlmIGEgdmFsdWUgaXMgYSBmdW5jdGlvblxuICogXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gY2hlY2tcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIHZhbHVlIGlzIGEgZnVuY3Rpb25cbiAqIFxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGlmIChpc0Z1bmN0aW9uKGNhbGxiYWNrKSkge1xuICogICAvLyBjYWxsYmFjayBpcyAoLi4uYXJnczogdW5rbm93bltdKSA9PiB1bmtub3duXG4gKiAgIGNhbGxiYWNrKCk7XG4gKiB9XG4gKiBgYGBcbiAqIFxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNGdW5jdGlvbihcbiAgdmFsdWU6IHVua25vd25cbik6IHZhbHVlIGlzICguLi5hcmdzOiByZWFkb25seSB1bmtub3duW10pID0+IHVua25vd24ge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nO1xufVxuXG4vKipcbiAqIFR5cGUgZ3VhcmQgdG8gY2hlY2sgaWYgYSB2YWx1ZSBpcyBhIHN0cmluZ1xuICogXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gY2hlY2tcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIHZhbHVlIGlzIGEgc3RyaW5nIChpbmNsdWRpbmcgZW1wdHkgc3RyaW5nKVxuICogXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaWYgKGlzU3RyaW5nKHZhbHVlKSkge1xuICogICAvLyB2YWx1ZSBpcyBzdHJpbmdcbiAqICAgY29uc29sZS5sb2codmFsdWUubGVuZ3RoKTtcbiAqIH1cbiAqIGBgYFxuICogXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1N0cmluZyh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIHN0cmluZyB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnO1xufVxuXG4vKipcbiAqIFR5cGUgZ3VhcmQgdG8gY2hlY2sgaWYgYSB2YWx1ZSBpcyBhIG51bWJlciAoZXhjbHVkaW5nIE5hTilcbiAqIFxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNoZWNrXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSB2YWx1ZSBpcyBhIHZhbGlkIG51bWJlclxuICogXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaWYgKGlzTnVtYmVyKHZhbHVlKSkge1xuICogICAvLyB2YWx1ZSBpcyBudW1iZXIgKG5vdCBOYU4pXG4gKiAgIGNvbnN0IGRvdWJsZWQgPSB2YWx1ZSAqIDI7XG4gKiB9XG4gKiBgYGBcbiAqIFxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNOdW1iZXIodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBudW1iZXIge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiAhaXNOYU4odmFsdWUpO1xufVxuXG4vKipcbiAqIFR5cGUgZ3VhcmQgdG8gY2hlY2sgaWYgYSB2YWx1ZSBpcyBhIGJvb2xlYW5cbiAqIFxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNoZWNrXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSB2YWx1ZSBpcyBhIGJvb2xlYW5cbiAqIFxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGlmIChpc0Jvb2xlYW4odmFsdWUpKSB7XG4gKiAgIC8vIHZhbHVlIGlzIGJvb2xlYW5cbiAqICAgY29uc29sZS5sb2coIXZhbHVlKTtcbiAqIH1cbiAqIGBgYFxuICogXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0Jvb2xlYW4odmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nO1xufVxuXG4vKipcbiAqIFR5cGUgZ3VhcmQgdG8gY2hlY2sgaWYgYSB2YWx1ZSBpcyBudWxsXG4gKiBcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBjaGVja1xuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgdmFsdWUgaXMgbnVsbFxuICogXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaWYgKGlzTnVsbCh2YWx1ZSkpIHtcbiAqICAgLy8gdmFsdWUgaXMgbnVsbFxuICogICByZXR1cm4gZGVmYXVsdFZhbHVlO1xuICogfVxuICogYGBgXG4gKiBcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTnVsbCh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIG51bGwge1xuICByZXR1cm4gdmFsdWUgPT09IG51bGw7XG59XG5cbi8qKlxuICogVHlwZSBndWFyZCB0byBjaGVjayBpZiBhIHZhbHVlIGlzIHVuZGVmaW5lZFxuICogXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gY2hlY2tcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIHZhbHVlIGlzIHVuZGVmaW5lZFxuICogXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaWYgKGlzVW5kZWZpbmVkKHZhbHVlKSkge1xuICogICAvLyB2YWx1ZSBpcyB1bmRlZmluZWRcbiAqICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbiAqIH1cbiAqIGBgYFxuICogXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1VuZGVmaW5lZCh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIHVuZGVmaW5lZCB7XG4gIHJldHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFR5cGUgZ3VhcmQgdG8gY2hlY2sgaWYgYSB2YWx1ZSBpcyBudWxsIG9yIHVuZGVmaW5lZFxuICogXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gY2hlY2tcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIHZhbHVlIGlzIG51bGxpc2hcbiAqIFxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGlmIChpc051bGxpc2godmFsdWUpKSB7XG4gKiAgIC8vIHZhbHVlIGlzIG51bGwgfCB1bmRlZmluZWRcbiAqICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbiAqIH1cbiAqIFxuICogaWYgKCFpc051bGxpc2godmFsdWUpKSB7XG4gKiAgIC8vIHZhbHVlIGlzIE5vbk51bGxhYmxlPHR5cGVvZiB2YWx1ZT5cbiAqICAgY29uc29sZS5sb2codmFsdWUpO1xuICogfVxuICogYGBgXG4gKiBcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTnVsbGlzaCh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIG51bGwgfCB1bmRlZmluZWQge1xuICByZXR1cm4gdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBUeXBlIGd1YXJkIHRvIGNoZWNrIGlmIGEgdmFsdWUgaXMgZGVmaW5lZCAobm90IG51bGwgb3IgdW5kZWZpbmVkKVxuICogXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gY2hlY2tcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIHZhbHVlIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICogXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgZmlsdGVyZWQgPSBpdGVtcy5maWx0ZXIoaXNEZWZpbmVkKTtcbiAqIC8vIGZpbHRlcmVkIGhhcyB0eXBlOiBOb25OdWxsYWJsZTxUPltdXG4gKiBgYGBcbiAqIFxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNEZWZpbmVkPFQ+KHZhbHVlOiBUKTogdmFsdWUgaXMgTm9uTnVsbGFibGU8VD4ge1xuICByZXR1cm4gdmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBUeXBlIGd1YXJkIHRvIGNoZWNrIGlmIGEgdmFsdWUgaXMgYSBEYXRlIG9iamVjdFxuICogXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gY2hlY2tcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIHZhbHVlIGlzIGEgRGF0ZVxuICogXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaWYgKGlzRGF0ZSh2YWx1ZSkpIHtcbiAqICAgLy8gdmFsdWUgaXMgRGF0ZVxuICogICBjb25zb2xlLmxvZyh2YWx1ZS50b0lTT1N0cmluZygpKTtcbiAqIH1cbiAqIGBgYFxuICogXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0RhdGUodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBEYXRlIHtcbiAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgRGF0ZSAmJiAhaXNOYU4odmFsdWUuZ2V0VGltZSgpKTtcbn1cblxuLyoqXG4gKiBUeXBlIGd1YXJkIHRvIGNoZWNrIGlmIGEgdmFsdWUgaXMgYSBQcm9taXNlXG4gKiBcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBjaGVja1xuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgdmFsdWUgaXMgYSBQcm9taXNlXG4gKiBcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpZiAoaXNQcm9taXNlKHZhbHVlKSkge1xuICogICAvLyB2YWx1ZSBpcyBQcm9taXNlPHVua25vd24+XG4gKiAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHZhbHVlO1xuICogfVxuICogYGBgXG4gKiBcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUHJvbWlzZSh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFByb21pc2U8dW5rbm93bj4ge1xuICByZXR1cm4gKFxuICAgIHZhbHVlIGluc3RhbmNlb2YgUHJvbWlzZSB8fFxuICAgIChpc1JlY29yZCh2YWx1ZSkgJiZcbiAgICAgIHR5cGVvZiAodmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLnRoZW4gPT09ICdmdW5jdGlvbicpXG4gICk7XG59XG5cbi8qKlxuICogVHlwZSBndWFyZCB0byBjaGVjayBpZiBhbiBlcnJvciBpcyBhbiBFcnJvciBpbnN0YW5jZVxuICogXG4gKiBAcGFyYW0gZXJyb3IgLSBUaGUgZXJyb3IgdG8gY2hlY2tcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGVycm9yIGlzIGFuIEVycm9yIGluc3RhbmNlXG4gKiBcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiB0cnkge1xuICogICAvLyAuLi5cbiAqIH0gY2F0Y2ggKGVycm9yKSB7XG4gKiAgIGlmIChpc0Vycm9yKGVycm9yKSkge1xuICogICAgIC8vIGVycm9yIGlzIEVycm9yXG4gKiAgICAgY29uc29sZS5lcnJvcihlcnJvci5tZXNzYWdlKTtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKiBcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRXJyb3IoZXJyb3I6IHVua25vd24pOiBlcnJvciBpcyBFcnJvciB7XG4gIHJldHVybiBlcnJvciBpbnN0YW5jZW9mIEVycm9yO1xufVxuXG4vKipcbiAqIFR5cGUgZ3VhcmQgdG8gY2hlY2sgaWYgYSB2YWx1ZSBtYXRjaGVzIGEgc3BlY2lmaWMgdHlwZSB1c2luZyBhIHZhbGlkYXRvciBmdW5jdGlvblxuICogXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gY2hlY2tcbiAqIEBwYXJhbSB2YWxpZGF0b3IgLSBGdW5jdGlvbiB0aGF0IHJldHVybnMgdHJ1ZSBpZiB2YWx1ZSBtYXRjaGVzIHRoZSB0eXBlXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSB2YWx1ZSBtYXRjaGVzIHRoZSB0eXBlXG4gKiBcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbnRlcmZhY2UgVXNlciB7XG4gKiAgIGlkOiBzdHJpbmc7XG4gKiAgIG5hbWU6IHN0cmluZztcbiAqIH1cbiAqIFxuICogY29uc3QgaXNVc2VyID0gKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgVXNlciA9PlxuICogICBpc1JlY29yZCh2YWx1ZSkgJiZcbiAqICAgaGFzUHJvcGVydHkodmFsdWUsICdpZCcpICYmXG4gKiAgIGhhc1Byb3BlcnR5KHZhbHVlLCAnbmFtZScpICYmXG4gKiAgIGlzU3RyaW5nKHZhbHVlLmlkKSAmJlxuICogICBpc1N0cmluZyh2YWx1ZS5uYW1lKTtcbiAqIFxuICogaWYgKGlzVXNlcihkYXRhKSkge1xuICogICAvLyBkYXRhIGlzIFVzZXJcbiAqICAgY29uc29sZS5sb2coZGF0YS5uYW1lKTtcbiAqIH1cbiAqIGBgYFxuICogXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXRjaGVzPFQ+KFxuICB2YWx1ZTogdW5rbm93bixcbiAgdmFsaWRhdG9yOiAodmFsdWU6IHVua25vd24pID0+IHZhbHVlIGlzIFRcbik6IHZhbHVlIGlzIFQge1xuICByZXR1cm4gdmFsaWRhdG9yKHZhbHVlKTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7QUFJQSxJQUFNLGNBQWMsT0FDbEIsS0FDQSxZQUM0QjtBQUM1QixRQUFNLFdBQVcsTUFBTSxNQUFNLEtBQUssT0FBTztBQUV6QyxNQUFJLFNBQVMsSUFBSTtBQUNmLFVBQU0sVUFBYSxNQUFNLFNBQVMsS0FBSztBQUV2QyxXQUFPO0FBQUEsTUFDTDtBQUFBLE1BQ0EsUUFBUSxTQUFTO0FBQUEsSUFDbkI7QUFBQSxFQUNGLFdBQVcsU0FBUyxXQUFXLEtBQUs7QUFDbEMsVUFBTSxVQUEwQixNQUFNLFNBQVMsS0FBSztBQUVwRCxVQUFNLE9BQXVCO0FBQUEsTUFDM0IsUUFBUSxTQUFTO0FBQUEsTUFDakIsT0FBTyxRQUFRO0FBQUEsSUFDakI7QUFFQSxXQUFPO0FBQUEsRUFDVDtBQUVBLFFBQU0sY0FBOEIsTUFBTSxTQUFTLEtBQUs7QUFFeEQsU0FBTztBQUNUO0FBRUEsSUFBcUIsTUFBckIsTUFBeUI7QUFBQSxFQUN2QixhQUFhLE9BQ1gsS0FDQSxXQUN1QztBQUN2QyxVQUFNLGlCQUFpQztBQUFBLE1BQ3JDLFNBQVM7QUFBQSxRQUNQLGdCQUFnQjtBQUFBLFFBQ2hCLGVBQWUsVUFBVSxhQUFhLFFBQVEsY0FBYyxDQUFDO0FBQUEsTUFDL0Q7QUFBQSxNQUVBLE1BQU0sS0FBSyxVQUFVLEVBQUUsR0FBRyxXQUFXLEdBQUcsVUFBVSxZQUFZLENBQUM7QUFBQSxNQUMvRCxRQUFRO0FBQUEsSUFDVjtBQUVBLFVBQU0sY0FBYyxNQUFNLFlBQTZCLEtBQUssY0FBYztBQUUxRSxXQUFPO0FBQUEsRUFDVDtBQUFBLEVBRUEsYUFBYSxLQUNYLEtBQ0EsT0FBbUIsQ0FBQyxHQUNLO0FBQ3pCLFVBQU0saUJBQWlDO0FBQUEsTUFDckMsU0FBUztBQUFBLFFBQ1AsZ0JBQWdCO0FBQUEsUUFDaEIsZUFB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TUFBTSxLQUFLO0FBQ2xEO0FBa0JPLFNBQVMsVUFBVSxPQUFrQztBQUMxRCxTQUFPLE9BQU8sVUFBVTtBQUMxQjtBQWtCTyxTQUFTLE9BQU8sT0FBK0I7QUFDcEQsU0FBTyxVQUFVO0FBQ25CO0FBa0JPLFNBQVMsWUFBWSxPQUFvQztBQUM5RCxTQUFPLFVBQVU7QUFDbkI7QUF1Qk8sU0FBUyxVQUFVLE9BQTJDO0FBQ25FLFNBQU8sVUFBVSxRQUFRLFVBQVU7QUFDckM7QUFnQk8sU0FBUyxVQUFhLE9BQW1DO0FBQzlELFNBQU8sVUFBVSxRQUFRLFVBQVU7QUFDckM7QUFrQk8sU0FBUyxPQUFPLE9BQStCO0FBQ3BELFNBQU8saUJBQWlCLFFBQVEsQ0FBQyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBQ3hEO0FBa0JPLFNBQVMsVUFBVSxPQUEyQztBQUNuRSxTQUNFLGlCQUFpQixXQUNoQixTQUFTLEtBQUssS0FDYixPQUFRLE1BQWtDLFNBQVM7QUFFekQ7QUFzQk8sU0FBUyxRQUFRLE9BQWdDO0FBQ3RELFNBQU8saUJBQWlCO0FBQzFCO0FBK0JPLFNBQVMsUUFDZCxPQUNBLFdBQ1k7QUFDWixTQUFPLFVBQVUsS0FBSztBQUN4QjsiLAogICJuYW1lcyI6IFsibWFrZVJlcXVlc3QiLCAiaGFuZGxlU2VydmVyRXJyb3JzIiwgImlzQXJyYXkiXQp9Cg==
|