1 | ;
|
2 | var __importDefault = (this && this.__importDefault) || function (mod) {
|
3 | return (mod && mod.__esModule) ? mod : { "default": mod };
|
4 | };
|
5 | Object.defineProperty(exports, "__esModule", { value: true });
|
6 | const chalk_1 = __importDefault(require("chalk"));
|
7 | const indent_string_1 = __importDefault(require("indent-string"));
|
8 | const lodash_1 = require("lodash");
|
9 | const moment_loader_1 = __importDefault(require("../utils/moment-loader"));
|
10 | const os_family_1 = __importDefault(require("os-family"));
|
11 | const string_1 = require("../utils/string");
|
12 | const get_viewport_width_1 = __importDefault(require("../utils/get-viewport-width"));
|
13 | // NOTE: we should not expose internal state to
|
14 | // the plugin, to avoid accidental rewrites.
|
15 | // Therefore we use symbols to store them.
|
16 | /*global Symbol*/
|
17 | const stream = Symbol();
|
18 | const wordWrapEnabled = Symbol();
|
19 | const indent = Symbol();
|
20 | const errorDecorator = Symbol();
|
21 | class ReporterPluginHost {
|
22 | constructor(plugin, outStream) {
|
23 | this[stream] = outStream || process.stdout;
|
24 | this[wordWrapEnabled] = false;
|
25 | this[indent] = 0;
|
26 | const useColors = this[stream] === process.stdout && chalk_1.default.enabled && !plugin.noColors;
|
27 | this.chalk = new chalk_1.default.constructor({ enabled: useColors });
|
28 | this.moment = moment_loader_1.default;
|
29 | this.viewportWidth = get_viewport_width_1.default(this[stream]);
|
30 | this.symbols = os_family_1.default.win ?
|
31 | { ok: '√', err: '×' } :
|
32 | { ok: '✓', err: '✖' };
|
33 | lodash_1.assignIn(this, plugin);
|
34 | this[errorDecorator] = this.createErrorDecorator();
|
35 | }
|
36 | // Error decorator
|
37 | createErrorDecorator() {
|
38 | return {
|
39 | 'span user-agent': str => this.chalk.grey(str),
|
40 | 'span subtitle': str => `- ${this.chalk.bold.red(str)} -`,
|
41 | 'div message': str => this.chalk.bold.red(str),
|
42 | 'div screenshot-info': lodash_1.identity,
|
43 | 'a screenshot-path': str => this.chalk.grey.underline(str),
|
44 | 'code': lodash_1.identity,
|
45 | 'span syntax-string': str => this.chalk.green(str),
|
46 | 'span syntax-punctuator': str => this.chalk.grey(str),
|
47 | 'span syntax-keyword': str => this.chalk.cyan(str),
|
48 | 'span syntax-number': str => this.chalk.magenta(str),
|
49 | 'span syntax-regex': str => this.chalk.magenta(str),
|
50 | 'span syntax-comment': str => this.chalk.grey.bold(str),
|
51 | 'span syntax-invalid': str => this.chalk.inverse(str),
|
52 | 'div code-frame': lodash_1.identity,
|
53 | 'div code-line': str => str + '\n',
|
54 | 'div code-line-last': lodash_1.identity,
|
55 | 'div code-line-num': str => ` ${str} |`,
|
56 | 'div code-line-num-base': str => this.chalk.bgRed(` > ${str} `) + '|',
|
57 | 'div code-line-src': lodash_1.identity,
|
58 | 'div stack': str => '\n\n' + str,
|
59 | 'div stack-line': str => str + '\n',
|
60 | 'div stack-line-last': lodash_1.identity,
|
61 | 'div stack-line-name': str => ` at ${this.chalk.bold(str)}`,
|
62 | 'div stack-line-location': str => ` (${this.chalk.grey.underline(str)})`,
|
63 | 'strong': str => this.chalk.bold(str),
|
64 | 'a': str => `"${this.chalk.underline(str)}"`
|
65 | };
|
66 | }
|
67 | // String helpers
|
68 | indentString(str, indentVal) {
|
69 | return indent_string_1.default(str, ' ', indentVal);
|
70 | }
|
71 | wordWrap(str, indentVal, width) {
|
72 | return string_1.wordWrap(str, indentVal, width);
|
73 | }
|
74 | escapeHtml(str) {
|
75 | return lodash_1.escape(str);
|
76 | }
|
77 | formatError(err, prefix = '') {
|
78 | const prefixLengthWithoutColors = string_1.removeTTYColors(prefix).length;
|
79 | const maxMsgLength = this.viewportWidth - this[indent] - prefixLengthWithoutColors;
|
80 | let msg = err.formatMessage(this[errorDecorator], maxMsgLength);
|
81 | if (this[wordWrapEnabled])
|
82 | msg = this.wordWrap(msg, prefixLengthWithoutColors, maxMsgLength);
|
83 | else
|
84 | msg = this.indentString(msg, prefixLengthWithoutColors);
|
85 | return prefix + msg.substr(prefixLengthWithoutColors);
|
86 | }
|
87 | // Writing helpers
|
88 | newline() {
|
89 | this[stream].write('\n');
|
90 | return this;
|
91 | }
|
92 | write(text) {
|
93 | if (this[wordWrapEnabled])
|
94 | text = this.wordWrap(text, this[indent], this.viewportWidth);
|
95 | else
|
96 | text = this.indentString(text, this[indent]);
|
97 | this[stream].write(text);
|
98 | return this;
|
99 | }
|
100 | useWordWrap(use) {
|
101 | this[wordWrapEnabled] = use;
|
102 | return this;
|
103 | }
|
104 | setIndent(val) {
|
105 | this[indent] = val;
|
106 | return this;
|
107 | }
|
108 | // Abstract methods implemented in plugin
|
109 | async reportTaskStart( /* startTime, userAgents, testCount */) {
|
110 | throw new Error('Not implemented');
|
111 | }
|
112 | async reportFixtureStart( /* name, path */) {
|
113 | throw new Error('Not implemented');
|
114 | }
|
115 | // NOTE: It's an optional method
|
116 | // async reportTestStart (/* name, testMeta */) {
|
117 | // throw new Error('Not implemented');
|
118 | // }
|
119 | async reportTestDone( /* name, testRunInfo */) {
|
120 | throw new Error('Not implemented');
|
121 | }
|
122 | async reportTaskDone( /* endTime, passed, warnings */) {
|
123 | throw new Error('Not implemented');
|
124 | }
|
125 | }
|
126 | exports.default = ReporterPluginHost;
|
127 | module.exports = exports.default;
|
128 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLWhvc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcmVwb3J0ZXIvcGx1Z2luLWhvc3QuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxrREFBMEI7QUFDMUIsa0VBQXlDO0FBQ3pDLG1DQUFrRTtBQUNsRSwyRUFBNEM7QUFDNUMsMERBQTJCO0FBQzNCLDRDQUE0RDtBQUM1RCxxRkFBMkQ7QUFFM0QsK0NBQStDO0FBQy9DLDRDQUE0QztBQUM1QywwQ0FBMEM7QUFFMUMsaUJBQWlCO0FBQ2pCLE1BQU0sTUFBTSxHQUFZLE1BQU0sRUFBRSxDQUFDO0FBQ2pDLE1BQU0sZUFBZSxHQUFHLE1BQU0sRUFBRSxDQUFDO0FBQ2pDLE1BQU0sTUFBTSxHQUFZLE1BQU0sRUFBRSxDQUFDO0FBQ2pDLE1BQU0sY0FBYyxHQUFJLE1BQU0sRUFBRSxDQUFDO0FBRWpDLE1BQXFCLGtCQUFrQjtJQUNuQyxZQUFhLE1BQU0sRUFBRSxTQUFTO1FBQzFCLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBWSxTQUFTLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQztRQUNwRCxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQzlCLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBWSxDQUFDLENBQUM7UUFFMUIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLE9BQU8sQ0FBQyxNQUFNLElBQUksZUFBSyxDQUFDLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUM7UUFFdkYsSUFBSSxDQUFDLEtBQUssR0FBVyxJQUFJLGVBQUssQ0FBQyxXQUFXLENBQUMsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztRQUNuRSxJQUFJLENBQUMsTUFBTSxHQUFVLHVCQUFNLENBQUM7UUFDNUIsSUFBSSxDQUFDLGFBQWEsR0FBRyw0QkFBZ0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMs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Q0FBQztJQUN2QyxDQUFDO0lBRUQsZ0NBQWdDO0lBQ2hDLGlEQUFpRDtJQUNqRCwwQ0FBMEM7SUFDMUMsSUFBSTtJQUVKLEtBQUssQ0FBQyxjQUFjLEVBQUUsdUJBQXVCO1FBQ3pDLE1BQU0sSUFBSSxLQUFLLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQsS0FBSyxDQUFDLGNBQWMsRUFBRSwrQkFBK0I7UUFDakQsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7Q0FDSjtBQTNJRCxxQ0EySUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IGluZGVudFN0cmluZyBmcm9tICdpbmRlbnQtc3RyaW5nJztcbmltcG9ydCB7IGlkZW50aXR5LCBlc2NhcGUgYXMgZXNjYXBlSHRtbCwgYXNzaWduSW4gfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IG1vbWVudCBmcm9tICcuLi91dGlscy9tb21lbnQtbG9hZGVyJztcbmltcG9ydCBPUyBmcm9tICdvcy1mYW1pbHknO1xuaW1wb3J0IHsgd29yZFdyYXAsIHJlbW92ZVRUWUNvbG9ycyB9IGZyb20gJy4uL3V0aWxzL3N0cmluZyc7XG5pbXBvcnQgZ2V0Vmlld3BvcnRXaWR0aCBmcm9tICcuLi91dGlscy9nZXQtdmlld3BvcnQtd2lkdGgnO1xuXG4vLyBOT1RFOiB3ZSBzaG91bGQgbm90IGV4cG9zZSBpbnRlcm5hbCBzdGF0ZSB0b1xuLy8gdGhlIHBsdWdpbiwgdG8gYXZvaWQgYWNjaWRlbnRhbCByZXdyaXRlcy5cbi8vIFRoZXJlZm9yZSB3ZSB1c2Ugc3ltYm9scyB0byBzdG9yZSB0aGVtLlxuXG4vKmdsb2JhbCBTeW1ib2wqL1xuY29uc3Qgc3RyZWFtICAgICAgICAgID0gU3ltYm9sKCk7XG5jb25zdCB3b3JkV3JhcEVuYWJsZWQgPSBTeW1ib2woKTtcbmNvbnN0IGluZGVudCAgICAgICAgICA9IFN5bWJvbCgpO1xuY29uc3QgZXJyb3JEZWNvcmF0b3IgID0gU3ltYm9sKCk7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJlcG9ydGVyUGx1Z2luSG9zdCB7XG4gICAgY29uc3RydWN0b3IgKHBsdWdpbiwgb3V0U3RyZWFtKSB7XG4gICAgICAgIHRoaXNbc3RyZWFtXSAgICAgICAgICA9IG91dFN0cmVhbSB8fCBwcm9jZXNzLnN0ZG91dDtcbiAgICAgICAgdGhpc1t3b3JkV3JhcEVuYWJsZWRdID0gZmFsc2U7XG4gICAgICAgIHRoaXNbaW5kZW50XSAgICAgICAgICA9IDA7XG5cbiAgICAgICAgY29uc3QgdXNlQ29sb3JzID0gdGhpc1tzdHJlYW1dID09PSBwcm9jZXNzLnN0ZG91dCAmJiBjaGFsay5lbmFibGVkICYmICFwbHVnaW4ubm9Db2xvcnM7XG5cbiAgICAgICAgdGhpcy5jaGFsayAgICAgICAgID0gbmV3IGNoYWxrLmNvbnN0cnVjdG9yKHsgZW5hYmxlZDogdXNlQ29sb3JzIH0pO1xuICAgICAgICB0aGlzLm1vbWVudCAgICAgICAgPSBtb21lbnQ7XG4gICAgICAgIHRoaXMudmlld3BvcnRXaWR0aCA9IGdldFZpZXdwb3J0V2lkdGgodGhpc1tzdHJlYW1dKTtcblxuICAgICAgICB0aGlzLnN5bWJvbHMgPSBPUy53aW4gP1xuICAgICAgICAgICAgeyBvazogJ+KImicsIGVycjogJ8OXJyB9IDpcbiAgICAgICAgICAgIHsgb2s6ICfinJMnLCBlcnI6ICfinJYnIH07XG5cbiAgICAgICAgYXNzaWduSW4odGhpcywgcGx1Z2luKTtcblxuICAgICAgICB0aGlzW2Vycm9yRGVjb3JhdG9yXSA9IHRoaXMuY3JlYXRlRXJyb3JEZWNvcmF0b3IoKTtcbiAgICB9XG5cbiAgICAvLyBFcnJvciBkZWNvcmF0b3JcbiAgICBjcmVhdGVFcnJvckRlY29yYXRvciAoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAnc3BhbiB1c2VyLWFnZW50Jzogc3RyID0+IHRoaXMuY2hhbGsuZ3JleShzdHIpLFxuXG4gICAgICAgICAgICAnc3BhbiBzdWJ0aXRsZSc6IHN0ciA9PiBgLSAke3RoaXMuY2hhbGsuYm9sZC5yZWQoc3RyKX0gLWAsXG4gICAgICAgICAgICAnZGl2IG1lc3NhZ2UnOiAgIHN0ciA9PiB0aGlzLmNoYWxrLmJvbGQucmVkKHN0ciksXG5cbiAgICAgICAgICAgICdkaXYgc2NyZWVuc2hvdC1pbmZvJzogaWRlbnRpdHksXG4gICAgICAgICAgICAnYSBzY3JlZW5zaG90LXBhdGgnOiAgIHN0ciA9PiB0aGlzLmNoYWxrLmdyZXkudW5kZXJsaW5lKHN0ciksXG5cbiAgICAgICAgICAgICdjb2RlJzogaWRlbnRpdHksXG5cbiAgICAgICAgICAgICdzcGFuIHN5bnRheC1zdHJpbmcnOiAgICAgc3RyID0+IHRoaXMuY2hhbGsuZ3JlZW4oc3RyKSxcbiAgICAgICAgICAgICdzcGFuIHN5bnRheC1wdW5jdHVhdG9yJzogc3RyID0+IHRoaXMuY2hhbGsuZ3JleShzdHIpLFxuICAgICAgICAgICAgJ3NwYW4gc3ludGF4LWtleXdvcmQnOiAgICBzdHIgPT4gdGhpcy5jaGFsay5jeWFuKHN0ciksXG4gICAgICAgICAgICAnc3BhbiBzeW50YXgtbnVtYmVyJzogICAgIHN0ciA9PiB0aGlzLmNoYWxrLm1hZ2VudGEoc3RyKSxcbiAgICAgICAgICAgICdzcGFuIHN5bnRheC1yZWdleCc6ICAgICAgc3RyID0+IHRoaXMuY2hhbGsubWFnZW50YShzdHIpLFxuICAgICAgICAgICAgJ3NwYW4gc3ludGF4LWNvbW1lbnQnOiAgICBzdHIgPT4gdGhpcy5jaGFsay5ncmV5LmJvbGQoc3RyKSxcbiAgICAgICAgICAgICdzcGFuIHN5bnRheC1pbnZhbGlkJzogICAgc3RyID0+IHRoaXMuY2hhbGsuaW52ZXJzZShzdHIpLFxuXG4gICAgICAgICAgICAnZGl2IGNvZGUtZnJhbWUnOiAgICAgICAgIGlkZW50aXR5LFxuICAgICAgICAgICAgJ2RpdiBjb2RlLWxpbmUnOiAgICAgICAgICBzdHIgPT4gc3RyICsgJ1xcbicsXG4gICAgICAgICAgICAnZGl2IGNvZGUtbGluZS1sYXN0JzogICAgIGlkZW50aXR5LFxuICAgICAgICAgICAgJ2RpdiBjb2RlLWxpbmUtbnVtJzogICAgICBzdHIgPT4gYCAgICR7c3RyfSB8YCxcbiAgICAgICAgICAgICdkaXYgY29kZS1saW5lLW51bS1iYXNlJzogc3RyID0+IHRoaXMuY2hhbGsuYmdSZWQoYCA+ICR7c3RyfSBgKSArICd8JyxcbiAgICAgICAgICAgICdkaXYgY29kZS1saW5lLXNyYyc6ICAgICAgaWRlbnRpdHksXG5cbiAgICAgICAgICAgICdkaXYgc3RhY2snOiAgICAgICAgICAgICAgIHN0ciA9PiAnXFxuXFxuJyArIHN0cixcbiAgICAgICAgICAgICdkaXYgc3RhY2stbGluZSc6ICAgICAgICAgIHN0ciA9PiBzdHIgKyAnXFxuJyxcbiAgICAgICAgICAgICdkaXYgc3RhY2stbGluZS1sYXN0JzogICAgIGlkZW50aXR5LFxuICAgICAgICAgICAgJ2RpdiBzdGFjay1saW5lLW5hbWUnOiAgICAgc3RyID0+IGAgICBhdCAke3RoaXMuY2hhbGsuYm9sZChzdHIpfWAsXG4gICAgICAgICAgICAnZGl2IHN0YWNrLWxpbmUtbG9jYXRpb24nOiBzdHIgPT4gYCAoJHt0aGlzLmNoYWxrLmdyZXkudW5kZXJsaW5lKHN0cil9KWAsXG5cbiAgICAgICAgICAgICdzdHJvbmcnOiBzdHIgPT4gdGhpcy5jaGFsay5ib2xkKHN0ciksXG4gICAgICAgICAgICAnYSc6ICAgICAgc3RyID0+IGBcIiR7dGhpcy5jaGFsay51bmRlcmxpbmUoc3RyKX1cImBcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBTdHJpbmcgaGVscGVyc1xuICAgIGluZGVudFN0cmluZyAoc3RyLCBpbmRlbnRWYWwpIHtcbiAgICAgICAgcmV0dXJuIGluZGVudFN0cmluZyhzdHIsICcgJywgaW5kZW50VmFsKTtcbiAgICB9XG5cbiAgICB3b3JkV3JhcCAoc3RyLCBpbmRlbnRWYWwsIHdpZHRoKSB7XG4gICAgICAgIHJldHVybiB3b3JkV3JhcChzdHIsIGluZGVudFZhbCwgd2lkdGgpO1xuICAgIH1cblxuICAgIGVzY2FwZUh0bWwgKHN0cikge1xuICAgICAgICByZXR1cm4gZXNjYXBlSHRtbChzdHIpO1xuICAgIH1cblxuICAgIGZvcm1hdEVycm9yIChlcnIsIHByZWZpeCA9ICcnKSB7XG4gICAgICAgIGNvbnN0IHByZWZpeExlbmd0aFdpdGhvdXRDb2xvcnMgPSByZW1vdmVUVFlDb2xvcnMocHJlZml4KS5sZW5ndGg7XG4gICAgICAgIGNvbnN0IG1heE1zZ0xlbmd0aCAgICAgICAgICAgICAgPSB0aGlzLnZpZXdwb3J0V2lkdGggLSB0aGlzW2luZGVudF0gLSBwcmVmaXhMZW5ndGhXaXRob3V0Q29sb3JzO1xuICAgICAgICBsZXQgbXNnICAgICAgICAgICAgICAgICAgICAgICAgID0gZXJyLmZvcm1hdE1lc3NhZ2UodGhpc1tlcnJvckRlY29yYXRvcl0sIG1heE1zZ0xlbmd0aCk7XG5cbiAgICAgICAgaWYgKHRoaXNbd29yZFdyYXBFbmFibGVkXSlcbiAgICAgICAgICAgIG1zZyA9IHRoaXMud29yZFdyYXAobXNnLCBwcmVmaXhMZW5ndGhXaXRob3V0Q29sb3JzLCBtYXhNc2dMZW5ndGgpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBtc2cgPSB0aGlzLmluZGVudFN0cmluZyhtc2csIHByZWZpeExlbmd0aFdpdGhvdXRDb2xvcnMpO1xuXG4gICAgICAgIHJldHVybiBwcmVmaXggKyBtc2cuc3Vic3RyKHByZWZpeExlbmd0aFdpdGhvdXRDb2xvcnMpO1xuICAgIH1cblxuXG4gICAgLy8gV3JpdGluZyBoZWxwZXJzXG4gICAgbmV3bGluZSAoKSB7XG4gICAgICAgIHRoaXNbc3RyZWFtXS53cml0ZSgnXFxuJyk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgd3JpdGUgKHRleHQpIHtcbiAgICAgICAgaWYgKHRoaXNbd29yZFdyYXBFbmFibGVkXSlcbiAgICAgICAgICAgIHRleHQgPSB0aGlzLndvcmRXcmFwKHRleHQsIHRoaXNbaW5kZW50XSwgdGhpcy52aWV3cG9ydFdpZHRoKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGV4dCA9IHRoaXMuaW5kZW50U3RyaW5nKHRleHQsIHRoaXNbaW5kZW50XSk7XG5cbiAgICAgICAgdGhpc1tzdHJlYW1dLndyaXRlKHRleHQpO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHVzZVdvcmRXcmFwICh1c2UpIHtcbiAgICAgICAgdGhpc1t3b3JkV3JhcEVuYWJsZWRdID0gdXNlO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHNldEluZGVudCAodmFsKSB7XG4gICAgICAgIHRoaXNbaW5kZW50XSA9IHZhbDtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cblxuICAgIC8vIEFic3RyYWN0IG1ldGhvZHMgaW1wbGVtZW50ZWQgaW4gcGx1Z2luXG4gICAgYXN5bmMgcmVwb3J0VGFza1N0YXJ0ICgvKiBzdGFydFRpbWUsIHVzZXJBZ2VudHMsIHRlc3RDb3VudCAqLykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBpbXBsZW1lbnRlZCcpO1xuICAgIH1cblxuICAgIGFzeW5jIHJlcG9ydEZpeHR1cmVTdGFydCAoLyogbmFtZSwgcGF0aCAqLykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBpbXBsZW1lbnRlZCcpO1xuICAgIH1cblxuICAgIC8vIE5PVEU6IEl0J3MgYW4gb3B0aW9uYWwgbWV0aG9kXG4gICAgLy8gYXN5bmMgcmVwb3J0VGVzdFN0YXJ0ICgvKiBuYW1lLCB0ZXN0TWV0YSAqLykge1xuICAgIC8vICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBpbXBsZW1lbnRlZCcpO1xuICAgIC8vIH1cblxuICAgIGFzeW5jIHJlcG9ydFRlc3REb25lICgvKiBuYW1lLCB0ZXN0UnVuSW5mbyAqLykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBpbXBsZW1lbnRlZCcpO1xuICAgIH1cblxuICAgIGFzeW5jIHJlcG9ydFRhc2tEb25lICgvKiBlbmRUaW1lLCBwYXNzZWQsIHdhcm5pbmdzICovKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTm90IGltcGxlbWVudGVkJyk7XG4gICAgfVxufVxuIl19 |
\ | No newline at end of file |