source: trip-planner-front/node_modules/@angular/compiler-cli/ngcc/src/packages/source_file_cache.js@ 6a3a178

Last change on this file since 6a3a178 was 6a3a178, checked in by Ema <ema_spirova@…>, 3 years ago

initial commit

  • Property mode set to 100644
File size: 25.9 KB
Line 
1(function (factory) {
2 if (typeof module === "object" && typeof module.exports === "object") {
3 var v = factory(require, exports);
4 if (v !== undefined) module.exports = v;
5 }
6 else if (typeof define === "function" && define.amd) {
7 define("@angular/compiler-cli/ngcc/src/packages/source_file_cache", ["require", "exports", "typescript"], factory);
8 }
9})(function (require, exports) {
10 "use strict";
11 Object.defineProperty(exports, "__esModule", { value: true });
12 exports.createModuleResolutionCache = exports.EntryPointFileCache = exports.isAngularDts = exports.isDefaultLibrary = exports.SharedFileCache = void 0;
13 /**
14 * @license
15 * Copyright Google LLC All Rights Reserved.
16 *
17 * Use of this source code is governed by an MIT-style license that can be
18 * found in the LICENSE file at https://angular.io/license
19 */
20 var ts = require("typescript");
21 /**
22 * A cache that holds on to source files that can be shared for processing all entry-points in a
23 * single invocation of ngcc. In particular, the following files are shared across all entry-points
24 * through this cache:
25 *
26 * 1. Default library files such as `lib.dom.d.ts` and `lib.es5.d.ts`. These files don't change
27 * and some are very large, so parsing is expensive. Therefore, the parsed `ts.SourceFile`s for
28 * the default library files are cached.
29 * 2. The typings of @angular scoped packages. The typing files for @angular packages are typically
30 * used in the entry-points that ngcc processes, so benefit from a single source file cache.
31 * Especially `@angular/core/core.d.ts` is large and expensive to parse repeatedly. In contrast
32 * to default library files, we have to account for these files to be invalidated during a single
33 * invocation of ngcc, as ngcc will overwrite the .d.ts files during its processing.
34 *
35 * The lifecycle of this cache corresponds with a single invocation of ngcc. Separate invocations,
36 * e.g. the CLI's synchronous module resolution fallback will therefore all have their own cache.
37 * This allows for the source file cache to be garbage collected once ngcc processing has completed.
38 */
39 var SharedFileCache = /** @class */ (function () {
40 function SharedFileCache(fs) {
41 this.fs = fs;
42 this.sfCache = new Map();
43 }
44 /**
45 * Loads a `ts.SourceFile` if the provided `fileName` is deemed appropriate to be cached. To
46 * optimize for memory usage, only files that are generally used in all entry-points are cached.
47 * If `fileName` is not considered to benefit from caching or the requested file does not exist,
48 * then `undefined` is returned.
49 */
50 SharedFileCache.prototype.getCachedSourceFile = function (fileName) {
51 var absPath = this.fs.resolve(fileName);
52 if (isDefaultLibrary(absPath, this.fs)) {
53 return this.getStableCachedFile(absPath);
54 }
55 else if (isAngularDts(absPath, this.fs)) {
56 return this.getVolatileCachedFile(absPath);
57 }
58 else {
59 return undefined;
60 }
61 };
62 /**
63 * Attempts to load the source file from the cache, or parses the file into a `ts.SourceFile` if
64 * it's not yet cached. This method assumes that the file will not be modified for the duration
65 * that this cache is valid for. If that assumption does not hold, the `getVolatileCachedFile`
66 * method is to be used instead.
67 */
68 SharedFileCache.prototype.getStableCachedFile = function (absPath) {
69 if (!this.sfCache.has(absPath)) {
70 var content = readFile(absPath, this.fs);
71 if (content === undefined) {
72 return undefined;
73 }
74 var sf = ts.createSourceFile(absPath, content, ts.ScriptTarget.ES2015);
75 this.sfCache.set(absPath, sf);
76 }
77 return this.sfCache.get(absPath);
78 };
79 /**
80 * In contrast to `getStableCachedFile`, this method always verifies that the cached source file
81 * is the same as what's stored on disk. This is done for files that are expected to change during
82 * ngcc's processing, such as @angular scoped packages for which the .d.ts files are overwritten
83 * by ngcc. If the contents on disk have changed compared to a previously cached source file, the
84 * content from disk is re-parsed and the cache entry is replaced.
85 */
86 SharedFileCache.prototype.getVolatileCachedFile = function (absPath) {
87 var content = readFile(absPath, this.fs);
88 if (content === undefined) {
89 return undefined;
90 }
91 if (!this.sfCache.has(absPath) || this.sfCache.get(absPath).text !== content) {
92 var sf = ts.createSourceFile(absPath, content, ts.ScriptTarget.ES2015);
93 this.sfCache.set(absPath, sf);
94 }
95 return this.sfCache.get(absPath);
96 };
97 return SharedFileCache;
98 }());
99 exports.SharedFileCache = SharedFileCache;
100 var DEFAULT_LIB_PATTERN = ['node_modules', 'typescript', 'lib', /^lib\..+\.d\.ts$/];
101 /**
102 * Determines whether the provided path corresponds with a default library file inside of the
103 * typescript package.
104 *
105 * @param absPath The path for which to determine if it corresponds with a default library file.
106 * @param fs The filesystem to use for inspecting the path.
107 */
108 function isDefaultLibrary(absPath, fs) {
109 return isFile(absPath, DEFAULT_LIB_PATTERN, fs);
110 }
111 exports.isDefaultLibrary = isDefaultLibrary;
112 var ANGULAR_DTS_PATTERN = ['node_modules', '@angular', /./, /\.d\.ts$/];
113 /**
114 * Determines whether the provided path corresponds with a .d.ts file inside of an @angular
115 * scoped package. This logic only accounts for the .d.ts files in the root, which is sufficient
116 * to find the large, flattened entry-point files that benefit from caching.
117 *
118 * @param absPath The path for which to determine if it corresponds with an @angular .d.ts file.
119 * @param fs The filesystem to use for inspecting the path.
120 */
121 function isAngularDts(absPath, fs) {
122 return isFile(absPath, ANGULAR_DTS_PATTERN, fs);
123 }
124 exports.isAngularDts = isAngularDts;
125 /**
126 * Helper function to determine whether a file corresponds with a given pattern of segments.
127 *
128 * @param path The path for which to determine if it corresponds with the provided segments.
129 * @param segments Array of segments; the `path` must have ending segments that match the
130 * patterns in this array.
131 * @param fs The filesystem to use for inspecting the path.
132 */
133 function isFile(path, segments, fs) {
134 for (var i = segments.length - 1; i >= 0; i--) {
135 var pattern = segments[i];
136 var segment = fs.basename(path);
137 if (typeof pattern === 'string') {
138 if (pattern !== segment) {
139 return false;
140 }
141 }
142 else {
143 if (!pattern.test(segment)) {
144 return false;
145 }
146 }
147 path = fs.dirname(path);
148 }
149 return true;
150 }
151 /**
152 * A cache for processing a single entry-point. This exists to share `ts.SourceFile`s between the
153 * source and typing programs that are created for a single program.
154 */
155 var EntryPointFileCache = /** @class */ (function () {
156 function EntryPointFileCache(fs, sharedFileCache) {
157 this.fs = fs;
158 this.sharedFileCache = sharedFileCache;
159 this.sfCache = new Map();
160 }
161 /**
162 * Returns and caches a parsed `ts.SourceFile` for the provided `fileName`. If the `fileName` is
163 * cached in the shared file cache, that result is used. Otherwise, the source file is cached
164 * internally. This method returns `undefined` if the requested file does not exist.
165 *
166 * @param fileName The path of the file to retrieve a source file for.
167 * @param languageVersion The language version to use for parsing the file.
168 */
169 EntryPointFileCache.prototype.getCachedSourceFile = function (fileName, languageVersion) {
170 var staticSf = this.sharedFileCache.getCachedSourceFile(fileName);
171 if (staticSf !== undefined) {
172 return staticSf;
173 }
174 var absPath = this.fs.resolve(fileName);
175 if (this.sfCache.has(absPath)) {
176 return this.sfCache.get(absPath);
177 }
178 var content = readFile(absPath, this.fs);
179 if (content === undefined) {
180 return undefined;
181 }
182 var sf = ts.createSourceFile(fileName, content, languageVersion);
183 this.sfCache.set(absPath, sf);
184 return sf;
185 };
186 return EntryPointFileCache;
187 }());
188 exports.EntryPointFileCache = EntryPointFileCache;
189 function readFile(absPath, fs) {
190 if (!fs.exists(absPath) || !fs.stat(absPath).isFile()) {
191 return undefined;
192 }
193 return fs.readFile(absPath);
194 }
195 /**
196 * Creates a `ts.ModuleResolutionCache` that uses the provided filesystem for path operations.
197 *
198 * @param fs The filesystem to use for path operations.
199 */
200 function createModuleResolutionCache(fs) {
201 return ts.createModuleResolutionCache(fs.pwd(), function (fileName) {
202 return fs.isCaseSensitive() ? fileName : fileName.toLowerCase();
203 });
204 }
205 exports.createModuleResolutionCache = createModuleResolutionCache;
206});
207//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic291cmNlX2ZpbGVfY2FjaGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21waWxlci1jbGkvbmdjYy9zcmMvcGFja2FnZXMvc291cmNlX2ZpbGVfY2FjaGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0lBQUE7Ozs7OztPQU1HO0lBQ0gsK0JBQWlDO0lBR2pDOzs7Ozs7Ozs7Ozs7Ozs7OztPQWlCRztJQUNIO1FBR0UseUJBQW9CLEVBQXNCO1lBQXRCLE9BQUUsR0FBRixFQUFFLENBQW9CO1lBRmxDLFlBQU8sR0FBRyxJQUFJLEdBQUcsRUFBaUMsQ0FBQztRQUVkLENBQUM7UUFFOUM7Ozs7O1dBS0c7UUFDSCw2Q0FBbUIsR0FBbkIsVUFBb0IsUUFBZ0I7WUFDbEMsSUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDMUMsSUFBSSxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFO2dCQUN0QyxPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsQ0FBQzthQUMxQztpQkFBTSxJQUFJLFlBQVksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFO2dCQUN6QyxPQUFPLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsQ0FBQzthQUM1QztpQkFBTTtnQkFDTCxPQUFPLFNBQVMsQ0FBQzthQUNsQjtRQUNILENBQUM7UUFFRDs7Ozs7V0FLRztRQUNLLDZDQUFtQixHQUEzQixVQUE0QixPQUF1QjtZQUNqRCxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUU7Z0JBQzlCLElBQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUMz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QUUsRUFBc0I7UUFDL0QsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQ3JELE9BQU8sU0FBUyxDQUFDO1NBQ2xCO1FBQ0QsT0FBTyxFQUFFLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsU0FBZ0IsMkJBQTJCLENBQUMsRUFBc0I7UUFDaEUsT0FBTyxFQUFFLENBQUMsMkJBQTJCLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLFVBQUEsUUFBUTtZQUN0RCxPQUFPLEVBQUUsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDbEUsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBSkQsa0VBSUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbmltcG9ydCAqIGFzIHRzIGZyb20gJ3R5cGVzY3JpcHQnO1xuaW1wb3J0IHtBYnNvbHV0ZUZzUGF0aCwgUmVhZG9ubHlGaWxlU3lzdGVtfSBmcm9tICcuLi8uLi8uLi9zcmMvbmd0c2MvZmlsZV9zeXN0ZW0nO1xuXG4vKipcbiAqIEEgY2FjaGUgdGhhdCBob2xkcyBvbiB0byBzb3VyY2UgZmlsZXMgdGhhdCBjYW4gYmUgc2hhcmVkIGZvciBwcm9jZXNzaW5nIGFsbCBlbnRyeS1wb2ludHMgaW4gYVxuICogc2luZ2xlIGludm9jYXRpb24gb2YgbmdjYy4gSW4gcGFydGljdWxhciwgdGhlIGZvbGxvd2luZyBmaWxlcyBhcmUgc2hhcmVkIGFjcm9zcyBhbGwgZW50cnktcG9pbnRzXG4gKiB0aHJvdWdoIHRoaXMgY2FjaGU6XG4gKlxuICogMS4gRGVmYXVsdCBsaWJyYXJ5IGZpbGVzIHN1Y2ggYXMgYGxpYi5kb20uZC50c2AgYW5kIGBsaWIuZXM1LmQudHNgLiBUaGVzZSBmaWxlcyBkb24ndCBjaGFuZ2VcbiAqICAgIGFuZCBzb21lIGFyZSB2ZXJ5IGxhcmdlLCBzbyBwYXJzaW5nIGlzIGV4cGVuc2l2ZS4gVGhlcmVmb3JlLCB0aGUgcGFyc2VkIGB0cy5Tb3VyY2VGaWxlYHMgZm9yXG4gKiAgICB0aGUgZGVmYXVsdCBsaWJyYXJ5IGZpbGVzIGFyZSBjYWNoZWQuXG4gKiAyLiBUaGUgdHlwaW5ncyBvZiBAYW5ndWxhciBzY29wZWQgcGFja2FnZXMuIFRoZSB0eXBpbmcgZmlsZXMgZm9yIEBhbmd1bGFyIHBhY2thZ2VzIGFyZSB0eXBpY2FsbHlcbiAqICAgIHVzZWQgaW4gdGhlIGVudHJ5LXBvaW50cyB0aGF0IG5nY2MgcHJvY2Vzc2VzLCBzbyBiZW5lZml0IGZyb20gYSBzaW5nbGUgc291cmNlIGZpbGUgY2FjaGUuXG4gKiAgICBFc3BlY2lhbGx5IGBAYW5ndWxhci9jb3JlL2NvcmUuZC50c2AgaXMgbGFyZ2UgYW5kIGV4cGVuc2l2ZSB0byBwYXJzZSByZXBlYXRlZGx5LiBJbiBjb250cmFzdFxuICogICAgdG8gZGVmYXVsdCBsaWJyYXJ5IGZpbGVzLCB3ZSBoYXZlIHRvIGFjY291bnQgZm9yIHRoZXNlIGZpbGVzIHRvIGJlIGludmFsaWRhdGVkIGR1cmluZyBhIHNpbmdsZVxuICogICAgaW52b2NhdGlvbiBvZiBuZ2NjLCBhcyBuZ2NjIHdpbGwgb3ZlcndyaXRlIHRoZSAuZC50cyBmaWxlcyBkdXJpbmcgaXRzIHByb2Nlc3NpbmcuXG4gKlxuICogVGhlIGxpZmVjeWNsZSBvZiB0aGlzIGNhY2hlIGNvcnJlc3BvbmRzIHdpdGggYSBzaW5nbGUgaW52b2NhdGlvbiBvZiBuZ2NjLiBTZXBhcmF0ZSBpbnZvY2F0aW9ucyxcbiAqIGUuZy4gdGhlIENMSSdzIHN5bmNocm9ub3VzIG1vZHVsZSByZXNvbHV0aW9uIGZhbGxiYWNrIHdpbGwgdGhlcmVmb3JlIGFsbCBoYXZlIHRoZWlyIG93biBjYWNoZS5cbiAqIFRoaXMgYWxsb3dzIGZvciB0aGUgc291cmNlIGZpbGUgY2FjaGUgdG8gYmUgZ2FyYmFnZSBjb2xsZWN0ZWQgb25jZSBuZ2NjIHByb2Nlc3NpbmcgaGFzIGNvbXBsZXRlZC5cbiAqL1xuZXhwb3J0IGNsYXNzIFNoYXJlZEZpbGVDYWNoZSB7XG4gIHByaXZhdGUgc2ZDYWNoZSA9IG5ldyBNYXA8QWJzb2x1dGVGc1BhdGgsIHRzLlNvdXJjZUZpbGU+KCk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBmczogUmVhZG9ubHlGaWxlU3lzdGVtKSB7fVxuXG4gIC8qKlxuICAgKiBMb2FkcyBhIGB0cy5Tb3VyY2VGaWxlYCBpZiB0aGUgcHJvdmlkZWQgYGZpbGVOYW1lYCBpcyBkZWVtZWQgYXBwcm9wcmlhdGUgdG8gYmUgY2FjaGVkLiBUb1xuICAgKiBvcHRpbWl6ZSBmb3IgbWVtb3J5IHVzYWdlLCBvbmx5IGZpbGVzIHRoYXQgYXJlIGdlbmVyYWxseSB1c2VkIGluIGFsbCBlbnRyeS1wb2ludHMgYXJlIGNhY2hlZC5cbiAgICogSWYgYGZpbGVOYW1lYCBpcyBub3QgY29uc2lkZXJlZCB0byBiZW5lZml0IGZyb20gY2FjaGluZyBvciB0aGUgcmVxdWVzdGVkIGZpbGUgZG9lcyBub3QgZXhpc3QsXG4gICAqIHRoZW4gYHVuZGVmaW5lZGAgaXMgcmV0dXJuZWQuXG4gICAqL1xuICBnZXRDYWNoZWRTb3VyY2VGaWxlKGZpbGVOYW1lOiBzdHJpbmcpOiB0cy5Tb3VyY2VGaWxlfHVuZGVmaW5lZCB7XG4gICAgY29uc3QgYWJzUGF0aCA9IHRoaXMuZnMucmVzb2x2ZShmaWxlTmFtZSk7XG4gICAgaWYgKGlzRGVmYXVsdExpYnJhcnkoYWJzUGF0aCwgdGhpcy5mcykpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldFN0YWJsZUNhY2hlZEZpbGUoYWJzUGF0aCk7XG4gICAgfSBlbHNlIGlmIChpc0FuZ3VsYXJEdHMoYWJzUGF0aCwgdGhpcy5mcykpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldFZvbGF0aWxlQ2FjaGVkRmlsZShhYnNQYXRoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQXR0ZW1wdHMgdG8gbG9hZCB0aGUgc291cmNlIGZpbGUgZnJvbSB0aGUgY2FjaGUsIG9yIHBhcnNlcyB0aGUgZmlsZSBpbnRvIGEgYHRzLlNvdXJjZUZpbGVgIGlmXG4gICAqIGl0J3Mgbm90IHlldCBjYWNoZWQuIFRoaXMgbWV0aG9kIGFzc3VtZXMgdGhhdCB0aGUgZmlsZSB3aWxsIG5vdCBiZSBtb2RpZmllZCBmb3IgdGhlIGR1cmF0aW9uXG4gICAqIHRoYXQgdGhpcyBjYWNoZSBpcyB2YWxpZCBmb3IuIElmIHRoYXQgYXNzdW1wdGlvbiBkb2VzIG5vdCBob2xkLCB0aGUgYGdldFZvbGF0aWxlQ2FjaGVkRmlsZWBcbiAgICogbWV0aG9kIGlzIHRvIGJlIHVzZWQgaW5zdGVhZC5cbiAgICovXG4gIHByaXZhdGUgZ2V0U3RhYmxlQ2FjaGVkRmlsZShhYnNQYXRoOiBBYnNvbHV0ZUZzUGF0aCk6IHRzLlNvdXJjZUZpbGV8dW5kZWZpbmVkIHtcbiAgICBpZiAoIXRoaXMuc2ZDYWNoZS5oYXMoYWJzUGF0aCkpIHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSByZWFkRmlsZShhYnNQYXRoLCB0aGlzLmZzKTtcbiAgICAgIGlmIChjb250ZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHNmID0gdHMuY3JlYXRlU291cmNlRmlsZShhYnNQYXRoLCBjb250ZW50LCB0cy5TY3JpcHRUYXJnZXQuRVMyMDE1KTtcbiAgICAgIHRoaXMuc2ZDYWNoZS5zZXQoYWJzUGF0aCwgc2YpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zZkNhY2hlLmdldChhYnNQYXRoKSE7XG4gIH1cblxuICAvKipcbiAgICogSW4gY29udHJhc3QgdG8gYGdldFN0YWJsZUNhY2hlZEZpbGVgLCB0aGlzIG1ldGhvZCBhbHdheXMgdmVyaWZpZXMgdGhhdCB0aGUgY2FjaGVkIHNvdXJjZSBmaWxlXG4gICAqIGlzIHRoZSBzYW1lIGFzIHdoYXQncyBzdG9yZWQgb24gZGlzay4gVGhpcyBpcyBkb25lIGZvciBmaWxlcyB0aGF0IGFyZSBleHBlY3RlZCB0byBjaGFuZ2UgZHVyaW5nXG4gICAqIG5nY2MncyBwcm9jZXNzaW5nLCBzdWNoIGFzIEBhbmd1bGFyIHNjb3BlZCBwYWNrYWdlcyBmb3Igd2hpY2ggdGhlIC5kLnRzIGZpbGVzIGFyZSBvdmVyd3JpdHRlblxuICAgKiBieSBuZ2NjLiBJZiB0aGUgY29udGVudHMgb24gZGlzayBoYXZlIGNoYW5nZWQgY29tcGFyZWQgdG8gYSBwcmV2aW91c2x5IGNhY2hlZCBzb3VyY2UgZmlsZSwgdGhlXG4gICAqIGNvbnRlbnQgZnJvbSBkaXNrIGlzIHJlLXBhcnNlZCBhbmQgdGhlIGNhY2hlIGVudHJ5IGlzIHJlcGxhY2VkLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRWb2xhdGlsZUNhY2hlZEZpbGUoYWJzUGF0aDogQWJzb2x1dGVGc1BhdGgpOiB0cy5Tb3VyY2VGaWxlfHVuZGVmaW5lZCB7XG4gICAgY29uc3QgY29udGVudCA9IHJlYWRGaWxlKGFic1BhdGgsIHRoaXMuZnMpO1xuICAgIGlmIChjb250ZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmICghdGhpcy5zZkNhY2hlLmhhcyhhYnNQYXRoKSB8fCB0aGlzLnNmQ2FjaGUuZ2V0KGFic1BhdGgpIS50ZXh0ICE9PSBjb250ZW50KSB7XG4gICAgICBjb25zdCBzZiA9IHRzLmNyZWF0ZVNvdXJjZUZpbGUoYWJzUGF0aCwgY29udGVudCwgdHMuU2NyaXB0VGFyZ2V0LkVTMjAxNSk7XG4gICAgICB0aGlzLnNmQ2FjaGUuc2V0KGFic1BhdGgsIHNmKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc2ZDYWNoZS5nZXQoYWJzUGF0aCkhO1xuICB9XG59XG5cbmNvbnN0IERFRkFVTFRfTElCX1BBVFRFUk4gPSBbJ25vZGVfbW9kdWxlcycsICd0eXBlc2NyaXB0JywgJ2xpYicsIC9ebGliXFwuLitcXC5kXFwudHMkL107XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBwcm92aWRlZCBwYXRoIGNvcnJlc3BvbmRzIHdpdGggYSBkZWZhdWx0IGxpYnJhcnkgZmlsZSBpbnNpZGUgb2YgdGhlXG4gKiB0eXBlc2NyaXB0IHBhY2thZ2UuXG4gKlxuICogQHBhcmFtIGFic1BhdGggVGhlIHBhdGggZm9yIHdoaWNoIHRvIGRldGVybWluZSBpZiBpdCBjb3JyZXNwb25kcyB3aXRoIGEgZGVmYXVsdCBsaWJyYXJ5IGZpbGUuXG4gKiBAcGFyYW0gZnMgVGhlIGZpbGVzeXN0ZW0gdG8gdXNlIGZvciBpbnNwZWN0aW5nIHRoZSBwYXRoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNEZWZhdWx0TGlicmFyeShhYnNQYXRoOiBBYnNvbHV0ZUZzUGF0aCwgZnM6IFJlYWRvbmx5RmlsZVN5c3RlbSk6IGJvb2xlYW4ge1xuICByZXR1cm4gaXNGaWxlKGFic1BhdGgsIERFRkFVTFRfTElCX1BBVFRFUk4sIGZzKTtcbn1cblxuY29uc3QgQU5HVUxBUl9EVFNfUEFUVEVSTiA9IFsnbm9kZV9tb2R1bGVzJywgJ0Bhbmd1bGFyJywgLy4vLCAvXFwuZFxcLnRzJC9dO1xuXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciB0aGUgcHJvdmlkZWQgcGF0aCBjb3JyZXNwb25kcyB3aXRoIGEgLmQudHMgZmlsZSBpbnNpZGUgb2YgYW4gQGFuZ3VsYXJcbiAqIHNjb3BlZCBwYWNrYWdlLiBUaGlzIGxvZ2ljIG9ubHkgYWNjb3VudHMgZm9yIHRoZSAuZC50cyBmaWxlcyBpbiB0aGUgcm9vdCwgd2hpY2ggaXMgc3VmZmljaWVudFxuICogdG8gZmluZCB0aGUgbGFyZ2UsIGZsYXR0ZW5lZCBlbnRyeS1wb2ludCBmaWxlcyB0aGF0IGJlbmVmaXQgZnJvbSBjYWNoaW5nLlxuICpcbiAqIEBwYXJhbSBhYnNQYXRoIFRoZSBwYXRoIGZvciB3aGljaCB0byBkZXRlcm1pbmUgaWYgaXQgY29ycmVzcG9uZHMgd2l0aCBhbiBAYW5ndWxhciAuZC50cyBmaWxlLlxuICogQHBhcmFtIGZzIFRoZSBmaWxlc3lzdGVtIHRvIHVzZSBmb3IgaW5zcGVjdGluZyB0aGUgcGF0aC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQW5ndWxhckR0cyhhYnNQYXRoOiBBYnNvbHV0ZUZzUGF0aCwgZnM6IFJlYWRvbmx5RmlsZVN5c3RlbSk6IGJvb2xlYW4ge1xuICByZXR1cm4gaXNGaWxlKGFic1BhdGgsIEFOR1VMQVJfRFRTX1BBVFRFUk4sIGZzKTtcbn1cblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSBmaWxlIGNvcnJlc3BvbmRzIHdpdGggYSBnaXZlbiBwYXR0ZXJuIG9mIHNlZ21lbnRzLlxuICpcbiAqIEBwYXJhbSBwYXRoIFRoZSBwYXRoIGZvciB3aGljaCB0byBkZXRlcm1pbmUgaWYgaXQgY29ycmVzcG9uZHMgd2l0aCB0aGUgcHJvdmlkZWQgc2VnbWVudHMuXG4gKiBAcGFyYW0gc2VnbWVudHMgQXJyYXkgb2Ygc2VnbWVudHM7IHRoZSBgcGF0aGAgbXVzdCBoYXZlIGVuZGluZyBzZWdtZW50cyB0aGF0IG1hdGNoIHRoZVxuICogcGF0dGVybnMgaW4gdGhpcyBhcnJheS5cbiAqIEBwYXJhbSBmcyBUaGUgZmlsZXN5c3RlbSB0byB1c2UgZm9yIGluc3BlY3RpbmcgdGhlIHBhdGguXG4gKi9cbmZ1bmN0aW9uIGlzRmlsZShcbiAgICBwYXRoOiBBYnNvbHV0ZUZzUGF0aCwgc2VnbWVudHM6IFJlYWRvbmx5QXJyYXk8c3RyaW5nfFJlZ0V4cD4sIGZzOiBSZWFkb25seUZpbGVTeXN0ZW0pOiBib29sZWFuIHtcbiAgZm9yIChsZXQgaSA9IHNlZ21lbnRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgY29uc3QgcGF0dGVybiA9IHNlZ21lbnRzW2ldO1xuICAgIGNvbnN0IHNlZ21lbnQgPSBmcy5iYXNlbmFtZShwYXRoKTtcbiAgICBpZiAodHlwZW9mIHBhdHRlcm4gPT09ICdzdHJpbmcnKSB7XG4gICAgICBpZiAocGF0dGVybiAhPT0gc2VnbWVudCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghcGF0dGVybi50ZXN0KHNlZ21lbnQpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcGF0aCA9IGZzLmRpcm5hbWUocGF0aCk7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuICogQSBjYWNoZSBmb3IgcHJvY2Vzc2luZyBhIHNpbmdsZSBlbnRyeS1wb2ludC4gVGhpcyBleGlzdHMgdG8gc2hhcmUgYHRzLlNvdXJjZUZpbGVgcyBiZXR3ZWVuIHRoZVxuICogc291cmNlIGFuZCB0eXBpbmcgcHJvZ3JhbXMgdGhhdCBhcmUgY3JlYXRlZCBmb3IgYSBzaW5nbGUgcHJvZ3JhbS5cbiAqL1xuZXhwb3J0IGNsYXNzIEVudHJ5UG9pbnRGaWxlQ2FjaGUge1xuICBwcml2YXRlIHJlYWRvbmx5IHNmQ2FjaGUgPSBuZXcgTWFwPEFic29sdXRlRnNQYXRoLCB0cy5Tb3VyY2VGaWxlPigpO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZnM6IFJlYWRvbmx5RmlsZVN5c3RlbSwgcHJpdmF0ZSBzaGFyZWRGaWxlQ2FjaGU6IFNoYXJlZEZpbGVDYWNoZSkge31cblxuICAvKipcbiAgICogUmV0dXJucyBhbmQgY2FjaGVzIGEgcGFyc2VkIGB0cy5Tb3VyY2VGaWxlYCBmb3IgdGhlIHByb3ZpZGVkIGBmaWxlTmFtZWAuIElmIHRoZSBgZmlsZU5hbWVgIGlzXG4gICAqIGNhY2hlZCBpbiB0aGUgc2hhcmVkIGZpbGUgY2FjaGUsIHRoYXQgcmVzdWx0IGlzIHVzZWQuIE90aGVyd2lzZSwgdGhlIHNvdXJjZSBmaWxlIGlzIGNhY2hlZFxuICAgKiBpbnRlcm5hbGx5LiBUaGlzIG1ldGhvZCByZXR1cm5zIGB1bmRlZmluZWRgIGlmIHRoZSByZXF1ZXN0ZWQgZmlsZSBkb2VzIG5vdCBleGlzdC5cbiAgICpcbiAgICogQHBhcmFtIGZpbGVOYW1lIFRoZSBwYXRoIG9mIHRoZSBmaWxlIHRvIHJldHJpZXZlIGEgc291cmNlIGZpbGUgZm9yLlxuICAgKiBAcGFyYW0gbGFuZ3VhZ2VWZXJzaW9uIFRoZSBsYW5ndWFnZSB2ZXJzaW9uIHRvIHVzZSBmb3IgcGFyc2luZyB0aGUgZmlsZS5cbiAgICovXG4gIGdldENhY2hlZFNvdXJjZUZpbGUoZmlsZU5hbWU6IHN0cmluZywgbGFuZ3VhZ2VWZXJzaW9uOiB0cy5TY3JpcHRUYXJnZXQpOiB0cy5Tb3VyY2VGaWxlfHVuZGVmaW5lZCB7XG4gICAgY29uc3Qgc3RhdGljU2YgPSB0aGlzLnNoYXJlZEZpbGVDYWNoZS5nZXRDYWNoZWRTb3VyY2VGaWxlKGZpbGVOYW1lKTtcbiAgICBpZiAoc3RhdGljU2YgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHN0YXRpY1NmO1xuICAgIH1cblxuICAgIGNvbnN0IGFic1BhdGggPSB0aGlzLmZzLnJlc29sdmUoZmlsZU5hbWUpO1xuICAgIGlmICh0aGlzLnNmQ2FjaGUuaGFzKGFic1BhdGgpKSB7XG4gICAgICByZXR1cm4gdGhpcy5zZkNhY2hlLmdldChhYnNQYXRoKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb250ZW50ID0gcmVhZEZpbGUoYWJzUGF0aCwgdGhpcy5mcyk7XG4gICAgaWYgKGNvbnRlbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3Qgc2YgPSB0cy5jcmVhdGVTb3VyY2VGaWxlKGZpbGVOYW1lLCBjb250ZW50LCBsYW5ndWFnZVZlcnNpb24pO1xuICAgIHRoaXMuc2ZDYWNoZS5zZXQoYWJzUGF0aCwgc2YpO1xuICAgIHJldHVybiBzZjtcbiAgfVxufVxuXG5mdW5jdGlvbiByZWFkRmlsZShhYnNQYXRoOiBBYnNvbHV0ZUZzUGF0aCwgZnM6IFJlYWRvbmx5RmlsZVN5c3RlbSk6IHN0cmluZ3x1bmRlZmluZWQge1xuICBpZiAoIWZzLmV4aXN0cyhhYnNQYXRoKSB8fCAhZnMuc3RhdChhYnNQYXRoKS5pc0ZpbGUoKSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIGZzLnJlYWRGaWxlKGFic1BhdGgpO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBgdHMuTW9kdWxlUmVzb2x1dGlvbkNhY2hlYCB0aGF0IHVzZXMgdGhlIHByb3ZpZGVkIGZpbGVzeXN0ZW0gZm9yIHBhdGggb3BlcmF0aW9ucy5cbiAqXG4gKiBAcGFyYW0gZnMgVGhlIGZpbGVzeXN0ZW0gdG8gdXNlIGZvciBwYXRoIG9wZXJhdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVNb2R1bGVSZXNvbHV0aW9uQ2FjaGUoZnM6IFJlYWRvbmx5RmlsZVN5c3RlbSk6IHRzLk1vZHVsZVJlc29sdXRpb25DYWNoZSB7XG4gIHJldHVybiB0cy5jcmVhdGVNb2R1bGVSZXNvbHV0aW9uQ2FjaGUoZnMucHdkKCksIGZpbGVOYW1lID0+IHtcbiAgICByZXR1cm4gZnMuaXNDYXNlU2Vuc2l0aXZlKCkgPyBmaWxlTmFtZSA6IGZpbGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gIH0pO1xufVxuIl19
Note: See TracBrowser for help on using the repository browser.