aws-cdk 2.1024.0 → 2.1026.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +143 -0
- package/THIRD_PARTY_LICENSES +142 -164
- package/build-info.json +2 -2
- package/db.json.gz +0 -0
- package/lib/api/bootstrap/bootstrap-template.yaml +152 -22
- package/lib/cli/cdk-toolkit.d.ts +9 -1
- package/lib/cli/cdk-toolkit.js +26 -9
- package/lib/cli/cli-config.js +8 -2
- package/lib/cli/cli-type-registry.json +37 -2
- package/lib/cli/cli.js +6 -2
- package/lib/cli/convert-to-user-input.js +13 -1
- package/lib/cli/parse-command-line-arguments.js +41 -2
- package/lib/cli/user-input.d.ts +39 -0
- package/lib/cli/user-input.js +1 -1
- package/lib/commands/flag-operations.d.ts +19 -1
- package/lib/commands/flag-operations.js +310 -98
- package/lib/commands/init/init.js +12 -8
- package/lib/index.js +7225 -3709
- package/lib/index_bg.wasm +0 -0
- package/lib/init-templates/.init-version.json +1 -1
- package/lib/init-templates/app/typescript/tsconfig.json +1 -0
- package/lib/init-templates/lib/typescript/tsconfig.json +1 -0
- package/lib/init-templates/sample-app/javascript/tsconfig.json +1 -0
- package/lib/init-templates/sample-app/typescript/tsconfig.json +1 -0
- package/package.json +16 -15
|
@@ -5,128 +5,224 @@ exports.displayFlags = displayFlags;
|
|
|
5
5
|
const path = require("path");
|
|
6
6
|
const toolkit_lib_1 = require("@aws-cdk/toolkit-lib");
|
|
7
7
|
const chalk = require("chalk");
|
|
8
|
+
// @ts-ignore
|
|
9
|
+
const enquirer_1 = require("enquirer");
|
|
8
10
|
const fs = require("fs-extra");
|
|
9
11
|
const api_1 = require("../api");
|
|
12
|
+
const obsolete_flags_1 = require("../obsolete-flags");
|
|
13
|
+
var FlagsMenuOptions;
|
|
14
|
+
(function (FlagsMenuOptions) {
|
|
15
|
+
FlagsMenuOptions["ALL_TO_RECOMMENDED"] = "Set all flags to recommended values";
|
|
16
|
+
FlagsMenuOptions["UNCONFIGURED_TO_RECOMMENDED"] = "Set unconfigured flags to recommended values";
|
|
17
|
+
FlagsMenuOptions["UNCONFIGURED_TO_DEFAULT"] = "Set unconfigured flags to their implied configuration (record current behavior)";
|
|
18
|
+
FlagsMenuOptions["MODIFY_SPECIFIC_FLAG"] = "Modify a specific flag";
|
|
19
|
+
FlagsMenuOptions["EXIT"] = "Exit";
|
|
20
|
+
})(FlagsMenuOptions || (FlagsMenuOptions = {}));
|
|
10
21
|
async function handleFlags(flagData, ioHelper, options, toolkit) {
|
|
22
|
+
flagData = flagData.filter(flag => !obsolete_flags_1.OBSOLETE_FLAGS.includes(flag.name));
|
|
23
|
+
if (flagData.length == 0) {
|
|
24
|
+
await ioHelper.defaults.error('The \'cdk flags\' command is not compatible with the AWS CDK library used by your application. Please upgrade to 2.212.0 or above.');
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
let params = {
|
|
28
|
+
flagData,
|
|
29
|
+
toolkit,
|
|
30
|
+
ioHelper,
|
|
31
|
+
recommended: options.recommended,
|
|
32
|
+
all: options.all,
|
|
33
|
+
value: options.value,
|
|
34
|
+
flagName: options.FLAGNAME,
|
|
35
|
+
default: options.default,
|
|
36
|
+
unconfigured: options.unconfigured,
|
|
37
|
+
};
|
|
38
|
+
const interactiveOptions = Object.values(FlagsMenuOptions);
|
|
39
|
+
if (options.interactive) {
|
|
40
|
+
const prompt = new enquirer_1.Select({
|
|
41
|
+
name: 'option',
|
|
42
|
+
message: 'Menu',
|
|
43
|
+
choices: interactiveOptions,
|
|
44
|
+
});
|
|
45
|
+
const answer = await prompt.run();
|
|
46
|
+
if (answer == FlagsMenuOptions.ALL_TO_RECOMMENDED) {
|
|
47
|
+
params = {
|
|
48
|
+
...params,
|
|
49
|
+
recommended: true,
|
|
50
|
+
all: true,
|
|
51
|
+
};
|
|
52
|
+
await setMultipleFlags(params);
|
|
53
|
+
}
|
|
54
|
+
else if (answer == FlagsMenuOptions.UNCONFIGURED_TO_RECOMMENDED) {
|
|
55
|
+
params = {
|
|
56
|
+
...params,
|
|
57
|
+
recommended: true,
|
|
58
|
+
unconfigured: true,
|
|
59
|
+
};
|
|
60
|
+
await setMultipleFlags(params);
|
|
61
|
+
}
|
|
62
|
+
else if (answer == FlagsMenuOptions.UNCONFIGURED_TO_DEFAULT) {
|
|
63
|
+
params = {
|
|
64
|
+
...params,
|
|
65
|
+
default: true,
|
|
66
|
+
unconfigured: true,
|
|
67
|
+
};
|
|
68
|
+
await setMultipleFlags(params);
|
|
69
|
+
}
|
|
70
|
+
else if (answer == FlagsMenuOptions.MODIFY_SPECIFIC_FLAG) {
|
|
71
|
+
await setFlag(params, true);
|
|
72
|
+
}
|
|
73
|
+
else if (answer == FlagsMenuOptions.EXIT) {
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
11
78
|
if (options.FLAGNAME && options.all) {
|
|
12
79
|
await ioHelper.defaults.error('Error: Cannot use both --all and a specific flag name. Please use either --all to show all flags or specify a single flag name.');
|
|
13
80
|
return;
|
|
14
81
|
}
|
|
15
|
-
if (options.
|
|
16
|
-
await ioHelper.defaults.error('Error:
|
|
82
|
+
if ((options.value || options.recommended || options.default || options.unconfigured) && !options.set) {
|
|
83
|
+
await ioHelper.defaults.error('Error: This option can only be used with --set.');
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
if (options.value && !options.FLAGNAME) {
|
|
87
|
+
await ioHelper.defaults.error('Error: --value requires a specific flag name. Please specify a flag name when providing a value.');
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
if (options.recommended && options.default) {
|
|
91
|
+
await ioHelper.defaults.error('Error: Cannot use both --recommended and --default. Please choose one option.');
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
if (options.unconfigured && options.all) {
|
|
95
|
+
await ioHelper.defaults.error('Error: Cannot use both --unconfigured and --all. Please choose one option.');
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
if (options.unconfigured && options.FLAGNAME) {
|
|
99
|
+
await ioHelper.defaults.error('Error: Cannot use --unconfigured with a specific flag name. --unconfigured works on multiple flags.');
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
if (options.set && options.FLAGNAME && !options.value) {
|
|
103
|
+
await ioHelper.defaults.error('Error: When setting a specific flag, you must provide a --value.');
|
|
17
104
|
return;
|
|
18
105
|
}
|
|
19
|
-
if (options.set && !options.
|
|
20
|
-
await ioHelper.defaults.error('Error: --set
|
|
106
|
+
if (options.set && options.all && !options.recommended && !options.default) {
|
|
107
|
+
await ioHelper.defaults.error('Error: When using --set with --all, you must specify either --recommended or --default.');
|
|
21
108
|
return;
|
|
22
109
|
}
|
|
23
|
-
if (options.set && !options.
|
|
24
|
-
await ioHelper.defaults.error('Error: --set
|
|
110
|
+
if (options.set && options.unconfigured && !options.recommended && !options.default) {
|
|
111
|
+
await ioHelper.defaults.error('Error: When using --set with --unconfigured, you must specify either --recommended or --default.');
|
|
25
112
|
return;
|
|
26
113
|
}
|
|
27
114
|
if (options.FLAGNAME && !options.set && !options.value) {
|
|
28
|
-
await displayFlags(
|
|
115
|
+
await displayFlags(params);
|
|
29
116
|
return;
|
|
30
117
|
}
|
|
31
118
|
if (options.all && !options.set) {
|
|
32
|
-
await displayFlags(
|
|
119
|
+
await displayFlags(params);
|
|
33
120
|
return;
|
|
34
121
|
}
|
|
35
|
-
if (options.set && options.FLAGNAME
|
|
36
|
-
await
|
|
122
|
+
if (options.set && options.FLAGNAME && options.value) {
|
|
123
|
+
await setFlag(params);
|
|
37
124
|
return;
|
|
38
125
|
}
|
|
39
126
|
if (!options.FLAGNAME && !options.all && !options.set) {
|
|
40
|
-
await displayFlags(
|
|
127
|
+
await displayFlags(params);
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
if (options.set && options.all && options.recommended) {
|
|
131
|
+
await setMultipleFlags(params);
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
if (options.set && options.all && options.default) {
|
|
135
|
+
await setMultipleFlags(params);
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
if (options.set && options.unconfigured && options.recommended) {
|
|
139
|
+
await setMultipleFlags(params);
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
if (options.set && options.unconfigured && options.default) {
|
|
143
|
+
await setMultipleFlags(params);
|
|
144
|
+
return;
|
|
41
145
|
}
|
|
42
146
|
}
|
|
43
|
-
async function
|
|
44
|
-
|
|
45
|
-
|
|
147
|
+
async function setFlag(params, interactive) {
|
|
148
|
+
const { flagData, ioHelper, flagName } = params;
|
|
149
|
+
let updatedParams = params;
|
|
150
|
+
let updatedFlagName = flagName;
|
|
151
|
+
if (interactive) {
|
|
152
|
+
const allFlagNames = flagData.filter(flag => isBooleanFlag(flag) == true).map(flag => flag.name);
|
|
153
|
+
const prompt = new enquirer_1.Select({
|
|
154
|
+
name: 'flag',
|
|
155
|
+
message: 'Select which flag you would like to modify:',
|
|
156
|
+
limit: 100,
|
|
157
|
+
choices: allFlagNames,
|
|
158
|
+
});
|
|
159
|
+
const selectedFlagName = await prompt.run();
|
|
160
|
+
updatedFlagName = [selectedFlagName];
|
|
161
|
+
const valuePrompt = new enquirer_1.Select({
|
|
162
|
+
name: 'value',
|
|
163
|
+
message: 'Select a value:',
|
|
164
|
+
choices: ['true', 'false'],
|
|
165
|
+
});
|
|
166
|
+
const updatedValue = await valuePrompt.run();
|
|
167
|
+
updatedParams = {
|
|
168
|
+
...params,
|
|
169
|
+
value: updatedValue,
|
|
170
|
+
flagName: updatedFlagName,
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
const flag = flagData.find(f => f.name === flagName[0]);
|
|
46
175
|
if (!flag) {
|
|
47
176
|
await ioHelper.defaults.error('Flag not found.');
|
|
48
177
|
return;
|
|
49
178
|
}
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
return;
|
|
54
|
-
}
|
|
55
|
-
const headers = ['Feature Flag Name', 'Recommended Value', 'User Value'];
|
|
56
|
-
const rows = [];
|
|
57
|
-
const getFlagPriority = (flag) => {
|
|
58
|
-
if (flag.userValue === undefined) {
|
|
59
|
-
return 3;
|
|
60
|
-
}
|
|
61
|
-
else if (String(flag.userValue) === String(flag.recommendedValue)) {
|
|
62
|
-
return 1;
|
|
63
|
-
}
|
|
64
|
-
else {
|
|
65
|
-
return 2;
|
|
179
|
+
if (!isBooleanFlag(flag)) {
|
|
180
|
+
await ioHelper.defaults.error(`Flag '${flagName}' is not a boolean flag. Only boolean flags are currently supported.`);
|
|
181
|
+
return;
|
|
66
182
|
}
|
|
67
|
-
};
|
|
68
|
-
let flagsToDisplay;
|
|
69
|
-
if (all) {
|
|
70
|
-
flagsToDisplay = flagsData;
|
|
71
183
|
}
|
|
72
|
-
|
|
73
|
-
|
|
184
|
+
const prototypeSuccess = await prototypeChanges(updatedParams, updatedFlagName);
|
|
185
|
+
if (prototypeSuccess) {
|
|
186
|
+
await handleUserResponse(updatedParams, updatedFlagName);
|
|
74
187
|
}
|
|
75
|
-
const sortedFlags = [...flagsToDisplay].sort((a, b) => {
|
|
76
|
-
const priorityA = getFlagPriority(a);
|
|
77
|
-
const priorityB = getFlagPriority(b);
|
|
78
|
-
if (priorityA !== priorityB) {
|
|
79
|
-
return priorityA - priorityB;
|
|
80
|
-
}
|
|
81
|
-
if (a.module !== b.module) {
|
|
82
|
-
return a.module.localeCompare(b.module);
|
|
83
|
-
}
|
|
84
|
-
return a.name.localeCompare(b.name);
|
|
85
|
-
});
|
|
86
|
-
let currentModule = '';
|
|
87
|
-
sortedFlags.forEach((flag) => {
|
|
88
|
-
if (flag.module !== currentModule) {
|
|
89
|
-
rows.push([chalk.bold(`Module: ${flag.module}`), '', '']);
|
|
90
|
-
currentModule = flag.module;
|
|
91
|
-
}
|
|
92
|
-
rows.push([
|
|
93
|
-
flag.name,
|
|
94
|
-
String(flag.recommendedValue),
|
|
95
|
-
flag.userValue === undefined ? '<unset>' : String(flag.userValue),
|
|
96
|
-
]);
|
|
97
|
-
});
|
|
98
|
-
const formattedTable = formatTable(headers, rows);
|
|
99
|
-
await ioHelper.defaults.info(formattedTable);
|
|
100
188
|
}
|
|
101
|
-
async function prototypeChanges(
|
|
102
|
-
const
|
|
103
|
-
if (!flag) {
|
|
104
|
-
await ioHelper.defaults.error('Flag not found.');
|
|
105
|
-
return;
|
|
106
|
-
}
|
|
107
|
-
if (typeof flag.recommendedValue !== 'boolean' && flag.recommendedValue !== 'true' && flag.recommendedValue !== 'false') {
|
|
108
|
-
await ioHelper.defaults.error(`Flag '${flagName}' is not a boolean flag. Only boolean flags are currently supported.`);
|
|
109
|
-
return;
|
|
110
|
-
}
|
|
189
|
+
async function prototypeChanges(params, flagNames) {
|
|
190
|
+
const { flagData, toolkit, ioHelper, recommended, value } = params;
|
|
111
191
|
const baseContext = new toolkit_lib_1.CdkAppMultiContext(process.cwd());
|
|
112
192
|
const baseContextValues = await baseContext.read();
|
|
113
193
|
const memoryContext = new toolkit_lib_1.MemoryContext(baseContextValues);
|
|
114
|
-
const boolValue = value.toLowerCase() === 'true';
|
|
115
|
-
if (baseContextValues[flagName] == boolValue) {
|
|
116
|
-
await ioHelper.defaults.error('Flag is already set to the specified value. No changes needed.');
|
|
117
|
-
return;
|
|
118
|
-
}
|
|
119
194
|
const cdkJson = await JSON.parse(await fs.readFile(path.join(process.cwd(), 'cdk.json'), 'utf-8'));
|
|
120
195
|
const app = cdkJson.app;
|
|
121
196
|
const source = await toolkit.fromCdkApp(app, {
|
|
122
197
|
contextStore: baseContext,
|
|
123
198
|
outdir: path.join(process.cwd(), 'original'),
|
|
124
199
|
});
|
|
125
|
-
const cx = await toolkit.synth(source);
|
|
126
|
-
const assembly = cx.cloudAssembly;
|
|
127
200
|
const updateObj = {};
|
|
128
|
-
|
|
201
|
+
const boolValue = toBooleanValue(value);
|
|
202
|
+
if (flagNames.length === 1 && value !== undefined) {
|
|
203
|
+
const flagName = flagNames[0];
|
|
204
|
+
if (baseContextValues[flagName] == boolValue) {
|
|
205
|
+
await ioHelper.defaults.info('Flag is already set to the specified value. No changes needed.');
|
|
206
|
+
return false;
|
|
207
|
+
}
|
|
208
|
+
updateObj[flagName] = boolValue;
|
|
209
|
+
}
|
|
210
|
+
else {
|
|
211
|
+
for (const flagName of flagNames) {
|
|
212
|
+
const flag = flagData.find(f => f.name === flagName);
|
|
213
|
+
if (!flag) {
|
|
214
|
+
await ioHelper.defaults.error(`Flag ${flagName} not found.`);
|
|
215
|
+
return false;
|
|
216
|
+
}
|
|
217
|
+
const newValue = recommended
|
|
218
|
+
? toBooleanValue(flag.recommendedValue)
|
|
219
|
+
: String(flag.unconfiguredBehavesLike?.v2) === 'true';
|
|
220
|
+
updateObj[flagName] = newValue;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
129
223
|
await memoryContext.update(updateObj);
|
|
224
|
+
const cx = await toolkit.synth(source);
|
|
225
|
+
const assembly = cx.cloudAssembly;
|
|
130
226
|
const modifiedSource = await toolkit.fromCdkApp(app, {
|
|
131
227
|
contextStore: memoryContext,
|
|
132
228
|
outdir: path.join(process.cwd(), 'temp'),
|
|
@@ -143,41 +239,70 @@ async function prototypeChanges(flagData, ioHelper, flagName, value, toolkit) {
|
|
|
143
239
|
},
|
|
144
240
|
});
|
|
145
241
|
}
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
242
|
+
return true;
|
|
243
|
+
}
|
|
244
|
+
async function setMultipleFlags(params) {
|
|
245
|
+
const { flagData, all } = params;
|
|
246
|
+
let flagsToSet;
|
|
247
|
+
if (all) {
|
|
248
|
+
flagsToSet = flagData.filter(flag => flag.userValue === undefined || !isUserValueEqualToRecommended(flag))
|
|
249
|
+
.filter(flag => isBooleanFlag(flag))
|
|
250
|
+
.map(flag => flag.name);
|
|
150
251
|
}
|
|
151
252
|
else {
|
|
152
|
-
|
|
253
|
+
flagsToSet = flagData.filter(flag => flag.userValue === undefined)
|
|
254
|
+
.filter(flag => isBooleanFlag(flag))
|
|
255
|
+
.map(flag => flag.name);
|
|
256
|
+
}
|
|
257
|
+
const prototypeSuccess = await prototypeChanges(params, flagsToSet);
|
|
258
|
+
if (prototypeSuccess) {
|
|
259
|
+
await handleUserResponse(params, flagsToSet);
|
|
153
260
|
}
|
|
154
|
-
const originalDir = path.join(process.cwd(), 'original');
|
|
155
|
-
const tempDir = path.join(process.cwd(), 'temp');
|
|
156
|
-
await fs.remove(originalDir);
|
|
157
|
-
await fs.remove(tempDir);
|
|
158
261
|
}
|
|
159
|
-
async function
|
|
160
|
-
|
|
262
|
+
async function handleUserResponse(params, flagNames) {
|
|
263
|
+
const { ioHelper } = params;
|
|
264
|
+
const userAccepted = await ioHelper.requestResponse({
|
|
161
265
|
time: new Date(),
|
|
162
266
|
level: 'info',
|
|
163
267
|
code: 'CDK_TOOLKIT_I9300',
|
|
164
268
|
message: 'Do you want to accept these changes?',
|
|
165
269
|
data: {
|
|
166
|
-
|
|
167
|
-
currentValue,
|
|
168
|
-
newValue,
|
|
270
|
+
flagNames,
|
|
169
271
|
responseDescription: 'Enter "y" to apply changes or "n" to cancel',
|
|
170
272
|
},
|
|
171
273
|
defaultResponse: false,
|
|
172
274
|
});
|
|
275
|
+
if (userAccepted) {
|
|
276
|
+
await modifyValues(params, flagNames);
|
|
277
|
+
await ioHelper.defaults.info('Flag value(s) updated successfully.');
|
|
278
|
+
}
|
|
279
|
+
else {
|
|
280
|
+
await ioHelper.defaults.info('Operation cancelled');
|
|
281
|
+
}
|
|
282
|
+
const originalDir = path.join(process.cwd(), 'original');
|
|
283
|
+
const tempDir = path.join(process.cwd(), 'temp');
|
|
284
|
+
await fs.remove(originalDir);
|
|
285
|
+
await fs.remove(tempDir);
|
|
173
286
|
}
|
|
174
|
-
async function modifyValues(
|
|
287
|
+
async function modifyValues(params, flagNames) {
|
|
288
|
+
const { flagData, ioHelper, value, recommended } = params;
|
|
175
289
|
const cdkJsonPath = path.join(process.cwd(), 'cdk.json');
|
|
176
290
|
const cdkJsonContent = await fs.readFile(cdkJsonPath, 'utf-8');
|
|
177
291
|
const cdkJson = JSON.parse(cdkJsonContent);
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
292
|
+
if (flagNames.length == 1) {
|
|
293
|
+
const boolValue = toBooleanValue(value);
|
|
294
|
+
cdkJson.context[String(flagNames[0])] = boolValue;
|
|
295
|
+
await ioHelper.defaults.info(`Setting flag '${flagNames}' to: ${boolValue}`);
|
|
296
|
+
}
|
|
297
|
+
else {
|
|
298
|
+
for (const flagName of flagNames) {
|
|
299
|
+
const flag = flagData.find(f => f.name === flagName);
|
|
300
|
+
const newValue = recommended
|
|
301
|
+
? toBooleanValue(flag.recommendedValue)
|
|
302
|
+
: String(flag.unconfiguredBehavesLike?.v2) === 'true';
|
|
303
|
+
cdkJson.context[flagName] = newValue;
|
|
304
|
+
}
|
|
305
|
+
}
|
|
181
306
|
await fs.writeFile(cdkJsonPath, JSON.stringify(cdkJson, null, 2), 'utf-8');
|
|
182
307
|
}
|
|
183
308
|
function formatTable(headers, rows) {
|
|
@@ -207,4 +332,91 @@ function formatTable(headers, rows) {
|
|
|
207
332
|
table += separator;
|
|
208
333
|
return table;
|
|
209
334
|
}
|
|
210
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmxhZy1vcGVyYXRpb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZmxhZy1vcGVyYXRpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBU0Esa0NBdUNDO0FBRUQsb0NBZ0VDO0FBbEhELDZCQUE2QjtBQUU3QixzREFBcUY7QUFDckYsK0JBQStCO0FBQy9CLCtCQUErQjtBQUMvQixnQ0FBZ0Q7QUFJekMsS0FBSyxVQUFVLFdBQVcsQ0FBQyxRQUF1QixFQUFFLFFBQWtCLEVBQUUsT0FBcUIsRUFBRSxPQUFnQjtJQUNwSCxJQUFJLE9BQU8sQ0FBQyxRQUFRLElBQUksT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3BDLE1BQU0sUUFBUSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsaUlBQWlJLENBQUMsQ0FBQztRQUNqSyxPQUFPO0lBQ1QsQ0FBQztJQUVELElBQUksT0FBTyxDQUFDLEdBQUcsSUFBSSxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDL0IsTUFBTSxRQUFRLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyx3R0FBd0csQ0FBQyxDQUFDO1FBQ3hJLE9BQU87SUFDVCxDQUFDO0lBRUQsSUFBSSxPQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3JDLE1BQU0sUUFBUSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsK0VBQStFLENBQUMsQ0FBQztRQUMvRyxPQUFPO0lBQ1QsQ0FBQztJQUVELElBQUksT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNsQyxNQUFNLFFBQVEsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLHVGQUF1RixDQUFDLENBQUM7UUFDdkgsT0FBTztJQUNULENBQUM7SUFFRCxJQUFJLE9BQU8sQ0FBQyxRQUFRLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3ZELE1BQU0sWUFBWSxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQ2pFLE9BQU87SUFDVCxDQUFDO0lBRUQsSUFBSSxPQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ2hDLE1BQU0sWUFBWSxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3hELE9BQU87SUFDVCxDQUFDO0lBRUQsSUFBSSxPQUFPLENBQUMsR0FBRyxJQUFJLE9BQU8sQ0FBQyxRQUFRLElBQUksT0FBTyxDQUFDLEtBQUssSUFBSSxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDekUsTUFBTSxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUUsT0FBTyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztRQUM3RixPQUFPO0lBQ1QsQ0FBQztJQUVELElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUN0RCxNQUFNLFlBQVksQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUMzRCxDQUFDO0FBQ0gsQ0FBQztBQUVNLEtBQUssVUFBVSxZQUFZLENBQUMsU0FBd0IsRUFBRSxRQUFrQixFQUFFLFFBQWlCLEVBQUUsR0FBYTtJQUMvRyxJQUFJLFFBQVEsSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ3BDLE1BQU0sSUFBSSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLFFBQVEsQ0FBQyxDQUFDO1FBQ3RELElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNWLE1BQU0sUUFBUSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUNqRCxPQUFPO1FBQ1QsQ0FBQztRQUVELE1BQU0sUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO1FBQ2pFLE1BQU0sUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLENBQUM7UUFDNUUsTUFBTSxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxlQUFlLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO1FBQzlELE9BQU87SUFDVCxDQUFDO0lBRUQsTUFBTSxPQUFPLEdBQUcsQ0FBQyxtQkFBbUIsRUFBRSxtQkFBbUIsRUFBRSxZQUFZLENBQUMsQ0FBQztJQUN6RSxNQUFNLElBQUksR0FBZSxFQUFFLENBQUM7SUFFNUIsTUFBTSxlQUFlLEdBQUcsQ0FBQyxJQUFpQixFQUFVLEVBQUU7UUFDcEQsSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ2pDLE9BQU8sQ0FBQyxDQUFDO1FBQ1gsQ0FBQzthQUFNLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQztZQUNwRSxPQUFPLENBQUMsQ0FBQztRQUNYLENBQUM7YUFBTSxDQUFDO1lBQ04sT0FBTyxDQUFDLENBQUM7UUFDWCxDQUFDO0lBQ0gsQ0FBQyxDQUFDO0lBRUYsSUFBSSxjQUE2QixDQUFDO0lBQ2xDLElBQUksR0FBRyxFQUFFLENBQUM7UUFDUixjQUFjLEdBQUcsU0FBUyxDQUFDO0lBQzdCLENBQUM7U0FBTSxDQUFDO1FBQ04sY0FBYyxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FDdkMsSUFBSSxDQUFDLFNBQVMsS0FBSyxTQUFTLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQ3pGLENBQUM7SUFDSixDQUFDO0lBRUQsTUFBTSxXQUFXLEdBQUcsQ0FBQyxHQUFHLGNBQWMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUNwRCxNQUFNLFNBQVMsR0FBRyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckMsTUFBTSxTQUFTLEdBQUcsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXJDLElBQUksU0FBUyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzVCLE9BQU8sU0FBUyxHQUFHLFNBQVMsQ0FBQztRQUMvQixDQUFDO1FBQ0QsSUFBSSxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUMxQixPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMxQyxDQUFDO1FBQ0QsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdEMsQ0FBQyxDQUFDLENBQUM7SUFFSCxJQUFJLGFBQWEsR0FBRyxFQUFFLENBQUM7SUFDdkIsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1FBQzNCLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxhQUFhLEVBQUUsQ0FBQztZQUNsQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxXQUFXLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzFELGFBQWEsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQzlCLENBQUM7UUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDO1lBQ1IsSUFBSSxDQUFDLElBQUk7WUFDVCxNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDO1lBQzdCLElBQUksQ0FBQyxTQUFTLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO1NBQ2xFLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsTUFBTSxjQUFjLEdBQUcsV0FBVyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNsRCxNQUFNLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0FBQy9DLENBQUM7QUFFRCxLQUFLLFVBQVUsZ0JBQWdCLENBQzdCLFFBQXVCLEVBQ3ZCLFFBQWtCLEVBQ2xCLFFBQWdCLEVBQ2hCLEtBQXlCLEVBQ3pCLE9BQWdCO0lBRWhCLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLFFBQVEsQ0FBQyxDQUFDO0lBQ3JELElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNWLE1BQU0sUUFBUSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUNqRCxPQUFPO0lBQ1QsQ0FBQztJQUVELElBQUksT0FBTyxJQUFJLENBQUMsZ0JBQWdCLEtBQUssU0FBUyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsS0FBSyxNQUFNLElBQUksSUFBSSxDQUFDLGdCQUFnQixLQUFLLE9BQU8sRUFBRSxDQUFDO1FBQ3hILE1BQU0sUUFBUSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsU0FBUyxRQUFRLHNFQUFzRSxDQUFDLENBQUM7UUFDdkgsT0FBTztJQUNULENBQUM7SUFFRCxNQUFNLFdBQVcsR0FBRyxJQUFJLGdDQUFrQixDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQzFELE1BQU0saUJBQWlCLEdBQUcsTUFBTSxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDbkQsTUFBTSxhQUFhLEdBQUcsSUFBSSwyQkFBYSxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFFM0QsTUFBTSxTQUFTLEdBQUcsS0FBTSxDQUFDLFdBQVcsRUFBRSxLQUFLLE1BQU0sQ0FBQztJQUVsRCxJQUFJLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxJQUFJLFNBQVMsRUFBRSxDQUFDO1FBQzdDLE1BQU0sUUFBUSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsZ0VBQWdFLENBQUMsQ0FBQztRQUNoRyxPQUFPO0lBQ1QsQ0FBQztJQUNELE1BQU0sT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsVUFBVSxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUNuRyxNQUFNLEdBQUcsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDO0lBRXhCLE1BQU0sTUFBTSxHQUFHLE1BQU0sT0FBTyxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUU7UUFDM0MsWUFBWSxFQUFFLFdBQVc7UUFDekIsTUFBTSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLFVBQVUsQ0FBQztLQUM3QyxDQUFDLENBQUM7SUFFSCxNQUFNLEVBQUUsR0FBRyxNQUFNLE9BQU8sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDdkMsTUFBTSxRQUFRLEdBQUcsRUFBRSxDQUFDLGFBQWEsQ0FBQztJQUVsQyxNQUFNLFNBQVMsR0FBNEIsRUFBRSxDQUFDO0lBQzlDLFNBQVMsQ0FBQyxRQUFRLENBQUMsR0FBRyxTQUFTLENBQUM7SUFDaEMsTUFBTSxhQUFhLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBRXRDLE1BQU0sY0FBYyxHQUFHLE1BQU0sT0FBTyxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUU7UUFDbkQsWUFBWSxFQUFFLGFBQWE7UUFDM0IsTUFBTSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLE1BQU0sQ0FBQztLQUN6QyxDQUFDLENBQUM7SUFFSCxNQUFNLFVBQVUsR0FBRyxNQUFNLE9BQU8sQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDdkQsTUFBTSxTQUFTLEdBQUcsUUFBUSxDQUFDLGlCQUFpQixDQUFDO0lBRTdDLEtBQUssTUFBTSxLQUFLLElBQUksU0FBUyxFQUFFLENBQUM7UUFDOUIsTUFBTSxZQUFZLEdBQUcsS0FBSyxDQUFDLGdCQUFnQixDQUFDO1FBQzVDLE1BQU0sT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDN0IsTUFBTSxFQUFFLHdCQUFVLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQztZQUMxQyxNQUFNLEVBQUU7Z0JBQ04sUUFBUSxFQUFFLDRCQUFzQixDQUFDLHlCQUF5QjtnQkFDMUQsUUFBUSxFQUFFLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQzthQUNqQztTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxNQUFNLFlBQVksR0FBRyxNQUFNLFVBQVUsQ0FDbkMsUUFBUSxFQUNSLFFBQVEsRUFDUixJQUFJLENBQUMsU0FBUyxFQUNkLEtBQUssRUFBRSxXQUFXLEVBQUUsS0FBSyxNQUFNLENBQ2hDLENBQUM7SUFFRixJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ2pCLE1BQU0sWUFBWSxDQUFDLFFBQVEsRUFBRSxLQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDL0MsTUFBTSxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDO0lBQ25FLENBQUM7U0FBTSxDQUFDO1FBQ04sTUFBTSxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFRCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUN6RCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUVqRCxNQUFNLEVBQUUsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDN0IsTUFBTSxFQUFFLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQzNCLENBQUM7QUFFRCxLQUFLLFVBQVUsVUFBVSxDQUN2QixRQUFrQixFQUNsQixRQUFnQixFQUNoQixZQUFxQixFQUNyQixRQUFpQjtJQUVqQixPQUFPLFFBQVEsQ0FBQyxlQUFlLENBQUM7UUFDOUIsSUFBSSxFQUFFLElBQUksSUFBSSxFQUFFO1FBQ2hCLEtBQUssRUFBRSxNQUFNO1FBQ2IsSUFBSSxFQUFFLG1CQUFtQjtRQUN6QixPQUFPLEVBQUUsc0NBQXNDO1FBQy9DLElBQUksRUFBRTtZQUNKLFFBQVE7WUFDUixZQUFZO1lBQ1osUUFBUTtZQUNSLG1CQUFtQixFQUFFLDZDQUE2QztTQUNuRTtRQUNELGVBQWUsRUFBRSxLQUFLO0tBQ3ZCLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRCxLQUFLLFVBQVUsWUFBWSxDQUFDLFFBQWdCLEVBQUUsS0FBYSxFQUFFLFFBQWtCO0lBQzdFLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ3pELE1BQU0sY0FBYyxHQUFHLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDL0QsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUUzQyxNQUFNLFNBQVMsR0FBRyxLQUFNLENBQUMsV0FBVyxFQUFFLEtBQUssTUFBTSxDQUFDO0lBQ2xELE9BQU8sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsU0FBUyxDQUFDO0lBRXRDLE1BQU0sUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLFFBQVEsU0FBUyxTQUFTLEVBQUUsQ0FBQyxDQUFDO0lBQzVFLE1BQU0sRUFBRSxDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQzdFLENBQUM7QUFFRCxTQUFTLFdBQVcsQ0FBQyxPQUFpQixFQUFFLElBQWdCO0lBQ3RELE1BQU0sWUFBWSxHQUFHO1FBQ25CLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDOUQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM5RCxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0tBQy9ELENBQUM7SUFFRixNQUFNLGVBQWUsR0FBRyxHQUFHLEVBQUU7UUFDM0IsT0FBTyxHQUFHLEdBQUcsWUFBWSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztJQUNoRixDQUFDLENBQUM7SUFFRixNQUFNLFNBQVMsR0FBRyxDQUFDLE1BQWdCLEVBQUUsRUFBRTtRQUNyQyxPQUFPLEdBQUcsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO0lBQzlGLENBQUMsQ0FBQztJQUVGLE1BQU0sU0FBUyxHQUFHLGVBQWUsRUFBRSxDQUFDO0lBQ3BDLElBQUksS0FBSyxHQUFHLFNBQVMsR0FBRyxJQUFJLENBQUM7SUFDN0IsS0FBSyxJQUFJLFNBQVMsQ0FBQyxPQUFPLENBQUMsR0FBRyxJQUFJLENBQUM7SUFDbkMsS0FBSyxJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUM7SUFFMUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTtRQUNqQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDO1lBQ25DLEtBQUssSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztRQUNuRCxDQUFDO2FBQU0sQ0FBQztZQUNOLEtBQUssSUFBSSxTQUFTLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBQ2pDLENBQUM7SUFDSCxDQUFDLENBQUMsQ0FBQztJQUVILEtBQUssSUFBSSxTQUFTLENBQUM7SUFDbkIsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB0eXBlIHsgRmVhdHVyZUZsYWcsIFRvb2xraXQgfSBmcm9tICdAYXdzLWNkay90b29sa2l0LWxpYic7XG5pbXBvcnQgeyBDZGtBcHBNdWx0aUNvbnRleHQsIE1lbW9yeUNvbnRleHQsIERpZmZNZXRob2QgfSBmcm9tICdAYXdzLWNkay90b29sa2l0LWxpYic7XG5pbXBvcnQgKiBhcyBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcy1leHRyYSc7XG5pbXBvcnQgeyBTdGFja1NlbGVjdGlvblN0cmF0ZWd5IH0gZnJvbSAnLi4vYXBpJztcbmltcG9ydCB0eXBlIHsgSW9IZWxwZXIgfSBmcm9tICcuLi9hcGktcHJpdmF0ZSc7XG5pbXBvcnQgdHlwZSB7IEZsYWdzT3B0aW9ucyB9IGZyb20gJy4uL2NsaS91c2VyLWlucHV0JztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGhhbmRsZUZsYWdzKGZsYWdEYXRhOiBGZWF0dXJlRmxhZ1tdLCBpb0hlbHBlcjogSW9IZWxwZXIsIG9wdGlvbnM6IEZsYWdzT3B0aW9ucywgdG9vbGtpdDogVG9vbGtpdCkge1xuICBpZiAob3B0aW9ucy5GTEFHTkFNRSAmJiBvcHRpb25zLmFsbCkge1xuICAgIGF3YWl0IGlvSGVscGVyLmRlZmF1bHRzLmVycm9yKCdFcnJvcjogQ2Fubm90IHVzZSBib3RoIC0tYWxsIGFuZCBhIHNwZWNpZmljIGZsYWcgbmFtZS4gUGxlYXNlIHVzZSBlaXRoZXIgLS1hbGwgdG8gc2hvdyBhbGwgZmxhZ3Mgb3Igc3BlY2lmeSBhIHNpbmdsZSBmbGFnIG5hbWUuJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMuc2V0ICYmIG9wdGlvbnMuYWxsKSB7XG4gICAgYXdhaXQgaW9IZWxwZXIuZGVmYXVsdHMuZXJyb3IoJ0Vycm9yOiAtLXNldCBpcyBjdXJyZW50bHkgb25seSBjb21wYXRpYmxlIHdpdGggYSBmbGFnIG5hbWUuIFBsZWFzZSBzcGVjaWZ5IHdoaWNoIGZsYWcgeW91IHdhbnQgdG8gc2V0LicpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChvcHRpb25zLnNldCAmJiAhb3B0aW9ucy5GTEFHTkFNRSkge1xuICAgIGF3YWl0IGlvSGVscGVyLmRlZmF1bHRzLmVycm9yKCdFcnJvcjogLS1zZXQgcmVxdWlyZXMgYSBmbGFnIG5hbWUuIFBsZWFzZSBzcGVjaWZ5IHdoaWNoIGZsYWcgeW91IHdhbnQgdG8gc2V0LicpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChvcHRpb25zLnNldCAmJiAhb3B0aW9ucy52YWx1ZSkge1xuICAgIGF3YWl0IGlvSGVscGVyLmRlZmF1bHRzLmVycm9yKCdFcnJvcjogLS1zZXQgcmVxdWlyZXMgYSB2YWx1ZS4gUGxlYXNlIHNwZWNpZnkgdGhlIHZhbHVlIHlvdSB3YW50IHRvIHNldCBmb3IgdGhlIGZsYWcuJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMuRkxBR05BTUUgJiYgIW9wdGlvbnMuc2V0ICYmICFvcHRpb25zLnZhbHVlKSB7XG4gICAgYXdhaXQgZGlzcGxheUZsYWdzKGZsYWdEYXRhLCBpb0hlbHBlciwgU3RyaW5nKG9wdGlvbnMuRkxBR05BTUUpKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAob3B0aW9ucy5hbGwgJiYgIW9wdGlvbnMuc2V0KSB7XG4gICAgYXdhaXQgZGlzcGxheUZsYWdzKGZsYWdEYXRhLCBpb0hlbHBlciwgdW5kZWZpbmVkLCB0cnVlKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAob3B0aW9ucy5zZXQgJiYgb3B0aW9ucy5GTEFHTkFNRSB8fCBvcHRpb25zLnZhbHVlICYmIG9wdGlvbnMuRkxBR05BTUUpIHtcbiAgICBhd2FpdCBwcm90b3R5cGVDaGFuZ2VzKGZsYWdEYXRhLCBpb0hlbHBlciwgU3RyaW5nKG9wdGlvbnMuRkxBR05BTUUpLCBvcHRpb25zLnZhbHVlLCB0b29sa2l0KTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoIW9wdGlvbnMuRkxBR05BTUUgJiYgIW9wdGlvbnMuYWxsICYmICFvcHRpb25zLnNldCkge1xuICAgIGF3YWl0IGRpc3BsYXlGbGFncyhmbGFnRGF0YSwgaW9IZWxwZXIsIHVuZGVmaW5lZCwgZmFsc2UpO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkaXNwbGF5RmxhZ3MoZmxhZ3NEYXRhOiBGZWF0dXJlRmxhZ1tdLCBpb0hlbHBlcjogSW9IZWxwZXIsIGZsYWdOYW1lPzogc3RyaW5nLCBhbGw/OiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChmbGFnTmFtZSAmJiBmbGFnTmFtZS5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgZmxhZyA9IGZsYWdzRGF0YS5maW5kKGYgPT4gZi5uYW1lID09PSBmbGFnTmFtZSk7XG4gICAgaWYgKCFmbGFnKSB7XG4gICAgICBhd2FpdCBpb0hlbHBlci5kZWZhdWx0cy5lcnJvcignRmxhZyBub3QgZm91bmQuJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgYXdhaXQgaW9IZWxwZXIuZGVmYXVsdHMuaW5mbyhgRGVzY3JpcHRpb246ICR7ZmxhZy5leHBsYW5hdGlvbn1gKTtcbiAgICBhd2FpdCBpb0hlbHBlci5kZWZhdWx0cy5pbmZvKGBSZWNvbW1lbmRlZCB2YWx1ZTogJHtmbGFnLnJlY29tbWVuZGVkVmFsdWV9YCk7XG4gICAgYXdhaXQgaW9IZWxwZXIuZGVmYXVsdHMuaW5mbyhgVXNlciB2YWx1ZTogJHtmbGFnLnVzZXJWYWx1ZX1gKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBoZWFkZXJzID0gWydGZWF0dXJlIEZsYWcgTmFtZScsICdSZWNvbW1lbmRlZCBWYWx1ZScsICdVc2VyIFZhbHVlJ107XG4gIGNvbnN0IHJvd3M6IHN0cmluZ1tdW10gPSBbXTtcblxuICBjb25zdCBnZXRGbGFnUHJpb3JpdHkgPSAoZmxhZzogRmVhdHVyZUZsYWcpOiBudW1iZXIgPT4ge1xuICAgIGlmIChmbGFnLnVzZXJWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gMztcbiAgICB9IGVsc2UgaWYgKFN0cmluZyhmbGFnLnVzZXJWYWx1ZSkgPT09IFN0cmluZyhmbGFnLnJlY29tbWVuZGVkVmFsdWUpKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIDI7XG4gICAgfVxuICB9O1xuXG4gIGxldCBmbGFnc1RvRGlzcGxheTogRmVhdHVyZUZsYWdbXTtcbiAgaWYgKGFsbCkge1xuICAgIGZsYWdzVG9EaXNwbGF5ID0gZmxhZ3NEYXRhO1xuICB9IGVsc2Uge1xuICAgIGZsYWdzVG9EaXNwbGF5ID0gZmxhZ3NEYXRhLmZpbHRlcihmbGFnID0+XG4gICAgICBmbGFnLnVzZXJWYWx1ZSA9PT0gdW5kZWZpbmVkIHx8IFN0cmluZyhmbGFnLnVzZXJWYWx1ZSkgIT09IFN0cmluZyhmbGFnLnJlY29tbWVuZGVkVmFsdWUpLFxuICAgICk7XG4gIH1cblxuICBjb25zdCBzb3J0ZWRGbGFncyA9IFsuLi5mbGFnc1RvRGlzcGxheV0uc29ydCgoYSwgYikgPT4ge1xuICAgIGNvbnN0IHByaW9yaXR5QSA9IGdldEZsYWdQcmlvcml0eShhKTtcbiAgICBjb25zdCBwcmlvcml0eUIgPSBnZXRGbGFnUHJpb3JpdHkoYik7XG5cbiAgICBpZiAocHJpb3JpdHlBICE9PSBwcmlvcml0eUIpIHtcbiAgICAgIHJldHVybiBwcmlvcml0eUEgLSBwcmlvcml0eUI7XG4gICAgfVxuICAgIGlmIChhLm1vZHVsZSAhPT0gYi5tb2R1bGUpIHtcbiAgICAgIHJldHVybiBhLm1vZHVsZS5sb2NhbGVDb21wYXJlKGIubW9kdWxlKTtcbiAgICB9XG4gICAgcmV0dXJuIGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSk7XG4gIH0pO1xuXG4gIGxldCBjdXJyZW50TW9kdWxlID0gJyc7XG4gIHNvcnRlZEZsYWdzLmZvckVhY2goKGZsYWcpID0+IHtcbiAgICBpZiAoZmxhZy5tb2R1bGUgIT09IGN1cnJlbnRNb2R1bGUpIHtcbiAgICAgIHJvd3MucHVzaChbY2hhbGsuYm9sZChgTW9kdWxlOiAke2ZsYWcubW9kdWxlfWApLCAnJywgJyddKTtcbiAgICAgIGN1cnJlbnRNb2R1bGUgPSBmbGFnLm1vZHVsZTtcbiAgICB9XG4gICAgcm93cy5wdXNoKFtcbiAgICAgIGZsYWcubmFtZSxcbiAgICAgIFN0cmluZyhmbGFnLnJlY29tbWVuZGVkVmFsdWUpLFxuICAgICAgZmxhZy51c2VyVmFsdWUgPT09IHVuZGVmaW5lZCA/ICc8dW5zZXQ+JyA6IFN0cmluZyhmbGFnLnVzZXJWYWx1ZSksXG4gICAgXSk7XG4gIH0pO1xuXG4gIGNvbnN0IGZvcm1hdHRlZFRhYmxlID0gZm9ybWF0VGFibGUoaGVhZGVycywgcm93cyk7XG4gIGF3YWl0IGlvSGVscGVyLmRlZmF1bHRzLmluZm8oZm9ybWF0dGVkVGFibGUpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBwcm90b3R5cGVDaGFuZ2VzKFxuICBmbGFnRGF0YTogRmVhdHVyZUZsYWdbXSxcbiAgaW9IZWxwZXI6IElvSGVscGVyLFxuICBmbGFnTmFtZTogc3RyaW5nLFxuICB2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICB0b29sa2l0OiBUb29sa2l0LFxuKSB7XG4gIGNvbnN0IGZsYWcgPSBmbGFnRGF0YS5maW5kKGYgPT4gZi5uYW1lID09PSBmbGFnTmFtZSk7XG4gIGlmICghZmxhZykge1xuICAgIGF3YWl0IGlvSGVscGVyLmRlZmF1bHRzLmVycm9yKCdGbGFnIG5vdCBmb3VuZC4nKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAodHlwZW9mIGZsYWcucmVjb21tZW5kZWRWYWx1ZSAhPT0gJ2Jvb2xlYW4nICYmIGZsYWcucmVjb21tZW5kZWRWYWx1ZSAhPT0gJ3RydWUnICYmIGZsYWcucmVjb21tZW5kZWRWYWx1ZSAhPT0gJ2ZhbHNlJykge1xuICAgIGF3YWl0IGlvSGVscGVyLmRlZmF1bHRzLmVycm9yKGBGbGFnICcke2ZsYWdOYW1lfScgaXMgbm90IGEgYm9vbGVhbiBmbGFnLiBPbmx5IGJvb2xlYW4gZmxhZ3MgYXJlIGN1cnJlbnRseSBzdXBwb3J0ZWQuYCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgYmFzZUNvbnRleHQgPSBuZXcgQ2RrQXBwTXVsdGlDb250ZXh0KHByb2Nlc3MuY3dkKCkpO1xuICBjb25zdCBiYXNlQ29udGV4dFZhbHVlcyA9IGF3YWl0IGJhc2VDb250ZXh0LnJlYWQoKTtcbiAgY29uc3QgbWVtb3J5Q29udGV4dCA9IG5ldyBNZW1vcnlDb250ZXh0KGJhc2VDb250ZXh0VmFsdWVzKTtcblxuICBjb25zdCBib29sVmFsdWUgPSB2YWx1ZSEudG9Mb3dlckNhc2UoKSA9PT0gJ3RydWUnO1xuXG4gIGlmIChiYXNlQ29udGV4dFZhbHVlc1tmbGFnTmFtZV0gPT0gYm9vbFZhbHVlKSB7XG4gICAgYXdhaXQgaW9IZWxwZXIuZGVmYXVsdHMuZXJyb3IoJ0ZsYWcgaXMgYWxyZWFkeSBzZXQgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZS4gTm8gY2hhbmdlcyBuZWVkZWQuJyk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IGNka0pzb24gPSBhd2FpdCBKU09OLnBhcnNlKGF3YWl0IGZzLnJlYWRGaWxlKHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCAnY2RrLmpzb24nKSwgJ3V0Zi04JykpO1xuICBjb25zdCBhcHAgPSBjZGtKc29uLmFwcDtcblxuICBjb25zdCBzb3VyY2UgPSBhd2FpdCB0b29sa2l0LmZyb21DZGtBcHAoYXBwLCB7XG4gICAgY29udGV4dFN0b3JlOiBiYXNlQ29udGV4dCxcbiAgICBvdXRkaXI6IHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCAnb3JpZ2luYWwnKSxcbiAgfSk7XG5cbiAgY29uc3QgY3ggPSBhd2FpdCB0b29sa2l0LnN5bnRoKHNvdXJjZSk7XG4gIGNvbnN0IGFzc2VtYmx5ID0gY3guY2xvdWRBc3NlbWJseTtcblxuICBjb25zdCB1cGRhdGVPYmo6IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+ID0ge307XG4gIHVwZGF0ZU9ialtmbGFnTmFtZV0gPSBib29sVmFsdWU7XG4gIGF3YWl0IG1lbW9yeUNvbnRleHQudXBkYXRlKHVwZGF0ZU9iaik7XG5cbiAgY29uc3QgbW9kaWZpZWRTb3VyY2UgPSBhd2FpdCB0b29sa2l0LmZyb21DZGtBcHAoYXBwLCB7XG4gICAgY29udGV4dFN0b3JlOiBtZW1vcnlDb250ZXh0LFxuICAgIG91dGRpcjogcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksICd0ZW1wJyksXG4gIH0pO1xuXG4gIGNvbnN0IG1vZGlmaWVkQ3ggPSBhd2FpdCB0b29sa2l0LnN5bnRoKG1vZGlmaWVkU291cmNlKTtcbiAgY29uc3QgYWxsU3RhY2tzID0gYXNzZW1ibHkuc3RhY2tzUmVjdXJzaXZlbHk7XG5cbiAgZm9yIChjb25zdCBzdGFjayBvZiBhbGxTdGFja3MpIHtcbiAgICBjb25zdCB0ZW1wbGF0ZVBhdGggPSBzdGFjay50ZW1wbGF0ZUZ1bGxQYXRoO1xuICAgIGF3YWl0IHRvb2xraXQuZGlmZihtb2RpZmllZEN4LCB7XG4gICAgICBtZXRob2Q6IERpZmZNZXRob2QuTG9jYWxGaWxlKHRlbXBsYXRlUGF0aCksXG4gICAgICBzdGFja3M6IHtcbiAgICAgICAgc3RyYXRlZ3k6IFN0YWNrU2VsZWN0aW9uU3RyYXRlZ3kuUEFUVEVSTl9NVVNUX01BVENIX1NJTkdMRSxcbiAgICAgICAgcGF0dGVybnM6IFtzdGFjay5oaWVyYXJjaGljYWxJZF0sXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgY29uc3QgdXNlckFjY2VwdGVkID0gYXdhaXQgcHJvbXB0VXNlcihcbiAgICBpb0hlbHBlcixcbiAgICBmbGFnTmFtZSxcbiAgICBmbGFnLnVzZXJWYWx1ZSxcbiAgICB2YWx1ZT8udG9Mb3dlckNhc2UoKSA9PT0gJ3RydWUnLFxuICApO1xuXG4gIGlmICh1c2VyQWNjZXB0ZWQpIHtcbiAgICBhd2FpdCBtb2RpZnlWYWx1ZXMoZmxhZ05hbWUsIHZhbHVlISwgaW9IZWxwZXIpO1xuICAgIGF3YWl0IGlvSGVscGVyLmRlZmF1bHRzLmluZm8oJ0ZsYWcgdmFsdWUgdXBkYXRlZCBzdWNjZXNzZnVsbHkuJyk7XG4gIH0gZWxzZSB7XG4gICAgYXdhaXQgaW9IZWxwZXIuZGVmYXVsdHMuaW5mbygnT3BlcmF0aW9uIGNhbmNlbGxlZCcpO1xuICB9XG5cbiAgY29uc3Qgb3JpZ2luYWxEaXIgPSBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgJ29yaWdpbmFsJyk7XG4gIGNvbnN0IHRlbXBEaXIgPSBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgJ3RlbXAnKTtcblxuICBhd2FpdCBmcy5yZW1vdmUob3JpZ2luYWxEaXIpO1xuICBhd2FpdCBmcy5yZW1vdmUodGVtcERpcik7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHByb21wdFVzZXIoXG4gIGlvSGVscGVyOiBJb0hlbHBlcixcbiAgZmxhZ05hbWU6IHN0cmluZyxcbiAgY3VycmVudFZhbHVlOiB1bmtub3duLFxuICBuZXdWYWx1ZTogYm9vbGVhbixcbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICByZXR1cm4gaW9IZWxwZXIucmVxdWVzdFJlc3BvbnNlKHtcbiAgICB0aW1lOiBuZXcgRGF0ZSgpLFxuICAgIGxldmVsOiAnaW5mbycsXG4gICAgY29kZTogJ0NES19UT09MS0lUX0k5MzAwJyxcbiAgICBtZXNzYWdlOiAnRG8geW91IHdhbnQgdG8gYWNjZXB0IHRoZXNlIGNoYW5nZXM/JyxcbiAgICBkYXRhOiB7XG4gICAgICBmbGFnTmFtZSxcbiAgICAgIGN1cnJlbnRWYWx1ZSxcbiAgICAgIG5ld1ZhbHVlLFxuICAgICAgcmVzcG9uc2VEZXNjcmlwdGlvbjogJ0VudGVyIFwieVwiIHRvIGFwcGx5IGNoYW5nZXMgb3IgXCJuXCIgdG8gY2FuY2VsJyxcbiAgICB9LFxuICAgIGRlZmF1bHRSZXNwb25zZTogZmFsc2UsXG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBtb2RpZnlWYWx1ZXMoZmxhZ05hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZywgaW9IZWxwZXI6IElvSGVscGVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGNka0pzb25QYXRoID0gcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksICdjZGsuanNvbicpO1xuICBjb25zdCBjZGtKc29uQ29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKGNka0pzb25QYXRoLCAndXRmLTgnKTtcbiAgY29uc3QgY2RrSnNvbiA9IEpTT04ucGFyc2UoY2RrSnNvbkNvbnRlbnQpO1xuXG4gIGNvbnN0IGJvb2xWYWx1ZSA9IHZhbHVlIS50b0xvd2VyQ2FzZSgpID09PSAndHJ1ZSc7XG4gIGNka0pzb24uY29udGV4dFtmbGFnTmFtZV0gPSBib29sVmFsdWU7XG5cbiAgYXdhaXQgaW9IZWxwZXIuZGVmYXVsdHMuaW5mbyhgU2V0dGluZyBmbGFnICcke2ZsYWdOYW1lfScgdG86ICR7Ym9vbFZhbHVlfWApO1xuICBhd2FpdCBmcy53cml0ZUZpbGUoY2RrSnNvblBhdGgsIEpTT04uc3RyaW5naWZ5KGNka0pzb24sIG51bGwsIDIpLCAndXRmLTgnKTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0VGFibGUoaGVhZGVyczogc3RyaW5nW10sIHJvd3M6IHN0cmluZ1tdW10pOiBzdHJpbmcge1xuICBjb25zdCBjb2x1bW5XaWR0aHMgPSBbXG4gICAgTWF0aC5tYXgoaGVhZGVyc1swXS5sZW5ndGgsIC4uLnJvd3MubWFwKHJvdyA9PiByb3dbMF0ubGVuZ3RoKSksXG4gICAgTWF0aC5tYXgoaGVhZGVyc1sxXS5sZW5ndGgsIC4uLnJvd3MubWFwKHJvdyA9PiByb3dbMV0ubGVuZ3RoKSksXG4gICAgTWF0aC5tYXgoaGVhZGVyc1syXS5sZW5ndGgsIC4uLnJvd3MubWFwKHJvdyA9PiByb3dbMl0ubGVuZ3RoKSksXG4gIF07XG5cbiAgY29uc3QgY3JlYXRlU2VwYXJhdG9yID0gKCkgPT4ge1xuICAgIHJldHVybiAnKycgKyBjb2x1bW5XaWR0aHMubWFwKHdpZHRoID0+ICctJy5yZXBlYXQod2lkdGggKyAyKSkuam9pbignKycpICsgJysnO1xuICB9O1xuXG4gIGNvbnN0IGZvcm1hdFJvdyA9ICh2YWx1ZXM6IHN0cmluZ1tdKSA9PiB7XG4gICAgcmV0dXJuICd8JyArIHZhbHVlcy5tYXAoKHZhbHVlLCBpKSA9PiBgICR7dmFsdWUucGFkRW5kKGNvbHVtbldpZHRoc1tpXSl9IGApLmpvaW4oJ3wnKSArICd8JztcbiAgfTtcblxuICBjb25zdCBzZXBhcmF0b3IgPSBjcmVhdGVTZXBhcmF0b3IoKTtcbiAgbGV0IHRhYmxlID0gc2VwYXJhdG9yICsgJ1xcbic7XG4gIHRhYmxlICs9IGZvcm1hdFJvdyhoZWFkZXJzKSArICdcXG4nO1xuICB0YWJsZSArPSBzZXBhcmF0b3IgKyAnXFxuJztcblxuICByb3dzLmZvckVhY2gocm93ID0+IHtcbiAgICBpZiAocm93WzFdID09PSAnJyAmJiByb3dbMl0gPT09ICcnKSB7XG4gICAgICB0YWJsZSArPSBgICR7cm93WzBdLnBhZEVuZChjb2x1bW5XaWR0aHNbMF0pfSBcXG5gO1xuICAgIH0gZWxzZSB7XG4gICAgICB0YWJsZSArPSBmb3JtYXRSb3cocm93KSArICdcXG4nO1xuICAgIH1cbiAgfSk7XG5cbiAgdGFibGUgKz0gc2VwYXJhdG9yO1xuICByZXR1cm4gdGFibGU7XG59XG4iXX0=
|
|
335
|
+
function getFlagSortOrder(flag) {
|
|
336
|
+
if (flag.userValue === undefined) {
|
|
337
|
+
return 3;
|
|
338
|
+
}
|
|
339
|
+
else if (isUserValueEqualToRecommended(flag)) {
|
|
340
|
+
return 1;
|
|
341
|
+
}
|
|
342
|
+
else {
|
|
343
|
+
return 2;
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
async function displayFlagTable(flags, ioHelper) {
|
|
347
|
+
const headers = ['Feature Flag Name', 'Recommended Value', 'User Value'];
|
|
348
|
+
const sortedFlags = [...flags].sort((a, b) => {
|
|
349
|
+
const orderA = getFlagSortOrder(a);
|
|
350
|
+
const orderB = getFlagSortOrder(b);
|
|
351
|
+
if (orderA !== orderB) {
|
|
352
|
+
return orderA - orderB;
|
|
353
|
+
}
|
|
354
|
+
if (a.module !== b.module) {
|
|
355
|
+
return a.module.localeCompare(b.module);
|
|
356
|
+
}
|
|
357
|
+
return a.name.localeCompare(b.name);
|
|
358
|
+
});
|
|
359
|
+
const rows = [];
|
|
360
|
+
let currentModule = '';
|
|
361
|
+
sortedFlags.forEach((flag) => {
|
|
362
|
+
if (flag.module !== currentModule) {
|
|
363
|
+
rows.push([chalk.bold(`Module: ${flag.module}`), '', '']);
|
|
364
|
+
currentModule = flag.module;
|
|
365
|
+
}
|
|
366
|
+
rows.push([
|
|
367
|
+
flag.name,
|
|
368
|
+
String(flag.recommendedValue),
|
|
369
|
+
flag.userValue === undefined ? '<unset>' : String(flag.userValue),
|
|
370
|
+
]);
|
|
371
|
+
});
|
|
372
|
+
const formattedTable = formatTable(headers, rows);
|
|
373
|
+
await ioHelper.defaults.info(formattedTable);
|
|
374
|
+
}
|
|
375
|
+
async function displayFlags(params) {
|
|
376
|
+
const { flagData, ioHelper, flagName, all } = params;
|
|
377
|
+
if (flagName && flagName.length > 0) {
|
|
378
|
+
const matchingFlags = flagData.filter(f => flagName.some(searchTerm => f.name.toLowerCase().includes(searchTerm.toLowerCase())));
|
|
379
|
+
if (matchingFlags.length === 0) {
|
|
380
|
+
await ioHelper.defaults.error(`Flag matching "${flagName.join(', ')}" not found.`);
|
|
381
|
+
return;
|
|
382
|
+
}
|
|
383
|
+
if (matchingFlags.length === 1) {
|
|
384
|
+
const flag = matchingFlags[0];
|
|
385
|
+
await ioHelper.defaults.info(`Flag name: ${flag.name}`);
|
|
386
|
+
await ioHelper.defaults.info(`Description: ${flag.explanation}`);
|
|
387
|
+
await ioHelper.defaults.info(`Recommended value: ${flag.recommendedValue}`);
|
|
388
|
+
await ioHelper.defaults.info(`User value: ${flag.userValue}`);
|
|
389
|
+
return;
|
|
390
|
+
}
|
|
391
|
+
await ioHelper.defaults.info(`Found ${matchingFlags.length} flags matching "${flagName.join(', ')}":`);
|
|
392
|
+
await displayFlagTable(matchingFlags, ioHelper);
|
|
393
|
+
return;
|
|
394
|
+
}
|
|
395
|
+
let flagsToDisplay;
|
|
396
|
+
if (all) {
|
|
397
|
+
flagsToDisplay = flagData;
|
|
398
|
+
}
|
|
399
|
+
else {
|
|
400
|
+
flagsToDisplay = flagData.filter(flag => flag.userValue === undefined || !isUserValueEqualToRecommended(flag));
|
|
401
|
+
}
|
|
402
|
+
await displayFlagTable(flagsToDisplay, ioHelper);
|
|
403
|
+
}
|
|
404
|
+
function isUserValueEqualToRecommended(flag) {
|
|
405
|
+
return String(flag.userValue) === String(flag.recommendedValue);
|
|
406
|
+
}
|
|
407
|
+
function toBooleanValue(value) {
|
|
408
|
+
if (typeof value === 'boolean') {
|
|
409
|
+
return value;
|
|
410
|
+
}
|
|
411
|
+
if (typeof value === 'string') {
|
|
412
|
+
return value.toLowerCase() === 'true';
|
|
413
|
+
}
|
|
414
|
+
return false;
|
|
415
|
+
}
|
|
416
|
+
function isBooleanFlag(flag) {
|
|
417
|
+
const recommended = flag.recommendedValue;
|
|
418
|
+
return typeof recommended === 'boolean' ||
|
|
419
|
+
recommended === 'true' ||
|
|
420
|
+
recommended === 'false';
|
|
421
|
+
}
|
|
422
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmxhZy1vcGVyYXRpb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZmxhZy1vcGVyYXRpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBNENBLGtDQStJQztBQThRRCxvQ0FxQ0M7QUE5ZUQsNkJBQTZCO0FBRTdCLHNEQUFxRjtBQUNyRiwrQkFBK0I7QUFDL0IsYUFBYTtBQUNiLHVDQUFrQztBQUNsQywrQkFBK0I7QUFDL0IsZ0NBQWdEO0FBR2hELHNEQUFtRDtBQUVuRCxJQUFLLGdCQU1KO0FBTkQsV0FBSyxnQkFBZ0I7SUFDbkIsOEVBQTBELENBQUE7SUFDMUQsZ0dBQTRFLENBQUE7SUFDNUUsK0hBQTJHLENBQUE7SUFDM0csbUVBQStDLENBQUE7SUFDL0MsaUNBQWEsQ0FBQTtBQUNmLENBQUMsRUFOSSxnQkFBZ0IsS0FBaEIsZ0JBQWdCLFFBTXBCO0FBMEJNLEtBQUssVUFBVSxXQUFXLENBQUMsUUFBdUIsRUFBRSxRQUFrQixFQUFFLE9BQXFCLEVBQUUsT0FBZ0I7SUFDcEgsUUFBUSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLCtCQUFjLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBRXhFLElBQUksUUFBUSxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUN6QixNQUFNLFFBQVEsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLG9JQUFvSSxDQUFDLENBQUM7UUFDcEssT0FBTztJQUNULENBQUM7SUFFRCxJQUFJLE1BQU0sR0FBRztRQUNYLFFBQVE7UUFDUixPQUFPO1FBQ1AsUUFBUTtRQUNSLFdBQVcsRUFBRSxPQUFPLENBQUMsV0FBVztRQUNoQyxHQUFHLEVBQUUsT0FBTyxDQUFDLEdBQUc7UUFDaEIsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLO1FBQ3BCLFFBQVEsRUFBRSxPQUFPLENBQUMsUUFBUTtRQUMxQixPQUFPLEVBQUUsT0FB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WUFBWSxHQUFHO1FBQ25CLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDOUQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM5RCxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0tBQy9ELENBQUM7SUFFRixNQUFNLGVBQWUsR0FBRyxHQUFHLEVBQUU7UUFDM0IsT0FBTyxHQUFHLEdBQUcsWUFBWSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztJQUNoRixDQUFDLENBQUM7SUFFRixNQUFNLFNBQVMsR0FBRyxDQUFDLE1BQWdCLEVBQUUsRUFBRTtRQUNyQyxPQUFPLEdBQUcsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO0lBQzlGLENBQUMsQ0FBQztJQUVGLE1BQU0sU0FBUyxH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QztJQUNELElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDOUIsT0FBTyxLQUFLLENBQUMsV0FBVyxFQUFFLEtBQUssTUFBTSxDQUFDO0lBQ3hDLENBQUM7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFFRCxTQUFTLGFBQWEsQ0FBQyxJQUFpQjtJQUN0QyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7SUFDMUMsT0FBTyxPQUFPLFdBQVcsS0FBSyxTQUFTO1FBQ3JDLFdBQVcsS0FBSyxNQUFNO1FBQ3RCLFdBQVcsS0FBSyxPQUFPLENBQUM7QUFDNUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgdHlwZSB7IEZlYXR1cmVGbGFnLCBUb29sa2l0IH0gZnJvbSAnQGF3cy1jZGsvdG9vbGtpdC1saWInO1xuaW1wb3J0IHsgQ2RrQXBwTXVsdGlDb250ZXh0LCBNZW1vcnlDb250ZXh0LCBEaWZmTWV0aG9kIH0gZnJvbSAnQGF3cy1jZGsvdG9vbGtpdC1saWInO1xuaW1wb3J0ICogYXMgY2hhbGsgZnJvbSAnY2hhbGsnO1xuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgU2VsZWN0IH0gZnJvbSAnZW5xdWlyZXInO1xuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMtZXh0cmEnO1xuaW1wb3J0IHsgU3RhY2tTZWxlY3Rpb25TdHJhdGVneSB9IGZyb20gJy4uL2FwaSc7XG5pbXBvcnQgdHlwZSB7IElvSGVscGVyIH0gZnJvbSAnLi4vYXBpLXByaXZhdGUnO1xuaW1wb3J0IHR5cGUgeyBGbGFnc09wdGlvbnMgfSBmcm9tICcuLi9jbGkvdXNlci1pbnB1dCc7XG5pbXBvcnQgeyBPQlNPTEVURV9GTEFHUyB9IGZyb20gJy4uL29ic29sZXRlLWZsYWdzJztcblxuZW51bSBGbGFnc01lbnVPcHRpb25zIHtcbiAgQUxMX1RPX1JFQ09NTUVOREVEID0gJ1NldCBhbGwgZmxhZ3MgdG8gcmVjb21tZW5kZWQgdmFsdWVzJyxcbiAgVU5DT05GSUdVUkVEX1RPX1JFQ09NTUVOREVEID0gJ1NldCB1bmNvbmZpZ3VyZWQgZmxhZ3MgdG8gcmVjb21tZW5kZWQgdmFsdWVzJyxcbiAgVU5DT05GSUdVUkVEX1RPX0RFRkFVTFQgPSAnU2V0IHVuY29uZmlndXJlZCBmbGFncyB0byB0aGVpciBpbXBsaWVkIGNvbmZpZ3VyYXRpb24gKHJlY29yZCBjdXJyZW50IGJlaGF2aW9yKScsXG4gIE1PRElGWV9TUEVDSUZJQ19GTEFHID0gJ01vZGlmeSBhIHNwZWNpZmljIGZsYWcnLFxuICBFWElUID0gJ0V4aXQnLFxufVxuXG5pbnRlcmZhY2UgRmxhZ09wZXJhdGlvbnNQYXJhbXMge1xuICBmbGFnRGF0YTogRmVhdHVyZUZsYWdbXTtcbiAgdG9vbGtpdDogVG9vbGtpdDtcbiAgaW9IZWxwZXI6IElvSGVscGVyO1xuXG4gIC8qKiBVc2VyIHJhbiAtLXJlY29tbWVuZGVkIG9wdGlvbiAqL1xuICByZWNvbW1lbmRlZD86IGJvb2xlYW47XG5cbiAgLyoqIFVzZXIgcmFuIC0tYWxsIG9wdGlvbiAqL1xuICBhbGw/OiBib29sZWFuO1xuXG4gIC8qKiBVc2VyIHByb3ZpZGVkIC0tdmFsdWUgZmllbGQgKi9cbiAgdmFsdWU/OiBzdHJpbmc7XG5cbiAgLyoqIFVzZXIgcHJvdmlkZWQgRkxBR05BTUUgZmllbGQgKi9cbiAgZmxhZ05hbWU/OiBzdHJpbmdbXTtcblxuICAvKiogVXNlciByYW4gLS1kZWZhdWx0IG9wdGlvbiAqL1xuICBkZWZhdWx0PzogYm9vbGVhbjtcblxuICAvKiogVXNlciByYW4gLS11bmNvbmZpZ3VyZWQgb3B0aW9uICovXG4gIHVuY29uZmlndXJlZD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBoYW5kbGVGbGFncyhmbGFnRGF0YTogRmVhdHVyZUZsYWdbXSwgaW9IZWxwZXI6IElvSGVscGVyLCBvcHRpb25zOiBGbGFnc09wdGlvbnMsIHRvb2xraXQ6IFRvb2xraXQpIHtcbiAgZmxhZ0RhdGEgPSBmbGFnRGF0YS5maWx0ZXIoZmxhZyA9PiAhT0JTT0xFVEVfRkxBR1MuaW5jbHVkZXMoZmxhZy5uYW1lKSk7XG5cbiAgaWYgKGZsYWdEYXRhLmxlbmd0aCA9PSAwKSB7XG4gICAgYXdhaXQgaW9IZWxwZXIuZGVmYXVsdHMuZXJyb3IoJ1RoZSBcXCdjZGsgZmxhZ3NcXCcgY29tbWFuZCBpcyBub3QgY29tcGF0aWJsZSB3aXRoIHRoZSBBV1MgQ0RLIGxpYnJhcnkgdXNlZCBieSB5b3VyIGFwcGxpY2F0aW9uLiBQbGVhc2UgdXBncmFkZSB0byAyLjIxMi4wIG9yIGFib3ZlLicpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxldCBwYXJhbXMgPSB7XG4gICAgZmxhZ0RhdGEsXG4gICAgdG9vbGtpdCxcbiAgICBpb0hlbHBlcixcbiAgICByZWNvbW1lbmRlZDogb3B0aW9ucy5yZWNvbW1lbmRlZCxcbiAgICBhbGw6IG9wdGlvbnMuYWxsLFxuICAgIHZhbHVlOiBvcHRpb25zLnZhbHVlLFxuICAgIGZsYWdOYW1lOiBvcHRpb25zLkZMQUdOQU1FLFxuICAgIGRlZmF1bHQ6IG9wdGlvbnMuZGVmYXVsdCxcbiAgICB1bmNvbmZpZ3VyZWQ6IG9wdGlvbnMudW5jb25maWd1cmVkLFxuICB9O1xuXG4gIGNvbnN0IGludGVyYWN0aXZlT3B0aW9ucyA9IE9iamVjdC52YWx1ZXMoRmxhZ3NNZW51T3B0aW9ucyk7XG5cbiAgaWYgKG9wdGlvbnMuaW50ZXJhY3RpdmUpIHtcbiAgICBjb25zdCBwcm9tcHQgPSBuZXcgU2VsZWN0KHtcbiAgICAgIG5hbWU6ICdvcHRpb24nLFxuICAgICAgbWVzc2FnZTogJ01lbnUnLFxuICAgICAgY2hvaWNlczogaW50ZXJhY3RpdmVPcHRpb25zLFxuICAgIH0pO1xuXG4gICAgY29uc3QgYW5zd2VyID0gYXdhaXQgcHJvbXB0LnJ1bigpO1xuICAgIGlmIChhbnN3ZXIgPT0gRmxhZ3NNZW51T3B0aW9ucy5BTExfVE9fUkVDT01NRU5ERUQpIHtcbiAgICAgIHBhcmFtcyA9IHtcbiAgICAgICAgLi4ucGFyYW1zLFxuICAgICAgICByZWNvbW1lbmRlZDogdHJ1ZSxcbiAgICAgICAgYWxsOiB0cnVlLFxuICAgICAgfTtcbiAgICAgIGF3YWl0IHNldE11bHRpcGxlRmxhZ3MocGFyYW1zKTtcbiAgICB9IGVsc2UgaWYgKGFuc3dlciA9PSBGbGFnc01lbnVPcHRpb25zLlVOQ09ORklHVVJFRF9UT19SRUNPTU1FTkRFRCkge1xuICAgICAgcGFyYW1zID0ge1xuICAgICAgICAuLi5wYXJhbXMsXG4gICAgICAgIHJlY29tbWVuZGVkOiB0cnVlLFxuICAgICAgICB1bmNvbmZpZ3VyZWQ6IHRydWUsXG4gICAgICB9O1xuICAgICAgYXdhaXQgc2V0TXVsdGlwbGVGbGFncyhwYXJhbXMpO1xuICAgIH0gZWxzZSBpZiAoYW5zd2VyID09IEZsYWdzTWVudU9wdGlvbnMuVU5DT05GSUdVUkVEX1RPX0RFRkFVTFQpIHtcbiAgICAgIHBhcmFtcyA9IHtcbiAgICAgICAgLi4ucGFyYW1zLFxuICAgICAgICBkZWZhdWx0OiB0cnVlLFxuICAgICAgICB1bmNvbmZpZ3VyZWQ6IHRydWUsXG4gICAgICB9O1xuICAgICAgYXdhaXQgc2V0TXVsdGlwbGVGbGFncyhwYXJhbXMpO1xuICAgIH0gZWxzZSBpZiAoYW5zd2VyID09IEZsYWdzTWVudU9wdGlvbnMuTU9ESUZZX1NQRUNJRklDX0ZMQUcpIHtcbiAgICAgIGF3YWl0IHNldEZsYWcocGFyYW1zLCB0cnVlKTtcbiAgICB9IGVsc2UgaWYgKGFuc3dlciA9PSBGbGFnc01lbnVPcHRpb25zLkVYSVQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMuRkxBR05BTUUgJiYgb3B0aW9ucy5hbGwpIHtcbiAgICBhd2FpdCBpb0hlbHBlci5kZWZhdWx0cy5lcnJvcignRXJyb3I6IENhbm5vdCB1c2UgYm90aCAtLWFsbCBhbmQgYSBzcGVjaWZpYyBmbGFnIG5hbWUuIFBsZWFzZSB1c2UgZWl0aGVyIC0tYWxsIHRvIHNob3cgYWxsIGZsYWdzIG9yIHNwZWNpZnkgYSBzaW5nbGUgZmxhZyBuYW1lLicpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmICgob3B0aW9ucy52YWx1ZSB8fCBvcHRpb25zLnJlY29tbWVuZGVkIHx8IG9wdGlvbnMuZGVmYXVsdCB8fCBvcHRpb25zLnVuY29uZmlndXJlZCkgJiYgIW9wdGlvbnMuc2V0KSB7XG4gICAgYXdhaXQgaW9IZWxwZXIuZGVmYXVsdHMuZXJyb3IoJ0Vycm9yOiBUaGlzIG9wdGlvbiBjYW4gb25seSBiZSB1c2VkIHdpdGggLS1zZXQuJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMudmFsdWUgJiYgIW9wdGlvbnMuRkxBR05BTUUpIHtcbiAgICBhd2FpdCBpb0hlbHBlci5kZWZhdWx0cy5lcnJvcignRXJyb3I6IC0tdmFsdWUgcmVxdWlyZXMgYSBzcGVjaWZpYyBmbGFnIG5hbWUuIFBsZWFzZSBzcGVjaWZ5IGEgZmxhZyBuYW1lIHdoZW4gcHJvdmlkaW5nIGEgdmFsdWUuJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMucmVjb21tZW5kZWQgJiYgb3B0aW9ucy5kZWZhdWx0KSB7XG4gICAgYXdhaXQgaW9IZWxwZXIuZGVmYXVsdHMuZXJyb3IoJ0Vycm9yOiBDYW5ub3QgdXNlIGJvdGggLS1yZWNvbW1lbmRlZCBhbmQgLS1kZWZhdWx0LiBQbGVhc2UgY2hvb3NlIG9uZSBvcHRpb24uJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMudW5jb25maWd1cmVkICYmIG9wdGlvbnMuYWxsKSB7XG4gICAgYXdhaXQgaW9IZWxwZXIuZGVmYXVsdHMuZXJyb3IoJ0Vycm9yOiBDYW5ub3QgdXNlIGJvdGggLS11bmNvbmZpZ3VyZWQgYW5kIC0tYWxsLiBQbGVhc2UgY2hvb3NlIG9uZSBvcHRpb24uJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMudW5jb25maWd1cmVkICYmIG9wdGlvbnMuRkxBR05BTUUpIHtcbiAgICBhd2FpdCBpb0hlbHBlci5kZWZhdWx0cy5lcnJvcignRXJyb3I6IENhbm5vdCB1c2UgLS11bmNvbmZpZ3VyZWQgd2l0aCBhIHNwZWNpZmljIGZsYWcgbmFtZS4gLS11bmNvbmZpZ3VyZWQgd29ya3Mgb24gbXVsdGlwbGUgZmxhZ3MuJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMuc2V0ICYmIG9wdGlvbnMuRkxBR05BTUUgJiYgIW9wdGlvbnMudmFsdWUpIHtcbiAgICBhd2FpdCBpb0hlbHBlci5kZWZhdWx0cy5lcnJvcignRXJyb3I6IFdoZW4gc2V0dGluZyBhIHNwZWNpZmljIGZsYWcsIHlvdSBtdXN0IHByb3ZpZGUgYSAtLXZhbHVlLicpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChvcHRpb25zLnNldCAmJiBvcHRpb25zLmFsbCAmJiAhb3B0aW9ucy5yZWNvbW1lbmRlZCAmJiAhb3B0aW9ucy5kZWZhdWx0KSB7XG4gICAgYXdhaXQgaW9IZWxwZXIuZGVmYXVsdHMuZXJyb3IoJ0Vycm9yOiBXaGVuIHVzaW5nIC0tc2V0IHdpdGggLS1hbGwsIHlvdSBtdXN0IHNwZWNpZnkgZWl0aGVyIC0tcmVjb21tZW5kZWQgb3IgLS1kZWZhdWx0LicpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChvcHRpb25zLnNldCAmJiBvcHRpb25zLnVuY29uZmlndXJlZCAmJiAhb3B0aW9ucy5yZWNvbW1lbmRlZCAmJiAhb3B0aW9ucy5kZWZhdWx0KSB7XG4gICAgYXdhaXQgaW9IZWxwZXIuZGVmYXVsdHMuZXJyb3IoJ0Vycm9yOiBXaGVuIHVzaW5nIC0tc2V0IHdpdGggLS11bmNvbmZpZ3VyZWQsIHlvdSBtdXN0IHNwZWNpZnkgZWl0aGVyIC0tcmVjb21tZW5kZWQgb3IgLS1kZWZhdWx0LicpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChvcHRpb25zLkZMQUdOQU1FICYmICFvcHRpb25zLnNldCAmJiAhb3B0aW9ucy52YWx1ZSkge1xuICAgIGF3YWl0IGRpc3BsYXlGbGFncyhwYXJhbXMpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChvcHRpb25zLmFsbCAmJiAhb3B0aW9ucy5zZXQpIHtcbiAgICBhd2FpdCBkaXNwbGF5RmxhZ3MocGFyYW1zKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAob3B0aW9ucy5zZXQgJiYgb3B0aW9ucy5GTEFHTkFNRSAmJiBvcHRpb25zLnZhbHVlKSB7XG4gICAgYXdhaXQgc2V0RmxhZyhwYXJhbXMpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmICghb3B0aW9ucy5GTEFHTkFNRSAmJiAhb3B0aW9ucy5hbGwgJiYgIW9wdGlvbnMuc2V0KSB7XG4gICAgYXdhaXQgZGlzcGxheUZsYWdzKHBhcmFtcyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMuc2V0ICYmIG9wdGlvbnMuYWxsICYmIG9wdGlvbnMucmVjb21tZW5kZWQpIHtcbiAgICBhd2FpdCBzZXRNdWx0aXBsZUZsYWdzKHBhcmFtcyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMuc2V0ICYmIG9wdGlvbnMuYWxsICYmIG9wdGlvbnMuZGVmYXVsdCkge1xuICAgIGF3YWl0IHNldE11bHRpcGxlRmxhZ3MocGFyYW1zKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAob3B0aW9ucy5zZXQgJiYgb3B0aW9ucy51bmNvbmZpZ3VyZWQgJiYgb3B0aW9ucy5yZWNvbW1lbmRlZCkge1xuICAgIGF3YWl0IHNldE11bHRpcGxlRmxhZ3MocGFyYW1zKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAob3B0aW9ucy5zZXQgJiYgb3B0aW9ucy51bmNvbmZpZ3VyZWQgJiYgb3B0aW9ucy5kZWZhdWx0KSB7XG4gICAgYXdhaXQgc2V0TXVsdGlwbGVGbGFncyhwYXJhbXMpO1xuICAgIHJldHVybjtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBzZXRGbGFnKHBhcmFtczogRmxhZ09wZXJhdGlvbnNQYXJhbXMsIGludGVyYWN0aXZlPzogYm9vbGVhbikge1xuICBjb25zdCB7IGZsYWdEYXRhLCBpb0hlbHBlciwgZmxhZ05hbWUgfSA9IHBhcmFtcztcbiAgbGV0IHVwZGF0ZWRQYXJhbXMgPSBwYXJhbXM7XG4gIGxldCB1cGRhdGVkRmxhZ05hbWUgPSBmbGFnTmFtZTtcblxuICBpZiAoaW50ZXJhY3RpdmUpIHtcbiAgICBjb25zdCBhbGxGbGFnTmFtZXMgPSBmbGFnRGF0YS5maWx0ZXIoZmxhZyA9PiBpc0Jvb2xlYW5GbGFnKGZsYWcpID09IHRydWUpLm1hcChmbGFnID0+IGZsYWcubmFtZSk7XG5cbiAgICBjb25zdCBwcm9tcHQgPSBuZXcgU2VsZWN0KHtcbiAgICAgIG5hbWU6ICdmbGFnJyxcbiAgICAgIG1lc3NhZ2U6ICdTZWxlY3Qgd2hpY2ggZmxhZyB5b3Ugd291bGQgbGlrZSB0byBtb2RpZnk6JyxcbiAgICAgIGxpbWl0OiAxMDAsXG4gICAgICBjaG9pY2VzOiBhbGxGbGFnTmFtZXMsXG4gICAgfSk7XG5cbiAgICBjb25zdCBzZWxlY3RlZEZsYWdOYW1lID0gYXdhaXQgcHJvbXB0LnJ1bigpO1xuICAgIHVwZGF0ZWRGbGFnTmFtZSA9IFtzZWxlY3RlZEZsYWdOYW1lXTtcblxuICAgIGNvbnN0IHZhbHVlUHJvbXB0ID0gbmV3IFNlbGVjdCh7XG4gICAgICBuYW1lOiAndmFsdWUnLFxuICAgICAgbWVzc2FnZTogJ1NlbGVjdCBhIHZhbHVlOicsXG4gICAgICBjaG9pY2VzOiBbJ3RydWUnLCAnZmFsc2UnXSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHVwZGF0ZWRWYWx1ZSA9IGF3YWl0IHZhbHVlUHJvbXB0LnJ1bigpO1xuXG4gICAgdXBkYXRlZFBhcmFtcyA9IHtcbiAgICAgIC4uLnBhcmFtcyxcbiAgICAgIHZhbHVlOiB1cGRhdGVkVmFsdWUsXG4gICAgICBmbGFnTmFtZTogdXBkYXRlZEZsYWdOYW1lLFxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgZmxhZyA9IGZsYWdEYXRhLmZpbmQoZiA9PiBmLm5hbWUgPT09IGZsYWdOYW1lIVswXSk7XG5cbiAgICBpZiAoIWZsYWcpIHtcbiAgICAgIGF3YWl0IGlvSGVscGVyLmRlZmF1bHRzLmVycm9yKCdGbGFnIG5vdCBmb3VuZC4nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIWlzQm9vbGVhbkZsYWcoZmxhZykpIHtcbiAgICAgIGF3YWl0IGlvSGVscGVyLmRlZmF1bHRzLmVycm9yKGBGbGFnICcke2ZsYWdOYW1lfScgaXMgbm90IGEgYm9vbGVhbiBmbGFnLiBPbmx5IGJvb2xlYW4gZmxhZ3MgYXJlIGN1cnJlbnRseSBzdXBwb3J0ZWQuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcHJvdG90eXBlU3VjY2VzcyA9IGF3YWl0IHByb3RvdHlwZUNoYW5nZXModXBkYXRlZFBhcmFtcywgdXBkYXRlZEZsYWdOYW1lISk7XG5cbiAgaWYgKHByb3RvdHlwZVN1Y2Nlc3MpIHtcbiAgICBhd2FpdCBoYW5kbGVVc2VyUmVzcG9uc2UodXBkYXRlZFBhcmFtcywgdXBkYXRlZEZsYWdOYW1lISk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcHJvdG90eXBlQ2hhbmdlcyhcbiAgcGFyYW1zOiBGbGFnT3BlcmF0aW9uc1BhcmFtcyxcbiAgZmxhZ05hbWVzOiBzdHJpbmdbXSxcbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCB7IGZsYWdEYXRhLCB0b29sa2l0LCBpb0hlbHBlciwgcmVjb21tZW5kZWQsIHZhbHVlIH0gPSBwYXJhbXM7XG4gIGNvbnN0IGJhc2VDb250ZXh0ID0gbmV3IENka0FwcE11bHRpQ29udGV4dChwcm9jZXNzLmN3ZCgpKTtcbiAgY29uc3QgYmFzZUNvbnRleHRWYWx1ZXMgPSBhd2FpdCBiYXNlQ29udGV4dC5yZWFkKCk7XG4gIGNvbnN0IG1lbW9yeUNvbnRleHQgPSBuZXcgTWVtb3J5Q29udGV4dChiYXNlQ29udGV4dFZhbHVlcyk7XG5cbiAgY29uc3QgY2RrSnNvbiA9IGF3YWl0IEpTT04ucGFyc2UoYXdhaXQgZnMucmVhZEZpbGUocGF0aC5qb2luKHByb2Nlc3MuY3dkKCksICdjZGsuanNvbicpLCAndXRmLTgnKSk7XG4gIGNvbnN0IGFwcCA9IGNka0pzb24uYXBwO1xuXG4gIGNvbnN0IHNvdXJjZSA9IGF3YWl0IHRvb2xraXQuZnJvbUNka0FwcChhcHAsIHtcbiAgICBjb250ZXh0U3RvcmU6IGJhc2VDb250ZXh0LFxuICAgIG91dGRpcjogcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksICdvcmlnaW5hbCcpLFxuICB9KTtcblxuICBjb25zdCB1cGRhdGVPYmo6IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+ID0ge307XG4gIGNvbnN0IGJvb2xWYWx1ZSA9IHRvQm9vbGVhblZhbHVlKHZhbHVlKTtcbiAgaWYgKGZsYWdOYW1lcy5sZW5ndGggPT09IDEgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IGZsYWdOYW1lID0gZmxhZ05hbWVzWzBdO1xuICAgIGlmIChiYXNlQ29udGV4dFZhbHVlc1tmbGFnTmFtZV0gPT0gYm9vbFZhbHVlKSB7XG4gICAgICBhd2FpdCBpb0hlbHBlci5kZWZhdWx0cy5pbmZvKCdGbGFnIGlzIGFscmVhZHkgc2V0IHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUuIE5vIGNoYW5nZXMgbmVlZGVkLicpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB1cGRhdGVPYmpbZmxhZ05hbWVdID0gYm9vbFZhbHVlO1xuICB9IGVsc2Uge1xuICAgIGZvciAoY29uc3QgZmxhZ05hbWUgb2YgZmxhZ05hbWVzKSB7XG4gICAgICBjb25zdCBmbGFnID0gZmxhZ0RhdGEuZmluZChmID0+IGYubmFtZSA9PT0gZmxhZ05hbWUpO1xuICAgICAgaWYgKCFmbGFnKSB7XG4gICAgICAgIGF3YWl0IGlvSGVscGVyLmRlZmF1bHRzLmVycm9yKGBGbGFnICR7ZmxhZ05hbWV9IG5vdCBmb3VuZC5gKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgY29uc3QgbmV3VmFsdWUgPSByZWNvbW1lbmRlZFxuICAgICAgICA/IHRvQm9vbGVhblZhbHVlKGZsYWcucmVjb21tZW5kZWRWYWx1ZSlcbiAgICAgICAgOiBTdHJpbmcoZmxhZy51bmNvbmZpZ3VyZWRCZWhhdmVzTGlrZT8udjIpID09PSAndHJ1ZSc7XG4gICAgICB1cGRhdGVPYmpbZmxhZ05hbWVdID0gbmV3VmFsdWU7XG4gICAgfVxuICB9XG5cbiAgYXdhaXQgbWVtb3J5Q29udGV4dC51cGRhdGUodXBkYXRlT2JqKTtcbiAgY29uc3QgY3ggPSBhd2FpdCB0b29sa2l0LnN5bnRoKHNvdXJjZSk7XG4gIGNvbnN0IGFzc2VtYmx5ID0gY3guY2xvdWRBc3NlbWJseTtcblxuICBjb25zdCBtb2RpZmllZFNvdXJjZSA9IGF3YWl0IHRvb2xraXQuZnJvbUNka0FwcChhcHAsIHtcbiAgICBjb250ZXh0U3RvcmU6IG1lbW9yeUNvbnRleHQsXG4gICAgb3V0ZGlyOiBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgJ3RlbXAnKSxcbiAgfSk7XG5cbiAgY29uc3QgbW9kaWZpZWRDeCA9IGF3YWl0IHRvb2xraXQuc3ludGgobW9kaWZpZWRTb3VyY2UpO1xuICBjb25zdCBhbGxTdGFja3MgPSBhc3NlbWJseS5zdGFja3NSZWN1cnNpdmVseTtcblxuICBmb3IgKGNvbnN0IHN0YWNrIG9mIGFsbFN0YWNrcykge1xuICAgIGNvbnN0IHRlbXBsYXRlUGF0aCA9IHN0YWNrLnRlbXBsYXRlRnVsbFBhdGg7XG4gICAgYXdhaXQgdG9vbGtpdC5kaWZmKG1vZGlmaWVkQ3gsIHtcbiAgICAgIG1ldGhvZDogRGlmZk1ldGhvZC5Mb2NhbEZpbGUodGVtcGxhdGVQYXRoKSxcbiAgICAgIHN0YWNrczoge1xuICAgICAgICBzdHJhdGVneTogU3RhY2tTZWxlY3Rpb25TdHJhdGVneS5QQVRURVJOX01VU1RfTUFUQ0hfU0lOR0xFLFxuICAgICAgICBwYXR0ZXJuczogW3N0YWNrLmhpZXJhcmNoaWNhbElkXSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNldE11bHRpcGxlRmxhZ3MocGFyYW1zOiBGbGFnT3BlcmF0aW9uc1BhcmFtcykge1xuICBjb25zdCB7IGZsYWdEYXRhLCBhbGwgfSA9IHBhcmFtcztcbiAgbGV0IGZsYWdzVG9TZXQ7XG4gIGlmIChhbGwpIHtcbiAgICBmbGFnc1RvU2V0ID0gZmxhZ0RhdGEuZmlsdGVyKGZsYWcgPT4gZmxhZy51c2VyVmFsdWUgPT09IHVuZGVmaW5lZCB8fCAhaXNVc2VyVmFsdWVFcXVhbFRvUmVjb21tZW5kZWQoZmxhZykpXG4gICAgICAuZmlsdGVyKGZsYWcgPT4gaXNCb29sZWFuRmxhZyhmbGFnKSlcbiAgICAgIC5tYXAoZmxhZyA9PiBmbGFnLm5hbWUpO1xuICB9IGVsc2Uge1xuICAgIGZsYWdzVG9TZXQgPSBmbGFnRGF0YS5maWx0ZXIoZmxhZyA9PlxuICAgICAgZmxhZy51c2VyVmFsdWUgPT09IHVuZGVmaW5lZClcbiAgICAgIC5maWx0ZXIoZmxhZyA9PiBpc0Jvb2xlYW5GbGFnKGZsYWcpKVxuICAgICAgLm1hcChmbGFnID0+IGZsYWcubmFtZSk7XG4gIH1cbiAgY29uc3QgcHJvdG90eXBlU3VjY2VzcyA9IGF3YWl0IHByb3RvdHlwZUNoYW5nZXMocGFyYW1zLCBmbGFnc1RvU2V0KTtcblxuICBpZiAocHJvdG90eXBlU3VjY2Vzcykge1xuICAgIGF3YWl0IGhhbmRsZVVzZXJSZXNwb25zZShwYXJhbXMsIGZsYWdzVG9TZXQpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGhhbmRsZVVzZXJSZXNwb25zZShcbiAgcGFyYW1zOiBGbGFnT3BlcmF0aW9uc1BhcmFtcyxcbiAgZmxhZ05hbWVzOiBzdHJpbmdbXSxcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IGlvSGVscGVyIH0gPSBwYXJhbXM7XG4gIGNvbnN0IHVzZXJBY2NlcHRlZCA9IGF3YWl0IGlvSGVscGVyLnJlcXVlc3RSZXNwb25zZSh7XG4gICAgdGltZTogbmV3IERhdGUoKSxcbiAgICBsZXZlbDogJ2luZm8nLFxuICAgIGNvZGU6ICdDREtfVE9PTEtJVF9JOTMwMCcsXG4gICAgbWVzc2FnZTogJ0RvIHlvdSB3YW50IHRvIGFjY2VwdCB0aGVzZSBjaGFuZ2VzPycsXG4gICAgZGF0YToge1xuICAgICAgZmxhZ05hbWVzLFxuICAgICAgcmVzcG9uc2VEZXNjcmlwdGlvbjogJ0VudGVyIFwieVwiIHRvIGFwcGx5IGNoYW5nZXMgb3IgXCJuXCIgdG8gY2FuY2VsJyxcbiAgICB9LFxuICAgIGRlZmF1bHRSZXNwb25zZTogZmFsc2UsXG4gIH0pO1xuICBpZiAodXNlckFjY2VwdGVkKSB7XG4gICAgYXdhaXQgbW9kaWZ5VmFsdWVzKHBhcmFtcywgZmxhZ05hbWVzKTtcbiAgICBhd2FpdCBpb0hlbHBlci5kZWZhdWx0cy5pbmZvKCdGbGFnIHZhbHVlKHMpIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5LicpO1xuICB9IGVsc2Uge1xuICAgIGF3YWl0IGlvSGVscGVyLmRlZmF1bHRzLmluZm8oJ09wZXJhdGlvbiBjYW5jZWxsZWQnKTtcbiAgfVxuXG4gIGNvbnN0IG9yaWdpbmFsRGlyID0gcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksICdvcmlnaW5hbCcpO1xuICBjb25zdCB0ZW1wRGlyID0gcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksICd0ZW1wJyk7XG5cbiAgYXdhaXQgZnMucmVtb3ZlKG9yaWdpbmFsRGlyKTtcbiAgYXdhaXQgZnMucmVtb3ZlKHRlbXBEaXIpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBtb2RpZnlWYWx1ZXMocGFyYW1zOiBGbGFnT3BlcmF0aW9uc1BhcmFtcywgZmxhZ05hbWVzOiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IGZsYWdEYXRhLCBpb0hlbHBlciwgdmFsdWUsIHJlY29tbWVuZGVkIH0gPSBwYXJhbXM7XG4gIGNvbnN0IGNka0pzb25QYXRoID0gcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksICdjZGsuanNvbicpO1xuICBjb25zdCBjZGtKc29uQ29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKGNka0pzb25QYXRoLCAndXRmLTgnKTtcbiAgY29uc3QgY2RrSnNvbiA9IEpTT04ucGFyc2UoY2RrSnNvbkNvbnRlbnQpO1xuXG4gIGlmIChmbGFnTmFtZXMubGVuZ3RoID09IDEpIHtcbiAgICBjb25zdCBib29sVmFsdWUgPSB0b0Jvb2xlYW5WYWx1ZSh2YWx1ZSk7XG4gICAgY2RrSnNvbi5jb250ZXh0W1N0cmluZyhmbGFnTmFtZXNbMF0pXSA9IGJvb2xWYWx1ZTtcblxuICAgIGF3YWl0IGlvSGVscGVyLmRlZmF1bHRzLmluZm8oYFNldHRpbmcgZmxhZyAnJHtmbGFnTmFtZXN9JyB0bzogJHtib29sVmFsdWV9YCk7XG4gIH0gZWxzZSB7XG4gICAgZm9yIChjb25zdCBmbGFnTmFtZSBvZiBmbGFnTmFtZXMpIHtcbiAgICAgIGNvbnN0IGZsYWcgPSBmbGFnRGF0YS5maW5kKGYgPT4gZi5uYW1lID09PSBmbGFnTmFtZSk7XG4gICAgICBjb25zdCBuZXdWYWx1ZSA9IHJlY29tbWVuZGVkXG4gICAgICAgID8gdG9Cb29sZWFuVmFsdWUoZmxhZyEucmVjb21tZW5kZWRWYWx1ZSlcbiAgICAgICAgOiBTdHJpbmcoZmxhZyEudW5jb25maWd1cmVkQmVoYXZlc0xpa2U/LnYyKSA9PT0gJ3RydWUnO1xuICAgICAgY2RrSnNvbi5jb250ZXh0W2ZsYWdOYW1lXSA9IG5ld1ZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIGF3YWl0IGZzLndyaXRlRmlsZShjZGtKc29uUGF0aCwgSlNPTi5zdHJpbmdpZnkoY2RrSnNvbiwgbnVsbCwgMiksICd1dGYtOCcpO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRUYWJsZShoZWFkZXJzOiBzdHJpbmdbXSwgcm93czogc3RyaW5nW11bXSk6IHN0cmluZyB7XG4gIGNvbnN0IGNvbHVtbldpZHRocyA9IFtcbiAgICBNYXRoLm1heChoZWFkZXJzWzBdLmxlbmd0aCwgLi4ucm93cy5tYXAocm93ID0+IHJvd1swXS5sZW5ndGgpKSxcbiAgICBNYXRoLm1heChoZWFkZXJzWzFdLmxlbmd0aCwgLi4ucm93cy5tYXAocm93ID0+IHJvd1sxXS5sZW5ndGgpKSxcbiAgICBNYXRoLm1heChoZWFkZXJzWzJdLmxlbmd0aCwgLi4ucm93cy5tYXAocm93ID0+IHJvd1syXS5sZW5ndGgpKSxcbiAgXTtcblxuICBjb25zdCBjcmVhdGVTZXBhcmF0b3IgPSAoKSA9PiB7XG4gICAgcmV0dXJuICcrJyArIGNvbHVtbldpZHRocy5tYXAod2lkdGggPT4gJy0nLnJlcGVhdCh3aWR0aCArIDIpKS5qb2luKCcrJykgKyAnKyc7XG4gIH07XG5cbiAgY29uc3QgZm9ybWF0Um93ID0gKHZhbHVlczogc3RyaW5nW10pID0+IHtcbiAgICByZXR1cm4gJ3wnICsgdmFsdWVzLm1hcCgodmFsdWUsIGkpID0+IGAgJHt2YWx1ZS5wYWRFbmQoY29sdW1uV2lkdGhzW2ldKX0gYCkuam9pbignfCcpICsgJ3wnO1xuICB9O1xuXG4gIGNvbnN0IHNlcGFyYXRvciA9IGNyZWF0ZVNlcGFyYXRvcigpO1xuICBsZXQgdGFibGUgPSBzZXBhcmF0b3IgKyAnXFxuJztcbiAgdGFibGUgKz0gZm9ybWF0Um93KGhlYWRlcnMpICsgJ1xcbic7XG4gIHRhYmxlICs9IHNlcGFyYXRvciArICdcXG4nO1xuXG4gIHJvd3MuZm9yRWFjaChyb3cgPT4ge1xuICAgIGlmIChyb3dbMV0gPT09ICcnICYmIHJvd1syXSA9PT0gJycpIHtcbiAgICAgIHRhYmxlICs9IGAgJHtyb3dbMF0ucGFkRW5kKGNvbHVtbldpZHRoc1swXSl9IFxcbmA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRhYmxlICs9IGZvcm1hdFJvdyhyb3cpICsgJ1xcbic7XG4gICAgfVxuICB9KTtcblxuICB0YWJsZSArPSBzZXBhcmF0b3I7XG4gIHJldHVybiB0YWJsZTtcbn1cblxuZnVuY3Rpb24gZ2V0RmxhZ1NvcnRPcmRlcihmbGFnOiBGZWF0dXJlRmxhZyk6IG51bWJlciB7XG4gIGlmIChmbGFnLnVzZXJWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIDM7XG4gIH0gZWxzZSBpZiAoaXNVc2VyVmFsdWVFcXVhbFRvUmVjb21tZW5kZWQoZmxhZykpIHtcbiAgICByZXR1cm4gMTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gMjtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBkaXNwbGF5RmxhZ1RhYmxlKGZsYWdzOiBGZWF0dXJlRmxhZ1tdLCBpb0hlbHBlcjogSW9IZWxwZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgaGVhZGVycyA9IFsnRmVhdHVyZSBGbGFnIE5hbWUnLCAnUmVjb21tZW5kZWQgVmFsdWUnLCAnVXNlciBWYWx1ZSddO1xuXG4gIGNvbnN0IHNvcnRlZEZsYWdzID0gWy4uLmZsYWdzXS5zb3J0KChhLCBiKSA9PiB7XG4gICAgY29uc3Qgb3JkZXJBID0gZ2V0RmxhZ1NvcnRPcmRlcihhKTtcbiAgICBjb25zdCBvcmRlckIgPSBnZXRGbGFnU29ydE9yZGVyKGIpO1xuXG4gICAgaWYgKG9yZGVyQSAhPT0gb3JkZXJCKSB7XG4gICAgICByZXR1cm4gb3JkZXJBIC0gb3JkZXJCO1xuICAgIH1cbiAgICBpZiAoYS5tb2R1bGUgIT09IGIubW9kdWxlKSB7XG4gICAgICByZXR1cm4gYS5tb2R1bGUubG9jYWxlQ29tcGFyZShiLm1vZHVsZSk7XG4gICAgfVxuICAgIHJldHVybiBhLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpO1xuICB9KTtcblxuICBjb25zdCByb3dzOiBzdHJpbmdbXVtdID0gW107XG4gIGxldCBjdXJyZW50TW9kdWxlID0gJyc7XG5cbiAgc29ydGVkRmxhZ3MuZm9yRWFjaCgoZmxhZykgPT4ge1xuICAgIGlmIChmbGFnLm1vZHVsZSAhPT0gY3VycmVudE1vZHVsZSkge1xuICAgICAgcm93cy5wdXNoKFtjaGFsay5ib2xkKGBNb2R1bGU6ICR7ZmxhZy5tb2R1bGV9YCksICcnLCAnJ10pO1xuICAgICAgY3VycmVudE1vZHVsZSA9IGZsYWcubW9kdWxlO1xuICAgIH1cbiAgICByb3dzLnB1c2goW1xuICAgICAgZmxhZy5uYW1lLFxuICAgICAgU3RyaW5nKGZsYWcucmVjb21tZW5kZWRWYWx1ZSksXG4gICAgICBmbGFnLnVzZXJWYWx1ZSA9PT0gdW5kZWZpbmVkID8gJzx1bnNldD4nIDogU3RyaW5nKGZsYWcudXNlclZhbHVlKSxcbiAgICBdKTtcbiAgfSk7XG5cbiAgY29uc3QgZm9ybWF0dGVkVGFibGUgPSBmb3JtYXRUYWJsZShoZWFkZXJzLCByb3dzKTtcbiAgYXdhaXQgaW9IZWxwZXIuZGVmYXVsdHMuaW5mbyhmb3JtYXR0ZWRUYWJsZSk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkaXNwbGF5RmxhZ3MocGFyYW1zOiBGbGFnT3BlcmF0aW9uc1BhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IGZsYWdEYXRhLCBpb0hlbHBlciwgZmxhZ05hbWUsIGFsbCB9ID0gcGFyYW1zO1xuXG4gIGlmIChmbGFnTmFtZSAmJiBmbGFnTmFtZS5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgbWF0Y2hpbmdGbGFncyA9IGZsYWdEYXRhLmZpbHRlcihmID0+XG4gICAgICBmbGFnTmFtZS5zb21lKHNlYXJjaFRlcm0gPT4gZi5uYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoc2VhcmNoVGVybS50b0xvd2VyQ2FzZSgpKSksXG4gICAgKTtcblxuICAgIGlmIChtYXRjaGluZ0ZsYWdzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgYXdhaXQgaW9IZWxwZXIuZGVmYXVsdHMuZXJyb3IoYEZsYWcgbWF0Y2hpbmcgXCIke2ZsYWdOYW1lLmpvaW4oJywgJyl9XCIgbm90IGZvdW5kLmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChtYXRjaGluZ0ZsYWdzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgY29uc3QgZmxhZyA9IG1hdGNoaW5nRmxhZ3NbMF07XG4gICAgICBhd2FpdCBpb0hlbHBlci5kZWZhdWx0cy5pbmZvKGBGbGFnIG5hbWU6ICR7ZmxhZy5uYW1lfWApO1xuICAgICAgYXdhaXQgaW9IZWxwZXIuZGVmYXVsdHMuaW5mbyhgRGVzY3JpcHRpb246ICR7ZmxhZy5leHBsYW5hdGlvbn1gKTtcbiAgICAgIGF3YWl0IGlvSGVscGVyLmRlZmF1bHRzLmluZm8oYFJlY29tbWVuZGVkIHZhbHVlOiAke2ZsYWcucmVjb21tZW5kZWRWYWx1ZX1gKTtcbiAgICAgIGF3YWl0IGlvSGVscGVyLmRlZmF1bHRzLmluZm8oYFVzZXIgdmFsdWU6ICR7ZmxhZy51c2VyVmFsdWV9YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgYXdhaXQgaW9IZWxwZXIuZGVmYXVsdHMuaW5mbyhgRm91bmQgJHttYXRjaGluZ0ZsYWdzLmxlbmd0aH0gZmxhZ3MgbWF0Y2hpbmcgXCIke2ZsYWdOYW1lLmpvaW4oJywgJyl9XCI6YCk7XG4gICAgYXdhaXQgZGlzcGxheUZsYWdUYWJsZShtYXRjaGluZ0ZsYWdzLCBpb0hlbHBlcik7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbGV0IGZsYWdzVG9EaXNwbGF5OiBGZWF0dXJlRmxhZ1tdO1xuICBpZiAoYWxsKSB7XG4gICAgZmxhZ3NUb0Rpc3BsYXkgPSBmbGFnRGF0YTtcbiAgfSBlbHNlIHtcbiAgICBmbGFnc1RvRGlzcGxheSA9IGZsYWdEYXRhLmZpbHRlcihmbGFnID0+XG4gICAgICBmbGFnLnVzZXJWYWx1ZSA9PT0gdW5kZWZpbmVkIHx8ICFpc1VzZXJWYWx1ZUVxdWFsVG9SZWNvbW1lbmRlZChmbGFnKSxcbiAgICApO1xuICB9XG5cbiAgYXdhaXQgZGlzcGxheUZsYWdUYWJsZShmbGFnc1RvRGlzcGxheSwgaW9IZWxwZXIpO1xufVxuXG5mdW5jdGlvbiBpc1VzZXJWYWx1ZUVxdWFsVG9SZWNvbW1lbmRlZChmbGFnOiBGZWF0dXJlRmxhZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gU3RyaW5nKGZsYWcudXNlclZhbHVlKSA9PT0gU3RyaW5nKGZsYWcucmVjb21tZW5kZWRWYWx1ZSk7XG59XG5cbmZ1bmN0aW9uIHRvQm9vbGVhblZhbHVlKHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJykge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiB2YWx1ZS50b0xvd2VyQ2FzZSgpID09PSAndHJ1ZSc7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBpc0Jvb2xlYW5GbGFnKGZsYWc6IEZlYXR1cmVGbGFnKTogYm9vbGVhbiB7XG4gIGNvbnN0IHJlY29tbWVuZGVkID0gZmxhZy5yZWNvbW1lbmRlZFZhbHVlO1xuICByZXR1cm4gdHlwZW9mIHJlY29tbWVuZGVkID09PSAnYm9vbGVhbicgfHxcbiAgICByZWNvbW1lbmRlZCA9PT0gJ3RydWUnIHx8XG4gICAgcmVjb21tZW5kZWQgPT09ICdmYWxzZSc7XG59XG4iXX0=
|