@lenne.tech/cli 1.6.3 → 1.6.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -9,192 +9,9 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
9
9
  });
10
10
  };
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
- const child_process_1 = require("child_process");
13
- const fs_1 = require("fs");
14
- const os_1 = require("os");
15
- const path_1 = require("path");
16
- const MARKETPLACES = [
17
- {
18
- apiBase: 'https://api.github.com/repos/lenneTech/claude-code/contents',
19
- name: 'lenne-tech',
20
- rawBase: 'https://raw.githubusercontent.com/lenneTech/claude-code/main',
21
- repo: 'lenneTech/claude-code',
22
- },
23
- {
24
- apiBase: 'https://api.github.com/repos/anthropics/claude-plugins-official/contents',
25
- name: 'claude-plugins-official',
26
- rawBase: 'https://raw.githubusercontent.com/anthropics/claude-plugins-official/main',
27
- repo: 'anthropics/claude-plugins-official',
28
- },
29
- ];
30
- /**
31
- * Default plugins to install when no specific plugins are requested
32
- * These are installed in addition to all plugins from the primary marketplace (lenne-tech)
33
- */
34
- const DEFAULT_EXTERNAL_PLUGINS = [
35
- { marketplaceName: 'claude-plugins-official', pluginName: 'typescript-lsp' },
36
- ];
37
- /**
38
- * Empty plugin contents constant (used for failed installations)
39
- */
40
- const EMPTY_PLUGIN_CONTENTS = {
41
- agents: [],
42
- commands: [],
43
- hooks: 0,
44
- mcpServers: [],
45
- permissions: [],
46
- skills: [],
47
- };
48
- /**
49
- * Fetch available plugins from all marketplaces
50
- */
51
- function fetchAvailablePlugins(spin) {
52
- return __awaiter(this, void 0, void 0, function* () {
53
- const spinner = spin('Fetching available plugins from marketplaces');
54
- try {
55
- // Fetch plugins from all marketplaces in parallel
56
- const results = yield Promise.all(MARKETPLACES.map(marketplace => fetchPluginsFromMarketplace(marketplace)));
57
- // Flatten results
58
- const plugins = results.flat();
59
- if (plugins.length === 0) {
60
- spinner.fail('No plugins found in any marketplace');
61
- throw new Error('No plugins found');
62
- }
63
- // Group by marketplace for display
64
- const byMarketplace = MARKETPLACES.map(m => ({
65
- count: plugins.filter(p => p.marketplaceName === m.name).length,
66
- name: m.name,
67
- })).filter(m => m.count > 0);
68
- const summary = byMarketplace.map(m => `${m.name}: ${m.count}`).join(', ');
69
- spinner.succeed(`Found ${plugins.length} plugins (${summary})`);
70
- return plugins;
71
- }
72
- catch (err) {
73
- spinner.fail('Failed to fetch plugins from marketplaces');
74
- throw err;
75
- }
76
- });
77
- }
78
- /**
79
- * Fetch available plugins from a single marketplace
80
- */
81
- function fetchPluginsFromMarketplace(marketplace) {
82
- return __awaiter(this, void 0, void 0, function* () {
83
- const plugins = [];
84
- try {
85
- // First try to read central marketplace.json (used by official marketplace)
86
- const marketplaceJsonUrl = `${marketplace.rawBase}/.claude-plugin/marketplace.json`;
87
- const marketplaceJsonResponse = yield fetch(marketplaceJsonUrl);
88
- if (marketplaceJsonResponse.ok) {
89
- try {
90
- const marketplaceManifest = yield marketplaceJsonResponse.json();
91
- if (marketplaceManifest.plugins && marketplaceManifest.plugins.length > 0) {
92
- for (const plugin of marketplaceManifest.plugins) {
93
- plugins.push({
94
- description: plugin.description || '',
95
- marketplaceName: marketplace.name,
96
- marketplaceRepo: marketplace.repo,
97
- pluginName: plugin.name,
98
- });
99
- }
100
- return plugins;
101
- }
102
- }
103
- catch (_a) {
104
- // Failed to parse marketplace.json, fall through to directory scan
105
- }
106
- }
107
- // Fallback: Get list of plugin directories and read individual plugin.json files
108
- const dirResponse = yield fetch(`${marketplace.apiBase}/plugins`);
109
- if (!dirResponse.ok) {
110
- return plugins;
111
- }
112
- const directories = yield dirResponse.json();
113
- const pluginDirs = directories.filter(d => d.type === 'dir');
114
- // Fetch plugin.json for each plugin in parallel
115
- const manifestPromises = pluginDirs.map((dir) => __awaiter(this, void 0, void 0, function* () {
116
- try {
117
- const manifestUrl = `${marketplace.rawBase}/plugins/${dir.name}/.claude-plugin/plugin.json`;
118
- const manifestResponse = yield fetch(manifestUrl);
119
- if (manifestResponse.ok) {
120
- const manifest = yield manifestResponse.json();
121
- return {
122
- description: manifest.description,
123
- marketplaceName: marketplace.name,
124
- marketplaceRepo: marketplace.repo,
125
- pluginName: manifest.name,
126
- };
127
- }
128
- }
129
- catch (_a) {
130
- // Skip plugins without valid manifest
131
- }
132
- return null;
133
- }));
134
- const results = yield Promise.all(manifestPromises);
135
- plugins.push(...results.filter((p) => p !== null));
136
- }
137
- catch (_b) {
138
- // Marketplace fetch failed, return empty array
139
- }
140
- return plugins;
141
- });
142
- }
143
- /**
144
- * Find the claude CLI executable path
145
- */
146
- function findClaudeCli() {
147
- const possiblePaths = [
148
- (0, path_1.join)((0, os_1.homedir)(), '.claude', 'local', 'claude'),
149
- '/usr/local/bin/claude',
150
- '/usr/bin/claude',
151
- ];
152
- for (const p of possiblePaths) {
153
- if ((0, fs_1.existsSync)(p)) {
154
- return p;
155
- }
156
- }
157
- try {
158
- const result = (0, child_process_1.execSync)('which claude', { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] });
159
- const path = result.trim();
160
- if (path && (0, fs_1.existsSync)(path)) {
161
- return path;
162
- }
163
- }
164
- catch (_a) {
165
- // Ignore errors
166
- }
167
- return null;
168
- }
169
- /**
170
- * Recursively find all .md files in a directory
171
- */
172
- function findMarkdownFiles(dir, basePath = '') {
173
- const results = [];
174
- if (!(0, fs_1.existsSync)(dir))
175
- return results;
176
- try {
177
- const entries = (0, fs_1.readdirSync)(dir, { withFileTypes: true });
178
- for (const entry of entries) {
179
- const fullPath = (0, path_1.join)(dir, entry.name);
180
- const relativePath = basePath ? `${basePath}/${entry.name}` : entry.name;
181
- if (entry.isDirectory()) {
182
- results.push(...findMarkdownFiles(fullPath, relativePath));
183
- }
184
- else if (entry.isFile() && entry.name.endsWith('.md')) {
185
- // Convert path to command name (e.g., "git/commit-message.md" -> "/git:commit-message")
186
- const commandName = relativePath
187
- .replace(/\.md$/, '')
188
- .replace(/\//g, ':');
189
- results.push(`/${commandName}`);
190
- }
191
- }
192
- }
193
- catch (_a) {
194
- // Ignore errors
195
- }
196
- return results;
197
- }
12
+ const claude_cli_1 = require("../../lib/claude-cli");
13
+ const marketplace_1 = require("../../lib/marketplace");
14
+ const plugin_utils_1 = require("../../lib/plugin-utils");
198
15
  /**
199
16
  * Install a single plugin (marketplace must already be added and updated)
200
17
  */
@@ -204,7 +21,7 @@ function installPlugin(plugin, cli, toolbox) {
204
21
  // Step 1: Install or update plugin
205
22
  const fullPluginName = `${plugin.pluginName}@${plugin.marketplaceName}`;
206
23
  const pluginSpinner = spin(`Installing/updating ${plugin.pluginName}`);
207
- const installResult = runClaudeCommand(cli, `plugin install ${fullPluginName}`);
24
+ const installResult = (0, claude_cli_1.runClaudeCommand)(cli, `plugin install ${fullPluginName}`);
208
25
  let pluginAction = 'installed';
209
26
  if (installResult.output.includes('already') || installResult.output.includes('up to date')) {
210
27
  pluginAction = 'up to date';
@@ -222,10 +39,10 @@ function installPlugin(plugin, cli, toolbox) {
222
39
  info('Manual installation:');
223
40
  info(` /plugin marketplace add ${plugin.marketplaceRepo}`);
224
41
  info(` /plugin install ${fullPluginName}`);
225
- return { action: 'failed', contents: EMPTY_PLUGIN_CONTENTS, success: false };
42
+ return { action: 'failed', contents: plugin_utils_1.EMPTY_PLUGIN_CONTENTS, postInstall: null, success: false };
226
43
  }
227
44
  // Step 2: Read plugin contents
228
- const pluginContents = readPluginContents(plugin.marketplaceName, plugin.pluginName);
45
+ const pluginContents = (0, plugin_utils_1.readPluginContents)(plugin.marketplaceName, plugin.pluginName);
229
46
  // Warn if plugin seems empty (but not for LSP plugins which don't have skills/commands)
230
47
  const isLspPlugin = plugin.pluginName.endsWith('-lsp');
231
48
  if (!isLspPlugin && pluginContents.skills.length === 0 && pluginContents.commands.length === 0) {
@@ -235,7 +52,7 @@ function installPlugin(plugin, cli, toolbox) {
235
52
  // Step 3: Setup permissions
236
53
  if (pluginContents.permissions.length > 0) {
237
54
  const permSpinner = spin(`Configuring permissions for ${plugin.pluginName}`);
238
- const permResult = setupPermissions(pluginContents.permissions, error);
55
+ const permResult = (0, plugin_utils_1.setupPermissions)(pluginContents.permissions, error);
239
56
  if (permResult.success) {
240
57
  if (permResult.added.length > 0) {
241
58
  permSpinner.succeed(`Permissions configured for ${plugin.pluginName} (${permResult.added.length} added)`);
@@ -251,7 +68,9 @@ function installPlugin(plugin, cli, toolbox) {
251
68
  info(JSON.stringify({ permissions: { allow: pluginContents.permissions } }, null, 2));
252
69
  }
253
70
  }
254
- return { action: pluginAction, contents: pluginContents, success: true };
71
+ // Step 4: Process post-installation requirements (for LSP plugins, etc.)
72
+ const postInstallResult = (0, plugin_utils_1.processPostInstall)(plugin.pluginName, toolbox);
73
+ return { action: pluginAction, contents: pluginContents, postInstall: postInstallResult, success: true };
255
74
  });
256
75
  }
257
76
  /**
@@ -269,22 +88,26 @@ function prepareMarketplaces(plugins, cli, toolbox) {
269
88
  }
270
89
  const preparedMarketplaces = new Set();
271
90
  for (const [marketplaceName, plugin] of marketplaceMap) {
272
- // Add marketplace
273
- const addSpinner = spin(`Adding marketplace ${marketplaceName}`);
274
- const addResult = runClaudeCommand(cli, `plugin marketplace add ${plugin.marketplaceRepo}`);
275
- if (addResult.success || addResult.output.includes('already')) {
276
- addSpinner.succeed(`Marketplace ${marketplaceName} added`);
277
- }
278
- else {
279
- addSpinner.fail(`Failed to add marketplace ${marketplaceName}`);
280
- error(addResult.output);
281
- continue;
91
+ // Check if marketplace already exists
92
+ const marketplaceExists = (0, claude_cli_1.checkMarketplaceExists)(marketplaceName);
93
+ // Add marketplace only if it doesn't exist yet
94
+ if (!marketplaceExists) {
95
+ const addSpinner = spin(`Adding marketplace ${marketplaceName}`);
96
+ const addResult = (0, claude_cli_1.runClaudeCommand)(cli, `plugin marketplace add ${plugin.marketplaceRepo}`);
97
+ if (addResult.success || addResult.output.includes('already')) {
98
+ addSpinner.succeed(`Marketplace ${marketplaceName} added`);
99
+ }
100
+ else {
101
+ addSpinner.fail(`Failed to add marketplace ${marketplaceName}`);
102
+ error(addResult.output);
103
+ continue;
104
+ }
282
105
  }
283
- // Update marketplace cache
284
- const updateSpinner = spin(`Updating marketplace cache for ${marketplaceName}`);
285
- const updateResult = runClaudeCommand(cli, `plugin marketplace update ${marketplaceName}`);
106
+ // Always update marketplace cache to get latest plugin versions
107
+ const updateSpinner = spin(`Updating ${marketplaceName} cache`);
108
+ const updateResult = (0, claude_cli_1.runClaudeCommand)(cli, `plugin marketplace update ${marketplaceName}`);
286
109
  if (updateResult.success) {
287
- updateSpinner.succeed(`Marketplace ${marketplaceName} cache updated`);
110
+ updateSpinner.succeed(`${marketplaceName} cache updated`);
288
111
  }
289
112
  else {
290
113
  updateSpinner.stopAndPersist({ symbol: '⚠', text: `Could not update ${marketplaceName} cache, using cached version` });
@@ -293,225 +116,40 @@ function prepareMarketplaces(plugins, cli, toolbox) {
293
116
  }
294
117
  return preparedMarketplaces;
295
118
  }
296
- /**
297
- * Print plugin summary
298
- */
299
- function printPluginSummary(pluginName, contents, info) {
300
- const isLspPlugin = pluginName.endsWith('-lsp');
301
- const hasContent = contents.skills.length > 0 || contents.commands.length > 0 || contents.agents.length > 0;
302
- if (hasContent || isLspPlugin) {
303
- info('');
304
- info(`${pluginName}:`);
305
- // Show LSP indicator for LSP plugins
306
- if (isLspPlugin) {
307
- info(` Type: Language Server (LSP)`);
308
- }
309
- // Alphabetical order: Agents, Commands, Hooks, MCP Servers, Skills
310
- if (contents.agents.length > 0) {
311
- info(` Agents (${contents.agents.length}): ${contents.agents.join(', ')}`);
312
- }
313
- if (contents.commands.length > 0) {
314
- const maxShow = 5;
315
- const shown = contents.commands.slice(0, maxShow);
316
- const remaining = contents.commands.length - maxShow;
317
- const commandsStr = remaining > 0
318
- ? `${shown.join(', ')} and ${remaining} more`
319
- : shown.join(', ');
320
- info(` Commands (${contents.commands.length}): ${commandsStr}`);
321
- }
322
- if (contents.hooks > 0) {
323
- info(` Hooks: ${contents.hooks} auto-detection hooks`);
324
- }
325
- if (contents.mcpServers.length > 0) {
326
- info(` MCP Servers (${contents.mcpServers.length}): ${contents.mcpServers.join(', ')}`);
327
- }
328
- if (contents.skills.length > 0) {
329
- info(` Skills (${contents.skills.length}): ${contents.skills.join(', ')}`);
330
- }
331
- }
332
- }
333
- /**
334
- * Read plugin contents from installed plugin directory
335
- */
336
- function readPluginContents(marketplaceName, pluginName) {
337
- const pluginDir = (0, path_1.join)((0, os_1.homedir)(), '.claude', 'plugins', 'marketplaces', marketplaceName, 'plugins', pluginName);
338
- const result = {
339
- agents: [],
340
- commands: [],
341
- hooks: 0,
342
- mcpServers: [],
343
- permissions: [],
344
- skills: [],
345
- };
346
- // Read skills
347
- const skillsDir = (0, path_1.join)(pluginDir, 'skills');
348
- if ((0, fs_1.existsSync)(skillsDir)) {
349
- try {
350
- result.skills = (0, fs_1.readdirSync)(skillsDir, { withFileTypes: true })
351
- .filter(dirent => dirent.isDirectory())
352
- .map(dirent => dirent.name);
353
- }
354
- catch (_a) {
355
- // Ignore
356
- }
357
- }
358
- // Read agents
359
- const agentsDir = (0, path_1.join)(pluginDir, 'agents');
360
- if ((0, fs_1.existsSync)(agentsDir)) {
361
- try {
362
- result.agents = (0, fs_1.readdirSync)(agentsDir, { withFileTypes: true })
363
- .filter(dirent => dirent.isFile() && dirent.name.endsWith('.md'))
364
- .map(dirent => dirent.name.replace(/\.md$/, ''));
365
- }
366
- catch (_b) {
367
- // Ignore
368
- }
369
- }
370
- // Read commands
371
- const commandsDir = (0, path_1.join)(pluginDir, 'commands');
372
- result.commands = findMarkdownFiles(commandsDir);
373
- // Read hooks
374
- const hooksPath = (0, path_1.join)(pluginDir, 'hooks', 'hooks.json');
375
- if ((0, fs_1.existsSync)(hooksPath)) {
376
- try {
377
- const hooksContent = JSON.parse((0, fs_1.readFileSync)(hooksPath, 'utf-8'));
378
- // Count hooks across all event types
379
- for (const eventHooks of Object.values(hooksContent.hooks || {})) {
380
- if (Array.isArray(eventHooks)) {
381
- for (const hookGroup of eventHooks) {
382
- if (hookGroup.hooks && Array.isArray(hookGroup.hooks)) {
383
- result.hooks += hookGroup.hooks.length;
384
- }
385
- }
386
- }
387
- }
388
- }
389
- catch (_c) {
390
- // Ignore
391
- }
392
- }
393
- // Read MCP servers
394
- const mcpPath = (0, path_1.join)(pluginDir, '.mcp.json');
395
- if ((0, fs_1.existsSync)(mcpPath)) {
396
- try {
397
- const mcpContent = JSON.parse((0, fs_1.readFileSync)(mcpPath, 'utf-8'));
398
- if (mcpContent.mcpServers) {
399
- result.mcpServers = Object.keys(mcpContent.mcpServers);
400
- }
401
- }
402
- catch (_d) {
403
- // Ignore
404
- }
405
- }
406
- // Read permissions
407
- const permissionsPath = (0, path_1.join)(pluginDir, 'permissions.json');
408
- if ((0, fs_1.existsSync)(permissionsPath)) {
409
- try {
410
- const content = (0, fs_1.readFileSync)(permissionsPath, 'utf-8');
411
- const pluginPerms = JSON.parse(content);
412
- result.permissions = pluginPerms.permissions.map(p => p.pattern);
413
- }
414
- catch (_e) {
415
- // Ignore
416
- }
417
- }
418
- return result;
419
- }
420
- /**
421
- * Execute a claude CLI command
422
- */
423
- function runClaudeCommand(cli, args) {
424
- try {
425
- const result = (0, child_process_1.spawnSync)(cli, args.split(' '), {
426
- encoding: 'utf-8',
427
- shell: true,
428
- stdio: ['pipe', 'pipe', 'pipe'],
429
- });
430
- return {
431
- output: result.stdout + result.stderr,
432
- success: result.status === 0,
433
- };
434
- }
435
- catch (err) {
436
- return {
437
- output: err.message,
438
- success: false,
439
- };
440
- }
441
- }
442
- /**
443
- * Setup permissions in settings.json
444
- * Only adds new permissions, does not remove existing ones
445
- * (User may have customized permissions that should be preserved)
446
- */
447
- function setupPermissions(requiredPermissions, error) {
448
- const settingsPath = (0, path_1.join)((0, os_1.homedir)(), '.claude', 'settings.json');
449
- try {
450
- // Read existing settings
451
- let settings = {};
452
- if ((0, fs_1.existsSync)(settingsPath)) {
453
- const content = (0, fs_1.readFileSync)(settingsPath, 'utf-8');
454
- settings = JSON.parse(content);
455
- }
456
- // Ensure permissions.allow exists
457
- if (!settings.permissions) {
458
- settings.permissions = {};
459
- }
460
- const perms = settings.permissions;
461
- if (!perms.allow) {
462
- perms.allow = [];
463
- }
464
- const currentAllowList = perms.allow;
465
- // Determine what to add
466
- const added = [];
467
- const existing = [];
468
- requiredPermissions.forEach(perm => {
469
- if (currentAllowList.includes(perm)) {
470
- existing.push(perm);
471
- }
472
- else {
473
- added.push(perm);
474
- }
475
- });
476
- // Add new permissions
477
- if (added.length > 0) {
478
- perms.allow = [...currentAllowList, ...added];
479
- (0, fs_1.writeFileSync)(settingsPath, JSON.stringify(settings, null, 2));
480
- }
481
- return { added, existing, success: true };
482
- }
483
- catch (err) {
484
- error(`Could not configure permissions: ${err.message}`);
485
- return { added: [], existing: [], success: false };
486
- }
487
- }
488
119
  /**
489
120
  * Install/update Claude Code Plugins
490
121
  */
491
122
  const PluginsCommand = {
492
123
  alias: ['p'],
493
124
  description: 'Install Claude Code plugins',
494
- hidden: false,
495
125
  name: 'plugins',
496
126
  run: (toolbox) => __awaiter(void 0, void 0, void 0, function* () {
497
- var _a;
127
+ var _a, _b;
498
128
  const { helper, parameters, print: { error, info, spin, success, warning }, system, } = toolbox;
499
129
  // Start timer
500
130
  const timer = system.startTimer();
131
+ // Check if claude CLI is available (before network requests)
132
+ const cli = (0, claude_cli_1.findClaudeCli)();
133
+ if (!cli) {
134
+ error('Claude CLI not found. Please install Claude Code first.');
135
+ info('');
136
+ info('Installation: https://docs.anthropic.com/en/docs/claude-code');
137
+ process.exit(1);
138
+ }
501
139
  // Fetch available plugins from GitHub
502
140
  let availablePlugins;
503
141
  try {
504
- availablePlugins = yield fetchAvailablePlugins(spin);
142
+ availablePlugins = yield (0, marketplace_1.fetchAvailablePlugins)(spin);
505
143
  }
506
144
  catch (err) {
507
145
  error(`Failed to fetch plugins: ${err.message}`);
508
146
  info('');
509
147
  info('Check your internet connection or try again later.');
510
- return process.exit(1);
148
+ process.exit(1);
511
149
  }
512
150
  if (availablePlugins.length === 0) {
513
151
  error('No plugins found in the repository.');
514
- return process.exit(1);
152
+ process.exit(1);
515
153
  }
516
154
  // Get plugin names from parameters (if provided)
517
155
  const requestedPlugins = ((_a = parameters.array) === null || _a === void 0 ? void 0 : _a.filter((p) => typeof p === 'string')) || [];
@@ -538,21 +176,18 @@ const PluginsCommand = {
538
176
  if (pluginsToInstall.length === 0) {
539
177
  error('No valid plugins to install.');
540
178
  info('');
541
- info('Available plugins:');
542
- availablePlugins.forEach(p => {
543
- info(` ${p.pluginName} - ${p.description}`);
544
- });
545
- return process.exit(1);
179
+ (0, marketplace_1.printAvailablePlugins)(availablePlugins, info);
180
+ process.exit(1);
546
181
  }
547
182
  info(`Installing ${pluginsToInstall.length} plugin${pluginsToInstall.length > 1 ? 's' : ''}: ${pluginsToInstall.map(p => p.pluginName).join(', ')}`);
548
183
  }
549
184
  else {
550
185
  // Install all plugins from primary marketplace (lenne-tech) plus default external plugins
551
- const primaryMarketplace = MARKETPLACES[0].name;
186
+ const primaryMarketplace = marketplace_1.MARKETPLACES[0].name;
552
187
  const primaryPlugins = availablePlugins.filter(p => p.marketplaceName === primaryMarketplace);
553
188
  // Add default external plugins
554
189
  const externalPlugins = [];
555
- for (const defaultPlugin of DEFAULT_EXTERNAL_PLUGINS) {
190
+ for (const defaultPlugin of marketplace_1.DEFAULT_EXTERNAL_PLUGINS) {
556
191
  const plugin = availablePlugins.find(p => p.pluginName === defaultPlugin.pluginName && p.marketplaceName === defaultPlugin.marketplaceName);
557
192
  if (plugin) {
558
193
  externalPlugins.push(plugin);
@@ -568,14 +203,6 @@ const PluginsCommand = {
568
203
  }
569
204
  }
570
205
  info('');
571
- // Check if claude CLI is available
572
- const cli = findClaudeCli();
573
- if (!cli) {
574
- error('Claude CLI not found. Please install Claude Code first.');
575
- info('');
576
- info('Installation: https://docs.anthropic.com/en/docs/claude-code');
577
- return process.exit(1);
578
- }
579
206
  // Prepare marketplaces (add and update cache once per marketplace)
580
207
  const preparedMarketplaces = prepareMarketplaces(pluginsToInstall, cli, toolbox);
581
208
  info('');
@@ -586,8 +213,9 @@ const PluginsCommand = {
586
213
  if (!preparedMarketplaces.has(plugin.marketplaceName)) {
587
214
  results.push({
588
215
  action: 'failed',
589
- contents: EMPTY_PLUGIN_CONTENTS,
216
+ contents: plugin_utils_1.EMPTY_PLUGIN_CONTENTS,
590
217
  plugin,
218
+ postInstall: null,
591
219
  success: false,
592
220
  });
593
221
  continue;
@@ -615,7 +243,7 @@ const PluginsCommand = {
615
243
  info('');
616
244
  info('Installed:');
617
245
  for (const result of successfulResults) {
618
- printPluginSummary(result.plugin.pluginName, result.contents, info);
246
+ (0, plugin_utils_1.printPluginSummary)(result.plugin.pluginName, result.contents, info);
619
247
  }
620
248
  }
621
249
  // Print failed installations
@@ -635,22 +263,43 @@ const PluginsCommand = {
635
263
  info(` ${name}`);
636
264
  }
637
265
  info('');
638
- info('Available plugins:');
639
- availablePlugins.forEach(p => {
640
- info(` ${p.pluginName} - ${p.description}`);
641
- });
266
+ (0, marketplace_1.printAvailablePlugins)(availablePlugins, info);
267
+ }
268
+ // Collect missing environment variables from all successful installations
269
+ const allMissingEnvVars = new Map();
270
+ for (const result of successfulResults) {
271
+ if ((_b = result.postInstall) === null || _b === void 0 ? void 0 : _b.envVarsMissing) {
272
+ for (const envVar of result.postInstall.envVarsMissing) {
273
+ if (!allMissingEnvVars.has(envVar.name)) {
274
+ allMissingEnvVars.set(envVar.name, envVar);
275
+ }
276
+ }
277
+ }
642
278
  }
279
+ // Handle missing environment variables
280
+ const envVarsResult = yield (0, plugin_utils_1.handleMissingEnvVars)(allMissingEnvVars, toolbox);
281
+ // Show next steps
643
282
  if (successCount > 0) {
644
283
  info('');
645
284
  info('Next:');
646
- info(' Restart Claude Code to activate the plugins');
285
+ if (envVarsResult.needed && !envVarsResult.configured) {
286
+ info(' 1. Set required environment variables (see above)');
287
+ info(' 2. Restart Claude Code to activate the plugins');
288
+ }
289
+ else if (envVarsResult.configured || allMissingEnvVars.size > 0) {
290
+ info(' 1. Restart your terminal or run source command');
291
+ info(' 2. Restart Claude Code to activate the plugins');
292
+ }
293
+ else {
294
+ info(' Restart Claude Code to activate the plugins');
295
+ }
647
296
  }
648
297
  info('');
649
298
  if (!toolbox.parameters.options.fromGluegunMenu) {
650
299
  process.exit(totalIssues > 0 ? 1 : 0);
651
300
  }
652
- return 'plugins installed';
301
+ return `${successCount} plugin${successCount !== 1 ? 's' : ''} installed${totalIssues > 0 ? `, ${totalIssues} failed` : ''}`;
653
302
  }),
654
303
  };
655
304
  exports.default = PluginsCommand;
656
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21tYW5kcy9jbGF1ZGUvcGx1Z2lucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBLGlEQUFvRDtBQUNwRCwyQkFBMEU7QUFFMUUsMkJBQTZCO0FBQzdCLCtCQUE0QjtBQWM1QixNQUFNLFlBQVksR0FBd0I7SUFDeEM7UUFDRSxPQUFPLEVBQUUsNkRBQTZEO1FBQ3RFLElBQUksRUFBRSxZQUFZO1FBQ2xCLE9BQU8sRUFBRSw4REFBOEQ7UUFDdkUsSUFBSSxFQUFFLHVCQUF1QjtLQUM5QjtJQUNEO1FBQ0UsT0FBTyxFQUFFLDBFQUEwRTtRQUNuRixJQUFJLEVBQUUseUJBQXlCO1FBQy9CLE9BQU8sRUFBRSwyRUFBMkU7UUFDcEYsSUFBSSxFQUFFLG9DQUFvQztLQUMzQztDQUNGLENBQUM7QUFFRjs7O0dBR0c7QUFDSCxNQUFNLHdCQUF3QixHQUEyRDtJQUN2RixFQUFFLGVBQWUsRUFBRSx5QkFBeUIsRUFBRSxVQUFVLEVBQUUsZ0JBQWdCLEVBQUU7Q0FDN0UsQ0FBQztBQTJDRjs7R0FFRztBQUNILE1BQU0scUJBQXFCLEdBQW1CO0lBQzVDLE1BQU0sRUFBRSxFQUFFO0lBQ1YsUUFBUSxFQUFFLEVBQUU7SUFDWixLQUFLLEVBQUUsQ0FBQztJQUNSLFVBQVUsRUFBRSxFQUFFO0lBQ2QsV0FBVyxFQUFFLEVBQUU7SUFDZixNQUFNLEVBQUUsRUFBRTtDQUNYLENBQUM7QUF5QkY7O0dBRUc7QUFDSCxTQUFlLHFCQUFxQixDQUNsQyxJQUFzRjs7UUFFdEYsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLDhDQUE4QyxDQUFDLENBQUM7UUFFckUsSUFBSSxDQUFDO1lBQ0gsa0RBQWtEO1lBQ2xELE1BQU0sT0FBTyxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FDL0IsWUFBWSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLDJCQUEyQixDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQzFFLENBQUM7WUFFRixrQkFBa0I7WUFDbEIsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO1lBRS9CLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDekIsT0FBTyxDQUFDLElBQUksQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDO2dCQUNwRCxNQUFNLElBQUksS0FBSyxDQUFDLGtCQUFrQixDQUFDLENBQUM7WUFDdEMsQ0FBQztZQUVELG1DQUFtQztZQUNuQyxNQUFNLGFBQWEsR0FBRyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDM0MsS0FBSyxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsZUFBZSxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNO2dCQUMvRCxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUk7YUFDYixDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBRTdCLE1BQU0sT0FBTyxHQUFHLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzNFLE9BQU8sQ0FBQyxPQUFPLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxhQUFhLE9BQU8sR0FBRyxDQUFDLENBQUM7WUFDaEUsT0FBTyxPQUFPLENBQUM7UUFDakIsQ0FBQztRQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7WUFDYixPQUFPLENBQUMsSUFBSSxDQUFDLDJDQUEyQyxDQUFDLENBQUM7WUFDMUQsTUFBTSxHQUFHLENBQUM7UUFDWixDQUFDO0lBQ0gsQ0FBQztDQUFBO0FBRUQ7O0dBRUc7QUFDSCxTQUFlLDJCQUEyQixDQUN4QyxXQUE4Qjs7UUFFOUIsTUFBTSxPQUFPLEdBQW1CLEVBQUUsQ0FBQztRQUVuQyxJQUFJLENBQUM7WUFDSCw0RUFBNEU7WUFDNUUsTUFBTSxrQkFBa0IsR0FBRyxHQUFHLFdBQVcsQ0FBQyxPQUFPLGtDQUFrQyxDQUFDO1lBQ3BGLE1BQU0sdUJBQXVCLEdBQUcsTUFBTSxLQUFLLENBQUMsa0JBQWtCLENBQUMsQ0FBQztZQUVoRSxJQUFJLHVCQUF1QixDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUMvQixJQUFJLENBQUM7b0JBQ0gsTUFBTSxtQkFBbUIsR0FBd0IsTUFBTSx1QkFBdUIsQ0FBQyxJQUFJLEVBQUUsQ0FBQztvQkFDdEYsSUFBSSxtQkFBbUIsQ0FBQyxPQUFPLElBQUksbUJBQW1CLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQzt3QkFDMUUsS0FBSyxNQUFNLE1BQU0sSUFBSSxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsQ0FBQzs0QkFDakQsT0FBTyxDQUFDLElBQUksQ0FBQztnQ0FDWCxXQUFXLEVBQUUsTUFBTSxDQUFDLFdBQVcsSUFBSSxFQUFFO2dDQUNyQyxlQUFlLEVBQUUsV0FBVyxDQUFDLElBQUk7Z0NBQ2pDLGVBQWUsRUFBRSxXQUFXLENBQUMsSUFBSTtnQ0FDakMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxJQUFJOzZCQUN4QixDQUFDLENBQUM7d0JBQ0wsQ0FBQzt3QkFDRCxPQUFPLE9BQU8sQ0FBQztvQkFDakIsQ0FBQztnQkFDSCxDQUFDO2dCQUFDLFdBQU0sQ0FBQztvQkFDUCxtRUFBbUU7Z0JBQ3JFLENBQUM7WUFDSCxDQUFDO1lBRUQsaUZBQWlGO1lBQ2pGLE1BQU0sV0FBVyxHQUFHLE1BQU0sS0FBSyxDQUFDLEdBQUcsV0FBVyxDQUFDLE9BQU8sVUFBVSxDQUFDLENBQUM7WUFDbEUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDcEIsT0FBTyxPQUFPLENBQUM7WUFDakIsQ0FBQztZQUVELE1BQU0sV0FBVyxHQUFxQixNQUFNLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUMvRCxNQUFNLFVBQVUsR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxLQUFLLENBQUMsQ0FBQztZQUU3RCxnREFBZ0Q7WUFDaEQsTUFBTSxnQkFBZ0IsR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQU8sR0FBRyxFQUFFLEVBQUU7Z0JBQ3BELElBQUksQ0FBQztvQkFDSCxNQUFNLFdBQVcsR0FBRyxHQUFHLFdBQVcsQ0FBQyxPQUFPLFlBQVksR0FBRyxDQUFDLElBQUksNkJBQTZCLENBQUM7b0JBQzVGLE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7b0JBRWxELElBQUksZ0JBQWdCLENBQUMsRUFBRSxFQUFFLENBQUM7d0JBQ3hCLE1BQU0sUUFBUSxHQUFtQixNQUFNLGdCQUFnQixDQUFDLElBQUksRUFBRSxDQUFDO3dCQUMvRCxPQUFPOzRCQUNMLFdBQVcsRUFBRSxRQUFRLENBQUMsV0FBVzs0QkFDakMsZUFBZSxFQUFFLFdBQVcsQ0FBQyxJQUFJOzRCQUNqQyxlQUFlLEVBQUUsV0FBVyxDQUFDLElBQUk7NEJBQ2pDLFVBQVUsRUFBRSxRQUFRLENBQUMsSUFBSTt5QkFDVixDQUFDO29CQUNwQixDQUFDO2dCQUNILENBQUM7Z0JBQUMsV0FBTSxDQUFDO29CQUNQLHNDQUFzQztnQkFDeEMsQ0FBQztnQkFDRCxPQUFPLElBQUksQ0FBQztZQUNkLENBQUMsQ0FBQSxDQUFDLENBQUM7WUFFSCxNQUFNLE9BQU8sR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztZQUNwRCxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBcUIsRUFBRSxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ3hFLENBQUM7UUFBQyxXQUFNLENBQUM7WUFDUCwrQ0FBK0M7UUFDakQsQ0FBQztRQUVELE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7Q0FBQTtBQUVEOztHQUVHO0FBQ0gsU0FBUyxhQUFhO0lBQ3BCLE1BQU0sYUFBYSxHQUFHO1FBQ3BCLElBQUEsV0FBSSxFQUFDLElBQUEsWUFBTyxHQUFFLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxRQUFRLENBQUM7UUFDN0MsdUJBQXVCO1FBQ3ZCLGlCQUFpQjtLQUNsQixDQUFDO0lBRUYsS0FBSyxNQUFNLENBQUMsSUFBSSxhQUFhLEVBQUUsQ0FBQztRQUM5QixJQUFJLElBQUEsZUFBVSxFQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDbEIsT0FBTyxDQUFDLENBQUM7UUFDWCxDQUFDO0lBQ0gsQ0FBQztJQUVELElBQUksQ0FBQztRQUNILE1BQU0sTUFBTSxHQUFHLElBQUEsd0JBQVEsRUFBQyxjQUFjLEVBQUUsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2hHLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUMzQixJQUFJLElBQUksSUFBSSxJQUFBLGVBQVUsRUFBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQzdCLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztJQUNILENBQUM7SUFBQyxXQUFNLENBQUM7UUFDUCxnQkFBZ0I7SUFDbEIsQ0FBQztJQUVELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBUyxpQkFBaUIsQ0FBQyxHQUFXLEVBQUUsUUFBUSxHQUFHLEVBQUU7SUFDbkQsTUFBTSxPQUFPLEdBQWEsRUFBRSxDQUFDO0lBQzdCLElBQUksQ0FBQyxJQUFBLGVBQVUsRUFBQyxHQUFHLENBQUM7UUFBRSxPQUFPLE9BQU8sQ0FBQztJQUVyQyxJQUFJLENBQUM7UUFDSCxNQUFNLE9BQU8sR0FBRyxJQUFBLGdCQUFXLEVBQUMsR0FBRyxFQUFFLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDMUQsS0FBSyxNQUFNLEtBQUssSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUM1QixNQUFNLFFBQVEsR0FBRyxJQUFBLFdBQUksRUFBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3ZDLE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxRQUFRLElBQUksS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDO1lBRXpFLElBQUksS0FBSyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUM7Z0JBQ3hCLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxpQkFBaUIsQ0FBQyxRQUFRLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQztZQUM3RCxDQUFDO2lCQUFNLElBQUksS0FBSyxDQUFDLE1BQU0sRUFBRSxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ3hELHdGQUF3RjtnQkFDeEYsTUFBTSxXQUFXLEdBQUcsWUFBWTtxQkFDN0IsT0FBTyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUM7cUJBQ3BCLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7Z0JBQ3ZCLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxXQUFXLEVBQUUsQ0FBQyxDQUFDO1lBQ2xDLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUFDLFdBQU0sQ0FBQztRQUNQLGdCQUFnQjtJQUNsQixDQUFDO0lBRUQsT0FBTyxPQUFPLENBQUM7QUFDakIsQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBZSxhQUFhLENBQzFCLE1BQW9CLEVBQ3BCLEdBQVcsRUFDWCxPQUErQjs7UUFFL0IsTUFBTSxFQUNKLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEdBQzdCLEdBQUcsT0FBTyxDQUFDO1FBRVosbUNBQW1DO1FBQ25DLE1BQU0sY0FBYyxHQUFHLEdBQUcsTUFBTSxDQUFDLFVBQVUsSUFBSSxNQUFNLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDeEUsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixNQUFNLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztRQUN2RSxNQUFNLGFBQWEsR0FBRyxnQkFBZ0IsQ0FBQyxHQUFHLEVBQUUsa0JBQWtCLGNBQWMsRUFBRSxDQUFDLENBQUM7UUFFaEYsSUFBSSxZQUFZLEdBQUcsV0FBVyxDQUFDO1FBQy9CLElBQUksYUFBYSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLElBQUksYUFBYSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztZQUM1RixZQUFZLEdBQUcsWUFBWSxDQUFDO1FBQzlCLENBQUM7YUFBTSxJQUFJLGFBQWEsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLGFBQWEsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7WUFDL0YsWUFBWSxHQUFHLFNBQVMsQ0FBQztRQUMzQixDQUFDO1FBRUQsSUFBSSxhQUFhLENBQUMsT0FBTyxJQUFJLGFBQWEsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxJQUFJLGFBQWEsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUM7WUFDckgsYUFBYSxDQUFDLE9BQU8sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxVQUFVLElBQUksWUFBWSxFQUFFLENBQUMsQ0FBQztRQUNoRSxDQUFDO2FBQU0sQ0FBQztZQUNOLGFBQWEsQ0FBQyxJQUFJLENBQUMscUJBQXFCLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO1lBQzdELEtBQUssQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDNUIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ1QsSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUM7WUFDN0IsSUFBSSxDQUFDLDZCQUE2QixNQUFNLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQztZQUM1RCxJQUFJLENBQUMscUJBQXFCLGNBQWMsRUFBRSxDQUFDLENBQUM7WUFDNUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLHFCQUFxQixFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQztRQUMvRSxDQUFDO1FBRUQsK0JBQStCO1FBQy9CLE1BQU0sY0FBYyxHQUFHLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxlQUFlLEVBQUUsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRXJGLHdGQUF3RjtRQUN4RixNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN2RCxJQUFJLENBQUMsV0FBVyxJQUFJLGNBQWMsQ0FBQyxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxjQUFjLENBQUMsUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUMvRixJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDVCxJQUFJLENBQUMsNENBQTRDLE1BQU0sQ0FBQyxVQUFVLDBDQUEwQyxDQUFDLENBQUM7UUFDaEgsQ0FBQztRQUVELDRCQUE0QjtRQUM1QixJQUFJLGNBQWMsQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzFDLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQywrQkFBK0IsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7WUFDN0UsTUFBTSxVQUFVLEdBQUcsZ0JBQWdCLENBQUMsY0FBYyxDQUFDLFdBQVcsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUV2RSxJQUFJLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDdkIsSUFBSSxVQUFVLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztvQkFDaEMsV0FBVyxDQUFDLE9BQU8sQ0FBQyw4QkFBOEIsTUFBTSxDQUFDLFVBQVUsS0FBSyxVQUFVLENBQUMsS0FBSyxDQUFDLE1BQU0sU0FBUyxDQUFDLENBQUM7Z0JBQzVHLENBQUM7cUJBQU0sQ0FBQztvQkFDTixXQUFXLENBQUMsT0FBTyxDQUFDLHNDQUFzQyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztnQkFDakYsQ0FBQztZQUNILENBQUM7aUJBQU0sQ0FBQztnQkFDTixXQUFXLENBQUMsSUFBSSxDQUFDLHVDQUF1QyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztnQkFDN0UsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUNULElBQUksQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO2dCQUNqRCxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxFQUFFLEtBQUssRUFBRSxjQUFjLENBQUMsV0FBVyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN4RixDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDO0lBQzNFLENBQUM7Q0FBQTtBQUVEOzs7R0FHRztBQUNILFNBQVMsbUJBQW1CLENBQzFCLE9BQXVCLEVBQ3ZCLEdBQVcsRUFDWCxPQUErQjtJQUUvQixNQUFNLEVBQ0osS0FBSyxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxHQUN2QixHQUFHLE9BQU8sQ0FBQztJQUVaLHVDQUF1QztJQUN2QyxNQUFNLGNBQWMsR0FBRyxJQUFJLEdBQUcsRUFBd0IsQ0FBQztJQUN2RCxLQUFLLE1BQU0sTUFBTSxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQzdCLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDO1lBQ2hELGNBQWMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLGVBQWUsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNyRCxDQUFDO0lBQ0gsQ0FBQztJQUVELE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztJQUUvQyxLQUFLLE1BQU0sQ0FBQyxlQUFlLEVBQUUsTUFBTSxDQUFDLElBQUksY0FBYyxFQUFFLENBQUM7UUFDdkQsa0JBQWtCO1FBQ2xCLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxzQkFBc0IsZUFBZSxFQUFFLENBQUMsQ0FBQztRQUNqRSxNQUFNLFNBQVMsR0FBRyxnQkFBZ0IsQ0FBQyxHQUFHLEVBQUUsMEJBQTBCLE1BQU0sQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDO1FBRTVGLElBQUksU0FBUyxDQUFDLE9BQU8sSUFBSSxTQUFTLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1lBQzlELFVBQVUsQ0FBQyxPQUFPLENBQUMsZUFBZSxlQUFlLFFBQVEsQ0FBQyxDQUFDO1FBQzdELENBQUM7YUFBTSxDQUFDO1lBQ04sVUFBVSxDQUFDLElBQUksQ0FBQyw2QkFBNkIsZUFBZSxFQUFFLENBQUMsQ0FBQztZQUNoRSxLQUFLLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3hCLFNBQVM7UUFDWCxDQUFDO1FBRUQsMkJBQTJCO1FBQzNCLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxrQ0FBa0MsZUFBZSxFQUFFLENBQUMsQ0FBQztRQUNoRixNQUFNLFlBQVksR0FBRyxnQkFBZ0IsQ0FBQyxHQUFHLEVBQUUsNkJBQTZCLGVBQWUsRUFBRSxDQUFDLENBQUM7UUFFM0YsSUFBSSxZQUFZLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDekIsYUFBYSxDQUFDLE9BQU8sQ0FBQyxlQUFlLGVBQWUsZ0JBQWdCLENBQUMsQ0FBQztRQUN4RSxDQUFDO2FBQU0sQ0FBQztZQUNOLGFBQWEsQ0FBQyxjQUFjLENBQUMsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxvQkFBb0IsZUFBZSw4QkFBOEIsRUFBRSxDQUFDLENBQUM7UUFDekgsQ0FBQztRQUVELG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRUQsT0FBTyxvQkFBb0IsQ0FBQztBQUM5QixDQUFDO0FBRUQ7O0dBRUc7QUFDSCxTQUFTLGtCQUFrQixDQUN6QixVQUFrQixFQUNsQixRQUF3QixFQUN4QixJQUEyQjtJQUUzQixNQUFNLFdBQVcsR0FBRyxVQUFVLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2hELE1BQU0sVUFBVSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxRQUFRLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksUUFBUSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBRTVHLElBQUksVUFBVSxJQUFJLFdBQVcsRUFBRSxDQUFDO1FBQzlCLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNULElBQUksQ0FBQyxHQUFHLFVBQVUsR0FBRyxDQUFDLENBQUM7UUFFdkIscUNBQXFDO1FBQ3JDLElBQUksV0FBVyxFQUFFLENBQUM7WUFDaEIsSUFBSSxDQUFDLCtCQUErQixDQUFDLENBQUM7UUFDeEMsQ0FBQztRQUVELG1FQUFtRTtRQUNuRSxJQUFJLFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQy9CLElBQUksQ0FBQyxhQUFhLFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxNQUFNLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUM5RSxDQUFDO1FBQ0QsSUFBSSxRQUFRLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNqQyxNQUFNLE9BQU8sR0FBRyxDQUFDLENBQUM7WUFDbEIsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ2xELE1BQU0sU0FBUyxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQztZQUNyRCxNQUFNLFdBQVcsR0FBRyxTQUFTLEdBQUcsQ0FBQztnQkFDL0IsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxTQUFTLE9BQU87Z0JBQzdDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3JCLElBQUksQ0FBQyxlQUFlLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxNQUFNLFdBQVcsRUFBRSxDQUFDLENBQUM7UUFDbkUsQ0FBQztRQUNELElBQUksUUFBUSxDQUFDLEtBQUssR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN2QixJQUFJLENBQUMsWUFBWSxRQUFRLENBQUMsS0FBSyx1QkFBdUIsQ0FBQyxDQUFDO1FBQzFELENBQUM7UUFDRCxJQUFJLFFBQVEsQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ25DLElBQUksQ0FBQyxrQkFBa0IsUUFBUSxDQUFDLFVBQVUsQ0FBQyxNQUFNLE1BQU0sUUFBUSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzNGLENBQUM7UUFDRCxJQUFJLFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQy9CLElBQUksQ0FBQyxhQUFhLFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxNQUFNLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUM5RSxDQUFDO0lBQ0gsQ0FBQztBQUNILENBQUM7QUFFRDs7R0FFRztBQUNILFNBQVMsa0JBQWtCLENBQUMsZUFBdUIsRUFBRSxVQUFrQjtJQUNyRSxNQUFNLFNBQVMsR0FBRyxJQUFBLFdBQUksRUFDcEIsSUFBQSxZQUFPLEdBQUUsRUFDVCxTQUFTLEVBQ1QsU0FBUyxFQUNULGNBQWMsRUFDZCxlQUFlLEVBQ2YsU0FBUyxFQUNULFVBQVUsQ0FDWCxDQUFDO0lBRUYsTUFBTSxNQUFNLEdBQW1CO1FBQzdCLE1BQU0sRUFBRSxFQUFFO1FBQ1YsUUFBUSxFQUFFLEVBQUU7UUFDWixLQUFLLEVBQUUsQ0FBQztRQUNSLFVBQVUsRUFBRSxFQUFFO1FBQ2QsV0FBVyxFQUFFLEVBQUU7UUFDZixNQUFNLEVBQUUsRUFBRTtLQUNYLENBQUM7SUFFRixjQUFjO0lBQ2QsTUFBTSxTQUFTLEdBQUcsSUFBQSxXQUFJLEVBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQzVDLElBQUksSUFBQSxlQUFVLEVBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztRQUMxQixJQUFJLENBQUM7WUFDSCxNQUFNLENBQUMsTUFBTSxHQUFHLElBQUEsZ0JBQVcsRUFBQyxTQUFTLEVBQUUsRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFFLENBQUM7aUJBQzVELE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQztpQkFDdEMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2hDLENBQUM7UUFBQyxXQUFNLENBQUM7WUFDUCxTQUFTO1FBQ1gsQ0FBQztJQUNILENBQUM7SUFFRCxjQUFjO0lBQ2QsTUFBTSxTQUFTLEdBQUcsSUFBQSxXQUFJLEVBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQzVDLElBQUksSUFBQSxlQUFVLEVBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztRQUMxQixJQUFJLENBQUM7WUFDSCxNQUFNLENBQUMsTUFBTSxHQUFHLElBQUEsZ0JBQVcsRUFBQyxTQUFTLEVBQUUsRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFFLENBQUM7aUJBQzVELE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztpQkFDaEUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDckQsQ0FBQztRQUFDLFdBQU0sQ0FBQztZQUNQLFNBQVM7UUFDWCxDQUFDO0lBQ0gsQ0FBQztJQUVELGdCQUFnQjtJQUNoQixNQUFNLFdBQVcsR0FBRyxJQUFBLFdBQUksRUFBQyxTQUFTLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDaEQsTUFBTSxDQUFDLFFBQVEsR0FBRyxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUVqRCxhQUFhO0lBQ2IsTUFBTSxTQUFTLEdBQUcsSUFBQSxXQUFJLEVBQUMsU0FBUyxFQUFFLE9BQU8sRUFBRSxZQUFZLENBQUMsQ0FBQztJQUN6RCxJQUFJLElBQUEsZUFBVSxFQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDO1lBQ0gsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFBLGlCQUFZLEVBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFDbEUscUNBQXFDO1lBQ3JDLEtBQUssTUFBTSxVQUFVLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUM7Z0JBQ2pFLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO29CQUM5QixLQUFLLE1BQU0sU0FBUyxJQUFJLFVBQVUsRUFBRSxDQUFDO3dCQUNuQyxJQUFJLFNBQVMsQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQzs0QkFDdEQsTUFBTSxDQUFDLEtBQUssSUFBSSxTQUFTLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQzt3QkFDekMsQ0FBQztvQkFDSCxDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUFDLFdBQU0sQ0FBQztZQUNQLFNBQVM7UUFDWCxDQUFDO0lBQ0gsQ0FBQztJQUVELG1CQUFtQjtJQUNuQixNQUFNLE9BQU8sR0FBRyxJQUFBLFdBQUksRUFBQyxTQUFTLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDN0MsSUFBSSxJQUFBLGVBQVUsRUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQztZQUNILE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBQSxpQkFBWSxFQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQzlELElBQUksVUFBVSxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUMxQixNQUFNLENBQUMsVUFBVSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ3pELENBQUM7UUFDSCxDQUFDO1FBQUMsV0FBTSxDQUFDO1lBQ1AsU0FBUztRQUNYLENBQUM7SUFDSCxDQUFDO0lBRUQsbUJBQW1CO0lBQ25CLE1BQU0sZUFBZSxHQUFHLElBQUEsV0FBSSxFQUFDLFNBQVMsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO0lBQzVELElBQUksSUFBQSxlQUFVLEVBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQztRQUNoQyxJQUFJLENBQUM7WUFDSCxNQUFNLE9BQU8sR0FBRyxJQUFBLGlCQUFZLEVBQUMsZUFBZSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ3ZELE1BQU0sV0FBVyxHQUFzQixJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzNELE1BQU0sQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbkUsQ0FBQztRQUFDLFdBQU0sQ0FBQztZQUNQLFNBQVM7UUFDWCxDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRDs7R0FFRztBQUNILFNBQVMsZ0JBQWdCLENBQUMsR0FBVyxFQUFFLElBQVk7SUFDakQsSUFBSSxDQUFDO1FBQ0gsTUFBTSxNQUFNLEdBQUcsSUFBQSx5QkFBUyxFQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQzdDLFFBQVEsRUFBRSxPQUFPO1lBQ2pCLEtBQUssRUFBRSxJQUFJO1lBQ1gsS0FBSyxFQUFFLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUM7U0FDaEMsQ0FBQyxDQUFDO1FBQ0gsT0FBTztZQUNMLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNO1lBQ3JDLE9BQU8sRUFBRSxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUM7U0FDN0IsQ0FBQztJQUNKLENBQUM7SUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ2IsT0FBTztZQUNMLE1BQU0sRUFBRSxHQUFHLENBQUMsT0FBTztZQUNuQixPQUFPLEVBQUUsS0FBSztTQUNmLENBQUM7SUFDSixDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLGdCQUFnQixDQUN2QixtQkFBNkIsRUFDN0IsS0FBNEI7SUFFNUIsTUFBTSxZQUFZLEdBQUcsSUFBQSxXQUFJLEVBQUMsSUFBQSxZQUFPLEdBQUUsRUFBRSxTQUFTLEVBQUUsZUFBZSxDQUFDLENBQUM7SUFFakUsSUFBSSxDQUFDO1FBQ0gseUJBQXlCO1FBQ3pCLElBQUksUUFBUSxHQUE0QixFQUFFLENBQUM7UUFDM0MsSUFBSSxJQUFBLGVBQVUsRUFBQyxZQUFZLENBQUMsRUFBRSxDQUFDO1lBQzdCLE1BQU0sT0FBTyxHQUFHLElBQUEsaUJBQVksRUFBQyxZQUFZLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDcEQsUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDakMsQ0FBQztRQUVELGtDQUFrQztRQUNsQyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQzFCLFFBQVEsQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO1FBQzVCLENBQUM7UUFDRCxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsV0FBc0MsQ0FBQztRQUM5RCxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2pCLEtBQUssQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO1FBQ25CLENBQUM7UUFFRCxNQUFNLGdCQUFnQixHQUFHLEtBQUssQ0FBQyxLQUFpQixDQUFDO1FBRWpELHdCQUF3QjtRQUN4QixNQUFNLEtBQUssR0FBYSxFQUFFLENBQUM7UUFDM0IsTUFBTSxRQUFRLEdBQWEsRUFBRSxDQUFDO1FBRTlCLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNqQyxJQUFJLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUNwQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3RCLENBQUM7aUJBQU0sQ0FBQztnQkFDTixLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ25CLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILHNCQUFzQjtRQUN0QixJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDckIsS0FBSyxDQUFDLEtBQUssR0FBRyxDQUFDLEdBQUcsZ0JBQWdCLEVBQUUsR0FBRyxLQUFLLENBQUMsQ0FBQztZQUM5QyxJQUFBLGtCQUFhLEVBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pFLENBQUM7UUFFRCxPQUFPLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUM7SUFDNUMsQ0FBQztJQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDYixLQUFLLENBQUMsb0NBQW9DLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ3pELE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDO0lBQ3JELENBQUM7QUFDSCxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLGNBQWMsR0FBbUI7SUFDckMsS0FBSyxFQUFFLENBQUMsR0FBRyxDQUFDO0lBQ1osV0FBVyxFQUFFLDZCQUE2QjtJQUMxQyxNQUFNLEVBQUUsS0FBSztJQUNiLElBQUksRUFBRSxTQUFTO0lBQ2YsR0FBRyxFQUFFLENBQU8sT0FBK0IsRUFBRSxFQUFFOztRQUM3QyxNQUFNLEVBQ0osTUFBTSxFQUNOLFVBQVUsRUFDVixLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEVBQzlDLE1BQU0sR0FDUCxHQUFHLE9BQU8sQ0FBQztRQUVaLGNBQWM7UUFDZCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUM7UUFFbEMsc0NBQXNDO1FBQ3RDLElBQUksZ0JBQWdDLENBQUM7UUFDckMsSUFBSSxDQUFDO1lBQ0gsZ0JBQWdCLEdBQUcsTUFBTSxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN2RCxDQUFDO1FBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUNiLEtBQUssQ0FBQyw0QkFBNEIsR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7WUFDakQsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ1QsSUFBSSxDQUFDLG9EQUFvRCxDQUFDLENBQUM7WUFDM0QsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3pCLENBQUM7UUFFRCxJQUFJLGdCQUFnQixDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNsQyxLQUFLLENBQUMscUNBQXFDLENBQUMsQ0FBQztZQUM3QyxPQUFPLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDekIsQ0FBQztRQUVELGlEQUFpRDtRQUNqRCxNQUFNLGdCQUFnQixHQUFHLENBQUEsTUFBQSxVQUFVLENBQUMsS0FBSywwQ0FBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQWUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLFFBQVEsQ0FBQyxLQUFJLEVBQUUsQ0FBQztRQUVuRyxxQ0FBcUM7UUFDckMsSUFBSSxnQkFBZ0MsQ0FBQztRQUNyQyxNQUFNLGVBQWUsR0FBYSxFQUFFLENBQUM7UUFFckMsSUFBSSxnQkFBZ0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDaEMsZ0NBQWdDO1lBQ2hDLGdCQUFnQixHQUFHLEVBQUUsQ0FBQztZQUV0QixLQUFLLE1BQU0sSUFBSSxJQUFJLGdCQUFnQixFQUFFLENBQUM7Z0JBQ3BDLE1BQU0sTUFBTSxHQUFHLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLEtBQUssSUFBSSxDQUFDLENBQUM7Z0JBQ2pFLElBQUksTUFBTSxFQUFFLENBQUM7b0JBQ1gsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUNoQyxDQUFDO3FCQUFNLENBQUM7b0JBQ04sZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDN0IsQ0FBQztZQUNILENBQUM7WUFFRCwwREFBMEQ7WUFDMUQsSUFBSSxlQUFlLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUMvQixPQUFPLENBQUMsU0FBUyxlQUFlLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLGVBQWUsZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDckcsQ0FBQztZQUVELDRDQUE0QztZQUM1QyxJQUFJLGdCQUFnQixDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDbEMsS0FBSyxDQUFDLDhCQUE4QixDQUFDLENBQUM7Z0JBQ3RDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDVCxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQztnQkFDM0IsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO29CQUMzQixJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsVUFBVSxNQUFNLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO2dCQUMvQyxDQUFDLENBQUMsQ0FBQztnQkFDSCxPQUFPLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDekIsQ0FBQztZQUVELElBQUksQ0FBQyxjQUFjLGdCQUFnQixDQUFDLE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN2SixDQUFDO2FBQU0sQ0FBQztZQUNOLDBGQUEwRjtZQUMxRixNQUFNLGtCQUFrQixHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDaEQsTUFBTSxjQUFjLEdBQUcsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLGVBQWUsS0FBSyxrQkFBa0IsQ0FBQyxDQUFDO1lBRTlGLCtCQUErQjtZQUMvQixNQUFNLGVBQWUsR0FBbUIsRUFBRSxDQUFDO1lBQzNDLEtBQUssTUFBTSxhQUFhLElBQUksd0JBQXdCLEVBQUUsQ0FBQztnQkFDckQsTUFBTSxNQUFNLEdBQUcsZ0JBQWdCLENBQUMsSUFBSSxDQUNsQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLEtBQUssYUFBYSxDQUFDLFVBQVUsSUFBSSxDQUFDLENBQUMsZUFBZSxLQUFLLGFBQWEsQ0FBQyxlQUFlLENBQ3RHLENBQUM7Z0JBQ0YsSUFBSSxNQUFNLEVBQUUsQ0FBQztvQkFDWCxlQUFlLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUMvQixDQUFDO1lBQ0gsQ0FBQztZQUVELGdCQUFnQixHQUFHLENBQUMsR0FBRyxjQUFjLEVBQUUsR0FBRyxlQUFlLENBQUMsQ0FBQztZQUUzRCxJQUFJLGVBQWUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQy9CLElBQUksQ0FBQyxjQUFjLGNBQWMsQ0FBQyxNQUFNLGlCQUFpQixrQkFBa0IsRUFBRSxDQUFDLENBQUM7Z0JBQy9FLElBQUksQ0FBQyxPQUFPLGVBQWUsQ0FBQyxNQUFNLHFCQUFxQixlQUFlLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDOUcsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLElBQUksQ0FBQywyQkFBMkIsZ0JBQWdCLENBQUMsTUFBTSxNQUFNLENBQUMsQ0FBQztZQUNqRSxDQUFDO1FBQ0gsQ0FBQztRQUNELElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUVULG1DQUFtQztRQUNuQyxNQUFNLEdBQUcsR0FBRyxhQUFhLEVBQUUsQ0FBQztRQUM1QixJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDVCxLQUFLLENBQUMseURBQXlELENBQUMsQ0FBQztZQUNqRSxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDVCxJQUFJLENBQUMsOERBQThELENBQUMsQ0FBQztZQUNyRSxPQUFPLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDekIsQ0FBQztRQUVELG1FQUFtRTtRQUNuRSxNQUFNLG9CQUFvQixHQUFHLG1CQUFtQixDQUFDLGdCQUFnQixFQUFFLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNqRixJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFVCxpRUFBaUU7UUFDakUsTUFBTSxPQUFPLEdBQWdHLEVBQUUsQ0FBQztRQUVoSCxLQUFLLE1BQU0sTUFBTSxJQUFJLGdCQUFnQixFQUFFLENBQUM7WUFDdEMsd0RBQXdEO1lBQ3hELElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUM7Z0JBQ3RELE9BQU8sQ0FBQyxJQUFJLENBQUM7b0JBQ1gsTUFBTSxFQUFFLFFBQVE7b0JBQ2hCLFFBQVEsRUFBRSxxQkFBcUI7b0JBQy9CLE1BQU07b0JBQ04sT0FBTyxFQUFFLEtBQUs7aUJBQ2YsQ0FBQyxDQUFDO2dCQUNILFNBQVM7WUFDWCxDQUFDO1lBRUQsTUFBTSxNQUFNLEdBQUcsTUFBTSxhQUFhLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztZQUN6RCxPQUFPLENBQUMsSUFBSSxpQ0FBTSxNQUFNLEtBQUUsTUFBTSxJQUFHLENBQUM7WUFFcEMsSUFBSSxnQkFBZ0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEdBQUcsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQzVFLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLDhCQUE4QjtZQUMxQyxDQUFDO1FBQ0gsQ0FBQztRQUVELFVBQVU7UUFDVixNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUMzRCxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDO1FBQ3pELE1BQU0sV0FBVyxHQUFHLFNBQVMsR0FBRyxlQUFlLENBQUMsTUFBTSxDQUFDO1FBRXZELElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNULElBQUksV0FBVyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3RCLE9BQU8sQ0FBQyxHQUFHLFlBQVksVUFBVSxZQUFZLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsaUJBQWlCLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMxSCxDQUFDO2FBQU0sQ0FBQztZQUNOLE9BQU8sQ0FBQyxHQUFHLFlBQVksZUFBZSxXQUFXLFNBQVMsV0FBVyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sTUFBTSxDQUFDLHFCQUFxQixDQUFDLEtBQUssRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3hJLENBQUM7UUFFRCwrQ0FBK0M7UUFDL0MsTUFBTSxpQkFBaUIsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3pELElBQUksaUJBQWlCLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ2pDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNULElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUNuQixLQUFLLE1BQU0sTUFBTSxJQUFJLGlCQUFpQixFQUFFLENBQUM7Z0JBQ3ZDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDdEUsQ0FBQztRQUNILENBQUM7UUFFRCw2QkFBNkI7UUFDN0IsTUFBTSxhQUFhLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3RELElBQUksYUFBYSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUM3QixJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDVCxPQUFPLENBQUMsb0JBQW9CLENBQUMsQ0FBQztZQUM5QixLQUFLLE1BQU0sTUFBTSxJQUFJLGFBQWEsRUFBRSxDQUFDO2dCQUNuQyxJQUFJLENBQUMsS0FBSyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7WUFDeEMsQ0FBQztRQUNILENBQUM7UUFFRCwwQkFBMEI7UUFDMUIsSUFBSSxlQUFlLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQy9CLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNULE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUN0QixLQUFLLE1BQU0sSUFBSSxJQUFJLGVBQWUsRUFBRSxDQUFDO2dCQUNuQyxJQUFJLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ3BCLENBQUM7WUFDRCxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDVCxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQztZQUMzQixnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0JBQzNCLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxVQUFVLE1BQU0sQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7WUFDL0MsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO1FBRUQsSUFBSSxZQUFZLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDckIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ1QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2QsSUFBSSxDQUFDLCtDQUErQyxDQUFDLENBQUM7UUFDeEQsQ0FBQztRQUNELElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUVULElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUNoRCxPQUFPLENBQUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDeEMsQ0FBQztRQUVELE9BQU8sbUJBQW1CLENBQUM7SUFDN0IsQ0FBQyxDQUFBO0NBQ0YsQ0FBQztBQUVGLGtCQUFlLGNBQWMsQ0FBQyJ9
305
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21tYW5kcy9jbGF1ZGUvcGx1Z2lucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUdBLHFEQUErRjtBQUMvRix1REFNK0I7QUFDL0IseURBVWdDO0FBRWhDOztHQUVHO0FBQ0gsU0FBZSxhQUFhLENBQzFCLE1BQW9CLEVBQ3BCLEdBQVcsRUFDWCxPQUErQjs7UUFFL0IsTUFBTSxFQUNKLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEdBQzdCLEdBQUcsT0FBTyxDQUFDO1FBRVosbUNBQW1DO1FBQ25DLE1BQU0sY0FBYyxHQUFHLEdBQUcsTUFBTSxDQUFDLFVBQVUsSUFBSSxNQUFNLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDeEUsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixNQUFNLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztRQUN2RSxNQUFNLGFBQWEsR0FBRyxJQUFBLDZCQUFnQixFQUFDLEdBQUcsRUFBRSxrQkFBa0IsY0FBYyxFQUFFLENBQUMsQ0FBQztRQUVoRixJQUFJLFlBQVksR0FBRyxXQUFXLENBQUM7UUFDL0IsSUFBSSxhQUFhLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsSUFBSSxhQUFhLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO1lBQzVGLFlBQVksR0FBRyxZQUFZLENBQUM7UUFDOUIsQ0FBQzthQUFNLElBQUksYUFBYSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksYUFBYSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztZQUMvRixZQUFZLEdBQUcsU0FBUyxDQUFDO1FBQzNCLENBQUM7UUFFRCxJQUFJLGFBQWEsQ0FBQyxPQUFPLElBQUksYUFBYSxDQUFD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