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/linker/src/file_linker/partial_linkers/partial_linker_selector", ["require", "exports", "tslib", "semver", "@angular/compiler-cli/linker/src/file_linker/get_source_file", "@angular/compiler-cli/linker/src/file_linker/partial_linkers/partial_class_metadata_linker_1", "@angular/compiler-cli/linker/src/file_linker/partial_linkers/partial_component_linker_1", "@angular/compiler-cli/linker/src/file_linker/partial_linkers/partial_directive_linker_1", "@angular/compiler-cli/linker/src/file_linker/partial_linkers/partial_factory_linker_1", "@angular/compiler-cli/linker/src/file_linker/partial_linkers/partial_injectable_linker_1", "@angular/compiler-cli/linker/src/file_linker/partial_linkers/partial_injector_linker_1", "@angular/compiler-cli/linker/src/file_linker/partial_linkers/partial_ng_module_linker_1", "@angular/compiler-cli/linker/src/file_linker/partial_linkers/partial_pipe_linker_1"], factory);
|
---|
8 | }
|
---|
9 | })(function (require, exports) {
|
---|
10 | "use strict";
|
---|
11 | Object.defineProperty(exports, "__esModule", { value: true });
|
---|
12 | exports.PartialLinkerSelector = exports.createLinkerMap = exports.declarationFunctions = exports.ɵɵngDeclarePipe = exports.ɵɵngDeclareNgModule = exports.ɵɵngDeclareInjector = exports.ɵɵngDeclareInjectable = exports.ɵɵngDeclareFactory = exports.ɵɵngDeclareComponent = exports.ɵɵngDeclareClassMetadata = exports.ɵɵngDeclareDirective = void 0;
|
---|
13 | var tslib_1 = require("tslib");
|
---|
14 | /**
|
---|
15 | * @license
|
---|
16 | * Copyright Google LLC All Rights Reserved.
|
---|
17 | *
|
---|
18 | * Use of this source code is governed by an MIT-style license that can be
|
---|
19 | * found in the LICENSE file at https://angular.io/license
|
---|
20 | */
|
---|
21 | var semver_1 = require("semver");
|
---|
22 | var get_source_file_1 = require("@angular/compiler-cli/linker/src/file_linker/get_source_file");
|
---|
23 | var partial_class_metadata_linker_1_1 = require("@angular/compiler-cli/linker/src/file_linker/partial_linkers/partial_class_metadata_linker_1");
|
---|
24 | var partial_component_linker_1_1 = require("@angular/compiler-cli/linker/src/file_linker/partial_linkers/partial_component_linker_1");
|
---|
25 | var partial_directive_linker_1_1 = require("@angular/compiler-cli/linker/src/file_linker/partial_linkers/partial_directive_linker_1");
|
---|
26 | var partial_factory_linker_1_1 = require("@angular/compiler-cli/linker/src/file_linker/partial_linkers/partial_factory_linker_1");
|
---|
27 | var partial_injectable_linker_1_1 = require("@angular/compiler-cli/linker/src/file_linker/partial_linkers/partial_injectable_linker_1");
|
---|
28 | var partial_injector_linker_1_1 = require("@angular/compiler-cli/linker/src/file_linker/partial_linkers/partial_injector_linker_1");
|
---|
29 | var partial_ng_module_linker_1_1 = require("@angular/compiler-cli/linker/src/file_linker/partial_linkers/partial_ng_module_linker_1");
|
---|
30 | var partial_pipe_linker_1_1 = require("@angular/compiler-cli/linker/src/file_linker/partial_linkers/partial_pipe_linker_1");
|
---|
31 | exports.ɵɵngDeclareDirective = 'ɵɵngDeclareDirective';
|
---|
32 | exports.ɵɵngDeclareClassMetadata = 'ɵɵngDeclareClassMetadata';
|
---|
33 | exports.ɵɵngDeclareComponent = 'ɵɵngDeclareComponent';
|
---|
34 | exports.ɵɵngDeclareFactory = 'ɵɵngDeclareFactory';
|
---|
35 | exports.ɵɵngDeclareInjectable = 'ɵɵngDeclareInjectable';
|
---|
36 | exports.ɵɵngDeclareInjector = 'ɵɵngDeclareInjector';
|
---|
37 | exports.ɵɵngDeclareNgModule = 'ɵɵngDeclareNgModule';
|
---|
38 | exports.ɵɵngDeclarePipe = 'ɵɵngDeclarePipe';
|
---|
39 | exports.declarationFunctions = [
|
---|
40 | exports.ɵɵngDeclareDirective, exports.ɵɵngDeclareClassMetadata, exports.ɵɵngDeclareComponent, exports.ɵɵngDeclareFactory,
|
---|
41 | exports.ɵɵngDeclareInjectable, exports.ɵɵngDeclareInjector, exports.ɵɵngDeclareNgModule, exports.ɵɵngDeclarePipe
|
---|
42 | ];
|
---|
43 | /**
|
---|
44 | * Create a mapping between partial-declaration call name and collections of partial-linkers.
|
---|
45 | *
|
---|
46 | * Each collection of partial-linkers will contain a version range that will be matched against the
|
---|
47 | * `minVersion` of the partial-declaration. (Additionally, a partial-linker may modify its behaviour
|
---|
48 | * internally based on the `version` property of the declaration.)
|
---|
49 | *
|
---|
50 | * Versions should be sorted in ascending order. The most recent partial-linker will be used as the
|
---|
51 | * fallback linker if none of the other version ranges match. For example:
|
---|
52 | *
|
---|
53 | * ```
|
---|
54 | * {range: getRange('<=', '13.0.0'), linker PartialDirectiveLinkerVersion2(...) },
|
---|
55 | * {range: getRange('<=', '13.1.0'), linker PartialDirectiveLinkerVersion3(...) },
|
---|
56 | * {range: getRange('<=', '14.0.0'), linker PartialDirectiveLinkerVersion4(...) },
|
---|
57 | * {range: LATEST_VERSION_RANGE, linker: new PartialDirectiveLinkerVersion1(...)},
|
---|
58 | * ```
|
---|
59 | *
|
---|
60 | * If the `LATEST_VERSION_RANGE` is `<=15.0.0` then the fallback linker would be
|
---|
61 | * `PartialDirectiveLinkerVersion1` for any version greater than `15.0.0`.
|
---|
62 | *
|
---|
63 | * When there is a change to a declaration interface that requires a new partial-linker, the
|
---|
64 | * `minVersion` of the partial-declaration should be updated, the new linker implementation should
|
---|
65 | * be added to the end of the collection, and the version of the previous linker should be updated.
|
---|
66 | */
|
---|
67 | function createLinkerMap(environment, sourceUrl, code) {
|
---|
68 | var linkers = new Map();
|
---|
69 | var LATEST_VERSION_RANGE = getRange('<=', '12.2.9');
|
---|
70 | linkers.set(exports.ɵɵngDeclareDirective, [
|
---|
71 | { range: LATEST_VERSION_RANGE, linker: new partial_directive_linker_1_1.PartialDirectiveLinkerVersion1(sourceUrl, code) },
|
---|
72 | ]);
|
---|
73 | linkers.set(exports.ɵɵngDeclareClassMetadata, [
|
---|
74 | { range: LATEST_VERSION_RANGE, linker: new partial_class_metadata_linker_1_1.PartialClassMetadataLinkerVersion1() },
|
---|
75 | ]);
|
---|
76 | linkers.set(exports.ɵɵngDeclareComponent, [
|
---|
77 | {
|
---|
78 | range: LATEST_VERSION_RANGE,
|
---|
79 | linker: new partial_component_linker_1_1.PartialComponentLinkerVersion1(get_source_file_1.createGetSourceFile(sourceUrl, code, environment.sourceFileLoader), sourceUrl, code)
|
---|
80 | },
|
---|
81 | ]);
|
---|
82 | linkers.set(exports.ɵɵngDeclareFactory, [
|
---|
83 | { range: LATEST_VERSION_RANGE, linker: new partial_factory_linker_1_1.PartialFactoryLinkerVersion1() },
|
---|
84 | ]);
|
---|
85 | linkers.set(exports.ɵɵngDeclareInjectable, [
|
---|
86 | { range: LATEST_VERSION_RANGE, linker: new partial_injectable_linker_1_1.PartialInjectableLinkerVersion1() },
|
---|
87 | ]);
|
---|
88 | linkers.set(exports.ɵɵngDeclareInjector, [
|
---|
89 | { range: LATEST_VERSION_RANGE, linker: new partial_injector_linker_1_1.PartialInjectorLinkerVersion1() },
|
---|
90 | ]);
|
---|
91 | linkers.set(exports.ɵɵngDeclareNgModule, [
|
---|
92 | {
|
---|
93 | range: LATEST_VERSION_RANGE,
|
---|
94 | linker: new partial_ng_module_linker_1_1.PartialNgModuleLinkerVersion1(environment.options.linkerJitMode)
|
---|
95 | },
|
---|
96 | ]);
|
---|
97 | linkers.set(exports.ɵɵngDeclarePipe, [
|
---|
98 | { range: LATEST_VERSION_RANGE, linker: new partial_pipe_linker_1_1.PartialPipeLinkerVersion1() },
|
---|
99 | ]);
|
---|
100 | return linkers;
|
---|
101 | }
|
---|
102 | exports.createLinkerMap = createLinkerMap;
|
---|
103 | /**
|
---|
104 | * A helper that selects the appropriate `PartialLinker` for a given declaration.
|
---|
105 | *
|
---|
106 | * The selection is made from a database of linker instances, chosen if their given semver range
|
---|
107 | * satisfies the `minVersion` of the partial declaration to be linked.
|
---|
108 | *
|
---|
109 | * Note that the ranges are checked in order, and the first matching range will be selected. So
|
---|
110 | * ranges should be most restrictive first. In practice, since ranges are always `<=X.Y.Z` this
|
---|
111 | * means that ranges should be in ascending order.
|
---|
112 | *
|
---|
113 | * Note that any "pre-release" versions are stripped from ranges. Therefore if a `minVersion` is
|
---|
114 | * `11.1.0-next.1` then this would match `11.1.0-next.2` and also `12.0.0-next.1`. (This is
|
---|
115 | * different to standard semver range checking, where pre-release versions do not cross full version
|
---|
116 | * boundaries.)
|
---|
117 | */
|
---|
118 | var PartialLinkerSelector = /** @class */ (function () {
|
---|
119 | function PartialLinkerSelector(linkers, logger, unknownDeclarationVersionHandling) {
|
---|
120 | this.linkers = linkers;
|
---|
121 | this.logger = logger;
|
---|
122 | this.unknownDeclarationVersionHandling = unknownDeclarationVersionHandling;
|
---|
123 | }
|
---|
124 | /**
|
---|
125 | * Returns true if there are `PartialLinker` classes that can handle functions with this name.
|
---|
126 | */
|
---|
127 | PartialLinkerSelector.prototype.supportsDeclaration = function (functionName) {
|
---|
128 | return this.linkers.has(functionName);
|
---|
129 | };
|
---|
130 | /**
|
---|
131 | * Returns the `PartialLinker` that can handle functions with the given name and version.
|
---|
132 | * Throws an error if there is none.
|
---|
133 | */
|
---|
134 | PartialLinkerSelector.prototype.getLinker = function (functionName, minVersion, version) {
|
---|
135 | var e_1, _a;
|
---|
136 | if (!this.linkers.has(functionName)) {
|
---|
137 | throw new Error("Unknown partial declaration function " + functionName + ".");
|
---|
138 | }
|
---|
139 | var linkerRanges = this.linkers.get(functionName);
|
---|
140 | if (version === '12.2.9') {
|
---|
141 | // Special case if the `version` is the same as the current compiler version.
|
---|
142 | // This helps with compliance tests where the version placeholders have not been replaced.
|
---|
143 | return linkerRanges[linkerRanges.length - 1].linker;
|
---|
144 | }
|
---|
145 | var declarationRange = getRange('>=', minVersion);
|
---|
146 | try {
|
---|
147 | for (var linkerRanges_1 = tslib_1.__values(linkerRanges), linkerRanges_1_1 = linkerRanges_1.next(); !linkerRanges_1_1.done; linkerRanges_1_1 = linkerRanges_1.next()) {
|
---|
148 | var _b = linkerRanges_1_1.value, linkerRange = _b.range, linker = _b.linker;
|
---|
149 | if (semver_1.intersects(declarationRange, linkerRange)) {
|
---|
150 | return linker;
|
---|
151 | }
|
---|
152 | }
|
---|
153 | }
|
---|
154 | catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
---|
155 | finally {
|
---|
156 | try {
|
---|
157 | if (linkerRanges_1_1 && !linkerRanges_1_1.done && (_a = linkerRanges_1.return)) _a.call(linkerRanges_1);
|
---|
158 | }
|
---|
159 | finally { if (e_1) throw e_1.error; }
|
---|
160 | }
|
---|
161 | var message = "This application depends upon a library published using Angular version " + version + ", " +
|
---|
162 | ("which requires Angular version " + minVersion + " or newer to work correctly.\n") +
|
---|
163 | "Consider upgrading your application to use a more recent version of Angular.";
|
---|
164 | if (this.unknownDeclarationVersionHandling === 'error') {
|
---|
165 | throw new Error(message);
|
---|
166 | }
|
---|
167 | else if (this.unknownDeclarationVersionHandling === 'warn') {
|
---|
168 | this.logger.warn(message + "\nAttempting to continue using this version of Angular.");
|
---|
169 | }
|
---|
170 | // No linker was matched for this declaration, so just use the most recent one.
|
---|
171 | return linkerRanges[linkerRanges.length - 1].linker;
|
---|
172 | };
|
---|
173 | return PartialLinkerSelector;
|
---|
174 | }());
|
---|
175 | exports.PartialLinkerSelector = PartialLinkerSelector;
|
---|
176 | /**
|
---|
177 | * Compute a semver Range from the `version` and comparator.
|
---|
178 | *
|
---|
179 | * The range is computed as any version greater/less than or equal to the given `versionStr`
|
---|
180 | * depending upon the `comparator` (ignoring any prerelease versions).
|
---|
181 | *
|
---|
182 | * @param comparator a string that determines whether the version specifies a minimum or a maximum
|
---|
183 | * range.
|
---|
184 | * @param versionStr the version given in the partial declaration
|
---|
185 | * @returns A semver range for the provided `version` and comparator.
|
---|
186 | */
|
---|
187 | function getRange(comparator, versionStr) {
|
---|
188 | var version = new semver_1.SemVer(versionStr);
|
---|
189 | // Wipe out any prerelease versions
|
---|
190 | version.prerelease = [];
|
---|
191 | return new semver_1.Range("" + comparator + version.format());
|
---|
192 | }
|
---|
193 | });
|
---|
194 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFydGlhbF9saW5rZXJfc2VsZWN0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21waWxlci1jbGkvbGlua2VyL3NyYy9maWxlX2xpbmtlci9wYXJ0aWFsX2xpbmtlcnMvcGFydGlhbF9saW5rZXJfc2VsZWN0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztJQUFBOzs7Ozs7T0FNRztJQUNILGlDQUFpRDtJQUlqRCxnR0FBdUQ7SUFHdkQsZ0pBQXFGO0lBQ3JGLHNJQUE0RTtJQUM1RSxzSUFBNEU7SUFDNUUsa0lBQXdFO0lBQ3hFLHdJQUE4RTtJQUM5RSxvSUFBMEU7SUFFMUUsc0lBQTJFO0lBQzNFLDRIQUFrRTtJQUVyRCxRQUFBLG9CQUFvQixHQUFHLHNCQUFzQixDQUFDO0lBQzlDLFFBQUEsd0JBQXdCLEdBQUcsMEJBQTBCLENBQUM7SUFDdEQsUUFBQSxvQkFBb0IsR0FBRyxzQkFBc0IsQ0FBQztJQUM5QyxRQUFBLGtCQUFrQixHQUFHLG9CQUFvQixDQUFDO0lBQzFDLFFBQUEscUJBQXFCLEdBQUcsdUJBQXVCLENBQUM7SUFDaEQsUUFBQSxtQkFBbUIsR0FBRyxxQkFBcUIsQ0FBQztJQUM1QyxRQUFBLG1CQUFtQixHQUFHLHFCQUFxQixDQUFDO0lBQzVDLFFBQUEsZUFBZSxHQUFHLGlCQUFpQixDQUFDO0lBQ3BDLFFBQUEsb0JBQW9CLEdBQUc7UUFDbEMsNEJBQW9CLEVBQUUsZ0NBQXdCLEVBQUUsNEJBQW9CLEVBQUUsMEJBQWtCO1FBQ3hGLDZCQUFxQixFQUFFLDJCQUFtQixFQUFFLDJCQUFtQixFQUFFLHVCQUFlO0tBQ2pGLENBQUM7SUFPRjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0F1Qkc7SUFDSCxTQUFnQixlQUFlLENBQzNCLFdBQXVELEVBQUUsU0FBeUIsRUFDbEYsSUFBWTtRQUNkLElBQU0sT0FBTyxHQUFHLElBQUksR0FBRyxFQUFzQyxDQUFDO1FBQzlELElBQU0sb0JBQW9CLEdBQUcsUUFBUSxDQUFDLElBQUksRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1FBRWpFLE9BQU8sQ0FBQyxHQUFHLENBQUMsNEJBQW9CLEVBQUU7WUFDaEMsRUFBQyxLQUFLLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxFQUFFLElBQUksMkRBQThCLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxFQUFDO1NBQzNGLENBQUMsQ0FBQztRQUNILE9BQU8sQ0FBQyxHQUFHLENBQUMsZ0NBQXdCLEVBQUU7WUFDcEMsRUFBQyxLQUFLLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxFQUFFLElBQUksb0VBQWtDLEVBQUUsRUFBQztTQUNoRixDQUFDLENBQUM7UUFDSCxPQUFPLENBQUMsR0FBRyxDQUFDLDRCQUFvQixFQUFFO1lBQ2hDO2dCQUNFLEtBQUssRUFBRSxvQkFBb0I7Z0JBQzNCLE1BQU0sRUFBRSxJQUFJLDJEQUE4QixDQUN0QyxxQ0FBbUIsQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUM7YUFDekY7U0FDRixDQUFDLENBQUM7UUFDSCxPQUFPLENBQUMsR0FBRyxDQUFDLDBCQUFrQixFQUFFO1lBQzlCLEVBQUMsS0FBSyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sRUFBRSxJQUFJLHVEQUE0QixFQUFFLEVBQUM7U0FDMUUsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxDQUFDLEdBQUcsQ0FBQyw2QkFBcUIsRUFBRTtZQUNqQyxFQUFDLEtBQUssRUFBRSxvQkFBb0IsRUFBRSxNQUFNLEVBQUUsSUFBSSw2REFBK0IsRUFBRSxFQUFDO1NBQzdFLENBQUMsQ0FBQztRQUNILE9BQU8sQ0FBQyxHQUFHLENBQUMsMkJBQW1CLEVBQUU7WUFDL0IsRUFBQyxLQUFLLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxFQUFFLElBQUkseURBQTZCLEVBQUUsRUFBQztTQUMzRSxDQUFDLENBQUM7UUFDSCxPQUFPLENBQUMsR0FBRyxDQUFDLDJCQUFtQixFQUFFO1lBQy9CO2dCQUNFLEtBQUssRUFBRSxvQkFBb0I7Z0JBQzNCLE1BQU0sRUFBRSxJQUFJLDBEQUE2QixDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDO2FBQzdFO1NBQ0YsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxDQUFDLEdBQUcsQ0FBQyx1QkFBZSxFQUFFO1lBQzNCLEVBQUMsS0FBSyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sRUFBRSxJQUFJLGlEQUF5QixFQUFFLEVBQUM7U0FDdkUsQ0FBQyxDQUFDO1FBRUgsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQXZDRCwwQ0F1Q0M7SUFFRDs7Ozs7Ozs7Ozs7Ozs7T0FjRztJQUNIO1FBQ0UsK0JBQ3FCLE9BQWdELEVBQ2hELE1BQWMsRUFDZCxpQ0FBMEQ7WUFGMUQsWUFBTyxHQUFQLE9BQU8sQ0FBeUM7WUFDaEQsV0FBTSxHQUFOLE1BQU0sQ0FBUTtZQUNkLHNDQUFpQyxHQUFqQyxpQ0FBaUMsQ0FBeUI7UUFBRyxDQUFDO1FBRW5GOztXQUVHO1FBQ0gsbURBQW1CLEdBQW5CLFVBQW9CLFlBQW9CO1lBQ3RDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDeEMsQ0FBQztRQUVEOzs7V0FHRztRQUNILHlDQUFTLEdBQVQsVUFBVSxZQUFvQixFQUFFLFVBQWtCLEVBQUUsT0FBZTs7WUFDakUsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxFQUFFO2dCQUNuQyxNQUFNLElBQUksS0FBSyxDQUFDLDBDQUF3QyxZQUFZLE1BQUcsQ0FBQyxDQUFDO2FBQzFFO1lBQ0QsSUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFFLENBQUM7WUFFckQsSUFBSSxPQUFPLEtBQUssbUJBQW1CLEVBQUU7Z0JBQ25DLDZFQUE2RTtnQkFDN0UsMEZBQTBGO2dCQUMxRixPQUFPLFlBQVksQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQzthQUNyRDtZQUVELElBQU0sZ0JBQWdCLEdBQUcsUUFBUSxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQzs7Z0JBQ3BELEtBQTJDLElBQUEsaUJBQUEsaUJBQUEsWUFBWSxDQUFBLDBDQUFBLG9FQUFFO29CQUE5QyxJQUFBLDJCQUE0QixFQUFwQixXQUFXLFdBQUEsRUFBRSxNQUFNLFlBQUE7b0JBQ3BDLElBQUksbUJBQVUsQ0FBQyxnQkFBZ0IsRUFBRSxXQUFXLENBQUMsRUFBRTt3QkFDN0MsT0FBTyxNQUFNLENBQUM7cUJBQ2Y7aUJBQ0Y7Ozs7Ozs7OztZQUVELElBQU0sT0FBTyxHQUNULDZFQUEyRSxPQUFPLE9BQUk7aUJBQ3RGLG9DQUFrQyxVQUFVLG1DQUFnQyxDQUFBO2dCQUM1RSw4RUFBOEUsQ0FBQztZQUVuRixJQUFJLElBQUksQ0FBQyxpQ0FBaUMsS0FBSyxPQUFPLEVBQUU7Z0JBQ3RELE1BQU0sSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7YUFDMUI7aUJBQU0sSUFBSSxJQUFJLENBQUMsaUNBQWlDLEtBQUssTUFBTSxFQUFFO2dCQUM1RCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBSSxPQUFPLDREQUF5RCxDQUFDLENBQUM7YUFDdkY7WUFFRCwrRUFBK0U7WUFDL0UsT0FBTyxZQUFZLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFDdEQsQ0FBQztRQUNILDRCQUFDO0lBQUQsQ0FBQyxBQWxERCxJQWtEQztJQWxEWSxzREFBcUI7SUFvRGxDOzs7Ozs7Ozs7O09BVUc7SUFDSCxTQUFTLFFBQVEsQ0FBQyxVQUFxQixFQUFFLFVBQWtCO1FBQ3pELElBQU0sT0FBTyxHQUFHLElBQUksZUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3ZDLG1DQUFtQztRQUNuQyxPQUFPLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQztRQUN4QixPQUFPLElBQUksY0FBSyxDQUFDLEtBQUcsVUFBVSxHQUFHLE9BQU8sQ0FBQyxNQUFNLEVBQUksQ0FBQyxDQUFDO0lBQ3ZELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbmltcG9ydCB7aW50ZXJzZWN0cywgUmFuZ2UsIFNlbVZlcn0gZnJvbSAnc2VtdmVyJztcblxuaW1wb3J0IHtBYnNvbHV0ZUZzUGF0aH0gZnJvbSAnLi4vLi4vLi4vLi4vc3JjL25ndHNjL2ZpbGVfc3lzdGVtJztcbmltcG9ydCB7TG9nZ2VyfSBmcm9tICcuLi8uLi8uLi8uLi9zcmMvbmd0c2MvbG9nZ2luZyc7XG5pbXBvcnQge2NyZWF0ZUdldFNvdXJjZUZpbGV9IGZyb20gJy4uL2dldF9zb3VyY2VfZmlsZSc7XG5pbXBvcnQge0xpbmtlckVudmlyb25tZW50fSBmcm9tICcuLi9saW5rZXJfZW52aXJvbm1lbnQnO1xuXG5pbXBvcnQge1BhcnRpYWxDbGFzc01ldGFkYXRhTGlua2VyVmVyc2lvbjF9IGZyb20gJy4vcGFydGlhbF9jbGFzc19tZXRhZGF0YV9saW5rZXJfMSc7XG5pbXBvcnQge1BhcnRpYWxDb21wb25lbnRMaW5rZXJWZXJzaW9uMX0gZnJvbSAnLi9wYXJ0aWFsX2NvbXBvbmVudF9saW5rZXJfMSc7XG5pbXBvcnQge1BhcnRpYWxEaXJlY3RpdmVMaW5rZXJWZXJzaW9uMX0gZnJvbSAnLi9wYXJ0aWFsX2RpcmVjdGl2ZV9saW5rZXJfMSc7XG5pbXBvcnQge1BhcnRpYWxGYWN0b3J5TGlua2VyVmVyc2lvbjF9IGZyb20gJy4vcGFydGlhbF9mYWN0b3J5X2xpbmtlcl8xJztcbmltcG9ydCB7UGFydGlhbEluamVjdGFibGVMaW5rZXJWZXJzaW9uMX0gZnJvbSAnLi9wYXJ0aWFsX2luamVjdGFibGVfbGlua2VyXzEnO1xuaW1wb3J0IHtQYXJ0aWFsSW5qZWN0b3JMaW5rZXJWZXJzaW9uMX0gZnJvbSAnLi9wYXJ0aWFsX2luamVjdG9yX2xpbmtlcl8xJztcbmltcG9ydCB7UGFydGlhbExpbmtlcn0gZnJvbSAnLi9wYXJ0aWFsX2xpbmtlcic7XG5pbXBvcnQge1BhcnRpYWxOZ01vZHVsZUxpbmtlclZlcnNpb24xfSBmcm9tICcuL3BhcnRpYWxfbmdfbW9kdWxlX2xpbmtlcl8xJztcbmltcG9ydCB7UGFydGlhbFBpcGVMaW5rZXJWZXJzaW9uMX0gZnJvbSAnLi9wYXJ0aWFsX3BpcGVfbGlua2VyXzEnO1xuXG5leHBvcnQgY29uc3QgybXJtW5nRGVjbGFyZURpcmVjdGl2ZSA9ICfJtcm1bmdEZWNsYXJlRGlyZWN0aXZlJztcbmV4cG9ydCBjb25zdCDJtcm1bmdEZWNsYXJlQ2xhc3NNZXRhZGF0YSA9ICfJtcm1bmdEZWNsYXJlQ2xhc3NNZXRhZGF0YSc7XG5leHBvcnQgY29uc3QgybXJtW5nRGVjbGFyZUNvbXBvbmVudCA9ICfJtcm1bmdEZWNsYXJlQ29tcG9uZW50JztcbmV4cG9ydCBjb25zdCDJtcm1bmdEZWNsYXJlRmFjdG9yeSA9ICfJtcm1bmdEZWNsYXJlRmFjdG9yeSc7XG5leHBvcnQgY29uc3QgybXJtW5nRGVjbGFyZUluamVjdGFibGUgPSAnybXJtW5nRGVjbGFyZUluamVjdGFibGUnO1xuZXhwb3J0IGNvbnN0IMm1ybVuZ0RlY2xhcmVJbmplY3RvciA9ICfJtcm1bmdEZWNsYXJlSW5qZWN0b3InO1xuZXhwb3J0IGNvbnN0IMm1ybVuZ0RlY2xhcmVOZ01vZHVsZSA9ICfJtcm1bmdEZWNsYXJlTmdNb2R1bGUnO1xuZXhwb3J0IGNvbnN0IMm1ybVuZ0RlY2xhcmVQaXBlID0gJ8m1ybVuZ0RlY2xhcmVQaXBlJztcbmV4cG9ydCBjb25zdCBkZWNsYXJhdGlvbkZ1bmN0aW9ucyA9IFtcbiAgybXJtW5nRGVjbGFyZURpcmVjdGl2ZSwgybXJtW5nRGVjbGFyZUNsYXNzTWV0YWRhdGEsIMm1ybVuZ0RlY2xhcmVDb21wb25lbnQsIMm1ybVuZ0RlY2xhcmVGYWN0b3J5LFxuICDJtcm1bmdEZWNsYXJlSW5qZWN0YWJsZSwgybXJtW5nRGVjbGFyZUluamVjdG9yLCDJtcm1bmdEZWNsYXJlTmdNb2R1bGUsIMm1ybVuZ0RlY2xhcmVQaXBlXG5dO1xuXG5leHBvcnQgaW50ZXJmYWNlIExpbmtlclJhbmdlPFRFeHByZXNzaW9uPiB7XG4gIHJhbmdlOiBSYW5nZTtcbiAgbGlua2VyOiBQYXJ0aWFsTGlua2VyPFRFeHByZXNzaW9uPjtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBtYXBwaW5nIGJldHdlZW4gcGFydGlhbC1kZWNsYXJhdGlvbiBjYWxsIG5hbWUgYW5kIGNvbGxlY3Rpb25zIG9mIHBhcnRpYWwtbGlua2Vycy5cbiAqXG4gKiBFYWNoIGNvbGxlY3Rpb24gb2YgcGFydGlhbC1saW5rZXJzIHdpbGwgY29udGFpbiBhIHZlcnNpb24gcmFuZ2UgdGhhdCB3aWxsIGJlIG1hdGNoZWQgYWdhaW5zdCB0aGVcbiAqIGBtaW5WZXJzaW9uYCBvZiB0aGUgcGFydGlhbC1kZWNsYXJhdGlvbi4gKEFkZGl0aW9uYWxseSwgYSBwYXJ0aWFsLWxpbmtlciBtYXkgbW9kaWZ5IGl0cyBiZWhhdmlvdXJcbiAqIGludGVybmFsbHkgYmFzZWQgb24gdGhlIGB2ZXJzaW9uYCBwcm9wZXJ0eSBvZiB0aGUgZGVjbGFyYXRpb24uKVxuICpcbiAqIFZlcnNpb25zIHNob3VsZCBiZSBzb3J0ZWQgaW4gYXNjZW5kaW5nIG9yZGVyLiBUaGUgbW9zdCByZWNlbnQgcGFydGlhbC1saW5rZXIgd2lsbCBiZSB1c2VkIGFzIHRoZVxuICogZmFsbGJhY2sgbGlua2VyIGlmIG5vbmUgb2YgdGhlIG90aGVyIHZlcnNpb24gcmFuZ2VzIG1hdGNoLiBGb3IgZXhhbXBsZTpcbiAqXG4gKiBgYGBcbiAqIHtyYW5nZTogZ2V0UmFuZ2UoJzw9JywgJzEzLjAuMCcpLCBsaW5rZXIgUGFydGlhbERpcmVjdGl2ZUxpbmtlclZlcnNpb24yKC4uLikgfSxcbiAqIHtyYW5nZTogZ2V0UmFuZ2UoJzw9JywgJzEzLjEuMCcpLCBsaW5rZXIgUGFydGlhbERpcmVjdGl2ZUxpbmtlclZlcnNpb24zKC4uLikgfSxcbiAqIHtyYW5nZTogZ2V0UmFuZ2UoJzw9JywgJzE0LjAuMCcpLCBsaW5rZXIgUGFydGlhbERpcmVjdGl2ZUxpbmtlclZlcnNpb240KC4uLikgfSxcbiAqIHtyYW5nZTogTEFURVNUX1ZFUlNJT05fUkFOR0UsIGxpbmtlcjogbmV3IFBhcnRpYWxEaXJlY3RpdmVMaW5rZXJWZXJzaW9uMSguLi4pfSxcbiAqIGBgYFxuICpcbiAqIElmIHRoZSBgTEFURVNUX1ZFUlNJT05fUkFOR0VgIGlzIGA8PTE1LjAuMGAgdGhlbiB0aGUgZmFsbGJhY2sgbGlua2VyIHdvdWxkIGJlXG4gKiBgUGFydGlhbERpcmVjdGl2ZUxpbmtlclZlcnNpb24xYCBmb3IgYW55IHZlcnNpb24gZ3JlYXRlciB0aGFuIGAxNS4wLjBgLlxuICpcbiAqIFdoZW4gdGhlcmUgaXMgYSBjaGFuZ2UgdG8gYSBkZWNsYXJhdGlvbiBpbnRlcmZhY2UgdGhhdCByZXF1aXJlcyBhIG5ldyBwYXJ0aWFsLWxpbmtlciwgdGhlXG4gKiBgbWluVmVyc2lvbmAgb2YgdGhlIHBhcnRpYWwtZGVjbGFyYXRpb24gc2hvdWxkIGJlIHVwZGF0ZWQsIHRoZSBuZXcgbGlua2VyIGltcGxlbWVudGF0aW9uIHNob3VsZFxuICogYmUgYWRkZWQgdG8gdGhlIGVuZCBvZiB0aGUgY29sbGVjdGlvbiwgYW5kIHRoZSB2ZXJzaW9uIG9mIHRoZSBwcmV2aW91cyBsaW5rZXIgc2hvdWxkIGJlIHVwZGF0ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVMaW5rZXJNYXA8VFN0YXRlbWVudCwgVEV4cHJlc3Npb24+KFxuICAgIGVudmlyb25tZW50OiBMaW5rZXJFbnZpcm9ubWVudDxUU3RhdGVtZW50LCBURXhwcmVzc2lvbj4sIHNvdXJjZVVybDogQWJzb2x1dGVGc1BhdGgsXG4gICAgY29kZTogc3RyaW5nKTogTWFwPHN0cmluZywgTGlua2VyUmFuZ2U8VEV4cHJlc3Npb24+W10+IHtcbiAgY29uc3QgbGlua2VycyA9IG5ldyBNYXA8c3RyaW5nLCBMaW5rZXJSYW5nZTxURXhwcmVzc2lvbj5bXT4oKTtcbiAgY29uc3QgTEFURVNUX1ZFUlNJT05fUkFOR0UgPSBnZXRSYW5nZSgnPD0nLCAnMC4wLjAtUExBQ0VIT0xERVInKTtcblxuICBsaW5rZXJzLnNldCjJtcm1bmdEZWNsYXJlRGlyZWN0aXZlLCBbXG4gICAge3JhbmdlOiBMQVRFU1RfVkVSU0lPTl9SQU5HRSwgbGlua2VyOiBuZXcgUGFydGlhbERpcmVjdGl2ZUxpbmtlclZlcnNpb24xKHNvdXJjZVVybCwgY29kZSl9LFxuICBdKTtcbiAgbGlua2Vycy5zZXQoybXJtW5nRGVjbGFyZUNsYXNzTWV0YWRhdGEsIFtcbiAgICB7cmFuZ2U6IExBVEVTVF9WRVJTSU9OX1JBTkdFLCBsaW5rZXI6IG5ldyBQYXJ0aWFsQ2xhc3NNZXRhZGF0YUxpbmtlclZlcnNpb24xKCl9LFxuICBdKTtcbiAgbGlua2Vycy5zZXQoybXJtW5nRGVjbGFyZUNvbXBvbmVudCwgW1xuICAgIHtcbiAgICAgIHJhbmdlOiBMQVRFU1RfVkVSU0lPTl9SQU5HRSxcbiAgICAgIGxpbmtlcjogbmV3IFBhcnRpYWxDb21wb25lbnRMaW5rZXJWZXJzaW9uMShcbiAgICAgICAgICBjcmVhdGVHZXRTb3VyY2VGaWxlKHNvdXJjZVVybCwgY29kZSwgZW52aXJvbm1lbnQuc291cmNlRmlsZUxvYWRlciksIHNvdXJjZVVybCwgY29kZSlcbiAgICB9LFxuICBdKTtcbiAgbGlua2Vycy5zZXQoybXJtW5nRGVjbGFyZUZhY3RvcnksIFtcbiAgICB7cmFuZ2U6IExBVEVTVF9WRVJTSU9OX1JBTkdFLCBsaW5rZXI6IG5ldyBQYXJ0aWFsRmFjdG9yeUxpbmtlclZlcnNpb24xKCl9LFxuICBdKTtcbiAgbGlua2Vycy5zZXQoybXJtW5nRGVjbGFyZUluamVjdGFibGUsIFtcbiAgICB7cmFuZ2U6IExBVEVTVF9WRVJTSU9OX1JBTkdFLCBsaW5rZXI6IG5ldyBQYXJ0aWFsSW5qZWN0YWJsZUxpbmtlclZlcnNpb24xKCl9LFxuICBdKTtcbiAgbGlua2Vycy5zZXQoybXJtW5nRGVjbGFyZUluamVjdG9yLCBbXG4gICAge3JhbmdlOiBMQVRFU1RfVkVSU0lPTl9SQU5HRSwgbGlua2VyOiBuZXcgUGFydGlhbEluamVjdG9yTGlua2VyVmVyc2lvbjEoKX0sXG4gIF0pO1xuICBsaW5rZXJzLnNldCjJtcm1bmdEZWNsYXJlTmdNb2R1bGUsIFtcbiAgICB7XG4gICAgICByYW5nZTogTEFURVNUX1ZFUlNJT05fUkFOR0UsXG4gICAgICBsaW5rZXI6IG5ldyBQYXJ0aWFsTmdNb2R1bGVMaW5rZXJWZXJzaW9uMShlbnZpcm9ubWVudC5vcHRpb25zLmxpbmtlckppdE1vZGUpXG4gICAgfSxcbiAgXSk7XG4gIGxpbmtlcnMuc2V0KMm1ybVuZ0RlY2xhcmVQaXBlLCBbXG4gICAge3JhbmdlOiBMQVRFU1RfVkVSU0lPTl9SQU5HRSwgbGlua2VyOiBuZXcgUGFydGlhbFBpcGVMaW5rZXJWZXJzaW9uMSgpfSxcbiAgXSk7XG5cbiAgcmV0dXJuIGxpbmtlcnM7XG59XG5cbi8qKlxuICogQSBoZWxwZXIgdGhhdCBzZWxlY3RzIHRoZSBhcHByb3ByaWF0ZSBgUGFydGlhbExpbmtlcmAgZm9yIGEgZ2l2ZW4gZGVjbGFyYXRpb24uXG4gKlxuICogVGhlIHNlbGVjdGlvbiBpcyBtYWRlIGZyb20gYSBkYXRhYmFzZSBvZiBsaW5rZXIgaW5zdGFuY2VzLCBjaG9zZW4gaWYgdGhlaXIgZ2l2ZW4gc2VtdmVyIHJhbmdlXG4gKiBzYXRpc2ZpZXMgdGhlIGBtaW5WZXJzaW9uYCBvZiB0aGUgcGFydGlhbCBkZWNsYXJhdGlvbiB0byBiZSBsaW5rZWQuXG4gKlxuICogTm90ZSB0aGF0IHRoZSByYW5nZXMgYXJlIGNoZWNrZWQgaW4gb3JkZXIsIGFuZCB0aGUgZmlyc3QgbWF0Y2hpbmcgcmFuZ2Ugd2lsbCBiZSBzZWxlY3RlZC4gU29cbiAqIHJhbmdlcyBzaG91bGQgYmUgbW9zdCByZXN0cmljdGl2ZSBmaXJzdC4gSW4gcHJhY3RpY2UsIHNpbmNlIHJhbmdlcyBhcmUgYWx3YXlzIGA8PVguWS5aYCB0aGlzXG4gKiBtZWFucyB0aGF0IHJhbmdlcyBzaG91bGQgYmUgaW4gYXNjZW5kaW5nIG9yZGVyLlxuICpcbiAqIE5vdGUgdGhhdCBhbnkgXCJwcmUtcmVsZWFzZVwiIHZlcnNpb25zIGFyZSBzdHJpcHBlZCBmcm9tIHJhbmdlcy4gVGhlcmVmb3JlIGlmIGEgYG1pblZlcnNpb25gIGlzXG4gKiBgMTEuMS4wLW5leHQuMWAgdGhlbiB0aGlzIHdvdWxkIG1hdGNoIGAxMS4xLjAtbmV4dC4yYCBhbmQgYWxzbyBgMTIuMC4wLW5leHQuMWAuIChUaGlzIGlzXG4gKiBkaWZmZXJlbnQgdG8gc3RhbmRhcmQgc2VtdmVyIHJhbmdlIGNoZWNraW5nLCB3aGVyZSBwcmUtcmVsZWFzZSB2ZXJzaW9ucyBkbyBub3QgY3Jvc3MgZnVsbCB2ZXJzaW9uXG4gKiBib3VuZGFyaWVzLilcbiAqL1xuZXhwb3J0IGNsYXNzIFBhcnRpYWxMaW5rZXJTZWxlY3RvcjxURXhwcmVzc2lvbj4ge1xuICBjb25zdHJ1Y3RvcihcbiAgICAgIHByaXZhdGUgcmVhZG9ubHkgbGlua2VyczogTWFwPHN0cmluZywgTGlua2VyUmFuZ2U8VEV4cHJlc3Npb24+W10+LFxuICAgICAgcHJpdmF0ZSByZWFkb25seSBsb2dnZXI6IExvZ2dlcixcbiAgICAgIHByaXZhdGUgcmVhZG9ubHkgdW5rbm93bkRlY2xhcmF0aW9uVmVyc2lvbkhhbmRsaW5nOiAnaWdub3JlJ3wnd2Fybid8J2Vycm9yJykge31cblxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZXJlIGFyZSBgUGFydGlhbExpbmtlcmAgY2xhc3NlcyB0aGF0IGNhbiBoYW5kbGUgZnVuY3Rpb25zIHdpdGggdGhpcyBuYW1lLlxuICAgKi9cbiAgc3VwcG9ydHNEZWNsYXJhdGlvbihmdW5jdGlvbk5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmxpbmtlcnMuaGFzKGZ1bmN0aW9uTmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgYFBhcnRpYWxMaW5rZXJgIHRoYXQgY2FuIGhhbmRsZSBmdW5jdGlvbnMgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBhbmQgdmVyc2lvbi5cbiAgICogVGhyb3dzIGFuIGVycm9yIGlmIHRoZXJlIGlzIG5vbmUuXG4gICAqL1xuICBnZXRMaW5rZXIoZnVuY3Rpb25OYW1lOiBzdHJpbmcsIG1pblZlcnNpb246IHN0cmluZywgdmVyc2lvbjogc3RyaW5nKTogUGFydGlhbExpbmtlcjxURXhwcmVzc2lvbj4ge1xuICAgIGlmICghdGhpcy5saW5rZXJzLmhhcyhmdW5jdGlvbk5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gcGFydGlhbCBkZWNsYXJhdGlvbiBmdW5jdGlvbiAke2Z1bmN0aW9uTmFtZX0uYCk7XG4gICAgfVxuICAgIGNvbnN0IGxpbmtlclJhbmdlcyA9IHRoaXMubGlua2Vycy5nZXQoZnVuY3Rpb25OYW1lKSE7XG5cbiAgICBpZiAodmVyc2lvbiA9PT0gJzAuMC4wLVBMQUNFSE9MREVSJykge1xuICAgICAgLy8gU3BlY2lhbCBjYXNlIGlmIHRoZSBgdmVyc2lvbmAgaXMgdGhlIHNhbWUgYXMgdGhlIGN1cnJlbnQgY29tcGlsZXIgdmVyc2lvbi5cbiAgICAgIC8vIFRoaXMgaGVscHMgd2l0aCBjb21wbGlhbmNlIHRlc3RzIHdoZXJlIHRoZSB2ZXJzaW9uIHBsYWNlaG9sZGVycyBoYXZlIG5vdCBiZWVuIHJlcGxhY2VkLlxuICAgICAgcmV0dXJuIGxpbmtlclJhbmdlc1tsaW5rZXJSYW5nZXMubGVuZ3RoIC0gMV0ubGlua2VyO1xuICAgIH1cblxuICAgIGNvbnN0IGRlY2xhcmF0aW9uUmFuZ2UgPSBnZXRSYW5nZSgnPj0nLCBtaW5WZXJzaW9uKTtcbiAgICBmb3IgKGNvbnN0IHtyYW5nZTogbGlua2VyUmFuZ2UsIGxpbmtlcn0gb2YgbGlua2VyUmFuZ2VzKSB7XG4gICAgICBpZiAoaW50ZXJzZWN0cyhkZWNsYXJhdGlvblJhbmdlLCBsaW5rZXJSYW5nZSkpIHtcbiAgICAgICAgcmV0dXJuIGxpbmtlcjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBtZXNzYWdlID1cbiAgICAgICAgYFRoaXMgYXBwbGljYXRpb24gZGVwZW5kcyB1cG9uIGEgbGlicmFyeSBwdWJsaXNoZWQgdXNpbmcgQW5ndWxhciB2ZXJzaW9uICR7dmVyc2lvbn0sIGAgK1xuICAgICAgICBgd2hpY2ggcmVxdWlyZXMgQW5ndWxhciB2ZXJzaW9uICR7bWluVmVyc2lvbn0gb3IgbmV3ZXIgdG8gd29yayBjb3JyZWN0bHkuXFxuYCArXG4gICAgICAgIGBDb25zaWRlciB1cGdyYWRpbmcgeW91ciBhcHBsaWNhdGlvbiB0byB1c2UgYSBtb3JlIHJlY2VudCB2ZXJzaW9uIG9mIEFuZ3VsYXIuYDtcblxuICAgIGlmICh0aGlzLnVua25vd25EZWNsYXJhdGlvblZlcnNpb25IYW5kbGluZyA9PT0gJ2Vycm9yJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgIH0gZWxzZSBpZiAodGhpcy51bmtub3duRGVjbGFyYXRpb25WZXJzaW9uSGFuZGxpbmcgPT09ICd3YXJuJykge1xuICAgICAgdGhpcy5sb2dnZXIud2FybihgJHttZXNzYWdlfVxcbkF0dGVtcHRpbmcgdG8gY29udGludWUgdXNpbmcgdGhpcyB2ZXJzaW9uIG9mIEFuZ3VsYXIuYCk7XG4gICAgfVxuXG4gICAgLy8gTm8gbGlua2VyIHdhcyBtYXRjaGVkIGZvciB0aGlzIGRlY2xhcmF0aW9uLCBzbyBqdXN0IHVzZSB0aGUgbW9zdCByZWNlbnQgb25lLlxuICAgIHJldHVybiBsaW5rZXJSYW5nZXNbbGlua2VyUmFuZ2VzLmxlbmd0aCAtIDFdLmxpbmtlcjtcbiAgfVxufVxuXG4vKipcbiAqIENvbXB1dGUgYSBzZW12ZXIgUmFuZ2UgZnJvbSB0aGUgYHZlcnNpb25gIGFuZCBjb21wYXJhdG9yLlxuICpcbiAqIFRoZSByYW5nZSBpcyBjb21wdXRlZCBhcyBhbnkgdmVyc2lvbiBncmVhdGVyL2xlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgZ2l2ZW4gYHZlcnNpb25TdHJgXG4gKiBkZXBlbmRpbmcgdXBvbiB0aGUgYGNvbXBhcmF0b3JgIChpZ25vcmluZyBhbnkgcHJlcmVsZWFzZSB2ZXJzaW9ucykuXG4gKlxuICogQHBhcmFtIGNvbXBhcmF0b3IgYSBzdHJpbmcgdGhhdCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHZlcnNpb24gc3BlY2lmaWVzIGEgbWluaW11bSBvciBhIG1heGltdW1cbiAqICAgICByYW5nZS5cbiAqIEBwYXJhbSB2ZXJzaW9uU3RyIHRoZSB2ZXJzaW9uIGdpdmVuIGluIHRoZSBwYXJ0aWFsIGRlY2xhcmF0aW9uXG4gKiBAcmV0dXJucyBBIHNlbXZlciByYW5nZSBmb3IgdGhlIHByb3ZpZGVkIGB2ZXJzaW9uYCBhbmQgY29tcGFyYXRvci5cbiAqL1xuZnVuY3Rpb24gZ2V0UmFuZ2UoY29tcGFyYXRvcjogJzw9J3wnPj0nLCB2ZXJzaW9uU3RyOiBzdHJpbmcpOiBSYW5nZSB7XG4gIGNvbnN0IHZlcnNpb24gPSBuZXcgU2VtVmVyKHZlcnNpb25TdHIpO1xuICAvLyBXaXBlIG91dCBhbnkgcHJlcmVsZWFzZSB2ZXJzaW9uc1xuICB2ZXJzaW9uLnByZXJlbGVhc2UgPSBbXTtcbiAgcmV0dXJuIG5ldyBSYW5nZShgJHtjb21wYXJhdG9yfSR7dmVyc2lvbi5mb3JtYXQoKX1gKTtcbn1cbiJdfQ== |
---|