@tylertech/forge-build-tools
Version:
Node utilities for building and packaging libraries.
151 lines • 19.5 kB
JavaScript
import ts from 'typescript';
import { isGlob, log, logError, logInfo, logWarn } from '../utils/index.js';
import { readJsonFile, globFilesAsync } from '../fs/index.js';
/**
* Compiles a list of TypeScript file paths to JavaScript and emits their
* @param files The list of source filenames to compile.
* @param options The TypeScript compiler options.
*/
export async function compileTypeScript(files, options) {
if (typeof files === 'string') {
files = isGlob(files) ? await globFilesAsync(files, {}) : [files];
}
if (typeof options === 'string') {
const tsconfig = await readJsonFile(options);
if (tsconfig && tsconfig.compilerOptions) {
options = tsconfig.compilerOptions;
}
else {
throw new Error('Invalid configuration file specified: ' + options);
}
}
options = normalizeCompilerOptions(options);
// The TypeScript compiler API requires lib entries to be specified as the whole
// filename (i.e. lib.es2015.d.ts), which differs from the regular tsconfig lib entries. This allows
// lib entries to specified the same way (i.e. es2015 => lib.es2015.d.ts)
if (options.lib) {
options.lib = options.lib.map(lib => `lib.${lib}.d.ts`);
}
const program = ts.createProgram(files, options);
const emitResult = program.emit();
const allDiagnostics = ts.getPreEmitDiagnostics(program).concat(emitResult.diagnostics);
allDiagnostics.forEach(diagnostic => {
if (diagnostic.file) {
const { line, character } = diagnostic.file.getLineAndCharacterOfPosition(diagnostic.start);
const message = ts.flattenDiagnosticMessageText(diagnostic.messageText, '\n');
getDiagnosticLogger(diagnostic.category)(`${diagnostic.file.fileName} (${line + 1},${character + 1}): ${message}`);
}
else {
log(`${ts.flattenDiagnosticMessageText(diagnostic.messageText, '\n')}`);
}
});
if (options.noEmitOnError && allDiagnostics.some(d => d.category === ts.DiagnosticCategory.Error)) {
logError('TypeScript compilation failed.');
process.exit(1);
}
}
function getDiagnosticLogger(diagnostic) {
switch (diagnostic) {
case ts.DiagnosticCategory.Error:
return logError;
case ts.DiagnosticCategory.Message:
return log;
case ts.DiagnosticCategory.Suggestion:
return logInfo;
case ts.DiagnosticCategory.Warning:
return logWarn;
}
}
/**
* Converts TypeScript compiler options to their node API-compatible values.
* @param options
*/
export function normalizeCompilerOptions(options) {
if (options.moduleResolution && typeof options.moduleResolution === 'string') {
switch (options.moduleResolution.toLowerCase().trim()) {
case 'classic':
options.moduleResolution = ts.ModuleResolutionKind.Classic;
break;
case 'node':
options.moduleResolution = ts.ModuleResolutionKind.NodeJs;
break;
default:
delete options.moduleResolution;
}
}
if (options.module && typeof options.module === 'string') {
switch (options.module.toLowerCase().trim()) {
case 'amd':
options.module = ts.ModuleKind.AMD;
break;
case 'commonjs':
options.module = ts.ModuleKind.CommonJS;
break;
case 'es2015':
options.module = ts.ModuleKind.ES2015;
break;
case 'es2020':
options.module = ts.ModuleKind.ES2020;
break;
case 'es2022':
options.module = ts.ModuleKind.ES2022;
break;
case 'esnext':
options.module = ts.ModuleKind.ESNext;
break;
case 'system':
options.module = ts.ModuleKind.System;
break;
case 'umd':
options.module = ts.ModuleKind.UMD;
break;
case 'none':
options.module = ts.ModuleKind.None;
break;
default:
delete options.module;
}
}
if (options.target && typeof options.target === 'string') {
switch (options.target.toUpperCase().trim()) {
case 'ES3':
options.target = ts.ScriptTarget.ES3;
break;
case 'ES5':
options.target = ts.ScriptTarget.ES5;
break;
case 'ES6':
case 'ES2015':
options.target = ts.ScriptTarget.ES2015;
break;
case 'ES2016':
options.target = ts.ScriptTarget.ES2016;
break;
case 'ES2017':
options.target = ts.ScriptTarget.ES2017;
break;
case 'ES2018':
options.target = ts.ScriptTarget.ES2018;
break;
case 'ES2019':
options.target = ts.ScriptTarget.ES2019;
break;
case 'ES2020':
options.target = ts.ScriptTarget.ES2020;
break;
case 'ES2021':
options.target = ts.ScriptTarget.ES2021;
break;
case 'ES2022':
options.target = ts.ScriptTarget.ES2022;
break;
case 'ESNEXT':
options.target = ts.ScriptTarget.ESNext;
break;
default:
delete options.target;
}
}
return options;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXNjcmlwdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eXBlc2NyaXB0L3R5cGVzY3JpcHQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRTVCLE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDNUUsT0FBTyxFQUFFLFlBQVksRUFBRSxjQUFjLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUk5RDs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxpQkFBaUIsQ0FBQyxLQUF3QixFQUFFLE9BQTRDO0lBQzVHLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDOUIsS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxjQUFjLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2hGLENBQUM7SUFFRCxJQUFJLE9BQU8sT0FBTyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQ2hDLE1BQU0sUUFBUSxHQUFHLE1BQU0sWUFBWSxDQUFDLE9BQU8sQ0FBUSxDQUFDO1FBQ3BELElBQUksUUFBUSxJQUFJLFFBQVEsQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUN6QyxPQUFPLEdBQUcsUUFBUSxDQUFDLGVBQWUsQ0FBQztRQUNyQyxDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sSUFBSSxLQUFLLENBQUMsd0NBQXdDLEdBQUcsT0FBTyxDQUFDLENBQUM7UUFDdEUsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLEdBQUcsd0JBQXdCLENBQUMsT0FBNkIsQ0FBQyxDQUFDO0lBRWxFLGdGQUFnRjtJQUNoRixvR0FBb0c7SUFDcEcseUVBQXlFO0lBQ3pFLElBQUksT0FBTyxDQUFD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Z0JBQ1gsT0FBTyxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQztnQkFDeEMsTUFBTTtZQUNSLEtBQUssUUFBUTtnQkFDWCxPQUFPLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDO2dCQUN4QyxNQUFNO1lBQ1IsS0FBSyxRQUFRO2dCQUNYLE9BQU8sQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUM7Z0JBQ3hDLE1BQU07WUFDUjtnQkFDRSxPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUM7UUFDMUIsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLE9BQU8sQ0FBQztBQUNqQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHRzIGZyb20gJ3R5cGVzY3JpcHQnO1xuXG5pbXBvcnQgeyBpc0dsb2IsIGxvZywgbG9nRXJyb3IsIGxvZ0luZm8sIGxvZ1dhcm4gfSBmcm9tICcuLi91dGlscy9pbmRleC5qcyc7XG5pbXBvcnQgeyByZWFkSnNvbkZpbGUsIGdsb2JGaWxlc0FzeW5jIH0gZnJvbSAnLi4vZnMvaW5kZXguanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIElUeXBlU2NyaXB0Q29tcGlsZXJPcHRpb25zIGV4dGVuZHMgdHMuQ29tcGlsZXJPcHRpb25zIHt9XG5cbi8qKlxuICogQ29tcGlsZXMgYSBsaXN0IG9mIFR5cGVTY3JpcHQgZmlsZSBwYXRocyB0byBKYXZhU2NyaXB0IGFuZCBlbWl0cyB0aGVpclxuICogQHBhcmFtIGZpbGVzIFRoZSBsaXN0IG9mIHNvdXJjZSBmaWxlbmFtZXMgdG8gY29tcGlsZS5cbiAqIEBwYXJhbSBvcHRpb25zIFRoZSBUeXBlU2NyaXB0IGNvbXBpbGVyIG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjb21waWxlVHlwZVNjcmlwdChmaWxlczogc3RyaW5nW10gfCBzdHJpbmcsIG9wdGlvbnM6IElUeXBlU2NyaXB0Q29tcGlsZXJPcHRpb25zIHwgc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICh0eXBlb2YgZmlsZXMgPT09ICdzdHJpbmcnKSB7XG4gICAgZmlsZXMgPSBpc0dsb2IoZmlsZXMpID8gYXdhaXQgZ2xvYkZpbGVzQXN5bmMoZmlsZXMsIHt9KSBhcyBzdHJpbmdbXSA6IFtmaWxlc107XG4gIH1cblxuICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdzdHJpbmcnKSB7XG4gICAgY29uc3QgdHNjb25maWcgPSBhd2FpdCByZWFkSnNvbkZpbGUob3B0aW9ucykgYXMgYW55O1xuICAgIGlmICh0c2NvbmZpZyAmJiB0c2NvbmZpZy5jb21waWxlck9wdGlvbnMpIHtcbiAgICAgIG9wdGlvbnMgPSB0c2NvbmZpZy5jb21waWxlck9wdGlvbnM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjb25maWd1cmF0aW9uIGZpbGUgc3BlY2lmaWVkOiAnICsgb3B0aW9ucyk7XG4gICAgfVxuICB9XG5cbiAgb3B0aW9ucyA9IG5vcm1hbGl6ZUNvbXBpbGVyT3B0aW9ucyhvcHRpb25zIGFzIHRzLkNvbXBpbGVyT3B0aW9ucyk7XG5cbiAgLy8gVGhlIFR5cGVTY3JpcHQgY29tcGlsZXIgQVBJIHJlcXVpcmVzIGxpYiBlbnRyaWVzIHRvIGJlIHNwZWNpZmllZCBhcyB0aGUgd2hvbGVcbiAgLy8gZmlsZW5hbWUgKGkuZS4gbGliLmVzMjAxNS5kLnRzKSwgd2hpY2ggZGlmZmVycyBmcm9tIHRoZSByZWd1bGFyIHRzY29uZmlnIGxpYiBlbnRyaWVzLiBUaGlzIGFsbG93c1xuICAvLyBsaWIgZW50cmllcyB0byBzcGVjaWZpZWQgdGhlIHNhbWUgd2F5IChpLmUuIGVzMjAxNSA9PiBsaWIuZXMyMDE1LmQudHMpXG4gIGlmIChvcHRpb25zLmxpYikge1xuICAgIG9wdGlvbnMubGliID0gb3B0aW9ucy5saWIubWFwKGxpYiA9PiBgbGliLiR7bGlifS5kLnRzYCk7XG4gIH1cbiAgXG4gIGNvbnN0IHByb2dyYW0gPSB0cy5jcmVhdGVQcm9ncmFtKGZpbGVzLCBvcHRpb25zKTtcbiAgY29uc3QgZW1pdFJlc3VsdCA9IHByb2dyYW0uZW1pdCgpO1xuICBjb25zdCBhbGxEaWFnbm9zdGljcyA9IHRzLmdldFByZUVtaXREaWFnbm9zdGljcyhwcm9ncmFtKS5jb25jYXQoZW1pdFJlc3VsdC5kaWFnbm9zdGljcyk7XG5cbiAgYWxsRGlhZ25vc3RpY3MuZm9yRWFjaChkaWFnbm9zdGljID0+IHtcbiAgICBpZiAoZGlhZ25vc3RpYy5maWxlKSB7XG4gICAgICBjb25zdCB7IGxpbmUsIGNoYXJhY3RlciB9ID0gZGlhZ25vc3RpYy5maWxlLmdldExpbmVBbmRDaGFyYWN0ZXJPZlBvc2l0aW9uKGRpYWdub3N0aWMuc3RhcnQgYXMgbnVtYmVyKTtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSB0cy5mbGF0dGVuRGlhZ25vc3RpY01lc3NhZ2VUZXh0KGRpYWdub3N0aWMubWVzc2FnZVRleHQsICdcXG4nKTtcbiAgICAgIGdldERpYWdub3N0aWNMb2dnZXIoZGlhZ25vc3RpYy5jYXRlZ29yeSkoYCR7ZGlhZ25vc3RpYy5maWxlLmZpbGVOYW1lfSAoJHtsaW5lICsgMX0sJHtjaGFyYWN0ZXIgKyAxfSk6ICR7bWVzc2FnZX1gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nKGAke3RzLmZsYXR0ZW5EaWFnbm9zdGljTWVzc2FnZVRleHQoZGlhZ25vc3RpYy5tZXNzYWdlVGV4dCwgJ1xcbicpfWApO1xuICAgIH1cbiAgfSk7XG5cbiAgaWYgKG9wdGlvbnMubm9FbWl0T25FcnJvciAmJiBhbGxEaWFnbm9zdGljcy5zb21lKGQgPT4gZC5jYXRlZ29yeSA9PT0gdHMuRGlhZ25vc3RpY0NhdGVnb3J5LkVycm9yKSkge1xuICAgIGxvZ0Vycm9yKCdUeXBlU2NyaXB0IGNvbXBpbGF0aW9uIGZhaWxlZC4nKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0RGlhZ25vc3RpY0xvZ2dlcihkaWFnbm9zdGljOiB0cy5EaWFnbm9zdGljQ2F0ZWdvcnkpOiAoLi4uYXJnczogYW55W10pID0+IHZvaWQge1xuICBzd2l0Y2ggKGRpYWdub3N0aWMpIHtcbiAgICBjYXNlIHRzLkRpYWdub3N0aWNDYXRlZ29yeS5FcnJvcjpcbiAgICAgIHJldHVybiBsb2dFcnJvcjtcbiAgICBjYXNlIHRzLkRpYWdub3N0aWNDYXRlZ29yeS5NZXNzYWdlOlxuICAgICAgcmV0dXJuIGxvZztcbiAgICBjYXNlIHRzLkRpYWdub3N0aWNDYXRlZ29yeS5TdWdnZXN0aW9uOlxuICAgICAgcmV0dXJuIGxvZ0luZm87XG4gICAgY2FzZSB0cy5EaWFnbm9zdGljQ2F0ZWdvcnkuV2FybmluZzpcbiAgICAgIHJldHVybiBsb2dXYXJuO1xuICB9XG59XG5cbi8qKlxuICogQ29udmVydHMgVHlwZVNjcmlwdCBjb21waWxlciBvcHRpb25zIHRvIHRoZWlyIG5vZGUgQVBJLWNvbXBhdGlibGUgdmFsdWVzLlxuICogQHBhcmFtIG9wdGlvbnMgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVDb21waWxlck9wdGlvbnMob3B0aW9uczogdHMuQ29tcGlsZXJPcHRpb25zKTogdHMuQ29tcGlsZXJPcHRpb25zIHtcbiAgaWYgKG9wdGlvbnMubW9kdWxlUmVzb2x1dGlvbiAmJiB0eXBlb2Ygb3B0aW9ucy5tb2R1bGVSZXNvbHV0aW9uID09PSAnc3RyaW5nJykge1xuICAgIHN3aXRjaCAoKG9wdGlvbnMubW9kdWxlUmVzb2x1dGlvbiBhcyBzdHJpbmcpLnRvTG93ZXJDYXNlKCkudHJpbSgpKSB7XG4gICAgICBjYXNlICdjbGFzc2ljJzpcbiAgICAgICAgb3B0aW9ucy5tb2R1bGVSZXNvbHV0aW9uID0gdHMuTW9kdWxlUmVzb2x1dGlvbktpbmQuQ2xhc3NpYztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdub2RlJzpcbiAgICAgICAgb3B0aW9ucy5tb2R1bGVSZXNvbHV0aW9uID0gdHMuTW9kdWxlUmVzb2x1dGlvbktpbmQuTm9kZUpzO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGRlbGV0ZSBvcHRpb25zLm1vZHVsZVJlc29sdXRpb247XG4gICAgfVxuICB9XG5cbiAgaWYgKG9wdGlvbnMubW9kdWxlICYmIHR5cGVvZiBvcHRpb25zLm1vZHVsZSA9PT0gJ3N0cmluZycpIHtcbiAgICBzd2l0Y2ggKChvcHRpb25zLm1vZHVsZSBhcyBzdHJpbmcpLnRvTG93ZXJDYXNlKCkudHJpbSgpKSB7XG4gICAgICBjYXNlICdhbWQnOlxuICAgICAgICBvcHRpb25zLm1vZHVsZSA9IHRzLk1vZHVsZUtpbmQuQU1EO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2NvbW1vbmpzJzpcbiAgICAgICAgb3B0aW9ucy5tb2R1bGUgPSB0cy5Nb2R1bGVLaW5kLkNvbW1vbkpTO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2VzMjAxNSc6XG4gICAgICAgIG9wdGlvbnMubW9kdWxlID0gdHMuTW9kdWxlS2luZC5FUzIwMTU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZXMyMDIwJzpcbiAgICAgICAgb3B0aW9ucy5tb2R1bGUgPSB0cy5Nb2R1bGVLaW5kLkVTMjAyMDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdlczIwMjInOlxuICAgICAgICBvcHRpb25zLm1vZHVsZSA9IHRzLk1vZHVsZUtpbmQuRVMyMDIyO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2VzbmV4dCc6XG4gICAgICAgIG9wdGlvbnMubW9kdWxlID0gdHMuTW9kdWxlS2luZC5FU05leHQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnc3lzdGVtJzpcbiAgICAgICAgb3B0aW9ucy5tb2R1bGUgPSB0cy5Nb2R1bGVLaW5kLlN5c3RlbTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd1bWQnOlxuICAgICAgICBvcHRpb25zLm1vZHVsZSA9IHRzLk1vZHVsZUtpbmQuVU1EO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ25vbmUnOlxuICAgICAgICBvcHRpb25zLm1vZHVsZSA9IHRzLk1vZHVsZUtpbmQuTm9uZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBkZWxldGUgb3B0aW9ucy5tb2R1bGU7XG4gICAgfVxuICB9XG5cbiAgaWYgKG9wdGlvbnMudGFyZ2V0ICYmIHR5cGVvZiBvcHRpb25zLnRhcmdldCA9PT0gJ3N0cmluZycpIHtcbiAgICBzd2l0Y2ggKChvcHRpb25zLnRhcmdldCBhcyBzdHJpbmcpLnRvVXBwZXJDYXNlKCkudHJpbSgpKSB7XG4gICAgICBjYXNlICdFUzMnOlxuICAgICAgICBvcHRpb25zLnRhcmdldCA9IHRzLlNjcmlwdFRhcmdldC5FUzM7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnRVM1JzpcbiAgICAgICAgb3B0aW9ucy50YXJnZXQgPSB0cy5TY3JpcHRUYXJnZXQuRVM1O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ0VTNic6XG4gICAgICBjYXNlICdFUzIwMTUnOlxuICAgICAgICBvcHRpb25zLnRhcmdldCA9IHRzLlNjcmlwdFRhcmdldC5FUzIwMTU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnRVMyMDE2JzpcbiAgICAgICAgb3B0aW9ucy50YXJnZXQgPSB0cy5TY3JpcHRUYXJnZXQuRVMyMDE2O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ0VTMjAxNyc6XG4gICAgICAgIG9wdGlvbnMudGFyZ2V0ID0gdHMuU2NyaXB0VGFyZ2V0LkVTMjAxNztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdFUzIwMTgnOlxuICAgICAgICBvcHRpb25zLnRhcmdldCA9IHRzLlNjcmlwdFRhcmdldC5FUzIwMTg7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnRVMyMDE5JzpcbiAgICAgICAgb3B0aW9ucy50YXJnZXQgPSB0cy5TY3JpcHRUYXJnZXQuRVMyMDE5O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ0VTMjAyMCc6XG4gICAgICAgIG9wdGlvbnMudGFyZ2V0ID0gdHMuU2NyaXB0VGFyZ2V0LkVTMjAyMDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdFUzIwMjEnOlxuICAgICAgICBvcHRpb25zLnRhcmdldCA9IHRzLlNjcmlwdFRhcmdldC5FUzIwMjE7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnRVMyMDIyJzpcbiAgICAgICAgb3B0aW9ucy50YXJnZXQgPSB0cy5TY3JpcHRUYXJnZXQuRVMyMDIyO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ0VTTkVYVCc6XG4gICAgICAgIG9wdGlvbnMudGFyZ2V0ID0gdHMuU2NyaXB0VGFyZ2V0LkVTTmV4dDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBkZWxldGUgb3B0aW9ucy50YXJnZXQ7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG9wdGlvbnM7XG59XG4iXX0=