multi-tape 1.8.0 → 1.10.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/AGENTS.md +20 -16
- package/CHANGELOG.md +14 -0
- package/README.md +6 -0
- package/build/index.js +50 -10
- package/build/lib/run-test.d.ts +1 -1
- package/build/lib/run-test.js +24 -7
- package/build/test-fail/test-fail.d.ts +1 -0
- package/build/test-fail/test-fail.js +7 -0
- package/package.json +1 -1
package/AGENTS.md
CHANGED
|
@@ -1,21 +1,25 @@
|
|
|
1
1
|
# Agent Steering Rules
|
|
2
2
|
|
|
3
|
+
## git commands
|
|
4
|
+
|
|
5
|
+
Always pass a --no-pager option to git, e.g. run `git --no-pager diff`.
|
|
6
|
+
|
|
3
7
|
## Changelog Maintenance
|
|
4
8
|
|
|
5
|
-
When making changes to the codebase, always update the `
|
|
6
|
-
|
|
7
|
-
-
|
|
8
|
-
-
|
|
9
|
-
-
|
|
10
|
-
-
|
|
11
|
-
-
|
|
12
|
-
-
|
|
13
|
-
-
|
|
14
|
-
-
|
|
15
|
-
-
|
|
16
|
-
-
|
|
17
|
-
-
|
|
18
|
-
-
|
|
9
|
+
When making changes to the codebase, always update the `CHANGELOG.md` file to reflect the modifications:
|
|
10
|
+
|
|
11
|
+
- Add new entries under the `## [Unreleased]` section
|
|
12
|
+
- Follow the [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) format
|
|
13
|
+
- Use these categories as appropriate:
|
|
14
|
+
- `### Features` - for new features
|
|
15
|
+
- `### Fixes` - for bug fixes
|
|
16
|
+
- `### Breaking Changes` - for breaking API changes
|
|
17
|
+
- `### Deprecated` - for soon-to-be removed features
|
|
18
|
+
- `### Removed` - for removed features
|
|
19
|
+
- `### Security` - for security fixes
|
|
20
|
+
- Use bullet points starting with `-` for each change
|
|
21
|
+
- Keep descriptions concise but clear
|
|
22
|
+
- When a version is released, the maintainer will move unreleased items to a dated version section
|
|
19
23
|
|
|
20
24
|
Example entry:
|
|
21
25
|
|
|
@@ -24,11 +28,11 @@ Example entry:
|
|
|
24
28
|
|
|
25
29
|
### Features
|
|
26
30
|
|
|
27
|
-
-
|
|
31
|
+
- Add new --parallel option for concurrent test execution
|
|
28
32
|
|
|
29
33
|
### Fixes
|
|
30
34
|
|
|
31
|
-
-
|
|
35
|
+
- Fix race condition in test output handling
|
|
32
36
|
```
|
|
33
37
|
|
|
34
38
|
## Making a release
|
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,20 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [1.10.0] 2025-11-15
|
|
11
|
+
|
|
12
|
+
### Features
|
|
13
|
+
|
|
14
|
+
- Show output file name for failing tests when using -o option
|
|
15
|
+
- Add -O option to specify output directory for tap files
|
|
16
|
+
|
|
17
|
+
## [1.9.0] 2025-11-14
|
|
18
|
+
|
|
19
|
+
### Features
|
|
20
|
+
|
|
21
|
+
- Add -e option for errors-only mode that only prints output from failing tests plus the summary
|
|
22
|
+
- Show help message when run without arguments
|
|
23
|
+
|
|
10
24
|
## [1.8.0] 2025-11-14
|
|
11
25
|
|
|
12
26
|
### Features
|
package/README.md
CHANGED
|
@@ -35,6 +35,9 @@ with output sent to stdout and print a summary at the end
|
|
|
35
35
|
of the test-file with '.tap' appended. The result will still be printed to
|
|
36
36
|
STDOUT.
|
|
37
37
|
|
|
38
|
+
- -O <dir> send output to a specified directory. For example, `-O tapFiles/` will
|
|
39
|
+
write the output for `build/test/test-file.js` to `tapFiles/build/test/test-file.js.tap`.
|
|
40
|
+
|
|
38
41
|
- --node-arg=--opt Send an option to node when invoking the test-file. Can be
|
|
39
42
|
used more than once.
|
|
40
43
|
|
|
@@ -52,6 +55,9 @@ with output sent to stdout and print a summary at the end
|
|
|
52
55
|
succeeded and which failed. Can be combined with -o to write output to files
|
|
53
56
|
without printing to stdout.
|
|
54
57
|
|
|
58
|
+
- -e Errors-only mode. Only prints output from failing tests, plus the summary at the end.
|
|
59
|
+
Useful for CI environments where you only want to see failures.
|
|
60
|
+
|
|
55
61
|
- --controller="command with parameters" Run a command before starting the tests. Wait for the command to print something on stdout before starting the tests. Kill the command when all tests are done.
|
|
56
62
|
|
|
57
63
|
## Exit code
|
package/build/index.js
CHANGED
|
@@ -17,7 +17,11 @@ const child_process_1 = require("child_process");
|
|
|
17
17
|
const glob_1 = require("./lib/glob");
|
|
18
18
|
const run_test_1 = require("./lib/run-test");
|
|
19
19
|
const minimist_1 = __importDefault(require("minimist"));
|
|
20
|
-
const argv = (0, minimist_1.default)(process.argv.slice(2), {
|
|
20
|
+
const argv = (0, minimist_1.default)(process.argv.slice(2), {
|
|
21
|
+
boolean: ['o', 'j', 'q', 'e'],
|
|
22
|
+
string: ['O'],
|
|
23
|
+
default: { p: 1, t: 0 },
|
|
24
|
+
});
|
|
21
25
|
const results = new Map();
|
|
22
26
|
const nodeArgs = new Array();
|
|
23
27
|
if (argv['node-arg']) {
|
|
@@ -28,7 +32,37 @@ if (argv['node-arg']) {
|
|
|
28
32
|
nodeArgs.push(argv['node-arg']);
|
|
29
33
|
}
|
|
30
34
|
}
|
|
35
|
+
function printHelp() {
|
|
36
|
+
console.log(`
|
|
37
|
+
multi-tape - Run tape tests in multiple files
|
|
38
|
+
|
|
39
|
+
Usage: multi-tape [options] <test-files...>
|
|
40
|
+
|
|
41
|
+
Options:
|
|
42
|
+
-o Send output to one file per test-file (.tap extension)
|
|
43
|
+
-O <dir> Send output to directory (e.g., -O tapFiles/)
|
|
44
|
+
--node-arg=<arg> Pass an option to node (can be used multiple times)
|
|
45
|
+
-p=<N> Run N tests in parallel (default: 1)
|
|
46
|
+
-j Generate JUnit XML output (.xml extension)
|
|
47
|
+
-t <ms> Timeout in milliseconds for each test file
|
|
48
|
+
-q Quiet mode - only show test results as they complete
|
|
49
|
+
-e Errors-only mode - only show output from failing tests
|
|
50
|
+
--controller=<cmd> Run a command before tests, kill it when done
|
|
51
|
+
|
|
52
|
+
Examples:
|
|
53
|
+
multi-tape test/*.js
|
|
54
|
+
multi-tape -p 4 test/*.js
|
|
55
|
+
multi-tape -e -p 2 test/*.js
|
|
56
|
+
multi-tape -o test/*.js
|
|
57
|
+
|
|
58
|
+
For more information, visit: https://github.com/mattiash/node-multi-tape
|
|
59
|
+
`);
|
|
60
|
+
}
|
|
31
61
|
const files = (0, glob_1.globArgs)(argv._).sort();
|
|
62
|
+
if (files.length === 0) {
|
|
63
|
+
printHelp();
|
|
64
|
+
process.exit(0);
|
|
65
|
+
}
|
|
32
66
|
const inProgress = new Set();
|
|
33
67
|
const aborted = new Set();
|
|
34
68
|
function printInProgress() {
|
|
@@ -42,11 +76,17 @@ function printTestResult(file, res) {
|
|
|
42
76
|
if (exitCode === 0 && r.ok) {
|
|
43
77
|
console.log(`OK ${file} (${timeStr}) ${r.pass}/${r.count}`);
|
|
44
78
|
}
|
|
45
|
-
else if (!r.ok) {
|
|
46
|
-
console.log(`FAIL ${file} (${timeStr}) ${r.pass || 0}/${r.count || 0}`);
|
|
47
|
-
}
|
|
48
79
|
else {
|
|
49
|
-
|
|
80
|
+
if (!r.ok) {
|
|
81
|
+
console.log(`FAIL ${file} (${timeStr}) ${r.pass || 0}/${r.count || 0}`);
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
console.log(`FAIL ${file} exited with error ${exitCode}`);
|
|
85
|
+
}
|
|
86
|
+
if (argv.o || argv.O) {
|
|
87
|
+
const tapFile = argv.O ? `${argv.O}${file}.tap` : `${file}.tap`;
|
|
88
|
+
console.log(` See ${tapFile}`);
|
|
89
|
+
}
|
|
50
90
|
}
|
|
51
91
|
}
|
|
52
92
|
function thread() {
|
|
@@ -54,7 +94,7 @@ function thread() {
|
|
|
54
94
|
let file;
|
|
55
95
|
while ((file = files.shift())) {
|
|
56
96
|
inProgress.add(file);
|
|
57
|
-
const result = yield (0, run_test_1.runTest)(file, nodeArgs, argv.p === 1, argv.o, argv.j, argv.t, argv.q);
|
|
97
|
+
const result = yield (0, run_test_1.runTest)(file, nodeArgs, argv.p === 1, argv.o || !!argv.O, argv.j, argv.t, argv.q, argv.e, argv.O);
|
|
58
98
|
inProgress.delete(file);
|
|
59
99
|
results.set(file, result);
|
|
60
100
|
if (argv.q) {
|
|
@@ -75,14 +115,14 @@ function run() {
|
|
|
75
115
|
stdio: ['ignore', 'pipe', 'pipe'],
|
|
76
116
|
});
|
|
77
117
|
(_a = controller.stdout) === null || _a === void 0 ? void 0 : _a.on('data', (data) => {
|
|
78
|
-
if (!argv.q) {
|
|
118
|
+
if (!argv.q && !argv.e) {
|
|
79
119
|
console.log(`controller: ${data}`);
|
|
80
120
|
}
|
|
81
121
|
controllerRunning = true;
|
|
82
122
|
resolve();
|
|
83
123
|
});
|
|
84
124
|
(_b = controller.stderr) === null || _b === void 0 ? void 0 : _b.on('data', (data) => {
|
|
85
|
-
if (!argv.q) {
|
|
125
|
+
if (!argv.q && !argv.e) {
|
|
86
126
|
console.error(`controller: ${data}`);
|
|
87
127
|
}
|
|
88
128
|
});
|
|
@@ -97,7 +137,7 @@ function run() {
|
|
|
97
137
|
}
|
|
98
138
|
yield Promise.all(new Array(argv.p).fill(0).map(() => thread()));
|
|
99
139
|
if (controller && controllerRunning) {
|
|
100
|
-
if (!argv.q) {
|
|
140
|
+
if (!argv.q && !argv.e) {
|
|
101
141
|
console.log('controller: stopping');
|
|
102
142
|
}
|
|
103
143
|
controller.once('close', () => printSummary());
|
|
@@ -144,4 +184,4 @@ if (process.env.MT_DEBUG_INTERVAL) {
|
|
|
144
184
|
}, parseInt(process.env.MT_DEBUG_INTERVAL)).unref();
|
|
145
185
|
}
|
|
146
186
|
void run();
|
|
147
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
187
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7QUFFQSxpREFBcUM7QUFDckMscUNBQXFDO0FBQ3JDLDZDQUFnRDtBQUNoRCx3REFBZ0M7QUFFaEMsTUFBTSxJQUFJLEdBQUcsSUFBQSxrQkFBUyxFQVFuQixPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRTtJQUN0QixPQUFPLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7SUFDN0IsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDO0lBQ2IsT0FBTyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0NBQzFCLENBQUMsQ0FBQTtBQUVGLE1BQU0sT0FBTyxHQUFHLElBQUksR0FBRyxFQUFrQixDQUFBO0FBRXpDLE1BQU0sUUFBUSxHQUFHLElBQUksS0FBSyxFQUFVLENBQUE7QUFFcEMsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztJQUNuQixJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNsQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUE7SUFDdEMsQ0FBQztTQUFNLENBQUM7UUFDSixRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFBO0lBQ25DLENBQUM7QUFDTCxDQUFDO0FBRUQsU0FBUyxTQUFTO0lBQ2QsT0FBTyxDQUFDLEdBQUcsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0F1QmYsQ0FBQyxDQUFBO0FBQ0YsQ0FBQztBQUVELE1BQU0sS0FBSyxHQUFHLElBQUEsZUFBUSxFQUFDLElBQUksQ0FBQyxDQUFDLENB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
|
package/build/lib/run-test.d.ts
CHANGED
|
@@ -4,4 +4,4 @@ export interface Result {
|
|
|
4
4
|
executionTime: number;
|
|
5
5
|
result: FinalResults;
|
|
6
6
|
}
|
|
7
|
-
export declare function runTest(filename: string, nodeArgs: string[], logConsole: boolean, outputToFile: boolean, junitOutput: boolean, timeout: number, quiet?: boolean): Promise<Result>;
|
|
7
|
+
export declare function runTest(filename: string, nodeArgs: string[], logConsole: boolean, outputToFile: boolean, junitOutput: boolean, timeout: number, quiet?: boolean, errorsOnly?: boolean, outputDir?: string): Promise<Result>;
|
package/build/lib/run-test.js
CHANGED
|
@@ -48,9 +48,10 @@ const tee = require('tee');
|
|
|
48
48
|
const streams = __importStar(require("stream-buffers"));
|
|
49
49
|
const child_process_1 = require("child_process");
|
|
50
50
|
const fs_1 = require("fs");
|
|
51
|
+
const promises_1 = require("node:fs/promises");
|
|
51
52
|
const path_1 = require("path");
|
|
52
53
|
function runTest(filename_1, nodeArgs_1, logConsole_1, outputToFile_1, junitOutput_1, timeout_1) {
|
|
53
|
-
return __awaiter(this, arguments, void 0, function* (filename, nodeArgs, logConsole, outputToFile, junitOutput, timeout, quiet = false) {
|
|
54
|
+
return __awaiter(this, arguments, void 0, function* (filename, nodeArgs, logConsole, outputToFile, junitOutput, timeout, quiet = false, errorsOnly = false, outputDir) {
|
|
54
55
|
const extraEnv = {};
|
|
55
56
|
if (junitOutput) {
|
|
56
57
|
extraEnv.PT_XUNIT_FILE = filename + '.xml';
|
|
@@ -80,17 +81,28 @@ function runTest(filename_1, nodeArgs_1, logConsole_1, outputToFile_1, junitOutp
|
|
|
80
81
|
resolve({ exitCode, signal });
|
|
81
82
|
});
|
|
82
83
|
});
|
|
83
|
-
const output = logConsole && !quiet
|
|
84
|
+
const output = logConsole && !quiet && !errorsOnly
|
|
84
85
|
? process.stdout
|
|
85
86
|
: new streams.WritableStreamBuffer();
|
|
86
|
-
if (!quiet) {
|
|
87
|
+
if (!quiet && !errorsOnly) {
|
|
87
88
|
output.write(`\n#\n# ${filename}\n#\n`);
|
|
88
89
|
}
|
|
90
|
+
else if (errorsOnly) {
|
|
91
|
+
output.write(`\n#\n# ${filename}\n#\n`);
|
|
92
|
+
}
|
|
93
|
+
if (outputToFile && outputDir) {
|
|
94
|
+
const tapFilename = `${outputDir}${filename}.tap`;
|
|
95
|
+
const tapDir = (0, path_1.dirname)(tapFilename);
|
|
96
|
+
yield (0, promises_1.mkdir)(tapDir, { recursive: true });
|
|
97
|
+
}
|
|
89
98
|
const parsed = new Promise((resolve) => {
|
|
90
99
|
const p = new tap_parser_1.Parser(resolve);
|
|
91
100
|
if (outputToFile) {
|
|
101
|
+
const tapFilename = outputDir
|
|
102
|
+
? `${outputDir}${filename}.tap`
|
|
103
|
+
: `${filename}.tap`;
|
|
92
104
|
proc.stdout
|
|
93
|
-
.pipe(tee(p, (0, fs_1.createWriteStream)(
|
|
105
|
+
.pipe(tee(p, (0, fs_1.createWriteStream)(tapFilename)))
|
|
94
106
|
.pipe(output);
|
|
95
107
|
}
|
|
96
108
|
else {
|
|
@@ -106,7 +118,9 @@ function runTest(filename_1, nodeArgs_1, logConsole_1, outputToFile_1, junitOutp
|
|
|
106
118
|
if (aborted) {
|
|
107
119
|
exitCode = exitCode || 1;
|
|
108
120
|
}
|
|
109
|
-
|
|
121
|
+
const shouldPrintOutput = (!logConsole && !quiet && !errorsOnly) ||
|
|
122
|
+
(errorsOnly && (exitCode !== 0 || !result.ok));
|
|
123
|
+
if (shouldPrintOutput) {
|
|
110
124
|
const lines = output.getContentsAsString('utf8');
|
|
111
125
|
if (lines) {
|
|
112
126
|
for (const line of lines.split('\n')) {
|
|
@@ -114,7 +128,10 @@ function runTest(filename_1, nodeArgs_1, logConsole_1, outputToFile_1, junitOutp
|
|
|
114
128
|
}
|
|
115
129
|
}
|
|
116
130
|
}
|
|
117
|
-
if (signal) {
|
|
131
|
+
if (signal && !quiet && !errorsOnly) {
|
|
132
|
+
console.log(`${filename} exited with signal ${signal}`);
|
|
133
|
+
}
|
|
134
|
+
else if (signal && errorsOnly && (exitCode !== 0 || !result.ok)) {
|
|
118
135
|
console.log(`${filename} exited with signal ${signal}`);
|
|
119
136
|
}
|
|
120
137
|
return {
|
|
@@ -124,4 +141,4 @@ function runTest(filename_1, nodeArgs_1, logConsole_1, outputToFile_1, junitOutp
|
|
|
124
141
|
};
|
|
125
142
|
});
|
|
126
143
|
}
|
|
127
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
144
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVuLXRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvcnVuLXRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFrQkEsMEJBK0hDO0FBakpELDJDQUFpRDtBQUVqRCxNQUFNLEdBQUcsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUE7QUFDMUIsd0RBQXlDO0FBQ3pDLGlEQUFxQztBQUNyQywyQkFBc0M7QUFDdEMsK0NBQXdDO0FBQ3hDLCtCQUF3QztBQVd4QyxTQUFzQixPQUFPO3lEQUN6QixRQUFnQixFQUNoQixRQUFrQixFQUNsQixVQUFtQixFQUNuQixZQUFxQixFQUNyQixXQUFvQixFQUNwQixPQUFlLEVBQ2YsUUFBaUIsS0FBSyxFQUN0QixhQUFzQixLQUFLLEVBQzNCLFNBQWtCO1FBRWxCLE1BQU0sUUFBUSxHQUFHLEVBQTRCLENBQUE7UUFDN0MsSUFBSSxXQUFXLEVBQUUsQ0FBQztZQUNkLFFBQVEsQ0FBQyxhQUFhLEdBQUcsUUFBUSxHQUFHLE1BQU0sQ0FBQTtZQUMxQyxRQUFRLENBQUMsYUFBYSxHQUFHLElBQUEsZUFBUSxFQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQy9DLENBQUM7UUFFRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUE7UUFFNUIsTUFBTSxJQUFJLEdBQUcsSUFBQSxxQkFBSyxFQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQ2xELEdBQUcsa0NBQ0ksT0FBTyxDQUFDLEdBQUcsR0FDWCxRQUFRLENBQ2Q7U0FDSixDQUFDLENBQUE7UUFFRixJQUFJLE9BQU8sR0FBRyxLQUFLLENBQUE7UUFDbkIsTUFBTSxNQUFNLEdBQUcsSUFBSSxPQUFPLENBQ3RCLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDUixJQUFJLEtBQUssR0FDTCxPQUFPLEdBQUcs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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const purple_tape_1 = require("purple-tape");
|
|
4
|
+
(0, purple_tape_1.test)('shall fail', (t) => {
|
|
5
|
+
t.equal(1, 2, '1 shall be 2');
|
|
6
|
+
});
|
|
7
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC1mYWlsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdGVzdC1mYWlsL3Rlc3QtZmFpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLDZDQUFrQztBQUVsQyxJQUFBLGtCQUFJLEVBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUU7SUFDckIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxDQUFBO0FBQ2pDLENBQUMsQ0FBQyxDQUFBIn0=
|