UNPKG

27.5 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3const tslib_1 = require("tslib");
4const ts_utils_1 = require("@neo-one/ts-utils");
5const appRootDir = tslib_1.__importStar(require("app-root-dir"));
6const fs = tslib_1.__importStar(require("fs-extra")); // tslint:disable-next-line match-default-export-name
7const glob_1 = tslib_1.__importDefault(require("glob"));
8const path = tslib_1.__importStar(require("path"));
9const typescript_1 = tslib_1.__importDefault(require("typescript"));
10const Context_1 = require("./Context");
11const symbols_1 = require("./symbols");
12function createContext(program, typeChecker, languageService) {
13 return new Context_1.Context(program, typeChecker, languageService, symbols_1.getGlobals(program, typeChecker), symbols_1.getLibs(program, typeChecker), symbols_1.getLibAliases(program, languageService));
14}
15function updateContext(context, files) {
16 const { program, typeChecker, languageService } = createProgram(context.program.getCompilerOptions(), Object.keys(files), createModifyHostFiles(files));
17 return context.update(program, typeChecker, languageService, symbols_1.getGlobals(program, typeChecker), symbols_1.getLibs(program, typeChecker), symbols_1.getLibAliases(program, languageService));
18}
19exports.updateContext = updateContext;
20const doGlob = async (value) => new Promise((resolve, reject) => glob_1.default(value, (error, matches) => {
21 if (error) {
22 reject(error);
23 }
24 else {
25 resolve(matches);
26 }
27}));
28const makeContext = async (rootNames, modifyHost = () => {
29}) => {
30 const tsConfigFilePath = path.resolve(require.resolve('@neo-one/smart-contract-compiler'), '..', '..', 'tsconfig.default.json');
31 const res = typescript_1.default.readConfigFile(tsConfigFilePath, value => fs.readFileSync(value, 'utf8'));
32 const parseConfigHost = {
33 fileExists: fs.existsSync,
34 readDirectory: typescript_1.default.sys.readDirectory,
35 readFile: typescript_1.default.sys.readFile,
36 useCaseSensitiveFileNames: true
37 };
38 const parsed = typescript_1.default.parseJsonConfigFileContent(res.config, parseConfigHost, path.dirname(tsConfigFilePath));
39 const { program, typeChecker, languageService } = createProgram(parsed.options, rootNames, modifyHost);
40 return createContext(program, typeChecker, languageService);
41};
42const createModifyHostFiles = (files) => (host) => {
43 const originalFileExists = host.fileExists === undefined ? typescript_1.default.sys.fileExists : host.fileExists.bind(host); // tslint:disable-next-line no-object-mutation no-any
44 host.fileExists = file => {
45 if (files[file] !== undefined) {
46 return true;
47 }
48 return originalFileExists(file);
49 };
50 const originalReadFile = host.readFile === undefined ? typescript_1.default.sys.readFile : host.readFile.bind(host); // tslint:disable-next-line no-object-mutation no-any
51 host.readFile = (file, ...args) => {
52 const foundFile = files[file];
53 if (foundFile !== undefined) {
54 return foundFile;
55 }
56 return originalReadFile(file, ...args);
57 };
58};
59const createProgram = (options, rootNamesIn // do nothing
60, modifyHost = () => { }) => {
61 const smartContractDir = path.dirname(require.resolve('@neo-one/smart-contract'));
62 const smartContractModule = path.resolve(smartContractDir, 'index.ts');
63 const smartContractFiles = [path.resolve(smartContractDir, 'index.d.ts'), smartContractModule, path.resolve(smartContractDir, 'lib.ts')];
64 const rootNames = [...new Set(rootNamesIn.concat(smartContractFiles).concat(require.resolve('@types/node/index.d.ts')))];
65 const mutableFiles = {}; // initialize the list of files
66 rootNames.forEach(fileName => {
67 mutableFiles[fileName] = {
68 version: 0
69 };
70 });
71 const servicesHost = {
72 getScriptFileNames: () => [...rootNames],
73 getScriptVersion: fileName => {
74 const file = mutableFiles[fileName];
75 return file === undefined ? '' : file.version.toString();
76 },
77 getScriptSnapshot: fileName => {
78 // tslint:disable-next-line no-non-null-assertion
79 if (!servicesHost.fileExists(fileName)) {
80 return undefined;
81 } // tslint:disable-next-line no-non-null-assertion
82 return typescript_1.default.ScriptSnapshot.fromString(servicesHost.readFile(fileName));
83 },
84 getCurrentDirectory: () => process.cwd(),
85 getCompilationSettings: () => options,
86 getDefaultLibFileName: opts => typescript_1.default.getDefaultLibFilePath(opts),
87 fileExists: typescript_1.default.sys.fileExists,
88 readFile: typescript_1.default.sys.readFile,
89 readDirectory: typescript_1.default.sys.readDirectory,
90 resolveModuleNames
91 };
92 const smartContractLibModule = path.resolve(path.dirname(require.resolve('@neo-one/smart-contract-lib')), 'index.ts');
93 function resolveModuleNames(moduleNames, containingFile) {
94 const mutableResolvedModules = []; // tslint:disable-next-line no-loop-statement
95 for (const moduleName of moduleNames) {
96 if (moduleName === '@neo-one/smart-contract') {
97 mutableResolvedModules.push({
98 resolvedFileName: smartContractModule
99 });
100 }
101 else if (moduleName === '@neo-one/smart-contract-lib') {
102 mutableResolvedModules.push({
103 resolvedFileName: smartContractLibModule
104 });
105 }
106 else {
107 const result = typescript_1.default.resolveModuleName(moduleName, containingFile, options, {
108 fileExists: typescript_1.default.sys.fileExists,
109 readFile: typescript_1.default.sys.readFile
110 }); // tslint:disable-next-line no-non-null-assertion
111 mutableResolvedModules.push(result.resolvedModule);
112 }
113 }
114 return mutableResolvedModules;
115 }
116 modifyHost(servicesHost);
117 const languageService = typescript_1.default.createLanguageService(servicesHost, typescript_1.default.createDocumentRegistry());
118 const program = languageService.getProgram();
119 if (program === undefined) {
120 throw new Error('Something went wrong');
121 }
122 return {
123 program,
124 typeChecker: program.getTypeChecker(),
125 languageService
126 };
127};
128exports.createContextForDir = async (dir) => {
129 const files = await doGlob(path.join(dir, '**', '*.ts'));
130 return makeContext(files);
131};
132exports.createContextForPath = async (filePath) => makeContext([filePath]);
133exports.createContextForSnippet = async (code) => {
134 const dir = appRootDir.get();
135 const fileName = path.resolve(dir, 'snippetCode.ts');
136 const context = await makeContext([fileName], createModifyHostFiles({
137 [fileName]: code
138 }));
139 const sourceFile = ts_utils_1.tsUtils.file.getSourceFileOrThrow(context.program, fileName);
140 return {
141 context,
142 sourceFile
143 };
144};
145
146//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNyZWF0ZUNvbnRleHQudHMiXSwibmFtZXMiOlsiY3JlYXRlQ29udGV4dCIsInByb2dyYW0iLCJ0eXBlQ2hlY2tlciIsImxhbmd1YWdlU2VydmljZSIsIkNvbnRleHQiLCJnZXRHbG9iYWxzIiwiZ2V0TGlicyIsImdldExpYkFsaWFzZXMiLCJ1cGRhdGVDb250ZXh0IiwiY29udGV4dCIsImZpbGVzIiwiY3JlYXRlUHJvZ3JhbSIsImdldENvbXBpbGVyT3B0aW9ucyIsIk9iamVjdCIsImtleXMiLCJjcmVhdGVNb2RpZnlIb3N0RmlsZXMiLCJ1cGRhdGUiLCJkb0dsb2IiLCJ2YWx1ZSIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwiZ2xvYiIsImVycm9yIiwibWF0Y2hlcyIsIm1ha2VDb250ZXh0Iiwicm9vdE5hbWVzIiwibW9kaWZ5SG9zdCIsInRzQ29uZmlnRmlsZVBhdGgiLCJwYXRoIiwicmVxdWlyZSIsInJlcyIsInRzIiwicmVhZENvbmZpZ0ZpbGUiLCJmcyIsInJlYWRGaWxlU3luYyIsInBhcnNlQ29uZmlnSG9zdCIsImZpbGVFeGlzdHMiLCJleGlzdHNTeW5jIiwicmVhZERpcmVjdG9yeSIsInN5cyIsInJlYWRGaWxlIiwidXNlQ2FzZVNlbnNpdGl2ZUZpbGVOYW1lcyIsInBhcnNlZCIsInBhcnNlSnNvbkNvbmZpZ0ZpbGVDb250ZW50IiwiY29uZmlnIiwiZGlybmFtZSIsIm9wdGlvbnMiLCJob3N0Iiwib3JpZ2luYWxGaWxlRXhpc3RzIiwidW5kZWZpbmVkIiwiYmluZCIsImZpbGUiLCJvcmlnaW5hbFJlYWRGaWxlIiwiYXJncyIsImZvdW5kRmlsZSIsInJvb3ROYW1lc0luIiwic21hcnRDb250cmFjdERpciIsInNtYXJ0Q29udHJhY3RNb2R1bGUiLCJzbWFydENvbnRyYWN0RmlsZXMiLCJTZXQiLCJjb25jYXQiLCJtdXRhYmxlRmlsZXMiLCJmb3JFYWNoIiwiZmlsZU5hbWUiLCJ2ZXJzaW9uIiwic2VydmljZXNIb3N0IiwiZ2V0U2NyaXB0RmlsZU5hbWVzIiwiZ2V0U2NyaXB0VmVyc2lvbiIsInRvU3RyaW5nIiwiZ2V0U2NyaXB0U25hcHNob3QiLCJTY3JpcHRTbmFwc2hvdCIsImZyb21TdHJpbmciLCJnZXRDdXJyZW50RGlyZWN0b3J5IiwicHJvY2VzcyIsImN3ZCIsImdldENvbXBpbGF0aW9uU2V0dGluZ3MiLCJnZXREZWZhdWx0TGliRmlsZU5hbWUiLCJvcHRzIiwiZ2V0RGVmYXVsdExpYkZpbGVQYXRoIiwicmVzb2x2ZU1vZHVsZU5hbWVzIiwic21hcnRDb250cmFjdExpYk1vZHVsZSIsIm1vZHVsZU5hbWVzIiwiY29udGFpbmluZ0ZpbGUiLCJtdXRhYmxlUmVzb2x2ZWRNb2R1bGVzIiwibW9kdWxlTmFtZSIsInB1c2giLCJyZXNvbHZlZEZpbGVOYW1lIiwicmVzdWx0IiwicmVzb2x2ZU1vZHVsZU5hbWUiLCJyZXNvbHZlZE1vZHVsZSIsImNyZWF0ZUxhbmd1YWdlU2VydmljZSIsImNyZWF0ZURvY3VtZW50UmVnaXN0cnkiLCJnZXRQcm9ncmFtIiwiRXJyb3IiLCJnZXRUeXBlQ2hlY2tlciIsImNyZWF0ZUNvbnRleHRGb3JEaXIiLCJkaXIiLCJqb2luIiwiY3JlYXRlQ29udGV4dEZvclBhdGgiLCJmaWxlUGF0aCIsImNyZWF0ZUNvbnRleHRGb3JTbmlwcGV0IiwiY29kZSIsImFwcFJvb3REaXIiLCJnZXQiLCJzb3VyY2VGaWxlIiwidHNVdGlscyIsImdldFNvdXJjZUZpbGVPclRocm93Il0sIm1hcHBpbmdzIjoiOzs7QUFBQSxnREFBQTtBQUNBLGlFQUFBO0FBQ0EscURBQStCLENBQy9CLHFEQUFBO0FBQ0Esd0RBQUE7QUFDQSxtREFBQTtBQUNBLG9FQUFBO0FBQ0EsdUNBQUE7QUFDQSx1Q0FBQTtBQUVBLFNBQVNBLGFBQVQsQ0FBdUJDLE9BQXZCLEVBQTRDQyxXQUE1QyxFQUF5RUMsZUFBekU7SUFDRSxPQUFPLElBQUlDLGlCQUFKLENBQ0xILE9BREssRUFFTEMsV0FGSyxFQUdMQyxlQUhLLEVBSUxFLG9CQUFVLENBQUNKLE9BQUQs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b3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0c1V0aWxzIH0gZnJvbSAnQG5lby1vbmUvdHMtdXRpbHMnO1xuaW1wb3J0ICogYXMgYXBwUm9vdERpciBmcm9tICdhcHAtcm9vdC1kaXInO1xuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMtZXh0cmEnO1xuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lIG1hdGNoLWRlZmF1bHQtZXhwb3J0LW5hbWVcbmltcG9ydCBnbG9iIGZyb20gJ2dsb2InO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB0cyBmcm9tICd0eXBlc2NyaXB0JztcbmltcG9ydCB7IENvbnRleHQgfSBmcm9tICcuL0NvbnRleHQnO1xuaW1wb3J0IHsgZ2V0R2xvYmFscywgZ2V0TGliQWxpYXNlcywgZ2V0TGlicyB9IGZyb20gJy4vc3ltYm9scyc7XG5cbmZ1bmN0aW9uIGNyZWF0ZUNvbnRleHQocHJvZ3JhbTogdHMuUHJvZ3JhbSwgdHlwZUNoZWNrZXI6IHRzLlR5cGVDaGVja2VyLCBsYW5ndWFnZVNlcnZpY2U6IHRzLkxhbmd1YWdlU2VydmljZSk6IENvbnRleHQge1xuICByZXR1cm4gbmV3IENvbnRleHQoXG4gICAgcHJvZ3JhbSxcbiAgICB0eXBlQ2hlY2tlcixcbiAgICBsYW5ndWFnZVNlcnZpY2UsXG4gICAgZ2V0R2xvYmFscyhwcm9ncmFtLCB0eXBlQ2hlY2tlciksXG4gICAgZ2V0TGlicyhwcm9ncmFtLCB0eXBlQ2hlY2tlciksXG4gICAgZ2V0TGliQWxpYXNlcyhwcm9ncmFtLCBsYW5ndWFnZVNlcnZpY2UpLFxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlQ29udGV4dChjb250ZXh0OiBDb250ZXh0LCBmaWxlczogeyByZWFkb25seSBbZmlsZU5hbWU6IHN0cmluZ106IHN0cmluZyB8IHVuZGVmaW5lZCB9KTogQ29udGV4dCB7XG4gIGNvbnN0IHsgcHJvZ3JhbSwgdHlwZUNoZWNrZXIsIGxhbmd1YWdlU2VydmljZSB9ID0gY3JlYXRlUHJvZ3JhbShcbiAgICBjb250ZXh0LnByb2dyYW0uZ2V0Q29tcGlsZXJPcHRpb25zKCksXG4gICAgT2JqZWN0LmtleXMoZmlsZXMpLFxuICAgIGNyZWF0ZU1vZGlmeUhvc3RGaWxlcyhmaWxlcyksXG4gICk7XG5cbiAgcmV0dXJuIGNvbnRleHQudXBkYXRlKFxuICAgIHByb2dyYW0sXG4gICAgdHlwZUNoZWNrZXIsXG4gICAgbGFuZ3VhZ2VTZXJ2aWNlLFxuICAgIGdldEdsb2JhbHMocHJvZ3JhbSwgdHlwZUNoZWNrZXIpLFxuICAgIGdldExpYnMocHJvZ3JhbSwgdHlwZUNoZWNrZXIpLFxuICAgIGdldExpYkFsaWFzZXMocHJvZ3JhbSwgbGFuZ3VhZ2VTZXJ2aWNlKSxcbiAgKTtcbn1cblxuY29uc3QgZG9HbG9iID0gYXN5bmMgKHZhbHVlOiBzdHJpbmcpID0+XG4gIG5ldyBQcm9taXNlPFJlYWRvbmx5QXJyYXk8c3RyaW5nPj4oKHJlc29sdmUsIHJlamVjdCkgPT5cbiAgICBnbG9iKHZhbHVlLCAoZXJyb3IsIG1hdGNoZXMpID0+IHtcbiAgICAgIGlmIChlcnJvcikge1xuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzb2x2ZShtYXRjaGVzKTtcbiAgICAgIH1cbiAgICB9KSxcbiAgKTtcblxuY29uc3QgbWFrZUNvbnRleHQgPSBhc3luYyAoXG4gIHJvb3ROYW1lczogUmVhZG9ubHlBcnJheTxzdHJpbmc+LFxuICBtb2RpZnlIb3N0OiAoaG9zdDogdHMuTGFuZ3VhZ2VTZXJ2aWNlSG9zdCkgPT4gdm9pZCA9ICgpID0+IHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH0sXG4pOiBQcm9taXNlPENvbnRleHQ+ID0+IHtcbiAgY29uc3QgdHNDb25maWdGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShcbiAgICByZXF1aXJlLnJlc29sdmUoJ0BuZW8tb25lL3NtYXJ0LWNvbnRyYWN0LWNvbXBpbGVyJyksXG4gICAgJy4uJyxcbiAgICAnLi4nLFxuICAgICd0c2NvbmZpZy5kZWZhdWx0Lmpzb24nLFxuICApO1xuXG4gIGNvbnN0IHJlcyA9IHRzLnJlYWRDb25maWdGaWxlKHRzQ29uZmlnRmlsZVBhdGgsICh2YWx1ZSkgPT4gZnMucmVhZEZpbGVTeW5jKHZhbHVlLCAndXRmOCcpKTtcbiAgY29uc3QgcGFyc2VDb25maWdIb3N0ID0ge1xuICAgIGZpbGVFeGlzdHM6IGZzLmV4aXN0c1N5bmMsXG4gICAgcmVhZERpcmVjdG9yeTogdHMuc3lzLnJlYWREaXJlY3RvcnksXG4gICAgcmVhZEZpbGU6IHRzLnN5cy5yZWFkRmlsZSxcbiAgICB1c2VDYXNlU2Vuc2l0aXZlRmlsZU5hbWVzOiB0cnVlLFxuICB9O1xuICBjb25zdCBwYXJzZWQgPSB0cy5wYXJzZUpzb25Db25maWdGaWxlQ29udGVudChyZXMuY29uZmlnLCBwYXJzZUNvbmZpZ0hvc3QsIHBhdGguZGlybmFtZSh0c0NvbmZpZ0ZpbGVQYXRoKSk7XG5cbiAgY29uc3QgeyBwcm9ncmFtLCB0eXBlQ2hlY2tlciwgbGFuZ3VhZ2VTZXJ2aWNlIH0gPSBjcmVhdGVQcm9ncmFtKHBhcnNlZC5vcHRpb25zLCByb290TmFtZXMsIG1vZGlmeUhvc3QpO1xuXG4gIHJldHVybiBjcmVhdGVDb250ZXh0KHByb2dyYW0sIHR5cGVDaGVja2VyLCBsYW5ndWFnZVNlcnZpY2UpO1xufTtcblxuY29uc3QgY3JlYXRlTW9kaWZ5SG9zdEZpbGVzID0gKGZpbGVzOiB7IHJlYWRvbmx5IFtmaWxlTmFtZTogc3RyaW5nXTogc3RyaW5nIHwgdW5kZWZpbmVkIH0pID0+IChcbiAgaG9zdDogdHMuTGFuZ3VhZ2VTZXJ2aWNlSG9zdCxcbikgPT4ge1xuICBjb25zdCBvcmlnaW5hbEZpbGVFeGlzdHMgPSBob3N0LmZpbGVFeGlzdHMgPT09IHVuZGVmaW5lZCA/IHRzLnN5cy5maWxlRXhpc3RzIDogaG9zdC5maWxlRXhpc3RzLmJpbmQoaG9zdCk7XG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZSBuby1vYmplY3QtbXV0YXRpb24gbm8tYW55XG4gIGhvc3QuZmlsZUV4aXN0cyA9IChmaWxlKSA9PiB7XG4gICAgaWYgKGZpbGVzW2ZpbGVdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBvcmlnaW5hbEZpbGVFeGlzdHMoZmlsZSk7XG4gIH07XG5cbiAgY29uc3Qgb3JpZ2luYWxSZWFkRmlsZSA9IGhvc3QucmVhZEZpbGUgPT09IHVuZGVmaW5lZCA/IHRzLnN5cy5yZWFkRmlsZSA6IGhvc3QucmVhZEZpbGUuYmluZChob3N0KTtcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lIG5vLW9iamVjdC1tdXRhdGlvbiBuby1hbnlcbiAgaG9zdC5yZWFkRmlsZSA9IChmaWxlLCAuLi5hcmdzOiBhbnlbXSkgPT4ge1xuICAgIGNvbnN0IGZvdW5kRmlsZSA9IGZpbGVzW2ZpbGVdO1xuICAgIGlmIChmb3VuZEZpbGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGZvdW5kRmlsZTtcbiAgICB9XG5cbiAgICByZXR1cm4gb3JpZ2luYWxSZWFkRmlsZShmaWxlLCAuLi5hcmdzKTtcbiAgfTtcbn07XG5cbmNvbnN0IGNyZWF0ZVByb2dyYW0gPSAoXG4gIG9wdGlvbnM6IHRzLkNvbXBpbGVyT3B0aW9ucyxcbiAgcm9vdE5hbWVzSW46IFJlYWRvbmx5QXJyYXk8c3RyaW5nPixcbiAgbW9kaWZ5SG9zdDogKGhvc3Q6IHRzLkxhbmd1YWdlU2VydmljZUhvc3QpID0+IHZvaWQgPSAoKSA9PiB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9LFxuKSA9PiB7XG4gIGNvbnN0IHNtYXJ0Q29udHJhY3REaXIgPSBwYXRoLmRpcm5hbWUocmVxdWlyZS5yZXNvbHZlKCdAbmVvLW9uZS9zbWFydC1jb250cmFjdCcpKTtcbiAgY29uc3Qgc21hcnRDb250cmFjdE1vZHVsZSA9IHBhdGgucmVzb2x2ZShzbWFydENvbnRyYWN0RGlyLCAnaW5kZXgudHMnKTtcbiAgY29uc3Qgc21hcnRDb250cmFjdEZpbGVzID0gW1xuICAgIHBhdGgucmVzb2x2ZShzbWFydENvbnRyYWN0RGlyLCAnaW5kZXguZC50cycpLFxuICAgIHNtYXJ0Q29udHJhY3RNb2R1bGUsXG4gICAgcGF0aC5yZXNvbHZlKHNtYXJ0Q29udHJhY3REaXIsICdsaWIudHMnKSxcbiAgXTtcblxuICBjb25zdCByb290TmFtZXMgPSBbXG4gICAgLi4ubmV3IFNldChyb290TmFtZXNJbi5jb25jYXQoc21hcnRDb250cmFjdEZpbGVzKS5jb25jYXQocmVxdWlyZS5yZXNvbHZlKCdAdHlwZXMvbm9kZS9pbmRleC5kLnRzJykpKSxcbiAgXTtcblxuICBjb25zdCBtdXRhYmxlRmlsZXM6IHRzLk1hcExpa2U8eyB2ZXJzaW9uOiBudW1iZXIgfSB8IHVuZGVmaW5lZD4gPSB7fTtcbiAgLy8gaW5pdGlhbGl6ZSB0aGUgbGlzdCBvZiBmaWxlc1xuICByb290TmFtZXMuZm9yRWFjaCgoZmlsZU5hbWUpID0+IHtcbiAgICBtdXRhYmxlRmlsZXNbZmlsZU5hbWVdID0geyB2ZXJzaW9uOiAwIH07XG4gIH0pO1xuICBjb25zdCBzZXJ2aWNlc0hvc3Q6IHRzLkxhbmd1YWdlU2VydmljZUhvc3QgPSB7XG4gICAgZ2V0U2NyaXB0RmlsZU5hbWVzOiAoKSA9PiBbLi4ucm9vdE5hbWVzXSxcbiAgICBnZXRTY3JpcHRWZXJzaW9uOiAoZmlsZU5hbWUpID0+IHtcbiAgICAgIGNvbnN0IGZpbGUgPSBtdXRhYmxlRmlsZXNbZmlsZU5hbWVdO1xuXG4gICAgICByZXR1cm4gZmlsZSA9PT0gdW5kZWZpbmVkID8gJycgOiBmaWxlLnZlcnNpb24udG9TdHJpbmcoKTtcbiAgICB9LFxuICAgIGdldFNjcmlwdFNuYXBzaG90OiAoZmlsZU5hbWUpID0+IHtcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZSBuby1ub24tbnVsbC1hc3NlcnRpb25cbiAgICAgIGlmICghc2VydmljZXNIb3N0LmZpbGVFeGlzdHMhKGZpbGVOYW1lKSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmUgbm8tbm9uLW51bGwtYXNzZXJ0aW9uXG4gICAgICByZXR1cm4gdHMuU2NyaXB0U25hcHNob3QuZnJvbVN0cmluZyhzZXJ2aWNlc0hvc3QucmVhZEZpbGUhKGZpbGVOYW1lKSEpO1xuICAgIH0sXG4gICAgZ2V0Q3VycmVudERpcmVjdG9yeTogKCkgPT4gcHJvY2Vzcy5jd2QoKSxcbiAgICBnZXRDb21waWxhdGlvblNldHRpbmdzOiAoKSA9PiBvcHRpb25zLFxuICAgIGdldERlZmF1bHRMaWJGaWxlTmFtZTogKG9wdHMpID0+IHRzLmdldERlZmF1bHRMaWJGaWxlUGF0aChvcHRzKSxcbiAgICBmaWxlRXhpc3RzOiB0cy5zeXMuZmlsZUV4aXN0cyxcbiAgICByZWFkRmlsZTogdHMuc3lzLnJlYWRGaWxlLFxuICAgIHJlYWREaXJlY3Rvcnk6IHRzLnN5cy5yZWFkRGlyZWN0b3J5LFxuICAgIHJlc29sdmVNb2R1bGVOYW1lcyxcbiAgfTtcblxuICBjb25zdCBzbWFydENvbnRyYWN0TGliTW9kdWxlID0gcGF0aC5yZXNvbHZlKHBhdGguZGlybmFtZShyZXF1aXJlLnJlc29sdmUoJ0BuZW8tb25lL3NtYXJ0LWNvbnRyYWN0LWxpYicpKSwgJ2luZGV4LnRzJyk7XG4gIGZ1bmN0aW9uIHJlc29sdmVNb2R1bGVOYW1lcyhtb2R1bGVOYW1lczogc3RyaW5nW10sIGNvbnRhaW5pbmdGaWxlOiBzdHJpbmcpOiB0cy5SZXNvbHZlZE1vZHVsZVtdIHtcbiAgICBjb25zdCBtdXRhYmxlUmVzb2x2ZWRNb2R1bGVzOiB0cy5SZXNvbHZlZE1vZHVsZVtdID0gW107XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lIG5vLWxvb3Atc3RhdGVtZW50XG4gICAgZm9yIChjb25zdCBtb2R1bGVOYW1lIG9mIG1vZHVsZU5hbWVzKSB7XG4gICAgICBpZiAobW9kdWxlTmFtZSA9PT0gJ0BuZW8tb25lL3NtYXJ0LWNvbnRyYWN0Jykge1xuICAgICAgICBtdXRhYmxlUmVzb2x2ZWRNb2R1bGVzLnB1c2goeyByZXNvbHZlZEZpbGVOYW1lOiBzbWFydENvbnRyYWN0TW9kdWxlIH0pO1xuICAgICAgfSBlbHNlIGlmIChtb2R1bGVOYW1lID09PSAnQG5lby1vbmUvc21hcnQtY29udHJhY3QtbGliJykge1xuICAgICAgICBtdXRhYmxlUmVzb2x2ZWRNb2R1bGVzLnB1c2goeyByZXNvbHZlZEZpbGVOYW1lOiBzbWFydENvbnRyYWN0TGliTW9kdWxlIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdHMucmVzb2x2ZU1vZHVsZU5hbWUobW9kdWxlTmFtZSwgY29udGFpbmluZ0ZpbGUsIG9wdGlvbnMsIHtcbiAgICAgICAgICBmaWxlRXhpc3RzOiB0cy5zeXMuZmlsZUV4aXN0cyxcbiAgICAgICAgICByZWFkRmlsZTogdHMuc3lzLnJlYWRGaWxlLFxuICAgICAgICB9KTtcbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lIG5vLW5vbi1udWxsLWFzc2VydGlvblxuICAgICAgICBtdXRhYmxlUmVzb2x2ZWRNb2R1bGVzLnB1c2gocmVzdWx0LnJlc29sdmVkTW9kdWxlISk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG11dGFibGVSZXNvbHZlZE1vZHVsZXM7XG4gIH1cblxuICBtb2RpZnlIb3N0KHNlcnZpY2VzSG9zdCk7XG5cbiAgY29uc3QgbGFuZ3VhZ2VTZXJ2aWNlID0gdHMuY3JlYXRlTGFuZ3VhZ2VTZXJ2aWNlKHNlcnZpY2VzSG9zdCwgdHMuY3JlYXRlRG9jdW1lbnRSZWdpc3RyeSgpKTtcbiAgY29uc3QgcHJvZ3JhbSA9IGxhbmd1YWdlU2VydmljZS5nZXRQcm9ncmFtKCk7XG4gIGlmIChwcm9ncmFtID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1NvbWV0aGluZyB3ZW50IHdyb25nJyk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHByb2dyYW0sXG4gICAgdHlwZUNoZWNrZXI6IHByb2dyYW0uZ2V0VHlwZUNoZWNrZXIoKSxcbiAgICBsYW5ndWFnZVNlcnZpY2UsXG4gIH07XG59O1xuXG5leHBvcnQgY29uc3QgY3JlYXRlQ29udGV4dEZvckRpciA9IGFzeW5jIChkaXI6IHN0cmluZyk6IFByb21pc2U8Q29udGV4dD4gPT4ge1xuICBjb25zdCBmaWxlcyA9IGF3YWl0IGRvR2xvYihwYXRoLmpvaW4oZGlyLCAnKionLCAnKi50cycpKTtcblxuICByZXR1cm4gbWFrZUNvbnRleHQoZmlsZXMpO1xufTtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZUNvbnRleHRGb3JQYXRoID0gYXN5bmMgKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPENvbnRleHQ+ID0+IG1ha2VDb250ZXh0KFtmaWxlUGF0aF0pO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNuaXBwZXRSZXN1bHQge1xuICByZWFkb25seSBjb250ZXh0OiBDb250ZXh0O1xuICByZWFkb25seSBzb3VyY2VGaWxlOiB0cy5Tb3VyY2VGaWxlO1xufVxuXG5leHBvcnQgY29uc3QgY3JlYXRlQ29udGV4dEZvclNuaXBwZXQgPSBhc3luYyAoY29kZTogc3RyaW5nKTogUHJvbWlzZTxTbmlwcGV0UmVzdWx0PiA9PiB7XG4gIGNvbnN0IGRpciA9IGFwcFJvb3REaXIuZ2V0KCk7XG4gIGNvbnN0IGZpbGVOYW1lID0gcGF0aC5yZXNvbHZlKGRpciwgJ3NuaXBwZXRDb2RlLnRzJyk7XG5cbiAgY29uc3QgY29udGV4dCA9IGF3YWl0IG1ha2VDb250ZXh0KFtmaWxlTmFtZV0sIGNyZWF0ZU1vZGlmeUhvc3RGaWxlcyh7IFtmaWxlTmFtZV06IGNvZGUgfSkpO1xuICBjb25zdCBzb3VyY2VGaWxlID0gdHNVdGlscy5maWxlLmdldFNvdXJjZUZpbGVPclRocm93KGNvbnRleHQucHJvZ3JhbSwgZmlsZU5hbWUpO1xuXG4gIHJldHVybiB7XG4gICAgY29udGV4dCxcbiAgICBzb3VyY2VGaWxlLFxuICB9O1xufTtcbiJdfQ==