angular-odata 0.130.0 → 0.131.0

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.
Files changed (159) hide show
  1. package/fesm2022/angular-odata.mjs +2298 -2162
  2. package/fesm2022/angular-odata.mjs.map +1 -1
  3. package/lib/api.d.ts +10 -11
  4. package/lib/cache/cache.d.ts +2 -2
  5. package/lib/cache/memory.d.ts +2 -2
  6. package/lib/cache/storage.d.ts +2 -2
  7. package/lib/loaders.d.ts +8 -8
  8. package/lib/metadata/csdl/csdl-annotation.d.ts +3 -3
  9. package/lib/metadata/csdl/csdl-entity-container.d.ts +2 -2
  10. package/lib/metadata/csdl/csdl-entity-set.d.ts +2 -2
  11. package/lib/metadata/csdl/csdl-enum-type.d.ts +3 -3
  12. package/lib/metadata/csdl/csdl-function-action.d.ts +4 -4
  13. package/lib/metadata/csdl/csdl-reference.d.ts +2 -2
  14. package/lib/metadata/csdl/csdl-schema.d.ts +2 -2
  15. package/lib/metadata/csdl/csdl-structural-property.d.ts +3 -3
  16. package/lib/metadata/csdl/csdl-structured-type.d.ts +3 -3
  17. package/lib/metadata/metadata.d.ts +2 -2
  18. package/lib/models/options.d.ts +2 -2
  19. package/lib/module.d.ts +3 -3
  20. package/lib/options.d.ts +3 -3
  21. package/lib/resources/query/expressions/apply.d.ts +1 -1
  22. package/lib/resources/query/expressions/compute.d.ts +1 -1
  23. package/lib/resources/query/expressions/count.d.ts +1 -1
  24. package/lib/resources/query/expressions/expand.d.ts +4 -3
  25. package/lib/resources/query/expressions/filter.d.ts +2 -1
  26. package/lib/resources/query/expressions/orderby.d.ts +2 -1
  27. package/lib/resources/query/expressions/search.d.ts +2 -1
  28. package/lib/resources/query/expressions/select.d.ts +2 -1
  29. package/lib/resources/query/handlers.d.ts +17 -5
  30. package/lib/resources/resource.d.ts +5 -5
  31. package/lib/resources/types/action.d.ts +2 -2
  32. package/lib/resources/types/entity-set.d.ts +2 -2
  33. package/lib/resources/types/navigation-property.d.ts +2 -2
  34. package/lib/resources/types/property.d.ts +2 -2
  35. package/lib/schema/annotation.d.ts +3 -3
  36. package/lib/schema/callable.d.ts +3 -3
  37. package/lib/schema/element.d.ts +3 -3
  38. package/lib/schema/entity-container.d.ts +2 -2
  39. package/lib/schema/entity-set.d.ts +2 -2
  40. package/lib/schema/enum-type.d.ts +2 -2
  41. package/lib/schema/parsers/callable.d.ts +4 -4
  42. package/lib/schema/parsers/enum-type.d.ts +3 -3
  43. package/lib/schema/parsers/structured-type.d.ts +4 -4
  44. package/lib/schema/schema.d.ts +3 -3
  45. package/lib/schema/singleton.d.ts +2 -2
  46. package/lib/schema/structured-type.d.ts +3 -3
  47. package/lib/services/entity.d.ts +1 -1
  48. package/lib/settings.d.ts +2 -2
  49. package/lib/types.d.ts +76 -74
  50. package/lib/utils/odata.d.ts +2 -2
  51. package/package.json +3 -5
  52. package/schematics/apigen/files/api-config/__fileName__.ts +4 -4
  53. package/esm2022/angular-odata.mjs +0 -5
  54. package/esm2022/lib/annotations.mjs +0 -146
  55. package/esm2022/lib/api.mjs +0 -439
  56. package/esm2022/lib/cache/cache.mjs +0 -177
  57. package/esm2022/lib/cache/index.mjs +0 -4
  58. package/esm2022/lib/cache/memory.mjs +0 -30
  59. package/esm2022/lib/cache/storage.mjs +0 -57
  60. package/esm2022/lib/client.mjs +0 -215
  61. package/esm2022/lib/constants.mjs +0 -95
  62. package/esm2022/lib/helper.mjs +0 -288
  63. package/esm2022/lib/index.mjs +0 -22
  64. package/esm2022/lib/loaders.mjs +0 -43
  65. package/esm2022/lib/metadata/csdl/csdl-annotation.mjs +0 -273
  66. package/esm2022/lib/metadata/csdl/csdl-entity-container.mjs +0 -59
  67. package/esm2022/lib/metadata/csdl/csdl-entity-set.mjs +0 -50
  68. package/esm2022/lib/metadata/csdl/csdl-enum-type.mjs +0 -74
  69. package/esm2022/lib/metadata/csdl/csdl-function-action.mjs +0 -204
  70. package/esm2022/lib/metadata/csdl/csdl-navigation-property-binding.mjs +0 -15
  71. package/esm2022/lib/metadata/csdl/csdl-reference.mjs +0 -76
  72. package/esm2022/lib/metadata/csdl/csdl-schema.mjs +0 -87
  73. package/esm2022/lib/metadata/csdl/csdl-singleton.mjs +0 -37
  74. package/esm2022/lib/metadata/csdl/csdl-structural-property.mjs +0 -145
  75. package/esm2022/lib/metadata/csdl/csdl-structured-type.mjs +0 -159
  76. package/esm2022/lib/metadata/csdl/csdl-type-definition.mjs +0 -46
  77. package/esm2022/lib/metadata/index.mjs +0 -3
  78. package/esm2022/lib/metadata/metadata.mjs +0 -41
  79. package/esm2022/lib/metadata/parser.mjs +0 -564
  80. package/esm2022/lib/models/collection.mjs +0 -816
  81. package/esm2022/lib/models/index.mjs +0 -4
  82. package/esm2022/lib/models/model.mjs +0 -577
  83. package/esm2022/lib/models/options.mjs +0 -1227
  84. package/esm2022/lib/module.mjs +0 -55
  85. package/esm2022/lib/options.mjs +0 -91
  86. package/esm2022/lib/resources/index.mjs +0 -7
  87. package/esm2022/lib/resources/options.mjs +0 -66
  88. package/esm2022/lib/resources/path/handlers.mjs +0 -81
  89. package/esm2022/lib/resources/path/index.mjs +0 -3
  90. package/esm2022/lib/resources/path/segments.mjs +0 -149
  91. package/esm2022/lib/resources/query/builder.mjs +0 -645
  92. package/esm2022/lib/resources/query/expressions/apply.mjs +0 -238
  93. package/esm2022/lib/resources/query/expressions/base.mjs +0 -26
  94. package/esm2022/lib/resources/query/expressions/compute.mjs +0 -55
  95. package/esm2022/lib/resources/query/expressions/count.mjs +0 -118
  96. package/esm2022/lib/resources/query/expressions/expand.mjs +0 -154
  97. package/esm2022/lib/resources/query/expressions/filter.mjs +0 -180
  98. package/esm2022/lib/resources/query/expressions/index.mjs +0 -10
  99. package/esm2022/lib/resources/query/expressions/orderby.mjs +0 -81
  100. package/esm2022/lib/resources/query/expressions/search.mjs +0 -144
  101. package/esm2022/lib/resources/query/expressions/select.mjs +0 -49
  102. package/esm2022/lib/resources/query/expressions/syntax.mjs +0 -770
  103. package/esm2022/lib/resources/query/handlers.mjs +0 -423
  104. package/esm2022/lib/resources/query/index.mjs +0 -5
  105. package/esm2022/lib/resources/query/options.mjs +0 -140
  106. package/esm2022/lib/resources/request.mjs +0 -210
  107. package/esm2022/lib/resources/resource.mjs +0 -316
  108. package/esm2022/lib/resources/response.mjs +0 -180
  109. package/esm2022/lib/resources/types/action.mjs +0 -118
  110. package/esm2022/lib/resources/types/batch.mjs +0 -428
  111. package/esm2022/lib/resources/types/count.mjs +0 -33
  112. package/esm2022/lib/resources/types/entity-set.mjs +0 -131
  113. package/esm2022/lib/resources/types/entity.mjs +0 -112
  114. package/esm2022/lib/resources/types/function.mjs +0 -149
  115. package/esm2022/lib/resources/types/index.mjs +0 -15
  116. package/esm2022/lib/resources/types/media.mjs +0 -44
  117. package/esm2022/lib/resources/types/metadata.mjs +0 -35
  118. package/esm2022/lib/resources/types/navigation-property.mjs +0 -246
  119. package/esm2022/lib/resources/types/options.mjs +0 -2
  120. package/esm2022/lib/resources/types/property.mjs +0 -187
  121. package/esm2022/lib/resources/types/reference.mjs +0 -87
  122. package/esm2022/lib/resources/types/singleton.mjs +0 -125
  123. package/esm2022/lib/resources/types/value.mjs +0 -48
  124. package/esm2022/lib/schema/annotation.mjs +0 -44
  125. package/esm2022/lib/schema/callable.mjs +0 -69
  126. package/esm2022/lib/schema/element.mjs +0 -70
  127. package/esm2022/lib/schema/entity-container.mjs +0 -13
  128. package/esm2022/lib/schema/entity-set.mjs +0 -11
  129. package/esm2022/lib/schema/enum-type.mjs +0 -69
  130. package/esm2022/lib/schema/index.mjs +0 -9
  131. package/esm2022/lib/schema/parsers/callable.mjs +0 -123
  132. package/esm2022/lib/schema/parsers/edm.mjs +0 -101
  133. package/esm2022/lib/schema/parsers/enum-type.mjs +0 -148
  134. package/esm2022/lib/schema/parsers/index.mjs +0 -5
  135. package/esm2022/lib/schema/parsers/structured-type.mjs +0 -548
  136. package/esm2022/lib/schema/schema.mjs +0 -52
  137. package/esm2022/lib/schema/singleton.mjs +0 -11
  138. package/esm2022/lib/schema/structured-type.mjs +0 -220
  139. package/esm2022/lib/services/base.mjs +0 -32
  140. package/esm2022/lib/services/entity-set.mjs +0 -161
  141. package/esm2022/lib/services/entity.mjs +0 -12
  142. package/esm2022/lib/services/factory.mjs +0 -39
  143. package/esm2022/lib/services/index.mjs +0 -5
  144. package/esm2022/lib/services/singleton.mjs +0 -55
  145. package/esm2022/lib/settings.mjs +0 -113
  146. package/esm2022/lib/types.mjs +0 -118
  147. package/esm2022/lib/utils/arraybuffers.mjs +0 -46
  148. package/esm2022/lib/utils/arrays.mjs +0 -10
  149. package/esm2022/lib/utils/dates.mjs +0 -18
  150. package/esm2022/lib/utils/durations.mjs +0 -40
  151. package/esm2022/lib/utils/enums.mjs +0 -61
  152. package/esm2022/lib/utils/http.mjs +0 -95
  153. package/esm2022/lib/utils/index.mjs +0 -10
  154. package/esm2022/lib/utils/objects.mjs +0 -204
  155. package/esm2022/lib/utils/odata.mjs +0 -22
  156. package/esm2022/lib/utils/strings.mjs +0 -20
  157. package/esm2022/lib/utils/types.mjs +0 -136
  158. package/esm2022/lib/utils/urls.mjs +0 -24
  159. package/esm2022/public-api.mjs +0 -5
@@ -1,645 +0,0 @@
1
- const COMPARISON_OPERATORS = ['eq', 'ne', 'gt', 'ge', 'lt', 'le'];
2
- const LOGICAL_OPERATORS = ['and', 'or', 'not'];
3
- const COLLECTION_OPERATORS = ['any', 'all'];
4
- const BOOLEAN_FUNCTIONS = ['startswith', 'endswith', 'contains'];
5
- const SUPPORTED_EXPAND_PROPERTIES = [
6
- 'expand',
7
- 'levels',
8
- 'select',
9
- 'top',
10
- 'count',
11
- 'orderby',
12
- 'filter',
13
- ];
14
- const FUNCTION_REGEX = /\((.*)\)/;
15
- const INDEXOF_REGEX = /(?!indexof)\((\w+)\)/;
16
- export var StandardAggregateMethods;
17
- (function (StandardAggregateMethods) {
18
- StandardAggregateMethods["sum"] = "sum";
19
- StandardAggregateMethods["min"] = "min";
20
- StandardAggregateMethods["max"] = "max";
21
- StandardAggregateMethods["average"] = "average";
22
- StandardAggregateMethods["countdistinct"] = "countdistinct";
23
- })(StandardAggregateMethods || (StandardAggregateMethods = {}));
24
- export var QueryCustomTypes;
25
- (function (QueryCustomTypes) {
26
- QueryCustomTypes[QueryCustomTypes["Raw"] = 0] = "Raw";
27
- QueryCustomTypes[QueryCustomTypes["Alias"] = 1] = "Alias";
28
- QueryCustomTypes[QueryCustomTypes["Duration"] = 2] = "Duration";
29
- QueryCustomTypes[QueryCustomTypes["Binary"] = 3] = "Binary";
30
- })(QueryCustomTypes || (QueryCustomTypes = {}));
31
- //https://docs.oasis-open.org/odata/odata/v4.01/odata-v4.01-part2-url-conventions.html#sec_QueryOptions
32
- export const raw = (value) => ({
33
- type: QueryCustomTypes.Raw,
34
- value,
35
- });
36
- export const alias = (value, name) => ({
37
- type: QueryCustomTypes.Alias,
38
- value,
39
- name,
40
- });
41
- export const duration = (value) => ({
42
- type: QueryCustomTypes.Duration,
43
- value,
44
- });
45
- export const binary = (value) => ({
46
- type: QueryCustomTypes.Binary,
47
- value,
48
- });
49
- export const isQueryCustomType = (value) => typeof value === 'object' &&
50
- 'type' in value &&
51
- value.type in QueryCustomTypes;
52
- export const isRawType = (value) => isQueryCustomType(value) &&
53
- value.type === QueryCustomTypes.Raw;
54
- export const ITEM_ROOT = '';
55
- export default function ({ select, search, skiptoken, format, top, skip, filter, transform, compute, orderBy, key, count, expand, action, func, aliases, escape, } = {}) {
56
- const [path, params] = buildPathAndQuery({
57
- select,
58
- search,
59
- skiptoken,
60
- format,
61
- top,
62
- skip,
63
- filter,
64
- transform,
65
- compute,
66
- orderBy,
67
- key,
68
- count,
69
- expand,
70
- action,
71
- func,
72
- aliases,
73
- escape,
74
- });
75
- return buildUrl(path, params);
76
- }
77
- export function buildPathAndQuery({ select, search, skiptoken, format, top, skip, filter, apply, transform, compute, orderBy, key, count, expand, action, func, aliases, escape, } = {}) {
78
- let path = '';
79
- aliases = aliases || [];
80
- const query = {};
81
- // key is not (null, undefined)
82
- if (key != undefined) {
83
- path += `(${normalizeValue(key, { aliases, escape })})`;
84
- }
85
- // Select
86
- if (select) {
87
- query.$select = isRawType(select)
88
- ? select.value
89
- : Array.isArray(select)
90
- ? select.join(',')
91
- : select;
92
- }
93
- // Compute
94
- if (compute) {
95
- query.$compute = isRawType(compute)
96
- ? compute.value
97
- : Array.isArray(compute)
98
- ? compute.join(',')
99
- : compute;
100
- }
101
- // Search
102
- if (search) {
103
- query.$search = search;
104
- }
105
- // Skiptoken
106
- if (skiptoken) {
107
- query.$skiptoken = skiptoken;
108
- }
109
- // Format
110
- if (format) {
111
- query.$format = format;
112
- }
113
- // Filter
114
- if (filter || typeof count === 'object') {
115
- query.$filter = buildFilter(typeof count === 'object' ? count : filter, {
116
- aliases,
117
- escape,
118
- });
119
- }
120
- // Transform
121
- if (transform) {
122
- query.$apply = buildTransforms(transform, { aliases, escape });
123
- }
124
- // Apply
125
- if (apply) {
126
- query.$apply = query.$apply
127
- ? query.$apply + '/' + buildApply(apply, { aliases, escape })
128
- : buildApply(apply, { aliases, escape });
129
- }
130
- // Expand
131
- if (expand) {
132
- query.$expand = buildExpand(expand, { aliases, escape });
133
- }
134
- // OrderBy
135
- if (orderBy) {
136
- query.$orderby = buildOrderBy(orderBy);
137
- }
138
- // Count
139
- if (isRawType(count)) {
140
- query.$count = count.value;
141
- }
142
- else if (typeof count === 'boolean') {
143
- query.$count = true;
144
- }
145
- else if (count) {
146
- path += '/$count';
147
- }
148
- // Top
149
- if (isRawType(top)) {
150
- query.$top = top.value;
151
- }
152
- else if (typeof top === 'number') {
153
- query.$top = top;
154
- }
155
- // Skip
156
- if (isRawType(skip)) {
157
- query.$top = skip.value;
158
- }
159
- else if (typeof skip === 'number') {
160
- query.$skip = skip;
161
- }
162
- if (action) {
163
- path += `/${action}`;
164
- }
165
- if (func) {
166
- if (typeof func === 'string') {
167
- path += `/${func}()`;
168
- }
169
- else if (typeof func === 'object') {
170
- const [funcName] = Object.keys(func);
171
- const funcArgs = normalizeValue(func[funcName], {
172
- aliases,
173
- escape,
174
- });
175
- path += `/${funcName}(${funcArgs})`;
176
- }
177
- }
178
- if (aliases.length > 0) {
179
- Object.assign(query, aliases.reduce((acc, alias) => Object.assign(acc, {
180
- [`@${alias.name}`]: normalizeValue(alias.value, {
181
- escape,
182
- }),
183
- }), {}));
184
- }
185
- // Filter empty values
186
- const params = Object.entries(query)
187
- .filter(([, value]) => value !== undefined && value !== '')
188
- .reduce((acc, [key, value]) => Object.assign(acc, { [key]: value }), {});
189
- return [path, params];
190
- }
191
- function renderPrimitiveValue(key, val, { aliases, escape, }) {
192
- return `${key} eq ${normalizeValue(val, { aliases, escape })}`;
193
- }
194
- function buildFilter(filters = {}, { aliases, propPrefix, escape, }) {
195
- return (Array.isArray(filters) ? filters : [filters]).reduce((acc, filter) => {
196
- if (filter) {
197
- const builtFilter = buildFilterCore(filter, {
198
- aliases,
199
- propPrefix,
200
- escape,
201
- });
202
- if (builtFilter) {
203
- acc.push(builtFilter);
204
- }
205
- }
206
- return acc;
207
- }, []).join(' and ');
208
- function buildFilterCore(filter = {}, { aliases, propPrefix, escape, }) {
209
- let filterExpr = '';
210
- if (isRawType(filter)) {
211
- // Use raw query custom filter string
212
- filterExpr = filter.value;
213
- }
214
- else if (typeof filter === 'string') {
215
- // Use raw filter string
216
- filterExpr = filter;
217
- }
218
- else if (filter && typeof filter === 'object') {
219
- const filtersArray = Object.keys(filter).reduce((result, filterKey) => {
220
- const value = filter[filterKey];
221
- let propName = '';
222
- if (propPrefix) {
223
- if (filterKey === ITEM_ROOT) {
224
- propName = propPrefix;
225
- }
226
- else if (INDEXOF_REGEX.test(filterKey)) {
227
- propName = filterKey.replace(INDEXOF_REGEX, (_, $1) => $1.trim() === ITEM_ROOT
228
- ? `(${propPrefix})`
229
- : `(${propPrefix}/${$1.trim()})`);
230
- }
231
- else if (FUNCTION_REGEX.test(filterKey)) {
232
- propName = filterKey.replace(FUNCTION_REGEX, (_, $1) => $1.trim() === ITEM_ROOT
233
- ? `(${propPrefix})`
234
- : `(${propPrefix}/${$1.trim()})`);
235
- }
236
- else {
237
- propName = `${propPrefix}/${filterKey}`;
238
- }
239
- }
240
- else {
241
- propName = filterKey;
242
- }
243
- if (filterKey === ITEM_ROOT && Array.isArray(value)) {
244
- return result.concat(value.map((arrayValue) => renderPrimitiveValue(propName, arrayValue, { escape, aliases })));
245
- }
246
- if (['number', 'string', 'boolean'].indexOf(typeof value) !== -1 ||
247
- value instanceof Date ||
248
- value === null) {
249
- // Simple key/value handled as equals operator
250
- result.push(renderPrimitiveValue(propName, value, { aliases, escape }));
251
- }
252
- else if (Array.isArray(value)) {
253
- const op = filterKey;
254
- const builtFilters = value
255
- .map((v) => buildFilter(v, { aliases, propPrefix, escape }))
256
- .filter((f) => f)
257
- .map((f) => LOGICAL_OPERATORS.indexOf(op) !== -1 ? `(${f})` : f);
258
- if (builtFilters.length) {
259
- if (LOGICAL_OPERATORS.indexOf(op) !== -1) {
260
- if (builtFilters.length) {
261
- if (op === 'not') {
262
- result.push(parseNot(builtFilters));
263
- }
264
- else {
265
- result.push(`(${builtFilters.join(` ${op} `)})`);
266
- }
267
- }
268
- }
269
- else {
270
- result.push(builtFilters.join(` ${op} `));
271
- }
272
- }
273
- }
274
- else if (LOGICAL_OPERATORS.indexOf(propName) !== -1) {
275
- const op = propName;
276
- const builtFilters = Object.keys(value).map((valueKey) => buildFilterCore({ [valueKey]: value[valueKey] }, { aliases, escape }));
277
- if (builtFilters.length) {
278
- if (op === 'not') {
279
- result.push(parseNot(builtFilters));
280
- }
281
- else {
282
- result.push(`${builtFilters.join(` ${op} `)}`);
283
- }
284
- }
285
- }
286
- else if (typeof value === 'object') {
287
- if ('type' in value) {
288
- result.push(renderPrimitiveValue(propName, value, { aliases, escape }));
289
- }
290
- else {
291
- const operators = Object.keys(value);
292
- operators.forEach((op) => {
293
- if (COMPARISON_OPERATORS.indexOf(op) !== -1) {
294
- result.push(`${propName} ${op} ${normalizeValue(value[op], {
295
- aliases,
296
- escape,
297
- })}`);
298
- }
299
- else if (LOGICAL_OPERATORS.indexOf(op) !== -1) {
300
- if (Array.isArray(value[op])) {
301
- result.push(value[op]
302
- .map((v) => '(' +
303
- buildFilterCore(v, {
304
- aliases,
305
- propPrefix: propName,
306
- escape,
307
- }) +
308
- ')')
309
- .join(` ${op} `));
310
- }
311
- else {
312
- result.push('(' +
313
- buildFilterCore(value[op], {
314
- aliases,
315
- propPrefix: propName,
316
- escape,
317
- }) +
318
- ')');
319
- }
320
- }
321
- else if (COLLECTION_OPERATORS.indexOf(op) !== -1) {
322
- const collectionClause = buildCollectionClause(filterKey.toLowerCase(), value[op], op, propName);
323
- if (collectionClause) {
324
- result.push(collectionClause);
325
- }
326
- }
327
- else if (op === 'has') {
328
- result.push(`${propName} ${op} ${normalizeValue(value[op], {
329
- aliases,
330
- escape,
331
- })}`);
332
- }
333
- else if (op === 'in') {
334
- const resultingValues = Array.isArray(value[op])
335
- ? value[op]
336
- : value[op].value.map((typedValue) => ({
337
- type: value[op].type,
338
- value: typedValue,
339
- }));
340
- result.push(propName +
341
- ' in (' +
342
- resultingValues
343
- .map((v) => normalizeValue(v, { aliases, escape }))
344
- .join(',') +
345
- ')');
346
- }
347
- else if (BOOLEAN_FUNCTIONS.indexOf(op) !== -1) {
348
- // Simple boolean functions (startswith, endswith, contains)
349
- result.push(`${op}(${propName},${normalizeValue(value[op], {
350
- aliases,
351
- escape,
352
- })})`);
353
- }
354
- else {
355
- // Nested property
356
- const filter = buildFilterCore(value, {
357
- aliases,
358
- propPrefix: propName,
359
- escape,
360
- });
361
- if (filter) {
362
- result.push(filter);
363
- }
364
- }
365
- });
366
- }
367
- }
368
- else if (value === undefined) {
369
- // Ignore/omit filter if value is `undefined`
370
- }
371
- else {
372
- throw new Error(`Unexpected value type: ${value}`);
373
- }
374
- return result;
375
- }, []);
376
- filterExpr = filtersArray.join(' and ');
377
- } /* else {
378
- throw new Error(`Unexpected filters type: ${filter}`);
379
- } */
380
- return filterExpr;
381
- }
382
- function buildCollectionClause(lambdaParameter, value, op, propName) {
383
- let clause = '';
384
- if (typeof value === 'string' || value instanceof String) {
385
- clause = getStringCollectionClause(lambdaParameter, value, op, propName);
386
- }
387
- else if (value) {
388
- // normalize {any:[{prop1: 1}, {prop2: 1}]} --> {any:{prop1: 1, prop2: 1}}; same for 'all',
389
- // simple values collection: {any:[{'': 'simpleVal1'}, {'': 'simpleVal2'}]} --> {any:{'': ['simpleVal1', 'simpleVal2']}}; same for 'all',
390
- const filterValue = Array.isArray(value)
391
- ? value.reduce((acc, item) => {
392
- if (item.hasOwnProperty(ITEM_ROOT)) {
393
- if (!acc.hasOwnProperty(ITEM_ROOT)) {
394
- acc[ITEM_ROOT] = [];
395
- }
396
- acc[ITEM_ROOT].push(item[ITEM_ROOT]);
397
- return acc;
398
- }
399
- return { ...acc, ...item };
400
- }, {})
401
- : value;
402
- const filter = buildFilterCore(filterValue, {
403
- aliases,
404
- propPrefix: lambdaParameter,
405
- escape,
406
- });
407
- clause = `${propName}/${op}(${filter ? `${lambdaParameter}:${filter}` : ''})`;
408
- }
409
- return clause;
410
- }
411
- }
412
- function getStringCollectionClause(lambdaParameter, value, collectionOperator, propName) {
413
- let clause = '';
414
- const conditionOperator = collectionOperator == 'all' ? 'ne' : 'eq';
415
- clause = `${propName}/${collectionOperator}(${lambdaParameter}: ${lambdaParameter} ${conditionOperator} '${value}')`;
416
- return clause;
417
- }
418
- function escapeIllegalChars(string) {
419
- string = string.replace(/%/g, '%25');
420
- string = string.replace(/\+/g, '%2B');
421
- string = string.replace(/\//g, '%2F');
422
- string = string.replace(/\?/g, '%3F');
423
- string = string.replace(/#/g, '%23');
424
- string = string.replace(/&/g, '%26');
425
- string = string.replace(/'/g, "''");
426
- return string;
427
- }
428
- export function normalizeValue(value, { aliases, escape = false, } = {}) {
429
- if (typeof value === 'string') {
430
- return escape ? `'${escapeIllegalChars(value)}'` : `'${value}'`;
431
- }
432
- else if (value instanceof Date) {
433
- return value.toISOString();
434
- }
435
- else if (typeof value === 'number') {
436
- return value;
437
- }
438
- else if (Array.isArray(value)) {
439
- return `[${value
440
- .map((d) => normalizeValue(d, { aliases, escape }))
441
- .join(',')}]`;
442
- }
443
- else if (value === null) {
444
- return value;
445
- }
446
- else if (typeof value === 'object') {
447
- switch (value.type) {
448
- case QueryCustomTypes.Raw:
449
- return value.value;
450
- case QueryCustomTypes.Duration:
451
- return `duration'${value.value}'`;
452
- case QueryCustomTypes.Binary:
453
- return `binary'${value.value}'`;
454
- case QueryCustomTypes.Alias:
455
- // Store
456
- if (Array.isArray(aliases)) {
457
- if (value.name === undefined) {
458
- value.name = `a${aliases.length + 1}`;
459
- }
460
- aliases.push(value);
461
- }
462
- return `@${value.name}`;
463
- default:
464
- return Object.entries(value)
465
- .filter(([, v]) => v !== undefined)
466
- .map(([k, v]) => `${k}=${normalizeValue(v, { aliases, escape })}`)
467
- .join(',');
468
- }
469
- }
470
- return value;
471
- }
472
- function buildExpand(expands, { aliases, escape = false, }) {
473
- if (isRawType(expands)) {
474
- return expands.value;
475
- }
476
- else if (typeof expands === 'number') {
477
- return expands;
478
- }
479
- else if (typeof expands === 'string') {
480
- if (expands.indexOf('/') === -1) {
481
- return expands;
482
- }
483
- // Change `Foo/Bar/Baz` to `Foo($expand=Bar($expand=Baz))`
484
- return expands
485
- .split('/')
486
- .reverse()
487
- .reduce((results, item, index, arr) => {
488
- if (index === 0) {
489
- // Inner-most item
490
- return `$expand=${item}`;
491
- }
492
- else if (index === arr.length - 1) {
493
- // Outer-most item, don't add `$expand=` prefix (added above)
494
- return `${item}(${results})`;
495
- }
496
- else {
497
- // Other items
498
- return `$expand=${item}(${results})`;
499
- }
500
- }, '');
501
- }
502
- else if (Array.isArray(expands)) {
503
- return `${expands
504
- .map((e) => buildExpand(e, { aliases, escape }))
505
- .join(',')}`;
506
- }
507
- else if (typeof expands === 'object') {
508
- const expandKeys = Object.keys(expands);
509
- if (expandKeys.some((key) => SUPPORTED_EXPAND_PROPERTIES.indexOf(key.toLowerCase()) !== -1)) {
510
- return expandKeys
511
- .map((key) => {
512
- let value;
513
- switch (key) {
514
- case 'filter':
515
- value = buildFilter(expands[key], {
516
- aliases,
517
- escape,
518
- });
519
- break;
520
- case 'orderBy':
521
- value = buildOrderBy(expands[key]);
522
- break;
523
- case 'levels':
524
- case 'count':
525
- case 'top':
526
- case 'skip':
527
- value = `${expands[key]}`;
528
- if (isRawType(value))
529
- value = value.value;
530
- break;
531
- default:
532
- value = buildExpand(expands[key], { aliases, escape });
533
- }
534
- return `$${key.toLowerCase()}=${value}`;
535
- })
536
- .join(';');
537
- }
538
- else {
539
- return expandKeys
540
- .map((key) => {
541
- const builtExpand = buildExpand(expands[key], { aliases, escape });
542
- return builtExpand ? `${key}(${builtExpand})` : key;
543
- })
544
- .join(',');
545
- }
546
- }
547
- return '';
548
- }
549
- function buildTransforms(transforms, { aliases, escape = false, }) {
550
- // Wrap single object an array for simplified processing
551
- const transformsArray = Array.isArray(transforms) ? transforms : [transforms];
552
- const transformsResult = transformsArray.reduce((result, transform) => {
553
- const { aggregate, filter, groupBy, ...rest } = transform;
554
- // TODO: support as many of the following:
555
- // topcount, topsum, toppercent,
556
- // bottomsum, bottomcount, bottompercent,
557
- // identity, concat, expand, search, compute, isdefined
558
- const unsupportedKeys = Object.keys(rest);
559
- if (unsupportedKeys.length) {
560
- throw new Error(`Unsupported transform(s): ${unsupportedKeys}`);
561
- }
562
- if (aggregate) {
563
- result.push(`aggregate(${buildAggregate(aggregate)})`);
564
- }
565
- if (filter) {
566
- const builtFilter = buildFilter(filter, { aliases, escape });
567
- if (builtFilter) {
568
- result.push(`filter(${buildFilter(builtFilter, { aliases, escape })})`);
569
- }
570
- }
571
- if (groupBy) {
572
- result.push(`groupby(${buildGroupBy(groupBy, { aliases, escape })})`);
573
- }
574
- return result;
575
- }, []);
576
- return transformsResult.join('/') || undefined;
577
- }
578
- function buildAggregate(aggregate) {
579
- // Wrap single object in an array for simplified processing
580
- const aggregateArray = Array.isArray(aggregate) ? aggregate : [aggregate];
581
- return aggregateArray
582
- .map((aggregateItem) => {
583
- return typeof aggregateItem === 'string'
584
- ? aggregateItem
585
- : Object.keys(aggregateItem).map((aggregateKey) => {
586
- const aggregateValue = aggregateItem[aggregateKey];
587
- // TODO: Are these always required? Can/should we default them if so?
588
- if (!aggregateValue.with) {
589
- throw new Error(`'with' property required for '${aggregateKey}'`);
590
- }
591
- if (!aggregateValue.as) {
592
- throw new Error(`'as' property required for '${aggregateKey}'`);
593
- }
594
- return `${aggregateKey} with ${aggregateValue.with} as ${aggregateValue.as}`;
595
- });
596
- })
597
- .join(',');
598
- }
599
- function buildGroupBy(groupBy, { aliases, escape = false, }) {
600
- if (!groupBy.properties) {
601
- throw new Error(`'properties' property required for groupBy`);
602
- }
603
- let result = `(${groupBy.properties.join(',')})`;
604
- if (groupBy.transform) {
605
- result += `,${buildTransforms(groupBy.transform, { aliases, escape })}`;
606
- }
607
- return result;
608
- }
609
- function buildOrderBy(orderBy, prefix = '') {
610
- if (isRawType(orderBy)) {
611
- return orderBy.value;
612
- }
613
- else if (Array.isArray(orderBy)) {
614
- return orderBy
615
- .map((value) => Array.isArray(value) &&
616
- value.length === 2 &&
617
- ['asc', 'desc'].indexOf(value[1]) !== -1
618
- ? value.join(' ')
619
- : value)
620
- .map((v) => `${prefix}${v}`)
621
- .join(',');
622
- }
623
- else if (typeof orderBy === 'object') {
624
- return Object.entries(orderBy)
625
- .map(([k, v]) => buildOrderBy(v, `${k}/`))
626
- .map((v) => `${prefix}${v}`)
627
- .join(',');
628
- }
629
- return `${prefix}${orderBy}`;
630
- }
631
- function buildApply(apply, { aliases, escape = false, }) {
632
- const applyArray = Array.isArray(apply) ? apply : [apply];
633
- return applyArray
634
- .map((v) => normalizeValue(v, { aliases, escape }))
635
- .join('/');
636
- }
637
- function buildUrl(path, params) {
638
- // This can be refactored using URL API. But IE does not support it.
639
- const queries = Object.entries(params).map(([key, value]) => `${key}=${value}`);
640
- return queries.length ? `${path}?${queries.join('&')}` : path;
641
- }
642
- function parseNot(builtFilters) {
643
- return `not (${builtFilters.join(' and ')})`;
644
- }
645
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItb2RhdGEvc3JjL2xpYi9yZXNvdXJjZXMvcXVlcnkvYnVpbGRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLG9CQUFvQixHQUFHLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztBQUNsRSxNQUFNLGlCQUFpQixHQUFHLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztBQUMvQyxNQUFNLG9CQUFvQixHQUFHLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQzVDLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxZQUFZLEVBQUUsVUFBVSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0FBQ2pFLE1BQU0sMkJBQTJCLEdBQUc7SUFDbEMsUUFBUTtJQUNSLFFBQVE7SUFDUixRQUFRO0lBQ1IsS0FBSztJQUNMLE9BQU87SUFDUCxTQUFTO0lBQ1QsUUFBUTtDQUNULENBQUM7QUFFRixNQUFNLGNBQWMsR0FBRyxVQUFVLENBQUM7QUFDbEMsTUFBTSxhQUFhLEdBQUcsc0JBQXNCLENBQUM7QUFRN0MsTUFBTSxDQUFOLElBQVksd0JBTVg7QUFORCxXQUFZLHdCQUF3QjtJQUNsQyx1Q0FBVyxDQUFBO0lBQ1gsdUNBQVcsQ0FBQTtJQUNYLHVDQUFXLENBQUE7SUFDWCwrQ0FBbUIsQ0FBQTtJQUNuQiwyREFBK0IsQ0FBQTtBQUNqQyxDQUFDLEVBTlcsd0JBQXdCLEtBQXhCLHdCQUF3QixRQU1uQztBQTZDRCxNQUFNLENBQU4sSUFBWSxnQkFLWDtBQUxELFdBQVksZ0JBQWdCO0lBQzFCLHFEQUFHLENBQUE7SUFDSCx5REFBSyxDQUFBO0lBQ0wsK0RBQVEsQ0FBQTtJQUNSLDJEQUFNLENBQUE7QUFDUixDQUFDLEVBTFcsZ0JBQWdC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QyxPQUFPLFFBQVEsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDO0FBQy9DLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBDT01QQVJJU09OX09QRVJBVE9SUyA9IFsnZXEnLCAnbmUnLCAnZ3QnLCAnZ2UnLCAnbHQnLCAnbGUnXTtcbmNvbnN0IExPR0lDQUxfT1BFUkFUT1JTID0gWydhbmQnLCAnb3InLCAnbm90J107XG5jb25zdCBDT0xMRUNUSU9OX09QRVJBVE9SUyA9IFsnYW55JywgJ2FsbCddO1xuY29uc3QgQk9PTEVBTl9GVU5DVElPTlMgPSBbJ3N0YXJ0c3dpdGgnLCAnZW5kc3dpdGgnLCAnY29udGFpbnMnXTtcbmNvbnN0IFNVUFBPUlRFRF9FWFBBTkRfUFJPUEVSVElFUyA9IFtcbiAgJ2V4cGFuZCcsXG4gICdsZXZlbHMnLFxuICAnc2VsZWN0JyxcbiAgJ3RvcCcsXG4gICdjb3VudCcsXG4gICdvcmRlcmJ5JyxcbiAgJ2ZpbHRlcicsXG5dO1xuXG5jb25zdCBGVU5DVElPTl9SRUdFWCA9IC9cXCgoLiopXFwpLztcbmNvbnN0IElOREVYT0ZfUkVHRVggPSAvKD8haW5kZXhvZilcXCgoXFx3KylcXCkvO1xuXG5leHBvcnQgdHlwZSBVbnBhY2tlZDxUPiA9IFQgZXh0ZW5kcyAoaW5mZXIgVSlbXSA/IFUgOiBUO1xuZXhwb3J0IHR5cGUgU2VsZWN0PFQ+ID0gU2VsZWN0VHlwZTxUPiB8IFNlbGVjdFR5cGU8VD5bXTtcbmV4cG9ydCB0eXBlIFNlbGVjdFR5cGU8VD4gPSBzdHJpbmcgfCBrZXlvZiBUO1xuZXhwb3J0IHR5cGUgRmlsdGVyPFQ+ID0gRmlsdGVyVHlwZSB8IEZpbHRlclR5cGVbXTtcbmV4cG9ydCB0eXBlIEZpbHRlclR5cGUgPSBzdHJpbmcgfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfTtcblxuZXhwb3J0IGVudW0gU3RhbmRhcmRBZ2dyZWdhdGVNZXRob2RzIHtcbiAgc3VtID0gJ3N1bScsXG4gIG1pbiA9ICdtaW4nLFxuICBtYXggPSAnbWF4JyxcbiAgYXZlcmFnZSA9ICdhdmVyYWdlJyxcbiAgY291bnRkaXN0aW5jdCA9ICdjb3VudGRpc3RpbmN0Jyxcbn1cbmV4cG9ydCB0eXBlIEFnZ3JlZ2F0ZVR5cGUgPVxuICB8IHN0cmluZ1xuICB8IHsgW3Byb3BlcnR5TmFtZTogc3RyaW5nXTogeyB3aXRoOiBTdGFuZGFyZEFnZ3JlZ2F0ZU1ldGhvZHM7IGFzOiBzdHJpbmcgfSB9O1xuXG4vLyBPcmRlckJ5XG5cbmV4cG9ydCB0eXBlIE9yZGVyQnk8VD4gPSBPcmRlckJ5VHlwZTxUPiB8IE9yZGVyQnlUeXBlPFQ+W107XG5leHBvcnQgdHlwZSBPcmRlckJ5VHlwZTxUPiA9IHN0cmluZyB8IE9yZGVyQnlPYmplY3Q8VD47XG5leHBvcnQgdHlwZSBPcmRlckJ5T2JqZWN0PFQ+ID1cbiAgfCBrZXlvZiBUXG4gIHwgW2tleW9mIFQgfCBzdHJpbmcsICdhc2MnIHwgJ2Rlc2MnXVxuICB8IE5lc3RlZE9yZGVyQnk8VD47XG5leHBvcnQgdHlwZSBOZXN0ZWRPcmRlckJ5PFQ+ID0ge1xuICBbUCBpbiBrZXlvZiBUXT86IFRbUF0gZXh0ZW5kcyBBcnJheTxpbmZlciBFPiA/IE9yZGVyQnk8RT4gOiBPcmRlckJ5PFRbUF0+O1xufTtcblxuLy8gRXhwYW5kXG5leHBvcnQgdHlwZSBFeHBhbmQ8VD4gPSBFeHBhbmRUeXBlPFQ+IHwgRXhwYW5kVHlwZTxUPltdO1xuZXhwb3J0IHR5cGUgRXhwYW5kVHlwZTxUPiA9IHN0cmluZyB8IEV4cGFuZE9iamVjdDxUPjtcbmV4cG9ydCB0eXBlIEV4cGFuZE9iamVjdDxUPiA9IGtleW9mIFQgfCBOZXN0ZWRFeHBhbmRPcHRpb25zPFQ+O1xuZXhwb3J0IHR5cGUgTmVzdGVkRXhwYW5kT3B0aW9uczxUPiA9IHtcbiAgW1AgaW4ga2V5b2YgVF0/OiBFeHBhbmRPcHRpb25zPFVucGFja2VkPFRbUF0+Pjtcbn07XG5leHBvcnQgdHlwZSBFeHBhbmRPcHRpb25zPFQ+ID0ge1xuICBzZWxlY3Q/OiBTZWxlY3Q8VD47XG4gIGZpbHRlcj86IEZpbHRlcjxUPjtcbiAgb3JkZXJCeT86IE9yZGVyQnk8VD47XG4gIHRvcD86IG51bWJlcjtcbiAgc2tpcD86IG51bWJlcjtcbiAgbGV2ZWxzPzogbnVtYmVyIHwgJ21heCc7XG4gIGNvdW50PzogYm9vbGVhbiB8IEZpbHRlcjxUPjtcbiAgZXhwYW5kPzogRXhwYW5kPFQ+O1xufTtcblxuZXhwb3J0IHR5cGUgVHJhbnNmb3JtPFQ+ID0ge1xuICBhZ2dyZWdhdGU/OiBBZ2dyZWdhdGVUeXBlIHwgQXJyYXk8QWdncmVnYXRlVHlwZT47XG4gIGZpbHRlcj86IEZpbHRlcjxUPjtcbiAgZ3JvdXBCeT86IEdyb3VwQnlUeXBlPFQ+O1xufTtcbmV4cG9ydCB0eXBlIEdyb3VwQnlUeXBlPFQ+ID0ge1xuICBwcm9wZXJ0aWVzOiBBcnJheTxrZXlvZiBUPjtcbiAgdHJhbnNmb3JtPzogVHJhbnNmb3JtPFQ+O1xufTtcblxuZXhwb3J0IGVudW0gUXVlcnlDdXN0b21UeXBlcyB7XG4gIFJhdyxcbiAgQWxpYXMsXG4gIER1cmF0aW9uLFxuICBCaW5hcnksXG59XG5cbmV4cG9ydCB0eXBlIFF1ZXJ5Q3VzdG9tVHlwZSA9IHtcbiAgdHlwZTogUXVlcnlDdXN0b21UeXBlcztcbiAgdmFsdWU6IGFueTtcbiAgbmFtZT86IHN0cmluZztcbn07XG5leHBvcnQgdHlwZSBWYWx1ZSA9IHN0cmluZyB8IERhdGUgfCBudW1iZXIgfCBib29sZWFuIHwgUXVlcnlDdXN0b21UeXBlO1xuXG4vL2h0dHBzOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy9vZGF0YS9vZGF0YS92NC4wMS9vZGF0YS12NC4wMS1wYXJ0Mi11cmwtY29udmVudGlvbnMuaHRtbCNzZWNfUXVlcnlPcHRpb25zXG5leHBvcnQgY29uc3QgcmF3ID0gKHZhbHVlOiBzdHJpbmcpOiBRdWVyeUN1c3RvbVR5cGUgPT4gKHtcbiAgdHlwZTogUXVlcnlDdXN0b21UeXBlcy5SYXcsXG4gIHZhbHVlLFxufSk7XG5leHBvcnQgY29uc3QgYWxpYXMgPSAodmFsdWU6IGFueSwgbmFtZT86IHN0cmluZyk6IFF1ZXJ5Q3VzdG9tVHlwZSA9PiAoe1xuICB0eXBlOiBRdWVyeUN1c3RvbVR5cGVzLkFsaWFzLFxuICB2YWx1ZSxcbiAgbmFtZSxcbn0pO1xuZXhwb3J0IGNvbnN0IGR1cmF0aW9uID0gKHZhbHVlOiBzdHJpbmcpOiBRdWVyeUN1c3RvbVR5cGUgPT4gKHtcbiAgdHlwZTogUXVlcnlDdXN0b21UeXBlcy5EdXJhdGlvbixcbiAgdmFsdWUsXG59KTtcbmV4cG9ydCBjb25zdCBiaW5hcnkgPSAodmFsdWU6IHN0cmluZyk6IFF1ZXJ5Q3VzdG9tVHlwZSA9PiAoe1xuICB0eXBlOiBRdWVyeUN1c3RvbVR5cGVzLkJpbmFyeSxcbiAgdmFsdWUsXG59KTtcbmV4cG9ydCBjb25zdCBpc1F1ZXJ5Q3VzdG9tVHlwZSA9ICh2YWx1ZTogYW55KSA9PlxuICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmXG4gICd0eXBlJyBpbiB2YWx1ZSAmJlxuICB2YWx1ZS50eXBlIGluIFF1ZXJ5Q3VzdG9tVHlwZXM7XG5cbmV4cG9ydCBjb25zdCBpc1Jhd1R5cGUgPSAodmFsdWU6IGFueSkgPT5cbiAgaXNRdWVyeUN1c3RvbVR5cGUodmFsdWUpICYmXG4gICh2YWx1ZSBhcyBRdWVyeUN1c3RvbVR5cGUpLnR5cGUgPT09IFF1ZXJ5Q3VzdG9tVHlwZXMuUmF3O1xuXG5leHBvcnQgdHlwZSBRdWVyeU9wdGlvbnM8VD4gPSBFeHBhbmRPcHRpb25zPFQ+ICYge1xuICBzZWFyY2g6IHN0cmluZztcbiAgYXBwbHk6IHN0cmluZztcbiAgdHJhbnNmb3JtOiB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9W107XG4gIGNvbXB1dGU6IHN0cmluZztcbiAgc2tpcDogbnVtYmVyO1xuICBza2lwdG9rZW46IHN0cmluZztcbiAga2V5OiBzdHJpbmcgfCBudW1iZXIgfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfTtcbiAgY291bnQ6IGJvb2xlYW4gfCBGaWx0ZXI8VD47XG4gIGFjdGlvbjogc3RyaW5nO1xuICBmdW5jOiBzdHJpbmcgfCB7IFtmdW5jdGlvbk5hbWU6IHN0cmluZ106IHsgW3BhcmFtZXRlck5hbWU6IHN0cmluZ106IGFueSB9IH07XG4gIGZvcm1hdDogc3RyaW5nO1xuICBhbGlhc2VzOiBRdWVyeUN1c3RvbVR5cGVbXTtcbiAgZXNjYXBlOiBib29sZWFuO1xufTtcblxuZXhwb3J0IGNvbnN0IElURU1fUk9PVCA9ICcnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiA8VD4oe1xuICBzZWxlY3QsXG4gIHNlYXJjaCxcbiAgc2tpcHRva2VuLFxuICBmb3JtYXQsXG4gIHRvcCxcbiAgc2tpcCxcbiAgZmlsdGVyLFxuICB0cmFuc2Zvcm0sXG4gIGNvbXB1dGUsXG4gIG9yZGVyQnksXG4gIGtleSxcbiAgY291bnQsXG4gIGV4cGFuZCxcbiAgYWN0aW9uLFxuICBmdW5jLFxuICBhbGlhc2VzLFxuICBlc2NhcGUsXG59OiBQYXJ0aWFsPFF1ZXJ5T3B0aW9uczxUPj4gPSB7fSkge1xuICBjb25zdCBbcGF0aCwgcGFyYW1zXSA9IGJ1aWxkUGF0aEFuZFF1ZXJ5KHtcbiAgICBzZWxlY3QsXG4gICAgc2VhcmNoLFxuICAgIHNraXB0b2tlbixcbiAgICBmb3JtYXQsXG4gICAgdG9wLFxuICAgIHNraXAsXG4gICAgZmlsdGVyLFxuICAgIHRyYW5zZm9ybSxcbiAgICBjb21wdXRlLFxuICAgIG9yZGVyQnksXG4gICAga2V5LFxuICAgIGNvdW50LFxuICAgIGV4cGFuZCxcbiAgICBhY3Rpb24sXG4gICAgZnVuYyxcbiAgICBhbGlhc2VzLFxuICAgIGVzY2FwZSxcbiAgfSk7XG5cbiAgcmV0dXJuIGJ1aWxkVXJsKHBhdGgsIHBhcmFtcyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFBhdGhBbmRRdWVyeTxUPih7XG4gIHNlbGVjdCxcbiAgc2VhcmNoLFxuICBza2lwdG9rZW4sXG4gIGZvcm1hdCxcbiAgdG9wLFxuICBza2lwLFxuICBmaWx0ZXIsXG4gIGFwcGx5LFxuICB0cmFuc2Zvcm0sXG4gIGNvbXB1dGUsXG4gIG9yZGVyQnksXG4gIGtleSxcbiAgY291bnQsXG4gIGV4cGFuZCxcbiAgYWN0aW9uLFxuICBmdW5jLFxuICBhbGlhc2VzLFxuICBlc2NhcGUsXG59OiBQYXJ0aWFsPFF1ZXJ5T3B0aW9uczxUPj4gPSB7fSk6IFtzdHJpbmcsIHsgW25hbWU6IHN0cmluZ106IGFueSB9XSB7XG4gIGxldCBwYXRoOiBzdHJpbmcgPSAnJztcbiAgYWxpYXNlcyA9IGFsaWFzZXMgfHwgW107XG5cbiAgY29uc3QgcXVlcnk6IGFueSA9IHt9O1xuXG4gIC8vIGtleSBpcyBub3QgKG51bGwsIHVuZGVmaW5lZClcbiAgaWYgKGtleSAhPSB1bmRlZmluZWQpIHtcbiAgICBwYXRoICs9IGAoJHtub3JtYWxpemVWYWx1ZShrZXkgYXMgVmFsdWUsIHsgYWxpYXNlcywgZXNjYXBlIH0pfSlgO1xuICB9XG5cbiAgLy8gU2VsZWN0XG4gIGlmIChzZWxlY3QpIHtcbiAgICBxdWVyeS4kc2VsZWN0ID0gaXNSYXdUeXBlKHNlbGVjdClcbiAgICAgID8gKHNlbGVjdCBhcyB1bmtub3duIGFzIFF1ZXJ5Q3VzdG9tVHlwZSkudmFsdWVcbiAgICAgIDogQXJyYXkuaXNBcnJheShzZWxlY3QpXG4gICAgICAgID8gc2VsZWN0LmpvaW4oJywnKVxuICAgICAgICA6IHNlbGVjdDtcbiAgfVxuXG4gIC8vIENvbXB1dGVcbiAgaWYgKGNvbXB1dGUpIHtcbiAgICBxdWVyeS4kY29tcHV0ZSA9IGlzUmF3VHlwZShjb21wdXRlKVxuICAgICAgPyAoY29tcHV0ZSBhcyB1bmtub3duIGFzIFF1ZXJ5Q3VzdG9tVHlwZSkudmFsdWVcbiAgICAgIDogQXJyYXkuaXNBcnJheShjb21wdXRlKVxuICAgICAgICA/IGNvbXB1dGUuam9pbignLCcpXG4gICAgICAgIDogY29tcHV0ZTtcbiAgfVxuXG4gIC8vIFNlYXJjaFxuICBpZiAoc2VhcmNoKSB7XG4gICAgcXVlcnkuJHNlYXJjaCA9IHNlYXJjaDtcbiAgfVxuXG4gIC8vIFNraXB0b2tlblxuICBpZiAoc2tpcHRva2VuKSB7XG4gICAgcXVlcnkuJHNraXB0b2tlbiA9IHNraXB0b2tlbjtcbiAgfVxuXG4gIC8vIEZvcm1hdFxuICBpZiAoZm9ybWF0KSB7XG4gICAgcXVlcnkuJGZvcm1hdCA9IGZvcm1hdDtcbiAgfVxuXG4gIC8vIEZpbHRlclxuICBpZiAoZmlsdGVyIHx8IHR5cGVvZiBjb3VudCA9PT0gJ29iamVjdCcpIHtcbiAgICBxdWVyeS4kZmlsdGVyID0gYnVpbGRGaWx0ZXIodHlwZW9mIGNvdW50ID09PSAnb2JqZWN0JyA/IGNvdW50IDogZmlsdGVyLCB7XG4gICAgICBhbGlhc2VzLFxuICAgICAgZXNjYXBlLFxuICAgIH0pO1xuICB9XG5cbiAgLy8gVHJhbnNmb3JtXG4gIGlmICh0cmFuc2Zvcm0pIHtcbiAgICBxdWVyeS4kYXBwbHkgPSBidWlsZFRyYW5zZm9ybXModHJhbnNmb3JtLCB7IGFsaWFzZXMsIGVzY2FwZSB9KTtcbiAgfVxuXG4gIC8vIEFwcGx5XG4gIGlmIChhcHBseSkge1xuICAgIHF1ZXJ5LiRhcHBseSA9IHF1ZXJ5LiRhcHBseVxuICAgICAgPyBxdWVyeS4kYXBwbHkgKyAnLycgKyBidWlsZEFwcGx5KGFwcGx5LCB7IGFsaWFzZXMsIGVzY2FwZSB9KVxuICAgICAgOiBidWlsZEFwcGx5KGFwcGx5LCB7IGFsaWFzZXMsIGVzY2FwZSB9KTtcbiAgfVxuXG4gIC8vIEV4cGFuZFxuICBpZiAoZXhwYW5kKSB7XG4gICAgcXVlcnkuJGV4cGFuZCA9IGJ1aWxkRXhwYW5kKGV4cGFuZCwgeyBhbGlhc2VzLCBlc2NhcGUgfSk7XG4gIH1cblxuICAvLyBPcmRlckJ5XG4gIGlmIChvcmRlckJ5KSB7XG4gICAgcXVlcnkuJG9yZGVyYnkgPSBidWlsZE9yZGVyQnkob3JkZXJCeSk7XG4gIH1cblxuICAvLyBDb3VudFxuICBpZiAoaXNSYXdUeXBlKGNvdW50KSkge1xuICAgIHF1ZXJ5LiRjb3VudCA9IChjb3VudCBhcyBRdWVyeUN1c3RvbVR5cGUpLnZhbHVlO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBjb3VudCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgcXVlcnkuJGNvdW50ID0gdHJ1ZTtcbiAgfSBlbHNlIGlmIChjb3VudCkge1xuICAgIHBhdGggKz0gJy8kY291bnQnO1xuICB9XG5cbiAgLy8gVG9wXG4gIGlmIChpc1Jhd1R5cGUodG9wKSkge1xuICAgIHF1ZXJ5LiR0b3AgPSAodG9wIGFzIHVua25vd24gYXMgUXVlcnlDdXN0b21UeXBlKS52YWx1ZTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgdG9wID09PSAnbnVtYmVyJykge1xuICAgIHF1ZXJ5LiR0b3AgPSB0b3A7XG4gIH1cblxuICAvLyBTa2lwXG4gIGlmIChpc1Jhd1R5cGUoc2tpcCkpIHtcbiAgICBxdWVyeS4kdG9wID0gKHNraXAgYXMgdW5rbm93biBhcyBRdWVyeUN1c3RvbVR5cGUpLnZhbHVlO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBza2lwID09PSAnbnVtYmVyJykge1xuICAgIHF1ZXJ5LiRza2lwID0gc2tpcDtcbiAgfVxuXG4gIGlmIChhY3Rpb24pIHtcbiAgICBwYXRoICs9IGAvJHthY3Rpb259YDtcbiAgfVxuXG4gIGlmIChmdW5jKSB7XG4gICAgaWYgKHR5cGVvZiBmdW5jID09PSAnc3RyaW5nJykge1xuICAgICAgcGF0aCArPSBgLyR7ZnVuY30oKWA7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZnVuYyA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGNvbnN0IFtmdW5jTmFtZV0gPSBPYmplY3Qua2V5cyhmdW5jKTtcbiAgICAgIGNvbnN0IGZ1bmNBcmdzID0gbm9ybWFsaXplVmFsdWUoZnVuY1tmdW5jTmFtZV0gYXMgVmFsdWUsIHtcbiAgICAgICAgYWxpYXNlcyxcbiAgICAgICAgZXNjYXBlLFxuICAgICAgfSk7XG5cbiAgICAgIHBhdGggKz0gYC8ke2Z1bmNOYW1lfSgke2Z1bmNBcmdzfSlgO1xuICAgIH1cbiAgfVxuXG4gIGlmIChhbGlhc2VzLmxlbmd0aCA+IDApIHtcbiAgICBPYmplY3QuYXNzaWduKFxuICAgICAgcXVlcnksXG4gICAgICBhbGlhc2VzLnJlZHVjZShcbiAgICAgICAgKGFjYywgYWxpYXMpID0+XG4gICAgICAgICAgT2JqZWN0LmFzc2lnbihhY2MsIHtcbiAgICAgICAgICAgIFtgQCR7YWxpYXMubmFtZX1gXTogbm9ybWFsaXplVmFsdWUoYWxpYXMudmFsdWUsIHtcbiAgICAgICAgICAgICAgZXNjYXBlLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgfSksXG4gICAgICAgIHt9LFxuICAgICAgKSxcbiAgICApO1xuICB9XG5cbiAgLy8gRmlsdGVyIGVtcHR5IHZhbHVlc1xuICBjb25zdCBwYXJhbXMgPSBPYmplY3QuZW50cmllcyhxdWVyeSlcbiAgICAuZmlsdGVyKChbLCB2YWx1ZV0pID0+IHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09ICcnKVxuICAgIC5yZWR1Y2UoKGFjYywgW2tleSwgdmFsdWVdKSA9PiBPYmplY3QuYXNzaWduKGFjYywgeyBba2V5XTogdmFsdWUgfSksIHt9KTtcblxuICByZXR1cm4gW3BhdGgsIHBhcmFtc107XG59XG5cbmZ1bmN0aW9uIHJlbmRlclByaW1pdGl2ZVZhbHVlKFxuICBrZXk6IHN0cmluZyxcbiAgdmFsOiBhbnksXG4gIHtcbiAgICBhbGlhc2VzLFxuICAgIGVzY2FwZSxcbiAgfToge1xuICAgIGFsaWFzZXM/OiBRdWVyeUN1c3RvbVR5cGVbXTtcbiAgICBlc2NhcGU/OiBib29sZWFuO1xuICB9LFxuKSB7XG4gIHJldHVybiBgJHtrZXl9IGVxICR7bm9ybWFsaXplVmFsdWUodmFsLCB7IGFsaWFzZXMsIGVzY2FwZSB9KX1gO1xufVxuXG5mdW5jdGlvbiBidWlsZEZpbHRlcihcbiAgZmlsdGVyczogRmlsdGVyPGFueT4gPSB7fSxcbiAge1xuICAgIGFsaWFzZXMsXG4gICAgcHJvcFByZWZpeCxcbiAgICBlc2NhcGUsXG4gIH06IHsgYWxpYXNlcz86IFF1ZXJ5Q3VzdG9tVHlwZVtdOyBwcm9wUHJlZml4Pzogc3RyaW5nOyBlc2NhcGU/OiBib29sZWFuIH0sXG4pOiBzdHJpbmcge1xuICByZXR1cm4gKFxuICAgIChBcnJheS5pc0FycmF5KGZpbHRlcnMpID8gZmlsdGVycyA6IFtmaWx0ZXJzXSkucmVkdWNlKFxuICAgICAgKGFjYzogc3RyaW5nW10sIGZpbHRlcikgPT4ge1xuICAgICAgICBpZiAoZmlsdGVyKSB7XG4gICAgICAgICAgY29uc3QgYnVpbHRGaWx0ZXIgPSBidWlsZEZpbHRlckNvcmUoZmlsdGVyLCB7XG4gICAgICAgICAgICBhbGlhc2VzLFxuICAgICAgICAgICAgcHJvcFByZWZpeCxcbiAgICAgICAgICAgIGVzY2FwZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAoYnVpbHRGaWx0ZXIpIHtcbiAgICAgICAgICAgIGFjYy5wdXNoKGJ1aWx0RmlsdGVyKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgIH0sXG4gICAgICBbXSxcbiAgICApIGFzIHN0cmluZ1tdXG4gICkuam9pbignIGFuZCAnKTtcblxuICBmdW5jdGlvbiBidWlsZEZpbHRlckNvcmUoXG4gICAgZmlsdGVyOiBGaWx0ZXI8YW55PiA9IHt9LFxuICAgIHtcbiAgICAgIGFsaWFzZXMsXG4gICAgICBwcm9wUHJlZml4LFxuICAgICAgZXNjYXBlLFxuICAgIH06IHsgYWxpYXNlcz86IFF1ZXJ5Q3VzdG9tVHlwZVtdOyBwcm9wUHJlZml4Pzogc3RyaW5nOyBlc2NhcGU/OiBib29sZWFuIH0sXG4gICkge1xuICAgIGxldCBmaWx0ZXJFeHByID0gJyc7XG4gICAgaWYgKGlzUmF3VHlwZShmaWx0ZXIpKSB7XG4gICAgICAvLyBVc2UgcmF3IHF1ZXJ5IGN1c3RvbSBmaWx0ZXIgc3RyaW5nXG4gICAgICBmaWx0ZXJFeHByID0gKGZpbHRlciBhcyBRdWVyeUN1c3RvbVR5cGUpLnZhbHVlO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGZpbHRlciA9PT0gJ3N0cmluZycpIHtcbiAgICAgIC8vIFVzZSByYXcgZmlsdGVyIHN0cmluZ1xuICAgICAgZmlsdGVyRXhwciA9IGZpbHRlcjtcbiAgICB9IGVsc2UgaWYgKGZpbHRlciAmJiB0eXBlb2YgZmlsdGVyID09PSAnb2JqZWN0Jykge1xuICAgICAgY29uc3QgZmlsdGVyc0FycmF5ID0gT2JqZWN0LmtleXMoZmlsdGVyKS5yZWR1Y2UoXG4gICAgICAgIChyZXN1bHQ6IGFueVtdLCBmaWx0ZXJLZXkpID0+IHtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IChmaWx0ZXIgYXMgYW55KVtmaWx0ZXJLZXldO1xuICAgICAgICAgIGxldCBwcm9wTmFtZSA9ICcnO1xuICAgICAgICAgIGlmIChwcm9wUHJlZml4KSB7XG4gICAgICAgICAgICBpZiAoZmlsdGVyS2V5ID09PSBJVEVNX1JPT1QpIHtcbiAgICAgICAgICAgICAgcHJvcE5hbWUgPSBwcm9wUHJlZml4O1xuICAgICAgICAgICAgfSBlbHNlIGlmIChJTkRFWE9GX1JFR0VYLnRlc3QoZmlsdGVyS2V5KSkge1xuICAgICAgICAgICAgICBwcm9wTmFtZSA9IGZpbHRlcktleS5yZXBsYWNlKElOREVYT0ZfUkVHRVgsIChfLCAkMSkgPT5cbiAgICAgICAgICAgICAgICAkMS50cmltKCkgPT09IElURU1fUk9PVFxuICAgICAgICAgICAgICAgICAgPyBgKCR7cHJvcFByZWZpeH0pYFxuICAgICAgICAgICAgICAgICAgOiBgKCR7cHJvcFByZWZpeH0vJHskMS50cmltKCl9KWAsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKEZVTkNUSU9OX1JFR0VYLnRlc3QoZmlsdGVyS2V5KSkge1xuICAgICAgICAgICAgICBwcm9wTmFtZSA9IGZpbHRlcktleS5yZXBsYWNlKEZVTkNUSU9OX1JFR0VYLCAoXywgJDEpID0+XG4gICAgICAgICAgICAgICAgJDEudHJpbSgpID09PSBJVEVNX1JPT1RcbiAgICAgICAgICAgICAgICAgID8gYCgke3Byb3BQcmVmaXh9KWBcbiAgICAgICAgICAgICAgICAgIDogYCgke3Byb3BQcmVmaXh9LyR7JDEudHJpbSgpfSlgLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcHJvcE5hbWUgPSBgJHtwcm9wUHJlZml4fS8ke2ZpbHRlcktleX1gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwcm9wTmFtZSA9IGZpbHRlcktleTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoZmlsdGVyS2V5ID09PSBJVEVNX1JPT1QgJiYgQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQuY29uY2F0KFxuICAgICAgICAgICAgICB2YWx1ZS5tYXAoKGFycmF5VmFsdWU6IGFueSkgPT5cbiAgICAgICAgICAgICAgICByZW5kZXJQcmltaXRpdmVWYWx1ZShwcm9wTmFtZSwgYXJyYXlWYWx1ZSwgeyBlc2NhcGUsIGFsaWFzZXMgfSksXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIFsnbnVtYmVyJywgJ3N0cmluZycsICdib29sZWFuJ10uaW5kZXhPZih0eXBlb2YgdmFsdWUpICE9PSAtMSB8fFxuICAgICAgICAgICAgdmFsdWUgaW5zdGFuY2VvZiBEYXRlIHx8XG4gICAgICAgICAgICB2YWx1ZSA9PT0gbnVsbFxuICAgICAgICAgICkge1xuICAgICAgICAgICAgLy8gU2ltcGxlIGtleS92YWx1ZSBoYW5kbGVkIGFzIGVxdWFscyBvcGVyYXRvclxuICAgICAgICAgICAgcmVzdWx0LnB1c2goXG4gICAgICAgICAgICAgIHJlbmRlclByaW1pdGl2ZVZhbHVlKHByb3BOYW1lLCB2YWx1ZSwgeyBhbGlhc2VzLCBlc2NhcGUgfSksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IG9wID0gZmlsdGVyS2V5O1xuICAgICAgICAgICAgY29uc3QgYnVpbHRGaWx0ZXJzID0gdmFsdWVcbiAgICAgICAgICAgICAgLm1hcCgodikgPT4gYnVpbGRGaWx0ZXIodiwgeyBhbGlhc2VzLCBwcm9wUHJlZml4LCBlc2NhcGUgfSkpXG4gICAgICAgICAgICAgIC5maWx0ZXIoKGYpID0+IGYpXG4gICAgICAgICAgICAgIC5tYXAoKGYpID0+XG4gICAgICAgICAgICAgICAgTE9HSUNBTF9PUEVSQVRPUlMuaW5kZXhPZihvcCkgIT09IC0xID8gYCgke2Z9KWAgOiBmLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKGJ1aWx0RmlsdGVycy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgaWYgKExPR0lDQUxfT1BFUkFUT1JTLmluZGV4T2Yob3ApICE9PSAtMSkge1xuICAgICAgICAgICAgICAgIGlmIChidWlsdEZpbHRlcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICBpZiAob3AgPT09ICdub3QnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHBhcnNlTm90KGJ1aWx0RmlsdGVycyBhcyBzdHJpbmdbXSkpO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goYCgke2J1aWx0RmlsdGVycy5qb2luKGAgJHtvcH0gYCl9KWApO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChidWlsdEZpbHRlcnMuam9pbihgICR7b3B9IGApKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoTE9HSUNBTF9PUEVSQVRPUlMuaW5kZXhPZihwcm9wTmFtZSkgIT09IC0xKSB7XG4gICAgICAgICAgICBjb25zdCBvcCA9IHByb3BOYW1lO1xuICAgICAgICAgICAgY29uc3QgYnVpbHRGaWx0ZXJzID0gT2JqZWN0LmtleXModmFsdWUpLm1hcCgodmFsdWVLZXkpID0+XG4gICAgICAgICAgICAgIGJ1aWxkRmlsdGVyQ29yZShcbiAgICAgICAgICAgICAgICB7IFt2YWx1ZUtleV06IHZhbHVlW3ZhbHVlS2V5XSB9LFxuICAgICAgICAgICAgICAgIHsgYWxpYXNlcywgZXNjYXBlIH0sXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKGJ1aWx0RmlsdGVycy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgaWYgKG9wID09PSAnbm90Jykge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHBhcnNlTm90KGJ1aWx0RmlsdGVycyBhcyBzdHJpbmdbXSkpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGAke2J1aWx0RmlsdGVycy5qb2luKGAgJHtvcH0gYCl9YCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIGlmICgndHlwZScgaW4gdmFsdWUpIHtcbiAgICAgICAgICAgICAgcmVzdWx0LnB1c2goXG4gICAgICAgICAgICAgICAgcmVuZGVyUHJpbWl0aXZlVmFsdWUocHJvcE5hbWUsIHZhbHVlLCB7IGFsaWFzZXMsIGVzY2FwZSB9KSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGNvbnN0IG9wZXJhdG9ycyA9IE9iamVjdC5rZXlzKHZhbHVlKTtcbiAgICAgICAgICAgICAgb3BlcmF0b3JzLmZvckVhY2goKG9wKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKENPTVBBUklTT05fT1BFUkFUT1JTLmluZGV4T2Yob3ApICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goXG4gICAgICAgICAgICAgICAgICAgIGAke3Byb3BOYW1lfSAke29wfSAke25vcm1hbGl6ZVZhbHVlKHZhbHVlW29wXSwge1xuICAgICAgICAgICAgICAgICAgICAgIGFsaWFzZXMsXG4gICAgICAgICAgICAgICAgICAgICAgZXNjYXBlLFxuICAgICAgICAgICAgICAgICAgICB9KX1gLFxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKExPR0lDQUxfT1BFUkFUT1JTLmluZGV4T2Yob3ApICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWVbb3BdKSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChcbiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVtvcF1cbiAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICh2OiBhbnkpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJygnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZEZpbHRlckNvcmUodiwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpYXNlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BQcmVmaXg6IHByb3BOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXNjYXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnKScsXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAuam9pbihgICR7b3B9IGApLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goXG4gICAgICAgICAgICAgICAgICAgICAgJygnICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkRmlsdGVyQ29yZSh2YWx1ZVtvcF0sIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpYXNlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcFByZWZpeDogcHJvcE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGVzY2FwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pICtcbiAgICAgICAgICAgICAgICAgICAgICAgICcpJyxcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKENPTExFQ1RJT05fT1BFUkFUT1JTLmluZGV4T2Yob3ApICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgY29uc3QgY29sbGVjdGlvbkNsYXVzZSA9IGJ1aWxkQ29sbGVjdGlvbkNsYXVzZShcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyS2V5LnRvTG93ZXJDYXNlKCksXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlW29wXSxcbiAgICAgICAgICAgICAgICAgICAgb3AsXG4gICAgICAgICAgICAgICAgICAgIHByb3BOYW1lLFxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIGlmIChjb2xsZWN0aW9uQ2xhdXNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGNvbGxlY3Rpb25DbGF1c2UpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAob3AgPT09ICdoYXMnKSB7XG4gICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChcbiAgICAgICAgICAgICAgICAgICAgYCR7cHJvcE5hbWV9ICR7b3B9ICR7bm9ybWFsaXplVmFsdWUodmFsdWVbb3BdLCB7XG4gICAgICAgICAgICAgICAgICAgICAgYWxpYXNlcyxcbiAgICAgICAgICAgICAgICAgICAgICBlc2NhcGUsXG4gICAgICAgICAgICAgICAgICAgIH0pfWAsXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAob3AgPT09ICdpbicpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdGluZ1ZhbHVlcyA9IEFycmF5LmlzQXJyYXkodmFsdWVbb3BdKVxuICAgICAgICAgICAgICAgICAgICA/IHZhbHVlW29wXVxuICAgICAgICAgICAgICAgICAgICA6IHZhbHVlW29wXS52YWx1ZS5tYXAoKHR5cGVkVmFsdWU6IGFueSkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHZhbHVlW29wXS50eXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHR5cGVkVmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgfSkpO1xuXG4gICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChcbiAgICAgICAgICAgICAgICAgICAgcHJvcE5hbWUgK1xuICAgICAgICAgICAgICAgICAgICAgICcgaW4gKCcgK1xuICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdGluZ1ZhbHVlc1xuICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCgodjogYW55KSA9PiBub3JtYWxpemVWYWx1ZSh2LCB7IGFsaWFzZXMsIGVzY2FwZSB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5qb2luKCcsJykgK1xuICAgICAgICAgICAgICAgICAgICAgICcpJyxcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChCT09MRUFOX0ZVTkNUSU9OUy5pbmRleE9mKG9wKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgIC8vIFNpbXBsZSBib29sZWFuIGZ1bmN0aW9ucyAoc3RhcnRzd2l0aCwgZW5kc3dpdGgsIGNvbnRhaW5zKVxuICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goXG4gICAgICAgICAgICAgICAgICAgIGAke29wfSgke3Byb3BOYW1lfSwke25vcm1hbGl6ZVZhbHVlKHZhbHVlW29wXSwge1xuICAgICAgICAgICAgICAgICAgICAgIGFsaWFzZXMsXG4gICAgICAgICAgICAgICAgICAgICAgZXNjYXBlLFxuICAgICAgICAgICAgICAgICAgICB9KX0pYCxcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIC8vIE5lc3RlZCBwcm9wZXJ0eVxuICAgICAgICAgICAgICAgICAgY29uc3QgZmlsdGVyID0gYnVpbGRGaWx0ZXJDb3JlKHZhbHVlLCB7XG4gICAgICAgICAgICAgICAgICAgIGFsaWFzZXMsXG4gICAgICAgICAgICAgICAgICAgIHByb3BQcmVmaXg6IHByb3BOYW1lLFxuICAgICAgICAgICAgICAgICAgICBlc2NhcGUsXG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgIGlmIChmaWx0ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goZmlsdGVyKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gSWdub3JlL29taXQgZmlsdGVyIGlmIHZhbHVlIGlzIGB1bmRlZmluZWRgXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCB2YWx1ZSB0eXBlOiAke3ZhbHVlfWApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0sXG4gICAgICAgIFtdLFxuICAgICAgKTtcblxuICAgICAgZmlsdGVyRXhwciA9IGZpbHRlcnNBcnJheS5qb2luKCcgYW5kICcpO1xuICAgIH0gLyogZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCBmaWx0ZXJzIHR5cGU6ICR7ZmlsdGVyfWApO1xuICAgICAgfSAqL1xuICAgIHJldHVybiBmaWx0ZXJFeHByO1xuICB9XG5cbiAgZnVuY3Rpb24gYnVpbGRDb2xsZWN0aW9uQ2xhdXNlKFxuICAgIGxhbWJkYVBhcmFtZXRlcjogc3RyaW5nLFxuICAgIHZhbHVlOiBhbnksXG4gICAgb3A6IHN0cmluZyxcbiAgICBwcm9wTmFtZTogc3RyaW5nLFxuICApIHtcbiAgICBsZXQgY2xhdXNlID0gJyc7XG5cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyB8fCB2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykge1xuICAgICAgY2xhdXNlID0gZ2V0U3RyaW5nQ29sbGVjdGlvbkNsYXVzZShsYW1iZGFQYXJhbWV0ZXIsIHZhbHVlLCBvcCwgcHJvcE5hbWUpO1xuICAgIH0gZWxzZSBpZiAodmFsdWUpIHtcbiAgICAgIC8vIG5vcm1hbGl6ZSB7YW55Olt7cHJvcDE6IDF9LCB7cHJvcDI6IDF9XX0gLS0+IHthbnk6e3Byb3AxOiAxLCBwcm9wMjogMX19OyBzYW1lIGZvciAnYWxsJyxcbiAgICAgIC8vIHNpbXBsZSB2YWx1ZXMgY29sbGVjdGlvbjoge2FueTpbeycnOiAnc2ltcGxlVmFsMSd9LCB7Jyc6ICdzaW1wbGVWYWwyJ31dfSAtLT4ge2FueTp7Jyc6IFsnc2ltcGxlVmFsMScsICdzaW1wbGVWYWwyJ119fTsgc2FtZSBmb3IgJ2FsbCcsXG4gICAgICBjb25zdCBmaWx0ZXJWYWx1ZSA9IEFycmF5LmlzQXJyYXkodmFsdWUpXG4gICAgICAgID8gdmFsdWUucmVkdWNlKChhY2MsIGl0ZW0pID0+IHtcbiAgICAgICAgICAgIGlmIChpdGVtLmhhc093blByb3BlcnR5KElURU1fUk9PVCkpIHtcbiAgICAgICAgICAgICAgaWYgKCFhY2MuaGFzT3duUHJvcGVydHkoSVRFTV9ST09UKSkge1xuICAgICAgICAgICAgICAgIGFjY1tJVEVNX1JPT1RdID0gW107XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgYWNjW0lURU1fUk9PVF0ucHVzaChpdGVtW0lURU1fUk9PVF0pO1xuICAgICAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHsgLi4uYWNjLCAuLi5pdGVtIH07XG4gICAgICAgICAgfSwge30pXG4gICAgICAgIDogdmFsdWU7XG5cbiAgICAgIGNvbnN0IGZpbHRlciA9IGJ1aWxkRmlsdGVyQ29yZShmaWx0ZXJWYWx1ZSwge1xuICAgICAgICBhbGlhc2VzLFxuICAgICAgICBwcm9wUHJlZml4OiBsYW1iZGFQYXJhbWV0ZXIsXG4gICAgICAgIGVzY2FwZSxcbiAgICAgIH0pO1xuICAgICAgY2xhdXNlID0gYCR7cHJvcE5hbWV9LyR7b3B9KCR7XG4gICAgICAgIGZpbHRlciA/IGAke2xhbWJkYVBhcmFtZXRlcn06JHtmaWx0ZXJ9YCA6ICcnXG4gICAgICB9KWA7XG4gICAgfVxuICAgIHJldHVybiBjbGF1c2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0U3RyaW5nQ29sbGVjdGlvbkNsYXVzZShcbiAgbGFtYmRhUGFyYW1ldGVyOiBzdHJpbmcsXG4gIHZhbHVlOiBhbnksXG4gIGNvbGxlY3Rpb25PcGVyYXRvcjogc3RyaW5nLFxuICBwcm9wTmFtZTogc3RyaW5nLFxuKSB7XG4gIGxldCBjbGF1c2UgPSAnJztcbiAgY29uc3QgY29uZGl0aW9uT3BlcmF0b3IgPSBjb2xsZWN0aW9uT3BlcmF0b3IgPT0gJ2FsbCcgPyAnbmUnIDogJ2VxJztcbiAgY2xhdXNlID0gYCR7cHJvcE5hbWV9LyR7Y29sbGVjdGlvbk9wZXJhdG9yfSgke2xhbWJkYVBhcmFtZXRlcn06ICR7bGFtYmRhUGFyYW1ldGVyfSAke2NvbmRpdGlvbk9wZXJhdG9yfSAnJHt2YWx1ZX0nKWA7XG5cbiAgcmV0dXJuIGNsYXVzZTtcbn1cblxuZnVuY3Rpb24gZXNjYXBlSWxsZWdhbENoYXJzKHN0cmluZzogc3RyaW5nKSB7XG4gIHN0cmluZyA9IHN0cmluZy5yZXBsYWNlKC8lL2csICclMjUnKTtcbiAgc3RyaW5nID0gc3RyaW5nLnJlcGxhY2UoL1xcKy9nLCAnJTJCJyk7XG4gIHN0cmluZyA9IHN0cmluZy5yZXBsYWNlKC9cXC8vZywgJyUyRicpO1xuICBzdHJpbmcgPSBzdHJpbmcucmVwbGFjZSgvXFw/L2csICclM0YnKTtcbiAgc3RyaW5nID0gc3RyaW5nLnJlcGxhY2UoLyMvZywgJyUyMycpO1xuICBzdHJpbmcgPSBzdHJpbmcucmVwbGFjZSgvJi9nLCAnJTI2Jyk7XG4gIHN0cmluZyA9IHN0cmluZy5yZXBsYWNlKC8nL2csIFwiJydcIik7XG4gIHJldHVybiBzdHJpbmc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVWYWx1ZShcbiAgdmFsdWU6IFZhbHVlLFxuICB7XG4gICAgYWxpYXNlcyxcbiAgICBlc2NhcGUgPSBmYWxzZSxcbiAgfTogeyBhbGlhc2VzPzogUXVlcnlDdXN0b21UeXBlW107IGVzY2FwZT86IGJvb2xlYW4gfSA9IHt9LFxuKTogYW55IHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZXNjYXBlID8gYCcke2VzY2FwZUlsbGVnYWxDaGFycyh2YWx1ZSl9J2AgOiBgJyR7dmFsdWV9J2A7XG4gIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgcmV0dXJuIHZhbHVlLnRvSVNPU3RyaW5nKCk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIHJldHVybiBgWyR7dmFsdWVcbiAgICAgIC5tYXAoKGQpID0+IG5vcm1hbGl6ZVZhbHVlKGQsIHsgYWxpYXNlcywgZXNjYXBlIH0pKVxuICAgICAgLmpvaW4oJywnKX1dYDtcbiAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgc3dpdGNoICh2YWx1ZS50eXBlKSB7XG4gICAgICBjYXNlIFF1ZXJ5Q3VzdG9tVHlwZXMuUmF3OlxuICAgICAgICByZXR1cm4gdmFsdWUudmFsdWU7XG4gICAgICBjYXNlIFF1ZXJ5Q3VzdG9tVHlwZXMuRHVyYXRpb246XG4gICAgICAgIHJldHVybiBgZHVyYXRpb24nJHt2YWx1ZS52YWx1ZX0nYDtcbiAgICAgIGNhc2UgUXVlcnlDdXN0b21UeXBlcy5CaW5hcnk6XG4gICAgICAgIHJldHVybiBgYmluYXJ5JyR7dmFsdWUudmFsdWV9J2A7XG4gICAgICBjYXNlIFF1ZXJ5Q3VzdG9tVHlwZXMuQWxpYXM6XG4gICAgICAgIC8vIFN0b3JlXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGFsaWFzZXMpKSB7XG4gICAgICAgICAgaWYgKHZhbHVlLm5hbWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdmFsdWUubmFtZSA9IGBhJHthbGlhc2VzLmxlbmd0aCArIDF9YDtcbiAgICAgICAgICB9XG4gICAgICAgICAgYWxpYXNlcy5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYEAke3ZhbHVlLm5hbWV9YDtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBPYmplY3QuZW50cmllcyh2YWx1ZSlcbiAgICAgICAgICAuZmlsdGVyKChbLCB2XSkgPT4gdiAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgIC5tYXAoXG4gICAgICAgICAgICAoW2ssIHZdKSA9PlxuICAgICAgICAgICAgICBgJHtrfT0ke25vcm1hbGl6ZVZhbHVlKHYgYXMgVmFsdWUsIHsgYWxpYXNlcywgZXNjYXBlIH0pfWAsXG4gICAgICAgICAgKVxuICAgICAgICAgIC5qb2luKCcsJyk7XG4gICAgfVxuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gYnVpbGRFeHBhbmQ8VD4oXG4gIGV4cGFuZHM6IEV4cGFuZDxUPixcbiAge1xuICAgIGFsaWFzZXMsXG4gICAgZXNjYXBlID0gZmFsc2UsXG4gIH06IHsgYWxpYXNlcz86IFF1ZXJ5Q3VzdG9tVHlwZVtdOyBlc2NhcGU/OiBib29sZWFuIH0sXG4pOiBzdHJpbmcge1xuICBpZiAoaXNSYXdUeXBlKGV4cGFuZHMpKSB7XG4gICAgcmV0dXJuIChleHBhbmRzIGFzIFF1ZXJ5Q3VzdG9tVHlwZSkudmFsdWU7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGV4cGFuZHMgPT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIGV4cGFuZHMgYXMgYW55O1xuICB9IGVsc2UgaWYgKHR5cGVvZiBleHBhbmRzID09PSAnc3RyaW5nJykge1xuICAgIGlmIChleHBhbmRzLmluZGV4T2YoJy8nKSA9PT0gLTEpIHtcbiAgICAgIHJldHVybiBleHBhbmRzO1xuICAgIH1cblxuICAgIC8vIENoYW5nZSBgRm9vL0Jhci9CYXpgIHRvIGBGb28oJGV4cGFuZD1CYXIoJGV4cGFuZD1CYXopKWBcbiAgICByZXR1cm4gZXhwYW5kc1xuICAgICAgLnNwbGl0KCcvJylcbiAgICAgIC5yZXZlcnNlKClcbiAgICAgIC5yZWR1Y2UoKHJlc3VsdHMsIGl0ZW0sIGluZGV4LCBhcnIpID0+IHtcbiAgICAgICAgaWYgKGluZGV4ID09PSAwKSB7XG4gICAgICAgICAgLy8gSW5uZXItbW9zdCBpdGVtXG4gICAgICAgICAgcmV0dXJuIGAkZXhwYW5kPSR7aXRlbX1gO1xuICAgICAgICB9IGVsc2UgaWYgKGluZGV4ID09PSBhcnIubGVuZ3RoIC0gMSkge1xuICAgICAgICAgIC8vIE91dGVyLW1vc3QgaXRlbSwgZG9uJ3QgYWRkIGAkZXhwYW5kPWAgcHJlZml4IChhZGRlZCBhYm92ZSlcbiAgICAgICAgICByZXR1cm4gYCR7aXRlbX0oJHtyZXN1bHRzfSlgO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIE90aGVyIGl0ZW1zXG4gICAgICAgICAgcmV0dXJuIGAkZXhwYW5kPSR7aXRlbX0oJHtyZXN1bHRzfSlgO1xuICAgICAgICB9XG4gICAgICB9LCAnJyk7XG4gIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShleHBhbmRzKSkge1xuICAgIHJldHVybiBgJHsoZXhwYW5kcyBhcyBBcnJheTxOZXN0ZWRFeHBhbmRPcHRpb25zPGFueT4+KVxuICAgICAgLm1hcCgoZSkgPT4gYnVpbGRFeHBhbmQoZSwgeyBhbGlhc2VzLCBlc2NhcGUgfSkpXG4gICAgICAuam9pbignLCcpfWA7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGV4cGFuZHMgPT09ICdvYmplY3QnKSB7XG4gICAgY29uc3QgZXhwYW5kS2V5cyA9IE9iamVjdC5rZXlzKGV4cGFuZHMpO1xuXG4gICAgaWYgKFxuICAgICAgZXhwYW5kS2V5cy5zb21lKFxuICAgICAgICAoa2V5KSA9PiBTVVBQT1JURURfRVhQQU5EX1BST1BFUlRJRVMuaW5kZXhPZihrZXkudG9Mb3dlckNhc2UoKSkgIT09IC0xLFxuICAgICAgKVxuICAgICkge1xuICAgICAgcmV0dXJuIGV4cGFuZEtleXNcbiAgICAgICAgLm1hcCgoa2V5KSA9PiB7XG4gICAgICAgICAgbGV0IHZhbHVlO1xuICAgICAgICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICAgICAgICBjYXNlICdmaWx0ZXInOlxuICAgICAgICAgICAgICB2YWx1ZSA9IGJ1aWxkRmlsdGVyKChleHBhbmRzIGFzIE5lc3RlZEV4cGFuZE9wdGlvbnM8YW55Pilba2V5XSwge1xuICAgICAgICAgICAgICAgIGFsaWFzZXMsXG4gICAgICAgICAgICAgICAgZXNjYXBlLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdvcmRlckJ5JzpcbiAgICAgICAgICAgICAgdmFsdWUgPSBidWlsZE9yZGVyQnkoXG4gICAgICAgICAgICAgICAgKGV4cGFuZHMgYXMgTmVzdGVkRXhwYW5kT3B0aW9uczxhbnk+KVtrZXldIGFzIE9yZGVyQnk8VD4sXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnbGV2ZWxzJzpcbiAgICAgICAgICAgIGNhc2UgJ2NvdW50JzpcbiAgICAgICAgICAgIGNhc2UgJ3RvcCc6XG4gICAgICAgICAgICBjYXNlICdza2lwJzpcbiAgICAgICAgICAgICAgdmFsdWUgPSBgJHsoZXhwYW5kcyBhcyBOZXN0ZWRFeHBhbmRPcHRpb25zPGFueT4pW2tleV19YDtcbiAgICAgICAgICAgICAgaWYgKGlzUmF3VHlwZSh2YWx1ZSkpXG4gICAgICAgICAgICAgICAgdmFsdWUgPSAodmFsdWUgYXMgdW5rbm93biBhcyBRdWVyeUN1c3RvbVR5cGUpLnZhbHVlO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIHZhbHVlID0gYnVpbGRFeHBhbmQoXG4gICAgICAgICAgICAgICAgKGV4cGFuZHMgYXMgTmVzdGVkRXhwYW5kT3B0aW9uczxhbnk+KVtrZXldIGFzIEV4cGFuZDxUPixcbiAgICAgICAgICAgICAgICB7IGFsaWFzZXMsIGVzY2FwZSB9LFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gYCQke2tleS50b0xvd2VyQ2FzZSgpfT0ke3ZhbHVlfWA7XG4gICAgICAgIH0pXG4gICAgICAgIC5qb2luKCc7Jyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBleHBhbmRLZXlzXG4gICAgICAgIC5tYXAoKGtleSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGJ1aWx0RXhwYW5kID0gYnVpbGRFeHBhbmQoXG4gICAgICAgICAgICAoZXhwYW5kcyBhcyBOZXN0ZWRFeHBhbmRPcHRpb25zPGFueT4pW1xuICAgICAgICAgICAgICBrZXlcbiAgICAgICAgICAgIF0gYXMgTmVzdGVkRXhwYW5kT3B0aW9uczxhbnk+LFxuICAgICAgICAgICAgeyBhbGlhc2VzLCBlc2NhcGUgfSxcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiBidWlsdEV4cGFuZCA/IGAke2tleX0oJHtidWlsdEV4cGFuZH0pYCA6IGtleTtcbiAgICAgICAgfSlcbiAgICAgICAgLmpvaW4oJywnKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuICcnO1xufVxuXG5mdW5jdGlvbiBidWlsZFRyYW5zZm9ybXM8VD4oXG4gIHRyYW5zZm9ybXM6IFRyYW5zZm9ybTxUPiB8IFRyYW5zZm9ybTxUPltdLFxuICB7XG4gICAgYWxpYXNlcyxcbiAgICBlc2NhcGUgPSBmYWxzZSxcbiAgfTogeyBhbGlhc2VzPzogUXVlcnlDdXN0b21UeXBlW107IGVzY2FwZT86IGJvb2xlYW4gfSxcbikge1xuICAvLyBXcmFwIHNpbmdsZSBvYmplY3QgYW4gYXJyYXkgZm9yIHNpbXBsaWZpZWQgcHJvY2Vzc2luZ1xuICBjb25zdCB0cmFuc2Zvcm1zQXJyYXkgPSBBcnJheS5pc0FycmF5KHRyYW5zZm9ybXMpID8gdHJhbnNmb3JtcyA6IFt0cmFuc2Zvcm1zXTtcblxuICBjb25zdCB0cmFuc2Zvcm1zUmVzdWx0ID0gdHJhbnNmb3Jtc0FycmF5LnJlZHVjZShcbiAgICAocmVzdWx0OiBzdHJpbmdbXSwgdHJhbnNmb3JtKSA9PiB7XG4gICAgICBjb25zdCB7IGFnZ3JlZ2F0ZSwgZmlsdGVyLCBncm91cEJ5LCAuLi5yZXN0IH0gPSB0cmFuc2Zvcm07XG5cbiAgICAgIC8vIFRPRE86IHN1cHBvcnQgYXMgbWFueSBvZiB0aGUgZm9sbG93aW5nOlxuICAgICAgLy8gICB0b3Bjb3VudCwgdG9wc3VtLCB0b3BwZXJjZW50LFxuICAgICAgLy8gICBib3R0b21zdW0sIGJvdHRvbWNvdW50LCBib3R0b21wZXJjZW50LFxuICAgICAgLy8gICBpZGVudGl0eSwgY29uY2F0LCBleHBhbmQsIHNlYXJjaCwgY29tcHV0ZSwgaXNkZWZpbmVkXG4gICAgICBjb25zdCB1bnN1cHBvcnRlZEtleXMgPSBPYmplY3Qua2V5cyhyZXN0KTtcbiAgICAgIGlmICh1bnN1cHBvcnRlZEtleXMubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgdHJhbnNmb3JtKHMpOiAke3Vuc3VwcG9ydGVkS2V5c31gKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGFnZ3JlZ2F0ZSkge1xuICAgICAgICByZXN1bHQucHVzaChgYWdncmVnYXRlKCR7YnVpbGRBZ2dyZWdhdGUoYWdncmVnYXRlKX0pYCk7XG4gICAgICB9XG4gICAgICBpZiAoZmlsdGVyKSB7XG4gICAgICAgIGNvbnN0IGJ1aWx0RmlsdGVyID0gYnVpbGRGaWx0ZXIoZmlsdGVyLCB7IGFsaWFzZXMsIGVzY2FwZSB9KTtcbiAgICAgICAgaWYgKGJ1aWx0RmlsdGVyKSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2goXG4gICAgICAgICAgICBgZmlsdGVyKCR7YnVpbGRGaWx0ZXIoYnVpbHRGaWx0ZXIsIHsgYWxpYXNlcywgZXNjYXBlIH0pfSlgLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChncm91cEJ5KSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKGBncm91cGJ5KCR7YnVpbGRHcm91cEJ5KGdyb3VwQnksIHsgYWxpYXNlcywgZXNjYXBlIH0pfSlgKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9LFxuICAgIFtdLFxuICApO1xuXG4gIHJldHVybiB0cmFuc2Zvcm1zUmVzdWx0LmpvaW4oJy8nKSB8fCB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkQWdncmVnYXRlKGFnZ3JlZ2F0ZTogQWdncmVnYXRlVHlwZSB8IEFnZ3JlZ2F0ZVR5cGVbXSkge1xuICAvLyBXcmFwIHNpbmdsZSBvYmplY3QgaW4gYW4gYXJyYXkgZm9yIHNpbXBsaWZpZWQgcHJvY2Vzc2luZ1xuICBjb25zdCBhZ2dyZWdhdGVBcnJheSA9IEFycmF5LmlzQXJyYXkoYWdncmVnYXRlKSA/IGFnZ3JlZ2F0ZSA6IFthZ2dyZWdhdGVdO1xuXG4gIHJldHVybiBhZ2dyZWdhdGVBcnJheVxuICAgIC5tYXAoKGFnZ3JlZ2F0ZUl0ZW0pID0+IHtcbiAgICAgIHJldHVybiB0eXBlb2YgYWdncmVnYXRlSXRlbSA9PT0gJ3N0cmluZydcbiAgICAgICAgPyBhZ2dyZWdhdGVJdGVtXG4gICAgICAgIDogT2JqZWN0LmtleXMoYWdncmVnYXRlSXRlbSkubWFwKChhZ2dyZWdhdGVLZXkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGFnZ3JlZ2F0ZVZhbHVlID0gYWdncmVnYXRlSXRlbVthZ2dyZWdhdGVLZXldO1xuXG4gICAgICAgICAgICAvLyBUT0RPOiBBcmUgdGhlc2UgYWx3YXlzIHJlcXVpcmVkPyAgQ2FuL3Nob3VsZCB3ZSBkZWZhdWx0IHRoZW0gaWYgc28/XG4gICAgICAgICAgICBpZiAoIWFnZ3JlZ2F0ZVZhbHVlLndpdGgpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAnd2l0aCcgcHJvcGVydHkgcmVxdWlyZWQgZm9yICcke2FnZ3JlZ2F0ZUtleX0nYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWFnZ3JlZ2F0ZVZhbHVlLmFzKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJ2FzJyBwcm9wZXJ0eSByZXF1aXJlZCBmb3IgJyR7YWdncmVnYXRlS2V5fSdgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGAke2FnZ3JlZ2F0ZUtleX0gd2l0aCAke2FnZ3JlZ2F0ZVZhbHVlLndpdGh9IGFzICR7YWdncmVnYXRlVmFsdWUuYXN9YDtcbiAgICAgICAgICB9KTtcbiAgICB9KVxuICAgIC5qb2luKCcsJyk7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkR3JvdXBCeTxUPihcbiAgZ3JvdXBCeTogR3JvdXBCeVR5cGU8VD4sXG4gIHtcbiAgICBhbGlhc2VzLFxuICAgIGVzY2FwZSA9IGZhbHNlLFxuICB9OiB7IGFsaWFzZXM/OiBRdWVyeUN1c3RvbVR5cGVbXTsgZXNjYXBlPzogYm9vbGVhbiB9LFxuKSB7XG4gIGlmICghZ3JvdXBCeS5wcm9wZXJ0aWVzKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAncHJvcGVydGllcycgcHJvcGVydHkgcmVxdWlyZWQgZm9yIGdyb3VwQnlgKTtcbiAgfVxuXG4gIGxldCByZXN1bHQgPSBgKCR7Z3JvdXBCeS5wcm9wZXJ0aWVzLmpvaW4oJywnKX0pYDtcblxuICBpZiAoZ3JvdXBCeS50cmFuc2Zvcm0pIHtcbiAgICByZXN1bHQgKz0gYCwke2J1aWxkVHJhbnNmb3Jtcyhncm91cEJ5LnRyYW5zZm9ybSwgeyBhbGlhc2VzLCBlc2NhcGUgfSl9YDtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkT3JkZXJCeTxUPihvcmRlckJ5OiBPcmRlckJ5PFQ+LCBwcmVmaXg6IHN0cmluZyA9ICcnKTogc3RyaW5nIHtcbiAgaWYgKGlzUmF3VHlwZShvcmRlckJ5KSkge1xuICAgIHJldHVybiAob3JkZXJCeSBhcyBRdWVyeUN1c3RvbVR5cGUpLnZhbHVlO1xuICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkob3JkZXJCeSkpIHtcbiAgICByZXR1cm4gKG9yZGVyQnkgYXMgT3JkZXJCeU9iamVjdDxUPltdKVxuICAgICAgLm1hcCgodmFsdWUpID0+XG4gICAgICAgIEFycmF5LmlzQXJyYXkodmFsdWUpICYmXG4gICAgICAgIHZhbHVlLmxlbmd0aCA9PT0gMiAmJlxuICAgICAgICBbJ2FzYycsICdkZXNjJ10uaW5kZXhPZih2YWx1ZVsxXSkgIT09IC0xXG4gICAgICAgICAgPyB2YWx1ZS5qb2luKCcgJylcbiAgICAgICAgICA6IHZhbHVlLFxuICAgICAgKVxuICAgICAgLm1hcCgodikgPT4gYCR7cHJlZml4fSR7diBhcyBzdHJpbmd9YClcbiAgICAgIC5qb2luKCcsJyk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIG9yZGVyQnkgPT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKG9yZGVyQnkpXG4gICAgICAubWFwKChbaywgdl0pID0+IGJ1aWxkT3JkZXJCeSh2IGFzIE9yZGVyQnk8YW55PiwgYCR7a30vYCkpXG4gICAgICAubWFwKCh2KSA9PiBgJHtwcmVmaXh9JHt2fWApXG4gICAgICAuam9pbignLCcpO1xuICB9XG4gIHJldHVybiBgJHtwcmVmaXh9JHtvcmRlckJ5IGFzIHN0cmluZ31gO1xufVxuXG5mdW5jdGlvbiBidWlsZEFwcGx5KFxuICBhcHBseTogYW55LFxuICB7XG4gICAgYWxpYXNlcyxcbiAgICBlc2NhcGUgPSBmYWxzZSxcbiAgfTogeyBhbGlhc2VzPzogUXVlcnlDdXN0b21UeXBlW107IGVzY2FwZT86IGJvb2xlYW4gfSxcbikge1xuICBjb25zdCBhcHBseUFycmF5ID0gQXJyYXkuaXNBcnJheShhcHBseSkgPyBhcHBseSA6IFthcHBseV07XG4gIHJldHVybiBhcHBseUFycmF5XG4gICAgLm1hcCgodikgPT4gbm9ybWFsaXplVmFsdWUodiwgeyBhbGlhc2VzLCBlc2NhcGUgfSkpXG4gICAgLmpvaW4oJy8nKTtcbn1cblxuZnVuY3Rpb24gYnVpbGRVcmwocGF0aDogc3RyaW5nLCBwYXJhbXM6IHsgW25hbWU6IHN0cmluZ106IGFueSB9KTogc3RyaW5nIHtcbiAgLy8gVGhpcyBjYW4gYmUgcmVmYWN0b3JlZCB1c2luZyBVUkwgQVBJLiBCdXQgSUUgZG9lcyBub3Qgc3VwcG9ydCBpdC5cbiAgY29uc3QgcXVlcmllczogc3RyaW5nW10gPSBPYmplY3QuZW50cmllcyhwYXJhbXMpLm1hcChcbiAgICAoW2tleSwgdmFsdWVdKSA9PiBgJHtrZXl9PSR7dmFsdWV9YCxcbiAgKTtcbiAgcmV0dXJuIHF1ZXJpZXMubGVuZ3RoID8gYCR7cGF0aH0/JHtxdWVyaWVzLmpvaW4oJyYnKX1gIDogcGF0aDtcbn1cblxuZnVuY3Rpb24gcGFyc2VOb3QoYnVpbHRGaWx0ZXJzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIHJldHVybiBgbm90ICgke2J1aWx0RmlsdGVycy5qb2luKCcgYW5kICcpfSlgO1xufVxuIl19