every-plugin 0.4.4 → 0.4.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/build/rspack/index.cjs +300 -0
- package/dist/build/rspack/index.d.cts +20 -0
- package/dist/build/rspack/index.d.mts +20 -0
- package/dist/build/rspack/index.mjs +298 -0
- package/dist/chunk-QQAxy9l9.mjs +31 -0
- package/dist/chunk-zltIcp7o.cjs +46 -0
- package/dist/effect.cjs +9 -0
- package/dist/effect.d.cts +1 -0
- package/dist/effect.d.mts +1 -0
- package/dist/effect.mjs +3 -0
- package/dist/errors-CVnoPl9v.cjs +68 -0
- package/dist/errors-Car4tFVP.d.mts +75 -0
- package/dist/errors-D7keKf7a.mjs +63 -0
- package/dist/errors-DKPPPYYT.d.cts +75 -0
- package/dist/errors.cjs +4 -0
- package/dist/errors.d.cts +3 -0
- package/dist/errors.d.mts +3 -0
- package/dist/errors.mjs +4 -0
- package/dist/fetch-Cc95-7kM.cjs +336 -0
- package/dist/fetch-KLktuWuM.mjs +335 -0
- package/dist/index-bwAhA9ca.d.mts +383 -0
- package/dist/index-matrPV4m.d.cts +382 -0
- package/dist/index.cjs +57 -0
- package/dist/index.d.cts +5 -0
- package/dist/index.d.mts +5 -0
- package/dist/index.mjs +52 -0
- package/dist/{runtime/services/normalize.d.ts → normalize-BLTyqFww.d.mts} +5 -2
- package/dist/{runtime/services/normalize.js → normalize-BW7kk8Lk.d.cts} +5 -1
- package/dist/normalize-D4Qh0wVk.cjs +28 -0
- package/dist/normalize-D7nae0Hn.mjs +22 -0
- package/dist/openapi.DrTcell5-C6kyDyUK.mjs +669 -0
- package/dist/openapi.DrTcell5-DDf4D5V3.cjs +687 -0
- package/dist/orpc.cjs +46 -0
- package/dist/orpc.d.cts +7 -0
- package/dist/orpc.d.mts +7 -0
- package/dist/orpc.mjs +11 -0
- package/dist/package-CmegWGdE.cjs +154 -0
- package/dist/package-Dn-xZ55N.mjs +149 -0
- package/dist/plugins-C-7lh5gK.cjs +128 -0
- package/dist/plugins-Ps5Xxpk2.mjs +128 -0
- package/dist/runtime/index.cjs +6 -0
- package/dist/runtime/index.d.cts +5 -0
- package/dist/runtime/index.d.mts +5 -0
- package/dist/runtime/index.mjs +5 -0
- package/dist/runtime/services/normalize.cjs +3 -0
- package/dist/runtime/services/normalize.d.cts +2 -0
- package/dist/runtime/services/normalize.d.mts +2 -0
- package/dist/runtime/services/normalize.mjs +3 -0
- package/dist/runtime-CgRUExK3.cjs +523 -0
- package/dist/runtime-Da2NjzYy.mjs +458 -0
- package/dist/standard-DaxKTFui.mjs +595 -0
- package/dist/standard-eUgUkWaf.cjs +702 -0
- package/dist/testing/index.cjs +78 -0
- package/dist/testing/index.d.cts +60 -0
- package/dist/testing/index.d.mts +60 -0
- package/dist/testing/index.mjs +75 -0
- package/dist/zod-A7Pti5IV.d.cts +4 -0
- package/dist/zod-BVo51kgJ.mjs +10 -0
- package/dist/zod-D4CFw8d9.d.mts +4 -0
- package/dist/zod-DYghWCz1.cjs +14 -0
- package/dist/zod.cjs +10 -0
- package/dist/zod.d.cts +2 -0
- package/dist/zod.d.mts +2 -0
- package/dist/zod.mjs +5 -0
- package/dist/zod4-BXTBR1od.cjs +318 -0
- package/dist/zod4-VpXuwRO7.mjs +317 -0
- package/package.json +64 -23
- package/dist/effect.d.ts +0 -2
- package/dist/effect.d.ts.map +0 -1
- package/dist/effect.js +0 -1
- package/dist/errors.d.ts +0 -70
- package/dist/errors.d.ts.map +0 -1
- package/dist/errors.js +0 -61
- package/dist/index.d.ts +0 -6
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -5
- package/dist/orpc.d.ts +0 -10
- package/dist/orpc.d.ts.map +0 -1
- package/dist/orpc.js +0 -6
- package/dist/plugin.d.ts +0 -57
- package/dist/plugin.d.ts.map +0 -1
- package/dist/plugin.js +0 -43
- package/dist/runtime/errors.d.ts +0 -36
- package/dist/runtime/errors.d.ts.map +0 -1
- package/dist/runtime/errors.js +0 -47
- package/dist/runtime/index.d.ts +0 -20
- package/dist/runtime/index.d.ts.map +0 -1
- package/dist/runtime/index.js +0 -131
- package/dist/runtime/services/module-federation.service.d.ts +0 -13
- package/dist/runtime/services/module-federation.service.d.ts.map +0 -1
- package/dist/runtime/services/module-federation.service.js +0 -155
- package/dist/runtime/services/normalize.d.ts.map +0 -1
- package/dist/runtime/services/plugin-lifecycle.service.d.ts +0 -14
- package/dist/runtime/services/plugin-lifecycle.service.d.ts.map +0 -1
- package/dist/runtime/services/plugin-lifecycle.service.js +0 -34
- package/dist/runtime/services/plugin-loader.service.d.ts +0 -45
- package/dist/runtime/services/plugin-loader.service.d.ts.map +0 -1
- package/dist/runtime/services/plugin-loader.service.js +0 -93
- package/dist/runtime/services/plugin.service.d.ts +0 -36
- package/dist/runtime/services/plugin.service.d.ts.map +0 -1
- package/dist/runtime/services/plugin.service.js +0 -31
- package/dist/runtime/services/secrets.service.d.ts +0 -15
- package/dist/runtime/services/secrets.service.d.ts.map +0 -1
- package/dist/runtime/services/secrets.service.js +0 -35
- package/dist/runtime/services.d.ts +0 -6
- package/dist/runtime/services.d.ts.map +0 -1
- package/dist/runtime/services.js +0 -5
- package/dist/runtime/validation.d.ts +0 -5
- package/dist/runtime/validation.d.ts.map +0 -1
- package/dist/runtime/validation.js +0 -13
- package/dist/testing/index.d.ts +0 -59
- package/dist/testing/index.d.ts.map +0 -1
- package/dist/testing/index.js +0 -45
- package/dist/testing/mocks/module-federation.service.d.ts +0 -6
- package/dist/testing/mocks/module-federation.service.d.ts.map +0 -1
- package/dist/testing/mocks/module-federation.service.js +0 -29
- package/dist/tsconfig.tsbuildinfo +0 -1
- package/dist/types.d.ts +0 -187
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -1
- package/dist/zod.d.ts +0 -2
- package/dist/zod.d.ts.map +0 -1
- package/dist/zod.js +0 -1
|
@@ -0,0 +1,687 @@
|
|
|
1
|
+
const require_chunk = require('./chunk-zltIcp7o.cjs');
|
|
2
|
+
const require_standard = require('./standard-eUgUkWaf.cjs');
|
|
3
|
+
let __orpc_server = require("@orpc/server");
|
|
4
|
+
let __orpc_contract = require("@orpc/contract");
|
|
5
|
+
|
|
6
|
+
//#region ../../node_modules/.bun/@orpc+interop@1.10.4/node_modules/@orpc/interop/dist/json-schema-typed/index.mjs
|
|
7
|
+
var ContentEncoding;
|
|
8
|
+
(function(ContentEncoding1) {
|
|
9
|
+
ContentEncoding1["7bit"] = "7bit";
|
|
10
|
+
ContentEncoding1["8bit"] = "8bit";
|
|
11
|
+
ContentEncoding1["Base64"] = "base64";
|
|
12
|
+
ContentEncoding1["Binary"] = "binary";
|
|
13
|
+
ContentEncoding1["IETFToken"] = "ietf-token";
|
|
14
|
+
ContentEncoding1["QuotedPrintable"] = "quoted-printable";
|
|
15
|
+
ContentEncoding1["XToken"] = "x-token";
|
|
16
|
+
})(ContentEncoding || (ContentEncoding = {}));
|
|
17
|
+
var Format;
|
|
18
|
+
(function(Format1) {
|
|
19
|
+
Format1["Date"] = "date";
|
|
20
|
+
Format1["DateTime"] = "date-time";
|
|
21
|
+
Format1["Duration"] = "duration";
|
|
22
|
+
Format1["Email"] = "email";
|
|
23
|
+
Format1["Hostname"] = "hostname";
|
|
24
|
+
Format1["IDNEmail"] = "idn-email";
|
|
25
|
+
Format1["IDNHostname"] = "idn-hostname";
|
|
26
|
+
Format1["IPv4"] = "ipv4";
|
|
27
|
+
Format1["IPv6"] = "ipv6";
|
|
28
|
+
Format1["IRI"] = "iri";
|
|
29
|
+
Format1["IRIReference"] = "iri-reference";
|
|
30
|
+
Format1["JSONPointer"] = "json-pointer";
|
|
31
|
+
Format1["JSONPointerURIFragment"] = "json-pointer-uri-fragment";
|
|
32
|
+
Format1["RegEx"] = "regex";
|
|
33
|
+
Format1["RelativeJSONPointer"] = "relative-json-pointer";
|
|
34
|
+
Format1["Time"] = "time";
|
|
35
|
+
Format1["URI"] = "uri";
|
|
36
|
+
Format1["URIReference"] = "uri-reference";
|
|
37
|
+
Format1["URITemplate"] = "uri-template";
|
|
38
|
+
Format1["UUID"] = "uuid";
|
|
39
|
+
})(Format || (Format = {}));
|
|
40
|
+
var TypeName;
|
|
41
|
+
(function(TypeName1) {
|
|
42
|
+
TypeName1["Array"] = "array";
|
|
43
|
+
TypeName1["Boolean"] = "boolean";
|
|
44
|
+
TypeName1["Integer"] = "integer";
|
|
45
|
+
TypeName1["Null"] = "null";
|
|
46
|
+
TypeName1["Number"] = "number";
|
|
47
|
+
TypeName1["Object"] = "object";
|
|
48
|
+
TypeName1["String"] = "string";
|
|
49
|
+
})(TypeName || (TypeName = {}));
|
|
50
|
+
|
|
51
|
+
//#endregion
|
|
52
|
+
//#region ../../node_modules/.bun/@orpc+openapi@1.10.4/node_modules/@orpc/openapi/dist/shared/openapi.DrTcell5.mjs
|
|
53
|
+
const OPERATION_EXTENDER_SYMBOL = Symbol("ORPC_OPERATION_EXTENDER");
|
|
54
|
+
function getCustomOpenAPIOperation(o) {
|
|
55
|
+
return o[OPERATION_EXTENDER_SYMBOL];
|
|
56
|
+
}
|
|
57
|
+
function applyCustomOpenAPIOperation(operation, contract) {
|
|
58
|
+
const operationCustoms = [];
|
|
59
|
+
for (const errorItem of Object.values(contract["~orpc"].errorMap)) {
|
|
60
|
+
const maybeExtender = errorItem ? getCustomOpenAPIOperation(errorItem) : void 0;
|
|
61
|
+
if (maybeExtender) operationCustoms.push(maybeExtender);
|
|
62
|
+
}
|
|
63
|
+
if ((0, __orpc_server.isProcedure)(contract)) for (const middleware of contract["~orpc"].middlewares) {
|
|
64
|
+
const maybeExtender = getCustomOpenAPIOperation(middleware);
|
|
65
|
+
if (maybeExtender) operationCustoms.push(maybeExtender);
|
|
66
|
+
}
|
|
67
|
+
let currentOperation = operation;
|
|
68
|
+
for (const custom of operationCustoms) if (typeof custom === "function") currentOperation = custom(currentOperation, contract);
|
|
69
|
+
else currentOperation = {
|
|
70
|
+
...currentOperation,
|
|
71
|
+
...custom
|
|
72
|
+
};
|
|
73
|
+
return currentOperation;
|
|
74
|
+
}
|
|
75
|
+
const LOGIC_KEYWORDS = [
|
|
76
|
+
"$dynamicRef",
|
|
77
|
+
"$ref",
|
|
78
|
+
"additionalItems",
|
|
79
|
+
"additionalProperties",
|
|
80
|
+
"allOf",
|
|
81
|
+
"anyOf",
|
|
82
|
+
"const",
|
|
83
|
+
"contains",
|
|
84
|
+
"contentEncoding",
|
|
85
|
+
"contentMediaType",
|
|
86
|
+
"contentSchema",
|
|
87
|
+
"dependencies",
|
|
88
|
+
"dependentRequired",
|
|
89
|
+
"dependentSchemas",
|
|
90
|
+
"else",
|
|
91
|
+
"enum",
|
|
92
|
+
"exclusiveMaximum",
|
|
93
|
+
"exclusiveMinimum",
|
|
94
|
+
"format",
|
|
95
|
+
"if",
|
|
96
|
+
"items",
|
|
97
|
+
"maxContains",
|
|
98
|
+
"maximum",
|
|
99
|
+
"maxItems",
|
|
100
|
+
"maxLength",
|
|
101
|
+
"maxProperties",
|
|
102
|
+
"minContains",
|
|
103
|
+
"minimum",
|
|
104
|
+
"minItems",
|
|
105
|
+
"minLength",
|
|
106
|
+
"minProperties",
|
|
107
|
+
"multipleOf",
|
|
108
|
+
"not",
|
|
109
|
+
"oneOf",
|
|
110
|
+
"pattern",
|
|
111
|
+
"patternProperties",
|
|
112
|
+
"prefixItems",
|
|
113
|
+
"properties",
|
|
114
|
+
"propertyNames",
|
|
115
|
+
"required",
|
|
116
|
+
"then",
|
|
117
|
+
"type",
|
|
118
|
+
"unevaluatedItems",
|
|
119
|
+
"unevaluatedProperties",
|
|
120
|
+
"uniqueItems"
|
|
121
|
+
];
|
|
122
|
+
function isFileSchema(schema) {
|
|
123
|
+
return require_standard.isObject(schema) && schema.type === "string" && typeof schema.contentMediaType === "string";
|
|
124
|
+
}
|
|
125
|
+
function isObjectSchema(schema) {
|
|
126
|
+
return require_standard.isObject(schema) && schema.type === "object";
|
|
127
|
+
}
|
|
128
|
+
function isAnySchema(schema) {
|
|
129
|
+
if (schema === true) return true;
|
|
130
|
+
if (Object.keys(schema).every((k) => !LOGIC_KEYWORDS.includes(k))) return true;
|
|
131
|
+
return false;
|
|
132
|
+
}
|
|
133
|
+
function separateObjectSchema(schema, separatedProperties) {
|
|
134
|
+
if (Object.keys(schema).some((k) => ![
|
|
135
|
+
"type",
|
|
136
|
+
"properties",
|
|
137
|
+
"required",
|
|
138
|
+
"additionalProperties"
|
|
139
|
+
].includes(k) && LOGIC_KEYWORDS.includes(k) && schema[k] !== void 0)) return [{ type: "object" }, schema];
|
|
140
|
+
const matched = { ...schema };
|
|
141
|
+
const rest = { ...schema };
|
|
142
|
+
matched.properties = separatedProperties.reduce((acc, key) => {
|
|
143
|
+
const keySchema = schema.properties?.[key] ?? schema.additionalProperties;
|
|
144
|
+
if (keySchema !== void 0) acc[key] = keySchema;
|
|
145
|
+
return acc;
|
|
146
|
+
}, {});
|
|
147
|
+
matched.required = schema.required?.filter((key) => separatedProperties.includes(key));
|
|
148
|
+
matched.examples = schema.examples?.map((example) => {
|
|
149
|
+
if (!require_standard.isObject(example)) return example;
|
|
150
|
+
return Object.entries(example).reduce((acc, [key, value$1]) => {
|
|
151
|
+
if (separatedProperties.includes(key)) acc[key] = value$1;
|
|
152
|
+
return acc;
|
|
153
|
+
}, {});
|
|
154
|
+
});
|
|
155
|
+
rest.properties = schema.properties && Object.entries(schema.properties).filter(([key]) => !separatedProperties.includes(key)).reduce((acc, [key, value$1]) => {
|
|
156
|
+
acc[key] = value$1;
|
|
157
|
+
return acc;
|
|
158
|
+
}, {});
|
|
159
|
+
rest.required = schema.required?.filter((key) => !separatedProperties.includes(key));
|
|
160
|
+
rest.examples = schema.examples?.map((example) => {
|
|
161
|
+
if (!require_standard.isObject(example)) return example;
|
|
162
|
+
return Object.entries(example).reduce((acc, [key, value$1]) => {
|
|
163
|
+
if (!separatedProperties.includes(key)) acc[key] = value$1;
|
|
164
|
+
return acc;
|
|
165
|
+
}, {});
|
|
166
|
+
});
|
|
167
|
+
return [matched, rest];
|
|
168
|
+
}
|
|
169
|
+
function filterSchemaBranches(schema, check, matches = []) {
|
|
170
|
+
if (check(schema)) {
|
|
171
|
+
matches.push(schema);
|
|
172
|
+
return [matches, void 0];
|
|
173
|
+
}
|
|
174
|
+
if (require_standard.isObject(schema)) {
|
|
175
|
+
for (const keyword of ["anyOf", "oneOf"]) if (schema[keyword] && Object.keys(schema).every((k) => k === keyword || !LOGIC_KEYWORDS.includes(k))) {
|
|
176
|
+
const rest = schema[keyword].map((s) => filterSchemaBranches(s, check, matches)[1]).filter((v) => !!v);
|
|
177
|
+
if (rest.length === 1 && typeof rest[0] === "object") return [matches, {
|
|
178
|
+
...schema,
|
|
179
|
+
[keyword]: void 0,
|
|
180
|
+
...rest[0]
|
|
181
|
+
}];
|
|
182
|
+
return [matches, {
|
|
183
|
+
...schema,
|
|
184
|
+
[keyword]: rest
|
|
185
|
+
}];
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
return [matches, schema];
|
|
189
|
+
}
|
|
190
|
+
function applySchemaOptionality(required, schema) {
|
|
191
|
+
if (required) return schema;
|
|
192
|
+
return { anyOf: [schema, { not: {} }] };
|
|
193
|
+
}
|
|
194
|
+
function expandUnionSchema(schema) {
|
|
195
|
+
if (typeof schema === "object") {
|
|
196
|
+
for (const keyword of ["anyOf", "oneOf"]) if (schema[keyword] && Object.keys(schema).every((k) => k === keyword || !LOGIC_KEYWORDS.includes(k))) return schema[keyword].flatMap((s) => expandUnionSchema(s));
|
|
197
|
+
}
|
|
198
|
+
return [schema];
|
|
199
|
+
}
|
|
200
|
+
function expandArrayableSchema(schema) {
|
|
201
|
+
const schemas = expandUnionSchema(schema);
|
|
202
|
+
if (schemas.length !== 2) return;
|
|
203
|
+
const arraySchema = schemas.find((s) => typeof s === "object" && s.type === "array" && Object.keys(s).filter((k) => LOGIC_KEYWORDS.includes(k)).every((k) => k === "type" || k === "items"));
|
|
204
|
+
if (arraySchema === void 0) return;
|
|
205
|
+
const items1 = arraySchema.items;
|
|
206
|
+
const items2 = schemas.find((s) => s !== arraySchema);
|
|
207
|
+
if (require_standard.stringifyJSON(items1) !== require_standard.stringifyJSON(items2)) return;
|
|
208
|
+
return [items2, arraySchema];
|
|
209
|
+
}
|
|
210
|
+
const PRIMITIVE_SCHEMA_TYPES = /* @__PURE__ */ new Set([
|
|
211
|
+
TypeName.String,
|
|
212
|
+
TypeName.Number,
|
|
213
|
+
TypeName.Integer,
|
|
214
|
+
TypeName.Boolean,
|
|
215
|
+
TypeName.Null
|
|
216
|
+
]);
|
|
217
|
+
function isPrimitiveSchema(schema) {
|
|
218
|
+
return expandUnionSchema(schema).every((s) => {
|
|
219
|
+
if (typeof s === "boolean") return false;
|
|
220
|
+
if (typeof s.type === "string" && PRIMITIVE_SCHEMA_TYPES.has(s.type)) return true;
|
|
221
|
+
if (s.const !== void 0) return true;
|
|
222
|
+
return false;
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
function toOpenAPIPath(path) {
|
|
226
|
+
return require_standard.standardizeHTTPPath(path).replace(/\/\{\+([^}]+)\}/g, "/{$1}");
|
|
227
|
+
}
|
|
228
|
+
function toOpenAPIMethod(method) {
|
|
229
|
+
return method.toLocaleLowerCase();
|
|
230
|
+
}
|
|
231
|
+
function toOpenAPIContent(schema) {
|
|
232
|
+
const content = {};
|
|
233
|
+
const [matches, restSchema] = filterSchemaBranches(schema, isFileSchema);
|
|
234
|
+
for (const file of matches) content[file.contentMediaType] = { schema: toOpenAPISchema(file) };
|
|
235
|
+
if (restSchema !== void 0) {
|
|
236
|
+
content["application/json"] = { schema: toOpenAPISchema(restSchema) };
|
|
237
|
+
if (require_standard.findDeepMatches((v) => require_standard.isObject(v) && isFileSchema(v), restSchema).values.length > 0) content["multipart/form-data"] = { schema: toOpenAPISchema(restSchema) };
|
|
238
|
+
}
|
|
239
|
+
return content;
|
|
240
|
+
}
|
|
241
|
+
function toOpenAPIEventIteratorContent([yieldsRequired, yieldsSchema], [returnsRequired, returnsSchema]) {
|
|
242
|
+
return { "text/event-stream": { schema: toOpenAPISchema({ oneOf: [
|
|
243
|
+
{
|
|
244
|
+
type: "object",
|
|
245
|
+
properties: {
|
|
246
|
+
event: { const: "message" },
|
|
247
|
+
data: yieldsSchema,
|
|
248
|
+
id: { type: "string" },
|
|
249
|
+
retry: { type: "number" }
|
|
250
|
+
},
|
|
251
|
+
required: yieldsRequired ? ["event", "data"] : ["event"]
|
|
252
|
+
},
|
|
253
|
+
{
|
|
254
|
+
type: "object",
|
|
255
|
+
properties: {
|
|
256
|
+
event: { const: "done" },
|
|
257
|
+
data: returnsSchema,
|
|
258
|
+
id: { type: "string" },
|
|
259
|
+
retry: { type: "number" }
|
|
260
|
+
},
|
|
261
|
+
required: returnsRequired ? ["event", "data"] : ["event"]
|
|
262
|
+
},
|
|
263
|
+
{
|
|
264
|
+
type: "object",
|
|
265
|
+
properties: {
|
|
266
|
+
event: { const: "error" },
|
|
267
|
+
data: {},
|
|
268
|
+
id: { type: "string" },
|
|
269
|
+
retry: { type: "number" }
|
|
270
|
+
},
|
|
271
|
+
required: ["event"]
|
|
272
|
+
}
|
|
273
|
+
] }) } };
|
|
274
|
+
}
|
|
275
|
+
function toOpenAPIParameters(schema, parameterIn) {
|
|
276
|
+
const parameters = [];
|
|
277
|
+
for (const key in schema.properties) {
|
|
278
|
+
const keySchema = schema.properties[key];
|
|
279
|
+
let isDeepObjectStyle = true;
|
|
280
|
+
if (parameterIn !== "query") isDeepObjectStyle = false;
|
|
281
|
+
else if (isPrimitiveSchema(keySchema)) isDeepObjectStyle = false;
|
|
282
|
+
else {
|
|
283
|
+
const [item] = expandArrayableSchema(keySchema) ?? [];
|
|
284
|
+
if (item !== void 0 && isPrimitiveSchema(item)) isDeepObjectStyle = false;
|
|
285
|
+
}
|
|
286
|
+
parameters.push({
|
|
287
|
+
name: key,
|
|
288
|
+
in: parameterIn,
|
|
289
|
+
required: schema.required?.includes(key),
|
|
290
|
+
schema: toOpenAPISchema(keySchema),
|
|
291
|
+
style: isDeepObjectStyle ? "deepObject" : void 0,
|
|
292
|
+
explode: isDeepObjectStyle ? true : void 0,
|
|
293
|
+
allowEmptyValue: parameterIn === "query" ? true : void 0,
|
|
294
|
+
allowReserved: parameterIn === "query" ? true : void 0
|
|
295
|
+
});
|
|
296
|
+
}
|
|
297
|
+
return parameters;
|
|
298
|
+
}
|
|
299
|
+
function checkParamsSchema(schema, params) {
|
|
300
|
+
const properties = Object.keys(schema.properties ?? {});
|
|
301
|
+
const required = schema.required ?? [];
|
|
302
|
+
if (properties.length !== params.length || properties.some((v) => !params.includes(v))) return false;
|
|
303
|
+
if (required.length !== params.length || required.some((v) => !params.includes(v))) return false;
|
|
304
|
+
return true;
|
|
305
|
+
}
|
|
306
|
+
function toOpenAPISchema(schema) {
|
|
307
|
+
return schema === true ? {} : schema === false ? { not: {} } : schema;
|
|
308
|
+
}
|
|
309
|
+
const OPENAPI_JSON_SCHEMA_REF_PREFIX = "#/components/schemas/";
|
|
310
|
+
function resolveOpenAPIJsonSchemaRef(doc, schema) {
|
|
311
|
+
if (typeof schema !== "object" || !schema.$ref?.startsWith(OPENAPI_JSON_SCHEMA_REF_PREFIX)) return schema;
|
|
312
|
+
const name = schema.$ref.slice(21);
|
|
313
|
+
return doc.components?.schemas?.[name] ?? schema;
|
|
314
|
+
}
|
|
315
|
+
var CompositeSchemaConverter = class {
|
|
316
|
+
converters;
|
|
317
|
+
constructor(converters) {
|
|
318
|
+
this.converters = converters;
|
|
319
|
+
}
|
|
320
|
+
async convert(schema, options) {
|
|
321
|
+
for (const converter of this.converters) if (await converter.condition(schema, options)) return converter.convert(schema, options);
|
|
322
|
+
return [false, {}];
|
|
323
|
+
}
|
|
324
|
+
};
|
|
325
|
+
var OpenAPIGeneratorError = class extends Error {};
|
|
326
|
+
var OpenAPIGenerator = class {
|
|
327
|
+
serializer;
|
|
328
|
+
converter;
|
|
329
|
+
constructor(options = {}) {
|
|
330
|
+
this.serializer = new require_standard.StandardOpenAPIJsonSerializer(options);
|
|
331
|
+
this.converter = new CompositeSchemaConverter(require_standard.toArray(options.schemaConverters));
|
|
332
|
+
}
|
|
333
|
+
/**
|
|
334
|
+
* Generates OpenAPI specifications from oRPC routers/contracts.
|
|
335
|
+
*
|
|
336
|
+
* @see {@link https://orpc.unnoq.com/docs/openapi/openapi-specification OpenAPI Specification Docs}
|
|
337
|
+
*/
|
|
338
|
+
async generate(router, { customErrorResponseBodySchema, commonSchemas, filter: baseFilter, exclude,...baseDoc } = {}) {
|
|
339
|
+
const filter = baseFilter ?? (({ contract, path }) => {
|
|
340
|
+
return !(exclude?.(contract, path) ?? false);
|
|
341
|
+
});
|
|
342
|
+
const doc = {
|
|
343
|
+
...require_standard.clone(baseDoc),
|
|
344
|
+
info: baseDoc.info ?? {
|
|
345
|
+
title: "API Reference",
|
|
346
|
+
version: "0.0.0"
|
|
347
|
+
},
|
|
348
|
+
openapi: "3.1.1"
|
|
349
|
+
};
|
|
350
|
+
const { baseSchemaConvertOptions, undefinedErrorJsonSchema } = await this.#resolveCommonSchemas(doc, commonSchemas);
|
|
351
|
+
const contracts = [];
|
|
352
|
+
await (0, __orpc_server.resolveContractProcedures)({
|
|
353
|
+
path: [],
|
|
354
|
+
router
|
|
355
|
+
}, (traverseOptions) => {
|
|
356
|
+
if (!require_standard.value(filter, traverseOptions)) return;
|
|
357
|
+
contracts.push(traverseOptions);
|
|
358
|
+
});
|
|
359
|
+
const errors = [];
|
|
360
|
+
for (const { contract, path } of contracts) {
|
|
361
|
+
const stringPath = path.join(".");
|
|
362
|
+
try {
|
|
363
|
+
const def = contract["~orpc"];
|
|
364
|
+
const method = toOpenAPIMethod((0, __orpc_contract.fallbackContractConfig)("defaultMethod", def.route.method));
|
|
365
|
+
const httpPath = toOpenAPIPath(def.route.path ?? require_standard.toHttpPath(path));
|
|
366
|
+
let operationObjectRef;
|
|
367
|
+
if (def.route.spec !== void 0 && typeof def.route.spec !== "function") operationObjectRef = def.route.spec;
|
|
368
|
+
else {
|
|
369
|
+
operationObjectRef = {
|
|
370
|
+
operationId: def.route.operationId ?? stringPath,
|
|
371
|
+
summary: def.route.summary,
|
|
372
|
+
description: def.route.description,
|
|
373
|
+
deprecated: def.route.deprecated,
|
|
374
|
+
tags: def.route.tags?.map((tag) => tag)
|
|
375
|
+
};
|
|
376
|
+
await this.#request(doc, operationObjectRef, def, baseSchemaConvertOptions);
|
|
377
|
+
await this.#successResponse(doc, operationObjectRef, def, baseSchemaConvertOptions);
|
|
378
|
+
await this.#errorResponse(operationObjectRef, def, baseSchemaConvertOptions, undefinedErrorJsonSchema, customErrorResponseBodySchema);
|
|
379
|
+
}
|
|
380
|
+
if (typeof def.route.spec === "function") operationObjectRef = def.route.spec(operationObjectRef);
|
|
381
|
+
doc.paths ??= {};
|
|
382
|
+
doc.paths[httpPath] ??= {};
|
|
383
|
+
doc.paths[httpPath][method] = applyCustomOpenAPIOperation(operationObjectRef, contract);
|
|
384
|
+
} catch (e) {
|
|
385
|
+
if (!(e instanceof OpenAPIGeneratorError)) throw e;
|
|
386
|
+
errors.push(`[OpenAPIGenerator] Error occurred while generating OpenAPI for procedure at path: ${stringPath}
|
|
387
|
+
${e.message}`);
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
if (errors.length) throw new OpenAPIGeneratorError(`Some error occurred during OpenAPI generation:
|
|
391
|
+
|
|
392
|
+
${errors.join("\n\n")}`);
|
|
393
|
+
return this.serializer.serialize(doc)[0];
|
|
394
|
+
}
|
|
395
|
+
async #resolveCommonSchemas(doc, commonSchemas) {
|
|
396
|
+
let undefinedErrorJsonSchema = {
|
|
397
|
+
type: "object",
|
|
398
|
+
properties: {
|
|
399
|
+
defined: { const: false },
|
|
400
|
+
code: { type: "string" },
|
|
401
|
+
status: { type: "number" },
|
|
402
|
+
message: { type: "string" },
|
|
403
|
+
data: {}
|
|
404
|
+
},
|
|
405
|
+
required: [
|
|
406
|
+
"defined",
|
|
407
|
+
"code",
|
|
408
|
+
"status",
|
|
409
|
+
"message"
|
|
410
|
+
]
|
|
411
|
+
};
|
|
412
|
+
const baseSchemaConvertOptions = {};
|
|
413
|
+
if (commonSchemas) {
|
|
414
|
+
baseSchemaConvertOptions.components = [];
|
|
415
|
+
for (const key in commonSchemas) {
|
|
416
|
+
const options = commonSchemas[key];
|
|
417
|
+
if (options.schema === void 0) continue;
|
|
418
|
+
const { schema, strategy = "input" } = options;
|
|
419
|
+
const [required, json] = await this.converter.convert(schema, { strategy });
|
|
420
|
+
const allowedStrategies = [strategy];
|
|
421
|
+
if (strategy === "input") {
|
|
422
|
+
const [outputRequired, outputJson] = await this.converter.convert(schema, { strategy: "output" });
|
|
423
|
+
if (outputRequired === required && require_standard.stringifyJSON(outputJson) === require_standard.stringifyJSON(json)) allowedStrategies.push("output");
|
|
424
|
+
} else if (strategy === "output") {
|
|
425
|
+
const [inputRequired, inputJson] = await this.converter.convert(schema, { strategy: "input" });
|
|
426
|
+
if (inputRequired === required && require_standard.stringifyJSON(inputJson) === require_standard.stringifyJSON(json)) allowedStrategies.push("input");
|
|
427
|
+
}
|
|
428
|
+
baseSchemaConvertOptions.components.push({
|
|
429
|
+
schema,
|
|
430
|
+
required,
|
|
431
|
+
ref: `#/components/schemas/${key}`,
|
|
432
|
+
allowedStrategies
|
|
433
|
+
});
|
|
434
|
+
}
|
|
435
|
+
doc.components ??= {};
|
|
436
|
+
doc.components.schemas ??= {};
|
|
437
|
+
for (const key in commonSchemas) {
|
|
438
|
+
const options = commonSchemas[key];
|
|
439
|
+
if (options.schema === void 0) {
|
|
440
|
+
if (options.error === "UndefinedError") {
|
|
441
|
+
doc.components.schemas[key] = toOpenAPISchema(undefinedErrorJsonSchema);
|
|
442
|
+
undefinedErrorJsonSchema = { $ref: `#/components/schemas/${key}` };
|
|
443
|
+
}
|
|
444
|
+
continue;
|
|
445
|
+
}
|
|
446
|
+
const { schema, strategy = "input" } = options;
|
|
447
|
+
const [, json] = await this.converter.convert(schema, {
|
|
448
|
+
...baseSchemaConvertOptions,
|
|
449
|
+
strategy,
|
|
450
|
+
minStructureDepthForRef: 1
|
|
451
|
+
});
|
|
452
|
+
doc.components.schemas[key] = toOpenAPISchema(json);
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
return {
|
|
456
|
+
baseSchemaConvertOptions,
|
|
457
|
+
undefinedErrorJsonSchema
|
|
458
|
+
};
|
|
459
|
+
}
|
|
460
|
+
async #request(doc, ref, def, baseSchemaConvertOptions) {
|
|
461
|
+
const method = (0, __orpc_contract.fallbackContractConfig)("defaultMethod", def.route.method);
|
|
462
|
+
const details = (0, __orpc_contract.getEventIteratorSchemaDetails)(def.inputSchema);
|
|
463
|
+
if (details) {
|
|
464
|
+
ref.requestBody = {
|
|
465
|
+
required: true,
|
|
466
|
+
content: toOpenAPIEventIteratorContent(await this.converter.convert(details.yields, {
|
|
467
|
+
...baseSchemaConvertOptions,
|
|
468
|
+
strategy: "input"
|
|
469
|
+
}), await this.converter.convert(details.returns, {
|
|
470
|
+
...baseSchemaConvertOptions,
|
|
471
|
+
strategy: "input"
|
|
472
|
+
}))
|
|
473
|
+
};
|
|
474
|
+
return;
|
|
475
|
+
}
|
|
476
|
+
const dynamicParams = require_standard.getDynamicParams(def.route.path)?.map((v) => v.name);
|
|
477
|
+
const inputStructure = (0, __orpc_contract.fallbackContractConfig)("defaultInputStructure", def.route.inputStructure);
|
|
478
|
+
let [required, schema] = await this.converter.convert(def.inputSchema, {
|
|
479
|
+
...baseSchemaConvertOptions,
|
|
480
|
+
strategy: "input",
|
|
481
|
+
minStructureDepthForRef: dynamicParams?.length || inputStructure === "detailed" ? 1 : 0
|
|
482
|
+
});
|
|
483
|
+
if (isAnySchema(schema) && !dynamicParams?.length) return;
|
|
484
|
+
if (inputStructure === "compact") {
|
|
485
|
+
if (dynamicParams?.length) {
|
|
486
|
+
const error2 = new OpenAPIGeneratorError("When input structure is \"compact\", and path has dynamic params, input schema must be an object with all dynamic params as required.");
|
|
487
|
+
if (!isObjectSchema(schema)) throw error2;
|
|
488
|
+
const [paramsSchema, rest] = separateObjectSchema(schema, dynamicParams);
|
|
489
|
+
schema = rest;
|
|
490
|
+
required = rest.required ? rest.required.length !== 0 : false;
|
|
491
|
+
if (!checkParamsSchema(paramsSchema, dynamicParams)) throw error2;
|
|
492
|
+
ref.parameters ??= [];
|
|
493
|
+
ref.parameters.push(...toOpenAPIParameters(paramsSchema, "path"));
|
|
494
|
+
}
|
|
495
|
+
if (method === "GET") {
|
|
496
|
+
const resolvedSchema = resolveOpenAPIJsonSchemaRef(doc, schema);
|
|
497
|
+
if (!isObjectSchema(resolvedSchema)) throw new OpenAPIGeneratorError("When method is \"GET\", input schema must satisfy: object | any | unknown");
|
|
498
|
+
ref.parameters ??= [];
|
|
499
|
+
ref.parameters.push(...toOpenAPIParameters(resolvedSchema, "query"));
|
|
500
|
+
} else ref.requestBody = {
|
|
501
|
+
required,
|
|
502
|
+
content: toOpenAPIContent(schema)
|
|
503
|
+
};
|
|
504
|
+
return;
|
|
505
|
+
}
|
|
506
|
+
const error = new OpenAPIGeneratorError("When input structure is \"detailed\", input schema must satisfy: { params?: Record<string, unknown>, query?: Record<string, unknown>, headers?: Record<string, unknown>, body?: unknown }");
|
|
507
|
+
if (!isObjectSchema(schema)) throw error;
|
|
508
|
+
const resolvedParamSchema = schema.properties?.params !== void 0 ? resolveOpenAPIJsonSchemaRef(doc, schema.properties.params) : void 0;
|
|
509
|
+
if (dynamicParams?.length && (resolvedParamSchema === void 0 || !isObjectSchema(resolvedParamSchema) || !checkParamsSchema(resolvedParamSchema, dynamicParams))) throw new OpenAPIGeneratorError("When input structure is \"detailed\" and path has dynamic params, the \"params\" schema must be an object with all dynamic params as required.");
|
|
510
|
+
for (const from of [
|
|
511
|
+
"params",
|
|
512
|
+
"query",
|
|
513
|
+
"headers"
|
|
514
|
+
]) {
|
|
515
|
+
const fromSchema = schema.properties?.[from];
|
|
516
|
+
if (fromSchema !== void 0) {
|
|
517
|
+
const resolvedSchema = resolveOpenAPIJsonSchemaRef(doc, fromSchema);
|
|
518
|
+
if (!isObjectSchema(resolvedSchema)) throw error;
|
|
519
|
+
const parameterIn = from === "params" ? "path" : from === "headers" ? "header" : "query";
|
|
520
|
+
ref.parameters ??= [];
|
|
521
|
+
ref.parameters.push(...toOpenAPIParameters(resolvedSchema, parameterIn));
|
|
522
|
+
}
|
|
523
|
+
}
|
|
524
|
+
if (schema.properties?.body !== void 0) ref.requestBody = {
|
|
525
|
+
required: schema.required?.includes("body"),
|
|
526
|
+
content: toOpenAPIContent(schema.properties.body)
|
|
527
|
+
};
|
|
528
|
+
}
|
|
529
|
+
async #successResponse(doc, ref, def, baseSchemaConvertOptions) {
|
|
530
|
+
const outputSchema = def.outputSchema;
|
|
531
|
+
const status = (0, __orpc_contract.fallbackContractConfig)("defaultSuccessStatus", def.route.successStatus);
|
|
532
|
+
const description = (0, __orpc_contract.fallbackContractConfig)("defaultSuccessDescription", def.route?.successDescription);
|
|
533
|
+
const eventIteratorSchemaDetails = (0, __orpc_contract.getEventIteratorSchemaDetails)(outputSchema);
|
|
534
|
+
const outputStructure = (0, __orpc_contract.fallbackContractConfig)("defaultOutputStructure", def.route.outputStructure);
|
|
535
|
+
if (eventIteratorSchemaDetails) {
|
|
536
|
+
ref.responses ??= {};
|
|
537
|
+
ref.responses[status] = {
|
|
538
|
+
description,
|
|
539
|
+
content: toOpenAPIEventIteratorContent(await this.converter.convert(eventIteratorSchemaDetails.yields, {
|
|
540
|
+
...baseSchemaConvertOptions,
|
|
541
|
+
strategy: "output"
|
|
542
|
+
}), await this.converter.convert(eventIteratorSchemaDetails.returns, {
|
|
543
|
+
...baseSchemaConvertOptions,
|
|
544
|
+
strategy: "output"
|
|
545
|
+
}))
|
|
546
|
+
};
|
|
547
|
+
return;
|
|
548
|
+
}
|
|
549
|
+
const [required, json] = await this.converter.convert(outputSchema, {
|
|
550
|
+
...baseSchemaConvertOptions,
|
|
551
|
+
strategy: "output",
|
|
552
|
+
minStructureDepthForRef: outputStructure === "detailed" ? 1 : 0
|
|
553
|
+
});
|
|
554
|
+
if (outputStructure === "compact") {
|
|
555
|
+
ref.responses ??= {};
|
|
556
|
+
ref.responses[status] = { description };
|
|
557
|
+
ref.responses[status].content = toOpenAPIContent(applySchemaOptionality(required, json));
|
|
558
|
+
return;
|
|
559
|
+
}
|
|
560
|
+
const handledStatuses = /* @__PURE__ */ new Set();
|
|
561
|
+
for (const item of expandUnionSchema(json)) {
|
|
562
|
+
const error = new OpenAPIGeneratorError(`
|
|
563
|
+
When output structure is "detailed", output schema must satisfy:
|
|
564
|
+
{
|
|
565
|
+
status?: number, // must be a literal number and in the range of 200-399
|
|
566
|
+
headers?: Record<string, unknown>,
|
|
567
|
+
body?: unknown
|
|
568
|
+
}
|
|
569
|
+
|
|
570
|
+
But got: ${require_standard.stringifyJSON(item)}
|
|
571
|
+
`);
|
|
572
|
+
if (!isObjectSchema(item)) throw error;
|
|
573
|
+
let schemaStatus;
|
|
574
|
+
let schemaDescription;
|
|
575
|
+
if (item.properties?.status !== void 0) {
|
|
576
|
+
const statusSchema = resolveOpenAPIJsonSchemaRef(doc, item.properties.status);
|
|
577
|
+
if (typeof statusSchema !== "object" || statusSchema.const === void 0 || typeof statusSchema.const !== "number" || !Number.isInteger(statusSchema.const) || require_standard.isORPCErrorStatus(statusSchema.const)) throw error;
|
|
578
|
+
schemaStatus = statusSchema.const;
|
|
579
|
+
schemaDescription = statusSchema.description;
|
|
580
|
+
}
|
|
581
|
+
const itemStatus = schemaStatus ?? status;
|
|
582
|
+
const itemDescription = schemaDescription ?? description;
|
|
583
|
+
if (handledStatuses.has(itemStatus)) throw new OpenAPIGeneratorError(`
|
|
584
|
+
When output structure is "detailed", each success status must be unique.
|
|
585
|
+
But got status: ${itemStatus} used more than once.
|
|
586
|
+
`);
|
|
587
|
+
handledStatuses.add(itemStatus);
|
|
588
|
+
ref.responses ??= {};
|
|
589
|
+
ref.responses[itemStatus] = { description: itemDescription };
|
|
590
|
+
if (item.properties?.headers !== void 0) {
|
|
591
|
+
const headersSchema = resolveOpenAPIJsonSchemaRef(doc, item.properties.headers);
|
|
592
|
+
if (!isObjectSchema(headersSchema)) throw error;
|
|
593
|
+
for (const key in headersSchema.properties) {
|
|
594
|
+
const headerSchema = headersSchema.properties[key];
|
|
595
|
+
if (headerSchema !== void 0) {
|
|
596
|
+
ref.responses[itemStatus].headers ??= {};
|
|
597
|
+
ref.responses[itemStatus].headers[key] = {
|
|
598
|
+
schema: toOpenAPISchema(headerSchema),
|
|
599
|
+
required: item.required?.includes("headers") && headersSchema.required?.includes(key)
|
|
600
|
+
};
|
|
601
|
+
}
|
|
602
|
+
}
|
|
603
|
+
}
|
|
604
|
+
if (item.properties?.body !== void 0) ref.responses[itemStatus].content = toOpenAPIContent(applySchemaOptionality(item.required?.includes("body") ?? false, item.properties.body));
|
|
605
|
+
}
|
|
606
|
+
}
|
|
607
|
+
async #errorResponse(ref, def, baseSchemaConvertOptions, undefinedErrorSchema, customErrorResponseBodySchema) {
|
|
608
|
+
const errorMap = def.errorMap;
|
|
609
|
+
const errorResponsesByStatus = {};
|
|
610
|
+
for (const code in errorMap) {
|
|
611
|
+
const config = errorMap[code];
|
|
612
|
+
if (!config) continue;
|
|
613
|
+
const status = require_standard.fallbackORPCErrorStatus(code, config.status);
|
|
614
|
+
const defaultMessage = require_standard.fallbackORPCErrorMessage(code, config.message);
|
|
615
|
+
errorResponsesByStatus[status] ??= {
|
|
616
|
+
status,
|
|
617
|
+
definedErrorDefinitions: [],
|
|
618
|
+
errorSchemaVariants: []
|
|
619
|
+
};
|
|
620
|
+
const [dataRequired, dataSchema] = await this.converter.convert(config.data, {
|
|
621
|
+
...baseSchemaConvertOptions,
|
|
622
|
+
strategy: "output"
|
|
623
|
+
});
|
|
624
|
+
errorResponsesByStatus[status].definedErrorDefinitions.push([
|
|
625
|
+
code,
|
|
626
|
+
defaultMessage,
|
|
627
|
+
dataRequired,
|
|
628
|
+
dataSchema
|
|
629
|
+
]);
|
|
630
|
+
errorResponsesByStatus[status].errorSchemaVariants.push({
|
|
631
|
+
type: "object",
|
|
632
|
+
properties: {
|
|
633
|
+
defined: { const: true },
|
|
634
|
+
code: { const: code },
|
|
635
|
+
status: { const: status },
|
|
636
|
+
message: {
|
|
637
|
+
type: "string",
|
|
638
|
+
default: defaultMessage
|
|
639
|
+
},
|
|
640
|
+
data: dataSchema
|
|
641
|
+
},
|
|
642
|
+
required: dataRequired ? [
|
|
643
|
+
"defined",
|
|
644
|
+
"code",
|
|
645
|
+
"status",
|
|
646
|
+
"message",
|
|
647
|
+
"data"
|
|
648
|
+
] : [
|
|
649
|
+
"defined",
|
|
650
|
+
"code",
|
|
651
|
+
"status",
|
|
652
|
+
"message"
|
|
653
|
+
]
|
|
654
|
+
});
|
|
655
|
+
}
|
|
656
|
+
ref.responses ??= {};
|
|
657
|
+
for (const statusString in errorResponsesByStatus) {
|
|
658
|
+
const errorResponse = errorResponsesByStatus[statusString];
|
|
659
|
+
const customBodySchema = require_standard.value(customErrorResponseBodySchema, errorResponse.definedErrorDefinitions, errorResponse.status);
|
|
660
|
+
ref.responses[statusString] = {
|
|
661
|
+
description: statusString,
|
|
662
|
+
content: toOpenAPIContent(customBodySchema ?? { oneOf: [...errorResponse.errorSchemaVariants, undefinedErrorSchema] })
|
|
663
|
+
};
|
|
664
|
+
}
|
|
665
|
+
}
|
|
666
|
+
};
|
|
667
|
+
|
|
668
|
+
//#endregion
|
|
669
|
+
Object.defineProperty(exports, 'ContentEncoding', {
|
|
670
|
+
enumerable: true,
|
|
671
|
+
get: function () {
|
|
672
|
+
return ContentEncoding;
|
|
673
|
+
}
|
|
674
|
+
});
|
|
675
|
+
Object.defineProperty(exports, 'Format', {
|
|
676
|
+
enumerable: true,
|
|
677
|
+
get: function () {
|
|
678
|
+
return Format;
|
|
679
|
+
}
|
|
680
|
+
});
|
|
681
|
+
Object.defineProperty(exports, 'OpenAPIGenerator', {
|
|
682
|
+
enumerable: true,
|
|
683
|
+
get: function () {
|
|
684
|
+
return OpenAPIGenerator;
|
|
685
|
+
}
|
|
686
|
+
});
|
|
687
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlbmFwaS5EclRjZWxsNS1ERGY0RDVWMy5janMiLCJuYW1lcyI6WyJpc09iamVjdCIsInZhbHVlIiwic3RyaW5naWZ5SlNPTiIsInN0YW5kYXJkaXplSFRUUFBhdGgiLCJmaW5kRGVlcE1hdGNoZXMiLCJTdGFuZGFyZE9wZW5BUElKc29uU2VyaWFsaXplciIsInRvQXJyYXkiLCJjbG9uZSIsIiNyZXNvbHZlQ29tbW9uU2NoZW1hcyIsInRvSHR0cFBhdGgiLCIjcmVxdWVzdCIsIiNzdWNjZXNzUmVzcG9uc2UiLCIjZXJyb3JSZXNwb25zZSIsImdldER5bmFtaWNQYXJhbXMiLCJpc09SUENFcnJvclN0YXR1cyIsImZhbGxiYWNrT1JQQ0Vycm9yU3RhdHVzIiwiZmFsbGJhY2tPUlBDRXJyb3JNZXNzYWdlIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5idW4vQG9ycGMraW50ZXJvcEAxLjEwLjQvbm9kZV9tb2R1bGVzL0BvcnBjL2ludGVyb3AvZGlzdC9qc29uLXNjaGVtYS10eXBlZC9pbmRleC5tanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLmJ1bi9Ab3JwYytvcGVuYXBpQDEuMTAuNC9ub2RlX21vZHVsZXMvQG9ycGMvb3BlbmFwaS9kaXN0L3NoYXJlZC9vcGVuYXBpLkRyVGNlbGw1Lm1qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vZHJhZnQtMjAyMC0xMi50c1wiIC8+XG4vLyBAZ2VuZXJhdGVkXG4vLyBkZW5vLWZtdC1pZ25vcmUtZmlsZVxuLy8gZGVuby1saW50LWlnbm9yZS1maWxlXG4vLyBUaGlzIGNvZGUgd2FzIGJ1bmRsZWQgdXNpbmcgYGRlbm8gYnVuZGxlYCBhbmQgaXQncyBub3QgcmVjb21tZW5kZWQgdG8gZWRpdCBpdCBtYW51YWxseVxuXG5jb25zdCBkcmFmdCA9IFwiMjAyMC0xMlwiO1xuY29uc3QgJHNjaGVtYSA9IFwiaHR0cHM6Ly9qc29uLXNjaGVtYS5vcmcvZHJhZnQvMjAyMC0xMi9zY2hlbWFcIjtcbnZhciBDb250ZW50RW5jb2Rpbmc7XG4oZnVuY3Rpb24oQ29udGVudEVuY29kaW5nMSkge1xuICAgIENvbnRlbnRFbmNvZGluZzFbXCI3Yml0XCJdID0gXCI3Yml0XCI7XG4gICAgQ29udGVudEVuY29kaW5nMVtcIjhiaXRcIl0gPSBcIjhiaXRcIjtcbiAgICBDb250ZW50RW5jb2RpbmcxW1wiQmFzZTY0XCJdID0gXCJiYXNlNjRcIjtcbiAgICBDb250ZW50RW5jb2RpbmcxW1wiQmluYXJ5XCJdID0gXCJiaW5hcnlcIjtcbiAgICBDb250ZW50RW5jb2RpbmcxW1wiSUVURlRva2VuXCJdID0gXCJpZXRmLXRva2VuXCI7XG4gICAgQ29udGVudEVuY29kaW5nMVtcIlF1b3RlZFByaW50YWJsZVwiXSA9IFwicXVvdGVkLXByaW50YWJsZVwiO1xuICAgIENvbnRlbnRFbmNvZGluZzFbXCJYVG9rZW5cIl0gPSBcIngtdG9rZW5cIjtcbn0pKENvbnRlbnRFbmNvZGluZyB8fCAoQ29udGVudEVuY29kaW5nID0ge30pKTtcbnZhciBGb3JtYXQ7XG4oZnVuY3Rpb24oRm9ybWF0MSkge1xuICAgIEZvcm1hdDFbXCJEYXRlXCJdID0gXCJkYXRlXCI7XG4gICAgRm9ybWF0MVtcIkRhdGVUaW1lXCJdID0gXCJkYXRlLXRpbWVcIjtcbiAgICBGb3JtYXQxW1wiRHVyYXRpb25cIl0gPSBcImR1cmF0aW9uXCI7XG4gICAgRm9ybWF0MVtcIkVtYWlsXCJdID0gXCJlbWFpbFwiO1xuICAgIEZvcm1hdDFbXCJIb3N0bmFtZVwiXSA9IFwiaG9zdG5hbWVcIjtcbiAgICBGb3JtYXQxW1wiSURORW1haWxcIl0gPSBcImlkbi1lbWFpbFwiO1xuICAgIEZvcm1hdDFbXCJJRE5Ib3N0bmFtZVwiXSA9IFwiaWRuLWhvc3RuYW1lXCI7XG4gICAgRm9ybWF0MVtcIklQdjRcIl0gPSBcImlwdjRcIjtcbiAgICBGb3JtYXQxW1wiSVB2NlwiXSA9IFwiaXB2NlwiO1xuICAgIEZvcm1hdDFbXCJJUklcIl0gPSBcImlyaVwiO1xuICAgIEZvcm1hdDFbXCJJUklSZWZlcmVuY2VcIl0gPSBcImlyaS1yZWZlcmVuY2VcIjtcbiAgICBGb3JtYXQxW1wiSlNPTlBvaW50ZXJcIl0gPSBcImpzb24tcG9pbnRlclwiO1xuICAgIEZvcm1hdDFbXCJKU09OUG9pbnRlclVSSUZyYWdtZW50XCJdID0gXCJqc29uLXBvaW50ZXItdXJpLWZyYWdtZW50XCI7XG4gICAgRm9ybWF0MVtcIlJlZ0V4XCJdID0gXCJyZWdleFwiO1xuICAgIEZvcm1hdDFbXCJSZWxhdGl2ZUpTT05Qb2ludGVyXCJdID0gXCJyZWxhdGl2ZS1qc29uLXBvaW50ZXJcIjtcbiAgICBGb3JtYXQxW1wiVGltZVwiXSA9IFwidGltZVwiO1xuICAgIEZvcm1hdDFbXCJVUklcIl0gPSBcInVyaVwiO1xuICAgIEZvcm1hdDFbXCJVUklSZWZlcmVuY2VcIl0gPSBcInVyaS1yZWZlcmVuY2VcIjtcbiAgICBGb3JtYXQxW1wiVVJJVGVtcGxhdGVcIl0gPSBcInVyaS10ZW1wbGF0ZVwiO1xuICAgIEZvcm1hdDFbXCJVVUlEXCJdID0gXCJ1dWlkXCI7XG59KShGb3JtYXQgfHwgKEZvcm1hdCA9IHt9KSk7XG52YXIgVHlwZU5hbWU7XG4oZnVuY3Rpb24oVHlwZU5hbWUxKSB7XG4gICAgVHlwZU5hbWUxW1wiQXJyYXlcIl0gPSBcImFycmF5XCI7XG4gICAgVHlwZU5hbWUxW1wiQm9vbGVhblwiXSA9IFwiYm9vbGVhblwiO1xuICAgIFR5cGVOYW1lMVtcIkludGVnZXJcIl0gPSBcImludGVnZXJcIjtcbiAgICBUeXBlTmFtZTFbXCJOdWxsXCJdID0gXCJudWxsXCI7XG4gICAgVHlwZU5hbWUxW1wiTnVtYmVyXCJdID0gXCJudW1iZXJcIjtcbiAgICBUeXBlTmFtZTFbXCJPYmplY3RcIl0gPSBcIm9iamVjdFwiO1xuICAgIFR5cGVOYW1lMVtcIlN0cmluZ1wiXSA9IFwic3RyaW5nXCI7XG59KShUeXBlTmFtZSB8fCAoVHlwZU5hbWUgPSB7fSkpO1xuY29uc3Qga2V5d29yZHMgPSBbXG4gICAgXCIkYW5jaG9yXCIsXG4gICAgXCIkY29tbWVudFwiLFxuICAgIFwiJGRlZnNcIixcbiAgICBcIiRkeW5hbWljQW5jaG9yXCIsXG4gICAgXCIkZHluYW1pY1JlZlwiLFxuICAgIFwiJGlkXCIsXG4gICAgXCIkcmVmXCIsXG4gICAgXCIkc2NoZW1hXCIsXG4gICAgXCIkdm9jYWJ1bGFyeVwiLFxuICAgIFwiYWRkaXRpb25hbEl0ZW1zXCIsXG4gICAgXCJhZGRpdGlvbmFsUHJvcGVydGllc1wiLFxuICAgIFwiYWxsT2ZcIixcbiAgICBcImFueU9mXCIsXG4gICAgXCJjb25zdFwiLFxuICAgIFwiY29udGFpbnNcIixcbiAgICBcImNvbnRlbnRFbmNvZGluZ1wiLFxuICAgIFwiY29udGVudE1lZGlhVHlwZVwiLFxuICAgIFwiY29udGVudFNjaGVtYVwiLFxuICAgIFwiZGVmYXVsdFwiLFxuICAgIFwiZGVmaW5pdGlvbnNcIixcbiAgICBcImRlcGVuZGVuY2llc1wiLFxuICAgIFwiZGVwZW5kZW50UmVxdWlyZWRcIixcbiAgICBcImRlcGVuZGVudFNjaGVtYXNcIixcbiAgICBcImRlcHJlY2F0ZWRcIixcbiAgICBcImRlc2NyaXB0aW9uXCIsXG4gICAgXCJlbHNlXCIsXG4gICAgXCJlbnVtXCIsXG4gICAgXCJleGFtcGxlc1wiLFxuICAgIFwiZXhjbHVzaXZlTWF4aW11bVwiLFxuICAgIFwiZXhjbHVzaXZlTWluaW11bVwiLFxuICAgIFwiZm9ybWF0XCIsXG4gICAgXCJpZlwiLFxuICAgIFwiaXRlbXNcIixcbiAgICBcIm1heENvbnRhaW5zXCIsXG4gICAgXCJtYXhpbXVtXCIsXG4gICAgXCJtYXhJdGVtc1wiLFxuICAgIFwibWF4TGVuZ3RoXCIsXG4gICAgXCJtYXhQcm9wZXJ0aWVzXCIsXG4gICAgXCJtaW5Db250YWluc1wiLFxuICAgIFwibWluaW11bVwiLFxuICAgIFwibWluSXRlbXNcIixcbiAgICBcIm1pbkxlbmd0aFwiLFxuICAgIFwibWluUHJvcGVydGllc1wiLFxuICAgIFwibXVsdGlwbGVPZlwiLFxuICAgIFwibm90XCIsXG4gICAgXCJvbmVPZlwiLFxuICAgIFwicGF0dGVyblwiLFxuICAgIFwicGF0dGVyblByb3BlcnRpZXNcIixcbiAgICBcInByZWZpeEl0ZW1zXCIsXG4gICAgXCJwcm9wZXJ0aWVzXCIsXG4gICAgXCJwcm9wZXJ0eU5hbWVzXCIsXG4gICAgXCJyZWFkT25seVwiLFxuICAgIFwicmVxdWlyZWRcIixcbiAgICBcInRoZW5cIixcbiAgICBcInRpdGxlXCIsXG4gICAgXCJ0eXBlXCIsXG4gICAgXCJ1bmV2YWx1YXRlZEl0ZW1zXCIsXG4gICAgXCJ1bmV2YWx1YXRlZFByb3BlcnRpZXNcIixcbiAgICBcInVuaXF1ZUl0ZW1zXCIsXG4gICAgXCJ3cml0ZU9ubHlcIiwgXG5dO1xuXG5leHBvcnQgeyAkc2NoZW1hLCBDb250ZW50RW5jb2RpbmcsIEZvcm1hdCwgVHlwZU5hbWUsIGRyYWZ0LCBrZXl3b3JkcyB9O1xuIiwiaW1wb3J0IHsgaXNPUlBDRXJyb3JTdGF0dXMsIGZhbGxiYWNrT1JQQ0Vycm9yU3RhdHVzLCBmYWxsYmFja09SUENFcnJvck1lc3NhZ2UgfSBmcm9tICdAb3JwYy9jbGllbnQnO1xuaW1wb3J0IHsgdG9IdHRwUGF0aCB9IGZyb20gJ0BvcnBjL2NsaWVudC9zdGFuZGFyZCc7XG5pbXBvcnQgeyBmYWxsYmFja0NvbnRyYWN0Q29uZmlnLCBnZXRFdmVudEl0ZXJhdG9yU2NoZW1hRGV0YWlscyB9IGZyb20gJ0BvcnBjL2NvbnRyYWN0JztcbmltcG9ydCB7IHN0YW5kYXJkaXplSFRUUFBhdGgsIFN0YW5kYXJkT3BlbkFQSUpzb25TZXJpYWxpemVyLCBnZXREeW5hbWljUGFyYW1zIH0gZnJvbSAnQG9ycGMvb3BlbmFwaS1jbGllbnQvc3RhbmRhcmQnO1xuaW1wb3J0IHsgaXNQcm9jZWR1cmUsIHJlc29sdmVDb250cmFjdFByb2NlZHVyZXMgfSBmcm9tICdAb3JwYy9zZXJ2ZXInO1xuaW1wb3J0IHsgaXNPYmplY3QsIHN0cmluZ2lmeUpTT04sIGZpbmREZWVwTWF0Y2hlcywgdG9BcnJheSwgY2xvbmUsIHZhbHVlIH0gZnJvbSAnQG9ycGMvc2hhcmVkJztcbmltcG9ydCB7IFR5cGVOYW1lIH0gZnJvbSAnQG9ycGMvaW50ZXJvcC9qc29uLXNjaGVtYS10eXBlZC9kcmFmdC0yMDIwLTEyJztcblxuY29uc3QgT1BFUkFUSU9OX0VYVEVOREVSX1NZTUJPTCA9IFN5bWJvbChcIk9SUENfT1BFUkFUSU9OX0VYVEVOREVSXCIpO1xuZnVuY3Rpb24gY3VzdG9tT3BlbkFQSU9wZXJhdGlvbihvLCBleHRlbmQpIHtcbiAgcmV0dXJuIG5ldyBQcm94eShvLCB7XG4gICAgZ2V0KHRhcmdldCwgcHJvcCwgcmVjZWl2ZXIpIHtcbiAgICAgIGlmIChwcm9wID09PSBPUEVSQVRJT05fRVhURU5ERVJfU1lNQk9MKSB7XG4gICAgICAgIHJldHVybiBleHRlbmQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gUmVmbGVjdC5nZXQodGFyZ2V0LCBwcm9wLCByZWNlaXZlcik7XG4gICAgfVxuICB9KTtcbn1cbmZ1bmN0aW9uIGdldEN1c3RvbU9wZW5BUElPcGVyYXRpb24obykge1xuICByZXR1cm4gb1tPUEVSQVRJT05fRVhURU5ERVJfU1lNQk9MXTtcbn1cbmZ1bmN0aW9uIGFwcGx5Q3VzdG9tT3BlbkFQSU9wZXJhdGlvbihvcGVyYXRpb24sIGNvbnRyYWN0KSB7XG4gIGNvbnN0IG9wZXJhdGlvbkN1c3RvbXMgPSBbXTtcbiAgZm9yIChjb25zdCBlcnJvckl0ZW0gb2YgT2JqZWN0LnZhbHVlcyhjb250cmFjdFtcIn5vcnBjXCJdLmVycm9yTWFwKSkge1xuICAgIGNvbnN0IG1heWJlRXh0ZW5kZXIgPSBlcnJvckl0ZW0gPyBnZXRDdXN0b21PcGVuQVBJT3BlcmF0aW9uKGVycm9ySXRlbSkgOiB2b2lkIDA7XG4gICAgaWYgKG1heWJlRXh0ZW5kZXIpIHtcbiAgICAgIG9wZXJhdGlvbkN1c3RvbXMucHVzaChtYXliZUV4dGVuZGVyKTtcbiAgICB9XG4gIH1cbiAgaWYgKGlzUHJvY2VkdXJlKGNvbnRyYWN0KSkge1xuICAgIGZvciAoY29uc3QgbWlkZGxld2FyZSBvZiBjb250cmFjdFtcIn5vcnBjXCJdLm1pZGRsZXdhcmVzKSB7XG4gICAgICBjb25zdCBtYXliZUV4dGVuZGVyID0gZ2V0Q3VzdG9tT3BlbkFQSU9wZXJhdGlvbihtaWRkbGV3YXJlKTtcbiAgICAgIGlmIChtYXliZUV4dGVuZGVyKSB7XG4gICAgICAgIG9wZXJhdGlvbkN1c3RvbXMucHVzaChtYXliZUV4dGVuZGVyKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgbGV0IGN1cnJlbnRPcGVyYXRpb24gPSBvcGVyYXRpb247XG4gIGZvciAoY29uc3QgY3VzdG9tIG9mIG9wZXJhdGlvbkN1c3RvbXMpIHtcbiAgICBpZiAodHlwZW9mIGN1c3RvbSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBjdXJyZW50T3BlcmF0aW9uID0gY3VzdG9tKGN1cnJlbnRPcGVyYXRpb24sIGNvbnRyYWN0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY3VycmVudE9wZXJhdGlvbiA9IHtcbiAgICAgICAgLi4uY3VycmVudE9wZXJhdGlvbixcbiAgICAgICAgLi4uY3VzdG9tXG4gICAgICB9O1xuICAgIH1cbiAgfVxuICByZXR1cm4gY3VycmVudE9wZXJhdGlvbjtcbn1cblxuY29uc3QgTE9HSUNfS0VZV09SRFMgPSBbXG4gIFwiJGR5bmFtaWNSZWZcIixcbiAgXCIkcmVmXCIsXG4gIFwiYWRkaXRpb25hbEl0ZW1zXCIsXG4gIFwiYWRkaXRpb25hbFByb3BlcnRpZXNcIixcbiAgXCJhbGxPZlwiLFxuICBcImFueU9mXCIsXG4gIFwiY29uc3RcIixcbiAgXCJjb250YWluc1wiLFxuICBcImNvbnRlbnRFbmNvZGluZ1wiLFxuICBcImNvbnRlbnRNZWRpYVR5cGVcIixcbiAgXCJjb250ZW50U2NoZW1hXCIsXG4gIFwiZGVwZW5kZW5jaWVzXCIsXG4gIFwiZGVwZW5kZW50UmVxdWlyZWRcIixcbiAgXCJkZXBlbmRlbnRTY2hlbWFzXCIsXG4gIFwiZWxzZVwiLFxuICBcImVudW1cIixcbiAgXCJleGNsdXNpdmVNYXhpbXVtXCIsXG4gIFwiZXhjbHVzaXZlTWluaW11bVwiLFxuICBcImZvcm1hdFwiLFxuICBcImlmXCIsXG4gIFwiaXRlbXNcIixcbiAgXCJtYXhDb250YWluc1wiLFxuICBcIm1heGltdW1cIixcbiAgXCJtYXhJdGVtc1wiLFxuICBcIm1heExlbmd0aFwiLFxuICBcIm1heFByb3BlcnRpZXNcIixcbiAgXCJtaW5Db250YWluc1wiLFxuICBcIm1pbmltdW1cIixcbiAgXCJtaW5JdGVtc1wiLFxuICBcIm1pbkxlbmd0aFwiLFxuICBcIm1pblByb3BlcnRpZXNcIixcbiAgXCJtdWx0aXBsZU9mXCIsXG4gIFwibm90XCIsXG4gIFwib25lT2ZcIixcbiAgXCJwYXR0ZXJuXCIsXG4gIFwicGF0dGVyblByb3BlcnRpZXNcIixcbiAgXCJwcmVmaXhJdGVtc1wiLFxuICBcInByb3BlcnRpZXNcIixcbiAgXCJwcm9wZXJ0eU5hbWVzXCIsXG4gIFwicmVxdWlyZWRcIixcbiAgXCJ0aGVuXCIsXG4gIFwidHlwZVwiLFxuICBcInVuZXZhbHVhdGVkSXRlbXNcIixcbiAgXCJ1bmV2YWx1YXRlZFByb3BlcnRpZXNcIixcbiAgXCJ1bmlxdWVJdGVtc1wiXG5dO1xuXG5mdW5jdGlvbiBpc0ZpbGVTY2hlbWEoc2NoZW1hKSB7XG4gIHJldHVybiBpc09iamVjdChzY2hlbWEpICYmIHNjaGVtYS50eXBlID09PSBcInN0cmluZ1wiICYmIHR5cGVvZiBzY2hlbWEuY29udGVudE1lZGlhVHlwZSA9PT0gXCJzdHJpbmdcIjtcbn1cbmZ1bmN0aW9uIGlzT2JqZWN0U2NoZW1hKHNjaGVtYSkge1xuICByZXR1cm4gaXNPYmplY3Qoc2NoZW1hKSAmJiBzY2hlbWEudHlwZSA9PT0gXCJvYmplY3RcIjtcbn1cbmZ1bmN0aW9uIGlzQW55U2NoZW1hKHNjaGVtYSkge1xuICBpZiAoc2NoZW1hID09PSB0cnVlKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKE9iamVjdC5rZXlzKHNjaGVtYSkuZXZlcnkoKGspID0+ICFMT0dJQ19LRVlXT1JEUy5pbmNsdWRlcyhrKSkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBzZXBhcmF0ZU9iamVjdFNjaGVtYShzY2hlbWEsIHNlcGFyYXRlZFByb3BlcnRpZXMpIHtcbiAgaWYgKE9iamVjdC5rZXlzKHNjaGVtYSkuc29tZShcbiAgICAoaykgPT4gIVtcInR5cGVcIiwgXCJwcm9wZXJ0aWVzXCIsIFwicmVxdWlyZWRcIiwgXCJhZGRpdGlvbmFsUHJvcGVydGllc1wiXS5pbmNsdWRlcyhrKSAmJiBMT0dJQ19LRVlXT1JEUy5pbmNsdWRlcyhrKSAmJiBzY2hlbWFba10gIT09IHZvaWQgMFxuICApKSB7XG4gICAgcmV0dXJuIFt7IHR5cGU6IFwib2JqZWN0XCIgfSwgc2NoZW1hXTtcbiAgfVxuICBjb25zdCBtYXRjaGVkID0geyAuLi5zY2hlbWEgfTtcbiAgY29uc3QgcmVzdCA9IHsgLi4uc2NoZW1hIH07XG4gIG1hdGNoZWQucHJvcGVydGllcyA9IHNlcGFyYXRlZFByb3BlcnRpZXMucmVkdWNlKChhY2MsIGtleSkgPT4ge1xuICAgIGNvbnN0IGtleVNjaGVtYSA9IHNjaGVtYS5wcm9wZXJ0aWVzPy5ba2V5XSA/PyBzY2hlbWEuYWRkaXRpb25hbFByb3BlcnRpZXM7XG4gICAgaWYgKGtleVNjaGVtYSAhPT0gdm9pZCAwKSB7XG4gICAgICBhY2Nba2V5XSA9IGtleVNjaGVtYTtcbiAgICB9XG4gICAgcmV0dXJuIGFjYztcbiAgfSwge30pO1xuICBtYXRjaGVkLnJlcXVpcmVkID0gc2NoZW1hLnJlcXVpcmVkPy5maWx0ZXIoKGtleSkgPT4gc2VwYXJhdGVkUHJvcGVydGllcy5pbmNsdWRlcyhrZXkpKTtcbiAgbWF0Y2hlZC5leGFtcGxlcyA9IHNjaGVtYS5leGFtcGxlcz8ubWFwKChleGFtcGxlKSA9PiB7XG4gICAgaWYgKCFpc09iamVjdChleGFtcGxlKSkge1xuICAgICAgcmV0dXJuIGV4YW1wbGU7XG4gICAgfVxuICAgIHJldHVybiBPYmplY3QuZW50cmllcyhleGFtcGxlKS5yZWR1Y2UoKGFjYywgW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICBpZiAoc2VwYXJhdGVkUHJvcGVydGllcy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgIGFjY1trZXldID0gdmFsdWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gYWNjO1xuICAgIH0sIHt9KTtcbiAgfSk7XG4gIHJlc3QucHJvcGVydGllcyA9IHNjaGVtYS5wcm9wZXJ0aWVzICYmIE9iamVjdC5lbnRyaWVzKHNjaGVtYS5wcm9wZXJ0aWVzKS5maWx0ZXIoKFtrZXldKSA9PiAhc2VwYXJhdGVkUHJvcGVydGllcy5pbmNsdWRlcyhrZXkpKS5yZWR1Y2UoKGFjYywgW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgYWNjW2tleV0gPSB2YWx1ZTtcbiAgICByZXR1cm4gYWNjO1xuICB9LCB7fSk7XG4gIHJlc3QucmVxdWlyZWQgPSBzY2hlbWEucmVxdWlyZWQ/LmZpbHRlcigoa2V5KSA9PiAhc2VwYXJhdGVkUHJvcGVydGllcy5pbmNsdWRlcyhrZXkpKTtcbiAgcmVzdC5leGFtcGxlcyA9IHNjaGVtYS5leGFtcGxlcz8ubWFwKChleGFtcGxlKSA9PiB7XG4gICAgaWYgKCFpc09iamVjdChleGFtcGxlKSkge1xuICAgICAgcmV0dXJuIGV4YW1wbGU7XG4gICAgfVxuICAgIHJldHVybiBPYmplY3QuZW50cmllcyhleGFtcGxlKS5yZWR1Y2UoKGFjYywgW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICBpZiAoIXNlcGFyYXRlZFByb3BlcnRpZXMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICBhY2Nba2V5XSA9IHZhbHVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB7fSk7XG4gIH0pO1xuICByZXR1cm4gW21hdGNoZWQsIHJlc3RdO1xufVxuZnVuY3Rpb24gZmlsdGVyU2NoZW1hQnJhbmNoZXMoc2NoZW1hLCBjaGVjaywgbWF0Y2hlcyA9IFtdKSB7XG4gIGlmIChjaGVjayhzY2hlbWEpKSB7XG4gICAgbWF0Y2hlcy5wdXNoKHNjaGVtYSk7XG4gICAgcmV0dXJuIFttYXRjaGVzLCB2b2lkIDBdO1xuICB9XG4gIGlmIChpc09iamVjdChzY2hlbWEpKSB7XG4gICAgZm9yIChjb25zdCBrZXl3b3JkIG9mIFtcImFueU9mXCIsIFwib25lT2ZcIl0pIHtcbiAgICAgIGlmIChzY2hlbWFba2V5d29yZF0gJiYgT2JqZWN0LmtleXMoc2NoZW1hKS5ldmVyeShcbiAgICAgICAgKGspID0+IGsgPT09IGtleXdvcmQgfHwgIUxPR0lDX0tFWVdPUkRTLmluY2x1ZGVzKGspXG4gICAgICApKSB7XG4gICAgICAgIGNvbnN0IHJlc3QgPSBzY2hlbWFba2V5d29yZF0ubWFwKChzKSA9PiBmaWx0ZXJTY2hlbWFCcmFuY2hlcyhzLCBjaGVjaywgbWF0Y2hlcylbMV0pLmZpbHRlcigodikgPT4gISF2KTtcbiAgICAgICAgaWYgKHJlc3QubGVuZ3RoID09PSAxICYmIHR5cGVvZiByZXN0WzBdID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgcmV0dXJuIFttYXRjaGVzLCB7IC4uLnNjaGVtYSwgW2tleXdvcmRdOiB2b2lkIDAsIC4uLnJlc3RbMF0gfV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFttYXRjaGVzLCB7IC4uLnNjaGVtYSwgW2tleXdvcmRdOiByZXN0IH1dO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gW21hdGNoZXMsIHNjaGVtYV07XG59XG5mdW5jdGlvbiBhcHBseVNjaGVtYU9wdGlvbmFsaXR5KHJlcXVpcmVkLCBzY2hlbWEpIHtcbiAgaWYgKHJlcXVpcmVkKSB7XG4gICAgcmV0dXJuIHNjaGVtYTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGFueU9mOiBbXG4gICAgICBzY2hlbWEsXG4gICAgICB7IG5vdDoge30gfVxuICAgIF1cbiAgfTtcbn1cbmZ1bmN0aW9uIGV4cGFuZFVuaW9uU2NoZW1hKHNjaGVtYSkge1xuICBpZiAodHlwZW9mIHNjaGVtYSA9PT0gXCJvYmplY3RcIikge1xuICAgIGZvciAoY29uc3Qga2V5d29yZCBvZiBbXCJhbnlPZlwiLCBcIm9uZU9mXCJdKSB7XG4gICAgICBpZiAoc2NoZW1hW2tleXdvcmRdICYmIE9iamVjdC5rZXlzKHNjaGVtYSkuZXZlcnkoXG4gICAgICAgIChrKSA9PiBrID09PSBrZXl3b3JkIHx8ICFMT0dJQ19LRVlXT1JEUy5pbmNsdWRlcyhrKVxuICAgICAgKSkge1xuICAgICAgICByZXR1cm4gc2NoZW1hW2tleXdvcmRdLmZsYXRNYXAoKHMpID0+IGV4cGFuZFVuaW9uU2NoZW1hKHMpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIFtzY2hlbWFdO1xufVxuZnVuY3Rpb24gZXhwYW5kQXJyYXlhYmxlU2NoZW1hKHNjaGVtYSkge1xuICBjb25zdCBzY2hlbWFzID0gZXhwYW5kVW5pb25TY2hlbWEoc2NoZW1hKTtcbiAgaWYgKHNjaGVtYXMubGVuZ3RoICE9PSAyKSB7XG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgfVxuICBjb25zdCBhcnJheVNjaGVtYSA9IHNjaGVtYXMuZmluZChcbiAgICAocykgPT4gdHlwZW9mIHMgPT09IFwib2JqZWN0XCIgJiYgcy50eXBlID09PSBcImFycmF5XCIgJiYgT2JqZWN0LmtleXMocykuZmlsdGVyKChrKSA9PiBMT0dJQ19LRVlXT1JEUy5pbmNsdWRlcyhrKSkuZXZlcnkoKGspID0+IGsgPT09IFwidHlwZVwiIHx8IGsgPT09IFwiaXRlbXNcIilcbiAgKTtcbiAgaWYgKGFycmF5U2NoZW1hID09PSB2b2lkIDApIHtcbiAgICByZXR1cm4gdm9pZCAwO1xuICB9XG4gIGNvbnN0IGl0ZW1zMSA9IGFycmF5U2NoZW1hLml0ZW1zO1xuICBjb25zdCBpdGVtczIgPSBzY2hlbWFzLmZpbmQoKHMpID0+IHMgIT09IGFycmF5U2NoZW1hKTtcbiAgaWYgKHN0cmluZ2lmeUpTT04oaXRlbXMxKSAhPT0gc3RyaW5naWZ5SlNPTihpdGVtczIpKSB7XG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgfVxuICByZXR1cm4gW2l0ZW1zMiwgYXJyYXlTY2hlbWFdO1xufVxuY29uc3QgUFJJTUlUSVZFX1NDSEVNQV9UWVBFUyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KFtcbiAgVHlwZU5hbWUuU3RyaW5nLFxuICBUeXBlTmFtZS5OdW1iZXIsXG4gIFR5cGVOYW1lLkludGVnZXIsXG4gIFR5cGVOYW1lLkJvb2xlYW4sXG4gIFR5cGVOYW1lLk51bGxcbl0pO1xuZnVuY3Rpb24gaXNQcmltaXRpdmVTY2hlbWEoc2NoZW1hKSB7XG4gIHJldHVybiBleHBhbmRVbmlvblNjaGVtYShzY2hlbWEpLmV2ZXJ5KChzKSA9PiB7XG4gICAgaWYgKHR5cGVvZiBzID09PSBcImJvb2xlYW5cIikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHMudHlwZSA9PT0gXCJzdHJpbmdcIiAmJiBQUklNSVRJVkVfU0NIRU1BX1RZUEVTLmhhcyhzLnR5cGUpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHMuY29uc3QgIT09IHZvaWQgMCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHRvT3BlbkFQSVBhdGgocGF0aCkge1xuICByZXR1cm4gc3RhbmRhcmRpemVIVFRQUGF0aChwYXRoKS5yZXBsYWNlKC9cXC9cXHtcXCsoW159XSspXFx9L2csIFwiL3skMX1cIik7XG59XG5mdW5jdGlvbiB0b09wZW5BUElNZXRob2QobWV0aG9kKSB7XG4gIHJldHVybiBtZXRob2QudG9Mb2NhbGVMb3dlckNhc2UoKTtcbn1cbmZ1bmN0aW9uIHRvT3BlbkFQSUNvbnRlbnQoc2NoZW1hKSB7XG4gIGNvbnN0IGNvbnRlbnQgPSB7fTtcbiAgY29uc3QgW21hdGNoZXMsIHJlc3RTY2hlbWFdID0gZmlsdGVyU2NoZW1hQnJhbmNoZXMoc2NoZW1hLCBpc0ZpbGVTY2hlbWEpO1xuICBmb3IgKGNvbnN0IGZpbGUgb2YgbWF0Y2hlcykge1xuICAgIGNvbnRlbnRbZmlsZS5jb250ZW50TWVkaWFUeXBlXSA9IHtcbiAgICAgIHNjaGVtYTogdG9PcGVuQVBJU2NoZW1hKGZpbGUpXG4gICAgfTtcbiAgfVxuICBpZiAocmVzdFNjaGVtYSAhPT0gdm9pZCAwKSB7XG4gICAgY29udGVudFtcImFwcGxpY2F0aW9uL2pzb25cIl0gPSB7XG4gICAgICBzY2hlbWE6IHRvT3BlbkFQSVNjaGVtYShyZXN0U2NoZW1hKVxuICAgIH07XG4gICAgY29uc3QgaXNTdGlsbEhhc0ZpbGVTY2hlbWEgPSBmaW5kRGVlcE1hdGNoZXMoKHYpID0+IGlzT2JqZWN0KHYpICYmIGlzRmlsZVNjaGVtYSh2KSwgcmVzdFNjaGVtYSkudmFsdWVzLmxlbmd0aCA+IDA7XG4gICAgaWYgKGlzU3RpbGxIYXNGaWxlU2NoZW1hKSB7XG4gICAgICBjb250ZW50W1wibXVsdGlwYXJ0L2Zvcm0tZGF0YVwiXSA9IHtcbiAgICAgICAgc2NoZW1hOiB0b09wZW5BUElTY2hlbWEocmVzdFNjaGVtYSlcbiAgICAgIH07XG4gICAgfVxuICB9XG4gIHJldHVybiBjb250ZW50O1xufVxuZnVuY3Rpb24gdG9PcGVuQVBJRXZlbnRJdGVyYXRvckNvbnRlbnQoW3lpZWxkc1JlcXVpcmVkLCB5aWVsZHNTY2hlbWFdLCBbcmV0dXJuc1JlcXVpcmVkLCByZXR1cm5zU2NoZW1hXSkge1xuICByZXR1cm4ge1xuICAgIFwidGV4dC9ldmVudC1zdHJlYW1cIjoge1xuICAgICAgc2NoZW1hOiB0b09wZW5BUElTY2hlbWEoe1xuICAgICAgICBvbmVPZjogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6IFwib2JqZWN0XCIsXG4gICAgICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICAgIGV2ZW50OiB7IGNvbnN0OiBcIm1lc3NhZ2VcIiB9LFxuICAgICAgICAgICAgICBkYXRhOiB5aWVsZHNTY2hlbWEsXG4gICAgICAgICAgICAgIGlkOiB7IHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICAgICAgICAgICAgcmV0cnk6IHsgdHlwZTogXCJudW1iZXJcIiB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVxdWlyZWQ6IHlpZWxkc1JlcXVpcmVkID8gW1wiZXZlbnRcIiwgXCJkYXRhXCJdIDogW1wiZXZlbnRcIl1cbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6IFwib2JqZWN0XCIsXG4gICAgICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICAgIGV2ZW50OiB7IGNvbnN0OiBcImRvbmVcIiB9LFxuICAgICAgICAgICAgICBkYXRhOiByZXR1cm5zU2NoZW1hLFxuICAgICAgICAgICAgICBpZDogeyB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICAgICAgICAgIHJldHJ5OiB7IHR5cGU6IFwibnVtYmVyXCIgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlcXVpcmVkOiByZXR1cm5zUmVxdWlyZWQgPyBbXCJldmVudFwiLCBcImRhdGFcIl0gOiBbXCJldmVudFwiXVxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogXCJvYmplY3RcIixcbiAgICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgICAgZXZlbnQ6IHsgY29uc3Q6IFwiZXJyb3JcIiB9LFxuICAgICAgICAgICAgICBkYXRhOiB7fSxcbiAgICAgICAgICAgICAgaWQ6IHsgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgICAgICAgICByZXRyeTogeyB0eXBlOiBcIm51bWJlclwiIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXF1aXJlZDogW1wiZXZlbnRcIl1cbiAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICAgIH0pXG4gICAgfVxuICB9O1xufVxuZnVuY3Rpb24gdG9PcGVuQVBJUGFyYW1ldGVycyhzY2hlbWEsIHBhcmFtZXRlckluKSB7XG4gIGNvbnN0IHBhcmFtZXRlcnMgPSBbXTtcbiAgZm9yIChjb25zdCBrZXkgaW4gc2NoZW1hLnByb3BlcnRpZXMpIHtcbiAgICBjb25zdCBrZXlTY2hlbWEgPSBzY2hlbWEucHJvcGVydGllc1trZXldO1xuICAgIGxldCBpc0RlZXBPYmplY3RTdHlsZSA9IHRydWU7XG4gICAgaWYgKHBhcmFtZXRlckluICE9PSBcInF1ZXJ5XCIpIHtcbiAgICAgIGlzRGVlcE9iamVjdFN0eWxlID0gZmFsc2U7XG4gICAgfSBlbHNlIGlmIChpc1ByaW1pdGl2ZVNjaGVtYShrZXlTY2hlbWEpKSB7XG4gICAgICBpc0RlZXBPYmplY3RTdHlsZSA9IGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBbaXRlbV0gPSBleHBhbmRBcnJheWFibGVTY2hlbWEoa2V5U2NoZW1hKSA/PyBbXTtcbiAgICAgIGlmIChpdGVtICE9PSB2b2lkIDAgJiYgaXNQcmltaXRpdmVTY2hlbWEoaXRlbSkpIHtcbiAgICAgICAgaXNEZWVwT2JqZWN0U3R5bGUgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcGFyYW1ldGVycy5wdXNoKHtcbiAgICAgIG5hbWU6IGtleSxcbiAgICAgIGluOiBwYXJhbWV0ZXJJbixcbiAgICAgIHJlcXVpcmVkOiBzY2hlbWEucmVxdWlyZWQ/LmluY2x1ZGVzKGtleSksXG4gICAgICBzY2hlbWE6IHRvT3BlbkFQSVNjaGVtYShrZXlTY2hlbWEpLFxuICAgICAgc3R5bGU6IGlzRGVlcE9iamVjdFN0eWxlID8gXCJkZWVwT2JqZWN0XCIgOiB2b2lkIDAsXG4gICAgICBleHBsb2RlOiBpc0RlZXBPYmplY3RTdHlsZSA/IHRydWUgOiB2b2lkIDAsXG4gICAgICBhbGxvd0VtcHR5VmFsdWU6IHBhcmFtZXRlckluID09PSBcInF1ZXJ5XCIgPyB0cnVlIDogdm9pZCAwLFxuICAgICAgYWxsb3dSZXNlcnZlZDogcGFyYW1ldGVySW4gPT09IFwicXVlcnlcIiA/IHRydWUgOiB2b2lkIDBcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gcGFyYW1ldGVycztcbn1cbmZ1bmN0aW9uIGNoZWNrUGFyYW1zU2NoZW1hKHNjaGVtYSwgcGFyYW1zKSB7XG4gIGNvbnN0IHByb3BlcnRpZXMgPSBPYmplY3Qua2V5cyhzY2hlbWEucHJvcGVydGllcyA/PyB7fSk7XG4gIGNvbnN0IHJlcXVpcmVkID0gc2NoZW1hLnJlcXVpcmVkID8/IFtdO1xuICBpZiAocHJvcGVydGllcy5sZW5ndGggIT09IHBhcmFtcy5sZW5ndGggfHwgcHJvcGVydGllcy5zb21lKCh2KSA9PiAhcGFyYW1zLmluY2x1ZGVzKHYpKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAocmVxdWlyZWQubGVuZ3RoICE9PSBwYXJhbXMubGVuZ3RoIHx8IHJlcXVpcmVkLnNvbWUoKHYpID0+ICFwYXJhbXMuaW5jbHVkZXModikpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuZnVuY3Rpb24gdG9PcGVuQVBJU2NoZW1hKHNjaGVtYSkge1xuICByZXR1cm4gc2NoZW1hID09PSB0cnVlID8ge30gOiBzY2hlbWEgPT09IGZhbHNlID8geyBub3Q6IHt9IH0gOiBzY2hlbWE7XG59XG5jb25zdCBPUEVOQVBJX0pTT05fU0NIRU1BX1JFRl9QUkVGSVggPSBcIiMvY29tcG9uZW50cy9zY2hlbWFzL1wiO1xuZnVuY3Rpb24gcmVzb2x2ZU9wZW5BUElKc29uU2NoZW1hUmVmKGRvYywgc2NoZW1hKSB7XG4gIGlmICh0eXBlb2Ygc2NoZW1hICE9PSBcIm9iamVjdFwiIHx8ICFzY2hlbWEuJHJlZj8uc3RhcnRzV2l0aChPUEVOQVBJX0pTT05fU0NIRU1BX1JFRl9QUkVGSVgpKSB7XG4gICAgcmV0dXJuIHNjaGVtYTtcbiAgfVxuICBjb25zdCBuYW1lID0gc2NoZW1hLiRyZWYuc2xpY2UoT1BFTkFQSV9KU09OX1NDSEVNQV9SRUZfUFJFRklYLmxlbmd0aCk7XG4gIGNvbnN0IHJlc29sdmVkID0gZG9jLmNvbXBvbmVudHM/LnNjaGVtYXM/LltuYW1lXTtcbiAgcmV0dXJuIHJlc29sdmVkID8/IHNjaGVtYTtcbn1cblxuY2xhc3MgQ29tcG9zaXRlU2NoZW1hQ29udmVydGVyIHtcbiAgY29udmVydGVycztcbiAgY29uc3RydWN0b3IoY29udmVydGVycykge1xuICAgIHRoaXMuY29udmVydGVycyA9IGNvbnZlcnRlcnM7XG4gIH1cbiAgYXN5bmMgY29udmVydChzY2hlbWEsIG9wdGlvbnMpIHtcbiAgICBmb3IgKGNvbnN0IGNvbnZlcnRlciBvZiB0aGlzLmNvbnZlcnRlcnMpIHtcbiAgICAgIGlmIChhd2FpdCBjb252ZXJ0ZXIuY29uZGl0aW9uKHNjaGVtYSwgb3B0aW9ucykpIHtcbiAgICAgICAgcmV0dXJuIGNvbnZlcnRlci5jb252ZXJ0KHNjaGVtYSwgb3B0aW9ucyk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBbZmFsc2UsIHt9XTtcbiAgfVxufVxuXG5jbGFzcyBPcGVuQVBJR2VuZXJhdG9yRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG59XG5jbGFzcyBPcGVuQVBJR2VuZXJhdG9yIHtcbiAgc2VyaWFsaXplcjtcbiAgY29udmVydGVyO1xuICBjb25zdHJ1Y3RvcihvcHRpb25zID0ge30pIHtcbiAgICB0aGlzLnNlcmlhbGl6ZXIgPSBuZXcgU3RhbmRhcmRPcGVuQVBJSnNvblNlcmlhbGl6ZXIob3B0aW9ucyk7XG4gICAgdGhpcy5jb252ZXJ0ZXIgPSBuZXcgQ29tcG9zaXRlU2NoZW1hQ29udmVydGVyKHRvQXJyYXkob3B0aW9ucy5zY2hlbWFDb252ZXJ0ZXJzKSk7XG4gIH1cbiAgLyoqXG4gICAqIEdlbmVyYXRlcyBPcGVuQVBJIHNwZWNpZmljYXRpb25zIGZyb20gb1JQQyByb3V0ZXJzL2NvbnRyYWN0cy5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9vcnBjLnVubm9xLmNvbS9kb2NzL29wZW5hcGkvb3BlbmFwaS1zcGVjaWZpY2F0aW9uIE9wZW5BUEkgU3BlY2lmaWNhdGlvbiBEb2NzfVxuICAgKi9cbiAgYXN5bmMgZ2VuZXJhdGUocm91dGVyLCB7IGN1c3RvbUVycm9yUmVzcG9uc2VCb2R5U2NoZW1hLCBjb21tb25TY2hlbWFzLCBmaWx0ZXI6IGJhc2VGaWx0ZXIsIGV4Y2x1ZGUsIC4uLmJhc2VEb2MgfSA9IHt9KSB7XG4gICAgY29uc3QgZmlsdGVyID0gYmFzZUZpbHRlciA/PyAoKHsgY29udHJhY3QsIHBhdGggfSkgPT4ge1xuICAgICAgcmV0dXJuICEoZXhjbHVkZT8uKGNvbnRyYWN0LCBwYXRoKSA/PyBmYWxzZSk7XG4gICAgfSk7XG4gICAgY29uc3QgZG9jID0ge1xuICAgICAgLi4uY2xvbmUoYmFzZURvYyksXG4gICAgICBpbmZvOiBiYXNlRG9jLmluZm8gPz8geyB0aXRsZTogXCJBUEkgUmVmZXJlbmNlXCIsIHZlcnNpb246IFwiMC4wLjBcIiB9LFxuICAgICAgb3BlbmFwaTogXCIzLjEuMVwiXG4gICAgfTtcbiAgICBjb25zdCB7IGJhc2VTY2hlbWFDb252ZXJ0T3B0aW9ucywgdW5kZWZpbmVkRXJyb3JKc29uU2NoZW1hIH0gPSBhd2FpdCB0aGlzLiNyZXNvbHZlQ29tbW9uU2NoZW1hcyhkb2MsIGNvbW1vblNjaGVtYXMpO1xuICAgIGNvbnN0IGNvbnRyYWN0cyA9IFtdO1xuICAgIGF3YWl0IHJlc29sdmVDb250cmFjdFByb2NlZHVyZXMoeyBwYXRoOiBbXSwgcm91dGVyIH0sICh0cmF2ZXJzZU9wdGlvbnMpID0+IHtcbiAgICAgIGlmICghdmFsdWUoZmlsdGVyLCB0cmF2ZXJzZU9wdGlvbnMpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnRyYWN0cy5wdXNoKHRyYXZlcnNlT3B0aW9ucyk7XG4gICAgfSk7XG4gICAgY29uc3QgZXJyb3JzID0gW107XG4gICAgZm9yIChjb25zdCB7IGNvbnRyYWN0LCBwYXRoIH0gb2YgY29udHJhY3RzKSB7XG4gICAgICBjb25zdCBzdHJpbmdQYXRoID0gcGF0aC5qb2luKFwiLlwiKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGRlZiA9IGNvbnRyYWN0W1wifm9ycGNcIl07XG4gICAgICAgIGNvbnN0IG1ldGhvZCA9IHRvT3BlbkFQSU1ldGhvZChmYWxsYmFja0NvbnRyYWN0Q29uZmlnKFwiZGVmYXVsdE1ldGhvZFwiLCBkZWYucm91dGUubWV0aG9kKSk7XG4gICAgICAgIGNvbnN0IGh0dHBQYXRoID0gdG9PcGVuQVBJUGF0aChkZWYucm91dGUucGF0aCA/PyB0b0h0dHBQYXRoKHBhdGgpKTtcbiAgICAgICAgbGV0IG9wZXJhdGlvbk9iamVjdFJlZjtcbiAgICAgICAgaWYgKGRlZi5yb3V0ZS5zcGVjICE9PSB2b2lkIDAgJiYgdHlwZW9mIGRlZi5yb3V0ZS5zcGVjICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICBvcGVyYXRpb25PYmplY3RSZWYgPSBkZWYucm91dGUuc3BlYztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvcGVyYXRpb25PYmplY3RSZWYgPSB7XG4gICAgICAgICAgICBvcGVyYXRpb25JZDogZGVmLnJvdXRlLm9wZXJhdGlvbklkID8/IHN0cmluZ1BhdGgsXG4gICAgICAgICAgICBzdW1tYXJ5OiBkZWYucm91dGUuc3VtbWFyeSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBkZWYucm91dGUuZGVzY3JpcHRpb24sXG4gICAgICAgICAgICBkZXByZWNhdGVkOiBkZWYucm91dGUuZGVwcmVjYXRlZCxcbiAgICAgICAgICAgIHRhZ3M6IGRlZi5yb3V0ZS50YWdzPy5tYXAoKHRhZykgPT4gdGFnKVxuICAgICAgICAgIH07XG4gICAgICAgICAgYXdhaXQgdGhpcy4jcmVxdWVzdChkb2MsIG9wZXJhdGlvbk9iamVjdFJlZiwgZGVmLCBiYXNlU2NoZW1hQ29udmVydE9wdGlvbnMpO1xuICAgICAgICAgIGF3YWl0IHRoaXMuI3N1Y2Nlc3NSZXNwb25zZShkb2MsIG9wZXJhdGlvbk9iamVjdFJlZiwgZGVmLCBiYXNlU2NoZW1hQ29udmVydE9wdGlvbnMpO1xuICAgICAgICAgIGF3YWl0IHRoaXMuI2Vycm9yUmVzcG9uc2Uob3BlcmF0aW9uT2JqZWN0UmVmLCBkZWYsIGJhc2VTY2hlbWFDb252ZXJ0T3B0aW9ucywgdW5kZWZpbmVkRXJyb3JKc29uU2NoZW1hLCBjdXN0b21FcnJvclJlc3BvbnNlQm9keVNjaGVtYSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBkZWYucm91dGUuc3BlYyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgb3BlcmF0aW9uT2JqZWN0UmVmID0gZGVmLnJvdXRlLnNwZWMob3BlcmF0aW9uT2JqZWN0UmVmKTtcbiAgICAgICAgfVxuICAgICAgICBkb2MucGF0aHMgPz89IHt9O1xuICAgICAgICBkb2MucGF0aHNbaHR0cFBhdGhdID8/PSB7fTtcbiAgICAgICAgZG9jLnBhdGhzW2h0dHBQYXRoXVttZXRob2RdID0gYXBwbHlDdXN0b21PcGVuQVBJT3BlcmF0aW9uKG9wZXJhdGlvbk9iamVjdFJlZiwgY29udHJhY3QpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAoIShlIGluc3RhbmNlb2YgT3BlbkFQSUdlbmVyYXRvckVycm9yKSkge1xuICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgICAgZXJyb3JzLnB1c2goXG4gICAgICAgICAgYFtPcGVuQVBJR2VuZXJhdG9yXSBFcnJvciBvY2N1cnJlZCB3aGlsZSBnZW5lcmF0aW5nIE9wZW5BUEkgZm9yIHByb2NlZHVyZSBhdCBwYXRoOiAke3N0cmluZ1BhdGh9XG4ke2UubWVzc2FnZX1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChlcnJvcnMubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgT3BlbkFQSUdlbmVyYXRvckVycm9yKFxuICAgICAgICBgU29tZSBlcnJvciBvY2N1cnJlZCBkdXJpbmcgT3BlbkFQSSBnZW5lcmF0aW9uOlxuXG4ke2Vycm9ycy5qb2luKFwiXFxuXFxuXCIpfWBcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNlcmlhbGl6ZXIuc2VyaWFsaXplKGRvYylbMF07XG4gIH1cbiAgYXN5bmMgI3Jlc29sdmVDb21tb25TY2hlbWFzKGRvYywgY29tbW9uU2NoZW1hcykge1xuICAgIGxldCB1bmRlZmluZWRFcnJvckpzb25TY2hlbWEgPSB7XG4gICAgICB0eXBlOiBcIm9iamVjdFwiLFxuICAgICAgcHJvcGVydGllczoge1xuICAgICAgICBkZWZpbmVkOiB7IGNvbnN0OiBmYWxzZSB9LFxuICAgICAgICBjb2RlOiB7IHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICAgICAgc3RhdHVzOiB7IHR5cGU6IFwibnVtYmVyXCIgfSxcbiAgICAgICAgbWVzc2FnZTogeyB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICAgIGRhdGE6IHt9XG4gICAgICB9LFxuICAgICAgcmVxdWlyZWQ6IFtcImRlZmluZWRcIiwgXCJjb2RlXCIsIFwic3RhdHVzXCIsIFwibWVzc2FnZVwiXVxuICAgIH07XG4gICAgY29uc3QgYmFzZVNjaGVtYUNvbnZlcnRPcHRpb25zID0ge307XG4gICAgaWYgKGNvbW1vblNjaGVtYXMpIHtcbiAgICAgIGJhc2VTY2hlbWFDb252ZXJ0T3B0aW9ucy5jb21wb25lbnRzID0gW107XG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBjb21tb25TY2hlbWFzKSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBjb21tb25TY2hlbWFzW2tleV07XG4gICAgICAgIGlmIChvcHRpb25zLnNjaGVtYSA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBzY2hlbWEsIHN0cmF0ZWd5ID0gXCJpbnB1dFwiIH0gPSBvcHRpb25zO1xuICAgICAgICBjb25zdCBbcmVxdWlyZWQsIGpzb25dID0gYXdhaXQgdGhpcy5jb252ZXJ0ZXIuY29udmVydChzY2hlbWEsIHsgc3RyYXRlZ3kgfSk7XG4gICAgICAgIGNvbnN0IGFsbG93ZWRTdHJhdGVnaWVzID0gW3N0cmF0ZWd5XTtcbiAgICAgICAgaWYgKHN0cmF0ZWd5ID09PSBcImlucHV0XCIpIHtcbiAgICAgICAgICBjb25zdCBbb3V0cHV0UmVxdWlyZWQsIG91dHB1dEpzb25dID0gYXdhaXQgdGhpcy5jb252ZXJ0ZXIuY29udmVydChzY2hlbWEsIHsgc3RyYXRlZ3k6IFwib3V0cHV0XCIgfSk7XG4gICAgICAgICAgaWYgKG91dHB1dFJlcXVpcmVkID09PSByZXF1aXJlZCAmJiBzdHJpbmdpZnlKU09OKG91dHB1dEpzb24pID09PSBzdHJpbmdpZnlKU09OKGpzb24pKSB7XG4gICAgICAgICAgICBhbGxvd2VkU3RyYXRlZ2llcy5wdXNoKFwib3V0cHV0XCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChzdHJhdGVneSA9PT0gXCJvdXRwdXRcIikge1xuICAgICAgICAgIGNvbnN0IFtpbnB1dFJlcXVpcmVkLCBpbnB1dEpzb25dID0gYXdhaXQgdGhpcy5jb252ZXJ0ZXIuY29udmVydChzY2hlbWEsIHsgc3RyYXRlZ3k6IFwiaW5wdXRcIiB9KTtcbiAgICAgICAgICBpZiAoaW5wdXRSZXF1aXJlZCA9PT0gcmVxdWlyZWQgJiYgc3RyaW5naWZ5SlNPTihpbnB1dEpzb24pID09PSBzdHJpbmdpZnlKU09OKGpzb24pKSB7XG4gICAgICAgICAgICBhbGxvd2VkU3RyYXRlZ2llcy5wdXNoKFwiaW5wdXRcIik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJhc2VTY2hlbWFDb252ZXJ0T3B0aW9ucy5jb21wb25lbnRzLnB1c2goe1xuICAgICAgICAgIHNjaGVtYSxcbiAgICAgICAgICByZXF1aXJlZCxcbiAgICAgICAgICByZWY6IGAjL2NvbXBvbmVudHMvc2NoZW1hcy8ke2tleX1gLFxuICAgICAgICAgIGFsbG93ZWRTdHJhdGVnaWVzXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgZG9jLmNvbXBvbmVudHMgPz89IHt9O1xuICAgICAgZG9jLmNvbXBvbmVudHMuc2NoZW1hcyA/Pz0ge307XG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBjb21tb25TY2hlbWFzKSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBjb21tb25TY2hlbWFzW2tleV07XG4gICAgICAgIGlmIChvcHRpb25zLnNjaGVtYSA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgaWYgKG9wdGlvbnMuZXJyb3IgPT09IFwiVW5kZWZpbmVkRXJyb3JcIikge1xuICAgICAgICAgICAgZG9jLmNvbXBvbmVudHMuc2NoZW1hc1trZXldID0gdG9PcGVuQVBJU2NoZW1hKHVuZGVmaW5lZEVycm9ySnNvblNjaGVtYSk7XG4gICAgICAgICAgICB1bmRlZmluZWRFcnJvckpzb25TY2hlbWEgPSB7ICRyZWY6IGAjL2NvbXBvbmVudHMvc2NoZW1hcy8ke2tleX1gIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHsgc2NoZW1hLCBzdHJhdGVneSA9IFwiaW5wdXRcIiB9ID0gb3B0aW9ucztcbiAgICAgICAgY29uc3QgWywganNvbl0gPSBhd2FpdCB0aGlzLmNvbnZlcnRlci5jb252ZXJ0KFxuICAgICAgICAgIHNjaGVtYSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICAuLi5iYXNlU2NoZW1hQ29udmVydE9wdGlvbnMsXG4gICAgICAgICAgICBzdHJhdGVneSxcbiAgICAgICAgICAgIG1pblN0cnVjdHVyZURlcHRoRm9yUmVmOiAxXG4gICAgICAgICAgICAvLyBub3QgYWxsb3cgdXNlICRyZWYgZm9yIHJvb3Qgc2NoZW1hc1xuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgICAgZG9jLmNvbXBvbmVudHMuc2NoZW1hc1trZXldID0gdG9PcGVuQVBJU2NoZW1hKGpzb24pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geyBiYXNlU2NoZW1hQ29udmVydE9wdGlvbnMsIHVuZGVmaW5lZEVycm9ySnNvblNjaGVtYSB9O1xuICB9XG4gIGFzeW5jICNyZXF1ZXN0KGRvYywgcmVmLCBkZWYsIGJhc2VTY2hlbWFDb252ZXJ0T3B0aW9ucykge1xuICAgIGNvbnN0IG1ldGhvZCA9IGZhbGxiYWNrQ29udHJhY3RDb25maWcoXCJkZWZhdWx0TWV0aG9kXCIsIGRlZi5yb3V0ZS5tZXRob2QpO1xuICAgIGNvbnN0IGRldGFpbHMgPSBnZXRFdmVudEl0ZXJhdG9yU2NoZW1hRGV0YWlscyhkZWYuaW5wdXRTY2hlbWEpO1xuICAgIGlmIChkZXRhaWxzKSB7XG4gICAgICByZWYucmVxdWVzdEJvZHkgPSB7XG4gICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICBjb250ZW50OiB0b09wZW5BUElFdmVudEl0ZXJhdG9yQ29udGVudChcbiAgICAgICAgICBhd2FpdCB0aGlzLmNvbnZlcnRlci5jb252ZXJ0KGRldGFpbHMueWllbGRzLCB7IC4uLmJhc2VTY2hlbWFDb252ZXJ0T3B0aW9ucywgc3RyYXRlZ3k6IFwiaW5wdXRcIiB9KSxcbiAgICAgICAgICBhd2FpdCB0aGlzLmNvbnZlcnRlci5jb252ZXJ0KGRldGFpbHMucmV0dXJucywgeyAuLi5iYXNlU2NoZW1hQ29udmVydE9wdGlvbnMsIHN0cmF0ZWd5OiBcImlucHV0XCIgfSlcbiAgICAgICAgKVxuICAgICAgfTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZHluYW1pY1BhcmFtcyA9IGdldER5bmFtaWNQYXJhbXMoZGVmLnJvdXRlLnBhdGgpPy5tYXAoKHYpID0+IHYubmFtZSk7XG4gICAgY29uc3QgaW5wdXRTdHJ1Y3R1cmUgPSBmYWxsYmFja0NvbnRyYWN0Q29uZmlnKFwiZGVmYXVsdElucHV0U3RydWN0dXJlXCIsIGRlZi5yb3V0ZS5pbnB1dFN0cnVjdHVyZSk7XG4gICAgbGV0IFtyZXF1aXJlZCwgc2NoZW1hXSA9IGF3YWl0IHRoaXMuY29udmVydGVyLmNvbnZlcnQoXG4gICAgICBkZWYuaW5wdXRTY2hlbWEsXG4gICAgICB7XG4gICAgICAgIC4uLmJhc2VTY2hlbWFDb252ZXJ0T3B0aW9ucyxcbiAgICAgICAgc3RyYXRlZ3k6IFwiaW5wdXRcIixcbiAgICAgICAgbWluU3RydWN0dXJlRGVwdGhGb3JSZWY6IGR5bmFtaWNQYXJhbXM/Lmxlbmd0aCB8fCBpbnB1dFN0cnVjdHVyZSA9PT0gXCJkZXRhaWxlZFwiID8gMSA6IDBcbiAgICAgIH1cbiAgICApO1xuICAgIGlmIChpc0FueVNjaGVtYShzY2hlbWEpICYmICFkeW5hbWljUGFyYW1zPy5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGlucHV0U3RydWN0dXJlID09PSBcImNvbXBhY3RcIikge1xuICAgICAgaWYgKGR5bmFtaWNQYXJhbXM/Lmxlbmd0aCkge1xuICAgICAgICBjb25zdCBlcnJvcjIgPSBuZXcgT3BlbkFQSUdlbmVyYXRvckVycm9yKFxuICAgICAgICAgICdXaGVuIGlucHV0IHN0cnVjdHVyZSBpcyBcImNvbXBhY3RcIiwgYW5kIHBhdGggaGFzIGR5bmFtaWMgcGFyYW1zLCBpbnB1dCBzY2hlbWEgbXVzdCBiZSBhbiBvYmplY3Qgd2l0aCBhbGwgZHluYW1pYyBwYXJhbXMgYXMgcmVxdWlyZWQuJ1xuICAgICAgICApO1xuICAgICAgICBpZiAoIWlzT2JqZWN0U2NoZW1hKHNjaGVtYSkpIHtcbiAgICAgICAgICB0aHJvdyBlcnJvcjI7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgW3BhcmFtc1NjaGVtYSwgcmVzdF0gPSBzZXBhcmF0ZU9iamVjdFNjaGVtYShzY2hlbWEsIGR5bmFtaWNQYXJhbXMpO1xuICAgICAgICBzY2hlbWEgPSByZXN0O1xuICAgICAgICByZXF1aXJlZCA9IHJlc3QucmVxdWlyZWQgPyByZXN0LnJlcXVpcmVkLmxlbmd0aCAhPT0gMCA6IGZhbHNlO1xuICAgICAgICBpZiAoIWNoZWNrUGFyYW1zU2NoZW1hKHBhcmFtc1NjaGVtYSwgZHluYW1pY1BhcmFtcykpIHtcbiAgICAgICAgICB0aHJvdyBlcnJvcjI7XG4gICAgICAgIH1cbiAgICAgICAgcmVmLnBhcmFtZXRlcnMgPz89IFtdO1xuICAgICAgICByZWYucGFyYW1ldGVycy5wdXNoKC4uLnRvT3BlbkFQSVBhcmFtZXRlcnMocGFyYW1zU2NoZW1hLCBcInBhdGhcIikpO1xuICAgICAgfVxuICAgICAgaWYgKG1ldGhvZCA9PT0gXCJHRVRcIikge1xuICAgICAgICBjb25zdCByZXNvbHZlZFNjaGVtYSA9IHJlc29sdmVPcGVuQVBJSnNvblNjaGVtYVJlZihkb2MsIHNjaGVtYSk7XG4gICAgICAgIGlmICghaXNPYmplY3RTY2hlbWEocmVzb2x2ZWRTY2hlbWEpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IE9wZW5BUElHZW5lcmF0b3JFcnJvcihcbiAgICAgICAgICAgICdXaGVuIG1ldGhvZCBpcyBcIkdFVFwiLCBpbnB1dCBzY2hlbWEgbXVzdCBzYXRpc2Z5OiBvYmplY3QgfCBhbnkgfCB1bmtub3duJ1xuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmVmLnBhcmFtZXRlcnMgPz89IFtdO1xuICAgICAgICByZWYucGFyYW1ldGVycy5wdXNoKC4uLnRvT3BlbkFQSVBhcmFtZXRlcnMocmVzb2x2ZWRTY2hlbWEsIFwicXVlcnlcIikpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVmLnJlcXVlc3RCb2R5ID0ge1xuICAgICAgICAgIHJlcXVpcmVkLFxuICAgICAgICAgIGNvbnRlbnQ6IHRvT3BlbkFQSUNvbnRlbnQoc2NoZW1hKVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBlcnJvciA9IG5ldyBPcGVuQVBJR2VuZXJhdG9yRXJyb3IoXG4gICAgICAnV2hlbiBpbnB1dCBzdHJ1Y3R1cmUgaXMgXCJkZXRhaWxlZFwiLCBpbnB1dCBzY2hlbWEgbXVzdCBzYXRpc2Z5OiB7IHBhcmFtcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBxdWVyeT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBoZWFkZXJzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIGJvZHk/OiB1bmtub3duIH0nXG4gICAgKTtcbiAgICBpZiAoIWlzT2JqZWN0U2NoZW1hKHNjaGVtYSkpIHtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgICBjb25zdCByZXNvbHZlZFBhcmFtU2NoZW1hID0gc2NoZW1hLnByb3BlcnRpZXM/LnBhcmFtcyAhPT0gdm9pZCAwID8gcmVzb2x2ZU9wZW5BUElKc29uU2NoZW1hUmVmKGRvYywgc2NoZW1hLnByb3BlcnRpZXMucGFyYW1zKSA6IHZvaWQgMDtcbiAgICBpZiAoZHluYW1pY1BhcmFtcz8ubGVuZ3RoICYmIChyZXNvbHZlZFBhcmFtU2NoZW1hID09PSB2b2lkIDAgfHwgIWlzT2JqZWN0U2NoZW1hKHJlc29sdmVkUGFyYW1TY2hlbWEpIHx8ICFjaGVja1BhcmFtc1NjaGVtYShyZXNvbHZlZFBhcmFtU2NoZW1hLCBkeW5hbWljUGFyYW1zKSkpIHtcbiAgICAgIHRocm93IG5ldyBPcGVuQVBJR2VuZXJhdG9yRXJyb3IoXG4gICAgICAgICdXaGVuIGlucHV0IHN0cnVjdHVyZSBpcyBcImRldGFpbGVkXCIgYW5kIHBhdGggaGFzIGR5bmFtaWMgcGFyYW1zLCB0aGUgXCJwYXJhbXNcIiBzY2hlbWEgbXVzdCBiZSBhbiBvYmplY3Qgd2l0aCBhbGwgZHluYW1pYyBwYXJhbXMgYXMgcmVxdWlyZWQuJ1xuICAgICAgKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBmcm9tIG9mIFtcInBhcmFtc1wiLCBcInF1ZXJ5XCIsIFwiaGVhZGVyc1wiXSkge1xuICAgICAgY29uc3QgZnJvbVNjaGVtYSA9IHNjaGVtYS5wcm9wZXJ0aWVzPy5bZnJvbV07XG4gICAgICBpZiAoZnJvbVNjaGVtYSAhPT0gdm9pZCAwKSB7XG4gICAgICAgIGNvbnN0IHJlc29sdmVkU2NoZW1hID0gcmVzb2x2ZU9wZW5BUElKc29uU2NoZW1hUmVmKGRvYywgZnJvbVNjaGVtYSk7XG4gICAgICAgIGlmICghaXNPYmplY3RTY2hlbWEocmVzb2x2ZWRTY2hlbWEpKSB7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGFyYW1ldGVySW4gPSBmcm9tID09PSBcInBhcmFtc1wiID8gXCJwYXRoXCIgOiBmcm9tID09PSBcImhlYWRlcnNcIiA/IFwiaGVhZGVyXCIgOiBcInF1ZXJ5XCI7XG4gICAgICAgIHJlZi5wYXJhbWV0ZXJzID8/PSBbXTtcbiAgICAgICAgcmVmLnBhcmFtZXRlcnMucHVzaCguLi50b09wZW5BUElQYXJhbWV0ZXJzKHJlc29sdmVkU2NoZW1hLCBwYXJhbWV0ZXJJbikpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoc2NoZW1hLnByb3BlcnRpZXM/LmJvZHkgIT09IHZvaWQgMCkge1xuICAgICAgcmVmLnJlcXVlc3RCb2R5ID0ge1xuICAgICAgICByZXF1aXJlZDogc2NoZW1hLnJlcXVpcmVkPy5pbmNsdWRlcyhcImJvZHlcIiksXG4gICAgICAgIGNvbnRlbnQ6IHRvT3BlbkFQSUNvbnRlbnQoc2NoZW1hLnByb3BlcnRpZXMuYm9keSlcbiAgICAgIH07XG4gICAgfVxuICB9XG4gIGFzeW5jICNzdWNjZXNzUmVzcG9uc2UoZG9jLCByZWYsIGRlZiwgYmFzZVNjaGVtYUNvbnZlcnRPcHRpb25zKSB7XG4gICAgY29uc3Qgb3V0cHV0U2NoZW1hID0gZGVmLm91dHB1dFNjaGVtYTtcbiAgICBjb25zdCBzdGF0dXMgPSBmYWxsYmFja0NvbnRyYWN0Q29uZmlnKFwiZGVmYXVsdFN1Y2Nlc3NTdGF0dXNcIiwgZGVmLnJvdXRlLnN1Y2Nlc3NTdGF0dXMpO1xuICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gZmFsbGJhY2tDb250cmFjdENvbmZpZyhcImRlZmF1bHRTdWNjZXNzRGVzY3JpcHRpb25cIiwgZGVmLnJvdXRlPy5zdWNjZXNzRGVzY3JpcHRpb24pO1xuICAgIGNvbnN0IGV2ZW50SXRlcmF0b3JTY2hlbWFEZXRhaWxzID0gZ2V0RXZlbnRJdGVyYXRvclNjaGVtYURldGFpbHMob3V0cHV0U2NoZW1hKTtcbiAgICBjb25zdCBvdXRwdXRTdHJ1Y3R1cmUgPSBmYWxsYmFja0NvbnRyYWN0Q29uZmlnKFwiZGVmYXVsdE91dHB1dFN0cnVjdHVyZVwiLCBkZWYucm91dGUub3V0cHV0U3RydWN0dXJlKTtcbiAgICBpZiAoZXZlbnRJdGVyYXRvclNjaGVtYURldGFpbHMpIHtcbiAgICAgIHJlZi5yZXNwb25zZXMgPz89IHt9O1xuICAgICAgcmVmLnJlc3BvbnNlc1tzdGF0dXNdID0ge1xuICAgICAgICBkZXNjcmlwdGlvbixcbiAgICAgICAgY29udGVudDogdG9PcGVuQVBJRXZlbnRJdGVyYXRvckNvbnRlbnQoXG4gICAgICAgICAgYXdhaXQgdGhpcy5jb252ZXJ0ZXIuY29udmVydChldmVudEl0ZXJhdG9yU2NoZW1hRGV0YWlscy55aWVsZHMsIHsgLi4uYmFzZVNjaGVtYUNvbnZlcnRPcHRpb25zLCBzdHJhdGVneTogXCJvdXRwdXRcIiB9KSxcbiAgICAgICAgICBhd2FpdCB0aGlzLmNvbnZlcnRlci5jb252ZXJ0KGV2ZW50SXRlcmF0b3JTY2hlbWFEZXRhaWxzLnJldHVybnMsIHsgLi4uYmFzZVNjaGVtYUNvbnZlcnRPcHRpb25zLCBzdHJhdGVneTogXCJvdXRwdXRcIiB9KVxuICAgICAgICApXG4gICAgICB9O1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBbcmVxdWlyZWQsIGpzb25dID0gYXdhaXQgdGhpcy5jb252ZXJ0ZXIuY29udmVydChcbiAgICAgIG91dHB1dFNjaGVtYSxcbiAgICAgIHtcbiAgICAgICAgLi4uYmFzZVNjaGVtYUNvbnZlcnRPcHRpb25zLFxuICAgICAgICBzdHJhdGVneTogXCJvdXRwdXRcIixcbiAgICAgICAgbWluU3RydWN0dXJlRGVwdGhGb3JSZWY6IG91dHB1dFN0cnVjdHVyZSA9PT0gXCJkZXRhaWxlZFwiID8gMSA6IDBcbiAgICAgIH1cbiAgICApO1xuICAgIGlmIChvdXRwdXRTdHJ1Y3R1cmUgPT09IFwiY29tcGFjdFwiKSB7XG4gICAgICByZWYucmVzcG9uc2VzID8/PSB7fTtcbiAgICAgIHJlZi5yZXNwb25zZXNbc3RhdHVzXSA9IHtcbiAgICAgICAgZGVzY3JpcHRpb25cbiAgICAgIH07XG4gICAgICByZWYucmVzcG9uc2VzW3N0YXR1c10uY29udGVudCA9IHRvT3BlbkFQSUNvbnRlbnQoYXBwbHlTY2hlbWFPcHRpb25hbGl0eShyZXF1aXJlZCwganNvbikpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBoYW5kbGVkU3RhdHVzZXMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpO1xuICAgIGZvciAoY29uc3QgaXRlbSBvZiBleHBhbmRVbmlvblNjaGVtYShqc29uKSkge1xuICAgICAgY29uc3QgZXJyb3IgPSBuZXcgT3BlbkFQSUdlbmVyYXRvckVycm9yKGBcbiAgICAgICAgV2hlbiBvdXRwdXQgc3RydWN0dXJlIGlzIFwiZGV0YWlsZWRcIiwgb3V0cHV0IHNjaGVtYSBtdXN0IHNhdGlzZnk6XG4gICAgICAgIHsgXG4gICAgICAgICAgc3RhdHVzPzogbnVtYmVyLCAvLyBtdXN0IGJlIGEgbGl0ZXJhbCBudW1iZXIgYW5kIGluIHRoZSByYW5nZSBvZiAyMDAtMzk5XG4gICAgICAgICAgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBcbiAgICAgICAgICBib2R5PzogdW5rbm93biBcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgQnV0IGdvdDogJHtzdHJpbmdpZnlKU09OKGl0ZW0pfVxuICAgICAgYCk7XG4gICAgICBpZiAoIWlzT2JqZWN0U2NoZW1hKGl0ZW0pKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgbGV0IHNjaGVtYVN0YXR1cztcbiAgICAgIGxldCBzY2hlbWFEZXNjcmlwdGlvbjtcbiAgICAgIGlmIChpdGVtLnByb3BlcnRpZXM/LnN0YXR1cyAhPT0gdm9pZCAwKSB7XG4gICAgICAgIGNvbnN0IHN0YXR1c1NjaGVtYSA9IHJlc29sdmVPcGVuQVBJSnNvblNjaGVtYVJlZihkb2MsIGl0ZW0ucHJvcGVydGllcy5zdGF0dXMpO1xuICAgICAgICBpZiAodHlwZW9mIHN0YXR1c1NjaGVtYSAhPT0gXCJvYmplY3RcIiB8fCBzdGF0dXNTY2hlbWEuY29uc3QgPT09IHZvaWQgMCB8fCB0eXBlb2Ygc3RhdHVzU2NoZW1hLmNvbnN0ICE9PSBcIm51bWJlclwiIHx8ICFOdW1iZXIuaXNJbnRlZ2VyKHN0YXR1c1NjaGVtYS5jb25zdCkgfHwgaXNPUlBDRXJyb3JTdGF0dXMoc3RhdHVzU2NoZW1hLmNvbnN0KSkge1xuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHNjaGVtYVN0YXR1cyA9IHN0YXR1c1NjaGVtYS5jb25zdDtcbiAgICAgICAgc2NoZW1hRGVzY3JpcHRpb24gPSBzdGF0dXNTY2hlbWEuZGVzY3JpcHRpb247XG4gICAgICB9XG4gICAgICBjb25zdCBpdGVtU3RhdHVzID0gc2NoZW1hU3RhdHVzID8/IHN0YXR1cztcbiAgICAgIGNvbnN0IGl0ZW1EZXNjcmlwdGlvbiA9IHNjaGVtYURlc2NyaXB0aW9uID8/IGRlc2NyaXB0aW9uO1xuICAgICAgaWYgKGhhbmRsZWRTdGF0dXNlcy5oYXMoaXRlbVN0YXR1cykpIHtcbiAgICAgICAgdGhyb3cgbmV3IE9wZW5BUElHZW5lcmF0b3JFcnJvcihgXG4gICAgICAgICAgV2hlbiBvdXRwdXQgc3RydWN0dXJlIGlzIFwiZGV0YWlsZWRcIiwgZWFjaCBzdWNjZXNzIHN0YXR1cyBtdXN0IGJlIHVuaXF1ZS5cbiAgICAgICAgICBCdXQgZ290IHN0YXR1czogJHtpdGVtU3RhdHVzfSB1c2VkIG1vcmUgdGhhbiBvbmNlLlxuICAgICAgICBgKTtcbiAgICAgIH1cbiAgICAgIGhhbmRsZWRTdGF0dXNlcy5hZGQoaXRlbVN0YXR1cyk7XG4gICAgICByZWYucmVzcG9uc2VzID8/PSB7fTtcbiAgICAgIHJlZi5yZXNwb25zZXNbaXRlbVN0YXR1c10gPSB7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBpdGVtRGVzY3JpcHRpb25cbiAgICAgIH07XG4gICAgICBpZiAoaXRlbS5wcm9wZXJ0aWVzPy5oZWFkZXJzICE9PSB2b2lkIDApIHtcbiAgICAgICAgY29uc3QgaGVhZGVyc1NjaGVtYSA9IHJlc29sdmVPcGVuQVBJSnNvblNjaGVtYVJlZihkb2MsIGl0ZW0ucHJvcGVydGllcy5oZWFkZXJzKTtcbiAgICAgICAgaWYgKCFpc09iamVjdFNjaGVtYShoZWFkZXJzU2NoZW1hKSkge1xuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGhlYWRlcnNTY2hlbWEucHJvcGVydGllcykge1xuICAgICAgICAgIGNvbnN0IGhlYWRlclNjaGVtYSA9IGhlYWRlcnNTY2hlbWEucHJvcGVydGllc1trZXldO1xuICAgICAgICAgIGlmIChoZWFkZXJTY2hlbWEgIT09IHZvaWQgMCkge1xuICAgICAgICAgICAgcmVmLnJlc3BvbnNlc1tpdGVtU3RhdHVzXS5oZWFkZXJzID8/PSB7fTtcbiAgICAgICAgICAgIHJlZi5yZXNwb25zZXNbaXRlbVN0YXR1c10uaGVhZGVyc1trZXldID0ge1xuICAgICAgICAgICAgICBzY2hlbWE6IHRvT3BlbkFQSVNjaGVtYShoZWFkZXJTY2hlbWEpLFxuICAgICAgICAgICAgICByZXF1aXJlZDogaXRlbS5yZXF1aXJlZD8uaW5jbHVkZXMoXCJoZWFkZXJzXCIpICYmIGhlYWRlcnNTY2hlbWEucmVxdWlyZWQ/LmluY2x1ZGVzKGtleSlcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoaXRlbS5wcm9wZXJ0aWVzPy5ib2R5ICE9PSB2b2lkIDApIHtcbiAgICAgICAgcmVmLnJlc3BvbnNlc1tpdGVtU3RhdHVzXS5jb250ZW50ID0gdG9PcGVuQVBJQ29udGVudChcbiAgICAgICAgICBhcHBseVNjaGVtYU9wdGlvbmFsaXR5KGl0ZW0ucmVxdWlyZWQ/LmluY2x1ZGVzKFwiYm9keVwiKSA/PyBmYWxzZSwgaXRlbS5wcm9wZXJ0aWVzLmJvZHkpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGFzeW5jICNlcnJvclJlc3BvbnNlKHJlZiwgZGVmLCBiYXNlU2NoZW1hQ29udmVydE9wdGlvbnMsIHVuZGVmaW5lZEVycm9yU2NoZW1hLCBjdXN0b21FcnJvclJlc3BvbnNlQm9keVNjaGVtYSkge1xuICAgIGNvbnN0IGVycm9yTWFwID0gZGVmLmVycm9yTWFwO1xuICAgIGNvbnN0IGVycm9yUmVzcG9uc2VzQnlTdGF0dXMgPSB7fTtcbiAgICBmb3IgKGNvbnN0IGNvZGUgaW4gZXJyb3JNYXApIHtcbiAgICAgIGNvbnN0IGNvbmZpZyA9IGVycm9yTWFwW2NvZGVdO1xuICAgICAgaWYgKCFjb25maWcpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCBzdGF0dXMgPSBmYWxsYmFja09SUENFcnJvclN0YXR1cyhjb2RlLCBjb25maWcuc3RhdHVzKTtcbiAgICAgIGNvbnN0IGRlZmF1bHRNZXNzYWdlID0gZmFsbGJhY2tPUlBDRXJyb3JNZXNzYWdlKGNvZGUsIGNvbmZpZy5tZXNzYWdlKTtcbiAgICAgIGVycm9yUmVzcG9uc2VzQnlTdGF0dXNbc3RhdHVzXSA/Pz0geyBzdGF0dXMsIGRlZmluZWRFcnJvckRlZmluaXRpb25zOiBbXSwgZXJyb3JTY2hlbWFWYXJpYW50czogW10gfTtcbiAgICAgIGNvbnN0IFtkYXRhUmVxdWlyZWQsIGRhdGFTY2hlbWFdID0gYXdhaXQgdGhpcy5jb252ZXJ0ZXIuY29udmVydChjb25maWcuZGF0YSwgeyAuLi5iYXNlU2NoZW1hQ29udmVydE9wdGlvbnMsIHN0cmF0ZWd5OiBcIm91dHB1dFwiIH0pO1xuICAgICAgZXJyb3JSZXNwb25zZXNCeVN0YXR1c1tzdGF0dXNdLmRlZmluZWRFcnJvckRlZmluaXRpb25zLnB1c2goW2NvZGUsIGRlZmF1bHRNZXNzYWdlLCBkYXRhUmVxdWlyZWQsIGRhdGFTY2hlbWFdKTtcbiAgICAgIGVycm9yUmVzcG9uc2VzQnlTdGF0dXNbc3RhdHVzXS5lcnJvclNjaGVtYVZhcmlhbnRzLnB1c2goe1xuICAgICAgICB0eXBlOiBcIm9iamVjdFwiLFxuICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgZGVmaW5lZDogeyBjb25zdDogdHJ1ZSB9LFxuICAgICAgICAgIGNvZGU6IHsgY29uc3Q6IGNvZGUgfSxcbiAgICAgICAgICBzdGF0dXM6IHsgY29uc3Q6IHN0YXR1cyB9LFxuICAgICAgICAgIG1lc3NhZ2U6IHsgdHlwZTogXCJzdHJpbmdcIiwgZGVmYXVsdDogZGVmYXVsdE1lc3NhZ2UgfSxcbiAgICAgICAgICBkYXRhOiBkYXRhU2NoZW1hXG4gICAgICAgIH0sXG4gICAgICAgIHJlcXVpcmVkOiBkYXRhUmVxdWlyZWQgPyBbXCJkZWZpbmVkXCIsIFwiY29kZVwiLCBcInN0YXR1c1wiLCBcIm1lc3NhZ2VcIiwgXCJkYXRhXCJdIDogW1wiZGVmaW5lZFwiLCBcImNvZGVcIiwgXCJzdGF0dXNcIiwgXCJtZXNzYWdlXCJdXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmVmLnJlc3BvbnNlcyA/Pz0ge307XG4gICAgZm9yIChjb25zdCBzdGF0dXNTdHJpbmcgaW4gZXJyb3JSZXNwb25zZXNCeVN0YXR1cykge1xuICAgICAgY29uc3QgZXJyb3JSZXNwb25zZSA9IGVycm9yUmVzcG9uc2VzQnlTdGF0dXNbc3RhdHVzU3RyaW5nXTtcbiAgICAgIGNvbnN0IGN1c3RvbUJvZHlTY2hlbWEgPSB2YWx1ZShjdXN0b21FcnJvclJlc3BvbnNlQm9keVNjaGVtYSwgZXJyb3JSZXNwb25zZS5kZWZpbmVkRXJyb3JEZWZpbml0aW9ucywgZXJyb3JSZXNwb25zZS5zdGF0dXMpO1xuICAgICAgcmVmLnJlc3BvbnNlc1tzdGF0dXNTdHJpbmddID0ge1xuICAgICAgICBkZXNjcmlwdGlvbjogc3RhdHVzU3RyaW5nLFxuICAgICAgICBjb250ZW50OiB0b09wZW5BUElDb250ZW50KGN1c3RvbUJvZHlTY2hlbWEgPz8ge1xuICAgICAgICAgIG9uZU9mOiBbXG4gICAgICAgICAgICAuLi5lcnJvclJlc3BvbnNlLmVycm9yU2NoZW1hVmFyaWFudHMsXG4gICAgICAgICAgICB1bmRlZmluZWRFcnJvclNjaGVtYVxuICAgICAgICAgIF1cbiAgICAgICAgfSlcbiAgICAgIH07XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCB7IENvbXBvc2l0ZVNjaGVtYUNvbnZlcnRlciBhcyBDLCBMT0dJQ19LRVlXT1JEUyBhcyBMLCBPcGVuQVBJR2VuZXJhdG9yIGFzIE8sIGFwcGx5Q3VzdG9tT3BlbkFQSU9wZXJhdGlvbiBhcyBhLCB0b09wZW5BUElNZXRob2QgYXMgYiwgY3VzdG9tT3BlbkFQSU9wZXJhdGlvbiBhcyBjLCB0b09wZW5BUElDb250ZW50IGFzIGQsIHRvT3BlbkFQSUV2ZW50SXRlcmF0b3JDb250ZW50IGFzIGUsIHRvT3BlbkFQSVBhcmFtZXRlcnMgYXMgZiwgZ2V0Q3VzdG9tT3BlbkFQSU9wZXJhdGlvbiBhcyBnLCBjaGVja1BhcmFtc1NjaGVtYSBhcyBoLCB0b09wZW5BUElTY2hlbWEgYXMgaSwgaXNGaWxlU2NoZW1hIGFzIGosIGlzT2JqZWN0U2NoZW1hIGFzIGssIGlzQW55U2NoZW1hIGFzIGwsIGZpbHRlclNjaGVtYUJyYW5jaGVzIGFzIG0sIGFwcGx5U2NoZW1hT3B0aW9uYWxpdHkgYXMgbiwgZXhwYW5kVW5pb25TY2hlbWEgYXMgbywgZXhwYW5kQXJyYXlhYmxlU2NoZW1hIGFzIHAsIGlzUHJpbWl0aXZlU2NoZW1hIGFzIHEsIHJlc29sdmVPcGVuQVBJSnNvblNjaGVtYVJlZiBhcyByLCBzZXBhcmF0ZU9iamVjdFNjaGVtYSBhcyBzLCB0b09wZW5BUElQYXRoIGFzIHQgfTtcbiJdLCJ4X2dvb2dsZV9pZ25vcmVMaXN0IjpbMCwxXSwibWFwcGluZ3MiOiI7Ozs7OztBQVFBLElBQUk7Q0FDSCxTQUFTLGtCQUFrQjtBQUN4QixrQkFBaUIsVUFBVTtBQUMzQixrQkFBaUIsVUFBVTtBQUMzQixrQkFBaUIsWUFBWTtBQUM3QixrQkFBaUIsWUFBWTtBQUM3QixrQkFBaUIsZUFBZTtBQUNoQyxrQkFBaUIscUJBQXFCO0FBQ3RDLGtCQUFpQixZQUFZO0dBQzlCLG9CQUFvQixrQkFBa0IsRUFBRSxFQUFF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
|