1 | ;
|
2 | // tslint:disable:no-unsafe-any
|
3 | Object.defineProperty(exports, "__esModule", { value: true });
|
4 | const path = require("path");
|
5 | const typescript_1 = require("typescript");
|
6 | const error_models_1 = require("../error-models");
|
7 | const utils_1 = require("../utils");
|
8 | const check_path_up_1 = require("./check-path-up");
|
9 | const get_ecma_version_from_script_target_1 = require("./get-ecma-version-from-script-target");
|
10 | const get_node_resolve_fields_from_script_target_1 = require("./get-node-resolve-fields-from-script-target");
|
11 | const load_ts_config_1 = require("./load-ts-config");
|
12 | // tslint:disable:max-func-body-length
|
13 | function initLibBundleTarget(bundles, currentBundle, i, libConfig) {
|
14 | if (!libConfig._workspaceRoot) {
|
15 | throw new error_models_1.InternalError("The 'libConfig._workspaceRoot' is not set.");
|
16 | }
|
17 | if (!libConfig._projectRoot) {
|
18 | throw new error_models_1.InternalError("The 'libConfig._projectRoot' is not set.");
|
19 | }
|
20 | if (!libConfig._outputPath) {
|
21 | throw new error_models_1.InternalError("The 'libConfig._outputPath' is not set.");
|
22 | }
|
23 | if (!currentBundle.libraryTarget) {
|
24 | throw new error_models_1.InvalidConfigError(`The 'projects[${libConfig.name || libConfig._index}].bundles[${i}].libraryTarget' value is required.`);
|
25 | }
|
26 | const projectRoot = libConfig._projectRoot;
|
27 | const outputPath = libConfig._outputPath;
|
28 | // externals
|
29 | if (currentBundle.externals == null && libConfig.externals) {
|
30 | currentBundle.externals = JSON.parse(JSON.stringify(libConfig.externals));
|
31 | }
|
32 | // nodeModulesAsExternals
|
33 | if (currentBundle.nodeModulesAsExternals == null &&
|
34 | libConfig.nodeModulesAsExternals != null) {
|
35 | currentBundle.nodeModulesAsExternals = libConfig.nodeModulesAsExternals;
|
36 | }
|
37 | // includeDefaultAngularAndRxJsGlobals
|
38 | if (currentBundle.includeDefaultAngularAndRxJsGlobals == null &&
|
39 | libConfig.includeDefaultAngularAndRxJsGlobals != null) {
|
40 | currentBundle.includeDefaultAngularAndRxJsGlobals = libConfig.includeDefaultAngularAndRxJsGlobals;
|
41 | }
|
42 | if (currentBundle.entryRoot && currentBundle.entryRoot === 'prevBundleOutDir') {
|
43 | let foundBundleTarget;
|
44 | if (i > 0) {
|
45 | foundBundleTarget = bundles[i - 1];
|
46 | }
|
47 | if (!foundBundleTarget) {
|
48 | throw new error_models_1.InvalidConfigError(`No previous bundle target found, please correct value in 'projects[${libConfig.name ||
|
49 | libConfig._index}].bundles[${i}].entryRoot'.`);
|
50 | }
|
51 | currentBundle._entryFilePath = foundBundleTarget._outputFilePath;
|
52 | currentBundle._sourceScriptTarget = foundBundleTarget._destScriptTarget;
|
53 | currentBundle._destScriptTarget = foundBundleTarget._destScriptTarget;
|
54 | }
|
55 | else if (currentBundle.entryRoot && currentBundle.entryRoot === 'tsTranspilationOutDir') {
|
56 | if (!libConfig._tsTranspilations || !libConfig._tsTranspilations.length) {
|
57 | throw new error_models_1.InvalidConfigError(`To use 'tsTranspilationOutDir', the 'projects[${libConfig.name || libConfig._index}].tsTranspilations' option is required.`);
|
58 | }
|
59 | let foundTsTranspilation;
|
60 | if (currentBundle.tsTranspilationIndex == null) {
|
61 | foundTsTranspilation = libConfig._tsTranspilations[0];
|
62 | }
|
63 | else {
|
64 | if (currentBundle.tsTranspilationIndex > libConfig._tsTranspilations.length - 1) {
|
65 | throw new error_models_1.InvalidConfigError(`No _tsTranspilations found, please correct value in 'projects[${libConfig.name ||
|
66 | libConfig._index}].bundles[${i}].tsTranspilationIndex'.`);
|
67 | }
|
68 | foundTsTranspilation = libConfig._tsTranspilations[currentBundle.tsTranspilationIndex];
|
69 | }
|
70 | const entryRootDir = foundTsTranspilation._tsOutDirRootResolved;
|
71 | let entryFile = currentBundle.entry;
|
72 | if (!entryFile && foundTsTranspilation._detectedEntryName) {
|
73 | entryFile = `${foundTsTranspilation._detectedEntryName}.js`;
|
74 | }
|
75 | if (!entryFile) {
|
76 | throw new error_models_1.InvalidConfigError(`The 'projects[${libConfig.name || libConfig._index}].bundles[${i}].entry' value is required.`);
|
77 | }
|
78 | currentBundle._entryFilePath = path.resolve(entryRootDir, entryFile);
|
79 | currentBundle._sourceScriptTarget = foundTsTranspilation._scriptTarget;
|
80 | currentBundle._destScriptTarget = foundTsTranspilation._scriptTarget;
|
81 | }
|
82 | else if (currentBundle.entryRoot && currentBundle.entryRoot === 'outputPath') {
|
83 | if (!currentBundle.entry) {
|
84 | throw new error_models_1.InvalidConfigError(`The 'projects[${libConfig.name || libConfig._index}].bundles[${i}].entry' value is required.`);
|
85 | }
|
86 | const entryFilePath = path.resolve(outputPath, currentBundle.entry);
|
87 | currentBundle._entryFilePath = entryFilePath;
|
88 | if (/\.f?esm?2018\.js$/i.test(entryFilePath) ||
|
89 | check_path_up_1.checkPathUp(/f?esm?2018$/i, path.dirname(entryFilePath), outputPath)) {
|
90 | currentBundle._sourceScriptTarget = typescript_1.ScriptTarget.ES2018;
|
91 | }
|
92 | else if (/\.f?esm?2017\.js$/i.test(entryFilePath) ||
|
93 | check_path_up_1.checkPathUp(/f?esm?2017$/i, path.dirname(entryFilePath), outputPath)) {
|
94 | currentBundle._sourceScriptTarget = typescript_1.ScriptTarget.ES2017;
|
95 | }
|
96 | else if (/\.f?esm?2016\.js$/i.test(entryFilePath) ||
|
97 | check_path_up_1.checkPathUp(/f?esm?2016$/i, path.dirname(entryFilePath), outputPath)) {
|
98 | currentBundle._sourceScriptTarget = typescript_1.ScriptTarget.ES2016;
|
99 | }
|
100 | else if (/\.f?esm?2015\.js$/i.test(entryFilePath) ||
|
101 | check_path_up_1.checkPathUp(/f?esm?2015$/i, path.dirname(entryFilePath), outputPath)) {
|
102 | currentBundle._sourceScriptTarget = typescript_1.ScriptTarget.ES2015;
|
103 | }
|
104 | else if (/\.f?esm?5\.js$/i.test(entryFilePath) ||
|
105 | check_path_up_1.checkPathUp(/f?esm?5$/i, path.dirname(entryFilePath), outputPath)) {
|
106 | currentBundle._sourceScriptTarget = typescript_1.ScriptTarget.ES5;
|
107 | }
|
108 | currentBundle._destScriptTarget = currentBundle._sourceScriptTarget;
|
109 | }
|
110 | else {
|
111 | if (!currentBundle.entry) {
|
112 | throw new error_models_1.InvalidConfigError(`The 'projects[${libConfig.name || libConfig._index}].bundles[${i}].entry' value is required.`);
|
113 | }
|
114 | currentBundle._entryFilePath = path.resolve(projectRoot, currentBundle.entry);
|
115 | if (/\.ts$/i.test(currentBundle.entry)) {
|
116 | if (currentBundle.tsConfig) {
|
117 | currentBundle._tsConfigPath = path.resolve(projectRoot, currentBundle.tsConfig);
|
118 | }
|
119 | else if (libConfig._tsConfigPath) {
|
120 | currentBundle._tsConfigPath = libConfig._tsConfigPath;
|
121 | currentBundle._tsConfigJson = libConfig._tsConfigJson;
|
122 | currentBundle._tsCompilerConfig = libConfig._tsCompilerConfig;
|
123 | }
|
124 | }
|
125 | }
|
126 | let nodeResolveFields = [];
|
127 | if (currentBundle._tsConfigPath) {
|
128 | load_ts_config_1.loadTsConfig(currentBundle._tsConfigPath, currentBundle, libConfig);
|
129 | if (!currentBundle._tsCompilerConfig) {
|
130 | throw new error_models_1.InternalError("The 'currentBundle._tsCompilerConfig' is not set.");
|
131 | }
|
132 | if (!currentBundle._sourceScriptTarget) {
|
133 | currentBundle._sourceScriptTarget = currentBundle._tsCompilerConfig.options.target;
|
134 | }
|
135 | if (!currentBundle._destScriptTarget) {
|
136 | currentBundle._destScriptTarget = currentBundle._tsCompilerConfig.options.target;
|
137 | }
|
138 | }
|
139 | if (currentBundle._destScriptTarget) {
|
140 | const scriptTarget = currentBundle._destScriptTarget;
|
141 | // ecmaVersion
|
142 | const ecmaVersion = get_ecma_version_from_script_target_1.getEcmaVersionFromScriptTarget(scriptTarget);
|
143 | if (ecmaVersion) {
|
144 | currentBundle._ecmaVersion = ecmaVersion;
|
145 | }
|
146 | // supportES2015
|
147 | currentBundle._supportES2015 = scriptTarget !== typescript_1.ScriptTarget.ES3 &&
|
148 | scriptTarget !== typescript_1.ScriptTarget.ES5;
|
149 | // nodeResolveFields
|
150 | nodeResolveFields = get_node_resolve_fields_from_script_target_1.getnodeResolveFieldsFromScriptTarget(scriptTarget);
|
151 | }
|
152 | // nodeResolveFields
|
153 | const defaultMainFields = ['module', 'main'];
|
154 | nodeResolveFields.push(...defaultMainFields);
|
155 | currentBundle._nodeResolveFields = nodeResolveFields;
|
156 | // outputFilePath
|
157 | let bundleOutFilePath = '';
|
158 | if (currentBundle.outputFilePath) {
|
159 | bundleOutFilePath = currentBundle.outputFilePath;
|
160 | const isDir = /(\\|\/)$/.test(bundleOutFilePath) ||
|
161 | !/\.js$/i.test(bundleOutFilePath);
|
162 | bundleOutFilePath = path.resolve(outputPath, bundleOutFilePath);
|
163 | if (isDir) {
|
164 | if (!libConfig._packageNameWithoutScope) {
|
165 | throw new error_models_1.InternalError("The 'libConfig._packageNameWithoutScope' is not set.");
|
166 | }
|
167 | const outFileName = libConfig._packageNameWithoutScope.replace(/\//gm, '-');
|
168 | bundleOutFilePath = path.resolve(bundleOutFilePath, `${outFileName}.js`);
|
169 | }
|
170 | }
|
171 | else {
|
172 | if (!libConfig._packageNameWithoutScope) {
|
173 | throw new error_models_1.InternalError("The 'libConfig._packageNameWithoutScope' is not set.");
|
174 | }
|
175 | const outFileName = libConfig._packageNameWithoutScope.replace(/\//gm, '-');
|
176 | if (currentBundle.libraryTarget === 'umd' || currentBundle.libraryTarget === 'cjs') {
|
177 | if (bundles.length > 1 || (libConfig._tsTranspilations && libConfig._tsTranspilations.length > 0)) {
|
178 | bundleOutFilePath = path.resolve(outputPath, `bundles/${outFileName}.${currentBundle.libraryTarget}.js`);
|
179 | }
|
180 | else {
|
181 | bundleOutFilePath = path.resolve(outputPath, `${outFileName}.js`);
|
182 | }
|
183 | }
|
184 | else {
|
185 | if (currentBundle._destScriptTarget) {
|
186 | const scriptTargetStr = typescript_1.ScriptTarget[currentBundle._destScriptTarget].replace(/^ES/i, '');
|
187 | const fesmFolderName = `fesm${scriptTargetStr}`;
|
188 | bundleOutFilePath = path.resolve(outputPath, fesmFolderName, `${outFileName}.js`);
|
189 | }
|
190 | else {
|
191 | bundleOutFilePath = path.resolve(outputPath, `bundles/${outFileName}.es.js`);
|
192 | }
|
193 | }
|
194 | }
|
195 | if (currentBundle._entryFilePath && /\[name\]/g.test(bundleOutFilePath)) {
|
196 | bundleOutFilePath = bundleOutFilePath.replace(/\[name\]/g, path.basename(currentBundle._entryFilePath).replace(/\.(js|ts)$/i, ''));
|
197 | }
|
198 | // package entry points
|
199 | if (libConfig._packageJsonOutDir) {
|
200 | libConfig._packageEntryPoints = libConfig._packageEntryPoints || {};
|
201 | const packageEntryPoints = libConfig._packageEntryPoints;
|
202 | const packageJsonOutDir = libConfig._packageJsonOutDir;
|
203 | const scriptTarget = currentBundle._destScriptTarget;
|
204 | if (currentBundle.libraryTarget === 'esm' && scriptTarget === typescript_1.ScriptTarget.ES2015) {
|
205 | packageEntryPoints.fesm2015 = utils_1.normalizeRelativePath(path.relative(packageJsonOutDir, bundleOutFilePath));
|
206 | }
|
207 | else if (currentBundle.libraryTarget === 'esm' && scriptTarget === typescript_1.ScriptTarget.ES5) {
|
208 | packageEntryPoints.fesm5 = utils_1.normalizeRelativePath(path.relative(packageJsonOutDir, bundleOutFilePath));
|
209 | }
|
210 | else if (currentBundle.libraryTarget === 'umd' || currentBundle.libraryTarget === 'cjs') {
|
211 | packageEntryPoints.main = utils_1.normalizeRelativePath(path.relative(packageJsonOutDir, bundleOutFilePath));
|
212 | }
|
213 | }
|
214 | return Object.assign({}, currentBundle, { _index: i, _entryFilePath: currentBundle._entryFilePath, _outputFilePath: bundleOutFilePath });
|
215 | }
|
216 | exports.initLibBundleTarget = initLibBundleTarget;
|
217 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5pdC1saWItYnVuZGxlLXRhcmdldC5qcyIsInNvdXJjZVJvb3QiOiJDOi9wcm9qZWN0cy9hbmd1bGFyLWJ1aWxkLyIsInNvdXJjZXMiOlsic3JjL2hlbHBlcnMvaW5pdC1saWItYnVuZGxlLXRhcmdldC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsK0JBQStCOztBQUUvQiw2QkFBNkI7QUFFN0IsMkNBQTBDO0FBRTFDLGtEQUFvRTtBQUVwRSxvQ0FBaUQ7QUFFakQsbURBQThDO0FBQzlDLCtGQUF1RjtBQUN2Riw2R0FBb0c7QUFDcEcscURBQWdEO0FBRWhELHNDQUFzQztBQUN0Qyw2QkFBb0MsT0FBbUMsRUFDbkUsYUFBZ0QsRUFDaEQsQ0FBUyxFQUNULFNBQW1DO0lBRW5DLElBQUksQ0FBQyxTQUFTLENBQUMsY0FBYyxFQUFFO1FBQzNCLE1BQU0sSUFBSSw0QkFBYSxDQUFDLDRDQUE0QyxDQUFDLENBQUM7S0FDekU7SUFFRCxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksRUFBRTtRQUN6QixNQUFNLElBQUksNEJBQWEsQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO0tBQ3ZFO0lBRUQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQUU7UUFDeEIsTUFBTSxJQUFJLDRCQUFhLENBQUMseUNBQXlDLENBQUMsQ0FBQztLQUN0RTtJQUVELElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxFQUFFO1FBQzlCLE1BQU0sSUFBSSxpQ0FBa0IsQ0FDeEIsaUJBQWlCLFNBQVMsQ0FBQyxJQUFJLElBQUksU0FBUyxDQUFDLE1BQU0sYUFBYSxDQUNoRSxxQ0FBcUMsQ0FBQyxDQUFDO0tBQzlDO0lBRUQsTUFBTSxXQUFXLEdBQUcsU0FBUyxDQUFDLFlBQVksQ0FBQztJQUMzQyxNQUFNLFVBQVUsR0FBRyxTQUFTLENBQUMsV0FBVyxDQUFDO0lBRXpDLFlBQVk7SUFDWixJQUFJLGFBQWEsQ0FBQyxTQUFTLElBQUksSUFBSSxJQUFJLFNBQVMsQ0FBQyxTQUFTLEVBQUU7UUFD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LEVBQUUsQ0FBQyxFQUNULGNBQWMsRUFBRSxhQUFhLENBQUMsY0FBYyxFQUM1QyxlQUFlLEVBQUUsaUJBQWlCLElBQ3BDO0FBQ04sQ0FBQztBQWpRRCxrREFpUUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyB0c2xpbnQ6ZGlzYWJsZTpuby11bnNhZmUtYW55XG5cbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5cbmltcG9ydCB7IFNjcmlwdFRhcmdldCB9IGZyb20gJ3R5cGVzY3JpcHQnO1xuXG5pbXBvcnQgeyBJbnRlcm5hbEVycm9yLCBJbnZhbGlkQ29uZmlnRXJyb3IgfSBmcm9tICcuLi9lcnJvci1tb2RlbHMnO1xuaW1wb3J0IHsgTGliQnVuZGxlT3B0aW9uc0ludGVybmFsLCBMaWJQcm9qZWN0Q29uZmlnSW50ZXJuYWwsIFRzVHJhbnNwaWxhdGlvbk9wdGlvbnNJbnRlcm5hbCB9IGZyb20gJy4uL2ludGVyZmFjZXMvaW50ZXJuYWxzJztcbmltcG9ydCB7IG5vcm1hbGl6ZVJlbGF0aXZlUGF0aCB9IGZyb20gJy4uL3V0aWxzJztcblxuaW1wb3J0IHsgY2hlY2tQYXRoVXAgfSBmcm9tICcuL2NoZWNrLXBhdGgtdXAnO1xuaW1wb3J0IHsgZ2V0RWNtYVZlcnNpb25Gcm9tU2NyaXB0VGFyZ2V0IH0gZnJvbSAnLi9nZXQtZWNtYS12ZXJzaW9uLWZyb20tc2NyaXB0LXRhcmdldCc7XG5pbXBvcnQgeyBnZXRub2RlUmVzb2x2ZUZpZWxkc0Zyb21TY3JpcHRUYXJnZXQgfSBmcm9tICcuL2dldC1ub2RlLXJlc29sdmUtZmllbGRzLWZyb20tc2NyaXB0LXRhcmdldCc7XG5pbXBvcnQgeyBsb2FkVHNDb25maWcgfSBmcm9tICcuL2xvYWQtdHMtY29uZmlnJztcblxuLy8gdHNsaW50OmRpc2FibGU6bWF4LWZ1bmMtYm9keS1sZW5ndGhcbmV4cG9ydCBmdW5jdGlvbiBpbml0TGliQnVuZGxlVGFyZ2V0KGJ1bmRsZXM6IExpYkJ1bmRsZU9wdGlvbnNJbnRlcm5hbFtdLFxuICAgIGN1cnJlbnRCdW5kbGU6IFBhcnRpYWw8TGliQnVuZGxlT3B0aW9uc0ludGVybmFsPixcbiAgICBpOiBudW1iZXIsXG4gICAgbGliQ29uZmlnOiBMaWJQcm9qZWN0Q29uZmlnSW50ZXJuYWwpOiBMaWJCdW5kbGVPcHRpb25zSW50ZXJuYWwge1xuXG4gICAgaWYgKCFsaWJDb25maWcuX3dvcmtzcGFjZVJvb3QpIHtcbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJUaGUgJ2xpYkNvbmZpZy5fd29ya3NwYWNlUm9vdCcgaXMgbm90IHNldC5cIik7XG4gICAgfVxuXG4gICAgaWYgKCFsaWJDb25maWcuX3Byb2plY3RSb290KSB7XG4gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiVGhlICdsaWJDb25maWcuX3Byb2plY3RSb290JyBpcyBub3Qgc2V0LlwiKTtcbiAgICB9XG5cbiAgICBpZiAoIWxpYkNvbmZpZy5fb3V0cHV0UGF0aCkge1xuICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIlRoZSAnbGliQ29uZmlnLl9vdXRwdXRQYXRoJyBpcyBub3Qgc2V0LlwiKTtcbiAgICB9XG5cbiAgICBpZiAoIWN1cnJlbnRCdW5kbGUubGlicmFyeVRhcmdldCkge1xuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZENvbmZpZ0Vycm9yKFxuICAgICAgICAgICAgYFRoZSAncHJvamVjdHNbJHtsaWJDb25maWcubmFtZSB8fCBsaWJDb25maWcuX2luZGV4fV0uYnVuZGxlc1ske2lcbiAgICAgICAgICAgIH1dLmxpYnJhcnlUYXJnZXQnIHZhbHVlIGlzIHJlcXVpcmVkLmApO1xuICAgIH1cblxuICAgIGNvbnN0IHByb2plY3RSb290ID0gbGliQ29uZmlnLl9wcm9qZWN0Um9vdDtcbiAgICBjb25zdCBvdXRwdXRQYXRoID0gbGliQ29uZmlnLl9vdXRwdXRQYXRoO1xuXG4gICAgLy8gZXh0ZXJuYWxzXG4gICAgaWYgKGN1cnJlbnRCdW5kbGUuZXh0ZXJuYWxzID09IG51bGwgJiYgbGliQ29uZmlnLmV4dGVybmFscykge1xuICAgICAgICBjdXJyZW50QnVuZGxlLmV4dGVybmFscyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobGliQ29uZmlnLmV4dGVybmFscykpO1xuICAgIH1cblxuICAgIC8vIG5vZGVNb2R1bGVzQXNFeHRlcm5hbHNcbiAgICBpZiAoY3VycmVudEJ1bmRsZS5ub2RlTW9kdWxlc0FzRXh0ZXJuYWxzID09IG51bGwgJiZcbiAgICAgICAgbGliQ29uZmlnLm5vZGVNb2R1bGVzQXNFeHRlcm5hbHMgIT0gbnVsbCkge1xuICAgICAgICBjdXJyZW50QnVuZGxlLm5vZGVNb2R1bGVzQXNFeHRlcm5hbHMgPSBsaWJDb25maWcubm9kZU1vZHVsZXNBc0V4dGVybmFscztcbiAgICB9XG5cbiAgICAvLyBpbmNsdWRlRGVmYXVsdEFuZ3VsYXJBbmRSeEpzR2xvYmFsc1xuICAgIGlmIChjdXJyZW50QnVuZGxlLmluY2x1ZGVEZWZhdWx0QW5ndWxhckFuZFJ4SnNHbG9iYWxzID09IG51bGwgJiZcbiAgICAgICAgbGliQ29uZmlnLmluY2x1ZGVEZWZhdWx0QW5ndWxhckFuZFJ4SnNHbG9iYWxzICE9IG51bGwpIHtcbiAgICAgICAgY3VycmVudEJ1bmRsZS5pbmNsdWRlRGVmYXVsdEFuZ3VsYXJBbmRSeEpzR2xvYmFscyA9IGxpYkNvbmZpZy5pbmNsdWRlRGVmYXVsdEFuZ3VsYXJBbmRSeEpzR2xvYmFscztcbiAgICB9XG5cbiAgICBpZiAoY3VycmVudEJ1bmRsZS5lbnRyeVJvb3QgJiYgY3VycmVudEJ1bmRsZS5lbnRyeVJvb3QgPT09ICdwcmV2QnVuZGxlT3V0RGlyJykge1xuICAgICAgICBsZXQgZm91bmRCdW5kbGVUYXJnZXQ6IExpYkJ1bmRsZU9wdGlvbnNJbnRlcm5hbCB8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKGkgPiAwKSB7XG4gICAgICAgICAgICBmb3VuZEJ1bmRsZVRhcmdldCA9IGJ1bmRsZXNbaSAtIDFdO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZm91bmRCdW5kbGVUYXJnZXQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkQ29uZmlnRXJyb3IoXG4gICAgICAgICAgICAgICAgYE5vIHByZXZpb3VzIGJ1bmRsZSB0YXJnZXQgZm91bmQsIHBsZWFzZSBjb3JyZWN0IHZhbHVlIGluICdwcm9qZWN0c1ske2xpYkNvbmZpZy5uYW1lIHx8XG4gICAgICAgICAgICAgICAgbGliQ29uZmlnLl9pbmRleFxuICAgICAgICAgICAgICAgIH1dLmJ1bmRsZXNbJHtpXG4gICAgICAgICAgICAgICAgfV0uZW50cnlSb290Jy5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGN1cnJlbnRCdW5kbGUuX2VudHJ5RmlsZVBhdGggPSBmb3VuZEJ1bmRsZVRhcmdldC5fb3V0cHV0RmlsZVBhdGg7XG4gICAgICAgIGN1cnJlbnRCdW5kbGUuX3NvdXJjZVNjcmlwdFRhcmdldCA9IGZvdW5kQnVuZGxlVGFyZ2V0Ll9kZXN0U2NyaXB0VGFyZ2V0O1xuICAgICAgICBjdXJyZW50QnVuZGxlLl9kZXN0U2NyaXB0VGFyZ2V0ID0gZm91bmRCdW5kbGVUYXJnZXQuX2Rlc3RTY3JpcHRUYXJnZXQ7XG4gICAgfSBlbHNlIGlmIChjdXJyZW50QnVuZGxlLmVudHJ5Um9vdCAmJiBjdXJyZW50QnVuZGxlLmVudHJ5Um9vdCA9PT0gJ3RzVHJhbnNwaWxhdGlvbk91dERpcicpIHtcbiAgICAgICAgaWYgKCFsaWJDb25maWcuX3RzVHJhbnNwaWxhdGlvbnMgfHwgIWxpYkNvbmZpZy5fdHNUcmFuc3BpbGF0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkQ29uZmlnRXJyb3IoXG4gICAgICAgICAgICAgICAgYFRvIHVzZSAndHNUcmFuc3BpbGF0aW9uT3V0RGlyJywgdGhlICdwcm9qZWN0c1ske2xpYkNvbmZpZy5uYW1lIHx8IGxpYkNvbmZpZy5faW5kZXhcbiAgICAgICAgICAgICAgICB9XS50c1RyYW5zcGlsYXRpb25zJyBvcHRpb24gaXMgcmVxdWlyZWQuYCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZm91bmRUc1RyYW5zcGlsYXRpb246IFRzVHJhbnNwaWxhdGlvbk9wdGlvbnNJbnRlcm5hbDtcblxuICAgICAgICBpZiAoY3VycmVudEJ1bmRsZS50c1RyYW5zcGlsYXRpb25JbmRleCA9PSBudWxsKSB7XG4gICAgICAgICAgICBmb3VuZFRzVHJhbnNwaWxhdGlvbiA9IGxpYkNvbmZpZy5fdHNUcmFuc3BpbGF0aW9uc1swXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50QnVuZGxlLnRzVHJhbnNwaWxhdGlvbkluZGV4ID4gbGliQ29uZmlnLl90c1RyYW5zcGlsYXRpb25zLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZENvbmZpZ0Vycm9yKFxuICAgICAgICAgICAgICAgICAgICBgTm8gX3RzVHJhbnNwaWxhdGlvbnMgZm91bmQsIHBsZWFzZSBjb3JyZWN0IHZhbHVlIGluICdwcm9qZWN0c1ske2xpYkNvbmZpZy5uYW1lIHx8XG4gICAgICAgICAgICAgICAgICAgIGxpYkNvbmZpZy5faW5kZXhcbiAgICAgICAgICAgICAgICAgICAgfV0uYnVuZGxlc1ske2lcbiAgICAgICAgICAgICAgICAgICAgfV0udHNUcmFuc3BpbGF0aW9uSW5kZXgnLmApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3VuZFRzVHJhbnNwaWxhdGlvbiA9IGxpYkNvbmZpZy5fdHNUcmFuc3BpbGF0aW9uc1tjdXJyZW50QnVuZGxlLnRzVHJhbnNwaWxhdGlvbkluZGV4XTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGVudHJ5Um9vdERpciA9IGZvdW5kVHNUcmFuc3BpbGF0aW9uLl90c091dERpclJvb3RSZXNvbHZlZDtcbiAgICAgICAgbGV0IGVudHJ5RmlsZSA9IGN1cnJlbnRCdW5kbGUuZW50cnk7XG4gICAgICAgIGlmICghZW50cnlGaWxlICYmIGZvdW5kVHNUcmFuc3BpbGF0aW9uLl9kZXRlY3RlZEVudHJ5TmFtZSkge1xuICAgICAgICAgICAgZW50cnlGaWxlID0gYCR7Zm91bmRUc1RyYW5zcGlsYXRpb24uX2RldGVjdGVkRW50cnlOYW1lfS5qc2A7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFlbnRyeUZpbGUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkQ29uZmlnRXJyb3IoXG4gICAgICAgICAgICAgICAgYFRoZSAncHJvamVjdHNbJHtsaWJDb25maWcubmFtZSB8fCBsaWJDb25maWcuX2luZGV4fV0uYnVuZGxlc1ske2l9XS5lbnRyeScgdmFsdWUgaXMgcmVxdWlyZWQuYCk7XG4gICAgICAgIH1cblxuICAgICAgICBjdXJyZW50QnVuZGxlLl9lbnRyeUZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGVudHJ5Um9vdERpciwgZW50cnlGaWxlKTtcblxuICAgICAgICBjdXJyZW50QnVuZGxlLl9zb3VyY2VTY3JpcHRUYXJnZXQgPSBmb3VuZFRzVHJhbnNwaWxhdGlvbi5fc2NyaXB0VGFyZ2V0O1xuICAgICAgICBjdXJyZW50QnVuZGxlLl9kZXN0U2NyaXB0VGFyZ2V0ID0gZm91bmRUc1RyYW5zcGlsYXRpb24uX3NjcmlwdFRhcmdldDtcbiAgICB9IGVsc2UgaWYgKGN1cnJlbnRCdW5kbGUuZW50cnlSb290ICYmIGN1cnJlbnRCdW5kbGUuZW50cnlSb290ID09PSAnb3V0cHV0UGF0aCcpIHtcbiAgICAgICAgaWYgKCFjdXJyZW50QnVuZGxlLmVudHJ5KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZENvbmZpZ0Vycm9yKFxuICAgICAgICAgICAgICAgIGBUaGUgJ3Byb2plY3RzWyR7bGliQ29uZmlnLm5hbWUgfHwgbGliQ29uZmlnLl9pbmRleH1dLmJ1bmRsZXNbJHtpXG4gICAgICAgICAgICAgICAgfV0uZW50cnknIHZhbHVlIGlzIHJlcXVpcmVkLmApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZW50cnlGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShvdXRwdXRQYXRoLCBjdXJyZW50QnVuZGxlLmVudHJ5KTtcbiAgICAgICAgY3VycmVudEJ1bmRsZS5fZW50cnlGaWxlUGF0aCA9IGVudHJ5RmlsZVBhdGg7XG5cbiAgICAgICAgaWYgKC9cXC5mP2VzbT8yMDE4XFwuanMkL2kudGVzdChlbnRyeUZpbGVQYXRoKSB8fFxuICAgICAgICAgICAgY2hlY2tQYXRoVXAoL2Y/ZXNtPzIwMTgkL2ksIHBhdGguZGlybmFtZShlbnRyeUZpbGVQYXRoKSwgb3V0cHV0UGF0aCkpIHtcbiAgICAgICAgICAgIGN1cnJlbnRCdW5kbGUuX3NvdXJjZVNjcmlwdFRhcmdldCA9IFNjcmlwdFRhcmdldC5FUzIwMTg7XG4gICAgICAgIH0gZWxzZSBpZiAoL1xcLmY/ZXNtPzIwMTdcXC5qcyQvaS50ZXN0KGVudHJ5RmlsZVBhdGgpIHx8XG4gICAgICAgICAgICBjaGVja1BhdGhVcCgvZj9lc20/MjAxNyQvaSwgcGF0aC5kaXJuYW1lKGVudHJ5RmlsZVBhdGgpLCBvdXRwdXRQYXRoKSkge1xuICAgICAgICAgICAgY3VycmVudEJ1bmRsZS5fc291cmNlU2NyaXB0VGFyZ2V0ID0gU2NyaXB0VGFyZ2V0LkVTMjAxNztcbiAgICAgICAgfSBlbHNlIGlmICgvXFwuZj9lc20/MjAxNlxcLmpzJC9pLnRlc3QoZW50cnlGaWxlUGF0aCkgfHxcbiAgICAgICAgICAgIGNoZWNrUGF0aFVwKC9mP2VzbT8yMDE2JC9pLCBwYXRoLmRpcm5hbWUoZW50cnlGaWxlUGF0aCksIG91dHB1dFBhdGgpKSB7XG4gICAgICAgICAgICBjdXJyZW50QnVuZGxlLl9zb3VyY2VTY3JpcHRUYXJnZXQgPSBTY3JpcHRUYXJnZXQuRVMyMDE2O1xuICAgICAgICB9IGVsc2UgaWYgKC9cXC5mP2VzbT8yMDE1XFwuanMkL2kudGVzdChlbnRyeUZpbGVQYXRoKSB8fFxuICAgICAgICAgICAgY2hlY2tQYXRoVXAoL2Y/ZXNtPzIwMTUkL2ksIHBhdGguZGlybmFtZShlbnRyeUZpbGVQYXRoKSwgb3V0cHV0UGF0aCkpIHtcbiAgICAgICAgICAgIGN1cnJlbnRCdW5kbGUuX3NvdXJjZVNjcmlwdFRhcmdldCA9IFNjcmlwdFRhcmdldC5FUzIwMTU7XG4gICAgICAgIH0gZWxzZSBpZiAoL1xcLmY/ZXNtPzVcXC5qcyQvaS50ZXN0KGVudHJ5RmlsZVBhdGgpIHx8XG4gICAgICAgICAgICBjaGVja1BhdGhVcCgvZj9lc20/NSQvaSwgcGF0aC5kaXJuYW1lKGVudHJ5RmlsZVBhdGgpLCBvdXRwdXRQYXRoKSkge1xuICAgICAgICAgICAgY3VycmVudEJ1bmRsZS5fc291cmNlU2NyaXB0VGFyZ2V0ID0gU2NyaXB0VGFyZ2V0LkVTNTtcbiAgICAgICAgfVxuXG4gICAgICAgIGN1cnJlbnRCdW5kbGUuX2Rlc3RTY3JpcHRUYXJnZXQgPSBjdXJyZW50QnVuZGxlLl9zb3VyY2VTY3JpcHRUYXJnZXQ7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKCFjdXJyZW50QnVuZGxlLmVudHJ5KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZENvbmZpZ0Vycm9yKFxuICAgICAgICAgICAgICAgIGBUaGUgJ3Byb2plY3RzWyR7bGliQ29uZmlnLm5hbWUgfHwgbGliQ29uZmlnLl9pbmRleH1dLmJ1bmRsZXNbJHtpXG4gICAgICAgICAgICAgICAgfV0uZW50cnknIHZhbHVlIGlzIHJlcXVpcmVkLmApO1xuICAgICAgICB9XG5cbiAgICAgICAgY3VycmVudEJ1bmRsZS5fZW50cnlGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShwcm9qZWN0Um9vdCwgY3VycmVudEJ1bmRsZS5lbnRyeSk7XG5cbiAgICAgICAgaWYgKC9cXC50cyQvaS50ZXN0KGN1cnJlbnRCdW5kbGUuZW50cnkpKSB7XG4gICAgICAgICAgICBpZiAoY3VycmVudEJ1bmRsZS50c0NvbmZpZykge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRCdW5kbGUuX3RzQ29uZmlnUGF0aCA9IHBhdGgucmVzb2x2ZShwcm9qZWN0Um9vdCwgY3VycmVudEJ1bmRsZS50c0NvbmZpZyk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGxpYkNvbmZpZy5fdHNDb25maWdQYXRoKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudEJ1bmRsZS5fdHNDb25maWdQYXRoID0gbGliQ29uZmlnLl90c0NvbmZpZ1BhdGg7XG4gICAgICAgICAgICAgICAgY3VycmVudEJ1bmRsZS5fdHNDb25maWdKc29uID0gbGliQ29uZmlnLl90c0NvbmZpZ0pzb247XG4gICAgICAgICAgICAgICAgY3VycmVudEJ1bmRsZS5fdHNDb21waWxlckNvbmZpZyA9IGxpYkNvbmZpZy5fdHNDb21waWxlckNvbmZpZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGxldCBub2RlUmVzb2x2ZUZpZWxkczogc3RyaW5nW10gPSBbXTtcblxuICAgIGlmIChjdXJyZW50QnVuZGxlLl90c0NvbmZpZ1BhdGgpIHtcbiAgICAgICAgbG9hZFRzQ29uZmlnKGN1cnJlbnRCdW5kbGUuX3RzQ29uZmlnUGF0aCwgY3VycmVudEJ1bmRsZSwgbGliQ29uZmlnKTtcblxuICAgICAgICBpZiAoIWN1cnJlbnRCdW5kbGUuX3RzQ29tcGlsZXJDb25maWcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiVGhlICdjdXJyZW50QnVuZGxlLl90c0NvbXBpbGVyQ29uZmlnJyBpcyBub3Qgc2V0LlwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghY3VycmVudEJ1bmRsZS5fc291cmNlU2NyaXB0VGFyZ2V0KSB7XG4gICAgICAgICAgICBjdXJyZW50QnVuZGxlLl9zb3VyY2VTY3JpcHRUYXJnZXQgPSBjdXJyZW50QnVuZGxlLl90c0NvbXBpbGVyQ29uZmlnLm9wdGlvbnMudGFyZ2V0O1xuICAgICAgICB9XG4gICAgICAgIGlmICghY3VycmVudEJ1bmRsZS5fZGVzdFNjcmlwdFRhcmdldCkge1xuICAgICAgICAgICAgY3VycmVudEJ1bmRsZS5fZGVzdFNjcmlwdFRhcmdldCA9IGN1cnJlbnRCdW5kbGUuX3RzQ29tcGlsZXJDb25maWcub3B0aW9ucy50YXJnZXQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY3VycmVudEJ1bmRsZS5fZGVzdFNjcmlwdFRhcmdldCkge1xuICAgICAgICBjb25zdCBzY3JpcHRUYXJnZXQgPSBjdXJyZW50QnVuZGxlLl9kZXN0U2NyaXB0VGFyZ2V0IGFzIFNjcmlwdFRhcmdldDtcblxuICAgICAgICAvLyBlY21hVmVyc2lvblxuICAgICAgICBjb25zdCBlY21hVmVyc2lvbiA9IGdldEVjbWFWZXJzaW9uRnJvbVNjcmlwdFRhcmdldChzY3JpcHRUYXJnZXQpO1xuICAgICAgICBpZiAoZWNtYVZlcnNpb24pIHtcbiAgICAgICAgICAgIGN1cnJlbnRCdW5kbGUuX2VjbWFWZXJzaW9uID0gZWNtYVZlcnNpb247XG4gICAgICAgIH1cblxuICAgICAgICAvLyBzdXBwb3J0RVMyMDE1XG4gICAgICAgIGN1cnJlbnRCdW5kbGUuX3N1cHBvcnRFUzIwMTUgPSBzY3JpcHRUYXJnZXQgIT09IFNjcmlwdFRhcmdldC5FUzMgJiZcbiAgICAgICAgICAgIHNjcmlwdFRhcmdldCAhPT0gU2NyaXB0VGFyZ2V0LkVTNTtcblxuICAgICAgICAvLyBub2RlUmVzb2x2ZUZpZWxkc1xuICAgICAgICBub2RlUmVzb2x2ZUZpZWxkcyA9IGdldG5vZGVSZXNvbHZlRmllbGRzRnJvbVNjcmlwdFRhcmdldChzY3JpcHRUYXJnZXQpO1xuICAgIH1cblxuICAgIC8vIG5vZGVSZXNvbHZlRmllbGRzXG4gICAgY29uc3QgZGVmYXVsdE1haW5GaWVsZHMgPSBbJ21vZHVsZScsICdtYWluJ107XG4gICAgbm9kZVJlc29sdmVGaWVsZHMucHVzaCguLi5kZWZhdWx0TWFpbkZpZWxkcyk7XG4gICAgY3VycmVudEJ1bmRsZS5fbm9kZVJlc29sdmVGaWVsZHMgPSBub2RlUmVzb2x2ZUZpZWxkcztcblxuICAgIC8vIG91dHB1dEZpbGVQYXRoXG4gICAgbGV0IGJ1bmRsZU91dEZpbGVQYXRoID0gJyc7XG4gICAgaWYgKGN1cnJlbnRCdW5kbGUub3V0cHV0RmlsZVBhdGgpIHtcbiAgICAgICAgYnVuZGxlT3V0RmlsZVBhdGggPSBjdXJyZW50QnVuZGxlLm91dHB1dEZpbGVQYXRoO1xuXG4gICAgICAgIGNvbnN0IGlzRGlyID0gLyhcXFxcfFxcLykkLy50ZXN0KGJ1bmRsZU91dEZpbGVQYXRoKSB8fFxuICAgICAgICAgICAgIS9cXC5qcyQvaS50ZXN0KGJ1bmRsZU91dEZpbGVQYXRoKTtcbiAgICAgICAgYnVuZGxlT3V0RmlsZVBhdGggPSBwYXRoLnJlc29sdmUob3V0cHV0UGF0aCwgYnVuZGxlT3V0RmlsZVBhdGgpO1xuXG4gICAgICAgIGlmIChpc0Rpcikge1xuICAgICAgICAgICAgaWYgKCFsaWJDb25maWcuX3BhY2thZ2VOYW1lV2l0aG91dFNjb3BlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJUaGUgJ2xpYkNvbmZpZy5fcGFja2FnZU5hbWVXaXRob3V0U2NvcGUnIGlzIG5vdCBzZXQuXCIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBvdXRGaWxlTmFtZSA9XG4gICAgICAgICAgICAgICAgbGliQ29uZmlnLl9wYWNrYWdlTmFtZVdpdGhvdXRTY29wZS5yZXBsYWNlKC9cXC8vZ20sICctJyk7XG4gICAgICAgICAgICBidW5kbGVPdXRGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShidW5kbGVPdXRGaWxlUGF0aCwgYCR7b3V0RmlsZU5hbWV9LmpzYCk7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoIWxpYkNvbmZpZy5fcGFja2FnZU5hbWVXaXRob3V0U2NvcGUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiVGhlICdsaWJDb25maWcuX3BhY2thZ2VOYW1lV2l0aG91dFNjb3BlJyBpcyBub3Qgc2V0LlwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG91dEZpbGVOYW1lID1cbiAgICAgICAgICAgIGxpYkNvbmZpZy5fcGFja2FnZU5hbWVXaXRob3V0U2NvcGUucmVwbGFjZSgvXFwvL2dtLCAnLScpO1xuXG4gICAgICAgIGlmIChjdXJyZW50QnVuZGxlLmxpYnJhcnlUYXJnZXQgPT09ICd1bWQnIHx8IGN1cnJlbnRCdW5kbGUubGlicmFyeVRhcmdldCA9PT0gJ2NqcycpIHtcbiAgICAgICAgICAgIGlmIChidW5kbGVzLmxlbmd0aCA+IDEgfHwgKGxpYkNvbmZpZy5fdHNUcmFuc3BpbGF0aW9ucyAmJiBsaWJDb25maWcuX3RzVHJhbnNwaWxhdGlvbnMubGVuZ3RoID4gMCkpIHtcbiAgICAgICAgICAgICAgICBidW5kbGVPdXRGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShvdXRwdXRQYXRoLCBgYnVuZGxlcy8ke291dEZpbGVOYW1lfS4ke2N1cnJlbnRCdW5kbGUubGlicmFyeVRhcmdldH0uanNgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYnVuZGxlT3V0RmlsZVBhdGggPSBwYXRoLnJlc29sdmUob3V0cHV0UGF0aCwgYCR7b3V0RmlsZU5hbWV9LmpzYCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50QnVuZGxlLl9kZXN0U2NyaXB0VGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2NyaXB0VGFyZ2V0U3RyID0gU2NyaXB0VGFyZ2V0W2N1cnJlbnRCdW5kbGUuX2Rlc3RTY3JpcHRUYXJnZXRdLnJlcGxhY2UoL15FUy9pLCAnJyk7XG4gICAgICAgICAgICAgICAgY29uc3QgZmVzbUZvbGRlck5hbWUgPSBgZmVzbSR7c2NyaXB0VGFyZ2V0U3RyfWA7XG4gICAgICAgICAgICAgICAgYnVuZGxlT3V0RmlsZVBhdGggPSBwYXRoLnJlc29sdmUob3V0cHV0UGF0aCwgZmVzbUZvbGRlck5hbWUsIGAke291dEZpbGVOYW1lfS5qc2ApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBidW5kbGVPdXRGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShvdXRwdXRQYXRoLCBgYnVuZGxlcy8ke291dEZpbGVOYW1lfS5lcy5qc2ApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGN1cnJlbnRCdW5kbGUuX2VudHJ5RmlsZVBhdGggJiYgL1xcW25hbWVcXF0vZy50ZXN0KGJ1bmRsZU91dEZpbGVQYXRoKSkge1xuICAgICAgICBidW5kbGVPdXRGaWxlUGF0aCA9IGJ1bmRsZU91dEZpbGVQYXRoLnJlcGxhY2UoL1xcW25hbWVcXF0vZyxcbiAgICAgICAgICAgIHBhdGguYmFzZW5hbWUoY3VycmVudEJ1bmRsZS5fZW50cnlGaWxlUGF0aCkucmVwbGFjZSgvXFwuKGpzfHRzKSQvaSwgJycpKTtcbiAgICB9XG5cbiAgICAvLyBwYWNrYWdlIGVudHJ5IHBvaW50c1xuICAgIGlmIChsaWJDb25maWcuX3BhY2thZ2VKc29uT3V0RGlyKSB7XG4gICAgICAgIGxpYkNvbmZpZy5fcGFja2FnZUVudHJ5UG9pbnRzID0gbGliQ29uZmlnLl9wYWNrYWdlRW50cnlQb2ludHMgfHwge307XG4gICAgICAgIGNvbnN0IHBhY2thZ2VFbnRyeVBvaW50cyA9IGxpYkNvbmZpZy5fcGFja2FnZUVudHJ5UG9pbnRzO1xuICAgICAgICBjb25zdCBwYWNrYWdlSnNvbk91dERpciA9IGxpYkNvbmZpZy5fcGFja2FnZUpzb25PdXREaXI7XG4gICAgICAgIGNvbnN0IHNjcmlwdFRhcmdldCA9IGN1cnJlbnRCdW5kbGUuX2Rlc3RTY3JpcHRUYXJnZXQ7XG5cbiAgICAgICAgaWYgKGN1cnJlbnRCdW5kbGUubGlicmFyeVRhcmdldCA9PT0gJ2VzbScgJiYgc2NyaXB0VGFyZ2V0ID09PSBTY3JpcHRUYXJnZXQuRVMyMDE1KSB7XG4gICAgICAgICAgICBwYWNrYWdlRW50cnlQb2ludHMuZmVzbTIwMTUgPSBub3JtYWxpemVSZWxhdGl2ZVBhdGgocGF0aC5yZWxhdGl2ZShwYWNrYWdlSnNvbk91dERpcixcbiAgICAgICAgICAgICAgICBidW5kbGVPdXRGaWxlUGF0aCkpO1xuICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRCdW5kbGUubGlicmFyeVRhcmdldCA9PT0gJ2VzbScgJiYgc2NyaXB0VGFyZ2V0ID09PSBTY3JpcHRUYXJnZXQuRVM1KSB7XG4gICAgICAgICAgICBwYWNrYWdlRW50cnlQb2ludHMuZmVzbTUgPSBub3JtYWxpemVSZWxhdGl2ZVBhdGgocGF0aC5yZWxhdGl2ZShwYWNrYWdlSnNvbk91dERpcixcbiAgICAgICAgICAgICAgICBidW5kbGVPdXRGaWxlUGF0aCkpO1xuICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRCdW5kbGUubGlicmFyeVRhcmdldCA9PT0gJ3VtZCcgfHwgY3VycmVudEJ1bmRsZS5saWJyYXJ5VGFyZ2V0ID09PSAnY2pzJykge1xuICAgICAgICAgICAgcGFja2FnZUVudHJ5UG9pbnRzLm1haW4gPSBub3JtYWxpemVSZWxhdGl2ZVBhdGgocGF0aC5yZWxhdGl2ZShwYWNrYWdlSnNvbk91dERpcixcbiAgICAgICAgICAgICAgICBidW5kbGVPdXRGaWxlUGF0aCkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgLi4uY3VycmVudEJ1bmRsZSxcbiAgICAgICAgX2luZGV4OiBpLFxuICAgICAgICBfZW50cnlGaWxlUGF0aDogY3VycmVudEJ1bmRsZS5fZW50cnlGaWxlUGF0aCxcbiAgICAgICAgX291dHB1dEZpbGVQYXRoOiBidW5kbGVPdXRGaWxlUGF0aFxuICAgIH07XG59XG4iXX0= |
\ | No newline at end of file |