UNPKG

turbo-gulp

Version:

Gulp tasks to boost high-quality projects.

124 lines (122 loc) 18.7 kB
"use strict"; var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; result["default"] = mod; return result; } Object.defineProperty(exports, "__esModule", { value: true }); const child_process_1 = require("child_process"); const fs = __importStar(require("fs")); const incident_1 = require("incident"); const stream_1 = require("stream"); const util_1 = require("util"); function asBuffer(val) { return val instanceof Buffer ? val : new Buffer(val, "utf8"); } class ExecFileError extends incident_1.Incident { constructor(nativeError, stdout, stderr) { const data = { cmd: nativeError.cmd, killed: nativeError.killed, code: nativeError.code, signal: nativeError.signal, stdout: asBuffer(stdout), stderr: asBuffer(stderr), }; const message = `An error occured during the execution of: ${data.cmd}\n${nativeError.stack}`; super(nativeError, "ExecFileError", data, message); } } exports.ExecFileError = ExecFileError; const _readFile = util_1.promisify(fs.readFile); const _writeFile = util_1.promisify(fs.writeFile); async function readText(file) { return _readFile(file, "utf8"); } exports.readText = readText; async function writeText(file, text) { return _writeFile(file, text); } exports.writeText = writeText; async function execFile(file, args, options) { return new Promise((resolve, reject) => { const normalizedOptions = Object.assign({}, options, { encoding: "buffer" }); child_process_1.execFile(file, args, normalizedOptions, (error, stdout, stderr) => { if (error !== null) { reject(new ExecFileError(error, stdout, stderr)); return; } const result = { stdout: asBuffer(stdout), stderr: asBuffer(stderr), }; resolve(result); }); }); } exports.execFile = execFile; class SpawnedProcess { constructor(file, args, options) { this.stdoutChunks = []; this.stderrChunks = []; this.exit = undefined; const detached = options.detached !== undefined ? options.detached : false; this.process = child_process_1.spawn(file, args, { stdio: [process.stdin, "pipe", "pipe"], cwd: options.cwd, env: options.env, detached }); const stdout = new stream_1.PassThrough(); this.process.stdout.pipe(stdout); const stderr = new stream_1.PassThrough(); this.process.stderr.pipe(stderr); if (options.stdio === "inherit") { stdout.pipe(process.stdout); stderr.pipe(process.stderr); } stdout.on("data", (chunk) => { this.stdoutChunks.push(chunk); }); stderr.on("data", (chunk) => { this.stderrChunks.push(chunk); }); this.process.once("exit", (code, signal) => { if (code !== null) { this.exit = { type: "code", code }; } else { this.exit = { type: "signal", signal: signal }; } }); } async toPromise() { return new Promise((resolve, reject) => { if (this.exit !== undefined) { const [stdout, stderr] = this.getBuffers(); resolve({ stdout, stderr, exit: this.exit }); } else { this.process.once("exit", (code, signal) => { let exit; if (code !== null) { exit = { type: "code", code }; } else { exit = { type: "signal", signal: signal }; } const [stdout, stderr] = this.getBuffers(); resolve({ stdout, stderr, exit }); }); } }); } getBuffers() { const stdout = Buffer.concat(this.stdoutChunks); const stderr = Buffer.concat(this.stderrChunks); this.stdoutChunks.length = 0; this.stderrChunks.length = 0; this.stdoutChunks.push(stdout); this.stderrChunks.push(stderr); return [stdout, stderr]; } } exports.SpawnedProcess = SpawnedProcess; //# sourceMappingURL=data:application/json;charset=utf8;base64,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QUFNLEVBQUUsSUFBSSxFQUFDLENBQUM7b0JBQzlCLENBQUM7b0JBQUMsSUFBSSxDQUFDLENBQUM7d0JBQ04sSUFBSSxHQUFHLEVBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTyxFQUFDLENBQUM7b0JBQzNDLENBQUM7b0JBQ0QsTUFBTSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsR0FBcUIsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO29CQUM3RCxPQUFPLENBQUMsRUFBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBQyxDQUFDLENBQUM7Z0JBQ2xDLENBQUMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLFVBQVU7UUFDaEIsTUFBTSxNQUFNLEdBQVcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDeEQsTUFBTSxNQUFNLEdBQVcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDeEQsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQzdCLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUM3QixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMvQixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMvQixNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDMUIsQ0FBQztDQUNGO0FBMUVELHdDQTBFQyIsImZpbGUiOiJ1dGlscy9ub2RlLWFzeW5jLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hpbGRQcm9jZXNzLFxuICBleGVjRmlsZSBhcyBfZXhlY0ZpbGUsXG4gIEV4ZWNGaWxlT3B0aW9ucyBhcyBfRXhlY0ZpbGVPcHRpb25zLFxuICBzcGF3biBhcyBfc3Bhd24sXG59IGZyb20gXCJjaGlsZF9wcm9jZXNzXCI7XG5pbXBvcnQgKiBhcyBmcyBmcm9tIFwiZnNcIjtcbmltcG9ydCB7IEluY2lkZW50IH0gZnJvbSBcImluY2lkZW50XCI7XG5pbXBvcnQgeyBQYXNzVGhyb3VnaCwgVHJhbnNmb3JtIGFzIFRyYW5zZm9ybVN0cmVhbSB9IGZyb20gXCJzdHJlYW1cIjtcbmltcG9ydCB7IHByb21pc2lmeSB9IGZyb20gXCJ1dGlsXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXhlY0ZpbGVPcHRpb25zIHtcbiAgY3dkPzogc3RyaW5nO1xuICBlbnY/OiB7W2tleTogc3RyaW5nXTogc3RyaW5nfTtcbiAgdGltZW91dD86IG51bWJlcjtcbiAgbWF4QnVmZmVyPzogbnVtYmVyO1xuICBraWxsU2lnbmFsPzogc3RyaW5nO1xuICB1aWQ/OiBudW1iZXI7XG4gIGdpZD86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFeGVjRmlsZVJlc3VsdCB7XG4gIHN0ZG91dDogQnVmZmVyO1xuICBzdGRlcnI6IEJ1ZmZlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFeGVjRmlsZUVycm9yRGF0YSB7XG4gIC8qKlxuICAgKiBFeGVjdXRlZCBjb21tYW5kXG4gICAqL1xuICBjbWQ6IHN0cmluZztcblxuICBraWxsZWQ6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEV4aXQgY29kZTogMCBpZiB0aGUgZXhlY3V0aW9uIHdhcyBzdWNjZXNzZnVsLCBlbHNlIHRoZXJlIHdhcyBhIHJ1bnRpbWUgZXJyb3JcbiAgICovXG4gIGNvZGU6IG51bWJlcjtcblxuICAvLyBUT0RPOiBjaGVjayB0aGUgdHlwZSBvZiBgc2lnbmFsYFxuICBzaWduYWw6IG51bGwgfCBhbnk7XG5cbiAgc3Rkb3V0OiBCdWZmZXI7XG5cbiAgc3RkZXJyOiBCdWZmZXI7XG59XG5cbmZ1bmN0aW9uIGFzQnVmZmVyKHZhbDogc3RyaW5nIHwgQnVmZmVyKTogQnVmZmVyIHtcbiAgcmV0dXJuIHZhbCBpbnN0YW5jZW9mIEJ1ZmZlciA/IHZhbCA6IG5ldyBCdWZmZXIodmFsLCBcInV0ZjhcIik7XG59XG5cbmV4cG9ydCBjbGFzcyBFeGVjRmlsZUVycm9yIGV4dGVuZHMgSW5jaWRlbnQ8RXhlY0ZpbGVFcnJvckRhdGEsIFwiRXhlY0ZpbGVFcnJvclwiLCBFcnJvcj4ge1xuICBjb25zdHJ1Y3RvcihuYXRpdmVFcnJvcjogRXJyb3IsIHN0ZG91dDogQnVmZmVyIHwgc3RyaW5nLCBzdGRlcnI6IEJ1ZmZlciB8IHN0cmluZykge1xuICAgIGNvbnN0IGRhdGE6IEV4ZWNGaWxlRXJyb3JEYXRhID0ge1xuICAgICAgY21kOiAoPEVycm9yICYge2NtZDogc3RyaW5nfT4gbmF0aXZlRXJyb3IpLmNtZCxcbiAgICAgIGtpbGxlZDogKDxFcnJvciAmIHtraWxsZWQ6IGJvb2xlYW59PiBuYXRpdmVFcnJvcikua2lsbGVkLFxuICAgICAgY29kZTogKDxFcnJvciAmIHtjb2RlOiBudW1iZXJ9PiBuYXRpdmVFcnJvcikuY29kZSxcbiAgICAgIHNpZ25hbDogKDxFcnJvciAmIHtzaWduYWw6IG51bGwgfCBhbnl9PiBuYXRpdmVFcnJvcikuc2lnbmFsLFxuICAgICAgc3Rkb3V0OiBhc0J1ZmZlcihzdGRvdXQpLFxuICAgICAgc3RkZXJyOiBhc0J1ZmZlcihzdGRlcnIpLFxuICAgIH07XG4gICAgY29uc3QgbWVzc2FnZTogc3RyaW5nID0gYEFuIGVycm9yIG9jY3VyZWQgZHVyaW5nIHRoZSBleGVjdXRpb24gb2Y6ICR7ZGF0YS5jbWR9XFxuJHtuYXRpdmVFcnJvci5zdGFja31gO1xuICAgIHN1cGVyKG5hdGl2ZUVycm9yLCBcIkV4ZWNGaWxlRXJyb3JcIiwgZGF0YSwgbWVzc2FnZSk7XG5cbiAgfVxufVxuXG5jb25zdCBfcmVhZEZpbGU6IChmaWxlbmFtZTogc3RyaW5nLCBlbmNvZGluZzogc3RyaW5nKSA9PiBQcm9taXNlPHN0cmluZz4gPSA8YW55PiBwcm9taXNpZnkoZnMucmVhZEZpbGUpO1xuY29uc3QgX3dyaXRlRmlsZTogKGZpbGVuYW1lOiBzdHJpbmcsIGRhdGE6IGFueSkgPT4gUHJvbWlzZTxhbnk+ID0gPGFueT4gcHJvbWlzaWZ5KGZzLndyaXRlRmlsZSk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWFkVGV4dChmaWxlOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICByZXR1cm4gX3JlYWRGaWxlKGZpbGUsIFwidXRmOFwiKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdyaXRlVGV4dChmaWxlOiBzdHJpbmcsIHRleHQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gX3dyaXRlRmlsZShmaWxlLCB0ZXh0KTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4ZWNGaWxlKGZpbGU6IHN0cmluZywgYXJnczogc3RyaW5nW10sIG9wdGlvbnM/OiBFeGVjRmlsZU9wdGlvbnMpOiBQcm9taXNlPEV4ZWNGaWxlUmVzdWx0PiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZTxFeGVjRmlsZVJlc3VsdD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRPcHRpb25zOiBfRXhlY0ZpbGVPcHRpb25zICYge2VuY29kaW5nOiBzdHJpbmd9ID0gey4uLm9wdGlvbnMsIGVuY29kaW5nOiBcImJ1ZmZlclwifTtcblxuICAgIF9leGVjRmlsZShcbiAgICAgIGZpbGUsXG4gICAgICBhcmdzLFxuICAgICAgbm9ybWFsaXplZE9wdGlvbnMsXG4gICAgICAoZXJyb3I6IEVycm9yIHwgbnVsbCwgc3Rkb3V0OiBCdWZmZXIgfCBzdHJpbmcsIHN0ZGVycjogQnVmZmVyIHwgc3RyaW5nKTogdm9pZCA9PiB7XG4gICAgICAgIGlmIChlcnJvciAhPT0gbnVsbCkge1xuICAgICAgICAgIHJlamVjdChuZXcgRXhlY0ZpbGVFcnJvcihlcnJvciwgc3Rkb3V0LCBzdGRlcnIpKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzdWx0OiBFeGVjRmlsZVJlc3VsdCA9IHtcbiAgICAgICAgICBzdGRvdXQ6IGFzQnVmZmVyKHN0ZG91dCksXG4gICAgICAgICAgc3RkZXJyOiBhc0J1ZmZlcihzdGRlcnIpLFxuICAgICAgICB9O1xuICAgICAgICByZXNvbHZlKHJlc3VsdCk7XG4gICAgICB9LFxuICAgICk7XG4gIH0pO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNwYXduT3B0aW9ucyB7XG4gIGN3ZD86IHN0cmluZztcbiAgZW52Pzoge1trZXk6IHN0cmluZ106IHN0cmluZ307XG4gIHN0ZGlvPzogXCJpbmhlcml0XCIgfCBcInBpcGVcIjtcbiAgLyoqXG4gICAqIFJ1biBpbiBkZXRhY2hlZCBtb2RlLiBEZWZhdWx0OiBgZmFsc2VgLlxuICAgKi9cbiAgZGV0YWNoZWQ/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNwYXduUmVzdWx0IHtcbiAgLyoqXG4gICAqIEJ1ZmZlciBjb250YWluaW5nIHRoZSB3aG9sZSBzdGFuZGFyZCBvdXRwdXQgb2YgdGhlIHNwYXduZWQgcHJvY2Vzcy5cbiAgICovXG4gIHN0ZG91dDogQnVmZmVyO1xuXG4gIC8qKlxuICAgKiBCdWZmZXIgY29udGFpbmluZyB0aGUgd2hvbGUgc3RhbmRhcmQgZXJyb3Igb2YgdGhlIHNwYXduZWQgcHJvY2Vzcy5cbiAgICovXG4gIHN0ZGVycjogQnVmZmVyO1xuXG4gIC8qKlxuICAgKiBFeGl0IHZhbHVlIG9mIHRoZSBzcGF3bmVkIHByb2Nlc3M6IGEgcmV0dXJuIGNvZGUgb3IgZXhpdCBzaWduYWwuXG4gICAqL1xuICBleGl0OiBFeGl0O1xufVxuXG4vKipcbiAqIEV4aXQgdmFsdWUgb2YgYSBzcGF3bmVkIHByb2Nlc3M6IGEgcmV0dXJuIGNvZGUgb3IgZXhpdCBzaWduYWxcbiAqL1xuZXhwb3J0IHR5cGUgRXhpdCA9IFNpZ25hbEV4aXQgfCBDb2RlRXhpdDtcblxuZXhwb3J0IGludGVyZmFjZSBDb2RlRXhpdCB7XG4gIHR5cGU6IFwiY29kZVwiO1xuICBjb2RlOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2lnbmFsRXhpdCB7XG4gIHR5cGU6IFwic2lnbmFsXCI7XG4gIHNpZ25hbDogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgU3Bhd25lZFByb2Nlc3Mge1xuICByZWFkb25seSBwcm9jZXNzOiBDaGlsZFByb2Nlc3M7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBzdGRvdXRDaHVua3M6IEJ1ZmZlcltdO1xuICBwcml2YXRlIHJlYWRvbmx5IHN0ZGVyckNodW5rczogQnVmZmVyW107XG4gIHByaXZhdGUgZXhpdD86IEV4aXQ7XG5cbiAgY29uc3RydWN0b3IoZmlsZTogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSwgb3B0aW9uczogU3Bhd25PcHRpb25zKSB7XG4gICAgdGhpcy5zdGRvdXRDaHVua3MgPSBbXTtcbiAgICB0aGlzLnN0ZGVyckNodW5rcyA9IFtdO1xuICAgIHRoaXMuZXhpdCA9IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IGRldGFjaGVkOiBib29sZWFuID0gb3B0aW9ucy5kZXRhY2hlZCAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5kZXRhY2hlZCA6IGZhbHNlO1xuXG4gICAgdGhpcy5wcm9jZXNzID0gX3NwYXduKFxuICAgICAgZmlsZSxcbiAgICAgIGFyZ3MsXG4gICAgICB7c3RkaW86IFtwcm9jZXNzLnN0ZGluLCBcInBpcGVcIiwgXCJwaXBlXCJdLCBjd2Q6IG9wdGlvbnMuY3dkLCBlbnY6IG9wdGlvbnMuZW52LCBkZXRhY2hlZH0sXG4gICAgKTtcblxuICAgIGNvbnN0IHN0ZG91dDogVHJhbnNmb3JtU3RyZWFtID0gbmV3IFBhc3NUaHJvdWdoKCk7XG4gICAgdGhpcy5wcm9jZXNzLnN0ZG91dC5waXBlKHN0ZG91dCk7XG4gICAgY29uc3Qgc3RkZXJyOiBUcmFuc2Zvcm1TdHJlYW0gPSBuZXcgUGFzc1Rocm91Z2goKTtcbiAgICB0aGlzLnByb2Nlc3Muc3RkZXJyLnBpcGUoc3RkZXJyKTtcbiAgICBpZiAob3B0aW9ucy5zdGRpbyA9PT0gXCJpbmhlcml0XCIpIHtcbiAgICAgIHN0ZG91dC5waXBlKHByb2Nlc3Muc3Rkb3V0KTtcbiAgICAgIHN0ZGVyci5waXBlKHByb2Nlc3Muc3RkZXJyKTtcbiAgICB9XG5cbiAgICBzdGRvdXQub24oXCJkYXRhXCIsIChjaHVuazogQnVmZmVyKTogdm9pZCA9PiB7XG4gICAgICB0aGlzLnN0ZG91dENodW5rcy5wdXNoKGNodW5rKTtcbiAgICB9KTtcbiAgICBzdGRlcnIub24oXCJkYXRhXCIsIChjaHVuazogQnVmZmVyKTogdm9pZCA9PiB7XG4gICAgICB0aGlzLnN0ZGVyckNodW5rcy5wdXNoKGNodW5rKTtcbiAgICB9KTtcblxuICAgIHRoaXMucHJvY2Vzcy5vbmNlKFwiZXhpdFwiLCAoY29kZTogbnVtYmVyIHwgbnVsbCwgc2lnbmFsOiBzdHJpbmcgfCBudWxsKTogdm9pZCA9PiB7XG4gICAgICBpZiAoY29kZSAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLmV4aXQgPSB7dHlwZTogXCJjb2RlXCIsIGNvZGV9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5leGl0ID0ge3R5cGU6IFwic2lnbmFsXCIsIHNpZ25hbDogc2lnbmFsIX07XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyB0b1Byb21pc2UoKTogUHJvbWlzZTxTcGF3blJlc3VsdD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTxTcGF3blJlc3VsdD4oKHJlc29sdmU6IChyZXM6IFNwYXduUmVzdWx0KSA9PiB2b2lkLCByZWplY3QpID0+IHtcbiAgICAgIGlmICh0aGlzLmV4aXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCBbc3Rkb3V0LCBzdGRlcnJdOiBbQnVmZmVyLCBCdWZmZXJdID0gdGhpcy5nZXRCdWZmZXJzKCk7XG4gICAgICAgIHJlc29sdmUoe3N0ZG91dCwgc3RkZXJyLCBleGl0OiB0aGlzLmV4aXR9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucHJvY2Vzcy5vbmNlKFwiZXhpdFwiLCAoY29kZTogbnVtYmVyIHwgbnVsbCwgc2lnbmFsOiBzdHJpbmcgfCBudWxsKTogdm9pZCA9PiB7XG4gICAgICAgICAgbGV0IGV4aXQ6IEV4aXQ7XG4gICAgICAgICAgaWYgKGNvZGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGV4aXQgPSB7dHlwZTogXCJjb2RlXCIsIGNvZGV9O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBleGl0ID0ge3R5cGU6IFwic2lnbmFsXCIsIHNpZ25hbDogc2lnbmFsIX07XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IFtzdGRvdXQsIHN0ZGVycl06IFtCdWZmZXIsIEJ1ZmZlcl0gPSB0aGlzLmdldEJ1ZmZlcnMoKTtcbiAgICAgICAgICByZXNvbHZlKHtzdGRvdXQsIHN0ZGVyciwgZXhpdH0pO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0QnVmZmVycygpOiBbQnVmZmVyLCBCdWZmZXJdIHtcbiAgICBjb25zdCBzdGRvdXQ6IEJ1ZmZlciA9IEJ1ZmZlci5jb25jYXQodGhpcy5zdGRvdXRDaHVua3MpO1xuICAgIGNvbnN0IHN0ZGVycjogQnVmZmVyID0gQnVmZmVyLmNvbmNhdCh0aGlzLnN0ZGVyckNodW5rcyk7XG4gICAgdGhpcy5zdGRvdXRDaHVua3MubGVuZ3RoID0gMDtcbiAgICB0aGlzLnN0ZGVyckNodW5rcy5sZW5ndGggPSAwO1xuICAgIHRoaXMuc3Rkb3V0Q2h1bmtzLnB1c2goc3Rkb3V0KTtcbiAgICB0aGlzLnN0ZGVyckNodW5rcy5wdXNoKHN0ZGVycik7XG4gICAgcmV0dXJuIFtzdGRvdXQsIHN0ZGVycl07XG4gIH1cbn1cbiJdLCJzb3VyY2VSb290IjoiLi4ifQ==