@gnwebsoft/ui 4.0.41 → 4.0.42

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.
@@ -0,0 +1,541 @@
1
+ // src/utils/flattenObjectKeys.ts
2
+ var isNested = (obj) => typeof obj === "object" && obj !== null && !Array.isArray(obj);
3
+ var isArray = (obj) => Array.isArray(obj);
4
+ var flattenObjectKeys = (obj, prefix = "") => {
5
+ if (!isNested(obj)) {
6
+ return {
7
+ [prefix]: obj
8
+ };
9
+ }
10
+ return Object.keys(obj).reduce((acc, key) => {
11
+ const currentPrefix = prefix.length ? `${prefix}.` : "";
12
+ if (isNested(obj[key]) && Object.keys(obj[key]).length) {
13
+ if (isArray(obj[key]) && obj[key].length) {
14
+ obj[key].forEach((item, index) => {
15
+ Object.assign(
16
+ acc,
17
+ flattenObjectKeys(item, `${currentPrefix + key}.${index}`)
18
+ );
19
+ });
20
+ } else {
21
+ Object.assign(acc, flattenObjectKeys(obj[key], currentPrefix + key));
22
+ }
23
+ acc[currentPrefix + key] = obj[key];
24
+ } else {
25
+ acc[currentPrefix + key] = obj[key];
26
+ }
27
+ return acc;
28
+ }, {});
29
+ };
30
+
31
+ // src/utils/getTimezone.ts
32
+ function getTimezone(adapter, value) {
33
+ return value == null || !adapter.utils.isValid(value) ? null : adapter.utils.getTimezone(value);
34
+ }
35
+
36
+ // src/utils/handleServerErrors.ts
37
+ var handleServerErrors = function handleServerErrors2(args) {
38
+ const { errors, setError } = args;
39
+ for (const key in errors) {
40
+ const isKeyInVariables = Object.keys(flattenObjectKeys(errors)).includes(
41
+ key
42
+ );
43
+ if (!isKeyInVariables) {
44
+ continue;
45
+ }
46
+ const fieldError = errors[key];
47
+ let errorMessage = "";
48
+ if (Array.isArray(fieldError)) {
49
+ errorMessage = fieldError.join(" ");
50
+ }
51
+ if (typeof fieldError === "string") {
52
+ errorMessage = fieldError;
53
+ }
54
+ if (typeof fieldError === "boolean" && fieldError) {
55
+ errorMessage = "Field is not valid.";
56
+ }
57
+ setError(key, {
58
+ message: errorMessage
59
+ });
60
+ }
61
+ };
62
+
63
+ // src/utils/propertyExists.ts
64
+ function propertyExists(obj, prop) {
65
+ return typeof obj === "object" && obj !== null && Object.prototype.hasOwnProperty.call(obj, prop);
66
+ }
67
+
68
+ // src/utils/readValueAsDate.ts
69
+ function readValueAsDate(adapter, value) {
70
+ if (typeof value === "string") {
71
+ if (value === "") {
72
+ return null;
73
+ }
74
+ return adapter.utils.date(value);
75
+ }
76
+ return value;
77
+ }
78
+
79
+ // src/utils/removeLeadingTrailingSlashes.ts
80
+ var removeLeadingTrailingSlashes = (route) => {
81
+ return route.replace(/^\/|\/$/g, "");
82
+ };
83
+
84
+ // src/utils/schemaTools.ts
85
+ import dayjs from "dayjs";
86
+ import { z } from "zod";
87
+ function isValidLuhn(value) {
88
+ if (!value || value.trim() === "") {
89
+ return false;
90
+ }
91
+ const number = value.replace(/[\s-]/g, "");
92
+ if (!/^\d+$/.test(number)) {
93
+ return false;
94
+ }
95
+ if (number.length < 13 || number.length > 19) {
96
+ return false;
97
+ }
98
+ let sum = 0;
99
+ let alternate = false;
100
+ for (let i = number.length - 1; i >= 0; i--) {
101
+ let digit = parseInt(number.charAt(i), 10);
102
+ if (alternate) {
103
+ digit *= 2;
104
+ if (digit > 9) {
105
+ digit -= 9;
106
+ }
107
+ }
108
+ sum += digit;
109
+ alternate = !alternate;
110
+ }
111
+ return sum % 10 === 0;
112
+ }
113
+ var schemaTools = {
114
+ // Date validations
115
+ 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, {
116
+ message: message || "Invalid date"
117
+ }),
118
+ 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, {
119
+ message: message || "Invalid date"
120
+ }),
121
+ pastDate: ({ message } = {}) => z.coerce.date().refine((date) => date < /* @__PURE__ */ new Date(), {
122
+ message: message || "Must be a past date"
123
+ }),
124
+ futureDate: ({ message } = {}) => z.coerce.date().refine((date) => date > /* @__PURE__ */ new Date(), {
125
+ message: message || "Must be a future date"
126
+ }),
127
+ todayOrFutureDate: ({ message } = {}) => z.coerce.date().refine(
128
+ (date) => {
129
+ const today = /* @__PURE__ */ new Date();
130
+ today.setHours(0, 0, 0, 0);
131
+ return date.setHours(0, 0, 0, 0) >= today.getTime();
132
+ },
133
+ { message: message || "Must be today or a future date" }
134
+ ),
135
+ todayOrPastDate: ({ message } = {}) => z.coerce.date().refine(
136
+ (date) => {
137
+ const today = /* @__PURE__ */ new Date();
138
+ today.setHours(0, 0, 0, 0);
139
+ return date.setHours(0, 0, 0, 0) <= today.getTime();
140
+ },
141
+ { message: message || "Must be today or a past date" }
142
+ ),
143
+ adult: ({ message } = {}) => z.coerce.date().refine(
144
+ (date) => {
145
+ const eighteenYearsAgo = /* @__PURE__ */ new Date();
146
+ eighteenYearsAgo.setFullYear(eighteenYearsAgo.getFullYear() - 18);
147
+ eighteenYearsAgo.setHours(0, 0, 0, 0);
148
+ const dob = new Date(date);
149
+ dob.setHours(0, 0, 0, 0);
150
+ return dob <= eighteenYearsAgo;
151
+ },
152
+ { message: message || "Must be at least 18 years old" }
153
+ ),
154
+ minimumAge: ({
155
+ message,
156
+ minimumAge
157
+ } = {}) => z.coerce.date().refine(
158
+ (date) => {
159
+ if (typeof minimumAge !== "number") return false;
160
+ const minYearsAgo = /* @__PURE__ */ new Date();
161
+ minYearsAgo.setFullYear(minYearsAgo.getFullYear() - minimumAge);
162
+ minYearsAgo.setHours(0, 0, 0, 0);
163
+ const dob = new Date(date);
164
+ dob.setHours(0, 0, 0, 0);
165
+ return dob <= minYearsAgo;
166
+ },
167
+ {
168
+ message: message || `Must be at least ${minimumAge ?? "the required"} years old`
169
+ }
170
+ ),
171
+ withinDays: ({ message, days } = {}) => z.coerce.date().refine(
172
+ (date) => {
173
+ const today = /* @__PURE__ */ new Date();
174
+ today.setHours(0, 0, 0, 0);
175
+ const inputDate = new Date(date);
176
+ inputDate.setHours(0, 0, 0, 0);
177
+ const diffTime = Math.abs(inputDate.getTime() - today.getTime());
178
+ const diffDays = Math.ceil(diffTime / (1e3 * 60 * 60 * 24));
179
+ return typeof days === "number" ? diffDays <= days : false;
180
+ },
181
+ { message: message || `Must be within ${days} days of today` }
182
+ ),
183
+ weekday: ({ message } = {}) => z.coerce.date().refine(
184
+ (date) => {
185
+ const day = date.getDay();
186
+ return day !== 0 && day !== 6;
187
+ },
188
+ { message: message || "Must be a weekday" }
189
+ ),
190
+ dateRange: ({ message } = {}) => z.object({
191
+ start: z.coerce.date(),
192
+ end: z.coerce.date()
193
+ }).refine((data) => data.start <= data.end, {
194
+ message: message || "Start date must be before or equal to end date"
195
+ }),
196
+ time: ({ message } = {}) => z.coerce.date().transform((c) => c === null || c === void 0 ? null : c).refine((c) => !!c, { message: message || "Time is required" }).refine((c) => c ? dayjs(c).isValid() : true, {
197
+ message: message || "Invalid time"
198
+ }),
199
+ dateTime: ({ message } = {}) => z.coerce.date().transform((c) => c === null || c === void 0 ? null : c).refine((c) => !!c, { message: message || "Date and Time is required" }).refine((c) => c ? dayjs(c).isValid() : true, {
200
+ message: message || "Invalid Date and Time"
201
+ }),
202
+ // String validations
203
+ requiredString: ({
204
+ message,
205
+ min,
206
+ max
207
+ } = {}) => z.string().trim().min(
208
+ min || 1,
209
+ message || `String must be at least ${min || 1} characters`
210
+ ).max(
211
+ max || 255,
212
+ message || `String must be at most ${max || 255} characters`
213
+ ),
214
+ email: ({ message } = {}) => z.string().email(message || "Invalid email address").max(254, "Email must be at most 254 characters"),
215
+ url: ({ message } = {}) => z.string().url(message || "Invalid URL format"),
216
+ phone: ({ message } = {}) => z.string().regex(/^[+]?[1-9][\d]{0,15}$/, message || "Invalid phone number format"),
217
+ creditCard: ({ message } = {}) => z.string().refine((value) => isValidLuhn(value), {
218
+ message: message || "Must be a valid credit card number"
219
+ }),
220
+ indianMobile: ({ message } = {}) => z.string().regex(/^[6-9]\d{9}$/, message || "Must be a valid Indian mobile number"),
221
+ internationalPhone: ({ message } = {}) => z.string().regex(
222
+ /^\+?[1-9]\d{6,14}$/,
223
+ message || "Must be a valid international phone number"
224
+ ),
225
+ alphabetic: ({ message } = {}) => z.string().regex(
226
+ /^[A-Za-z, ]+$/,
227
+ message || "Must contain only letters, commas, and spaces"
228
+ ),
229
+ guid: ({ message } = {}) => z.string().uuid(message || "Must be a valid GUID"),
230
+ nonEmptyOrWhitespace: ({ message } = {}) => z.string().trim().min(1, message || "Must not be empty or whitespace"),
231
+ username: ({ message } = {}) => z.string().regex(
232
+ /^[a-zA-Z][a-zA-Z0-9_]{2,29}$/,
233
+ message || "Must be 3-30 characters, start with a letter, and contain only letters, numbers, and underscores"
234
+ ),
235
+ exactLength: ({
236
+ message,
237
+ length
238
+ } = {}) => {
239
+ if (typeof length !== "number") {
240
+ throw new Error("Length must be provided for exactLength validator");
241
+ }
242
+ return z.string().length(length, message || `Must be exactly ${length} characters`);
243
+ },
244
+ minWords: ({
245
+ message,
246
+ minWords
247
+ } = {}) => z.string().refine(
248
+ (value) => {
249
+ if (!value) return true;
250
+ const words = value.split(/[\s\t\n\r]+/).filter(Boolean);
251
+ return words.length >= (typeof minWords === "number" ? minWords : 0);
252
+ },
253
+ { message: message || `Must have at least ${minWords} word(s)` }
254
+ ),
255
+ maxWords: ({
256
+ message,
257
+ maxWords
258
+ } = {}) => z.string().refine(
259
+ (value) => {
260
+ if (!value) return true;
261
+ const words = value.split(/[\s\t\n\r]+/).filter(Boolean);
262
+ return words.length <= (typeof maxWords === "number" ? maxWords : 0);
263
+ },
264
+ { message: message || `Must have at most ${maxWords} word(s)` }
265
+ ),
266
+ strongPassword: ({ message } = {}) => z.string().regex(
267
+ /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$/,
268
+ message || "Must be at least 8 characters and contain uppercase, lowercase, number, and special character"
269
+ ),
270
+ noHtml: ({ message } = {}) => z.string().refine(
271
+ (value) => !value || !/<[^>]*>/.test(value),
272
+ message || "Must not contain HTML tags"
273
+ ),
274
+ noScriptInjection: ({ message } = {}) => z.string().refine(
275
+ (value) => !value || !/<script|javascript:|on\w+\s*=/i.test(value),
276
+ message || "Contains potentially unsafe content"
277
+ ),
278
+ noSqlInjection: ({ message } = {}) => z.string().refine(
279
+ (value) => !value || !/('|--|;|\b(SELECT|INSERT|UPDATE|DELETE|DROP|UNION|ALTER|CREATE|EXEC|EXECUTE)\b)/i.test(
280
+ value
281
+ ),
282
+ message || "Contains potentially unsafe content"
283
+ ),
284
+ indianPinCode: ({ message } = {}) => z.string().regex(/^[1-9][0-9]{5}$/, message || "Must be a valid 6-digit PIN code"),
285
+ usZipCode: ({ message } = {}) => z.string().regex(/^\d{5}(-\d{4})?$/, message || "Must be a valid US ZIP code"),
286
+ ukPostalCode: ({ message } = {}) => z.string().regex(
287
+ /^[A-Z]{1,2}[0-9][0-9A-Z]?\s?[0-9][A-Z]{2}$/i,
288
+ message || "Must be a valid UK postal code"
289
+ ),
290
+ ipv4: ({ message } = {}) => z.string().regex(
291
+ /^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/,
292
+ message || "Must be a valid IPv4 address"
293
+ ),
294
+ ipv6: ({ message } = {}) => z.string().regex(
295
+ /^([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$|^::$|^::1$|^([0-9a-fA-F]{1,4}:){1,7}:$/,
296
+ message || "Must be a valid IPv6 address"
297
+ ),
298
+ macAddress: ({ message } = {}) => z.string().regex(
299
+ /^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$/,
300
+ message || "Must be a valid MAC address"
301
+ ),
302
+ allowedFileExtension: ({
303
+ message,
304
+ allowedExtensions
305
+ } = {}) => z.string().refine(
306
+ (fileName) => {
307
+ if (!fileName) return true;
308
+ const extension = fileName.split(".").pop()?.toLowerCase();
309
+ const lowerAllowed = allowedExtensions?.map(
310
+ (ext) => ext.toLowerCase().startsWith(".") ? ext.toLowerCase() : `.${ext.toLowerCase()}`
311
+ );
312
+ return extension && lowerAllowed?.includes(`.${extension}`);
313
+ },
314
+ {
315
+ message: message || `Must have one of the following extensions: ${allowedExtensions?.join(", ")}`
316
+ }
317
+ ),
318
+ validImageExtension: ({ message } = {}) => schemaTools.allowedFileExtension({
319
+ allowedExtensions: [".jpg", ".jpeg", ".png", ".gif", ".bmp", ".webp"],
320
+ message: message || "Must have a valid image extension (.jpg, .jpeg, .png, .gif, .bmp, .webp)"
321
+ }),
322
+ validDocumentExtension: ({ message } = {}) => schemaTools.allowedFileExtension({
323
+ allowedExtensions: [".pdf", ".doc", ".docx", ".xls", ".xlsx", ".txt"],
324
+ message: message || "Must have a valid document extension (.pdf, .doc, .docx, .xls, .xlsx, .txt)"
325
+ }),
326
+ panCard: ({ message } = {}) => z.string().regex(
327
+ /^[A-Z]{5}[0-9]{4}[A-Z]{1}$/,
328
+ message || "Must be a valid PAN card number"
329
+ ),
330
+ aadhaar: ({ message } = {}) => z.string().regex(
331
+ /^[2-9]{1}[0-9]{11}$/,
332
+ message || "Must be a valid Aadhaar number"
333
+ ),
334
+ gstin: ({ message } = {}) => z.string().regex(
335
+ /^[0-9]{2}[A-Z]{5}[0-9]{4}[A-Z]{1}[1-9A-Z]{1}Z[0-9A-Z]{1}$/,
336
+ message || "Must be a valid GSTIN"
337
+ ),
338
+ ifsc: ({ message } = {}) => z.string().regex(/^[A-Z]{4}0[A-Z0-9]{6}$/, message || "Must be a valid IFSC code"),
339
+ alphanumeric: ({ message } = {}) => z.string().regex(
340
+ /^[a-zA-Z0-9]+$/,
341
+ message || "Only letters and numbers are allowed"
342
+ ),
343
+ slug: ({ message } = {}) => z.string().regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/, message || "Invalid slug format"),
344
+ // Number validations
345
+ positiveNumber: ({
346
+ message,
347
+ min,
348
+ max
349
+ } = {}) => z.number().positive(message || "Number must be positive").min(min || 0.01, `Number must be at least ${min || 0.01}`).max(
350
+ max || Number.MAX_SAFE_INTEGER,
351
+ `Number must be at most ${max || Number.MAX_SAFE_INTEGER}`
352
+ ),
353
+ maxDecimalPlaces: ({
354
+ message,
355
+ maxPlaces
356
+ } = {}) => z.number().refine(
357
+ (value) => {
358
+ if (value === null || value === void 0) return true;
359
+ const decimalPart = value.toString().split(".")[1];
360
+ return !decimalPart || decimalPart.length <= (typeof maxPlaces === "number" ? maxPlaces : 0);
361
+ },
362
+ { message: message || `Must have at most ${maxPlaces} decimal places` }
363
+ ),
364
+ currency: ({ message } = {}) => z.number().min(0, message || "Must be a valid currency amount (positive)").refine(
365
+ (value) => {
366
+ if (value === null || value === void 0) return true;
367
+ const decimalPart = value.toString().split(".")[1];
368
+ return !decimalPart || decimalPart.length <= 2;
369
+ },
370
+ {
371
+ message: message || "Must be a valid currency amount (max 2 decimal places)"
372
+ }
373
+ ),
374
+ validAge: ({ message } = {}) => z.number().int("Must be an integer").min(0, message || "Must be a valid age (between 0 and 150)").max(150, message || "Must be a valid age (between 0 and 150)"),
375
+ nonNegativeNumber: ({
376
+ message,
377
+ max
378
+ } = {}) => z.number().min(0, message || "Number must be non-negative").max(
379
+ max || Number.MAX_SAFE_INTEGER,
380
+ `Number must be at most ${max || Number.MAX_SAFE_INTEGER}`
381
+ ),
382
+ integer: ({
383
+ message,
384
+ min,
385
+ max
386
+ } = {}) => z.number().int(message || "Must be an integer").min(
387
+ min || Number.MIN_SAFE_INTEGER,
388
+ `Number must be at least ${min || Number.MIN_SAFE_INTEGER}`
389
+ ).max(
390
+ max || Number.MAX_SAFE_INTEGER,
391
+ `Number must be at most ${max || Number.MAX_SAFE_INTEGER}`
392
+ ),
393
+ percentage: ({ message } = {}) => z.number().min(0, message || "Percentage must be between 0 and 100").max(100, message || "Percentage must be between 0 and 100"),
394
+ // Array validations
395
+ nonEmptyArray: (schema, { message } = {}) => z.array(schema).min(1, message || "At least one item is required"),
396
+ uniqueArray: (schema, { message } = {}) => z.array(schema).refine((items) => new Set(items).size === items.length, {
397
+ message: message || "All items must be unique"
398
+ }),
399
+ noNullArrayItems: (schema, { message } = {}) => z.array(schema.nullable()).refine((items) => items.every((item) => item !== null), {
400
+ message: message || "Must not contain null items"
401
+ }),
402
+ // Boolean validations
403
+ requiredBoolean: ({ message } = {}) => z.boolean({
404
+ message: message || "This field is required"
405
+ }),
406
+ // Object validations
407
+ nonEmptyObject: (schema, { message } = {}) => schema.refine((obj) => Object.keys(obj).length > 0, {
408
+ message: message || "Object cannot be empty"
409
+ }),
410
+ // File validations
411
+ requiredFile: ({ message } = {}) => z.instanceof(File, { message: message || "File is required" }).refine((file) => file.size > 0, {
412
+ message: message || "File cannot be empty"
413
+ }),
414
+ fileSize: ({ maxSize, message }) => z.instanceof(File).refine((file) => file.size <= maxSize, {
415
+ message: message || `File size must be less than ${Math.round(maxSize / 1024 / 1024)}MB`
416
+ }),
417
+ fileType: ({
418
+ allowedTypes,
419
+ message
420
+ }) => z.instanceof(File).refine((file) => allowedTypes.includes(file.type), {
421
+ message: message || `File type must be one of: ${allowedTypes.join(", ")}`
422
+ }),
423
+ // Custom validators
424
+ conditional: (condition, trueSchema, falseSchema) => z.union([trueSchema, falseSchema]).superRefine((data, ctx) => {
425
+ const shouldUseTrue = condition(data);
426
+ const schema = shouldUseTrue ? trueSchema : falseSchema;
427
+ const result = schema.safeParse(data);
428
+ if (!result.success) {
429
+ ctx.addIssue({
430
+ code: z.ZodIssueCode.custom,
431
+ message: result.error.message
432
+ });
433
+ }
434
+ }),
435
+ transform: {
436
+ toLowerCase: z.string().transform((val) => val.toLowerCase()),
437
+ toUpperCase: z.string().transform((val) => val.toUpperCase()),
438
+ trim: z.string().transform((val) => val.trim()),
439
+ toNumber: z.string().transform((val) => Number(val)),
440
+ toBoolean: z.string().transform((val) => val === "true"),
441
+ parseJson: (schema) => z.string().transform((val, ctx) => {
442
+ try {
443
+ const parsed = JSON.parse(val);
444
+ const result = schema.safeParse(parsed);
445
+ if (result.success) return result.data;
446
+ ctx.addIssue({
447
+ code: z.ZodIssueCode.custom,
448
+ message: result.error.message
449
+ });
450
+ return z.NEVER;
451
+ } catch {
452
+ ctx.addIssue({
453
+ code: z.ZodIssueCode.custom,
454
+ message: "Invalid JSON"
455
+ });
456
+ return z.NEVER;
457
+ }
458
+ })
459
+ }
460
+ };
461
+
462
+ // src/utils/typeGuards.ts
463
+ function isRecord(value) {
464
+ return typeof value === "object" && value !== null && !Array.isArray(value);
465
+ }
466
+ function hasProperty(obj, key) {
467
+ return isRecord(obj) && key in obj;
468
+ }
469
+ function isNonEmptyString(value) {
470
+ return typeof value === "string" && value.length > 0;
471
+ }
472
+ function isArray2(value) {
473
+ return Array.isArray(value);
474
+ }
475
+ function isNonEmptyArray(value) {
476
+ return Array.isArray(value) && value.length > 0;
477
+ }
478
+ function isFunction(value) {
479
+ return typeof value === "function";
480
+ }
481
+ function isString(value) {
482
+ return typeof value === "string";
483
+ }
484
+ function isNumber(value) {
485
+ return typeof value === "number" && !isNaN(value);
486
+ }
487
+ function isBoolean(value) {
488
+ return typeof value === "boolean";
489
+ }
490
+ function isNull(value) {
491
+ return value === null;
492
+ }
493
+ function isUndefined(value) {
494
+ return value === void 0;
495
+ }
496
+ function isNullish(value) {
497
+ return value === null || value === void 0;
498
+ }
499
+ function isDefined(value) {
500
+ return value !== null && value !== void 0;
501
+ }
502
+ function isDate(value) {
503
+ return value instanceof Date && !isNaN(value.getTime());
504
+ }
505
+ function isPromise(value) {
506
+ return value instanceof Promise || isRecord(value) && typeof value.then === "function";
507
+ }
508
+ function isError(error) {
509
+ return error instanceof Error;
510
+ }
511
+ function matches(value, validator) {
512
+ return validator(value);
513
+ }
514
+
515
+ export {
516
+ flattenObjectKeys,
517
+ getTimezone,
518
+ handleServerErrors,
519
+ propertyExists,
520
+ readValueAsDate,
521
+ removeLeadingTrailingSlashes,
522
+ schemaTools,
523
+ isRecord,
524
+ hasProperty,
525
+ isNonEmptyString,
526
+ isArray2 as isArray,
527
+ isNonEmptyArray,
528
+ isFunction,
529
+ isString,
530
+ isNumber,
531
+ isBoolean,
532
+ isNull,
533
+ isUndefined,
534
+ isNullish,
535
+ isDefined,
536
+ isDate,
537
+ isPromise,
538
+ isError,
539
+ matches
540
+ };
541
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3V0aWxzL2ZsYXR0ZW5PYmplY3RLZXlzLnRzIiwgIi4uL3NyYy91dGlscy9nZXRUaW1lem9uZS50cyIsICIuLi9zcmMvdXRpbHMvaGFuZGxlU2VydmVyRXJyb3JzLnRzIiwgIi4uL3NyYy91dGlscy9wcm9wZXJ0eUV4aXN0cy50cyIsICIuLi9zcmMvdXRpbHMvcmVhZFZhbHVlQXNEYXRlLnRzIiwgIi4uL3NyYy91dGlscy9yZW1vdmVMZWFkaW5nVHJhaWxpbmdTbGFzaGVzLnRzIiwgIi4uL3NyYy91dGlscy9zY2hlbWFUb29scy50cyIsICIuLi9zcmMvdXRpbHMvdHlwZUd1YXJkcy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBDaGVja3MgaWYgYSB2YWx1ZSBpcyBhIG5lc3RlZCBvYmplY3QgKG5vdCBudWxsIGFuZCBub3QgYW4gYXJyYXkpLlxuICpcbiAqIEBwYXJhbSBvYmogLSBUaGUgdmFsdWUgdG8gY2hlY2tcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIHZhbHVlIGlzIGEgbmVzdGVkIG9iamVjdFxuICpcbiAqIEBpbnRlcm5hbFxuICovXG5jb25zdCBpc05lc3RlZCA9IChvYmo6IHVua25vd24pOiBvYmogaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT4gXG4gIHR5cGVvZiBvYmogPT09IFwib2JqZWN0XCIgJiYgb2JqICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KG9iaik7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgdmFsdWUgaXMgYW4gYXJyYXkuXG4gKlxuICogQHBhcmFtIG9iaiAtIFRoZSB2YWx1ZSB0byBjaGVja1xuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgdmFsdWUgaXMgYW4gYXJyYXlcbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuY29uc3QgaXNBcnJheSA9IChvYmo6IHVua25vd24pOiBvYmogaXMgdW5rbm93bltdID0+IEFycmF5LmlzQXJyYXkob2JqKTtcblxuLyoqXG4gKiBSZWN1cnNpdmVseSBmbGF0dGVucyBhbiBvYmplY3QgaW50byBhIGZsYXQgc3RydWN0dXJlIHdpdGggZG90LW5vdGF0aW9uIGtleXMuXG4gKlxuICogVGhpcyB1dGlsaXR5IGZ1bmN0aW9uIHRha2VzIGEgbmVzdGVkIG9iamVjdCBhbmQgY29udmVydHMgaXQgaW50byBhIGZsYXQgb2JqZWN0XG4gKiB3aGVyZSBuZXN0ZWQgcHJvcGVydGllcyBhcmUgcmVwcmVzZW50ZWQgdXNpbmcgZG90IG5vdGF0aW9uLiBJdCBoYW5kbGVzIGJvdGhcbiAqIG5lc3RlZCBvYmplY3RzIGFuZCBhcnJheXMsIHByZXNlcnZpbmcgYWxsIGxldmVscyBvZiB0aGUgb3JpZ2luYWwgc3RydWN0dXJlXG4gKiBhcyBzZXBhcmF0ZSBrZXlzIGluIHRoZSByZXN1bHQuXG4gKlxuICogQGV4YW1wbGVcbiAqIEJhc2ljIG9iamVjdCBmbGF0dGVuaW5nOlxuICogYGBgdHN4XG4gKiBjb25zdCBuZXN0ZWQgPSB7XG4gKiAgIHVzZXI6IHtcbiAqICAgICBuYW1lOiAnSm9obicsXG4gKiAgICAgYWRkcmVzczoge1xuICogICAgICAgY2l0eTogJ05ldyBZb3JrJyxcbiAqICAgICAgIHppcDogJzEwMDAxJ1xuICogICAgIH1cbiAqICAgfVxuICogfTtcbiAqXG4gKiBjb25zdCBmbGF0dGVuZWQgPSBmbGF0dGVuT2JqZWN0S2V5cyhuZXN0ZWQpO1xuICogLy8gUmVzdWx0OlxuICogLy8ge1xuICogLy8gICAndXNlcic6IHsgbmFtZTogJ0pvaG4nLCBhZGRyZXNzOiB7IGNpdHk6ICdOZXcgWW9yaycsIHppcDogJzEwMDAxJyB9IH0sXG4gKiAvLyAgICd1c2VyLm5hbWUnOiAnSm9obicsXG4gKiAvLyAgICd1c2VyLmFkZHJlc3MnOiB7IGNpdHk6ICdOZXcgWW9yaycsIHppcDogJzEwMDAxJyB9LFxuICogLy8gICAndXNlci5hZGRyZXNzLmNpdHknOiAnTmV3IFlvcmsnLFxuICogLy8gICAndXNlci5hZGRyZXNzLnppcCc6ICcxMDAwMSdcbiAqIC8vIH1cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBBcnJheSBoYW5kbGluZzpcbiAqIGBgYHRzeFxuICogY29uc3Qgd2l0aEFycmF5cyA9IHtcbiAqICAgaXRlbXM6IFtcbiAqICAgICB7IGlkOiAxLCBuYW1lOiAnSXRlbSAxJyB9LFxuICogICAgIHsgaWQ6IDIsIG5hbWU6ICdJdGVtIDInIH1cbiAqICAgXVxuICogfTtcbiAqXG4gKiBjb25zdCBmbGF0dGVuZWQgPSBmbGF0dGVuT2JqZWN0S2V5cyh3aXRoQXJyYXlzKTtcbiAqIC8vIFJlc3VsdCBpbmNsdWRlczpcbiAqIC8vIHtcbiAqIC8vICAgJ2l0ZW1zJzogWy4uLl0sXG4gKiAvLyAgICdpdGVtcy4wJzogeyBpZDogMSwgbmFtZTogJ0l0ZW0gMScgfSxcbiAqIC8vICAgJ2l0ZW1zLjAuaWQnOiAxLFxuICogLy8gICAnaXRlbXMuMC5uYW1lJzogJ0l0ZW0gMScsXG4gKiAvLyAgICdpdGVtcy4xJzogeyBpZDogMiwgbmFtZTogJ0l0ZW0gMicgfSxcbiAqIC8vICAgJ2l0ZW1zLjEuaWQnOiAyLFxuICogLy8gICAnaXRlbXMuMS5uYW1lJzogJ0l0ZW0gMidcbiAqIC8vIH1cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBvYmogLSBUaGUgb2JqZWN0IHRvIGZsYXR0ZW5cbiAqIEBwYXJhbSBwcmVmaXggLSBJbnRlcm5hbCBwYXJhbWV0ZXIgZm9yIGJ1aWxkaW5nIGtleSBwYXRocyAodXNlZCBpbiByZWN1cnNpb24pXG4gKiBAcmV0dXJucyBBIGZsYXQgb2JqZWN0IHdpdGggZG90LW5vdGF0aW9uIGtleXMgcmVwcmVzZW50aW5nIHRoZSBvcmlnaW5hbCBzdHJ1Y3R1cmVcbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBmbGF0dGVuT2JqZWN0S2V5cyA9IChvYmo6IHVua25vd24sIHByZWZpeCA9IFwiXCIpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PiB7XG4gIGlmICghaXNOZXN0ZWQob2JqKSkge1xuICAgIHJldHVybiB7XG4gICAgICBbcHJlZml4XTogb2JqLFxuICAgIH07XG4gIH1cblxuICByZXR1cm4gT2JqZWN0LmtleXMob2JqKS5yZWR1Y2UoKGFjYywga2V5KSA9PiB7XG4gICAgY29uc3QgY3VycmVudFByZWZpeCA9IHByZWZpeC5sZW5ndGggPyBgJHtwcmVmaXh9LmAgOiBcIlwiO1xuXG4gICAgaWYgKGlzTmVzdGVkKG9ialtrZXldKSAmJiBPYmplY3Qua2V5cyhvYmpba2V5XSkubGVuZ3RoKSB7XG4gICAgICBpZiAoaXNBcnJheShvYmpba2V5XSkgJiYgb2JqW2tleV0ubGVuZ3RoKSB7XG4gICAgICAgIG9ialtrZXldLmZvckVhY2goKGl0ZW0sIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgICBPYmplY3QuYXNzaWduKFxuICAgICAgICAgICAgYWNjLFxuICAgICAgICAgICAgZmxhdHRlbk9iamVjdEtleXMoaXRlbSwgYCR7Y3VycmVudFByZWZpeCArIGtleX0uJHtpbmRleH1gKVxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihhY2MsIGZsYXR0ZW5PYmplY3RLZXlzKG9ialtrZXldLCBjdXJyZW50UHJlZml4ICsga2V5KSk7XG4gICAgICB9XG5cbiAgICAgIC8vIEV2ZW4gaWYgaXQncyBhIG5lc3RlZCBvYmplY3QsIGl0IHNob3VsZCBiZSB0cmVhdGVkIGFzIGEga2V5IGFzIHdlbGxcbiAgICAgIGFjY1tjdXJyZW50UHJlZml4ICsga2V5XSA9IG9ialtrZXldO1xuICAgIH0gZWxzZSB7XG4gICAgICBhY2NbY3VycmVudFByZWZpeCArIGtleV0gPSBvYmpba2V5XTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWNjO1xuICB9LCB7fSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG59O1xuIiwgImltcG9ydCB0eXBlIHsgUGlja2VyVmFsaWREYXRlIH0gZnJvbSBcIkBtdWkveC1kYXRlLXBpY2tlcnNcIjtcbmltcG9ydCB0eXBlIHsgdXNlTG9jYWxpemF0aW9uQ29udGV4dCB9IGZyb20gXCJAbXVpL3gtZGF0ZS1waWNrZXJzL2ludGVybmFsc1wiO1xuaW1wb3J0IHR5cGUgeyBEYXlqcyB9IGZyb20gXCJkYXlqc1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGltZXpvbmU8VERhdGUgZXh0ZW5kcyBQaWNrZXJWYWxpZERhdGU+KFxuICBhZGFwdGVyOiBSZXR1cm5UeXBlPHR5cGVvZiB1c2VMb2NhbGl6YXRpb25Db250ZXh0PixcbiAgdmFsdWU6IFREYXRlXG4pOiBzdHJpbmcgfCBudWxsIHtcbiAgcmV0dXJuIHZhbHVlID09IG51bGwgfHwgIWFkYXB0ZXIudXRpbHMuaXNWYWxpZCh2YWx1ZSBhcyB1bmtub3duIGFzIERheWpzKVxuICAgID8gbnVsbFxuICAgIDogYWRhcHRlci51dGlscy5nZXRUaW1lem9uZSh2YWx1ZSBhcyB1bmtub3duIGFzIERheWpzKTtcbn1cbiIsICJpbXBvcnQgdHlwZSB7IEZpZWxkVmFsdWVzLCBQYXRoLCBVc2VGb3JtU2V0RXJyb3IgfSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xuXG5pbXBvcnQgeyBmbGF0dGVuT2JqZWN0S2V5cyB9IGZyb20gJy4vZmxhdHRlbk9iamVjdEtleXMnO1xuXG5pbXBvcnQgdHlwZSB7IFZhbGlkYXRpb25FcnJvcnMgfSBmcm9tICdAL2NvcmUnO1xuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIGhhbmRsZVNlcnZlckVycm9ycyBmdW5jdGlvbi5cbiAqXG4gKiBAdGVtcGxhdGUgVEZpZWxkVmFsdWVzIC0gVGhlIGZvcm0gdmFsdWVzIHR5cGVcbiAqXG4gKiBAcHVibGljXG4gKi9cbmludGVyZmFjZSBIYW5kbGVTZXJ2ZXJFcnJvcnNUeXBlPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuPiB7XG4gIC8qKlxuICAgKiBTZXJ2ZXIgdmFsaWRhdGlvbiBlcnJvcnMgb2JqZWN0IGNvbnRhaW5pbmcgZmllbGQtc3BlY2lmaWMgZXJyb3IgbWVzc2FnZXNcbiAgICogQGV4YW1wbGUgeyBlbWFpbDogJ0VtYWlsIGlzIGFscmVhZHkgdGFrZW4nLCBwYXNzd29yZDogWydUb28gc2hvcnQnLCAnTXVzdCBjb250YWluIG51bWJlcnMnXSB9XG4gICAqL1xuICBlcnJvcnM/OiBWYWxpZGF0aW9uRXJyb3JzO1xuICAvKipcbiAgICogVGhlIHNldEVycm9yIGZ1bmN0aW9uIGZyb20gcmVhY3QtaG9vay1mb3JtIGZvciBzZXR0aW5nIGZpZWxkIGVycm9yc1xuICAgKi9cbiAgc2V0RXJyb3I6IFVzZUZvcm1TZXRFcnJvcjxURmllbGRWYWx1ZXM+O1xufVxuXG4vKipcbiAqIFByb2Nlc3NlcyBzZXJ2ZXIgdmFsaWRhdGlvbiBlcnJvcnMgYW5kIGFwcGxpZXMgdGhlbSB0byByZWFjdC1ob29rLWZvcm0gZmllbGRzLlxuICpcbiAqIFRoaXMgdXRpbGl0eSBmdW5jdGlvbiB0YWtlcyB2YWxpZGF0aW9uIGVycm9ycyBmcm9tIGEgc2VydmVyIHJlc3BvbnNlIGFuZCBhdXRvbWF0aWNhbGx5XG4gKiBhcHBsaWVzIHRoZW0gdG8gdGhlIGNvcnJlc3BvbmRpbmcgZm9ybSBmaWVsZHMgdXNpbmcgcmVhY3QtaG9vay1mb3JtJ3Mgc2V0RXJyb3IgZnVuY3Rpb24uXG4gKiBJdCBzdXBwb3J0cyB2YXJpb3VzIGVycm9yIGZvcm1hdHMgaW5jbHVkaW5nIHN0cmluZ3MsIGFycmF5cyBvZiBzdHJpbmdzLCBhbmQgYm9vbGVhbiBmbGFncy5cbiAqXG4gKiBUaGUgZnVuY3Rpb24gdXNlcyBvYmplY3QgZmxhdHRlbmluZyB0byBoYW5kbGUgbmVzdGVkIGVycm9yIHN0cnVjdHVyZXMgYW5kIGVuc3VyZXNcbiAqIHRoYXQgb25seSB2YWxpZCBmaWVsZCBwYXRocyBhcmUgcHJvY2Vzc2VkLlxuICpcbiAqIEBleGFtcGxlXG4gKiBCYXNpYyB1c2FnZSB3aXRoIHNlcnZlciByZXNwb25zZTpcbiAqIGBgYHRzeFxuICogY29uc3QgeyBzZXRFcnJvciB9ID0gdXNlRm9ybSgpO1xuICpcbiAqIHRyeSB7XG4gKiAgIGF3YWl0IHN1Ym1pdEZvcm0oZGF0YSk7XG4gKiB9IGNhdGNoIChlcnJvcikge1xuICogICBoYW5kbGVTZXJ2ZXJFcnJvcnMoe1xuICogICAgIGVycm9yczogZXJyb3IucmVzcG9uc2UuZGF0YS5lcnJvcnMsXG4gKiAgICAgc2V0RXJyb3JcbiAqICAgfSk7XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogV2l0aCBkaWZmZXJlbnQgZXJyb3IgZm9ybWF0czpcbiAqIGBgYHRzeFxuICogY29uc3Qgc2VydmVyRXJyb3JzID0ge1xuICogICBlbWFpbDogJ0VtYWlsIGlzIGFscmVhZHkgdGFrZW4nLFxuICogICBwYXNzd29yZDogWydUb28gc2hvcnQnLCAnTXVzdCBjb250YWluIG51bWJlcnMnXSxcbiAqICAgdGVybXM6IHRydWUgLy8gQm9vbGVhbiBmbGFnIGluZGljYXRpbmcgaW52YWxpZFxuICogfTtcbiAqXG4gKiBoYW5kbGVTZXJ2ZXJFcnJvcnMoeyBlcnJvcnM6IHNlcnZlckVycm9ycywgc2V0RXJyb3IgfSk7XG4gKiAvLyBSZXN1bHRzIGluOlxuICogLy8gLSBlbWFpbCBmaWVsZCBzaG93czogXCJFbWFpbCBpcyBhbHJlYWR5IHRha2VuXCJcbiAqIC8vIC0gcGFzc3dvcmQgZmllbGQgc2hvd3M6IFwiVG9vIHNob3J0IE11c3QgY29udGFpbiBudW1iZXJzXCJcbiAqIC8vIC0gdGVybXMgZmllbGQgc2hvd3M6IFwiRmllbGQgaXMgbm90IHZhbGlkLlwiXG4gKiBgYGBcbiAqXG4gKiBAdGVtcGxhdGUgVEZpZWxkVmFsdWVzIC0gVGhlIGZvcm0gdmFsdWVzIHR5cGVcbiAqXG4gKiBAcGFyYW0gYXJncyAtIENvbmZpZ3VyYXRpb24gb2JqZWN0IGNvbnRhaW5pbmcgZXJyb3JzIGFuZCBzZXRFcnJvciBmdW5jdGlvblxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IGhhbmRsZVNlcnZlckVycm9ycyA9IGZ1bmN0aW9uIGhhbmRsZVNlcnZlckVycm9yczxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbj4oYXJnczogSGFuZGxlU2VydmVyRXJyb3JzVHlwZTxURmllbGRWYWx1ZXM+KSB7XG4gIGNvbnN0IHsgZXJyb3JzLCBzZXRFcnJvciB9ID0gYXJncztcblxuICBmb3IgKGNvbnN0IGtleSBpbiBlcnJvcnMpIHtcbiAgICBjb25zdCBpc0tleUluVmFyaWFibGVzID0gT2JqZWN0LmtleXMoZmxhdHRlbk9iamVjdEtleXMoZXJyb3JzKSkuaW5jbHVkZXMoXG4gICAgICBrZXlcbiAgICApO1xuXG4gICAgaWYgKCFpc0tleUluVmFyaWFibGVzKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBmaWVsZEVycm9yID0gZXJyb3JzW2tleV07XG5cbiAgICBsZXQgZXJyb3JNZXNzYWdlID0gJyc7XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShmaWVsZEVycm9yKSkge1xuICAgICAgZXJyb3JNZXNzYWdlID0gZmllbGRFcnJvci5qb2luKCcgJyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBmaWVsZEVycm9yID09PSAnc3RyaW5nJykge1xuICAgICAgZXJyb3JNZXNzYWdlID0gZmllbGRFcnJvcjtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGZpZWxkRXJyb3IgPT09ICdib29sZWFuJyAmJiBmaWVsZEVycm9yKSB7XG4gICAgICBlcnJvck1lc3NhZ2UgPSAnRmllbGQgaXMgbm90IHZhbGlkLic7XG4gICAgfVxuXG4gICAgc2V0RXJyb3Ioa2V5IGFzIFBhdGg8VEZpZWxkVmFsdWVzPiwge1xuICAgICAgbWVzc2FnZTogZXJyb3JNZXNzYWdlLFxuICAgIH0pO1xuICB9XG59O1xuIiwgIi8qKlxuICogVHlwZS1zYWZlIHByb3BlcnR5IGV4aXN0ZW5jZSBjaGVja2VyIHRoYXQgYWN0cyBhcyBhIHR5cGUgZ3VhcmQuXG4gKlxuICogQ2hlY2tzIGlmIGEgZ2l2ZW4gcHJvcGVydHkgZXhpc3RzIG9uIGFuIG9iamVjdCBhbmQgbmFycm93cyB0aGUgVHlwZVNjcmlwdCB0eXBlXG4gKiB0byBpbmNsdWRlIHRoYXQgcHJvcGVydHkuIFRoaXMgaXMgdXNlZnVsIGZvciBzYWZlbHkgYWNjZXNzaW5nIHByb3BlcnRpZXMgb25cbiAqIG9iamVjdHMgb2YgdW5rbm93biBzdHJ1Y3R1cmUgd2hpbGUgbWFpbnRhaW5pbmcgdHlwZSBzYWZldHkuXG4gKlxuICogQHRlbXBsYXRlIFggLSBUaGUgdHlwZSBvZiB0aGUgb2JqZWN0IGJlaW5nIGNoZWNrZWRcbiAqIEB0ZW1wbGF0ZSBZIC0gVGhlIHR5cGUgb2YgdGhlIHByb3BlcnR5IGtleSAoZXh0ZW5kcyBQcm9wZXJ0eUtleSlcbiAqXG4gKiBAcGFyYW0gb2JqIC0gVGhlIG9iamVjdCB0byBjaGVjayBmb3IgdGhlIHByb3BlcnR5XG4gKiBAcGFyYW0gcHJvcCAtIFRoZSBwcm9wZXJ0eSBrZXkgdG8gY2hlY2sgZm9yIGV4aXN0ZW5jZVxuICpcbiAqIEByZXR1cm5zIEEgdHlwZSBwcmVkaWNhdGUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBwcm9wZXJ0eSBleGlzdHMgb24gdGhlIG9iamVjdC5cbiAqICAgICAgICAgIElmIHRydWUsIHRoZSBvYmplY3QgdHlwZSBpcyBuYXJyb3dlZCB0byBpbmNsdWRlIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IGRhdGE6IHVua25vd24gPSB7IG5hbWU6IFwiSm9oblwiLCBhZ2U6IDMwIH07XG4gKlxuICogaWYgKHByb3BlcnR5RXhpc3RzKGRhdGEsIFwibmFtZVwiKSkge1xuICogICAvLyBUeXBlU2NyaXB0IG5vdyBrbm93cyBkYXRhIGhhcyBhICduYW1lJyBwcm9wZXJ0eVxuICogICBjb25zb2xlLmxvZyhkYXRhLm5hbWUpOyAvLyBUeXBlLXNhZmUgYWNjZXNzXG4gKiB9XG4gKlxuICogLy8gQ2hlY2sgZm9yIG5lc3RlZCBwcm9wZXJ0eSBleGlzdGVuY2VcbiAqIGlmIChwcm9wZXJ0eUV4aXN0cyhvYmosIFwidXNlclwiKSAmJiBwcm9wZXJ0eUV4aXN0cyhvYmoudXNlciwgXCJpZFwiKSkge1xuICogICBjb25zb2xlLmxvZyhvYmoudXNlci5pZCk7IC8vIFNhZmUgbmVzdGVkIGFjY2Vzc1xuICogfVxuICogYGBgXG4gKlxuICogQHNpbmNlIDIuMTguNDVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb3BlcnR5RXhpc3RzPFgsIFkgZXh0ZW5kcyBQcm9wZXJ0eUtleT4oXG4gIG9iajogWCxcbiAgcHJvcDogWVxuKTogb2JqIGlzIFggJiBSZWNvcmQ8WSwgdW5rbm93bj4ge1xuICByZXR1cm4gKFxuICAgIHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmXG4gICAgb2JqICE9PSBudWxsICYmXG4gICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcClcbiAgKTtcbn1cbiIsICJpbXBvcnQgdHlwZSB7IFBpY2tlclZhbGlkRGF0ZSB9IGZyb20gXCJAbXVpL3gtZGF0ZS1waWNrZXJzXCI7XG5pbXBvcnQgdHlwZSB7IHVzZUxvY2FsaXphdGlvbkNvbnRleHQgfSBmcm9tIFwiQG11aS94LWRhdGUtcGlja2Vycy9pbnRlcm5hbHNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIHJlYWRWYWx1ZUFzRGF0ZTxURGF0ZSBleHRlbmRzIFBpY2tlclZhbGlkRGF0ZT4oXG4gIGFkYXB0ZXI6IFJldHVyblR5cGU8dHlwZW9mIHVzZUxvY2FsaXphdGlvbkNvbnRleHQ+LFxuICB2YWx1ZTogc3RyaW5nIHwgbnVsbCB8IFREYXRlXG4pOiBURGF0ZSB8IG51bGwge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB7XG4gICAgaWYgKHZhbHVlID09PSBcIlwiKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gYWRhcHRlci51dGlscy5kYXRlKHZhbHVlKSBhcyBURGF0ZTtcbiAgfVxuXG4gIHJldHVybiB2YWx1ZTtcbn1cbiIsICJleHBvcnQgY29uc3QgcmVtb3ZlTGVhZGluZ1RyYWlsaW5nU2xhc2hlcyA9IChyb3V0ZTogc3RyaW5nKSA9PiB7XG4gIHJldHVybiByb3V0ZS5yZXBsYWNlKC9eXFwvfFxcLyQvZywgXCJcIik7XG59O1xuIiwgImltcG9ydCBkYXlqcyBmcm9tICdkYXlqcyc7XG5pbXBvcnQgeyB6IH0gZnJvbSAnem9kJztcblxuLy8gSGVscGVyIGZ1bmN0aW9uIGZvciBMdWhuIGFsZ29yaXRobSB2YWxpZGF0aW9uXG5mdW5jdGlvbiBpc1ZhbGlkTHVobih2YWx1ZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmICghdmFsdWUgfHwgdmFsdWUudHJpbSgpID09PSAnJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IG51bWJlciA9IHZhbHVlLnJlcGxhY2UoL1tcXHMtXS9nLCAnJyk7XG5cbiAgaWYgKCEvXlxcZCskLy50ZXN0KG51bWJlcikpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAobnVtYmVyLmxlbmd0aCA8IDEzIHx8IG51bWJlci5sZW5ndGggPiAxOSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGxldCBzdW0gPSAwO1xuICBsZXQgYWx0ZXJuYXRlID0gZmFsc2U7XG5cbiAgZm9yIChsZXQgaSA9IG51bWJlci5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIGxldCBkaWdpdCA9IHBhcnNlSW50KG51bWJlci5jaGFyQXQoaSksIDEwKTtcblxuICAgIGlmIChhbHRlcm5hdGUpIHtcbiAgICAgIGRpZ2l0ICo9IDI7XG4gICAgICBpZiAoZGlnaXQgPiA5KSB7XG4gICAgICAgIGRpZ2l0IC09IDk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgc3VtICs9IGRpZ2l0O1xuICAgIGFsdGVybmF0ZSA9ICFhbHRlcm5hdGU7XG4gIH1cblxuICByZXR1cm4gc3VtICUgMTAgPT09IDA7XG59XG5cbmV4cG9ydCBjb25zdCBzY2hlbWFUb29scyA9IHtcbiAgLy8gRGF0ZSB2YWxpZGF0aW9uc1xuICBkYXRlOiAoeyBtZXNzYWdlIH06IHsgbWVzc2FnZT86IHN0cmluZyB9ID0ge30pID0+XG4gICAgei5jb2VyY2VcbiAgICAgIC5zdHJpbmcoKVxuICAgICAgLnRyYW5zZm9ybShjID0+IChjID09PSAnbnVsbCcgfHwgYyA9PT0gJ3VuZGVmaW5lZCcgPyBudWxsIDogYykpXG4gICAgICAucmVmaW5lKGMgPT4gISFjLCB7IG1lc3NhZ2U6IG1lc3NhZ2UgfHwgJ0RhdGUgaXMgcmVxdWlyZWQnIH0pXG4gICAgICAucmVmaW5lKGMgPT4gKGMgPyBkYXlqcyhjKS5pc1ZhbGlkKCkgOiB0cnVlKSwge1xuICAgICAgICBtZXNzYWdlOiBtZXNzYWdlIHx8ICdJbnZhbGlkIGRhdGUnLFxuICAgICAgfSksXG5cbiAgbnVsbGFibGVEYXRlOiAoeyBtZXNzYWdlIH06IHsgbWVzc2FnZT86IHN0cmluZyB9ID0ge30pID0+XG4gICAgei5jb2VyY2VcbiAgICAgIC5zdHJpbmcoKVxuICAgICAgLnRyYW5zZm9ybShjID0+IChjID09PSAnbnVsbCcgPyBudWxsIDogYykpXG4gICAgICAudHJhbnNmb3JtKGMgPT4gKGMgPT09ICd1bmRlZmluZWQnID8gbnVsbCA6IGMpKVxuICAgICAgLnJlZmluZShjID0+ICghYyAmJiBjICE9PSBudWxsID8gZGF5anMoYykuaXNWYWxpZCgpIDogdHJ1ZSksIHtcbiAgICAgICAgbWVzc2FnZTogbWVzc2FnZSB8fCAnSW52YWxpZCBkYXRlJyxcbiAgICAgIH0pLFxuXG4gIHBhc3REYXRlOiAoeyBtZXNzYWdlIH06IHsgbWVzc2FnZT86IHN0cmluZyB9ID0ge30pID0+XG4gICAgei5jb2VyY2UuZGF0ZSgpLnJlZmluZShkYXRlID0+IGRhdGUgPCBuZXcgRGF0ZSgpLCB7XG4gICAgICBtZXNzYWdlOiBtZXNzYWdlIHx8ICdNdXN0IGJlIGEgcGFzdCBkYXRlJyxcbiAgICB9KSxcblxuICBmdXR1cmVEYXRlOiAoeyBtZXNzYWdlIH06IHsgbWVzc2FnZT86IHN0cmluZyB9ID0ge30pID0+XG4gICAgei5jb2VyY2UuZGF0ZSgpLnJlZmluZShkYXRlID0+IGRhdGUgPiBuZXcgRGF0ZSgpLCB7XG4gICAgICBtZXNzYWdlOiBtZXNzYWdlIHx8ICdNdXN0IGJlIGEgZnV0dXJlIGRhdGUnLFxuICAgIH0pLFxuXG4gIHRvZGF5T3JGdXR1cmVEYXRlOiAoeyBtZXNzYWdlIH06IHsgbWVzc2FnZT86IHN0cmluZyB9ID0ge30pID0+XG4gICAgei5jb2VyY2UuZGF0ZSgpLnJlZmluZShcbiAgICAgIGRhdGUgPT4ge1xuICAgICAgICBjb25zdCB0b2RheSA9IG5ldyBEYXRlKCk7XG5cbiAgICAgICAgdG9kYXkuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG5cbiAgICAgICAgcmV0dXJuIGRhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCkgPj0gdG9kYXkuZ2V0VGltZSgpO1xuICAgICAgfSxcbiAgICAgIHsgbWVzc2FnZTogbWVzc2FnZSB8fCAnTXVzdCBiZSB0b2RheSBvciBhIGZ1dHVyZSBkYXRlJyB9XG4gICAgKSxcblxuICB0b2RheU9yUGFzdERhdGU6ICh7IG1lc3NhZ2UgfTogeyBtZXNzYWdlPzogc3RyaW5nIH0gPSB7fSkgPT5cbiAgICB6LmNvZXJjZS5kYXRlKCkucmVmaW5lKFxuICAgICAgZGF0ZSA9PiB7XG4gICAgICAgIGNvbnN0IHRvZGF5ID0gbmV3IERhdGUoKTtcblxuICAgICAgICB0b2RheS5zZXRIb3VycygwLCAwLCAwLCAwKTtcblxuICAgICAgICByZXR1cm4gZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKSA8PSB0b2RheS5nZXRUaW1lKCk7XG4gICAgICB9LFxuICAgICAgeyBtZXNzYWdlOiBtZXNzYWdlIHx8ICdNdXN0IGJlIHRvZGF5IG9yIGEgcGFzdCBkYXRlJyB9XG4gICAgKSxcblxuICBhZHVsdDogKHsgbWVzc2FnZSB9OiB7IG1lc3NhZ2U/OiBzdHJpbmcgfSA9IHt9KSA9PlxuICAgIHouY29lcmNlLmRhdGUoKS5yZWZpbmUoXG4gICAgICBkYXRlID0+IHtcbiAgICAgICAgY29uc3QgZWlnaHRlZW5ZZWFyc0FnbyA9IG5ldyBEYXRlKCk7XG5cbiAgICAgICAgZWlnaHRlZW5ZZWFyc0Fnby5zZXRGdWxsWWVhcihlaWdodGVlblllYXJzQWdvLmdldEZ1bGxZZWFyKCkgLSAxOCk7XG4gICAgICAgIGVpZ2h0ZWVuWWVhcnNBZ28uc2V0SG91cnMoMCwgMCwgMCwgMCk7IC8vIE5vcm1hbGl6ZSB0byBzdGFydCBvZiBkYXlcbiAgICAgICAgY29uc3QgZG9iID0gbmV3IERhdGUoZGF0ZSk7XG5cbiAgICAgICAgZG9iLnNldEhvdXJzKDAsIDAsIDAsIDApOyAvLyBOb3JtYWxpemUgdG8gc3RhcnQgb2YgZGF5XG5cbiAgICAgICAgcmV0dXJuIGRvYiA8PSBlaWdodGVlblllYXJzQWdvO1xuICAgICAgfSxcbiAgICAgIHsgbWVzc2FnZTogbWVzc2FnZSB8fCAnTXVzdCBiZSBhdCBsZWFzdCAxOCB5ZWFycyBvbGQnIH1cbiAgICApLFxuXG4gIG1pbmltdW1BZ2U6ICh7XG4gICAgbWVzc2FnZSxcbiAgICBtaW5pbXVtQWdlLFxuICB9OiB7IG1lc3NhZ2U/OiBzdHJpbmc7IG1pbmltdW1BZ2U/OiBudW1iZXIgfSA9IHt9KSA9PlxuICAgIHouY29lcmNlLmRhdGUoKS5yZWZpbmUoXG4gICAgICBkYXRlID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBtaW5pbXVtQWdlICE9PSAnbnVtYmVyJykgcmV0dXJuIGZhbHNlO1xuICAgICAgICBjb25zdCBtaW5ZZWFyc0FnbyA9IG5ldyBEYXRlKCk7XG5cbiAgICAgICAgbWluWWVhcnNBZ28uc2V0RnVsbFllYXIobWluWWVhcnNBZ28uZ2V0RnVsbFllYXIoKSAtIG1pbmltdW1BZ2UpO1xuICAgICAgICBtaW5ZZWFyc0Fnby5zZXRIb3VycygwLCAwLCAwLCAwKTsgLy8gTm9ybWFsaXplIHRvIHN0YXJ0IG9mIGRheVxuICAgICAgICBjb25zdCBkb2IgPSBuZXcgRGF0ZShkYXRlKTtcblxuICAgICAgICBkb2Iuc2V0SG91cnMoMCwgMCwgMCwgMCk7IC8vIE5vcm1hbGl6ZSB0byBzdGFydCBvZiBkYXlcblxuICAgICAgICByZXR1cm4gZG9iIDw9IG1pblllYXJzQWdvO1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbWVzc2FnZTpcbiAgICAgICAgICBtZXNzYWdlIHx8XG4gICAgICAgICAgYE11c3QgYmUgYXQgbGVhc3QgJHttaW5pbXVtQWdlID8/ICd0aGUgcmVxdWlyZWQnfSB5ZWFycyBvbGRgLFxuICAgICAgfVxuICAgICksXG5cbiAgd2l0aGluRGF5czogKHsgbWVzc2FnZSwgZGF5cyB9OiB7IG1lc3NhZ2U/OiBzdHJpbmc7IGRheXM/OiBudW1iZXIgfSA9IHt9KSA9PlxuICAgIHouY29lcmNlLmRhdGUoKS5yZWZpbmUoXG4gICAgICBkYXRlID0+IHtcbiAgICAgICAgY29uc3QgdG9kYXkgPSBuZXcgRGF0ZSgpO1xuXG4gICAgICAgIHRvZGF5LnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICAgICAgICBjb25zdCBpbnB1dERhdGUgPSBuZXcgRGF0ZShkYXRlKTtcblxuICAgICAgICBpbnB1dERhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG5cbiAgICAgICAgY29uc3QgZGlmZlRpbWUgPSBNYXRoLmFicyhpbnB1dERhdGUuZ2V0VGltZSgpIC0gdG9kYXkuZ2V0VGltZSgpKTtcbiAgICAgICAgY29uc3QgZGlmZkRheXMgPSBNYXRoLmNlaWwoZGlmZlRpbWUgLyAoMTAwMCAqIDYwICogNjAgKiAyNCkpOyAvLyBDb252ZXJ0IG1pbGxpc2Vjb25kcyB0byBkYXlzXG5cbiAgICAgICAgcmV0dXJuIHR5cGVvZiBkYXlzID09PSAnbnVtYmVyJyA/IGRpZmZEYXlzIDw9IGRheXMgOiBmYWxzZTtcbiAgICAgIH0sXG4gICAgICB7IG1lc3NhZ2U6IG1lc3NhZ2UgfHwgYE11c3QgYmUgd2l0aGluICR7ZGF5c30gZGF5cyBvZiB0b2RheWAgfVxuICAgICksXG5cbiAgd2Vla2RheTogKHsgbWVzc2FnZSB9OiB7IG1lc3NhZ2U/OiBzdHJpbmcgfSA9IHt9KSA9PlxuICAgIHouY29lcmNlLmRhdGUoKS5yZWZpbmUoXG4gICAgICBkYXRlID0+IHtcbiAgICAgICAgY29uc3QgZGF5ID0gZGF0ZS5nZXREYXkoKTsgLy8gMCA9IFN1bmRheSwgMSA9IE1vbmRheSwgLi4uLCA2ID0gU2F0dXJkYXlcblxuICAgICAgICByZXR1cm4gZGF5ICE9PSAwICYmIGRheSAhPT0gNjtcbiAgICAgIH0sXG4gICAgICB7IG1lc3NhZ2U6IG1lc3NhZ2UgfHwgJ011c3QgYmUgYSB3ZWVrZGF5JyB9XG4gICAgKSxcblxuICBkYXRlUmFuZ2U6ICh7IG1lc3NhZ2UgfTogeyBtZXNzYWdlPzogc3RyaW5nIH0gPSB7fSkgPT5cbiAgICB6XG4gICAgICAub2JqZWN0KHtcbiAgICAgICAgc3RhcnQ6IHouY29lcmNlLmRhdGUoKSxcbiAgICAgICAgZW5kOiB6LmNvZXJjZS5kYXRlKCksXG4gICAgICB9KVxuICAgICAgLnJlZmluZShkYXRhID0+IGRhdGEuc3RhcnQgPD0gZGF0YS5lbmQsIHtcbiAgICAgICAgbWVzc2FnZTogbWVzc2FnZSB8fCAnU3RhcnQgZGF0ZSBtdXN0IGJlIGJlZm9yZSBvciBlcXVhbCB0byBlbmQgZGF0ZScsXG4gICAgICB9KSxcblxuICB0aW1lOiAoeyBtZXNzYWdlIH06IHsgbWVzc2FnZT86IHN0cmluZyB9ID0ge30pID0+XG4gICAgei5jb2VyY2VcbiAgICAgIC5kYXRlKClcbiAgICAgIC50cmFuc2Zvcm0oYyA9PiAoYyA9PT0gbnVsbCB8fCBjID09PSB1bmRlZmluZWQgPyBudWxsIDogYykpXG4gICAgICAucmVmaW5lKGMgPT4gISFjLCB7IG1lc3NhZ2U6IG1lc3NhZ2UgfHwgJ1RpbWUgaXMgcmVxdWlyZWQnIH0pXG4gICAgICAucmVmaW5lKGMgPT4gKGMgPyBkYXlqcyhjKS5pc1ZhbGlkKCkgOiB0cnVlKSwge1xuICAgICAgICBtZXNzYWdlOiBtZXNzYWdlIHx8ICdJbnZhbGlkIHRpbWUnLFxuICAgICAgfSksXG5cbiAgZGF0ZVRpbWU6ICh7IG1lc3NhZ2UgfTogeyBtZXNzYWdlPzogc3RyaW5nIH0gPSB7fSkgPT5cbiAgICB6LmNvZXJjZVxuICAgICAgLmRhdGUoKVxuICAgICAgLnRyYW5zZm9ybShjID0+IChjID09PSBudWxsIHx8IGMgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBjKSlcbiAgICAgIC5yZWZpbmUoYyA9PiAhIWMsIHsgbWVzc2FnZTogbWVzc2FnZSB8fCAnRGF0ZSBhbmQgVGltZSBpcyByZXF1aXJlZCcgfSlcbiAgICAgIC5yZWZpbmUoYyA9PiAoYyA/IGRheWpzKGMpLmlzVmFsaWQoKSA6IHRydWUpLCB7XG4gICAgICAgIG1lc3NhZ2U6IG1lc3NhZ2UgfHwgJ0ludmFsaWQgRGF0ZSBhbmQgVGltZScsXG4gICAgICB9KSxcblxuICAvLyBTdHJpbmcgdmFsaWRhdGlvbnNcbiAgcmVxdWlyZWRTdHJpbmc6ICh7XG4gICAgbWVzc2FnZSxcbiAgICBtaW4sXG4gICAgbWF4LFxuICB9OiB7IG1lc3NhZ2U/OiBzdHJpbmc7IG1pbj86IG51bWJlcjsgbWF4PzogbnVtYmVyIH0gPSB7fSkgPT5cbiAgICB6XG4gICAgICAuc3RyaW5nKClcbiAgICAgIC50cmltKClcbiAgICAgIC5taW4oXG4gICAgICAgIG1pbiB8fCAxLFxuICAgICAgICBtZXNzYWdlIHx8IGBTdHJpbmcgbXVzdCBiZSBhdCBsZWFzdCAke21pbiB8fCAxfSBjaGFyYWN0ZXJzYFxuICAgICAgKVxuICAgICAgLm1heChcbiAgICAgICAgbWF4IHx8IDI1NSxcbiAgICAgICAgbWVzc2FnZSB8fCBgU3RyaW5nIG11c3QgYmUgYXQgbW9zdCAke21heCB8fCAyNTV9IGNoYXJhY3RlcnNgXG4gICAgICApLFxuXG4gIGVtYWlsOiAoeyBtZXNzYWdlIH06IHsgbWVzc2FnZT86IHN0cmluZyB9ID0ge30pID0+XG4gICAgelxuICAgICAgLnN0cmluZygpXG4gICAgICAuZW1haWwobWVzc2FnZSB8fCAnSW52YWxpZCBlbWFpbCBhZGRyZXNzJylcbiAgICAgIC5tYXgoMjU0LCAnRW1haWwgbXVzdCBiZSBhdCBtb3N0IDI1NCBjaGFyYWN0ZXJzJyksXG5cbiAgdXJsOiAoeyBtZXNzYWdlIH06IHsgbWVzc2FnZT86IHN0cmluZyB9ID0ge30pID0+XG4gICAgei5zdHJpbmcoKS51cmwobWVzc2FnZSB8fCAnSW52YWxpZCBVUkwgZm9ybWF0JyksXG5cbiAgcGhvbmU6ICh7IG1lc3NhZ2UgfTogeyBtZXNzYWdlPzogc3RyaW5nIH0gPSB7fSkgPT5cbiAgICB6XG4gICAgICAuc3RyaW5nKClcbiAgICAgIC5yZWdleCgvXlsrXT9bMS05XVtcXGRdezAsMTV9JC8sIG1lc3NhZ2UgfHwgJ0ludmFsaWQgcGhvbmUgbnVtYmVyIGZvcm1hdCcpLFxuXG4gIGNyZWRpdENhcmQ6ICh7IG1lc3NhZ2UgfTogeyBtZXNzYWdlPzogc3RyaW5nIH0gPSB7fSkgPT5cbiAgICB6LnN0cmluZygpLnJlZmluZSh2YWx1ZSA9PiBpc1ZhbGlkTHVobih2YWx1ZSksIHtcbiAgICAgIG1lc3NhZ2U6IG1lc3NhZ2UgfHwgJ011c3QgYmUgYSB2YWxpZCBjcmVkaXQgY2FyZCBudW1iZXInLFxuICAgIH0pLFxuXG4gIGluZGlhbk1vYmlsZTogKHsgbWVzc2FnZSB9OiB7IG1lc3NhZ2U/OiBzdHJpbmcgfSA9IHt9KSA9PlxuICAgIHpcbiAgICAgIC5zdHJpbmcoKVxuICAgICAgLnJlZ2V4KC9eWzYtOV1cXGR7OX0kLywgbWVzc2FnZSB8fCAnTXVzdCBiZSBhIHZhbGlkIEluZGlhbiBtb2JpbGUgbnVtYmVyJyksXG5cbiAgaW50ZXJuYXRpb25hbFBob25lOiAoeyBtZXNzYWdlIH06IHsgbWVzc2FnZT86IHN0cmluZyB9ID0ge30pID0+XG4gICAgelxuICAgICAgLnN0cmluZygpXG4gICAgICAucmVnZXgoXG4gICAgICAgIC9eXFwrP1sxLTldXFxkezYsMTR9JC8sXG4gICAgICAgIG1lc3NhZ2UgfHwgJ011c3QgYmUgYSB2YWxpZCBpbnRlcm5hdGlvbmFsIHBob25lIG51bWJlcidcbiAgICAgICksXG5cbiAgYWxwaGFiZXRpYzogKHsgbWVzc2FnZSB9OiB7IG1lc3NhZ2U/OiBzdHJpbmcgfSA9IHt9KSA9PlxuICAgIHpcbiAgICAgIC5zdHJpbmcoKVxuICAgICAgLnJlZ2V4KFxuICAgICAgICAvXltBLVphLXosIF0rJC8sXG4gICAgICAgIG1lc3NhZ2UgfHwgJ011c3QgY29udGFpbiBvbmx5IGxldHRlcnMsIGNvbW1hcywgYW5kIHNwYWNlcydcbiAgICAgICksXG5cbiAgZ3VpZDogKHsgbWVzc2FnZSB9OiB7IG1lc3NhZ2U/OiBzdHJpbmcgfSA9IHt9KSA9PlxuICAgIHouc3RyaW5nKCkudXVpZChtZXNzYWdlIHx8ICdNdXN0IGJlIGEgdmFsaWQgR1VJRCcpLFxuXG4gIG5vbkVtcHR5T3JXaGl0ZXNwYWNlOiAoeyBtZXNzYWdlIH06IHsgbWVzc2FnZT86IHN0cmluZyB9ID0ge30pID0+XG4gICAgelxuICAgICAgLnN0cmluZygpXG4gICAgICAudHJpbSgpXG4gICAgICAubWluKDEsIG1lc3NhZ2UgfHwgJ011c3Qgbm90IGJlIGVtcHR5IG9yIHdoaXRlc3BhY2UnKSxcblxuICB1c2VybmFtZTogKHsgbWVzc2FnZSB9OiB7IG1lc3NhZ2U/OiBzdHJpbmcgfSA9IHt9KSA9PlxuICAgIHpcbiAgICAgIC5zdHJpbmcoKVxuICAgICAgLnJlZ2V4KFxuICAgICAgICAvXlthLXpBLVpdW2EtekEtWjAtOV9dezIsMjl9JC8sXG4gICAgICAgIG1lc3NhZ2UgfHxcbiAgICAgICAgICAnTXVzdCBiZSAzLTMwIGNoYXJhY3RlcnMsIHN0YXJ0IHdpdGggYSBsZXR0ZXIsIGFuZCBjb250YWluIG9ubHkgbGV0dGVycywgbnVtYmVycywgYW5kIHVuZGVyc2NvcmVzJ1xuICAgICAgKSxcblxuICBleGFjdExlbmd0aDogKHtcbiAgICBtZXNzYWdlLFxuICAgIGxlbmd0aCxcbiAgfTogeyBtZXNzYWdlPzogc3RyaW5nOyBsZW5ndGg/OiBudW1iZXIgfSA9IHt9KSA9PiB7XG4gICAgaWYgKHR5cGVvZiBsZW5ndGggIT09ICdudW1iZXInKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0xlbmd0aCBtdXN0IGJlIHByb3ZpZGVkIGZvciBleGFjdExlbmd0aCB2YWxpZGF0b3InKTtcbiAgICB9XG5cbiAgICByZXR1cm4gelxuICAgICAgLnN0cmluZygpXG4gICAgICAubGVuZ3RoKGxlbmd0aCwgbWVzc2FnZSB8fCBgTXVzdCBiZSBleGFjdGx5ICR7bGVuZ3RofSBjaGFyYWN0ZXJzYCk7XG4gIH0sXG5cbiAgbWluV29yZHM6ICh7XG4gICAgbWVzc2FnZSxcbiAgICBtaW5Xb3JkcyxcbiAgfTogeyBtZXNzYWdlPzogc3RyaW5nOyBtaW5Xb3Jkcz86IG51bWJlciB9ID0ge30pID0+XG4gICAgei5zdHJpbmcoKS5yZWZpbmUoXG4gICAgICB2YWx1ZSA9PiB7XG4gICAgICAgIGlmICghdmFsdWUpIHJldHVybiB0cnVlO1xuICAgICAgICBjb25zdCB3b3JkcyA9IHZhbHVlLnNwbGl0KC9bXFxzXFx0XFxuXFxyXSsvKS5maWx0ZXIoQm9vbGVhbik7XG5cbiAgICAgICAgcmV0dXJuIHdvcmRzLmxlbmd0aCA+PSAodHlwZW9mIG1pbldvcmRzID09PSAnbnVtYmVyJyA/IG1pbldvcmRzIDogMCk7XG4gICAgICB9LFxuICAgICAgeyBtZXNzYWdlOiBtZXNzYWdlIHx8IGBNdXN0IGhhdmUgYXQgbGVhc3QgJHttaW5Xb3Jkc30gd29yZChzKWAgfVxuICAgICksXG5cbiAgbWF4V29yZHM6ICh7XG4gICAgbWVzc2FnZSxcbiAgICBtYXhXb3JkcyxcbiAgfTogeyBtZXNzYWdlPzogc3RyaW5nOyBtYXhXb3Jkcz86IG51bWJlciB9ID0ge30pID0+XG4gICAgei5zdHJpbmcoKS5yZWZpbmUoXG4gICAgICB2YWx1ZSA9PiB7XG4gICAgICAgIGlmICghdmFsdWUpIHJldHVybiB0cnVlO1xuICAgICAgICBjb25zdCB3b3JkcyA9IHZhbHVlLnNwbGl0KC9bXFxzXFx0XFxuXFxyXSsvKS5maWx0ZXIoQm9vbGVhbik7XG5cbiAgICAgICAgcmV0dXJuIHdvcmRzLmxlbmd0aCA8PSAodHlwZW9mIG1heFdvcmRzID09PSAnbnVtYmVyJyA/IG1heFdvcmRzIDogMCk7XG4gICAgICB9LFxuICAgICAgeyBtZXNzYWdlOiBtZXNzYWdlIHx8IGBNdXN0IGhhdmUgYXQgbW9zdCAke21heFdvcmRzfSB3b3JkKHMpYCB9XG4gICAgKSxcblxuICBzdHJvbmdQYXNzd29yZDogKHsgbWVzc2FnZSB9OiB7IG1lc3NhZ2U/OiBzdHJpbmcgfSA9IHt9KSA9PlxuICAgIHpcbiAgICAgIC5zdHJpbmcoKVxuICAgICAgLnJlZ2V4KFxuICAgICAgICAvXig/PS4qW2Etel0pKD89LipbQS1aXSkoPz0uKlxcZCkoPz0uKltAJCElKj8mXSlbQS1aYS16XFxkQCQhJSo/Jl17OCx9JC8sXG4gICAgICAgIG1lc3NhZ2UgfHxcbiAgICAgICAgICAnTXVzdCBiZSBhdCBsZWFzdCA4IGNoYXJhY3RlcnMgYW5kIGNvbnRhaW4gdXBwZXJjYXNlLCBsb3dlcmNhc2UsIG51bWJlciwgYW5kIHNwZWNpYWwgY2hhcmFjdGVyJ1xuICAgICAgKSxcblxuICBub0h0bWw6ICh7IG1lc3NhZ2UgfTogeyBtZXNzYWdlPzogc3RyaW5nIH0gPSB7fSkgPT5cbiAgICB6XG4gICAgICAuc3RyaW5nKClcbiAgICAgIC5yZWZpbmUoXG4gICAgICAgIHZhbHVlID0+ICF2YWx1ZSB8fCAhLzxbXj5dKj4vLnRlc3QodmFsdWUpLFxuICAgICAgICBtZXNzYWdlIHx8ICdNdXN0IG5vdCBjb250YWluIEhUTUwgdGFncydcbiAgICAgICksXG5cbiAgbm9TY3JpcHRJbmplY3Rpb246ICh7IG1lc3NhZ2UgfTogeyBtZXNzYWdlPzogc3RyaW5nIH0gPSB7fSkgPT5cbiAgICB6XG4gICAgICAuc3RyaW5nKClcbiAgICAgIC5yZWZpbmUoXG4gICAgICAgIHZhbHVlID0+ICF2YWx1ZSB8fCAhLzxzY3JpcHR8amF2YXNjcmlwdDp8b25cXHcrXFxzKj0vaS50ZXN0KHZhbHVlKSxcbiAgICAgICAgbWVzc2FnZSB8fCAnQ29udGFpbnMgcG90ZW50aWFsbHkgdW5zYWZlIGNvbnRlbnQnXG4gICAgICApLFxuXG4gIG5vU3FsSW5qZWN0aW9uOiAoeyBtZXNzYWdlIH06IHsgbWVzc2FnZT86IHN0cmluZyB9ID0ge30pID0+XG4gICAgelxuICAgICAgLnN0cmluZygpXG4gICAgICAucmVmaW5lKFxuICAgICAgICB2YWx1ZSA9PlxuICAgICAgICAgICF2YWx1ZSB8fFxuICAgICAgICAgICEvKCd8LS18O3xcXGIoU0VMRUNUfElOU0VSVHxVUERBVEV8REVMRVRFfERST1B8VU5JT058QUxURVJ8Q1JFQVRFfEVYRUN8RVhFQ1VURSlcXGIpL2kudGVzdChcbiAgICAgICAgICAgIHZhbHVlXG4gICAgICAgICAgKSxcbiAgICAgICAgbWVzc2FnZSB8fCAnQ29udGFpbnMgcG90ZW50aWFsbHkgdW5zYWZlIGNvbnRlbnQnXG4gICAgICApLFxuXG4gIGluZGlhblBpbkNvZGU6ICh7IG1lc3NhZ2UgfTogeyBtZXNzYWdlPzogc3RyaW5nIH0gPSB7fSkgPT5cbiAgICB6XG4gICAgICAuc3RyaW5nKClcbiAgICAgIC5yZWdleCgvXlsxLTldWzAtOV17NX0kLywgbWVzc2FnZSB8fCAnTXVzdCBiZSBhIHZhbGlkIDYtZGlnaXQgUElOIGNvZGUnKSxcblxuICB1c1ppcENvZGU6ICh7IG1lc3NhZ2UgfTogeyBtZXNzYWdlPzogc3RyaW5nIH0gPSB7fSkgPT5cbiAgICB6XG4gICAgICAuc3RyaW5nKClcbiAgICAgIC5yZWdleCgvXlxcZHs1fSgtXFxkezR9KT8kLywgbWVzc2FnZSB8fCAnTXVzdCBiZSBhIHZhbGlkIFVTIFpJUCBjb2RlJyksXG5cbiAgdWtQb3N0YWxDb2RlOiAoeyBtZXNzYWdlIH06IHsgbWVzc2FnZT86IHN0cmluZyB9ID0ge30pID0+XG4gICAgelxuICAgICAgLnN0cmluZygpXG4gICAgICAucmVnZXgoXG4gICAgICAgIC9eW0EtWl17MSwyfVswLTldWzAtOUEtWl0/XFxzP1swLTldW0EtWl17Mn0kL2ksXG4gICAgICAgIG1lc3NhZ2UgfHwgJ011c3QgYmUgYSB2YWxpZCBVSyBwb3N0YWwgY29kZSdcbiAgICAgICksXG5cbiAgaXB2NDogKHsgbWVzc2FnZSB9OiB7IG1lc3NhZ2U/OiBzdHJpbmcgfSA9IHt9KSA9PlxuICAgIHpcbiAgICAgIC5zdHJpbmcoKVxuICAgICAgLnJlZ2V4KFxuICAgICAgICAvXigoMjVbMC01XXwyWzAtNF1bMC05XXxbMDFdP1swLTldWzAtOV0/KVxcLil7M30oMjVbMC01XXwyWzAtNF1bMC05XXxbMDFdP1swLTldWzAtOV0/KSQvLFxuICAgICAgICBtZXNzYWdlIHx8ICdNdXN0IGJlIGEgdmFsaWQgSVB2NCBhZGRyZXNzJ1xuICAgICAgKSxcblxuICBpcHY2OiAoeyBtZXNzYWdlIH06IHsgbWVzc2FnZT86IHN0cmluZyB9ID0ge30pID0+XG4gICAgelxuICAgICAgLnN0cmluZygpXG4gICAgICAucmVnZXgoXG4gICAgICAgIC9eKFswLTlhLWZBLUZdezEsNH06KXs3fVswLTlhLWZBLUZdezEsNH0kfF46OiR8Xjo6MSR8XihbMC05YS1mQS1GXXsxLDR9Oil7MSw3fTokLyxcbiAgICAgICAgbWVzc2FnZSB8fCAnTXVzdCBiZSBhIHZhbGlkIElQdjYgYWRkcmVzcydcbiAgICAgICksXG5cbiAgbWFjQWRkcmVzczogKHsgbWVzc2FnZSB9OiB7IG1lc3NhZ2U/OiBzdHJpbmcgfSA9IHt9KSA9PlxuICAgIHpcbiAgICAgIC5zdHJpbmcoKVxuICAgICAgLnJlZ2V4KFxuICAgICAgICAvXihbMC05QS1GYS1mXXsyfVs6LV0pezV9KFswLTlBLUZhLWZdezJ9KSQvLFxuICAgICAgICBtZXNzYWdlIHx8ICdNdXN0IGJlIGEgdmFsaWQgTUFDIGFkZHJlc3MnXG4gICAgICApLFxuXG4gIGFsbG93ZWRGaWxlRXh0ZW5zaW9uOiAoe1xuICAgIG1lc3NhZ2UsXG4gICAgYWxsb3dlZEV4dGVuc2lvbnMsXG4gIH06IHsgbWVzc2FnZT86IHN0cmluZzsgYWxsb3dlZEV4dGVuc2lvbnM/OiBzdHJpbmdbXSB9ID0ge30pID0+XG4gICAgei5zdHJpbmcoKS5yZWZpbmUoXG4gICAgICBmaWxlTmFtZSA9PiB7XG4gICAgICAgIGlmICghZmlsZU5hbWUpIHJldHVybiB0cnVlO1xuICAgICAgICBjb25zdCBleHRlbnNpb24gPSBmaWxlTmFtZS5zcGxpdCgnLicpLnBvcCgpPy50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBjb25zdCBsb3dlckFsbG93ZWQgPSBhbGxvd2VkRXh0ZW5zaW9ucz8ubWFwKGV4dCA9PlxuICAgICAgICAgIGV4dC50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoJy4nKVxuICAgICAgICAgICAgPyBleHQudG9Mb3dlckNhc2UoKVxuICAgICAgICAgICAgOiBgLiR7ZXh0LnRvTG93ZXJDYXNlKCl9YFxuICAgICAgICApO1xuXG4gICAgICAgIHJldHVybiBleHRlbnNpb24gJiYgbG93ZXJBbGxvd2VkPy5pbmNsdWRlcyhgLiR7ZXh0ZW5zaW9ufWApO1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbWVzc2FnZTpcbiAgICAgICAgICBtZXNzYWdlIHx8XG4gICAgICAgICAgYE11c3QgaGF2ZSBvbmUgb2YgdGhlIGZvbGxvd2luZyBleHRlbnNpb25zOiAke2FsbG93ZWRFeHRlbnNpb25zPy5qb2luKCcsICcpfWAsXG4gICAgICB9XG4gICAgKSxcblxuICB2YWxpZEltYWdlRXh0ZW5zaW9uOiAoeyBtZXNzYWdlIH06IHsgbWVzc2FnZT86IHN0cmluZyB9ID0ge30pID0+XG4gICAgc2NoZW1hVG9vbHMuYWxsb3dlZEZpbGVFeHRlbnNpb24oe1xuICAgICAgYWxsb3dlZEV4dGVuc2lvbnM6IFsnLmpwZycsICcuanBlZycsICcucG5nJywgJy5naWYnLCAnLmJtcCcsICcud2VicCddLFxuICAgICAgbWVzc2FnZTpcbiAgICAgICAgbWVzc2FnZSB8fFxuICAgICAgICAnTXVzdCBoYXZlIGEgdmFsaWQgaW1hZ2UgZXh0ZW5zaW9uICguanBnLCAuanBlZywgLnBuZywgLmdpZiwgLmJtcCwgLndlYnApJyxcbiAgICB9KSxcblxuICB2YWxpZERvY3VtZW50RXh0ZW5zaW9uOiAoeyBtZXNzYWdlIH06IHsgbWVzc2FnZT86IHN0cmluZyB9ID0ge30pID0+XG4gICAgc2NoZW1hVG9vbHMuYWxsb3dlZEZpbGVFeHRlbnNpb24oe1xuICAgICAgYWxsb3dlZEV4dGVuc2lvbnM6IFsnLnBkZicsICcuZG9jJywgJy5kb2N4JywgJy54bHMnLCAnLnhsc3gnLCAnLnR4dCddLFxuICAgICAgbWVzc2FnZTpcbiAgICAgICAgbWVzc2FnZSB8fFxuICAgICAgICAnTXVzdCBoYXZlIGEgdmFsaWQgZG9jdW1lbnQgZXh0ZW5zaW9uICgucGRmLCAuZG9jLCAuZG9jeCwgLnhscywgLnhsc3gsIC50eHQpJyxcbiAgICB9KSxcblxuICBwYW5DYXJkOiAoeyBtZXNzYWdlIH06IHsgbWVzc2FnZT86IHN0cmluZyB9ID0ge30pID0+XG4gICAgelxuICAgICAgLnN0cmluZygpXG4gICAgICAucmVnZXgoXG4gICAgICAgIC9eW0EtWl17NX1bMC05XXs0fVtBLVpdezF9JC8sXG4gICAgICAgIG1lc3NhZ2UgfHwgJ011c3QgYmUgYSB2YWxpZCBQQU4gY2FyZCBudW1iZXInXG4gICAgICApLFxuXG4gIGFhZGhhYXI6ICh7IG1lc3NhZ2UgfTogeyBtZXNzYWdlPzogc3RyaW5nIH0gPSB7fSkgPT5cbiAgICB6XG4gICAgICAuc3RyaW5nKClcbiAgICAgIC5yZWdleChcbiAgICAgICAgL15bMi05XXsxfVswLTldezExfSQvLFxuICAgICAgICBtZXNzYWdlIHx8ICdNdXN0IGJlIGEgdmFsaWQgQWFkaGFhciBudW1iZXInXG4gICAgICApLFxuXG4gIGdzdGluOiAoeyBtZXNzYWdlIH06IHsgbWVzc2FnZT86IHN0cmluZyB9ID0ge30pID0+XG4gICAgelxuICAgICAgLnN0cmluZygpXG4gICAgICAucmVnZXgoXG4gICAgICAgIC9eWzAtOV17Mn1bQS1aXXs1fVswLTldezR9W0EtWl17MX1bMS05QS1aXXsxfVpbMC05QS1aXXsxfSQvLFxuICAgICAgICBtZXNzYWdlIHx8ICdNdXN0IGJlIGEgdmFsaWQgR1NUSU4nXG4gICAgICApLFxuXG4gIGlmc2M6ICh7IG1lc3NhZ2UgfTogeyBtZXNzYWdlPzogc3RyaW5nIH0gPSB7fSkgPT5cbiAgICB6XG4gICAgICAuc3RyaW5nKClcbiAgICAgIC5yZWdleCgvXltBLVpdezR9MFtBLVowLTldezZ9JC8sIG1lc3NhZ2UgfHwgJ011c3QgYmUgYSB2YWxpZCBJRlNDIGNvZGUnKSxcblxuICBhbHBoYW51bWVyaWM6ICh7IG1lc3NhZ2UgfTogeyBtZXNzYWdlPzogc3RyaW5nIH0gPSB7fSkgPT5cbiAgICB6XG4gICAgICAuc3RyaW5nKClcbiAgICAgIC5yZWdleChcbiAgICAgICAgL15bYS16QS1aMC05XSskLyxcbiAgICAgICAgbWVzc2FnZSB8fCAnT25seSBsZXR0ZXJzIGFuZCBudW1iZXJzIGFyZSBhbGxvd2VkJ1xuICAgICAgKSxcblxuICBzbHVnOiAoeyBtZXNzYWdlIH06IHsgbWVzc2FnZT86IHN0cmluZyB9ID0ge30pID0+XG4gICAgelxuICAgICAgLnN0cmluZygpXG4gICAgICAucmVnZXgoL15bYS16MC05XSsoPzotW2EtejAtOV0rKSokLywgbWVzc2FnZSB8fCAnSW52YWxpZCBzbHVnIGZvcm1hdCcpLFxuXG4gIC8vIE51bWJlciB2YWxpZGF0aW9uc1xuICBwb3NpdGl2ZU51bWJlcjogKHtcbiAgICBtZXNzYWdlLFxuICAgIG1pbixcbiAgICBtYXgsXG4gIH06IHsgbWVzc2FnZT86IHN0cmluZzsgbWluPzogbnVtYmVyOyBtYXg/OiBudW1iZXIgfSA9IHt9KSA9PlxuICAgIHpcbiAgICAgIC5udW1iZXIoKVxuICAgICAgLnBvc2l0aXZlKG1lc3NhZ2UgfHwgJ051bWJlciBtdXN0IGJlIHBvc2l0aXZlJylcbiAgICAgIC5taW4obWluIHx8IDAuMDEsIGBOdW1iZXIgbXVzdCBiZSBhdCBsZWFzdCAke21pbiB8fCAwLjAxfWApXG4gICAgICAubWF4KFxuICAgICAgICBtYXggfHwgTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIsXG4gICAgICAgIGBOdW1iZXIgbXVzdCBiZSBhdCBtb3N0ICR7bWF4IHx8IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSfWBcbiAgICAgICksXG5cbiAgbWF4RGVjaW1hbFBsYWNlczogKHtcbiAgICBtZXNzYWdlLFxuICAgIG1heFBsYWNlcyxcbiAgfTogeyBtZXNzYWdlPzogc3RyaW5nOyBtYXhQbGFjZXM/OiBudW1iZXIgfSA9IHt9KSA9PlxuICAgIHoubnVtYmVyKCkucmVmaW5lKFxuICAgICAgdmFsdWUgPT4ge1xuICAgICAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRydWU7XG4gICAgICAgIGNvbnN0IGRlY2ltYWxQYXJ0ID0gdmFsdWUudG9TdHJpbmcoKS5zcGxpdCgnLicpWzFdO1xuXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgIWRlY2ltYWxQYXJ0IHx8XG4gICAgICAgICAgZGVjaW1hbFBhcnQubGVuZ3RoIDw9ICh0eXBlb2YgbWF4UGxhY2VzID09PSAnbnVtYmVyJyA/IG1heFBsYWNlcyA6IDApXG4gICAgICAgICk7XG4gICAgICB9LFxuICAgICAgeyBtZXNzYWdlOiBtZXNzYWdlIHx8IGBNdXN0IGhhdmUgYXQgbW9zdCAke21heFBsYWNlc30gZGVjaW1hbCBwbGFjZXNgIH1cbiAgICApLFxuXG4gIGN1cnJlbmN5OiAoeyBtZXNzYWdlIH06IHsgbWVzc2FnZT86IHN0cmluZyB9ID0ge30pID0+XG4gICAgelxuICAgICAgLm51bWJlcigpXG4gICAgICAubWluKDAsIG1lc3NhZ2UgfHwgJ011c3QgYmUgYSB2YWxpZCBjdXJyZW5jeSBhbW91bnQgKHBvc2l0aXZlKScpXG4gICAgICAucmVmaW5lKFxuICAgICAgICB2YWx1ZSA9PiB7XG4gICAgICAgICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybiB0cnVlO1xuICAgICAgICAgIGNvbnN0IGRlY2ltYWxQYXJ0ID0gdmFsdWUudG9TdHJpbmcoKS5zcGxpdCgnLicpWzFdO1xuXG4gICAgICAgICAgcmV0dXJuICFkZWNpbWFsUGFydCB8fCBkZWNpbWFsUGFydC5sZW5ndGggPD0gMjtcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG1lc3NhZ2U6XG4gICAgICAgICAgICBtZXNzYWdlIHx8ICdNdXN0IGJlIGEgdmFsaWQgY3VycmVuY3kgYW1vdW50IChtYXggMiBkZWNpbWFsIHBsYWNlcyknLFxuICAgICAgICB9XG4gICAgICApLFxuXG4gIHZhbGlkQWdlOiAoeyBtZXNzYWdlIH06IHsgbWVzc2FnZT86IHN0cmluZyB9ID0ge30pID0+XG4gICAgelxuICAgICAgLm51bWJlcigpXG4gICAgICAuaW50KCdNdXN0IGJlIGFuIGludGVnZXInKVxuICAgICAgLm1pbigwLCBtZXNzYWdlIHx8ICdNdXN0IGJlIGEgdmFsaWQgYWdlIChiZXR3ZWVuIDAgYW5kIDE1MCknKVxuICAgICAgLm1heCgxNTAsIG1lc3NhZ2UgfHwgJ011c3QgYmUgYSB2YWxpZCBhZ2UgKGJldHdlZW4gMCBhbmQgMTUwKScpLFxuXG4gIG5vbk5lZ2F0aXZlTnVtYmVyOiAoe1xuICAgIG1lc3NhZ2UsXG4gICAgbWF4LFxuICB9OiB7IG1lc3NhZ2U/OiBzdHJpbmc7IG1heD86IG51bWJlciB9ID0ge30pID0+XG4gICAgelxuICAgICAgLm51bWJlcigpXG4gICAgICAubWluKDAsIG1lc3NhZ2UgfHwgJ051bWJlciBtdXN0IGJlIG5vbi1uZWdhdGl2ZScpXG4gICAgICAubWF4KFxuICAgICAgICBtYXggfHwgTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIsXG4gICAgICAgIGBOdW1iZXIgbXVzdCBiZSBhdCBtb3N0ICR7bWF4IHx8IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSfWBcbiAgICAgICksXG5cbiAgaW50ZWdlcjogKHtcbiAgICBtZXNzYWdlLFxuICAgIG1pbixcbiAgICBtYXgsXG4gIH06IHsgbWVzc2FnZT86IHN0cmluZzsgbWluPzogbnVtYmVyOyBtYXg/OiBudW1iZXIgfSA9IHt9KSA9PlxuICAgIHpcbiAgICAgIC5udW1iZXIoKVxuICAgICAgLmludChtZXNzYWdlIHx8ICdNdXN0IGJlIGFuIGludGVnZXInKVxuICAgICAgLm1pbihcbiAgICAgICAgbWluIHx8IE51bWJlci5NSU5fU0FGRV9JTlRFR0VSLFxuICAgICAgICBgTnVtYmVyIG11c3QgYmUgYXQgbGVhc3QgJHttaW4gfHwgTnVtYmVyLk1JTl9TQUZFX0lOVEVHRVJ9YFxuICAgICAgKVxuICAgICAgLm1heChcbiAgICAgICAgbWF4IHx8IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSLFxuICAgICAgICBgTnVtYmVyIG11c3QgYmUgYXQgbW9zdCAke21heCB8fCBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUn1gXG4gICAgICApLFxuXG4gIHBlcmNlbnRhZ2U6ICh7IG1lc3NhZ2UgfTogeyBtZXNzYWdlPzogc3RyaW5nIH0gPSB7fSkgPT5cbiAgICB6XG4gICAgICAubnVtYmVyKClcbiAgICAgIC5taW4oMCwgbWVzc2FnZSB8fCAnUGVyY2VudGFnZSBtdXN0IGJlIGJldHdlZW4gMCBhbmQgMTAwJylcbiAgICAgIC5tYXgoMTAwLCBtZXNzYWdlIHx8ICdQZXJjZW50YWdlIG11c3QgYmUgYmV0d2VlbiAwIGFuZCAxMDAnKSxcblxuICAvLyBBcnJheSB2YWxpZGF0aW9uc1xuICBub25FbXB0eUFycmF5OiA8VD4oXG4gICAgc2NoZW1hOiB6LlpvZFNjaGVtYTxUPixcbiAgICB7IG1lc3NhZ2UgfTogeyBtZXNzYWdlPzogc3RyaW5nIH0gPSB7fVxuICApID0+IHouYXJyYXkoc2NoZW1hKS5taW4oMSwgbWVzc2FnZSB8fCAnQXQgbGVhc3Qgb25lIGl0ZW0gaXMgcmVxdWlyZWQnKSxcblxuICB1bmlxdWVBcnJheTogPFQ+KFxuICAgIHNjaGVtYTogei5ab2RTY2hlbWE8VD4sXG4gICAgeyBtZXNzYWdlIH06IHsgbWVzc2FnZT86IHN0cmluZyB9ID0ge31cbiAgKSA9PlxuICAgIHouYXJyYXkoc2NoZW1hKS5yZWZpbmUoaXRlbXMgPT4gbmV3IFNldChpdGVtcykuc2l6ZSA9PT0gaXRlbXMubGVuZ3RoLCB7XG4gICAgICBtZXNzYWdlOiBtZXNzYWdlIHx8ICdBbGwgaXRlbXMgbXVzdCBiZSB1bmlxdWUnLFxuICAgIH0pLFxuXG4gIG5vTnVsbEFycmF5SXRlbXM6IDxUPihcbiAgICBzY2hlbWE6IHouWm9kU2NoZW1hPFQ+LFxuICAgIHsgbWVzc2FnZSB9OiB7IG1lc3NhZ2U/OiBzdHJpbmcgfSA9IHt9XG4gICkgPT5cbiAgICB6XG4gICAgICAuYXJyYXkoc2NoZW1hLm51bGxhYmxlKCkpXG4gICAgICAucmVmaW5lKGl0ZW1zID0+IGl0ZW1zLmV2ZXJ5KGl0ZW0gPT4gaXRlbSAhPT0gbnVsbCksIHtcbiAgICAgICAgbWVzc2FnZTogbWVzc2FnZSB8fCAnTXVzdCBub3QgY29udGFpbiBudWxsIGl0ZW1zJyxcbiAgICAgIH0pLFxuXG4gIC8vIEJvb2xlYW4gdmFsaWRhdGlvbnNcbiAgcmVxdWlyZWRCb29sZWFuOiAoeyBtZXNzYWdlIH06IHsgbWVzc2FnZT86IHN0cmluZyB9ID0ge30pID0+XG4gICAgei5ib29sZWFuKHtcbiAgICAgIG1lc3NhZ2U6IG1lc3NhZ2UgfHwgJ1RoaXMgZmllbGQgaXMgcmVxdWlyZWQnLFxuICAgIH0pLFxuXG4gIC8vIE9iamVjdCB2YWxpZGF0aW9uc1xuICBub25FbXB0eU9iamVjdDogPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oXG4gICAgc2NoZW1hOiB6LlpvZFNjaGVtYTxUPixcbiAgICB7IG1lc3NhZ2UgfTogeyBtZXNzYWdlPzogc3RyaW5nIH0gPSB7fVxuICApID0+XG4gICAgc2NoZW1hLnJlZmluZShvYmogPT4gT2JqZWN0LmtleXMob2JqKS5sZW5ndGggPiAwLCB7XG4gICAgICBtZXNzYWdlOiBtZXNzYWdlIHx8ICdPYmplY3QgY2Fubm90IGJlIGVtcHR5JyxcbiAgICB9KSxcblxuICAvLyBGaWxlIHZhbGlkYXRpb25zXG4gIHJlcXVpcmVkRmlsZTogKHsgbWVzc2FnZSB9OiB7IG1lc3NhZ2U/OiBzdHJpbmcgfSA9IHt9KSA9PlxuICAgIHpcbiAgICAgIC5pbnN0YW5jZW9mKEZpbGUsIHsgbWVzc2FnZTogbWVzc2FnZSB8fCAnRmlsZSBpcyByZXF1aXJlZCcgfSlcbiAgICAgIC5yZWZpbmUoZmlsZSA9PiBmaWxlLnNpemUgPiAwLCB7XG4gICAgICAgIG1lc3NhZ2U6IG1lc3NhZ2UgfHwgJ0ZpbGUgY2Fubm90IGJlIGVtcHR5JyxcbiAgICAgIH0pLFxuXG4gIGZpbGVTaXplOiAoeyBtYXhTaXplLCBtZXNzYWdlIH06IHsgbWF4U2l6ZTogbnVtYmVyOyBtZXNzYWdlPzogc3RyaW5nIH0pID0+XG4gICAgei5pbnN0YW5jZW9mKEZpbGUpLnJlZmluZShmaWxlID0+IGZpbGUuc2l6ZSA8PSBtYXhTaXplLCB7XG4gICAgICBtZXNzYWdlOlxuICAgICAgICBtZXNzYWdlIHx8XG4gICAgICAgIGBGaWxlIHNpemUgbXVzdCBiZSBsZXNzIHRoYW4gJHtNYXRoLnJvdW5kKG1heFNpemUgLyAxMDI0IC8gMTAyNCl9TUJgLFxuICAgIH0pLFxuXG4gIGZpbGVUeXBlOiAoe1xuICAgIGFsbG93ZWRUeXBlcyxcbiAgICBtZXNzYWdlLFxuICB9OiB7XG4gICAgYWxsb3dlZFR5cGVzOiBzdHJpbmdbXTtcbiAgICBtZXNzYWdlPzogc3RyaW5nO1xuICB9KSA9PlxuICAgIHouaW5zdGFuY2VvZihGaWxlKS5yZWZpbmUoZmlsZSA9PiBhbGxvd2VkVHlwZXMuaW5jbHVkZXMoZmlsZS50eXBlKSwge1xuICAgICAgbWVzc2FnZTpcbiAgICAgICAgbWVzc2FnZSB8fCBgRmlsZSB0eXBlIG11c3QgYmUgb25lIG9mOiAke2FsbG93ZWRUeXBlcy5qb2luKCcsICcpfWAsXG4gICAgfSksXG5cbiAgLy8gQ3VzdG9tIHZhbGlkYXRvcnNcbiAgY29uZGl0aW9uYWw6IDxULCBVPihcbiAgICBjb25kaXRpb246IChkYXRhOiBUKSA9PiBib29sZWFuLFxuICAgIHRydWVTY2hlbWE6IHouWm9kU2NoZW1hPFU+LFxuICAgIGZhbHNlU2NoZW1hOiB6LlpvZFNjaGVtYTxVPlxuICApID0+XG4gICAgei51bmlvbihbdHJ1ZVNjaGVtYSwgZmFsc2VTY2hlbWFdKS5zdXBlclJlZmluZSgoZGF0YSwgY3R4KSA9PiB7XG4gICAgICBjb25zdCBzaG91bGRVc2VUcnVlID0gY29uZGl0aW9uKGRhdGEgYXMgdW5rbm93biBhcyBUKTtcbiAgICAgIGNvbnN0IHNjaGVtYSA9IHNob3VsZFVzZVRydWUgPyB0cnVlU2NoZW1hIDogZmFsc2VTY2hlbWE7XG4gICAgICBjb25zdCByZXN1bHQgPSBzY2hlbWEuc2FmZVBhcnNlKGRhdGEpO1xuXG4gICAgICBpZiAoIXJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgIGN0eC5hZGRJc3N1ZSh7XG4gICAgICAgICAgY29kZTogei5ab2RJc3N1ZUNvZGUuY3VzdG9tLFxuICAgICAgICAgIG1lc3NhZ2U6IHJlc3VsdC5lcnJvci5tZXNzYWdlLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KSxcblxuICB0cmFuc2Zvcm06IHtcbiAgICB0b0xvd2VyQ2FzZTogei5zdHJpbmcoKS50cmFuc2Zvcm0odmFsID0+IHZhbC50b0xvd2VyQ2FzZSgpKSxcbiAgICB0b1VwcGVyQ2FzZTogei5zdHJpbmcoKS50cmFuc2Zvcm0odmFsID0+IHZhbC50b1VwcGVyQ2FzZSgpKSxcbiAgICB0cmltOiB6LnN0cmluZygpLnRyYW5zZm9ybSh2YWwgPT4gdmFsLnRyaW0oKSksXG4gICAgdG9OdW1iZXI6IHouc3RyaW5nKCkudHJhbnNmb3JtKHZhbCA9PiBOdW1iZXIodmFsKSksXG4gICAgdG9Cb29sZWFuOiB6LnN0cmluZygpLnRyYW5zZm9ybSh2YWwgPT4gdmFsID09PSAndHJ1ZScpLFxuICAgIHBhcnNlSnNvbjogPFQ+KHNjaGVtYTogei5ab2RTY2hlbWE8VD4pID0+XG4gICAgICB6LnN0cmluZygpLnRyYW5zZm9ybSgodmFsLCBjdHgpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKHZhbCk7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gc2NoZW1hLnNhZmVQYXJzZShwYXJzZWQpO1xuXG4gICAgICAgICAgaWYgKHJlc3VsdC5zdWNjZXNzKSByZXR1cm4gcmVzdWx0LmRhdGE7XG5cbiAgICAgICAgICBjdHguYWRkSXNzdWUoe1xuICAgICAgICAgICAgY29kZTogei5ab2RJc3N1ZUNvZGUuY3VzdG9tLFxuICAgICAgICAgICAgbWVzc2FnZTogcmVzdWx0LmVycm9yLm1lc3NhZ2UsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICByZXR1cm4gei5ORVZFUjtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgY3R4LmFkZElzc3VlKHtcbiAgICAgICAgICAgIGNvZGU6IHouWm9kSXNzdWVDb2RlLmN1c3RvbSxcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdJbnZhbGlkIEpTT04nLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgcmV0dXJuIHouTkVWRVI7XG4gICAgICAgIH1cbiAgICAgIH0pLFxuICB9LFxufTtcbiIsICIvKipcbiAqIFR5cGUgZ3VhcmQgdXRpbGl0aWVzIGZvciBydW50aW1lIHR5cGUgY2hlY2tpbmdcbiAqIFxuICogQHBhY2thZ2VEb2N1bWVudGF0aW9uXG4gKi9cblxuLyoqXG4gKiBUeXBlIGd1YXJkIHRvIGNoZWNrIGlmIGEgdmFsdWUgaXMgYSBub24tbnVsbCBvYmplY3QgKGV4Y2x1ZGluZyBhcnJheXMpXG4gKiBcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBjaGVja1xuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgdmFsdWUgaXMgYSBwbGFpbiBvYmplY3RcbiAqIFxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGlmIChpc1JlY29yZCh2YWx1ZSkpIHtcbiAqICAgLy8gdmFsdWUgaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAqICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHZhbHVlKTtcbiAqIH1cbiAqIGBgYFxuICogXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1JlY29yZCh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpO1xufVxuXG4vKipcbiAqIFR5cGUgZ3VhcmQgdG8gY2hlY2sgaWYgYW4gb2JqZWN0IGhhcyBhIHNwZWNpZmljIHByb3BlcnR5XG4gKiBcbiAqIEBwYXJhbSBvYmogLSBUaGUgb2JqZWN0IHRvIGNoZWNrXG4gKiBAcGFyYW0ga2V5IC0gVGhlIHByb3BlcnR5IGtleSB0byBsb29rIGZvclxuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgb2JqZWN0IGhhcyB0aGUgcHJvcGVydHlcbiAqIFxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGlmIChoYXNQcm9wZXJ0eShvYmosICduYW1lJykpIHtcbiAqICAgLy8gb2JqIGlzIFJlY29yZDwnbmFtZScsIHVua25vd24+XG4gKiAgIGNvbnNvbGUubG9nKG9iai5uYW1lKTtcbiAqIH1cbiAqIGBgYFxuICogXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNQcm9wZXJ0eTxLIGV4dGVuZHMgUHJvcGVydHlLZXk+KFxuICBvYmo6IHVua25vd24sXG4gIGtleTogS1xuKTogb2JqIGlzIFJlY29yZDxLLCB1bmtub3duPiB7XG4gIHJldHVybiBpc1JlY29yZChvYmopICYmIGtleSBpbiBvYmo7XG59XG5cbi8qKlxuICogVHlwZSBndWFyZCB0byBjaGVjayBpZiBhIHZhbHVlIGlzIGEgbm9uLWVtcHR5IHN0cmluZ1xuICogXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gY2hlY2tcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIHZhbHVlIGlzIGEgbm9uLWVtcHR5IHN0cmluZ1xuICogXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaWYgKGlzTm9uRW1wdHlTdHJpbmcodmFsdWUpKSB7XG4gKiAgIC8vIHZhbHVlIGlzIHN0cmluZyB3aXRoIGxlbmd0aCA+IDBcbiAqICAgY29uc29sZS5sb2codmFsdWUudG9VcHBlckNhc2UoKSk7XG4gKiB9XG4gKiBgYGBcbiAqIFxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNOb25FbXB0eVN0cmluZyh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIHN0cmluZyB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIHZhbHVlLmxlbmd0aCA+IDA7XG59XG5cbi8qKlxuICogVHlwZSBndWFyZCB0byBjaGVjayBpZiBhIHZhbHVlIGlzIGEgdmFsaWQgYXJyYXlcbiAqIFxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNoZWNrXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSB2YWx1ZSBpcyBhbiBhcnJheVxuICogXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gKiAgIC8vIHZhbHVlIGlzIHVua25vd25bXVxuICogICB2YWx1ZS5mb3JFYWNoKGl0ZW0gPT4gY29uc29sZS5sb2coaXRlbSkpO1xuICogfVxuICogYGBgXG4gKiBcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQXJyYXk8VCA9IHVua25vd24+KHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgVFtdIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpO1xufVxuXG4vKipcbiAqIFR5cGUgZ3VhcmQgdG8gY2hlY2sgaWYgYSB2YWx1ZSBpcyBhIG5vbi1lbXB0eSBhcnJheVxuICogXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gY2hlY2tcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIHZhbHVlIGlzIGEgbm9uLWVtcHR5IGFycmF5XG4gKiBcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpZiAoaXNOb25FbXB0eUFycmF5KGl0ZW1zKSkge1xuICogICAvLyBpdGVtcyBpcyBbVCwgLi4uVFtdXSAtIGd1YXJhbnRlZWQgdG8gaGF2ZSBhdCBsZWFzdCBvbmUgZWxlbWVudFxuICogICBjb25zdCBmaXJzdCA9IGl0ZW1zWzBdOyAgLy8gU2FmZSBhY2Nlc3NcbiAqIH1cbiAqIGBgYFxuICogXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc05vbkVtcHR5QXJyYXk8VD4odmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBbVCwgLi4uVFtdXSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGggPiAwO1xufVxuXG4vKipcbiAqIFR5cGUgZ3VhcmQgdG8gY2hlY2sgaWYgYSB2YWx1ZSBpcyBhIGZ1bmN0aW9uXG4gKiBcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBjaGVja1xuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgdmFsdWUgaXMgYSBmdW5jdGlvblxuICogXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaWYgKGlzRnVuY3Rpb24oY2FsbGJhY2spKSB7XG4gKiAgIC8vIGNhbGxiYWNrIGlzICguLi5hcmdzOiB1bmtub3duW10pID0+IHVua25vd25cbiAqICAgY2FsbGJhY2soKTtcbiAqIH1cbiAqIGBgYFxuICogXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0Z1bmN0aW9uKFxuICB2YWx1ZTogdW5rbm93blxuKTogdmFsdWUgaXMgKC4uLmFyZ3M6IHJlYWRvbmx5IHVua25vd25bXSkgPT4gdW5rbm93biB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbic7XG59XG5cbi8qKlxuICogVHlwZSBndWFyZCB0byBjaGVjayBpZiBhIHZhbHVlIGlzIGEgc3RyaW5nXG4gKiBcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBjaGVja1xuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgdmFsdWUgaXMgYSBzdHJpbmcgKGluY2x1ZGluZyBlbXB0eSBzdHJpbmcpXG4gKiBcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpZiAoaXNTdHJpbmcodmFsdWUpKSB7XG4gKiAgIC8vIHZhbHVlIGlzIHN0cmluZ1xuICogICBjb25zb2xlLmxvZyh2YWx1ZS5sZW5ndGgpO1xuICogfVxuICogYGBgXG4gKiBcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU3RyaW5nKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgc3RyaW5nIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZyc7XG59XG5cbi8qKlxuICogVHlwZSBndWFyZCB0byBjaGVjayBpZiBhIHZhbHVlIGlzIGEgbnVtYmVyIChleGNsdWRpbmcgTmFOKVxuICogXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gY2hlY2tcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIHZhbHVlIGlzIGEgdmFsaWQgbnVtYmVyXG4gKiBcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpZiAoaXNOdW1iZXIodmFsdWUpKSB7XG4gKiAgIC8vIHZhbHVlIGlzIG51bWJlciAobm90IE5hTilcbiAqICAgY29uc3QgZG91YmxlZCA9IHZhbHVlICogMjtcbiAqIH1cbiAqIGBgYFxuICogXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc051bWJlcih2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIG51bWJlciB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmICFpc05hTih2YWx1ZSk7XG59XG5cbi8qKlxuICogVHlwZSBndWFyZCB0byBjaGVjayBpZiBhIHZhbHVlIGlzIGEgYm9vbGVhblxuICogXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gY2hlY2tcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIHZhbHVlIGlzIGEgYm9vbGVhblxuICogXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaWYgKGlzQm9vbGVhbih2YWx1ZSkpIHtcbiAqICAgLy8gdmFsdWUgaXMgYm9vbGVhblxuICogICBjb25zb2xlLmxvZyghdmFsdWUpO1xuICogfVxuICogYGBgXG4gKiBcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQm9vbGVhbih2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbic7XG59XG5cbi8qKlxuICogVHlwZSBndWFyZCB0byBjaGVjayBpZiBhIHZhbHVlIGlzIG51bGxcbiAqIFxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNoZWNrXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSB2YWx1ZSBpcyBudWxsXG4gKiBcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpZiAoaXNOdWxsKHZhbHVlKSkge1xuICogICAvLyB2YWx1ZSBpcyBudWxsXG4gKiAgIHJldHVybiBkZWZhdWx0VmFsdWU7XG4gKiB9XG4gKiBgYGBcbiAqIFxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNOdWxsKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgbnVsbCB7XG4gIHJldHVybiB2YWx1ZSA9PT0gbnVsbDtcbn1cblxuLyoqXG4gKiBUeXBlIGd1YXJkIHRvIGNoZWNrIGlmIGEgdmFsdWUgaXMgdW5kZWZpbmVkXG4gKiBcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBjaGVja1xuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgdmFsdWUgaXMgdW5kZWZpbmVkXG4gKiBcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpZiAoaXNVbmRlZmluZWQodmFsdWUpKSB7XG4gKiAgIC8vIHZhbHVlIGlzIHVuZGVmaW5lZFxuICogICByZXR1cm4gZGVmYXVsdFZhbHVlO1xuICogfVxuICogYGBgXG4gKiBcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVW5kZWZpbmVkKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogVHlwZSBndWFyZCB0byBjaGVjayBpZiBhIHZhbHVlIGlzIG51bGwgb3IgdW5kZWZpbmVkXG4gKiBcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBjaGVja1xuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgdmFsdWUgaXMgbnVsbGlzaFxuICogXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaWYgKGlzTnVsbGlzaCh2YWx1ZSkpIHtcbiAqICAgLy8gdmFsdWUgaXMgbnVsbCB8IHVuZGVmaW5lZFxuICogICByZXR1cm4gZGVmYXVsdFZhbHVlO1xuICogfVxuICogXG4gKiBpZiAoIWlzTnVsbGlzaCh2YWx1ZSkpIHtcbiAqICAgLy8gdmFsdWUgaXMgTm9uTnVsbGFibGU8dHlwZW9mIHZhbHVlPlxuICogICBjb25zb2xlLmxvZyh2YWx1ZSk7XG4gKiB9XG4gKiBgYGBcbiAqIFxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNOdWxsaXNoKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgbnVsbCB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiB2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFR5cGUgZ3VhcmQgdG8gY2hlY2sgaWYgYSB2YWx1ZSBpcyBkZWZpbmVkIChub3QgbnVsbCBvciB1bmRlZmluZWQpXG4gKiBcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBjaGVja1xuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgdmFsdWUgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gKiBcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBmaWx0ZXJlZCA9IGl0ZW1zLmZpbHRlcihpc0RlZmluZWQpO1xuICogLy8gZmlsdGVyZWQgaGFzIHR5cGU6IE5vbk51bGxhYmxlPFQ+W11cbiAqIGBgYFxuICogXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0RlZmluZWQ8VD4odmFsdWU6IFQpOiB2YWx1ZSBpcyBOb25OdWxsYWJsZTxUPiB7XG4gIHJldHVybiB2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFR5cGUgZ3VhcmQgdG8gY2hlY2sgaWYgYSB2YWx1ZSBpcyBhIERhdGUgb2JqZWN0XG4gKiBcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBjaGVja1xuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgdmFsdWUgaXMgYSBEYXRlXG4gKiBcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpZiAoaXNEYXRlKHZhbHVlKSkge1xuICogICAvLyB2YWx1ZSBpcyBEYXRlXG4gKiAgIGNvbnNvbGUubG9nKHZhbHVlLnRvSVNPU3RyaW5nKCkpO1xuICogfVxuICogYGBgXG4gKiBcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRGF0ZSh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIERhdGUge1xuICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBEYXRlICYmICFpc05hTih2YWx1ZS5nZXRUaW1lKCkpO1xufVxuXG4vKipcbiAqIFR5cGUgZ3VhcmQgdG8gY2hlY2sgaWYgYSB2YWx1ZSBpcyBhIFByb21pc2VcbiAqIFxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNoZWNrXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSB2YWx1ZSBpcyBhIFByb21pc2VcbiAqIFxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGlmIChpc1Byb21pc2UodmFsdWUpKSB7XG4gKiAgIC8vIHZhbHVlIGlzIFByb21pc2U8dW5rbm93bj5cbiAqICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdmFsdWU7XG4gKiB9XG4gKiBgYGBcbiAqIFxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNQcm9taXNlKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUHJvbWlzZTx1bmtub3duPiB7XG4gIHJldHVybiAoXG4gICAgdmFsdWUgaW5zdGFuY2VvZiBQcm9taXNlIHx8XG4gICAgKGlzUmVjb3JkKHZhbHVlKSAmJlxuICAgICAgdHlwZW9mICh2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikudGhlbiA9PT0gJ2Z1bmN0aW9uJylcbiAgKTtcbn1cblxuLyoqXG4gKiBUeXBlIGd1YXJkIHRvIGNoZWNrIGlmIGFuIGVycm9yIGlzIGFuIEVycm9yIGluc3RhbmNlXG4gKiBcbiAqIEBwYXJhbSBlcnJvciAtIFRoZSBlcnJvciB0byBjaGVja1xuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgZXJyb3IgaXMgYW4gRXJyb3IgaW5zdGFuY2VcbiAqIFxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIHRyeSB7XG4gKiAgIC8vIC4uLlxuICogfSBjYXRjaCAoZXJyb3IpIHtcbiAqICAgaWYgKGlzRXJyb3IoZXJyb3IpKSB7XG4gKiAgICAgLy8gZXJyb3IgaXMgRXJyb3JcbiAqICAgICBjb25zb2xlLmVycm9yKGVycm9yLm1lc3NhZ2UpO1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqIFxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNFcnJvcihlcnJvcjogdW5rbm93bik6IGVycm9yIGlzIEVycm9yIHtcbiAgcmV0dXJuIGVycm9yIGluc3RhbmNlb2YgRXJyb3I7XG59XG5cbi8qKlxuICogVHlwZSBndWFyZCB0byBjaGVjayBpZiBhIHZhbHVlIG1hdGNoZXMgYSBzcGVjaWZpYyB0eXBlIHVzaW5nIGEgdmFsaWRhdG9yIGZ1bmN0aW9uXG4gKiBcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBjaGVja1xuICogQHBhcmFtIHZhbGlkYXRvciAtIEZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0cnVlIGlmIHZhbHVlIG1hdGNoZXMgdGhlIHR5cGVcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIHZhbHVlIG1hdGNoZXMgdGhlIHR5cGVcbiAqIFxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGludGVyZmFjZSBVc2VyIHtcbiAqICAgaWQ6IHN0cmluZztcbiAqICAgbmFtZTogc3RyaW5nO1xuICogfVxuICogXG4gKiBjb25zdCBpc1VzZXIgPSAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBVc2VyID0+XG4gKiAgIGlzUmVjb3JkKHZhbHVlKSAmJlxuICogICBoYXNQcm9wZXJ0eSh2YWx1ZSwgJ2lkJykgJiZcbiAqICAgaGFzUHJvcGVydHkodmFsdWUsICduYW1lJykgJiZcbiAqICAgaXNTdHJpbmcodmFsdWUuaWQpICYmXG4gKiAgIGlzU3RyaW5nKHZhbHVlLm5hbWUpO1xuICogXG4gKiBpZiAoaXNVc2VyKGRhdGEpKSB7XG4gKiAgIC8vIGRhdGEgaXMgVXNlclxuICogICBjb25zb2xlLmxvZyhkYXRhLm5hbWUpO1xuICogfVxuICogYGBgXG4gKiBcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hdGNoZXM8VD4oXG4gIHZhbHVlOiB1bmtub3duLFxuICB2YWxpZGF0b3I6ICh2YWx1ZTogdW5rbm93bikgPT4gdmFsdWUgaXMgVFxuKTogdmFsdWUgaXMgVCB7XG4gIHJldHVybiB2YWxpZGF0b3IodmFsdWUpO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjtBQVFBLElBQU0sV0FBVyxDQUFDLFFBQ2hCLE9BQU8sUUFBUSxZQUFZLFFBQVEsUUFBUSxDQUFDLE1BQU0sUUFBUSxHQUFHO0FBVS9ELElBQU0sVUFBVSxDQUFDLFFBQW1DLE1BQU0sUUFBUSxHQUFHO0FBK0Q5RCxJQUFNLG9CQUFvQixDQUFDLEtBQWMsU0FBUyxPQUFnQztBQUN2RixNQUFJLENBQUMsU0FBUyxHQUFHLEdBQUc7QUFDbEIsV0FBTztBQUFBLE1BQ0wsQ0FBQyxNQUFNLEdBQUc7QUFBQSxJQUNaO0FBQUEsRUFDRjtBQUVB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