hostinglint 0.1.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/LICENSE +21 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +355 -0
- package/dist/cli.js.map +1 -0
- package/package.json +51 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Stdubic
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,355 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
// HostingLint CLI
|
|
4
|
+
// Usage: hostinglint check <path> [options]
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const commander_1 = require("commander");
|
|
7
|
+
const node_fs_1 = require("node:fs");
|
|
8
|
+
const node_path_1 = require("node:path");
|
|
9
|
+
const core_1 = require("@hostinglint/core");
|
|
10
|
+
const program = new commander_1.Command();
|
|
11
|
+
program
|
|
12
|
+
.name('hostinglint')
|
|
13
|
+
.description('Static analysis toolkit for hosting control panel modules')
|
|
14
|
+
.version('0.1.0');
|
|
15
|
+
program
|
|
16
|
+
.command('check')
|
|
17
|
+
.description('Check hosting module files for issues')
|
|
18
|
+
.argument('<path>', 'Path to file or directory to check')
|
|
19
|
+
.option('-p, --platform <platform>', 'Target platform: whmcs, cpanel, openpanel (auto-detected if not specified)')
|
|
20
|
+
.option('--php-version <version>', 'Target PHP version for compatibility checks (default: 8.3)', '8.3')
|
|
21
|
+
.option('-f, --format <format>', 'Output format: text, json, sarif (default: text)', 'text')
|
|
22
|
+
.option('-c, --config <path>', 'Path to configuration file')
|
|
23
|
+
.option('-w, --watch', 'Watch for file changes and re-run analysis')
|
|
24
|
+
.option('--fix', 'Automatically fix problems where possible')
|
|
25
|
+
.option('--no-security', 'Disable security checks')
|
|
26
|
+
.option('--no-best-practices', 'Disable best practice checks')
|
|
27
|
+
.action((targetPath, options) => {
|
|
28
|
+
const resolvedPath = (0, node_path_1.resolve)(targetPath);
|
|
29
|
+
// Load configuration file
|
|
30
|
+
const config = options.config
|
|
31
|
+
? (0, core_1.findConfig)((0, node_path_1.resolve)(options.config))
|
|
32
|
+
: (0, core_1.findConfig)(resolvedPath);
|
|
33
|
+
// Merge CLI options with config (CLI takes precedence)
|
|
34
|
+
const mergedOptions = mergeCliWithConfig(options, config);
|
|
35
|
+
/**
|
|
36
|
+
* Run a single analysis pass
|
|
37
|
+
*/
|
|
38
|
+
const runAnalysis = () => {
|
|
39
|
+
const files = collectFiles(resolvedPath, config.ignore ?? []);
|
|
40
|
+
if (files.length === 0) {
|
|
41
|
+
console.error(`No supported files found in: ${targetPath}`);
|
|
42
|
+
if (!options.watch)
|
|
43
|
+
process.exit(1);
|
|
44
|
+
return { filesChecked: 0, errors: 0, warnings: 0, infos: 0, results: new Map() };
|
|
45
|
+
}
|
|
46
|
+
const summary = analyzeFiles(files, mergedOptions, config);
|
|
47
|
+
// Auto-fix mode
|
|
48
|
+
if (options.fix) {
|
|
49
|
+
const fixedCount = applyAutoFixes(summary);
|
|
50
|
+
if (fixedCount > 0) {
|
|
51
|
+
console.error(`\n Fixed ${fixedCount} problem${fixedCount !== 1 ? 's' : ''} automatically.\n`);
|
|
52
|
+
// Re-run analysis after fixes to show remaining issues
|
|
53
|
+
const postFixSummary = analyzeFiles(files, mergedOptions, config);
|
|
54
|
+
outputResults(postFixSummary, mergedOptions.format);
|
|
55
|
+
return postFixSummary;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
outputResults(summary, mergedOptions.format);
|
|
59
|
+
return summary;
|
|
60
|
+
};
|
|
61
|
+
// Initial run
|
|
62
|
+
const summary = runAnalysis();
|
|
63
|
+
if (options.watch) {
|
|
64
|
+
console.error('\n Watching for file changes... (press Ctrl+C to stop)\n');
|
|
65
|
+
let debounceTimer = null;
|
|
66
|
+
const stat = (0, node_fs_1.statSync)(resolvedPath);
|
|
67
|
+
const watchPath = stat.isDirectory() ? resolvedPath : (0, node_path_1.resolve)(resolvedPath, '..');
|
|
68
|
+
try {
|
|
69
|
+
(0, node_fs_1.watch)(watchPath, { recursive: true }, (_eventType, filename) => {
|
|
70
|
+
if (!filename)
|
|
71
|
+
return;
|
|
72
|
+
const fullPath = (0, node_path_1.resolve)(watchPath, filename);
|
|
73
|
+
// Only re-run for supported files
|
|
74
|
+
if (!isSupportedFile(fullPath))
|
|
75
|
+
return;
|
|
76
|
+
if ((0, core_1.shouldIgnore)(fullPath, config.ignore ?? []))
|
|
77
|
+
return;
|
|
78
|
+
// Debounce to avoid rapid re-runs
|
|
79
|
+
if (debounceTimer)
|
|
80
|
+
clearTimeout(debounceTimer);
|
|
81
|
+
debounceTimer = setTimeout(() => {
|
|
82
|
+
console.error(`\n File changed: ${filename}\n`);
|
|
83
|
+
runAnalysis();
|
|
84
|
+
console.error('\n Watching for file changes... (press Ctrl+C to stop)\n');
|
|
85
|
+
}, 300);
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
console.error('Watch mode is not supported on this platform. Running single pass only.');
|
|
90
|
+
if (summary.errors > 0)
|
|
91
|
+
process.exit(1);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
// Exit with error code if there are errors
|
|
96
|
+
if (summary.errors > 0) {
|
|
97
|
+
process.exit(1);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
program.parse();
|
|
102
|
+
/**
|
|
103
|
+
* Merge CLI options with loaded config (CLI takes precedence)
|
|
104
|
+
*/
|
|
105
|
+
function mergeCliWithConfig(options, config) {
|
|
106
|
+
return {
|
|
107
|
+
...options,
|
|
108
|
+
phpVersion: options.phpVersion || config.phpVersion || '8.3',
|
|
109
|
+
security: options.security !== false ? (config.security ?? true) : false,
|
|
110
|
+
bestPractices: options.bestPractices !== false ? (config.bestPractices ?? true) : false,
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
// =============================================================================
|
|
114
|
+
// File Collection
|
|
115
|
+
// =============================================================================
|
|
116
|
+
/**
|
|
117
|
+
* Collect all supported files from a path (file or directory)
|
|
118
|
+
*/
|
|
119
|
+
function collectFiles(targetPath, ignorePatterns = []) {
|
|
120
|
+
const stat = (0, node_fs_1.statSync)(targetPath);
|
|
121
|
+
if (stat.isFile()) {
|
|
122
|
+
if ((0, core_1.shouldIgnore)(targetPath, ignorePatterns))
|
|
123
|
+
return [];
|
|
124
|
+
return isSupportedFile(targetPath) ? [targetPath] : [];
|
|
125
|
+
}
|
|
126
|
+
if (stat.isDirectory()) {
|
|
127
|
+
return walkDirectory(targetPath, ignorePatterns);
|
|
128
|
+
}
|
|
129
|
+
return [];
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Recursively walk a directory and collect supported files
|
|
133
|
+
*/
|
|
134
|
+
function walkDirectory(dir, ignorePatterns = []) {
|
|
135
|
+
const files = [];
|
|
136
|
+
const entries = (0, node_fs_1.readdirSync)(dir);
|
|
137
|
+
for (const entry of entries) {
|
|
138
|
+
// Skip hidden directories and node_modules
|
|
139
|
+
if (entry.startsWith('.') || entry === 'node_modules' || entry === 'vendor') {
|
|
140
|
+
continue;
|
|
141
|
+
}
|
|
142
|
+
const fullPath = (0, node_path_1.resolve)(dir, entry);
|
|
143
|
+
if ((0, core_1.shouldIgnore)(fullPath, ignorePatterns))
|
|
144
|
+
continue;
|
|
145
|
+
const stat = (0, node_fs_1.statSync)(fullPath);
|
|
146
|
+
if (stat.isDirectory()) {
|
|
147
|
+
files.push(...walkDirectory(fullPath, ignorePatterns));
|
|
148
|
+
}
|
|
149
|
+
else if (isSupportedFile(fullPath)) {
|
|
150
|
+
files.push(fullPath);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
return files;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Check if a file has a supported extension
|
|
157
|
+
*/
|
|
158
|
+
function isSupportedFile(filePath) {
|
|
159
|
+
return (0, core_1.detectPlatform)(filePath) !== null;
|
|
160
|
+
}
|
|
161
|
+
// =============================================================================
|
|
162
|
+
// Analysis
|
|
163
|
+
// =============================================================================
|
|
164
|
+
/**
|
|
165
|
+
* Analyze all collected files using analyzeAuto from core
|
|
166
|
+
*/
|
|
167
|
+
function analyzeFiles(files, options, config) {
|
|
168
|
+
const summary = {
|
|
169
|
+
filesChecked: files.length,
|
|
170
|
+
errors: 0,
|
|
171
|
+
warnings: 0,
|
|
172
|
+
infos: 0,
|
|
173
|
+
results: new Map(),
|
|
174
|
+
};
|
|
175
|
+
for (const file of files) {
|
|
176
|
+
const code = (0, node_fs_1.readFileSync)(file, 'utf-8');
|
|
177
|
+
const results = (0, core_1.analyzeAuto)(code, file, {
|
|
178
|
+
platform: options.platform,
|
|
179
|
+
phpVersion: options.phpVersion,
|
|
180
|
+
security: options.security,
|
|
181
|
+
bestPractices: options.bestPractices,
|
|
182
|
+
rules: config.rules,
|
|
183
|
+
});
|
|
184
|
+
if (results.length === 0)
|
|
185
|
+
continue;
|
|
186
|
+
summary.results.set(file, results);
|
|
187
|
+
for (const result of results) {
|
|
188
|
+
switch (result.severity) {
|
|
189
|
+
case 'error':
|
|
190
|
+
summary.errors++;
|
|
191
|
+
break;
|
|
192
|
+
case 'warning':
|
|
193
|
+
summary.warnings++;
|
|
194
|
+
break;
|
|
195
|
+
case 'info':
|
|
196
|
+
summary.infos++;
|
|
197
|
+
break;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
return summary;
|
|
202
|
+
}
|
|
203
|
+
// =============================================================================
|
|
204
|
+
// Auto-Fix
|
|
205
|
+
// =============================================================================
|
|
206
|
+
/**
|
|
207
|
+
* Apply auto-fixes for all files in the summary
|
|
208
|
+
* Returns total number of fixes applied
|
|
209
|
+
*/
|
|
210
|
+
function applyAutoFixes(summary) {
|
|
211
|
+
let totalFixed = 0;
|
|
212
|
+
for (const [file, results] of summary.results) {
|
|
213
|
+
const fixSummary = (0, core_1.getFixableSummary)(results);
|
|
214
|
+
if (fixSummary.fixable === 0)
|
|
215
|
+
continue;
|
|
216
|
+
const code = (0, node_fs_1.readFileSync)(file, 'utf-8');
|
|
217
|
+
const fixResult = (0, core_1.applyFixes)(code, results);
|
|
218
|
+
if (fixResult.fixesApplied > 0) {
|
|
219
|
+
(0, node_fs_1.writeFileSync)(file, fixResult.code, 'utf-8');
|
|
220
|
+
totalFixed += fixResult.fixesApplied;
|
|
221
|
+
console.error(` Fixed ${fixResult.fixesApplied} issue${fixResult.fixesApplied !== 1 ? 's' : ''} in ${(0, node_path_1.relative)(process.cwd(), file)}`);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
return totalFixed;
|
|
225
|
+
}
|
|
226
|
+
// =============================================================================
|
|
227
|
+
// Output Formatting
|
|
228
|
+
// =============================================================================
|
|
229
|
+
/**
|
|
230
|
+
* Output results in the specified format
|
|
231
|
+
*/
|
|
232
|
+
function outputResults(summary, format) {
|
|
233
|
+
switch (format) {
|
|
234
|
+
case 'json':
|
|
235
|
+
outputJson(summary);
|
|
236
|
+
break;
|
|
237
|
+
case 'sarif':
|
|
238
|
+
outputSarif(summary);
|
|
239
|
+
break;
|
|
240
|
+
case 'text':
|
|
241
|
+
default:
|
|
242
|
+
outputText(summary);
|
|
243
|
+
break;
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Human-readable text output (like ESLint)
|
|
248
|
+
*/
|
|
249
|
+
function outputText(summary) {
|
|
250
|
+
const cwd = process.cwd();
|
|
251
|
+
if (summary.results.size === 0) {
|
|
252
|
+
console.error(`\n ✓ ${summary.filesChecked} files checked, no issues found.\n`);
|
|
253
|
+
return;
|
|
254
|
+
}
|
|
255
|
+
for (const [file, results] of summary.results) {
|
|
256
|
+
const relPath = (0, node_path_1.relative)(cwd, file);
|
|
257
|
+
console.error(`\n ${relPath}`);
|
|
258
|
+
for (const result of results) {
|
|
259
|
+
const severityLabel = formatSeverity(result.severity);
|
|
260
|
+
const fixMarker = result.fixAction ? ' 🔧' : '';
|
|
261
|
+
console.error(` L${result.line}:${result.column} ${severityLabel} ${result.message} ${result.ruleId}${fixMarker}`);
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
const total = summary.errors + summary.warnings + summary.infos;
|
|
265
|
+
const parts = [];
|
|
266
|
+
if (summary.errors > 0)
|
|
267
|
+
parts.push(`${summary.errors} error${summary.errors !== 1 ? 's' : ''}`);
|
|
268
|
+
if (summary.warnings > 0)
|
|
269
|
+
parts.push(`${summary.warnings} warning${summary.warnings !== 1 ? 's' : ''}`);
|
|
270
|
+
if (summary.infos > 0)
|
|
271
|
+
parts.push(`${summary.infos} info`);
|
|
272
|
+
// Show fixable count
|
|
273
|
+
const allResults = Array.from(summary.results.values()).flat();
|
|
274
|
+
const fixable = allResults.filter((r) => r.fixAction).length;
|
|
275
|
+
const fixableMsg = fixable > 0 ? ` ${fixable} fixable with --fix` : '';
|
|
276
|
+
console.error(`\n ${total} problem${total !== 1 ? 's' : ''} (${parts.join(', ')})${fixableMsg}\n`);
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Format severity label for text output
|
|
280
|
+
*/
|
|
281
|
+
function formatSeverity(severity) {
|
|
282
|
+
switch (severity) {
|
|
283
|
+
case 'error': return 'error ';
|
|
284
|
+
case 'warning': return 'warning';
|
|
285
|
+
case 'info': return 'info ';
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
/**
|
|
289
|
+
* JSON output
|
|
290
|
+
*/
|
|
291
|
+
function outputJson(summary) {
|
|
292
|
+
const output = {
|
|
293
|
+
filesChecked: summary.filesChecked,
|
|
294
|
+
errors: summary.errors,
|
|
295
|
+
warnings: summary.warnings,
|
|
296
|
+
infos: summary.infos,
|
|
297
|
+
results: Object.fromEntries(summary.results),
|
|
298
|
+
};
|
|
299
|
+
// JSON goes to stdout for piping
|
|
300
|
+
process.stdout.write(JSON.stringify(output, null, 2) + '\n');
|
|
301
|
+
}
|
|
302
|
+
/**
|
|
303
|
+
* SARIF output (GitHub Code Scanning compatible)
|
|
304
|
+
*/
|
|
305
|
+
function outputSarif(summary) {
|
|
306
|
+
const runs = [{
|
|
307
|
+
tool: {
|
|
308
|
+
driver: {
|
|
309
|
+
name: 'hostinglint',
|
|
310
|
+
version: '0.1.0',
|
|
311
|
+
informationUri: 'https://github.com/Stdubic/hostinglint',
|
|
312
|
+
rules: [],
|
|
313
|
+
},
|
|
314
|
+
},
|
|
315
|
+
results: [],
|
|
316
|
+
}];
|
|
317
|
+
const seenRules = new Set();
|
|
318
|
+
for (const [file, results] of summary.results) {
|
|
319
|
+
for (const result of results) {
|
|
320
|
+
// Add rule definition if not seen
|
|
321
|
+
if (!seenRules.has(result.ruleId)) {
|
|
322
|
+
seenRules.add(result.ruleId);
|
|
323
|
+
runs[0].tool.driver.rules.push({
|
|
324
|
+
id: result.ruleId,
|
|
325
|
+
shortDescription: { text: result.message },
|
|
326
|
+
defaultConfiguration: {
|
|
327
|
+
level: result.severity === 'info' ? 'note' : result.severity,
|
|
328
|
+
},
|
|
329
|
+
});
|
|
330
|
+
}
|
|
331
|
+
runs[0].results.push({
|
|
332
|
+
ruleId: result.ruleId,
|
|
333
|
+
level: result.severity === 'info' ? 'note' : result.severity,
|
|
334
|
+
message: { text: result.message },
|
|
335
|
+
locations: [{
|
|
336
|
+
physicalLocation: {
|
|
337
|
+
artifactLocation: { uri: (0, node_path_1.relative)(process.cwd(), file) },
|
|
338
|
+
region: {
|
|
339
|
+
startLine: result.line,
|
|
340
|
+
startColumn: result.column,
|
|
341
|
+
},
|
|
342
|
+
},
|
|
343
|
+
}],
|
|
344
|
+
});
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
const sarif = {
|
|
348
|
+
$schema: 'https://json.schemastore.org/sarif-2.1.0.json',
|
|
349
|
+
version: '2.1.0',
|
|
350
|
+
runs,
|
|
351
|
+
};
|
|
352
|
+
// SARIF goes to stdout for piping
|
|
353
|
+
process.stdout.write(JSON.stringify(sarif, null, 2) + '\n');
|
|
354
|
+
}
|
|
355
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "hostinglint",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "CLI for HostingLint - validate WHMCS, cPanel, and OpenPanel modules",
|
|
5
|
+
"main": "./dist/cli.js",
|
|
6
|
+
"types": "./dist/cli.d.ts",
|
|
7
|
+
"bin": {
|
|
8
|
+
"hostinglint": "dist/cli.js"
|
|
9
|
+
},
|
|
10
|
+
"files": [
|
|
11
|
+
"dist",
|
|
12
|
+
"LICENSE"
|
|
13
|
+
],
|
|
14
|
+
"scripts": {
|
|
15
|
+
"build": "tsc -p tsconfig.build.json",
|
|
16
|
+
"clean": "rm -rf dist",
|
|
17
|
+
"prepublishOnly": "npm run build"
|
|
18
|
+
},
|
|
19
|
+
"keywords": [
|
|
20
|
+
"whmcs",
|
|
21
|
+
"cpanel",
|
|
22
|
+
"openpanel",
|
|
23
|
+
"hosting",
|
|
24
|
+
"lint",
|
|
25
|
+
"cli",
|
|
26
|
+
"static-analysis",
|
|
27
|
+
"security"
|
|
28
|
+
],
|
|
29
|
+
"author": "Stdubic",
|
|
30
|
+
"license": "MIT",
|
|
31
|
+
"engines": {
|
|
32
|
+
"node": ">=20.0.0"
|
|
33
|
+
},
|
|
34
|
+
"repository": {
|
|
35
|
+
"type": "git",
|
|
36
|
+
"url": "git+https://github.com/Stdubic/hostinglint.git",
|
|
37
|
+
"directory": "packages/cli"
|
|
38
|
+
},
|
|
39
|
+
"homepage": "https://github.com/Stdubic/hostinglint#readme",
|
|
40
|
+
"bugs": {
|
|
41
|
+
"url": "https://github.com/Stdubic/hostinglint/issues"
|
|
42
|
+
},
|
|
43
|
+
"funding": {
|
|
44
|
+
"type": "individual",
|
|
45
|
+
"url": "https://nlnet.nl/commonsfund/"
|
|
46
|
+
},
|
|
47
|
+
"dependencies": {
|
|
48
|
+
"@hostinglint/core": "0.1.0",
|
|
49
|
+
"commander": "^13"
|
|
50
|
+
}
|
|
51
|
+
}
|