@robhan-cdk-lib/aws_grafana 0.0.65 → 0.0.67

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,121 @@
1
+ /**
2
+ * Validates the clientToken property.
3
+ *
4
+ * @param token - The client token to validate
5
+ * @returns An array of error messages if validation fails, or an empty array if valid
6
+ *
7
+ * Validation rules:
8
+ * - Must be a string
9
+ * - Must be between 1 and 64 characters long
10
+ * - Must contain only printable ASCII characters
11
+ */
12
+ export declare function validateClientToken(token: unknown): string[];
13
+ /**
14
+ * Validates the description property.
15
+ *
16
+ * @param description - The description to validate
17
+ * @returns An array of error messages if validation fails, or an empty array if valid
18
+ *
19
+ * Validation rules:
20
+ * - Must be a string
21
+ * - Maximum length of 2048 characters
22
+ */
23
+ export declare function validateDescription(description: unknown): string[];
24
+ /**
25
+ * Validates the grafanaVersion property.
26
+ *
27
+ * @param version - The Grafana version to validate
28
+ * @returns An array of error messages if validation fails, or an empty array if valid
29
+ *
30
+ * Validation rules:
31
+ * - Must be a string
32
+ * - Must be between 1 and 255 characters long
33
+ */
34
+ export declare function validateGrafanaVersion(version: unknown): string[];
35
+ /**
36
+ * Validates the name property.
37
+ *
38
+ * @param name - The workspace name to validate
39
+ * @returns An array of error messages if validation fails, or an empty array if valid
40
+ *
41
+ * Validation rules:
42
+ * - Must be a string
43
+ * - Must be between 1 and 255 characters long
44
+ * - Can only contain alphanumeric characters, hyphens, dots, underscores, and tildes
45
+ */
46
+ export declare function validateName(name: unknown): string[];
47
+ /**
48
+ * Validates the networkAccessControl property.
49
+ *
50
+ * @param nac - The network access control configuration to validate
51
+ * @returns An array of error messages if validation fails, or an empty array if valid
52
+ *
53
+ * Validation rules:
54
+ * - Must be an object
55
+ * - prefixLists (if present) must be an array with at most 5 items
56
+ * - vpcEndpoints (if present) must be an array with at most 5 items
57
+ */
58
+ export declare function validateNetworkAccessControl(nac: unknown): string[];
59
+ /**
60
+ * Validates the organizationRoleName property.
61
+ *
62
+ * @param roleName - The organization role name to validate
63
+ * @returns An array of error messages if validation fails, or an empty array if valid
64
+ *
65
+ * Validation rules:
66
+ * - Must be a string
67
+ * - Must be between 1 and 2048 characters long
68
+ */
69
+ export declare function validateOrganizationRoleName(roleName: unknown): string[];
70
+ /**
71
+ * Validates the SAML assertion attributes.
72
+ *
73
+ * @param obj - The SAML assertion attributes to validate
74
+ * @returns An array of error messages if validation fails, or an empty array if valid
75
+ *
76
+ * Validation rules:
77
+ * - Must be an object
78
+ * - Each attribute must be a string
79
+ * - Each attribute must be between 1 and 256 characters long
80
+ * - Valid attribute keys are: 'email', 'groups', 'login', 'name', 'org', 'role'
81
+ */
82
+ export declare function validateSamlAssertionAttributes(obj: unknown): string[];
83
+ /**
84
+ * Validates the SAML IdP metadata.
85
+ *
86
+ * @param obj - The SAML IdP metadata to validate
87
+ * @returns An array of error messages if validation fails, or an empty array if valid
88
+ *
89
+ * Validation rules:
90
+ * - Must be an object
91
+ * - url (if present) must be a string between 1 and 2048 characters long
92
+ * - xml (if present) must be a string
93
+ */
94
+ export declare function validateSamlIdpMetadata(obj: unknown): string[];
95
+ /**
96
+ * Validates the SAML configuration.
97
+ *
98
+ * @param config - The SAML configuration to validate
99
+ * @returns An array of error messages if validation fails, or an empty array if valid
100
+ *
101
+ * Validation rules:
102
+ * - Must be an object
103
+ * - idpMetadata is required and must be valid
104
+ * - assertionAtrributes (if present) must be valid
105
+ * - allowedOrganizations (if present) must be an array of strings with 1-256 elements
106
+ * - loginValidityDuration (if present) must be a positive number
107
+ * - roleValues (if present) must be an object with valid admin and editor arrays
108
+ */
109
+ export declare function validateSamlConfiguration(config: unknown): string[];
110
+ /**
111
+ * Validates the vpcConfiguration property.
112
+ *
113
+ * @param config - The VPC configuration to validate
114
+ * @returns An array of error messages if validation fails, or an empty array if valid
115
+ *
116
+ * Validation rules:
117
+ * - Must be an object
118
+ * - securityGroups is required and must be an array with 1-5 items
119
+ * - subnets is required and must be an array with 2-6 items
120
+ */
121
+ export declare function validateVpcConfiguration(config: unknown): string[];
@@ -0,0 +1,427 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validateClientToken = validateClientToken;
4
+ exports.validateDescription = validateDescription;
5
+ exports.validateGrafanaVersion = validateGrafanaVersion;
6
+ exports.validateName = validateName;
7
+ exports.validateNetworkAccessControl = validateNetworkAccessControl;
8
+ exports.validateOrganizationRoleName = validateOrganizationRoleName;
9
+ exports.validateSamlAssertionAttributes = validateSamlAssertionAttributes;
10
+ exports.validateSamlIdpMetadata = validateSamlIdpMetadata;
11
+ exports.validateSamlConfiguration = validateSamlConfiguration;
12
+ exports.validateVpcConfiguration = validateVpcConfiguration;
13
+ const utils_1 = require("@robhan-cdk-lib/utils");
14
+ /**
15
+ * Validates the clientToken property.
16
+ *
17
+ * @param token - The client token to validate
18
+ * @returns An array of error messages if validation fails, or an empty array if valid
19
+ *
20
+ * Validation rules:
21
+ * - Must be a string
22
+ * - Must be between 1 and 64 characters long
23
+ * - Must contain only printable ASCII characters
24
+ */
25
+ function validateClientToken(token) {
26
+ const errors = [];
27
+ if (typeof token !== 'string') {
28
+ errors.push('must be a string');
29
+ return errors; // No need to check further if not a string
30
+ }
31
+ errors.push(...(0, utils_1.validateStringLength)({
32
+ value: token,
33
+ min: 1,
34
+ max: 64,
35
+ }));
36
+ errors.push(...(0, utils_1.validateRegExp)({
37
+ value: token,
38
+ regExp: /^[!-~]*$/,
39
+ message: 'must contain only printable ASCII characters',
40
+ }));
41
+ return errors;
42
+ }
43
+ /**
44
+ * Validates the description property.
45
+ *
46
+ * @param description - The description to validate
47
+ * @returns An array of error messages if validation fails, or an empty array if valid
48
+ *
49
+ * Validation rules:
50
+ * - Must be a string
51
+ * - Maximum length of 2048 characters
52
+ */
53
+ function validateDescription(description) {
54
+ const errors = [];
55
+ if (typeof description !== 'string') {
56
+ errors.push('must be a string');
57
+ return errors; // No need to check further if not a string
58
+ }
59
+ errors.push(...(0, utils_1.validateStringLength)({
60
+ value: description,
61
+ max: 2048,
62
+ }));
63
+ return errors;
64
+ }
65
+ /**
66
+ * Validates the grafanaVersion property.
67
+ *
68
+ * @param version - The Grafana version to validate
69
+ * @returns An array of error messages if validation fails, or an empty array if valid
70
+ *
71
+ * Validation rules:
72
+ * - Must be a string
73
+ * - Must be between 1 and 255 characters long
74
+ */
75
+ function validateGrafanaVersion(version) {
76
+ const errors = [];
77
+ if (typeof version !== 'string') {
78
+ errors.push('must be a string');
79
+ return errors; // No need to check further if not a string
80
+ }
81
+ errors.push(...(0, utils_1.validateStringLength)({
82
+ value: version,
83
+ min: 1,
84
+ max: 255,
85
+ }));
86
+ return errors;
87
+ }
88
+ /**
89
+ * Validates the name property.
90
+ *
91
+ * @param name - The workspace name to validate
92
+ * @returns An array of error messages if validation fails, or an empty array if valid
93
+ *
94
+ * Validation rules:
95
+ * - Must be a string
96
+ * - Must be between 1 and 255 characters long
97
+ * - Can only contain alphanumeric characters, hyphens, dots, underscores, and tildes
98
+ */
99
+ function validateName(name) {
100
+ const errors = [];
101
+ if (typeof name !== 'string') {
102
+ errors.push('must be a string');
103
+ return errors; // No need to check further if not a string
104
+ }
105
+ errors.push(...(0, utils_1.validateRegExp)({
106
+ value: name,
107
+ regExp: /^[a-zA-Z0-9\-._~]+$/,
108
+ message: 'can only contain alphanumeric characters, hyphens, dots, underscores, and tildes',
109
+ }));
110
+ errors.push(...(0, utils_1.validateStringLength)({
111
+ value: name,
112
+ min: 1,
113
+ max: 255,
114
+ }));
115
+ return errors;
116
+ }
117
+ /**
118
+ * Validates the networkAccessControl property.
119
+ *
120
+ * @param nac - The network access control configuration to validate
121
+ * @returns An array of error messages if validation fails, or an empty array if valid
122
+ *
123
+ * Validation rules:
124
+ * - Must be an object
125
+ * - prefixLists (if present) must be an array with at most 5 items
126
+ * - vpcEndpoints (if present) must be an array with at most 5 items
127
+ */
128
+ function validateNetworkAccessControl(nac) {
129
+ const errors = [];
130
+ if (!nac || typeof nac !== 'object') {
131
+ errors.push('must be an object');
132
+ return errors;
133
+ }
134
+ const networkAccessControl = nac;
135
+ // Check prefixLists if present
136
+ if (networkAccessControl.prefixLists !== undefined) {
137
+ if (!Array.isArray(networkAccessControl.prefixLists)) {
138
+ errors.push('prefixLists must be an array');
139
+ }
140
+ else {
141
+ errors.push(...(0, utils_1.validateArrayLength)({
142
+ value: networkAccessControl.prefixLists,
143
+ max: 5,
144
+ messagePrefix: 'prefixLists ',
145
+ }));
146
+ }
147
+ }
148
+ // Check vpcEndpoints if present
149
+ if (networkAccessControl.vpcEndpoints !== undefined) {
150
+ if (!Array.isArray(networkAccessControl.vpcEndpoints)) {
151
+ errors.push('vpcEndpoints must be an array');
152
+ }
153
+ else {
154
+ errors.push(...(0, utils_1.validateArrayLength)({
155
+ value: networkAccessControl.vpcEndpoints,
156
+ max: 5,
157
+ messagePrefix: 'vpcEndpoints ',
158
+ }));
159
+ }
160
+ }
161
+ return errors;
162
+ }
163
+ /**
164
+ * Validates the organizationRoleName property.
165
+ *
166
+ * @param roleName - The organization role name to validate
167
+ * @returns An array of error messages if validation fails, or an empty array if valid
168
+ *
169
+ * Validation rules:
170
+ * - Must be a string
171
+ * - Must be between 1 and 2048 characters long
172
+ */
173
+ function validateOrganizationRoleName(roleName) {
174
+ const errors = [];
175
+ if (typeof roleName !== 'string') {
176
+ errors.push('must be a string');
177
+ return errors; // No need to check further if not a string
178
+ }
179
+ errors.push(...(0, utils_1.validateStringLength)({
180
+ value: roleName,
181
+ min: 1,
182
+ max: 2048,
183
+ }));
184
+ return errors;
185
+ }
186
+ /**
187
+ * Validates the SAML assertion attributes.
188
+ *
189
+ * @param obj - The SAML assertion attributes to validate
190
+ * @returns An array of error messages if validation fails, or an empty array if valid
191
+ *
192
+ * Validation rules:
193
+ * - Must be an object
194
+ * - Each attribute must be a string
195
+ * - Each attribute must be between 1 and 256 characters long
196
+ * - Valid attribute keys are: 'email', 'groups', 'login', 'name', 'org', 'role'
197
+ */
198
+ function validateSamlAssertionAttributes(obj) {
199
+ const errors = [];
200
+ if (!obj || typeof obj !== 'object') {
201
+ return ['must be an object'];
202
+ }
203
+ const attributes = obj;
204
+ for (const key in attributes) {
205
+ const value = attributes[key];
206
+ if (value === undefined) {
207
+ continue; // Optional properties can be undefined
208
+ }
209
+ if (typeof value !== 'string') {
210
+ errors.push(`Property '${key}' must be a string`);
211
+ }
212
+ else {
213
+ errors.push(...(0, utils_1.validateStringLength)({
214
+ value,
215
+ min: 1,
216
+ max: 256,
217
+ messagePrefix: `Property '${key}' `,
218
+ }));
219
+ }
220
+ }
221
+ return errors;
222
+ }
223
+ /**
224
+ * Validates the SAML IdP metadata.
225
+ *
226
+ * @param obj - The SAML IdP metadata to validate
227
+ * @returns An array of error messages if validation fails, or an empty array if valid
228
+ *
229
+ * Validation rules:
230
+ * - Must be an object
231
+ * - url (if present) must be a string between 1 and 2048 characters long
232
+ * - xml (if present) must be a string
233
+ */
234
+ function validateSamlIdpMetadata(obj) {
235
+ const errors = [];
236
+ if (!obj || typeof obj !== 'object') {
237
+ return ['must be an object'];
238
+ }
239
+ const metadata = obj;
240
+ // Check url property if present
241
+ if (metadata.url !== undefined) {
242
+ if (typeof metadata.url !== 'string') {
243
+ errors.push("Property 'url' must be a string");
244
+ }
245
+ else {
246
+ errors.push(...(0, utils_1.validateStringLength)({
247
+ value: metadata.url,
248
+ min: 1,
249
+ max: 2048,
250
+ messagePrefix: "Property 'url' ",
251
+ }));
252
+ }
253
+ }
254
+ // Check xml property if present
255
+ if (metadata.xml !== undefined && typeof metadata.xml !== 'string') {
256
+ errors.push("Property 'xml' must be a string");
257
+ }
258
+ return errors;
259
+ }
260
+ /**
261
+ * Validates the SAML configuration.
262
+ *
263
+ * @param config - The SAML configuration to validate
264
+ * @returns An array of error messages if validation fails, or an empty array if valid
265
+ *
266
+ * Validation rules:
267
+ * - Must be an object
268
+ * - idpMetadata is required and must be valid
269
+ * - assertionAtrributes (if present) must be valid
270
+ * - allowedOrganizations (if present) must be an array of strings with 1-256 elements
271
+ * - loginValidityDuration (if present) must be a positive number
272
+ * - roleValues (if present) must be an object with valid admin and editor arrays
273
+ */
274
+ function validateSamlConfiguration(config) {
275
+ const errors = [];
276
+ if (!config || typeof config !== 'object') {
277
+ errors.push('must be an object');
278
+ return errors;
279
+ }
280
+ const samlConfig = config;
281
+ // Check idpMetadata (required)
282
+ if (samlConfig.idpMetadata === undefined) {
283
+ errors.push('idpMetadata is required in samlConfiguration');
284
+ }
285
+ else {
286
+ const idpMetadataErrors = validateSamlIdpMetadata(samlConfig.idpMetadata);
287
+ if (idpMetadataErrors.length > 0) {
288
+ errors.push(...idpMetadataErrors.map((err) => `idpMetadata: ${err}`));
289
+ }
290
+ }
291
+ // Check assertionAtrributes if present
292
+ if (samlConfig.assertionAtrributes !== undefined) {
293
+ const attributeErrors = validateSamlAssertionAttributes(samlConfig.assertionAtrributes);
294
+ if (attributeErrors.length > 0) {
295
+ errors.push(...attributeErrors.map((err) => `assertionAtrributes: ${err}`));
296
+ }
297
+ }
298
+ // Check allowedOrganizations if present
299
+ if (samlConfig.allowedOrganizations !== undefined) {
300
+ if (!Array.isArray(samlConfig.allowedOrganizations)) {
301
+ errors.push('allowedOrganizations must be an array');
302
+ }
303
+ else {
304
+ errors.push(...(0, utils_1.validateArrayLength)({
305
+ value: samlConfig.allowedOrganizations,
306
+ min: 1,
307
+ max: 256,
308
+ messagePrefix: 'allowedOrganizations ',
309
+ }));
310
+ for (let i = 0; i < samlConfig.allowedOrganizations.length; i++) {
311
+ const org = samlConfig.allowedOrganizations[i];
312
+ if (typeof org !== 'string') {
313
+ errors.push(`allowedOrganizations[${i}] must be a string`);
314
+ }
315
+ }
316
+ }
317
+ }
318
+ // Check loginValidityDuration if present
319
+ if (samlConfig.loginValidityDuration !== undefined) {
320
+ if (typeof samlConfig.loginValidityDuration !== 'number') {
321
+ errors.push('loginValidityDuration must be a number');
322
+ }
323
+ else {
324
+ errors.push(...(0, utils_1.validateNumberRange)({
325
+ value: samlConfig.loginValidityDuration,
326
+ min: 1,
327
+ messagePrefix: 'loginValidityDuration ',
328
+ }));
329
+ }
330
+ }
331
+ // Check roleValues if present
332
+ if (samlConfig.roleValues !== undefined) {
333
+ if (!samlConfig.roleValues || typeof samlConfig.roleValues !== 'object') {
334
+ errors.push('roleValues must be an object');
335
+ }
336
+ else {
337
+ // Check admin array if present
338
+ if (samlConfig.roleValues.admin !== undefined) {
339
+ if (!Array.isArray(samlConfig.roleValues.admin)) {
340
+ errors.push('roleValues.admin must be an array');
341
+ }
342
+ else {
343
+ for (let i = 0; i < samlConfig.roleValues.admin.length; i++) {
344
+ if (typeof samlConfig.roleValues.admin[i] !== 'string') {
345
+ errors.push(`roleValues.admin[${i}] must be a string`);
346
+ }
347
+ }
348
+ errors.push(...(0, utils_1.validateArrayLength)({
349
+ value: samlConfig.roleValues.admin,
350
+ max: 256,
351
+ messagePrefix: 'roleValues.admin ',
352
+ }));
353
+ }
354
+ }
355
+ // Check editor array if present
356
+ if (samlConfig.roleValues.editor !== undefined) {
357
+ if (!Array.isArray(samlConfig.roleValues.editor)) {
358
+ errors.push('roleValues.editor must be an array');
359
+ }
360
+ else {
361
+ for (let i = 0; i < samlConfig.roleValues.editor.length; i++) {
362
+ if (typeof samlConfig.roleValues.editor[i] !== 'string') {
363
+ errors.push(`roleValues.editor[${i}] must be a string`);
364
+ }
365
+ }
366
+ errors.push(...(0, utils_1.validateArrayLength)({
367
+ value: samlConfig.roleValues.editor,
368
+ max: 256,
369
+ messagePrefix: 'roleValues.editor ',
370
+ }));
371
+ }
372
+ }
373
+ }
374
+ }
375
+ return errors;
376
+ }
377
+ /**
378
+ * Validates the vpcConfiguration property.
379
+ *
380
+ * @param config - The VPC configuration to validate
381
+ * @returns An array of error messages if validation fails, or an empty array if valid
382
+ *
383
+ * Validation rules:
384
+ * - Must be an object
385
+ * - securityGroups is required and must be an array with 1-5 items
386
+ * - subnets is required and must be an array with 2-6 items
387
+ */
388
+ function validateVpcConfiguration(config) {
389
+ const errors = [];
390
+ if (!config || typeof config !== 'object') {
391
+ errors.push('vpcConfiguration must be an object');
392
+ return errors;
393
+ }
394
+ const vpcConfig = config;
395
+ // Check securityGroups (required)
396
+ if (vpcConfig.securityGroups === undefined) {
397
+ errors.push('securityGroups is required in vpcConfiguration');
398
+ }
399
+ else if (!Array.isArray(vpcConfig.securityGroups)) {
400
+ errors.push('securityGroups must be an array');
401
+ }
402
+ else {
403
+ errors.push(...(0, utils_1.validateArrayLength)({
404
+ value: vpcConfig.securityGroups,
405
+ min: 1,
406
+ max: 5,
407
+ messagePrefix: 'securityGroups ',
408
+ }));
409
+ }
410
+ // Check subnets (required)
411
+ if (vpcConfig.subnets === undefined) {
412
+ errors.push('subnets is required in vpcConfiguration');
413
+ }
414
+ else if (!Array.isArray(vpcConfig.subnets)) {
415
+ errors.push('subnets must be an array');
416
+ }
417
+ else {
418
+ errors.push(...(0, utils_1.validateArrayLength)({
419
+ value: vpcConfig.subnets,
420
+ min: 2,
421
+ max: 6,
422
+ messagePrefix: 'subnets ',
423
+ }));
424
+ }
425
+ return errors;
426
+ }
427
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ya3NwYWNlLWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdmFsaWRhdGlvbi93b3Jrc3BhY2UtYmFzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQWNBLGtEQXFCQztBQVlELGtEQWNDO0FBWUQsd0RBZUM7QUFhRCxvQ0FxQkM7QUFhRCxvRUFxQ0M7QUFZRCxvRUFlQztBQWNELDBFQTRCQztBQWFELDBEQTZCQztBQWdCRCw4REEwSEM7QUFhRCw0REEyQ0M7QUE3ZEQsaURBQXVIO0FBR3ZIOzs7Ozs7Ozs7O0dBVUc7QUFDSCxTQUFnQixtQkFBbUIsQ0FBQyxLQUFjO0lBQ2hELE1BQU0sTUFBTSxHQUFhLEVBQUUsQ0FBQztJQUU1QixJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQzlCLE1BQU0sQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUNoQyxPQUFPLE1BQU0sQ0FBQyxDQUFDLDJDQUEyQztJQUM1RCxDQUFDO0lBRUQsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUEsNEJBQW9CLEVBQUM7UUFDbEMsS0FBSyxFQUFFLEtBQUs7UUFDWixHQUFHLEVBQUUsQ0FBQztRQUNOLEdBQUcsRUFBRSxFQUFFO0tBQ1IsQ0FBQyxDQUFDLENBQUM7SUFFSixNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBQSxzQkFBYyxFQUFDO1FBQzVCLEtBQUssRUFBRSxLQUFLO1FBQ1osTUFBTSxFQUFFLFVBQVU7UUFDbEIsT0FBTyxFQUFFLDhDQUE4QztLQUN4RCxDQUFDLENBQUMsQ0FBQztJQUVKLE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRDs7Ozs7Ozs7O0dBU0c7QUFDSCxTQUFnQixtQkFBbUIsQ0FBQyxXQUFvQjtJQUN0RCxNQUFNLE1BQU0sR0FBYSxFQUFFLENBQUM7SUFFNUIsSUFBSSxPQUFPLFdBQVcsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUNwQyxNQUFNLENBQUMsSUFB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QUFPLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDN0MsTUFBTSxDQUFDLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO0lBQzFDLENBQUM7U0FBTSxDQUFDO1FBQ04sTUFBTSxDQUFDLElBQUksQ0FDVCxHQUFHLElBQUEsMkJBQW1CLEVBQUM7WUFDckIsS0FBSyxFQUFFLFNBQVMsQ0FBQyxPQUFPO1lBQ3hCLEdBQUcsRUFBRSxDQUFDO1lBQ04sR0FBRyxFQUFFLENBQUM7WUFDTixhQUFhLEVBQUUsVUFBVTtTQUMxQixDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFFRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdmFsaWRhdGVBcnJheUxlbmd0aCwgdmFsaWRhdGVOdW1iZXJSYW5nZSwgdmFsaWRhdGVSZWdFeHAsIHZhbGlkYXRlU3RyaW5nTGVuZ3RoIH0gZnJvbSAnQHJvYmhhbi1jZGstbGliL3V0aWxzJztcbmltcG9ydCB7IE5ldHdvcmtBY2Nlc3NDb250cm9sLCBTYW1sQ29uZmlndXJhdGlvbiwgVnBjQ29uZmlndXJhdGlvbiB9IGZyb20gJy4uL3dvcmtzcGFjZS1iYXNlJztcblxuLyoqXG4gKiBWYWxpZGF0ZXMgdGhlIGNsaWVudFRva2VuIHByb3BlcnR5LlxuICpcbiAqIEBwYXJhbSB0b2tlbiAtIFRoZSBjbGllbnQgdG9rZW4gdG8gdmFsaWRhdGVcbiAqIEByZXR1cm5zIEFuIGFycmF5IG9mIGVycm9yIG1lc3NhZ2VzIGlmIHZhbGlkYXRpb24gZmFpbHMsIG9yIGFuIGVtcHR5IGFycmF5IGlmIHZhbGlkXG4gKlxuICogVmFsaWRhdGlvbiBydWxlczpcbiAqIC0gTXVzdCBiZSBhIHN0cmluZ1xuICogLSBNdXN0IGJlIGJldHdlZW4gMSBhbmQgNjQgY2hhcmFjdGVycyBsb25nXG4gKiAtIE11c3QgY29udGFpbiBvbmx5IHByaW50YWJsZSBBU0NJSSBjaGFyYWN0ZXJzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUNsaWVudFRva2VuKHRva2VuOiB1bmtub3duKTogc3RyaW5nW10ge1xuICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG5cbiAgaWYgKHR5cGVvZiB0b2tlbiAhPT0gJ3N0cmluZycpIHtcbiAgICBlcnJvcnMucHVzaCgnbXVzdCBiZSBhIHN0cmluZycpO1xuICAgIHJldHVybiBlcnJvcnM7IC8vIE5vIG5lZWQgdG8gY2hlY2sgZnVydGhlciBpZiBub3QgYSBzdHJpbmdcbiAgfVxuXG4gIGVycm9ycy5wdXNoKC4uLnZhbGlkYXRlU3RyaW5nTGVuZ3RoKHtcbiAgICB2YWx1ZTogdG9rZW4sXG4gICAgbWluOiAxLFxuICAgIG1heDogNjQsXG4gIH0pKTtcblxuICBlcnJvcnMucHVzaCguLi52YWxpZGF0ZVJlZ0V4cCh7XG4gICAgdmFsdWU6IHRva2VuLFxuICAgIHJlZ0V4cDogL15bIS1+XSokLyxcbiAgICBtZXNzYWdlOiAnbXVzdCBjb250YWluIG9ubHkgcHJpbnRhYmxlIEFTQ0lJIGNoYXJhY3RlcnMnLFxuICB9KSk7XG5cbiAgcmV0dXJuIGVycm9ycztcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgdGhlIGRlc2NyaXB0aW9uIHByb3BlcnR5LlxuICpcbiAqIEBwYXJhbSBkZXNjcmlwdGlvbiAtIFRoZSBkZXNjcmlwdGlvbiB0byB2YWxpZGF0ZVxuICogQHJldHVybnMgQW4gYXJyYXkgb2YgZXJyb3IgbWVzc2FnZXMgaWYgdmFsaWRhdGlvbiBmYWlscywgb3IgYW4gZW1wdHkgYXJyYXkgaWYgdmFsaWRcbiAqXG4gKiBWYWxpZGF0aW9uIHJ1bGVzOlxuICogLSBNdXN0IGJlIGEgc3RyaW5nXG4gKiAtIE1heGltdW0gbGVuZ3RoIG9mIDIwNDggY2hhcmFjdGVyc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVEZXNjcmlwdGlvbihkZXNjcmlwdGlvbjogdW5rbm93bik6IHN0cmluZ1tdIHtcbiAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGlmICh0eXBlb2YgZGVzY3JpcHRpb24gIT09ICdzdHJpbmcnKSB7XG4gICAgZXJyb3JzLnB1c2goJ211c3QgYmUgYSBzdHJpbmcnKTtcbiAgICByZXR1cm4gZXJyb3JzOyAvLyBObyBuZWVkIHRvIGNoZWNrIGZ1cnRoZXIgaWYgbm90IGEgc3RyaW5nXG4gIH1cblxuICBlcnJvcnMucHVzaCguLi52YWxpZGF0ZVN0cmluZ0xlbmd0aCh7XG4gICAgdmFsdWU6IGRlc2NyaXB0aW9uLFxuICAgIG1heDogMjA0OCxcbiAgfSkpO1xuXG4gIHJldHVybiBlcnJvcnM7XG59XG5cbi8qKlxuICogVmFsaWRhdGVzIHRoZSBncmFmYW5hVmVyc2lvbiBwcm9wZXJ0eS5cbiAqXG4gKiBAcGFyYW0gdmVyc2lvbiAtIFRoZSBHcmFmYW5hIHZlcnNpb24gdG8gdmFsaWRhdGVcbiAqIEByZXR1cm5zIEFuIGFycmF5IG9mIGVycm9yIG1lc3NhZ2VzIGlmIHZhbGlkYXRpb24gZmFpbHMsIG9yIGFuIGVtcHR5IGFycmF5IGlmIHZhbGlkXG4gKlxuICogVmFsaWRhdGlvbiBydWxlczpcbiAqIC0gTXVzdCBiZSBhIHN0cmluZ1xuICogLSBNdXN0IGJlIGJldHdlZW4gMSBhbmQgMjU1IGNoYXJhY3RlcnMgbG9uZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVHcmFmYW5hVmVyc2lvbih2ZXJzaW9uOiB1bmtub3duKTogc3RyaW5nW10ge1xuICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG5cbiAgaWYgKHR5cGVvZiB2ZXJzaW9uICE9PSAnc3RyaW5nJykge1xuICAgIGVycm9ycy5wdXNoKCdtdXN0IGJlIGEgc3RyaW5nJyk7XG4gICAgcmV0dXJuIGVycm9yczsgLy8gTm8gbmVlZCB0byBjaGVjayBmdXJ0aGVyIGlmIG5vdCBhIHN0cmluZ1xuICB9XG5cbiAgZXJyb3JzLnB1c2goLi4udmFsaWRhdGVTdHJpbmdMZW5ndGgoe1xuICAgIHZhbHVlOiB2ZXJzaW9uLFxuICAgIG1pbjogMSxcbiAgICBtYXg6IDI1NSxcbiAgfSkpO1xuXG4gIHJldHVybiBlcnJvcnM7XG59XG5cbi8qKlxuICogVmFsaWRhdGVzIHRoZSBuYW1lIHByb3BlcnR5LlxuICpcbiAqIEBwYXJhbSBuYW1lIC0gVGhlIHdvcmtzcGFjZSBuYW1lIHRvIHZhbGlkYXRlXG4gKiBAcmV0dXJucyBBbiBhcnJheSBvZiBlcnJvciBtZXNzYWdlcyBpZiB2YWxpZGF0aW9uIGZhaWxzLCBvciBhbiBlbXB0eSBhcnJheSBpZiB2YWxpZFxuICpcbiAqIFZhbGlkYXRpb24gcnVsZXM6XG4gKiAtIE11c3QgYmUgYSBzdHJpbmdcbiAqIC0gTXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDI1NSBjaGFyYWN0ZXJzIGxvbmdcbiAqIC0gQ2FuIG9ubHkgY29udGFpbiBhbHBoYW51bWVyaWMgY2hhcmFjdGVycywgaHlwaGVucywgZG90cywgdW5kZXJzY29yZXMsIGFuZCB0aWxkZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlTmFtZShuYW1lOiB1bmtub3duKTogc3RyaW5nW10ge1xuICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG5cbiAgaWYgKHR5cGVvZiBuYW1lICE9PSAnc3RyaW5nJykge1xuICAgIGVycm9ycy5wdXNoKCdtdXN0IGJlIGEgc3RyaW5nJyk7XG4gICAgcmV0dXJuIGVycm9yczsgLy8gTm8gbmVlZCB0byBjaGVjayBmdXJ0aGVyIGlmIG5vdCBhIHN0cmluZ1xuICB9XG5cbiAgZXJyb3JzLnB1c2goLi4udmFsaWRhdGVSZWdFeHAoe1xuICAgIHZhbHVlOiBuYW1lLFxuICAgIHJlZ0V4cDogL15bYS16QS1aMC05XFwtLl9+XSskLyxcbiAgICBtZXNzYWdlOiAnY2FuIG9ubHkgY29udGFpbiBhbHBoYW51bWVyaWMgY2hhcmFjdGVycywgaHlwaGVucywgZG90cywgdW5kZXJzY29yZXMsIGFuZCB0aWxkZXMnLFxuICB9KSk7XG5cbiAgZXJyb3JzLnB1c2goLi4udmFsaWRhdGVTdHJpbmdMZW5ndGgoe1xuICAgIHZhbHVlOiBuYW1lLFxuICAgIG1pbjogMSxcbiAgICBtYXg6IDI1NSxcbiAgfSkpO1xuXG4gIHJldHVybiBlcnJvcnM7XG59XG5cbi8qKlxuICogVmFsaWRhdGVzIHRoZSBuZXR3b3JrQWNjZXNzQ29udHJvbCBwcm9wZXJ0eS5cbiAqXG4gKiBAcGFyYW0gbmFjIC0gVGhlIG5ldHdvcmsgYWNjZXNzIGNvbnRyb2wgY29uZmlndXJhdGlvbiB0byB2YWxpZGF0ZVxuICogQHJldHVybnMgQW4gYXJyYXkgb2YgZXJyb3IgbWVzc2FnZXMgaWYgdmFsaWRhdGlvbiBmYWlscywgb3IgYW4gZW1wdHkgYXJyYXkgaWYgdmFsaWRcbiAqXG4gKiBWYWxpZGF0aW9uIHJ1bGVzOlxuICogLSBNdXN0IGJlIGFuIG9iamVjdFxuICogLSBwcmVmaXhMaXN0cyAoaWYgcHJlc2VudCkgbXVzdCBiZSBhbiBhcnJheSB3aXRoIGF0IG1vc3QgNSBpdGVtc1xuICogLSB2cGNFbmRwb2ludHMgKGlmIHByZXNlbnQpIG11c3QgYmUgYW4gYXJyYXkgd2l0aCBhdCBtb3N0IDUgaXRlbXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlTmV0d29ya0FjY2Vzc0NvbnRyb2wobmFjOiB1bmtub3duKTogc3RyaW5nW10ge1xuICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG5cbiAgaWYgKCFuYWMgfHwgdHlwZW9mIG5hYyAhPT0gJ29iamVjdCcpIHtcbiAgICBlcnJvcnMucHVzaCgnbXVzdCBiZSBhbiBvYmplY3QnKTtcbiAgICByZXR1cm4gZXJyb3JzO1xuICB9XG5cbiAgY29uc3QgbmV0d29ya0FjY2Vzc0NvbnRyb2wgPSBuYWMgYXMgTmV0d29ya0FjY2Vzc0NvbnRyb2w7XG5cbiAgLy8gQ2hlY2sgcHJlZml4TGlzdHMgaWYgcHJlc2VudFxuICBpZiAobmV0d29ya0FjY2Vzc0NvbnRyb2wucHJlZml4TGlzdHMgIT09IHVuZGVmaW5lZCkge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShuZXR3b3JrQWNjZXNzQ29udHJvbC5wcmVmaXhMaXN0cykpIHtcbiAgICAgIGVycm9ycy5wdXNoKCdwcmVmaXhMaXN0cyBtdXN0IGJlIGFuIGFycmF5Jyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVycm9ycy5wdXNoKC4uLnZhbGlkYXRlQXJyYXlMZW5ndGgoe1xuICAgICAgICB2YWx1ZTogbmV0d29ya0FjY2Vzc0NvbnRyb2wucHJlZml4TGlzdHMsXG4gICAgICAgIG1heDogNSxcbiAgICAgICAgbWVzc2FnZVByZWZpeDogJ3ByZWZpeExpc3RzICcsXG4gICAgICB9KSk7XG4gICAgfVxuICB9XG5cbiAgLy8gQ2hlY2sgdnBjRW5kcG9pbnRzIGlmIHByZXNlbnRcbiAgaWYgKG5ldHdvcmtBY2Nlc3NDb250cm9sLnZwY0VuZHBvaW50cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KG5ldHdvcmtBY2Nlc3NDb250cm9sLnZwY0VuZHBvaW50cykpIHtcbiAgICAgIGVycm9ycy5wdXNoKCd2cGNFbmRwb2ludHMgbXVzdCBiZSBhbiBhcnJheScpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlcnJvcnMucHVzaCguLi52YWxpZGF0ZUFycmF5TGVuZ3RoKHtcbiAgICAgICAgdmFsdWU6IG5ldHdvcmtBY2Nlc3NDb250cm9sLnZwY0VuZHBvaW50cyxcbiAgICAgICAgbWF4OiA1LFxuICAgICAgICBtZXNzYWdlUHJlZml4OiAndnBjRW5kcG9pbnRzICcsXG4gICAgICB9KSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGVycm9ycztcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgdGhlIG9yZ2FuaXphdGlvblJvbGVOYW1lIHByb3BlcnR5LlxuICpcbiAqIEBwYXJhbSByb2xlTmFtZSAtIFRoZSBvcmdhbml6YXRpb24gcm9sZSBuYW1lIHRvIHZhbGlkYXRlXG4gKiBAcmV0dXJucyBBbiBhcnJheSBvZiBlcnJvciBtZXNzYWdlcyBpZiB2YWxpZGF0aW9uIGZhaWxzLCBvciBhbiBlbXB0eSBhcnJheSBpZiB2YWxpZFxuICpcbiAqIFZhbGlkYXRpb24gcnVsZXM6XG4gKiAtIE11c3QgYmUgYSBzdHJpbmdcbiAqIC0gTXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDIwNDggY2hhcmFjdGVycyBsb25nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZU9yZ2FuaXphdGlvblJvbGVOYW1lKHJvbGVOYW1lOiB1bmtub3duKTogc3RyaW5nW10ge1xuICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG5cbiAgaWYgKHR5cGVvZiByb2xlTmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICBlcnJvcnMucHVzaCgnbXVzdCBiZSBhIHN0cmluZycpO1xuICAgIHJldHVybiBlcnJvcnM7IC8vIE5vIG5lZWQgdG8gY2hlY2sgZnVydGhlciBpZiBub3QgYSBzdHJpbmdcbiAgfVxuXG4gIGVycm9ycy5wdXNoKC4uLnZhbGlkYXRlU3RyaW5nTGVuZ3RoKHtcbiAgICB2YWx1ZTogcm9sZU5hbWUsXG4gICAgbWluOiAxLFxuICAgIG1heDogMjA0OCxcbiAgfSkpO1xuXG4gIHJldHVybiBlcnJvcnM7XG59XG5cbi8qKlxuICogVmFsaWRhdGVzIHRoZSBTQU1MIGFzc2VydGlvbiBhdHRyaWJ1dGVzLlxuICpcbiAqIEBwYXJhbSBvYmogLSBUaGUgU0FNTCBhc3NlcnRpb24gYXR0cmlidXRlcyB0byB2YWxpZGF0ZVxuICogQHJldHVybnMgQW4gYXJyYXkgb2YgZXJyb3IgbWVzc2FnZXMgaWYgdmFsaWRhdGlvbiBmYWlscywgb3IgYW4gZW1wdHkgYXJyYXkgaWYgdmFsaWRcbiAqXG4gKiBWYWxpZGF0aW9uIHJ1bGVzOlxuICogLSBNdXN0IGJlIGFuIG9iamVjdFxuICogLSBFYWNoIGF0dHJpYnV0ZSBtdXN0IGJlIGEgc3RyaW5nXG4gKiAtIEVhY2ggYXR0cmlidXRlIG11c3QgYmUgYmV0d2VlbiAxIGFuZCAyNTYgY2hhcmFjdGVycyBsb25nXG4gKiAtIFZhbGlkIGF0dHJpYnV0ZSBrZXlzIGFyZTogJ2VtYWlsJywgJ2dyb3VwcycsICdsb2dpbicsICduYW1lJywgJ29yZycsICdyb2xlJ1xuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVTYW1sQXNzZXJ0aW9uQXR0cmlidXRlcyhvYmo6IHVua25vd24pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGVycm9yczogc3RyaW5nW10gPSBbXTtcblxuICBpZiAoIW9iaiB8fCB0eXBlb2Ygb2JqICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBbJ211c3QgYmUgYW4gb2JqZWN0J107XG4gIH1cblxuICBjb25zdCBhdHRyaWJ1dGVzID0gb2JqIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4gIGZvciAoY29uc3Qga2V5IGluIGF0dHJpYnV0ZXMpIHtcbiAgICBjb25zdCB2YWx1ZSA9IGF0dHJpYnV0ZXNba2V5XTtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29udGludWU7IC8vIE9wdGlvbmFsIHByb3BlcnRpZXMgY2FuIGJlIHVuZGVmaW5lZFxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICBlcnJvcnMucHVzaChgUHJvcGVydHkgJyR7a2V5fScgbXVzdCBiZSBhIHN0cmluZ2ApO1xuICAgIH0gZWxzZSB7XG4gICAgICBlcnJvcnMucHVzaCguLi52YWxpZGF0ZVN0cmluZ0xlbmd0aCh7XG4gICAgICAgIHZhbHVlLFxuICAgICAgICBtaW46IDEsXG4gICAgICAgIG1heDogMjU2LFxuICAgICAgICBtZXNzYWdlUHJlZml4OiBgUHJvcGVydHkgJyR7a2V5fScgYCxcbiAgICAgIH0pKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZXJyb3JzO1xufVxuXG4vKipcbiAqIFZhbGlkYXRlcyB0aGUgU0FNTCBJZFAgbWV0YWRhdGEuXG4gKlxuICogQHBhcmFtIG9iaiAtIFRoZSBTQU1MIElkUCBtZXRhZGF0YSB0byB2YWxpZGF0ZVxuICogQHJldHVybnMgQW4gYXJyYXkgb2YgZXJyb3IgbWVzc2FnZXMgaWYgdmFsaWRhdGlvbiBmYWlscywgb3IgYW4gZW1wdHkgYXJyYXkgaWYgdmFsaWRcbiAqXG4gKiBWYWxpZGF0aW9uIHJ1bGVzOlxuICogLSBNdXN0IGJlIGFuIG9iamVjdFxuICogLSB1cmwgKGlmIHByZXNlbnQpIG11c3QgYmUgYSBzdHJpbmcgYmV0d2VlbiAxIGFuZCAyMDQ4IGNoYXJhY3RlcnMgbG9uZ1xuICogLSB4bWwgKGlmIHByZXNlbnQpIG11c3QgYmUgYSBzdHJpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlU2FtbElkcE1ldGFkYXRhKG9iajogdW5rbm93bik6IHN0cmluZ1tdIHtcbiAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGlmICghb2JqIHx8IHR5cGVvZiBvYmogIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIFsnbXVzdCBiZSBhbiBvYmplY3QnXTtcbiAgfVxuXG4gIGNvbnN0IG1ldGFkYXRhID0gb2JqIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4gIC8vIENoZWNrIHVybCBwcm9wZXJ0eSBpZiBwcmVzZW50XG4gIGlmIChtZXRhZGF0YS51cmwgIT09IHVuZGVmaW5lZCkge1xuICAgIGlmICh0eXBlb2YgbWV0YWRhdGEudXJsICE9PSAnc3RyaW5nJykge1xuICAgICAgZXJyb3JzLnB1c2goXCJQcm9wZXJ0eSAndXJsJyBtdXN0IGJlIGEgc3RyaW5nXCIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlcnJvcnMucHVzaCguLi52YWxpZGF0ZVN0cmluZ0xlbmd0aCh7XG4gICAgICAgIHZhbHVlOiBtZXRhZGF0YS51cmwsXG4gICAgICAgIG1pbjogMSxcbiAgICAgICAgbWF4OiAyMDQ4LFxuICAgICAgICBtZXNzYWdlUHJlZml4OiBcIlByb3BlcnR5ICd1cmwnIFwiLFxuICAgICAgfSkpO1xuICAgIH1cbiAgfVxuXG4gIC8vIENoZWNrIHhtbCBwcm9wZXJ0eSBpZiBwcmVzZW50XG4gIGlmIChtZXRhZGF0YS54bWwgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgbWV0YWRhdGEueG1sICE9PSAnc3RyaW5nJykge1xuICAgIGVycm9ycy5wdXNoKFwiUHJvcGVydHkgJ3htbCcgbXVzdCBiZSBhIHN0cmluZ1wiKTtcbiAgfVxuXG4gIHJldHVybiBlcnJvcnM7XG59XG5cbi8qKlxuICogVmFsaWRhdGVzIHRoZSBTQU1MIGNvbmZpZ3VyYXRpb24uXG4gKlxuICogQHBhcmFtIGNvbmZpZyAtIFRoZSBTQU1MIGNvbmZpZ3VyYXRpb24gdG8gdmFsaWRhdGVcbiAqIEByZXR1cm5zIEFuIGFycmF5IG9mIGVycm9yIG1lc3NhZ2VzIGlmIHZhbGlkYXRpb24gZmFpbHMsIG9yIGFuIGVtcHR5IGFycmF5IGlmIHZhbGlkXG4gKlxuICogVmFsaWRhdGlvbiBydWxlczpcbiAqIC0gTXVzdCBiZSBhbiBvYmplY3RcbiAqIC0gaWRwTWV0YWRhdGEgaXMgcmVxdWlyZWQgYW5kIG11c3QgYmUgdmFsaWRcbiAqIC0gYXNzZXJ0aW9uQXRycmlidXRlcyAoaWYgcHJlc2VudCkgbXVzdCBiZSB2YWxpZFxuICogLSBhbGxvd2VkT3JnYW5pemF0aW9ucyAoaWYgcHJlc2VudCkgbXVzdCBiZSBhbiBhcnJheSBvZiBzdHJpbmdzIHdpdGggMS0yNTYgZWxlbWVudHNcbiAqIC0gbG9naW5WYWxpZGl0eUR1cmF0aW9uIChpZiBwcmVzZW50KSBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyXG4gKiAtIHJvbGVWYWx1ZXMgKGlmIHByZXNlbnQpIG11c3QgYmUgYW4gb2JqZWN0IHdpdGggdmFsaWQgYWRtaW4gYW5kIGVkaXRvciBhcnJheXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlU2FtbENvbmZpZ3VyYXRpb24oY29uZmlnOiB1bmtub3duKTogc3RyaW5nW10ge1xuICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG5cbiAgaWYgKCFjb25maWcgfHwgdHlwZW9mIGNvbmZpZyAhPT0gJ29iamVjdCcpIHtcbiAgICBlcnJvcnMucHVzaCgnbXVzdCBiZSBhbiBvYmplY3QnKTtcbiAgICByZXR1cm4gZXJyb3JzO1xuICB9XG5cbiAgY29uc3Qgc2FtbENvbmZpZyA9IGNvbmZpZyBhcyBTYW1sQ29uZmlndXJhdGlvbjtcblxuICAvLyBDaGVjayBpZHBNZXRhZGF0YSAocmVxdWlyZWQpXG4gIGlmIChzYW1sQ29uZmlnLmlkcE1ldGFkYXRhID09PSB1bmRlZmluZWQpIHtcbiAgICBlcnJvcnMucHVzaCgnaWRwTWV0YWRhdGEgaXMgcmVxdWlyZWQgaW4gc2FtbENvbmZpZ3VyYXRpb24nKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBpZHBNZXRhZGF0YUVycm9ycyA9IHZhbGlkYXRlU2FtbElkcE1ldGFkYXRhKFxuICAgICAgc2FtbENvbmZpZy5pZHBNZXRhZGF0YSxcbiAgICApO1xuICAgIGlmIChpZHBNZXRhZGF0YUVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICBlcnJvcnMucHVzaCguLi5pZHBNZXRhZGF0YUVycm9ycy5tYXAoKGVycikgPT4gYGlkcE1ldGFkYXRhOiAke2Vycn1gKSk7XG4gICAgfVxuICB9XG5cbiAgLy8gQ2hlY2sgYXNzZXJ0aW9uQXRycmlidXRlcyBpZiBwcmVzZW50XG4gIGlmIChzYW1sQ29uZmlnLmFzc2VydGlvbkF0cnJpYnV0ZXMgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IGF0dHJpYnV0ZUVycm9ycyA9IHZhbGlkYXRlU2FtbEFzc2VydGlvbkF0dHJpYnV0ZXMoXG4gICAgICBzYW1sQ29uZmlnLmFzc2VydGlvbkF0cnJpYnV0ZXMsXG4gICAgKTtcbiAgICBpZiAoYXR0cmlidXRlRXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIGVycm9ycy5wdXNoKFxuICAgICAgICAuLi5hdHRyaWJ1dGVFcnJvcnMubWFwKChlcnIpID0+IGBhc3NlcnRpb25BdHJyaWJ1dGVzOiAke2Vycn1gKSxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLy8gQ2hlY2sgYWxsb3dlZE9yZ2FuaXphdGlvbnMgaWYgcHJlc2VudFxuICBpZiAoc2FtbENvbmZpZy5hbGxvd2VkT3JnYW5pemF0aW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHNhbWxDb25maWcuYWxsb3dlZE9yZ2FuaXphdGlvbnMpKSB7XG4gICAgICBlcnJvcnMucHVzaCgnYWxsb3dlZE9yZ2FuaXphdGlvbnMgbXVzdCBiZSBhbiBhcnJheScpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlcnJvcnMucHVzaChcbiAgICAgICAgLi4udmFsaWRhdGVBcnJheUxlbmd0aCh7XG4gICAgICAgICAgdmFsdWU6IHNhbWxDb25maWcuYWxsb3dlZE9yZ2FuaXphdGlvbnMsXG4gICAgICAgICAgbWluOiAxLFxuICAgICAgICAgIG1heDogMjU2LFxuICAgICAgICAgIG1lc3NhZ2VQcmVmaXg6ICdhbGxvd2VkT3JnYW5pemF0aW9ucyAnLFxuICAgICAgICB9KSxcbiAgICAgICk7XG5cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2FtbENvbmZpZy5hbGxvd2VkT3JnYW5pemF0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBvcmcgPSBzYW1sQ29uZmlnLmFsbG93ZWRPcmdhbml6YXRpb25zW2ldO1xuICAgICAgICBpZiAodHlwZW9mIG9yZyAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBlcnJvcnMucHVzaChgYWxsb3dlZE9yZ2FuaXphdGlvbnNbJHtpfV0gbXVzdCBiZSBhIHN0cmluZ2ApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gQ2hlY2sgbG9naW5WYWxpZGl0eUR1cmF0aW9uIGlmIHByZXNlbnRcbiAgaWYgKHNhbWxDb25maWcubG9naW5WYWxpZGl0eUR1cmF0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAodHlwZW9mIHNhbWxDb25maWcubG9naW5WYWxpZGl0eUR1cmF0aW9uICE9PSAnbnVtYmVyJykge1xuICAgICAgZXJyb3JzLnB1c2goJ2xvZ2luVmFsaWRpdHlEdXJhdGlvbiBtdXN0IGJlIGEgbnVtYmVyJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVycm9ycy5wdXNoKFxuICAgICAgICAuLi52YWxpZGF0ZU51bWJlclJhbmdlKHtcbiAgICAgICAgICB2YWx1ZTogc2FtbENvbmZpZy5sb2dpblZhbGlkaXR5RHVyYXRpb24sXG4gICAgICAgICAgbWluOiAxLFxuICAgICAgICAgIG1lc3NhZ2VQcmVmaXg6ICdsb2dpblZhbGlkaXR5RHVyYXRpb24gJyxcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8vIENoZWNrIHJvbGVWYWx1ZXMgaWYgcHJlc2VudFxuICBpZiAoc2FtbENvbmZpZy5yb2xlVmFsdWVzICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAoIXNhbWxDb25maWcucm9sZVZhbHVlcyB8fCB0eXBlb2Ygc2FtbENvbmZpZy5yb2xlVmFsdWVzICE9PSAnb2JqZWN0Jykge1xuICAgICAgZXJyb3JzLnB1c2goJ3JvbGVWYWx1ZXMgbXVzdCBiZSBhbiBvYmplY3QnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ2hlY2sgYWRtaW4gYXJyYXkgaWYgcHJlc2VudFxuICAgICAgaWYgKHNhbWxDb25maWcucm9sZVZhbHVlcy5hZG1pbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShzYW1sQ29uZmlnLnJvbGVWYWx1ZXMuYWRtaW4pKSB7XG4gICAgICAgICAgZXJyb3JzLnB1c2goJ3JvbGVWYWx1ZXMuYWRtaW4gbXVzdCBiZSBhbiBhcnJheScpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2FtbENvbmZpZy5yb2xlVmFsdWVzLmFkbWluLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHNhbWxDb25maWcucm9sZVZhbHVlcy5hZG1pbltpXSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgZXJyb3JzLnB1c2goYHJvbGVWYWx1ZXMuYWRtaW5bJHtpfV0gbXVzdCBiZSBhIHN0cmluZ2ApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGVycm9ycy5wdXNoKFxuICAgICAgICAgICAgLi4udmFsaWRhdGVBcnJheUxlbmd0aCh7XG4gICAgICAgICAgICAgIHZhbHVlOiBzYW1sQ29uZmlnLnJvbGVWYWx1ZXMuYWRtaW4sXG4gICAgICAgICAgICAgIG1heDogMjU2LFxuICAgICAgICAgICAgICBtZXNzYWdlUHJlZml4OiAncm9sZVZhbHVlcy5hZG1pbiAnLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBlZGl0b3IgYXJyYXkgaWYgcHJlc2VudFxuICAgICAgaWYgKHNhbWxDb25maWcucm9sZVZhbHVlcy5lZGl0b3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoc2FtbENvbmZpZy5yb2xlVmFsdWVzLmVkaXRvcikpIHtcbiAgICAgICAgICBlcnJvcnMucHVzaCgncm9sZVZhbHVlcy5lZGl0b3IgbXVzdCBiZSBhbiBhcnJheScpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2FtbENvbmZpZy5yb2xlVmFsdWVzLmVkaXRvci5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBzYW1sQ29uZmlnLnJvbGVWYWx1ZXMuZWRpdG9yW2ldICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICBlcnJvcnMucHVzaChgcm9sZVZhbHVlcy5lZGl0b3JbJHtpfV0gbXVzdCBiZSBhIHN0cmluZ2ApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGVycm9ycy5wdXNoKFxuICAgICAgICAgICAgLi4udmFsaWRhdGVBcnJheUxlbmd0aCh7XG4gICAgICAgICAgICAgIHZhbHVlOiBzYW1sQ29uZmlnLnJvbGVWYWx1ZXMuZWRpdG9yLFxuICAgICAgICAgICAgICBtYXg6IDI1NixcbiAgICAgICAgICAgICAgbWVzc2FnZVByZWZpeDogJ3JvbGVWYWx1ZXMuZWRpdG9yICcsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGVycm9ycztcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgdGhlIHZwY0NvbmZpZ3VyYXRpb24gcHJvcGVydHkuXG4gKlxuICogQHBhcmFtIGNvbmZpZyAtIFRoZSBWUEMgY29uZmlndXJhdGlvbiB0byB2YWxpZGF0ZVxuICogQHJldHVybnMgQW4gYXJyYXkgb2YgZXJyb3IgbWVzc2FnZXMgaWYgdmFsaWRhdGlvbiBmYWlscywgb3IgYW4gZW1wdHkgYXJyYXkgaWYgdmFsaWRcbiAqXG4gKiBWYWxpZGF0aW9uIHJ1bGVzOlxuICogLSBNdXN0IGJlIGFuIG9iamVjdFxuICogLSBzZWN1cml0eUdyb3VwcyBpcyByZXF1aXJlZCBhbmQgbXVzdCBiZSBhbiBhcnJheSB3aXRoIDEtNSBpdGVtc1xuICogLSBzdWJuZXRzIGlzIHJlcXVpcmVkIGFuZCBtdXN0IGJlIGFuIGFycmF5IHdpdGggMi02IGl0ZW1zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVZwY0NvbmZpZ3VyYXRpb24oY29uZmlnOiB1bmtub3duKTogc3RyaW5nW10ge1xuICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG5cbiAgaWYgKCFjb25maWcgfHwgdHlwZW9mIGNvbmZpZyAhPT0gJ29iamVjdCcpIHtcbiAgICBlcnJvcnMucHVzaCgndnBjQ29uZmlndXJhdGlvbiBtdXN0IGJlIGFuIG9iamVjdCcpO1xuICAgIHJldHVybiBlcnJvcnM7XG4gIH1cblxuICBjb25zdCB2cGNDb25maWcgPSBjb25maWcgYXMgVnBjQ29uZmlndXJhdGlvbjtcblxuICAvLyBDaGVjayBzZWN1cml0eUdyb3VwcyAocmVxdWlyZWQpXG4gIGlmICh2cGNDb25maWcuc2VjdXJpdHlHcm91cHMgPT09IHVuZGVmaW5lZCkge1xuICAgIGVycm9ycy5wdXNoKCdzZWN1cml0eUdyb3VwcyBpcyByZXF1aXJlZCBpbiB2cGNDb25maWd1cmF0aW9uJyk7XG4gIH0gZWxzZSBpZiAoIUFycmF5LmlzQXJyYXkodnBjQ29uZmlnLnNlY3VyaXR5R3JvdXBzKSkge1xuICAgIGVycm9ycy5wdXNoKCdzZWN1cml0eUdyb3VwcyBtdXN0IGJlIGFuIGFycmF5Jyk7XG4gIH0gZWxzZSB7XG4gICAgZXJyb3JzLnB1c2goXG4gICAgICAuLi52YWxpZGF0ZUFycmF5TGVuZ3RoKHtcbiAgICAgICAgdmFsdWU6IHZwY0NvbmZpZy5zZWN1cml0eUdyb3VwcyxcbiAgICAgICAgbWluOiAxLFxuICAgICAgICBtYXg6IDUsXG4gICAgICAgIG1lc3NhZ2VQcmVmaXg6ICdzZWN1cml0eUdyb3VwcyAnLFxuICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIC8vIENoZWNrIHN1Ym5ldHMgKHJlcXVpcmVkKVxuICBpZiAodnBjQ29uZmlnLnN1Ym5ldHMgPT09IHVuZGVmaW5lZCkge1xuICAgIGVycm9ycy5wdXNoKCdzdWJuZXRzIGlzIHJlcXVpcmVkIGluIHZwY0NvbmZpZ3VyYXRpb24nKTtcbiAgfSBlbHNlIGlmICghQXJyYXkuaXNBcnJheSh2cGNDb25maWcuc3VibmV0cykpIHtcbiAgICBlcnJvcnMucHVzaCgnc3VibmV0cyBtdXN0IGJlIGFuIGFycmF5Jyk7XG4gIH0gZWxzZSB7XG4gICAgZXJyb3JzLnB1c2goXG4gICAgICAuLi52YWxpZGF0ZUFycmF5TGVuZ3RoKHtcbiAgICAgICAgdmFsdWU6IHZwY0NvbmZpZy5zdWJuZXRzLFxuICAgICAgICBtaW46IDIsXG4gICAgICAgIG1heDogNixcbiAgICAgICAgbWVzc2FnZVByZWZpeDogJ3N1Ym5ldHMgJyxcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gZXJyb3JzO1xufSJdfQ==
@@ -146,5 +146,5 @@ class WorkspaceBase extends aws_cdk_lib_1.Resource {
146
146
  }
147
147
  exports.WorkspaceBase = WorkspaceBase;
148
148
  _a = JSII_RTTI_SYMBOL_1;
149
- WorkspaceBase[_a] = { fqn: "@robhan-cdk-lib/aws_grafana.WorkspaceBase", version: "0.0.65" };
149
+ WorkspaceBase[_a] = { fqn: "@robhan-cdk-lib/aws_grafana.WorkspaceBase", version: "0.0.67" };
150
150
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ya3NwYWNlLWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvd29ya3NwYWNlLWJhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSw2Q0FBa0Q7QUFJbEQ7Ozs7O0dBS0c7QUFDSCxJQUFZLGlCQVVYO0FBVkQsV0FBWSxpQkFBaUI7SUFDM0I7O09BRUc7SUFDSCx3REFBbUMsQ0FBQTtJQUVuQzs7T0FFRztJQUNILGtEQUE2QixDQUFBO0FBQy9CLENBQUMsRUFWVyxpQkFBaUIsaUNBQWpCLGlCQUFpQixRQVU1QjtBQUVEOzs7OztHQUtHO0FBQ0gsSUFBWSx1QkFVWDtBQVZELFdBQVksdUJBQXVCO0lBQ2pDOztPQUVHO0lBQ0gsOENBQW1CLENBQUE7SUFFbkI7O09BRUc7SUFDSCx3Q0FBYSxDQUFBO0FBQ2YsQ0FBQyxFQVZXLHVCQUF1Qix1Q0FBdkIsdUJBQXVCLFFBVWxDO0FBMkJEOzs7R0FHRztBQUNILElBQVksd0JBS1g7QUFMRCxXQUFZLHdCQUF3QjtJQUNsQzs7T0FFRztJQUNILHVDQUFXLENBQUE7QUFDYixDQUFDLEVBTFcsd0JBQXdCLHdDQUF4Qix3QkFBd0IsUUFLbkM7QUFFRDs7Ozs7Ozs7OztHQVVHO0FBQ0gsSUFBWSxlQVVYO0FBVkQsV0FBWSxlQUFlO0lBQ3pCOztPQUVHO0lBQ0gsd0RBQXFDLENBQUE7SUFFckM7O09BRUc7SUFDSCxzREFBbUMsQ0FBQTtBQUNyQyxDQUFDLEVBVlcsZUFBZSwrQkFBZixlQUFlLFFBVTFCO0FBNEpEOztHQUVHO0FBQ0gsSUFBWSx5QkFVWDtBQVZELFdBQVkseUJBQXlCO0lBQ25DOztPQUVHO0lBQ0gsc0RBQXlCLENBQUE7SUFFekI7O09BRUc7SUFDSCw4REFBaUMsQ0FBQTtBQUNuQyxDQUFDLEVBVlcseUJBQXlCLHlDQUF6Qix5QkFBeUIsUUFVcEM7QUFFRDs7R0FFRztBQUNILElBQVksTUF1RFg7QUF2REQsV0FBWSxNQUFNO0lBQ2hCOztPQUVHO0lBQ0gsMkJBQWlCLENBQUE7SUFFakI7O09BRUc7SUFDSCwrQkFBcUIsQ0FBQTtJQUVyQjs7T0FFRztJQUNILCtCQUFxQixDQUFBO0lBRXJCOztPQUVHO0lBQ0gsMkJBQWlCLENBQUE7SUFFakI7O09BRUc7SUFDSCwrQkFBcUIsQ0FBQTtJQUVyQjs7T0FFRztJQUNILGlDQUF1QixDQUFBO0lBRXZCOztPQUVHO0lBQ0gsNkNBQW1DLENBQUE7SUFFbkM7O09BRUc7SUFDSCw2Q0FBbUMsQ0FBQTtJQUVuQzs7T0FFRztJQUNILHlDQUErQixDQUFBO0lBRS9COztPQUVHO0lBQ0gsMkNBQWlDLENBQUE7SUFFakM7O09BRUc7SUFDSCwyREFBaUQsQ0FBQTtBQUNuRCxDQUFDLEVBdkRXLE1BQU0sc0JBQU4sTUFBTSxRQXVEakI7QUE4SEQsTUFBc0IsYUFBYyxTQUFRLHNCQUFRO0lBcUd4QyxlQUFlLENBQUMsV0FBbUI7UUFDM0MsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUN6QixPQUFPLE9BQU8sS0FBSyxDQUFDLFNBQVMsWUFBWSxLQUFLLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxPQUFPLGVBQWUsV0FBVyxFQUFFLENBQUM7SUFDckcsQ0FBQztJQUVTLGNBQWMsQ0FBQyxZQUFvQjtRQUMzQyxPQUFPLFlBQVksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNuRSxDQUFDOztBQTVHSCxzQ0E2R0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJUmVzb3VyY2UsIFJlc291cmNlIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHsgSVByZWZpeExpc3QsIElTZWN1cml0eUdyb3VwLCBJU3VibmV0LCBJVnBjRW5kcG9pbnQgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZWMyJztcbmltcG9ydCB7IElSb2xlIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWlhbSc7XG5cbi8qKlxuICogU3BlY2lmaWVzIHdoZXRoZXIgdGhlIHdvcmtzcGFjZSBjYW4gYWNjZXNzIEFXUyByZXNvdXJjZXMgaW4gdGhpcyBBV1MgYWNjb3VudCBvbmx5LCBvciB3aGV0aGVyIGl0XG4gKiBjYW4gYWxzbyBhY2Nlc3MgQVdTIHJlc291cmNlcyBpbiBvdGhlciBhY2NvdW50cyBpbiB0aGUgc2FtZSBvcmdhbml6YXRpb24uIElmIHRoaXMgaXNcbiAqIE9SR0FOSVpBVElPTiwgdGhlIE9yZ2FuaXphdGlvbmFsVW5pdHMgcGFyYW1ldGVyIHNwZWNpZmllcyB3aGljaCBvcmdhbml6YXRpb25hbCB1bml0cyB0aGVcbiAqIHdvcmtzcGFjZSBjYW4gYWNjZXNzLlxuICovXG5leHBvcnQgZW51bSBBY2NvdW50QWNjZXNzVHlwZSB7XG4gIC8qKlxuICAgKiBBY2Nlc3MgaXMgbGltaXRlZCB0byB0aGUgY3VycmVudCBBV1MgYWNjb3VudCBvbmx5LlxuICAgKi9cbiAgQ1VSUkVOVF9BQ0NPVU5UID0gJ0NVUlJFTlRfQUNDT1VOVCcsXG5cbiAgLyoqXG4gICAqIEFjY2VzcyBpcyBleHRlbmRlZCB0byB0aGUgZW50aXJlIEFXUyBvcmdhbml6YXRpb24uXG4gICAqL1xuICBPUkdBTklaQVRJT04gPSAnT1JHQU5JWkFUSU9OJyxcbn1cblxuLyoqXG4gKiBTcGVjaWZpZXMgd2hldGhlciB0aGlzIHdvcmtzcGFjZSB1c2VzIFNBTUwgMi4wLCBBV1MgSUFNIElkZW50aXR5IENlbnRlciwgb3IgYm90aCB0byBhdXRoZW50aWNhdGVcbiAqIHVzZXJzIGZvciB1c2luZyB0aGUgR3JhZmFuYSBjb25zb2xlIHdpdGhpbiBhIHdvcmtzcGFjZS5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9ncmFmYW5hL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0NyZWF0ZVdvcmtzcGFjZS5odG1sXG4gKi9cbmV4cG9ydCBlbnVtIEF1dGhlbnRpY2F0aW9uUHJvdmlkZXJzIHtcbiAgLyoqXG4gICAqIEFXUyBTaW5nbGUgU2lnbi1PbiBhdXRoZW50aWNhdGlvbiBwcm92aWRlci5cbiAgICovXG4gIEFXU19TU08gPSAnQVdTX1NTTycsXG5cbiAgLyoqXG4gICAqIFNlY3VyaXR5IEFzc2VydGlvbiBNYXJrdXAgTGFuZ3VhZ2UgKFNBTUwpIGF1dGhlbnRpY2F0aW9uIHByb3ZpZGVyLlxuICAgKi9cbiAgU0FNTCA9ICdTQU1MJyxcbn1cblxuLyoqXG4gKiBUaGUgY29uZmlndXJhdGlvbiBzZXR0aW5ncyBmb3IgbmV0d29yayBhY2Nlc3MgdG8geW91ciB3b3Jrc3BhY2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTmV0d29ya0FjY2Vzc0NvbnRyb2wge1xuICAvKipcbiAgICogQW4gYXJyYXkgb2YgcHJlZml4IGxpc3QgSURzLiBBIHByZWZpeCBsaXN0IGlzIGEgbGlzdCBvZiBDSURSIHJhbmdlcyBvZiBJUCBhZGRyZXNzZXMuIFRoZSBJUFxuICAgKiBhZGRyZXNzZXMgc3BlY2lmaWVkIGFyZSBhbGxvd2VkIHRvIGFjY2VzcyB5b3VyIHdvcmtzcGFjZS4gSWYgdGhlIGxpc3QgaXMgbm90IGluY2x1ZGVkIGluIHRoZVxuICAgKiBjb25maWd1cmF0aW9uIChwYXNzZWQgYW4gZW1wdHkgYXJyYXkpIHRoZW4gbm8gSVAgYWRkcmVzc2VzIGFyZSBhbGxvd2VkIHRvIGFjY2VzcyB0aGVcbiAgICogd29ya3NwYWNlLlxuICAgKlxuICAgKiBNYXhpbXVtIG9mIDUgcHJlZml4IGxpc3RzIGFsbG93ZWQuXG4gICAqL1xuICByZWFkb25seSBwcmVmaXhMaXN0cz86IElQcmVmaXhMaXN0W107XG5cbiAgLyoqXG4gICAqIEFuIGFycmF5IG9mIEFtYXpvbiBWUEMgZW5kcG9pbnQgSURzIGZvciB0aGUgd29ya3NwYWNlLiBZb3UgY2FuIGNyZWF0ZSBWUEMgZW5kcG9pbnRzIHRvIHlvdXJcbiAgICogQW1hem9uIE1hbmFnZWQgR3JhZmFuYSB3b3Jrc3BhY2UgZm9yIGFjY2VzcyBmcm9tIHdpdGhpbiBhIFZQQy4gSWYgYSBOZXR3b3JrQWNjZXNzQ29uZmlndXJhdGlvblxuICAgKiBpcyBzcGVjaWZpZWQgdGhlbiBvbmx5IFZQQyBlbmRwb2ludHMgc3BlY2lmaWVkIGhlcmUgYXJlIGFsbG93ZWQgdG8gYWNjZXNzIHRoZSB3b3Jrc3BhY2UuIElmXG4gICAqIHlvdSBwYXNzIGluIGFuIGVtcHR5IGFycmF5IG9mIHN0cmluZ3MsIHRoZW4gbm8gVlBDcyBhcmUgYWxsb3dlZCB0byBhY2Nlc3MgdGhlIHdvcmtzcGFjZS5cbiAgICpcbiAgICogTWF4aW11bSBvZiA1IFZQQyBlbmRwb2ludHMgYWxsb3dlZC5cbiAgICovXG4gIHJlYWRvbmx5IHZwY0VuZHBvaW50cz86IElWcGNFbmRwb2ludFtdO1xufVxuXG4vKipcbiAqIFRoZSBBV1Mgbm90aWZpY2F0aW9uIGNoYW5uZWxzIHRoYXQgQW1hem9uIE1hbmFnZWQgR3JhZmFuYSBjYW4gYXV0b21hdGljYWxseSBjcmVhdGUgSUFNIHJvbGVzIGFuZFxuICogcGVybWlzc2lvbnMgZm9yLCB0byBhbGxvdyBBbWF6b24gTWFuYWdlZCBHcmFmYW5hIHRvIHVzZSB0aGVzZSBjaGFubmVscy5cbiAqL1xuZXhwb3J0IGVudW0gTm90aWZpY2F0aW9uRGVzdGluYXRpb25zIHtcbiAgLyoqXG4gICAqIEFtYXpvbiBTaW1wbGUgTm90aWZpY2F0aW9uIFNlcnZpY2UgKFNOUykgYXMgbm90aWZpY2F0aW9uIGRlc3RpbmF0aW9uLlxuICAgKi9cbiAgU05TID0gJ1NOUycsXG59XG5cbi8qKlxuICogSWYgdGhpcyBpcyBTRVJWSUNFX01BTkFHRUQsIGFuZCB0aGUgd29ya3BsYWNlIHdhcyBjcmVhdGVkIHRocm91Z2ggdGhlIEFtYXpvbiBNYW5hZ2VkIEdyYWZhbmFcbiAqIGNvbnNvbGUsIHRoZW4gQW1hem9uIE1hbmFnZWQgR3JhZmFuYSBhdXRvbWF0aWNhbGx5IGNyZWF0ZXMgdGhlIElBTSByb2xlcyBhbmQgcHJvdmlzaW9ucyB0aGVcbiAqIHBlcm1pc3Npb25zIHRoYXQgdGhlIHdvcmtzcGFjZSBuZWVkcyB0byB1c2UgQVdTIGRhdGEgc291cmNlcyBhbmQgbm90aWZpY2F0aW9uIGNoYW5uZWxzLlxuICpcbiAqIElmIHRoaXMgaXMgQ1VTVE9NRVJfTUFOQUdFRCwgeW91IG11c3QgbWFuYWdlIHRob3NlIHJvbGVzIGFuZCBwZXJtaXNzaW9ucyB5b3Vyc2VsZi5cblxuICogSWYgeW91IGFyZSB3b3JraW5nIHdpdGggYSB3b3Jrc3BhY2UgaW4gYSBtZW1iZXIgYWNjb3VudCBvZiBhbiBvcmdhbml6YXRpb24gYW5kIHRoYXQgYWNjb3VudCBpc1xuICogbm90IGEgZGVsZWdhdGVkIGFkbWluaXN0cmF0b3IgYWNjb3VudCwgYW5kIHlvdSB3YW50IHRoZSB3b3Jrc3BhY2UgdG8gYWNjZXNzIGRhdGEgc291cmNlcyBpblxuICogb3RoZXIgQVdTIGFjY291bnRzIGluIHRoZSBvcmdhbml6YXRpb24sIHRoaXMgcGFyYW1ldGVyIG11c3QgYmUgc2V0IHRvIENVU1RPTUVSX01BTkFHRUQuXG4gKi9cbmV4cG9ydCBlbnVtIFBlcm1pc3Npb25UeXBlcyB7XG4gIC8qKlxuICAgKiBDdXN0b21lci1tYW5hZ2VkIHBlcm1pc3Npb25zIHdoZXJlIHlvdSBtYW5hZ2UgdXNlciBhY2Nlc3MgdG8gR3JhZmFuYS5cbiAgICovXG4gIENVU1RPTUVSX01BTkFHRUQgPSAnQ1VTVE9NRVJfTUFOQUdFRCcsXG5cbiAgLyoqXG4gICAqIFNlcnZpY2UtbWFuYWdlZCBwZXJtaXNzaW9ucyB3aGVyZSBBV1MgbWFuYWdlcyB1c2VyIGFjY2VzcyB0byBHcmFmYW5hLlxuICAgKi9cbiAgU0VSVklDRV9NQU5BR0VEID0gJ1NFUlZJQ0VfTUFOQUdFRCcsXG59XG5cbi8qKlxuICogQSBzdHJ1Y3R1cmUgdGhhdCBkZWZpbmVzIHdoaWNoIGF0dHJpYnV0ZXMgaW4gdGhlIElkUCBhc3NlcnRpb24gYXJlIHRvIGJlIHVzZWQgdG8gZGVmaW5lXG4gKiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdXNlcnMgYXV0aGVudGljYXRlZCBieSB0aGUgSWRQIHRvIHVzZSB0aGUgd29ya3NwYWNlLlxuICpcbiAqIEVhY2ggYXR0cmlidXRlIG11c3QgYmUgYSBzdHJpbmcgd2l0aCBsZW5ndGggYmV0d2VlbiAxIGFuZCAyNTYgY2hhcmFjdGVycy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW1sQXNzZXJ0aW9uQXR0cmlidXRlcyB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHdpdGhpbiB0aGUgU0FNTCBhc3NlcnRpb24gdG8gdXNlIGFzIHRoZSBlbWFpbCBuYW1lcyBmb3IgU0FNTCB1c2Vycy5cbiAgICpcbiAgICogTXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDI1NiBjaGFyYWN0ZXJzIGxvbmcuXG4gICAqL1xuICByZWFkb25seSBlbWFpbD86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgd2l0aGluIHRoZSBTQU1MIGFzc2VydGlvbiB0byB1c2UgYXMgdGhlIHVzZXIgZnVsbCBcImZyaWVuZGx5XCIgbmFtZXNcbiAgICogZm9yIHVzZXIgZ3JvdXBzLlxuICAgKlxuICAgKiBNdXN0IGJlIGJldHdlZW4gMSBhbmQgMjU2IGNoYXJhY3RlcnMgbG9uZy5cbiAgICovXG4gIHJlYWRvbmx5IGdyb3Vwcz86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgd2l0aGluIHRoZSBTQU1MIGFzc2VydGlvbiB0byB1c2UgYXMgdGhlIGxvZ2luIG5hbWVzIGZvciBTQU1MIHVzZXJzLlxuICAgKlxuICAgKiBNdXN0IGJlIGJldHdlZW4gMSBhbmQgMjU2IGNoYXJhY3RlcnMgbG9uZy5cbiAgICovXG4gIHJlYWRvbmx5IGxvZ2luPzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB3aXRoaW4gdGhlIFNBTUwgYXNzZXJ0aW9uIHRvIHVzZSBhcyB0aGUgdXNlciBmdWxsIFwiZnJpZW5kbHlcIiBuYW1lc1xuICAgKiBmb3IgU0FNTCB1c2Vycy5cbiAgICpcbiAgICogTXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDI1NiBjaGFyYWN0ZXJzIGxvbmcuXG4gICAqL1xuICByZWFkb25seSBuYW1lPzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB3aXRoaW4gdGhlIFNBTUwgYXNzZXJ0aW9uIHRvIHVzZSBhcyB0aGUgdXNlciBmdWxsIFwiZnJpZW5kbHlcIiBuYW1lc1xuICAgKiBmb3IgdGhlIHVzZXJzJyBvcmdhbml6YXRpb25zLlxuICAgKlxuICAgKiBNdXN0IGJlIGJldHdlZW4gMSBhbmQgMjU2IGNoYXJhY3RlcnMgbG9uZy5cbiAgICovXG4gIHJlYWRvbmx5IG9yZz86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgd2l0aGluIHRoZSBTQU1MIGFzc2VydGlvbiB0byB1c2UgYXMgdGhlIHVzZXIgcm9sZXMuXG4gICAqXG4gICAqIE11c3QgYmUgYmV0d2VlbiAxIGFuZCAyNTYgY2hhcmFjdGVycyBsb25nLlxuICAgKi9cbiAgcmVhZG9ubHkgcm9sZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIHN0cnVjdHVyZSBjb250YWluaW5nIHRoZSBpZGVudGl0eSBwcm92aWRlciAoSWRQKSBtZXRhZGF0YSB1c2VkIHRvIGludGVncmF0ZSB0aGUgaWRlbnRpdHlcbiAqIHByb3ZpZGVyIHdpdGggdGhpcyB3b3Jrc3BhY2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FtbElkcE1ldGFkYXRhIHtcbiAgLyoqXG4gICAqIFRoZSBVUkwgb2YgdGhlIGxvY2F0aW9uIGNvbnRhaW5pbmcgdGhlIElkUCBtZXRhZGF0YS5cbiAgICpcbiAgICogTXVzdCBiZSBhIHN0cmluZyB3aXRoIGxlbmd0aCBiZXR3ZWVuIDEgYW5kIDIwNDggY2hhcmFjdGVycy5cbiAgICovXG4gIHJlYWRvbmx5IHVybD86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGZ1bGwgSWRQIG1ldGFkYXRhLCBpbiBYTUwgZm9ybWF0LlxuICAgKi9cbiAgcmVhZG9ubHkgeG1sPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgc3RydWN0dXJlIGNvbnRhaW5pbmcgYXJyYXlzIHRoYXQgbWFwIGdyb3VwIG5hbWVzIGluIHRoZSBTQU1MIGFzc2VydGlvbiB0byB0aGUgR3JhZmFuYSBBZG1pblxuICogYW5kIEVkaXRvciByb2xlcyBpbiB0aGUgd29ya3NwYWNlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbWxSb2xlVmFsdWVzIHtcbiAgLyoqXG4gICAqIEEgbGlzdCBvZiBncm91cHMgZnJvbSB0aGUgU0FNTCBhc3NlcnRpb24gYXR0cmlidXRlIHRvIGdyYW50IHRoZSBHcmFmYW5hIEFkbWluIHJvbGUgdG8uXG4gICAqXG4gICAqIE1heGltdW0gb2YgMjU2IGVsZW1lbnRzLlxuICAgKi9cbiAgcmVhZG9ubHkgYWRtaW4/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogQSBsaXN0IG9mIGdyb3VwcyBmcm9tIHRoZSBTQU1MIGFzc2VydGlvbiBhdHRyaWJ1dGUgdG8gZ3JhbnQgdGhlIEdyYWZhbmEgRWRpdG9yIHJvbGUgdG8uXG4gICAqXG4gICAqIE1heGltdW0gb2YgMjU2IGVsZW1lbnRzLlxuICAgKi9cbiAgcmVhZG9ubHkgZWRpdG9yPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogSWYgdGhlIHdvcmtzcGFjZSB1c2VzIFNBTUwsIHVzZSB0aGlzIHN0cnVjdHVyZSB0byBtYXAgU0FNTCBhc3NlcnRpb24gYXR0cmlidXRlcyB0byB3b3Jrc3BhY2VcbiAqIHVzZXIgaW5mb3JtYXRpb24gYW5kIGRlZmluZSB3aGljaCBncm91cHMgaW4gdGhlIGFzc2VydGlvbiBhdHRyaWJ1dGUgYXJlIHRvIGhhdmUgdGhlIEFkbWluIGFuZFxuICogRWRpdG9yIHJvbGVzIGluIHRoZSB3b3Jrc3BhY2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FtbENvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogTGlzdHMgd2hpY2ggb3JnYW5pemF0aW9ucyBkZWZpbmVkIGluIHRoZSBTQU1MIGFzc2VydGlvbiBhcmUgYWxsb3dlZCB0byB1c2UgdGhlIEFtYXpvbiBNYW5hZ2VkXG4gICAqIEdyYWZhbmEgd29ya3NwYWNlLiBJZiB0aGlzIGlzIGVtcHR5LCBhbGwgb3JnYW5pemF0aW9ucyBpbiB0aGUgYXNzZXJ0aW9uIGF0dHJpYnV0ZSBoYXZlIGFjY2Vzcy5cbiAgICpcbiAgICogTXVzdCBoYXZlIGJldHdlZW4gMSBhbmQgMjU2IGVsZW1lbnRzLlxuICAgKi9cbiAgcmVhZG9ubHkgYWxsb3dlZE9yZ2FuaXphdGlvbnM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogQSBzdHJ1Y3R1cmUgdGhhdCBkZWZpbmVzIHdoaWNoIGF0dHJpYnV0ZXMgaW4gdGhlIFNBTUwgYXNzZXJ0aW9uIGFyZSB0byBiZSB1c2VkIHRvIGRlZmluZVxuICAgKiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdXNlcnMgYXV0aGVudGljYXRlZCBieSB0aGF0IElkUCB0byB1c2UgdGhlIHdvcmtzcGFjZS5cbiAgICovXG4gIHJlYWRvbmx5IGFzc2VydGlvbkF0cnJpYnV0ZXM/OiBTYW1sQXNzZXJ0aW9uQXR0cmlidXRlcztcblxuICAvKipcbiAgICogQSBzdHJ1Y3R1cmUgY29udGFpbmluZyB0aGUgaWRlbnRpdHkgcHJvdmlkZXIgKElkUCkgbWV0YWRhdGEgdXNlZCB0byBpbnRlZ3JhdGUgdGhlIGlkZW50aXR5XG4gICAqIHByb3ZpZGVyIHdpdGggdGhpcyB3b3Jrc3BhY2UuXG4gICAqXG4gICAqIFJlcXVpcmVkIGZpZWxkIGZvciBTQU1MIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICByZWFkb25seSBpZHBNZXRhZGF0YTogU2FtbElkcE1ldGFkYXRhO1xuXG4gIC8qKlxuICAgKiBIb3cgbG9uZyBhIHNpZ24tb24gc2Vzc2lvbiBieSBhIFNBTUwgdXNlciBpcyB2YWxpZCwgYmVmb3JlIHRoZSB1c2VyIGhhcyB0byBzaWduIG9uIGFnYWluLlxuICAgKlxuICAgKiBNdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyLlxuICAgKi9cbiAgcmVhZG9ubHkgbG9naW5WYWxpZGl0eUR1cmF0aW9uPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBBIHN0cnVjdHVyZSBjb250YWluaW5nIGFycmF5cyB0aGF0IG1hcCBncm91cCBuYW1lcyBpbiB0aGUgU0FNTCBhc3NlcnRpb24gdG8gdGhlIEdyYWZhbmEgQWRtaW5cbiAgICogYW5kIEVkaXRvciByb2xlcyBpbiB0aGUgd29ya3NwYWNlLlxuICAgKi9cbiAgcmVhZG9ubHkgcm9sZVZhbHVlcz86IFNhbWxSb2xlVmFsdWVzO1xufVxuXG4vKipcbiAqIFRoZSBjb25maWd1cmF0aW9uIHNldHRpbmdzIGZvciBhbiBBbWF6b24gVlBDIHRoYXQgY29udGFpbnMgZGF0YSBzb3VyY2VzIGZvciB5b3VyIEdyYWZhbmFcbiAqIHdvcmtzcGFjZSB0byBjb25uZWN0IHRvLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZwY0NvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogVGhlIGxpc3Qgb2YgQW1hem9uIEVDMiBzZWN1cml0eSBncm91cHMgYXR0YWNoZWQgdG8gdGhlIEFtYXpvbiBWUEMgZm9yIHlvdXIgR3JhZmFuYVxuICAgKiB3b3Jrc3BhY2UgdG8gY29ubmVjdC4gRHVwbGljYXRlcyBub3QgYWxsb3dlZC5cbiAgICpcbiAgICogQXJyYXkgTWVtYmVyczogTWluaW11bSBudW1iZXIgb2YgMSBpdGVtcy4gTWF4aW11bSBudW1iZXIgb2YgNSBpdGVtcy5cbiAgICpcbiAgICogUmVxdWlyZWQgZm9yIFZQQyBjb25maWd1cmF0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgc2VjdXJpdHlHcm91cHM6IElTZWN1cml0eUdyb3VwW107XG5cbiAgLyoqXG4gICAqIFRoZSBsaXN0IG9mIEFtYXpvbiBFQzIgc3VibmV0cyBjcmVhdGVkIGluIHRoZSBBbWF6b24gVlBDIGZvciB5b3VyIEdyYWZhbmEgd29ya3NwYWNlIHRvXG4gICAqIGNvbm5lY3QuIER1cGxpY2F0ZXMgbm90IGFsbG93ZWQuXG4gICAqXG4gICAqIEFycmF5IE1lbWJlcnM6IE1pbmltdW0gbnVtYmVyIG9mIDIgaXRlbXMuIE1heGltdW0gbnVtYmVyIG9mIDYgaXRlbXMuXG4gICAqXG4gICAqIFJlcXVpcmVkIGZvciBWUEMgY29uZmlndXJhdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IHN1Ym5ldHM6IElTdWJuZXRbXTtcbn1cblxuLyoqXG4gKiBTdGF0dXMgb2YgU0FNTCBjb25maWd1cmF0aW9uIGZvciBhIEdyYWZhbmEgd29ya3NwYWNlLlxuICovXG5leHBvcnQgZW51bSBTYW1sQ29uZmlndXJhdGlvblN0YXR1c2VzIHtcbiAgLyoqXG4gICAqIFNBTUwgaXMgY29uZmlndXJlZCBmb3IgdGhlIHdvcmtzcGFjZS5cbiAgICovXG4gIENPTkZJR1VSRUQgPSAnQ09ORklHVVJFRCcsXG5cbiAgLyoqXG4gICAqIFNBTUwgaXMgbm90IGNvbmZpZ3VyZWQgZm9yIHRoZSB3b3Jrc3BhY2UuXG4gICAqL1xuICBOT1RfQ09ORklHVVJFRCA9ICdOT1RfQ09ORklHVVJFRCcsXG59XG5cbi8qKlxuICogU3RhdHVzIG9mIGEgR3JhZmFuYSB3b3Jrc3BhY2UuXG4gKi9cbmV4cG9ydCBlbnVtIFN0YXR1cyB7XG4gIC8qKlxuICAgKiBXb3Jrc3BhY2UgaXMgYWN0aXZlIGFuZCByZWFkeSB0byB1c2UuXG4gICAqL1xuICBBQ1RJVkUgPSAnQUNUSVZFJyxcblxuICAvKipcbiAgICogV29ya3NwYWNlIGlzIGJlaW5nIGNyZWF0ZWQuXG4gICAqL1xuICBDUkVBVElORyA9ICdDUkVBVElORycsXG5cbiAgLyoqXG4gICAqIFdvcmtzcGFjZSBpcyBiZWluZyBkZWxldGVkLlxuICAgKi9cbiAgREVMRVRJTkcgPSAnREVMRVRJTkcnLFxuXG4gIC8qKlxuICAgKiBXb3Jrc3BhY2Ugb3BlcmF0aW9uIGhhcyBmYWlsZWQuXG4gICAqL1xuICBGQUlMRUQgPSAnRkFJTEVEJyxcblxuICAvKipcbiAgICogV29ya3NwYWNlIGlzIGJlaW5nIHVwZGF0ZWQuXG4gICAqL1xuICBVUERBVElORyA9ICdVUERBVElORycsXG5cbiAgLyoqXG4gICAqIFdvcmtzcGFjZSBpcyBiZWluZyB1cGdyYWRlZC5cbiAgICovXG4gIFVQR1JBRElORyA9ICdVUEdSQURJTkcnLFxuXG4gIC8qKlxuICAgKiBXb3Jrc3BhY2UgZGVsZXRpb24gaGFzIGZhaWxlZC5cbiAgICovXG4gIERFTEVUSU9OX0ZBSUxFRCA9ICdERUxFVElPTl9GQUlMRUQnLFxuXG4gIC8qKlxuICAgKiBXb3Jrc3BhY2UgY3JlYXRpb24gaGFzIGZhaWxlZC5cbiAgICovXG4gIENSRUFUSU9OX0ZBSUxFRCA9ICdDUkVBVElPTl9GQUlMRUQnLFxuXG4gIC8qKlxuICAgKiBXb3Jrc3BhY2UgdXBkYXRlIGhhcyBmYWlsZWQuXG4gICAqL1xuICBVUERBVEVfRkFJTEVEID0gJ1VQREFURV9GQUlMRUQnLFxuXG4gIC8qKlxuICAgKiBXb3Jrc3BhY2UgdXBncmFkZSBoYXMgZmFpbGVkLlxuICAgKi9cbiAgVVBHUkFERV9GQUlMRUQgPSAnVVBHUkFERV9GQUlMRUQnLFxuXG4gIC8qKlxuICAgKiBMaWNlbnNlIHJlbW92YWwgaGFzIGZhaWxlZC5cbiAgICovXG4gIExJQ0VOU0VfUkVNT1ZBTF9GQUlMRUQgPSAnTElDRU5TRV9SRU1PVkFMX0ZBSUxFRCcsXG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBhbiBBbWF6b24gTWFuYWdlZCBTZXJ2aWNlIGZvciBHcmFmYW5hIHdvcmtzcGFjZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIElXb3Jrc3BhY2UgZXh0ZW5kcyBJUmVzb3VyY2Uge1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgd2hldGhlciB0aGUgd29ya3NwYWNlIGNhbiBhY2Nlc3MgQVdTIHJlc291cmNlcyBpbiB0aGlzIEFXUyBhY2NvdW50IG9ubHksIG9yIHdoZXRoZXJcbiAgICogaXQgY2FuIGFsc28gYWNjZXNzIEFXUyByZXNvdXJjZXMgaW4gb3RoZXIgYWNjb3VudHMgaW4gdGhlIHNhbWUgb3JnYW5pemF0aW9uLiBJZiB0aGlzIGlzXG4gICAqIE9SR0FOSVpBVElPTiwgdGhlIE9yZ2FuaXphdGlvbmFsVW5pdHMgcGFyYW1ldGVyIHNwZWNpZmllcyB3aGljaCBvcmdhbml6YXRpb25hbCB1bml0cyB0aGVcbiAgICogd29ya3NwYWNlIGNhbiBhY2Nlc3MuXG4gICAqL1xuICByZWFkb25seSBhY2NvdW50QWNjZXNzVHlwZTogQWNjb3VudEFjY2Vzc1R5cGU7XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB3aGV0aGVyIHRoaXMgd29ya3NwYWNlIHVzZXMgU0FNTCAyLjAsIEFXUyBJQU0gSWRlbnRpdHkgQ2VudGVyLCBvciBib3RoIHRvXG4gICAqIGF1dGhlbnRpY2F0ZSB1c2VycyBmb3IgdXNpbmcgdGhlIEdyYWZhbmEgY29uc29sZSB3aXRoaW4gYSB3b3Jrc3BhY2UuXG4gICAqL1xuICByZWFkb25seSBhdXRoZW50aWNhdGlvblByb3ZpZGVyczogQXV0aGVudGljYXRpb25Qcm92aWRlcnNbXTtcblxuICAvKipcbiAgICogQSB1bmlxdWUsIGNhc2Utc2Vuc2l0aXZlLCB1c2VyLXByb3ZpZGVkIGlkZW50aWZpZXIgdG8gZW5zdXJlIHRoZSBpZGVtcG90ZW5jeSBvZiB0aGUgcmVxdWVzdC5cbiAgICovXG4gIHJlYWRvbmx5IGNsaWVudFRva2VuPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgdGhlIEFXUyBkYXRhIHNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gY29uZmlndXJlZCB0byBoYXZlIElBTSByb2xlcyBhbmQgcGVybWlzc2lvbnNcbiAgICogY3JlYXRlZCB0byBhbGxvdyBBbWF6b24gTWFuYWdlZCBHcmFmYW5hIHRvIHJlYWQgZGF0YSBmcm9tIHRoZXNlIHNvdXJjZXMuXG4gICAqXG4gICAqIFRoaXMgbGlzdCBpcyBvbmx5IHVzZWQgd2hlbiB0aGUgd29ya3NwYWNlIHdhcyBjcmVhdGVkIHRocm91Z2ggdGhlIEFXUyBjb25zb2xlLCBhbmQgdGhlXG4gICAqIHBlcm1pc3Npb25UeXBlIGlzIFNFUlZJQ0VfTUFOQUdFRC5cbiAgICovXG4gIHJlYWRvbmx5IGRhdGFTb3VyY2VzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFRoZSB1c2VyLWRlZmluZWQgZGVzY3JpcHRpb24gb2YgdGhlIHdvcmtzcGFjZS5cbiAgICovXG4gIHJlYWRvbmx5IGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgd29ya3NwYWNlLlxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MgZm9yIG5ldHdvcmsgYWNjZXNzIHRvIHlvdXIgd29ya3NwYWNlLlxuICAgKi9cbiAgcmVhZG9ubHkgbmV0d29ya0FjY2Vzc0NvbnRyb2w/OiBOZXR3b3JrQWNjZXNzQ29udHJvbDtcblxuICAvKipcbiAgICogVGhlIEFXUyBub3RpZmljYXRpb24gY2hhbm5lbHMgdGhhdCBBbWF6b24gTWFuYWdlZCBHcmFmYW5hIGNhbiBhdXRvbWF0aWNhbGx5IGNyZWF0ZSBJQU0gcm9sZXNcbiAgICogYW5kIHBlcm1pc3Npb25zIGZvciwgdG8gYWxsb3cgQW1hem9uIE1hbmFnZWQgR3JhZmFuYSB0byB1c2UgdGhlc2UgY2hhbm5lbHMuXG4gICAqL1xuICByZWFkb25seSBub3RpZmljYXRpb25EZXN0aW5hdGlvbnM/OiBOb3RpZmljYXRpb25EZXN0aW5hdGlvbnNbXTtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBvcmdhbml6YXRpb25hbCB1bml0cyB0aGF0IHRoaXMgd29ya3NwYWNlIGlzIGFsbG93ZWQgdG8gdXNlIGRhdGEgc291cmNlcyBmcm9tLCBpZlxuICAgKiB0aGlzIHdvcmtzcGFjZSBpcyBpbiBhbiBhY2NvdW50IHRoYXQgaXMgcGFydCBvZiBhbiBvcmdhbml6YXRpb24uXG4gICAqL1xuICByZWFkb25seSBvcmdhbml6YXRpb25hbFVuaXRzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBJQU0gcm9sZSB0aGF0IGlzIHVzZWQgdG8gYWNjZXNzIHJlc291cmNlcyB0aHJvdWdoIE9yZ2FuaXphdGlvbnMuXG4gICAqL1xuICByZWFkb25seSBvcmdhbml6YXRpb25Sb2xlTmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogSWYgdGhpcyBpcyBTRVJWSUNFX01BTkFHRUQsIGFuZCB0aGUgd29ya3BsYWNlIHdhcyBjcmVhdGVkIHRocm91Z2ggdGhlIEFtYXpvbiBNYW5hZ2VkIEdyYWZhbmFcbiAgICogY29uc29sZSwgdGhlbiBBbWF6b24gTWFuYWdlZCBHcmFmYW5hIGF1dG9tYXRpY2FsbHkgY3JlYXRlcyB0aGUgSUFNIHJvbGVzIGFuZCBwcm92aXNpb25zIHRoZVxuICAgKiBwZXJtaXNzaW9ucyB0aGF0IHRoZSB3b3Jrc3BhY2UgbmVlZHMgdG8gdXNlIEFXUyBkYXRhIHNvdXJjZXMgYW5kIG5vdGlmaWNhdGlvbiBjaGFubmVscy5cbiAgICpcbiAgICogSWYgdGhpcyBpcyBDVVNUT01FUl9NQU5BR0VELCB5b3UgbXVzdCBtYW5hZ2UgdGhvc2Ugcm9sZXMgYW5kIHBlcm1pc3Npb25zIHlvdXJzZWxmLlxuICAgKlxuICAgKiBJZiB5b3UgYXJlIHdvcmtpbmcgd2l0aCBhIHdvcmtzcGFjZSBpbiBhIG1lbWJlciBhY2NvdW50IG9mIGFuIG9yZ2FuaXphdGlvbiBhbmQgdGhhdCBhY2NvdW50IGlzXG4gICAqIG5vdCBhIGRlbGVnYXRlZCBhZG1pbmlzdHJhdG9yIGFjY291bnQsIGFuZCB5b3Ugd2FudCB0aGUgd29ya3NwYWNlIHRvIGFjY2VzcyBkYXRhIHNvdXJjZXMgaW5cbiAgICogb3RoZXIgQVdTIGFjY291bnRzIGluIHRoZSBvcmdhbml6YXRpb24sIHRoaXMgcGFyYW1ldGVyIG11c3QgYmUgc2V0IHRvIENVU1RPTUVSX01BTkFHRUQuXG4gICAqL1xuICByZWFkb25seSBwZXJtaXNzaW9uVHlwZTogUGVybWlzc2lvblR5cGVzO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHBsdWdpbiBhZG1pbmlzdHJhdGlvbiBpcyBlbmFibGVkIGluIHRoZSB3b3Jrc3BhY2UuIFNldHRpbmcgdG8gdHJ1ZSBhbGxvd3Mgd29ya3NwYWNlXG4gICAqIGFkbWlucyB0byBpbnN0YWxsLCB1bmluc3RhbGwsIGFuZCB1cGRhdGUgcGx1Z2lucyBmcm9tIHdpdGhpbiB0aGUgR3JhZmFuYSB3b3Jrc3BhY2UuXG4gICAqXG4gICAqIFRoaXMgb3B0aW9uIGlzIG9ubHkgdmFsaWQgZm9yIHdvcmtzcGFjZXMgdGhhdCBzdXBwb3J0IEdyYWZhbmEgdmVyc2lvbiA5IG9yIG5ld2VyLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luQWRtaW5FbmFibGVkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIElBTSByb2xlIHRoYXQgZ3JhbnRzIHBlcm1pc3Npb25zIHRvIHRoZSBBV1MgcmVzb3VyY2VzIHRoYXQgdGhlIHdvcmtzcGFjZSB3aWxsIHZpZXcgZGF0YVxuICAgKiBmcm9tLlxuICAgKi9cbiAgcmVhZG9ubHkgcm9sZT86IElSb2xlO1xuXG4gIC8qKlxuICAgKiBJZiB0aGUgd29ya3NwYWNlIHVzZXMgU0FNTCwgdXNlIHRoaXMgc3RydWN0dXJlIHRvIG1hcCBTQU1MIGFzc2VydGlvbiBhdHRyaWJ1dGVzIHRvIHdvcmtzcGFjZVxuICAgKiB1c2VyIGluZm9ybWF0aW9uIGFuZCBkZWZpbmUgd2hpY2ggZ3JvdXBzIGluIHRoZSBhc3NlcnRpb24gYXR0cmlidXRlIGFyZSB0byBoYXZlIHRoZSBBZG1pbiBhbmRcbiAgICogRWRpdG9yIHJvbGVzIGluIHRoZSB3b3Jrc3BhY2UuXG4gICAqL1xuICByZWFkb25seSBzYW1sQ29uZmlndXJhdGlvbj86IFNhbWxDb25maWd1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgQVdTIENsb3VkRm9ybWF0aW9uIHN0YWNrIHNldCB0aGF0IGlzIHVzZWQgdG8gZ2VuZXJhdGUgSUFNIHJvbGVzIHRvIGJlIHVzZWQgZm9yXG4gICAqIHRoaXMgd29ya3NwYWNlLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RhY2tTZXROYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgY29uZmlndXJhdGlvbiBzZXR0aW5ncyBmb3IgYW4gQW1hem9uIFZQQyB0aGF0IGNvbnRhaW5zIGRhdGEgc291cmNlcyBmb3IgeW91ciBHcmFmYW5hXG4gICAqIHdvcmtzcGFjZSB0byBjb25uZWN0IHRvLlxuICAgKi9cbiAgcmVhZG9ubHkgdnBjQ29uZmlndXJhdGlvbj86IFZwY0NvbmZpZ3VyYXRpb247XG5cbiAgLyoqXG4gICAqIFRoZSB1bmlxdWUgSUQgb2YgdGhpcyB3b3Jrc3BhY2UuXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IHdvcmtzcGFjZUlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBBUk4gb2YgdGhpcyB3b3Jrc3BhY2VcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgd29ya3NwYWNlQXJuOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBXb3Jrc3BhY2VCYXNlIGV4dGVuZHMgUmVzb3VyY2UgaW1wbGVtZW50cyBJV29ya3NwYWNlIHtcblxuICAvKipcbiAgICogVGhlIGFjY291bnQgYWNjZXNzIHR5cGUgZm9yIHRoZSB3b3Jrc3BhY2UuXG4gICAqL1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgYWNjb3VudEFjY2Vzc1R5cGU6IEFjY291bnRBY2Nlc3NUeXBlO1xuXG4gIC8qKlxuICAgKiBUaGUgYXV0aGVudGljYXRpb24gcHJvdmlkZXJzIGZvciB0aGUgd29ya3NwYWNlLlxuICAgKi9cbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IGF1dGhlbnRpY2F0aW9uUHJvdmlkZXJzOiBBdXRoZW50aWNhdGlvblByb3ZpZGVyc1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgY2xpZW50IHRva2VuIGZvciB0aGUgd29ya3NwYWNlLlxuICAgKi9cbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IGNsaWVudFRva2VuPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZGF0YSBzb3VyY2VzIG9mIHRoaXMgd29ya3NwYWNlXG4gICAqL1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgZGF0YVNvdXJjZXM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogVGhlIGRlc2NyaXB0aW9uIG9mIHRoaXMgd29ya3NwYWNlXG4gICAqL1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoaXMgd29ya3NwYWNlXG4gICAqL1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgbmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MgZm9yIG5ldHdvcmsgYWNjZXNzIHRvIHlvdXIgd29ya3NwYWNlLlxuICAgKi9cbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IG5ldHdvcmtBY2Nlc3NDb250cm9sPzogTmV0d29ya0FjY2Vzc0NvbnRyb2w7XG5cbiAgLyoqXG4gICAqIFRoZSBub3RpZmljYXRpb24gZGVzdGluYXRpb25zIGZvciB0aGUgd29ya3NwYWNlLlxuICAgKi9cbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IG5vdGlmaWNhdGlvbkRlc3RpbmF0aW9ucz86IE5vdGlmaWNhdGlvbkRlc3RpbmF0aW9uc1tdO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgdGhlIG9yZ2FuaXphdGlvbmFsIHVuaXRzIHRoYXQgdGhpcyB3b3Jrc3BhY2UgaXMgYWxsb3dlZCB0byB1c2UgZGF0YSBzb3VyY2VzIGZyb20sIGlmXG4gICAqIHRoaXMgd29ya3NwYWNlIGlzIGluIGFuIGFjY291bnQgdGhhdCBpcyBwYXJ0IG9mIGFuIG9yZ2FuaXphdGlvbi5cbiAgICovXG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSBvcmdhbml6YXRpb25hbFVuaXRzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBJQU0gcm9sZSB0aGF0IGlzIHVzZWQgdG8gYWNjZXNzIHJlc291cmNlcyB0aHJvdWdoIE9yZ2FuaXphdGlvbnMuXG4gICAqL1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgb3JnYW5pemF0aW9uUm9sZU5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBwZXJtaXNzaW9uIHR5cGUgZm9yIHRoZSB3b3Jrc3BhY2UuXG4gICAqL1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgcGVybWlzc2lvblR5cGU6IFBlcm1pc3Npb25UeXBlcztcblxuICAvKipcbiAgICogV2hldGhlciBwbHVnaW4gYWRtaW5pc3RyYXRpb24gaXMgZW5hYmxlZCBpbiB0aGUgd29ya3NwYWNlLiBTZXR0aW5nIHRvIHRydWUgYWxsb3dzIHdvcmtzcGFjZVxuICAgKiBhZG1pbnMgdG8gaW5zdGFsbCwgdW5pbnN0YWxsLCBhbmQgdXBkYXRlIHBsdWdpbnMgZnJvbSB3aXRoaW4gdGhlIEdyYWZhbmEgd29ya3NwYWNlLlxuICAgKlxuICAgKiBUaGlzIG9wdGlvbiBpcyBvbmx5IHZhbGlkIGZvciB3b3Jrc3BhY2VzIHRoYXQgc3VwcG9ydCBHcmFmYW5hIHZlcnNpb24gOSBvciBuZXdlci5cbiAgICovXG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSBwbHVnaW5BZG1pbkVuYWJsZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgSUFNIHJvbGUgdGhhdCBncmFudHMgcGVybWlzc2lvbnMgdG8gdGhlIEFXUyByZXNvdXJjZXMgdGhhdCB0aGUgd29ya3NwYWNlIHdpbGwgdmlldyBkYXRhXG4gICAqIGZyb20uXG4gICAqL1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgcm9sZT86IElSb2xlO1xuXG4gIC8qKlxuICAgKiBJZiB0aGUgd29ya3NwYWNlIHVzZXMgU0FNTCwgdXNlIHRoaXMgc3RydWN0dXJlIHRvIG1hcCBTQU1MIGFzc2VydGlvbiBhdHRyaWJ1dGVzIHRvIHdvcmtzcGFjZVxuICAgKiB1c2VyIGluZm9ybWF0aW9uIGFuZCBkZWZpbmUgd2hpY2ggZ3JvdXBzIGluIHRoZSBhc3NlcnRpb24gYXR0cmlidXRlIGFyZSB0byBoYXZlIHRoZSBBZG1pbiBhbmRcbiAgICogRWRpdG9yIHJvbGVzIGluIHRoZSB3b3Jrc3BhY2UuXG4gICAqL1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgc2FtbENvbmZpZ3VyYXRpb24/OiBTYW1sQ29uZmlndXJhdGlvbjtcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIEFXUyBDbG91ZEZvcm1hdGlvbiBzdGFjayBzZXQgdGhhdCBpcyB1c2VkIHRvIGdlbmVyYXRlIElBTSByb2xlcyB0byBiZSB1c2VkIGZvclxuICAgKiB0aGlzIHdvcmtzcGFjZS5cbiAgICovXG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSBzdGFja1NldE5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBjb25maWd1cmF0aW9uIHNldHRpbmdzIGZvciBhbiBBbWF6b24gVlBDIHRoYXQgY29udGFpbnMgZGF0YSBzb3VyY2VzIGZvciB5b3VyIEdyYWZhbmFcbiAgICogd29ya3NwYWNlIHRvIGNvbm5lY3QgdG8uXG4gICAqL1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgdnBjQ29uZmlndXJhdGlvbj86IFZwY0NvbmZpZ3VyYXRpb247XG5cbiAgLyoqXG4gICAqIFRoZSB1bmlxdWUgSUQgb2YgdGhpcyB3b3Jrc3BhY2UuXG4gICAqL1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgd29ya3NwYWNlSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIEFSTiBvZiB0aGlzIHdvcmtzcGFjZVxuICAgKi9cbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IHdvcmtzcGFjZUFybjogc3RyaW5nO1xuXG4gIHByb3RlY3RlZCBnZXRXb3Jrc3BhY2VBcm4od29ya3NwYWNlSWQ6IHN0cmluZykge1xuICAgIGNvbnN0IHN0YWNrID0gdGhpcy5zdGFjaztcbiAgICByZXR1cm4gYGFybjoke3N0YWNrLnBhcnRpdGlvbn06Z3JhZmFuYToke3N0YWNrLnJlZ2lvbn06JHtzdGFjay5hY2NvdW50fTp3b3Jrc3BhY2VzLyR7d29ya3NwYWNlSWR9YDtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRXb3Jrc3BhY2VJZCh3b3Jrc3BhY2VBcm46IHN0cmluZykge1xuICAgIHJldHVybiB3b3Jrc3BhY2VBcm4uc3Vic3RyaW5nKHdvcmtzcGFjZUFybi5sYXN0SW5kZXhPZignLycpICsgMSk7XG4gIH1cbn0iXX0=