1 | ;
|
2 | // MIT License http://www.opensource.org/licenses/mit-license.php
|
3 | // Author Gajus Kuizinas @gajus
|
4 | Object.defineProperty(exports, "__esModule", { value: true });
|
5 | // tslint:disable:no-any
|
6 | // tslint:disable:no-unsafe-any
|
7 | // tslint:disable:no-var-requires
|
8 | // tslint:disable:no-require-imports
|
9 | const Ajv = require("ajv");
|
10 | const ajv = new Ajv({
|
11 | errorDataPath: 'configuration',
|
12 | allErrors: true,
|
13 | verbose: true
|
14 | });
|
15 | require('ajv-keywords')(ajv, ['instanceof']);
|
16 | function validateSchema(schema, data) {
|
17 | if (Array.isArray(data)) {
|
18 | const errors = data.map((opts) => validateObject(schema, opts));
|
19 | errors.forEach((list, idx) => {
|
20 | // tslint:disable-next-line:no-function-expression
|
21 | list.forEach(function applyPrefix(err) {
|
22 | err.dataPath = `[${idx}]${err.dataPath}`;
|
23 | if (err.children) {
|
24 | err.children.forEach(applyPrefix);
|
25 | }
|
26 | });
|
27 | });
|
28 | return errors.reduce((arr, items) => {
|
29 | return arr.concat(items);
|
30 | }, []);
|
31 | }
|
32 | else {
|
33 | return validateObject(schema, data);
|
34 | }
|
35 | }
|
36 | exports.validateSchema = validateSchema;
|
37 | function validateObject(schema, data) {
|
38 | const validate = ajv.compile(schema);
|
39 | const valid = validate(data);
|
40 | return valid ? [] : filterErrors(validate.errors || []);
|
41 | }
|
42 | function filterErrors(errors) {
|
43 | let newErrors = [];
|
44 | errors.forEach((err) => {
|
45 | const dataPath = err.dataPath;
|
46 | let children = [];
|
47 | newErrors = newErrors.filter((oldError) => {
|
48 | if (oldError.dataPath.includes(dataPath)) {
|
49 | if (oldError.children) {
|
50 | children = children.concat(oldError.children.slice(0));
|
51 | }
|
52 | oldError.children = undefined;
|
53 | children.push(oldError);
|
54 | return false;
|
55 | }
|
56 | return true;
|
57 | });
|
58 | if (children.length) {
|
59 | err.children = children;
|
60 | }
|
61 | newErrors.push(err);
|
62 | });
|
63 | return newErrors;
|
64 | }
|
65 | //// Ref: from webpack
|
66 | function formatValidationError(sourceSchema, err) {
|
67 | const dataPath = `configuration${err.dataPath}`;
|
68 | if (err.keyword === 'additionalProperties') {
|
69 | return `${dataPath} has an unknown property '${err.params.additionalProperty}'.\nThese properties are valid:\n${getSchemaPartText(sourceSchema, err.parentSchema)}`;
|
70 | }
|
71 | if (err.keyword === 'oneOf' || err.keyword === 'anyOf') {
|
72 | if (err.children && err.children.length > 0) {
|
73 | // tslint:disable-next-line:prefer-template
|
74 | return `${dataPath} should be one of these:\n${getSchemaPartText(sourceSchema, err.parentSchema)}\n` +
|
75 | `Details:\n${err.children
|
76 | .map((e) => `${formatValidationError(sourceSchema, e)}`)
|
77 | .join('\n')}`;
|
78 | }
|
79 | return `${dataPath} should be one of these:\n${getSchemaPartText(sourceSchema, err.parentSchema)}`;
|
80 | }
|
81 | if (err.keyword === 'enum') {
|
82 | if (err.parentSchema && err.parentSchema.enum && err.parentSchema.enum.length === 1) {
|
83 | return `${dataPath} should be ${getSchemaPartText(sourceSchema, err.parentSchema)}`;
|
84 | }
|
85 | return `${dataPath} should be one of these:\n${getSchemaPartText(sourceSchema, err.parentSchema)}`;
|
86 | }
|
87 | if (err.keyword === 'allOf') {
|
88 | return `${dataPath} should be:\n${getSchemaPartText(sourceSchema, err.parentSchema)}`;
|
89 | }
|
90 | if (err.keyword === 'type' && err.params.type) {
|
91 | return `${dataPath} should be ${err.params.type}:\n${getSchemaPartText(sourceSchema, err.parentSchema)}`;
|
92 | }
|
93 | if (err.keyword === 'instanceof') {
|
94 | return `${dataPath} should be an instance of ${getSchemaPartText(sourceSchema, err.parentSchema)}.`;
|
95 | }
|
96 | if (err.keyword === 'required' && err.params.missingProperty) {
|
97 | const missingProperty = err.params.missingProperty.replace(/^\./, '');
|
98 | return `${dataPath} misses the property '${missingProperty}'.\n${getSchemaPartText(sourceSchema, err.parentSchema, ['properties', missingProperty])}`;
|
99 | }
|
100 | if (err.keyword === 'minLength' || err.keyword === 'minItems') {
|
101 | if (err.params.limit === 1) {
|
102 | return `${dataPath} should not be empty.`;
|
103 | }
|
104 | else {
|
105 | return `${dataPath} ${err.message}`;
|
106 | }
|
107 | }
|
108 | return `${dataPath} ${err.message} (${JSON.stringify(err, null, 2)}).\n${getSchemaPartText(sourceSchema, err.parentSchema)}`;
|
109 | }
|
110 | exports.formatValidationError = formatValidationError;
|
111 | const formatSchema = (sourceSchema, curSchema, prevSchemas) => {
|
112 | const schema = curSchema;
|
113 | prevSchemas = prevSchemas || [];
|
114 | const formatInnerSchema = (innerSchema, addSelf) => {
|
115 | if (!addSelf) {
|
116 | return formatSchema(sourceSchema, innerSchema, prevSchemas);
|
117 | }
|
118 | prevSchemas = prevSchemas || [];
|
119 | if (prevSchemas.indexOf(innerSchema) >= 0) {
|
120 | return '(recursive)';
|
121 | }
|
122 | return formatSchema(sourceSchema, innerSchema, prevSchemas.concat(schema));
|
123 | };
|
124 | if (schema.type === 'string' && schema.minLength === 1) {
|
125 | return 'non-empty string';
|
126 | }
|
127 | if (schema.type === 'string' && schema.minLength > 1) {
|
128 | return `string (min length ${schema.minLength})`;
|
129 | }
|
130 | if (schema.type === 'string') {
|
131 | return 'string';
|
132 | }
|
133 | if (schema.type === 'boolean') {
|
134 | return 'boolean';
|
135 | }
|
136 | if (schema.type === 'number') {
|
137 | return 'number';
|
138 | }
|
139 | if (schema.type === 'object') {
|
140 | if (schema.properties) {
|
141 | const required = schema.required || [];
|
142 | return `object { ${Object.keys(schema.properties).map((property) => {
|
143 | if (required.indexOf(property) < 0) {
|
144 | return `${property}?`;
|
145 | }
|
146 | return property;
|
147 | }).concat(schema.additionalProperties ? ['...'] : []).join(', ')} }`;
|
148 | }
|
149 | if (schema.additionalProperties) {
|
150 | return `object { <key>: ${formatInnerSchema(schema.additionalProperties)} }`;
|
151 | }
|
152 | return 'object';
|
153 | }
|
154 | if (schema.type === 'array') {
|
155 | return `[${formatInnerSchema(schema.items)}]`;
|
156 | }
|
157 | // tslint:disable-next-line:switch-default
|
158 | switch (schema.instanceof) {
|
159 | case 'Function':
|
160 | return 'function';
|
161 | case 'RegExp':
|
162 | return 'RegExp';
|
163 | }
|
164 | if (schema.$ref) {
|
165 | return formatInnerSchema(getSchemaPart(sourceSchema, schema.$ref), true);
|
166 | }
|
167 | if (schema.allOf) {
|
168 | return schema.allOf.map(formatInnerSchema).join(' & ');
|
169 | }
|
170 | if (schema.oneOf) {
|
171 | return schema.oneOf.map(formatInnerSchema).join(' | ');
|
172 | }
|
173 | if (schema.anyOf) {
|
174 | return schema.anyOf.map(formatInnerSchema).join(' | ');
|
175 | }
|
176 | if (schema.enum) {
|
177 | return schema.enum.map((item) => JSON.stringify(item)).join(' | ');
|
178 | }
|
179 | return JSON.stringify(schema, null, 2);
|
180 | };
|
181 | function getSchemaPartText(sourceSchema, schemaPart, additionalPath) {
|
182 | if (additionalPath) {
|
183 | for (const inner of additionalPath) {
|
184 | if (inner) {
|
185 | schemaPart = inner;
|
186 | }
|
187 | }
|
188 | }
|
189 | while (schemaPart.$ref) {
|
190 | schemaPart = getSchemaPart(sourceSchema, schemaPart.$ref);
|
191 | }
|
192 | let schemaText = formatSchema(sourceSchema, schemaPart);
|
193 | if (schemaPart.description) {
|
194 | schemaText += `\n${schemaPart.description}`;
|
195 | }
|
196 | return schemaText;
|
197 | }
|
198 | function getSchemaPart(sourceSchema, path, parents, additionalPath) {
|
199 | parents = parents || 0;
|
200 | let pathArrary = path.split('/');
|
201 | pathArrary = pathArrary.slice(0, pathArrary.length - parents);
|
202 | if (additionalPath) {
|
203 | pathArrary = pathArrary.concat(additionalPath.split('/'));
|
204 | }
|
205 | let schemaPart = sourceSchema;
|
206 | for (const inner of pathArrary) {
|
207 | if (inner) {
|
208 | schemaPart = inner;
|
209 | }
|
210 | }
|
211 | return schemaPart;
|
212 | }
|
213 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGUtc2NoZW1hLmpzIiwic291cmNlUm9vdCI6Ii4vIiwic291cmNlcyI6WyJzcmMvdXRpbHMvdmFsaWRhdGUtc2NoZW1hLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxpRUFBaUU7QUFDakUsK0JBQStCOztBQUUvQix3QkFBd0I7QUFDeEIsK0JBQStCO0FBQy9CLGlDQUFpQztBQUNqQyxvQ0FBb0M7QUFFcEMsMkJBQTJCO0FBQzNCLE1BQU0sR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDO0lBQ2hCLGFBQWEsRUFBRSxlQUFlO0lBQzlCLFNBQVMsRUFBRSxJQUFJO0lBQ2YsT0FBTyxFQUFFLElBQUk7Q0FDaEIsQ0FBQyxDQUFDO0FBRUgsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7QUFFN0MsU0FBZ0IsY0FBYyxDQUFDLE1BQWMsRUFBRSxJQUFTO0lBQ3BELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtRQUNyQixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBUyxFQUFFLEVBQUUsQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDckUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsRUFBRTtZQUN6QixrREFBa0Q7WUFDbEQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLFdBQVcsQ0FBQyxHQUFvQjtnQkFDbEQsR0FBRyxDQUFDLFFBQVEsR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ3pDLElBQUssR0FBVyxDQUFDLFFBQVEsRUFBRTtvQkFDdEIsR0FBVyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7aUJBQzlDO1lBQ0wsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDLENBQUMsQ0FBQztR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QUFZLEVBQUUsT0FBZ0IsRUFBRSxjQUF1QjtJQUNoRyxPQUFPLEdBQUcsT0FBTyxJQUFJLENBQUMsQ0FBQztJQUN2QixJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2pDLFVBQVUsR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQyxDQUFDO0lBQzlELElBQUksY0FBYyxFQUFFO1FBQ2hCLFVBQVUsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztLQUM3RDtJQUVELElBQUksVUFBVSxHQUFRLFlBQVksQ0FBQztJQUNuQyxLQUFLLE1BQU0sS0FBSyxJQUFJLFVBQVUsRUFBRTtRQUM1QixJQUFJLEtBQUssRUFBRTtZQUNQLFVBQVUsR0FBRyxLQUFLLENBQUM7U0FDdEI7S0FDSjtJQUVELE9BQU8sVUFBVSxDQUFDO0FBQ3RCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBNSVQgTGljZW5zZSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocFxuLy8gQXV0aG9yIEdhanVzIEt1aXppbmFzIEBnYWp1c1xuXG4vLyB0c2xpbnQ6ZGlzYWJsZTpuby1hbnlcbi8vIHRzbGludDpkaXNhYmxlOm5vLXVuc2FmZS1hbnlcbi8vIHRzbGludDpkaXNhYmxlOm5vLXZhci1yZXF1aXJlc1xuLy8gdHNsaW50OmRpc2FibGU6bm8tcmVxdWlyZS1pbXBvcnRzXG5cbmltcG9ydCAqIGFzIEFqdiBmcm9tICdhanYnO1xuY29uc3QgYWp2ID0gbmV3IEFqdih7XG4gICAgZXJyb3JEYXRhUGF0aDogJ2NvbmZpZ3VyYXRpb24nLFxuICAgIGFsbEVycm9yczogdHJ1ZSxcbiAgICB2ZXJib3NlOiB0cnVlXG59KTtcblxucmVxdWlyZSgnYWp2LWtleXdvcmRzJykoYWp2LCBbJ2luc3RhbmNlb2YnXSk7XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVNjaGVtYShzY2hlbWE6IE9iamVjdCwgZGF0YTogYW55KTogQWp2LkVycm9yT2JqZWN0W10ge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICAgIGNvbnN0IGVycm9ycyA9IGRhdGEubWFwKChvcHRzOiBhbnkpID0+IHZhbGlkYXRlT2JqZWN0KHNjaGVtYSwgb3B0cykpO1xuICAgICAgICBlcnJvcnMuZm9yRWFjaCgobGlzdCwgaWR4KSA9PiB7XG4gICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tZnVuY3Rpb24tZXhwcmVzc2lvblxuICAgICAgICAgICAgbGlzdC5mb3JFYWNoKGZ1bmN0aW9uIGFwcGx5UHJlZml4KGVycjogQWp2LkVycm9yT2JqZWN0KTogdm9pZCB7XG4gICAgICAgICAgICAgICAgZXJyLmRhdGFQYXRoID0gYFske2lkeH1dJHtlcnIuZGF0YVBhdGh9YDtcbiAgICAgICAgICAgICAgICBpZiAoKGVyciBhcyBhbnkpLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgICAgIChlcnIgYXMgYW55KS5jaGlsZHJlbi5mb3JFYWNoKGFwcGx5UHJlZml4KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGVycm9ycy5yZWR1Y2UoKGFyciwgaXRlbXMpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBhcnIuY29uY2F0KGl0ZW1zKTtcbiAgICAgICAgfSwgW10pO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB2YWxpZGF0ZU9iamVjdChzY2hlbWEsIGRhdGEpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVPYmplY3Qoc2NoZW1hOiBPYmplY3QsIGRhdGE6IGFueSk6IEFqdi5FcnJvck9iamVjdFtdIHtcbiAgICBjb25zdCB2YWxpZGF0ZSA9IGFqdi5jb21waWxlKHNjaGVtYSk7XG4gICAgY29uc3QgdmFsaWQgPSB2YWxpZGF0ZShkYXRhKTtcblxuICAgIHJldHVybiB2YWxpZCA/IFtdIDogZmlsdGVyRXJyb3JzKHZhbGlkYXRlLmVycm9ycyB8fCBbXSk7XG59XG5cbmZ1bmN0aW9uIGZpbHRlckVycm9ycyhlcnJvcnM6IEFqdi5FcnJvck9iamVjdFtdKTogQWp2LkVycm9yT2JqZWN0W10ge1xuICAgIGxldCBuZXdFcnJvcnM6IEFqdi5FcnJvck9iamVjdFtdID0gW107XG4gICAgZXJyb3JzLmZvckVhY2goKGVycjogQWp2LkVycm9yT2JqZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IGRhdGFQYXRoID0gZXJyLmRhdGFQYXRoO1xuICAgICAgICBsZXQgY2hpbGRyZW46IEFqdi5FcnJvck9iamVjdFtdID0gW107XG4gICAgICAgIG5ld0Vycm9ycyA9IG5ld0Vycm9ycy5maWx0ZXIoKG9sZEVycm9yOiBBanYuRXJyb3JPYmplY3QpID0+IHtcbiAgICAgICAgICAgIGlmIChvbGRFcnJvci5kYXRhUGF0aC5pbmNsdWRlcyhkYXRhUGF0aCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoKG9sZEVycm9yIGFzIGFueSkuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4gPSBjaGlsZHJlbi5jb25jYXQoKG9sZEVycm9yIGFzIGFueSkuY2hpbGRyZW4uc2xpY2UoMCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAob2xkRXJyb3IgYXMgYW55KS5jaGlsZHJlbiA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBjaGlsZHJlbi5wdXNoKG9sZEVycm9yKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAgICAgICAoZXJyIGFzIGFueSkuY2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgICAgICAgfVxuICAgICAgICBuZXdFcnJvcnMucHVzaChlcnIpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIG5ld0Vycm9ycztcbn1cblxuLy8vLyBSZWY6IGZyb20gd2VicGFja1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFZhbGlkYXRpb25FcnJvcihzb3VyY2VTY2hlbWE6IE9iamVjdCwgZXJyOiBBanYuRXJyb3JPYmplY3QpOiBhbnkge1xuICAgIGNvbnN0IGRhdGFQYXRoID0gYGNvbmZpZ3VyYXRpb24ke2Vyci5kYXRhUGF0aH1gO1xuICAgIGlmIChlcnIua2V5d29yZCA9PT0gJ2FkZGl0aW9uYWxQcm9wZXJ0aWVzJykge1xuICAgICAgICByZXR1cm4gYCR7ZGF0YVBhdGh9IGhhcyBhbiB1bmtub3duIHByb3BlcnR5ICckeyhlcnIucGFyYW1zIGFzIGFueSkuYWRkaXRpb25hbFByb3BlcnR5XG4gICAgICAgICAgICB9Jy5cXG5UaGVzZSBwcm9wZXJ0aWVzIGFyZSB2YWxpZDpcXG4ke1xuICAgICAgICAgICAgZ2V0U2NoZW1hUGFydFRleHQoc291cmNlU2NoZW1hLCBlcnIucGFyZW50U2NoZW1hKX1gO1xuICAgIH1cbiAgICBpZiAoZXJyLmtleXdvcmQgPT09ICdvbmVPZicgfHwgZXJyLmtleXdvcmQgPT09ICdhbnlPZicpIHtcbiAgICAgICAgaWYgKChlcnIgYXMgYW55KS5jaGlsZHJlbiAmJiAoZXJyIGFzIGFueSkuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnByZWZlci10ZW1wbGF0ZVxuICAgICAgICAgICAgcmV0dXJuIGAke2RhdGFQYXRofSBzaG91bGQgYmUgb25lIG9mIHRoZXNlOlxcbiR7Z2V0U2NoZW1hUGFydFRleHQoc291cmNlU2NoZW1hLCBlcnIucGFyZW50U2NoZW1hKX1cXG5gICtcbiAgICAgICAgICAgICAgICBgRGV0YWlsczpcXG4keyhlcnIgYXMgYW55KS5jaGlsZHJlblxuICAgICAgICAgICAgICAgICAgICAubWFwKChlOiBBanYuRXJyb3JPYmplY3QpID0+IGAke2Zvcm1hdFZhbGlkYXRpb25FcnJvcihzb3VyY2VTY2hlbWEsIGUpfWApXG4gICAgICAgICAgICAgICAgICAgIC5qb2luKCdcXG4nKX1gO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGAke2RhdGFQYXRofSBzaG91bGQgYmUgb25lIG9mIHRoZXNlOlxcbiR7Z2V0U2NoZW1hUGFydFRleHQoc291cmNlU2NoZW1hLCBlcnIucGFyZW50U2NoZW1hKX1gO1xuICAgIH1cbiAgICBpZiAoZXJyLmtleXdvcmQgPT09ICdlbnVtJykge1xuICAgICAgICBpZiAoZXJyLnBhcmVudFNjaGVtYSAmJiAoZXJyLnBhcmVudFNjaGVtYSBhcyBhbnkpLmVudW0gJiYgKGVyci5wYXJlbnRTY2hlbWEgYXMgYW55KS5lbnVtLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgcmV0dXJuIGAke2RhdGFQYXRofSBzaG91bGQgYmUgJHtnZXRTY2hlbWFQYXJ0VGV4dChzb3VyY2VTY2hlbWEsIGVyci5wYXJlbnRTY2hlbWEpfWA7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYCR7ZGF0YVBhdGh9IHNob3VsZCBiZSBvbmUgb2YgdGhlc2U6XFxuJHtnZXRTY2hlbWFQYXJ0VGV4dChzb3VyY2VTY2hlbWEsIGVyci5wYXJlbnRTY2hlbWEpfWA7XG4gICAgfVxuICAgIGlmIChlcnIua2V5d29yZCA9PT0gJ2FsbE9mJykge1xuICAgICAgICByZXR1cm4gYCR7ZGF0YVBhdGh9IHNob3VsZCBiZTpcXG4ke2dldFNjaGVtYVBhcnRUZXh0KHNvdXJjZVNjaGVtYSwgZXJyLnBhcmVudFNjaGVtYSl9YDtcbiAgICB9XG4gICAgaWYgKGVyci5rZXl3b3JkID09PSAndHlwZScgJiYgKGVyci5wYXJhbXMgYXMgYW55KS50eXBlKSB7XG4gICAgICAgIHJldHVybiBgJHtkYXRhUGF0aH0gc2hvdWxkIGJlICR7KGVyci5wYXJhbXMgYXMgYW55KS50eXBlfTpcXG4ke2dldFNjaGVtYVBhcnRUZXh0KHNvdXJjZVNjaGVtYSwgZXJyLnBhcmVudFNjaGVtYSlcbiAgICAgICAgICAgIH1gO1xuICAgIH1cbiAgICBpZiAoZXJyLmtleXdvcmQgPT09ICdpbnN0YW5jZW9mJykge1xuICAgICAgICByZXR1cm4gYCR7ZGF0YVBhdGh9IHNob3VsZCBiZSBhbiBpbnN0YW5jZSBvZiAke2dldFNjaGVtYVBhcnRUZXh0KHNvdXJjZVNjaGVtYSwgZXJyLnBhcmVudFNjaGVtYSl9LmA7XG4gICAgfVxuICAgIGlmIChlcnIua2V5d29yZCA9PT0gJ3JlcXVpcmVkJyAmJiAoZXJyLnBhcmFtcyBhcyBhbnkpLm1pc3NpbmdQcm9wZXJ0eSkge1xuICAgICAgICBjb25zdCBtaXNzaW5nUHJvcGVydHk6IHN0cmluZyA9IChlcnIucGFyYW1zIGFzIGFueSkubWlzc2luZ1Byb3BlcnR5LnJlcGxhY2UoL15cXC4vLCAnJyk7XG5cbiAgICAgICAgcmV0dXJuIGAke2RhdGFQYXRofSBtaXNzZXMgdGhlIHByb3BlcnR5ICcke21pc3NpbmdQcm9wZXJ0eX0nLlxcbiR7Z2V0U2NoZW1hUGFydFRleHQoc291cmNlU2NoZW1hLFxuICAgICAgICAgICAgZXJyLnBhcmVudFNjaGVtYSxcbiAgICAgICAgICAgIFsncHJvcGVydGllcycsIG1pc3NpbmdQcm9wZXJ0eV0pfWA7XG4gICAgfVxuICAgIGlmIChlcnIua2V5d29yZCA9PT0gJ21pbkxlbmd0aCcgfHwgZXJyLmtleXdvcmQgPT09ICdtaW5JdGVtcycpIHtcbiAgICAgICAgaWYgKChlcnIucGFyYW1zIGFzIGFueSkubGltaXQgPT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiBgJHtkYXRhUGF0aH0gc2hvdWxkIG5vdCBiZSBlbXB0eS5gO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGAke2RhdGFQYXRofSAke2Vyci5tZXNzYWdlfWA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gYCR7ZGF0YVBhdGh9ICR7ZXJyLm1lc3NhZ2V9ICgke0pTT04uc3RyaW5naWZ5KGVyciwgbnVsbCwgMil9KS5cXG4ke2dldFNjaGVtYVBhcnRUZXh0KHNvdXJjZVNjaGVtYSxcbiAgICAgICAgZXJyLnBhcmVudFNjaGVtYSl9YDtcbn1cblxuY29uc3QgZm9ybWF0U2NoZW1hID1cbiAgICAoc291cmNlU2NoZW1hOiBPYmplY3QsIGN1clNjaGVtYTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSwgcHJldlNjaGVtYXM/OiB7IFtrZXk6IHN0cmluZ106IGFueSB9W10pOiBzdHJpbmcgPT4ge1xuICAgICAgICBjb25zdCBzY2hlbWEgPSBjdXJTY2hlbWEgYXMgYW55O1xuICAgICAgICBwcmV2U2NoZW1hcyA9IHByZXZTY2hlbWFzIHx8IFtdO1xuXG4gICAgICAgIGNvbnN0IGZvcm1hdElubmVyU2NoZW1hOiBhbnkgPSAoaW5uZXJTY2hlbWE6IHsgW2tleTogc3RyaW5nXTogYW55IH0sIGFkZFNlbGY/OiBib29sZWFuKTogYW55ID0+IHtcbiAgICAgICAgICAgIGlmICghYWRkU2VsZikge1xuICAgICAgICAgICAgICAgIHJldHVybiBmb3JtYXRTY2hlbWEoc291cmNlU2NoZW1hLCBpbm5lclNjaGVtYSwgcHJldlNjaGVtYXMpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBwcmV2U2NoZW1hcyA9IHByZXZTY2hlbWFzIHx8IFtdO1xuICAgICAgICAgICAgaWYgKHByZXZTY2hlbWFzLmluZGV4T2YoaW5uZXJTY2hlbWEpID49IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJyhyZWN1cnNpdmUpJztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGZvcm1hdFNjaGVtYShzb3VyY2VTY2hlbWEsIGlubmVyU2NoZW1hLCBwcmV2U2NoZW1hcy5jb25jYXQoc2NoZW1hKSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHNjaGVtYS50eXBlID09PSAnc3RyaW5nJyAmJiBzY2hlbWEubWluTGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gJ25vbi1lbXB0eSBzdHJpbmcnO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzY2hlbWEudHlwZSA9PT0gJ3N0cmluZycgJiYgc2NoZW1hLm1pbkxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIHJldHVybiBgc3RyaW5nIChtaW4gbGVuZ3RoICR7c2NoZW1hLm1pbkxlbmd0aH0pYDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2NoZW1hLnR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gJ3N0cmluZyc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2NoZW1hLnR5cGUgPT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgcmV0dXJuICdib29sZWFuJztcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2NoZW1hLnR5cGUgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICByZXR1cm4gJ251bWJlcic7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNjaGVtYS50eXBlID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgaWYgKHNjaGVtYS5wcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVxdWlyZWQ6IGFueVtdID0gc2NoZW1hLnJlcXVpcmVkIHx8IFtdO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGBvYmplY3QgeyAke09iamVjdC5rZXlzKHNjaGVtYS5wcm9wZXJ0aWVzKS5tYXAoKHByb3BlcnR5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcXVpcmVkLmluZGV4T2YocHJvcGVydHkpIDwgMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGAke3Byb3BlcnR5fT9gO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByb3BlcnR5O1xuICAgICAgICAgICAgICAgIH0pLmNvbmNhdChzY2hlbWEuYWRkaXRpb25hbFByb3BlcnRpZXMgPyBbJy4uLiddIDogW10pLmpvaW4oJywgJyl9IH1gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHNjaGVtYS5hZGRpdGlvbmFsUHJvcGVydGllcykge1xuICAgICAgICAgICAgICAgIHJldHVybiBgb2JqZWN0IHsgPGtleT46ICR7Zm9ybWF0SW5uZXJTY2hlbWEoc2NoZW1hLmFkZGl0aW9uYWxQcm9wZXJ0aWVzKX0gfWA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiAnb2JqZWN0JztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzY2hlbWEudHlwZSA9PT0gJ2FycmF5Jykge1xuICAgICAgICAgICAgcmV0dXJuIGBbJHtmb3JtYXRJbm5lclNjaGVtYShzY2hlbWEuaXRlbXMpfV1gO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnN3aXRjaC1kZWZhdWx0XG4gICAgICAgIHN3aXRjaCAoc2NoZW1hLmluc3RhbmNlb2YpIHtcbiAgICAgICAgICAgIGNhc2UgJ0Z1bmN0aW9uJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2Z1bmN0aW9uJztcbiAgICAgICAgICAgIGNhc2UgJ1JlZ0V4cCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuICdSZWdFeHAnO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNjaGVtYS4kcmVmKSB7XG4gICAgICAgICAgICByZXR1cm4gZm9ybWF0SW5uZXJTY2hlbWEoZ2V0U2NoZW1hUGFydChzb3VyY2VTY2hlbWEsIHNjaGVtYS4kcmVmKSwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNjaGVtYS5hbGxPZikge1xuICAgICAgICAgICAgcmV0dXJuIHNjaGVtYS5hbGxPZi5tYXAoZm9ybWF0SW5uZXJTY2hlbWEpLmpvaW4oJyAmICcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzY2hlbWEub25lT2YpIHtcbiAgICAgICAgICAgIHJldHVybiBzY2hlbWEub25lT2YubWFwKGZvcm1hdElubmVyU2NoZW1hKS5qb2luKCcgfCAnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2NoZW1hLmFueU9mKSB7XG4gICAgICAgICAgICByZXR1cm4gc2NoZW1hLmFueU9mLm1hcChmb3JtYXRJbm5lclNjaGVtYSkuam9pbignIHwgJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNjaGVtYS5lbnVtKSB7XG4gICAgICAgICAgICByZXR1cm4gc2NoZW1hLmVudW0ubWFwKChpdGVtOiBhbnkpID0+IEpTT04uc3RyaW5naWZ5KGl0ZW0pKS5qb2luKCcgfCAnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShzY2hlbWEsIG51bGwsIDIpO1xuICAgIH07XG5cbmZ1bmN0aW9uIGdldFNjaGVtYVBhcnRUZXh0KHNvdXJjZVNjaGVtYTogT2JqZWN0LCBzY2hlbWFQYXJ0OiBhbnksIGFkZGl0aW9uYWxQYXRoPzogc3RyaW5nW10pOiBhbnkge1xuICAgIGlmIChhZGRpdGlvbmFsUGF0aCkge1xuICAgICAgICBmb3IgKGNvbnN0IGlubmVyIG9mIGFkZGl0aW9uYWxQYXRoKSB7XG4gICAgICAgICAgICBpZiAoaW5uZXIpIHtcbiAgICAgICAgICAgICAgICBzY2hlbWFQYXJ0ID0gaW5uZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB3aGlsZSAoc2NoZW1hUGFydC4kcmVmKSB7XG4gICAgICAgIHNjaGVtYVBhcnQgPSBnZXRTY2hlbWFQYXJ0KHNvdXJjZVNjaGVtYSwgc2NoZW1hUGFydC4kcmVmKTtcbiAgICB9XG5cbiAgICBsZXQgc2NoZW1hVGV4dCA9IGZvcm1hdFNjaGVtYShzb3VyY2VTY2hlbWEsIHNjaGVtYVBhcnQpO1xuICAgIGlmIChzY2hlbWFQYXJ0LmRlc2NyaXB0aW9uKSB7XG4gICAgICAgIHNjaGVtYVRleHQgKz0gYFxcbiR7c2NoZW1hUGFydC5kZXNjcmlwdGlvbn1gO1xuICAgIH1cblxuICAgIHJldHVybiBzY2hlbWFUZXh0O1xufVxuXG5mdW5jdGlvbiBnZXRTY2hlbWFQYXJ0KHNvdXJjZVNjaGVtYTogT2JqZWN0LCBwYXRoOiBzdHJpbmcsIHBhcmVudHM/OiBudW1iZXIsIGFkZGl0aW9uYWxQYXRoPzogc3RyaW5nKTogYW55IHtcbiAgICBwYXJlbnRzID0gcGFyZW50cyB8fCAwO1xuICAgIGxldCBwYXRoQXJyYXJ5ID0gcGF0aC5zcGxpdCgnLycpO1xuICAgIHBhdGhBcnJhcnkgPSBwYXRoQXJyYXJ5LnNsaWNlKDAsIHBhdGhBcnJhcnkubGVuZ3RoIC0gcGFyZW50cyk7XG4gICAgaWYgKGFkZGl0aW9uYWxQYXRoKSB7XG4gICAgICAgIHBhdGhBcnJhcnkgPSBwYXRoQXJyYXJ5LmNvbmNhdChhZGRpdGlvbmFsUGF0aC5zcGxpdCgnLycpKTtcbiAgICB9XG5cbiAgICBsZXQgc2NoZW1hUGFydDogYW55ID0gc291cmNlU2NoZW1hO1xuICAgIGZvciAoY29uc3QgaW5uZXIgb2YgcGF0aEFycmFyeSkge1xuICAgICAgICBpZiAoaW5uZXIpIHtcbiAgICAgICAgICAgIHNjaGVtYVBhcnQgPSBpbm5lcjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzY2hlbWFQYXJ0O1xufVxuIl19 |
\ | No newline at end of file |