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.
- package/fesm2022/angular-odata.mjs +2298 -2162
- package/fesm2022/angular-odata.mjs.map +1 -1
- package/lib/api.d.ts +10 -11
- package/lib/cache/cache.d.ts +2 -2
- package/lib/cache/memory.d.ts +2 -2
- package/lib/cache/storage.d.ts +2 -2
- package/lib/loaders.d.ts +8 -8
- package/lib/metadata/csdl/csdl-annotation.d.ts +3 -3
- package/lib/metadata/csdl/csdl-entity-container.d.ts +2 -2
- package/lib/metadata/csdl/csdl-entity-set.d.ts +2 -2
- package/lib/metadata/csdl/csdl-enum-type.d.ts +3 -3
- package/lib/metadata/csdl/csdl-function-action.d.ts +4 -4
- package/lib/metadata/csdl/csdl-reference.d.ts +2 -2
- package/lib/metadata/csdl/csdl-schema.d.ts +2 -2
- package/lib/metadata/csdl/csdl-structural-property.d.ts +3 -3
- package/lib/metadata/csdl/csdl-structured-type.d.ts +3 -3
- package/lib/metadata/metadata.d.ts +2 -2
- package/lib/models/options.d.ts +2 -2
- package/lib/module.d.ts +3 -3
- package/lib/options.d.ts +3 -3
- package/lib/resources/query/expressions/apply.d.ts +1 -1
- package/lib/resources/query/expressions/compute.d.ts +1 -1
- package/lib/resources/query/expressions/count.d.ts +1 -1
- package/lib/resources/query/expressions/expand.d.ts +4 -3
- package/lib/resources/query/expressions/filter.d.ts +2 -1
- package/lib/resources/query/expressions/orderby.d.ts +2 -1
- package/lib/resources/query/expressions/search.d.ts +2 -1
- package/lib/resources/query/expressions/select.d.ts +2 -1
- package/lib/resources/query/handlers.d.ts +17 -5
- package/lib/resources/resource.d.ts +5 -5
- package/lib/resources/types/action.d.ts +2 -2
- package/lib/resources/types/entity-set.d.ts +2 -2
- package/lib/resources/types/navigation-property.d.ts +2 -2
- package/lib/resources/types/property.d.ts +2 -2
- package/lib/schema/annotation.d.ts +3 -3
- package/lib/schema/callable.d.ts +3 -3
- package/lib/schema/element.d.ts +3 -3
- package/lib/schema/entity-container.d.ts +2 -2
- package/lib/schema/entity-set.d.ts +2 -2
- package/lib/schema/enum-type.d.ts +2 -2
- package/lib/schema/parsers/callable.d.ts +4 -4
- package/lib/schema/parsers/enum-type.d.ts +3 -3
- package/lib/schema/parsers/structured-type.d.ts +4 -4
- package/lib/schema/schema.d.ts +3 -3
- package/lib/schema/singleton.d.ts +2 -2
- package/lib/schema/structured-type.d.ts +3 -3
- package/lib/services/entity.d.ts +1 -1
- package/lib/settings.d.ts +2 -2
- package/lib/types.d.ts +76 -74
- package/lib/utils/odata.d.ts +2 -2
- package/package.json +3 -5
- package/schematics/apigen/files/api-config/__fileName__.ts +4 -4
- package/esm2022/angular-odata.mjs +0 -5
- package/esm2022/lib/annotations.mjs +0 -146
- package/esm2022/lib/api.mjs +0 -439
- package/esm2022/lib/cache/cache.mjs +0 -177
- package/esm2022/lib/cache/index.mjs +0 -4
- package/esm2022/lib/cache/memory.mjs +0 -30
- package/esm2022/lib/cache/storage.mjs +0 -57
- package/esm2022/lib/client.mjs +0 -215
- package/esm2022/lib/constants.mjs +0 -95
- package/esm2022/lib/helper.mjs +0 -288
- package/esm2022/lib/index.mjs +0 -22
- package/esm2022/lib/loaders.mjs +0 -43
- package/esm2022/lib/metadata/csdl/csdl-annotation.mjs +0 -273
- package/esm2022/lib/metadata/csdl/csdl-entity-container.mjs +0 -59
- package/esm2022/lib/metadata/csdl/csdl-entity-set.mjs +0 -50
- package/esm2022/lib/metadata/csdl/csdl-enum-type.mjs +0 -74
- package/esm2022/lib/metadata/csdl/csdl-function-action.mjs +0 -204
- package/esm2022/lib/metadata/csdl/csdl-navigation-property-binding.mjs +0 -15
- package/esm2022/lib/metadata/csdl/csdl-reference.mjs +0 -76
- package/esm2022/lib/metadata/csdl/csdl-schema.mjs +0 -87
- package/esm2022/lib/metadata/csdl/csdl-singleton.mjs +0 -37
- package/esm2022/lib/metadata/csdl/csdl-structural-property.mjs +0 -145
- package/esm2022/lib/metadata/csdl/csdl-structured-type.mjs +0 -159
- package/esm2022/lib/metadata/csdl/csdl-type-definition.mjs +0 -46
- package/esm2022/lib/metadata/index.mjs +0 -3
- package/esm2022/lib/metadata/metadata.mjs +0 -41
- package/esm2022/lib/metadata/parser.mjs +0 -564
- package/esm2022/lib/models/collection.mjs +0 -816
- package/esm2022/lib/models/index.mjs +0 -4
- package/esm2022/lib/models/model.mjs +0 -577
- package/esm2022/lib/models/options.mjs +0 -1227
- package/esm2022/lib/module.mjs +0 -55
- package/esm2022/lib/options.mjs +0 -91
- package/esm2022/lib/resources/index.mjs +0 -7
- package/esm2022/lib/resources/options.mjs +0 -66
- package/esm2022/lib/resources/path/handlers.mjs +0 -81
- package/esm2022/lib/resources/path/index.mjs +0 -3
- package/esm2022/lib/resources/path/segments.mjs +0 -149
- package/esm2022/lib/resources/query/builder.mjs +0 -645
- package/esm2022/lib/resources/query/expressions/apply.mjs +0 -238
- package/esm2022/lib/resources/query/expressions/base.mjs +0 -26
- package/esm2022/lib/resources/query/expressions/compute.mjs +0 -55
- package/esm2022/lib/resources/query/expressions/count.mjs +0 -118
- package/esm2022/lib/resources/query/expressions/expand.mjs +0 -154
- package/esm2022/lib/resources/query/expressions/filter.mjs +0 -180
- package/esm2022/lib/resources/query/expressions/index.mjs +0 -10
- package/esm2022/lib/resources/query/expressions/orderby.mjs +0 -81
- package/esm2022/lib/resources/query/expressions/search.mjs +0 -144
- package/esm2022/lib/resources/query/expressions/select.mjs +0 -49
- package/esm2022/lib/resources/query/expressions/syntax.mjs +0 -770
- package/esm2022/lib/resources/query/handlers.mjs +0 -423
- package/esm2022/lib/resources/query/index.mjs +0 -5
- package/esm2022/lib/resources/query/options.mjs +0 -140
- package/esm2022/lib/resources/request.mjs +0 -210
- package/esm2022/lib/resources/resource.mjs +0 -316
- package/esm2022/lib/resources/response.mjs +0 -180
- package/esm2022/lib/resources/types/action.mjs +0 -118
- package/esm2022/lib/resources/types/batch.mjs +0 -428
- package/esm2022/lib/resources/types/count.mjs +0 -33
- package/esm2022/lib/resources/types/entity-set.mjs +0 -131
- package/esm2022/lib/resources/types/entity.mjs +0 -112
- package/esm2022/lib/resources/types/function.mjs +0 -149
- package/esm2022/lib/resources/types/index.mjs +0 -15
- package/esm2022/lib/resources/types/media.mjs +0 -44
- package/esm2022/lib/resources/types/metadata.mjs +0 -35
- package/esm2022/lib/resources/types/navigation-property.mjs +0 -246
- package/esm2022/lib/resources/types/options.mjs +0 -2
- package/esm2022/lib/resources/types/property.mjs +0 -187
- package/esm2022/lib/resources/types/reference.mjs +0 -87
- package/esm2022/lib/resources/types/singleton.mjs +0 -125
- package/esm2022/lib/resources/types/value.mjs +0 -48
- package/esm2022/lib/schema/annotation.mjs +0 -44
- package/esm2022/lib/schema/callable.mjs +0 -69
- package/esm2022/lib/schema/element.mjs +0 -70
- package/esm2022/lib/schema/entity-container.mjs +0 -13
- package/esm2022/lib/schema/entity-set.mjs +0 -11
- package/esm2022/lib/schema/enum-type.mjs +0 -69
- package/esm2022/lib/schema/index.mjs +0 -9
- package/esm2022/lib/schema/parsers/callable.mjs +0 -123
- package/esm2022/lib/schema/parsers/edm.mjs +0 -101
- package/esm2022/lib/schema/parsers/enum-type.mjs +0 -148
- package/esm2022/lib/schema/parsers/index.mjs +0 -5
- package/esm2022/lib/schema/parsers/structured-type.mjs +0 -548
- package/esm2022/lib/schema/schema.mjs +0 -52
- package/esm2022/lib/schema/singleton.mjs +0 -11
- package/esm2022/lib/schema/structured-type.mjs +0 -220
- package/esm2022/lib/services/base.mjs +0 -32
- package/esm2022/lib/services/entity-set.mjs +0 -161
- package/esm2022/lib/services/entity.mjs +0 -12
- package/esm2022/lib/services/factory.mjs +0 -39
- package/esm2022/lib/services/index.mjs +0 -5
- package/esm2022/lib/services/singleton.mjs +0 -55
- package/esm2022/lib/settings.mjs +0 -113
- package/esm2022/lib/types.mjs +0 -118
- package/esm2022/lib/utils/arraybuffers.mjs +0 -46
- package/esm2022/lib/utils/arrays.mjs +0 -10
- package/esm2022/lib/utils/dates.mjs +0 -18
- package/esm2022/lib/utils/durations.mjs +0 -40
- package/esm2022/lib/utils/enums.mjs +0 -61
- package/esm2022/lib/utils/http.mjs +0 -95
- package/esm2022/lib/utils/index.mjs +0 -10
- package/esm2022/lib/utils/objects.mjs +0 -204
- package/esm2022/lib/utils/odata.mjs +0 -22
- package/esm2022/lib/utils/strings.mjs +0 -20
- package/esm2022/lib/utils/types.mjs +0 -136
- package/esm2022/lib/utils/urls.mjs +0 -24
- package/esm2022/public-api.mjs +0 -5
|
@@ -1,770 +0,0 @@
|
|
|
1
|
-
import { ODataStructuredTypeFieldParser } from '../../../schema';
|
|
2
|
-
import { Objects, Types } from '../../../utils';
|
|
3
|
-
import { normalizeValue } from '../builder';
|
|
4
|
-
import { ApplyExpression, GroupByTransformations } from './apply';
|
|
5
|
-
import { ComputeExpression } from './compute';
|
|
6
|
-
import { CountExpression } from './count';
|
|
7
|
-
import { ExpandExpression } from './expand';
|
|
8
|
-
import { FilterExpression } from './filter';
|
|
9
|
-
import { OrderByExpression } from './orderby';
|
|
10
|
-
import { SearchExpression } from './search';
|
|
11
|
-
import { SelectExpression } from './select';
|
|
12
|
-
export const FieldFactory = (names = []) => new Proxy({ _names: names }, {
|
|
13
|
-
get(target, key) {
|
|
14
|
-
let names = target['_names'];
|
|
15
|
-
if (key === 'render') {
|
|
16
|
-
return ({ aliases, escape, prefix, parser, options, }) => {
|
|
17
|
-
let values = names.map((n) => render(n, { aliases, escape, prefix, parser, options }));
|
|
18
|
-
if (prefix && (names.length === 0 || typeof names[0] === 'string')) {
|
|
19
|
-
values = [prefix, ...values];
|
|
20
|
-
}
|
|
21
|
-
return values.join('/');
|
|
22
|
-
};
|
|
23
|
-
}
|
|
24
|
-
else if (key === 'clone') {
|
|
25
|
-
return () => FieldFactory([...names]);
|
|
26
|
-
}
|
|
27
|
-
else if (key === 'isField') {
|
|
28
|
-
return () => true;
|
|
29
|
-
}
|
|
30
|
-
else if (key === 'toJson') {
|
|
31
|
-
return () => ({
|
|
32
|
-
$type: 'Field',
|
|
33
|
-
names: names,
|
|
34
|
-
});
|
|
35
|
-
}
|
|
36
|
-
else if (key === 'resolve') {
|
|
37
|
-
return (parser) => names.reduce((acc, name) => typeof name === 'string'
|
|
38
|
-
? acc?.field(name)
|
|
39
|
-
: name?.resolve(parser), parser);
|
|
40
|
-
}
|
|
41
|
-
else {
|
|
42
|
-
return FieldFactory([...names, key]);
|
|
43
|
-
}
|
|
44
|
-
},
|
|
45
|
-
has(target, key) {
|
|
46
|
-
return (['toJson', 'isField', 'clone', 'render', 'resolve'].includes(key) ||
|
|
47
|
-
key in target);
|
|
48
|
-
},
|
|
49
|
-
});
|
|
50
|
-
export const RenderableFactory = (value) => {
|
|
51
|
-
if (Types.isPlainObject(value) && '$type' in value) {
|
|
52
|
-
switch (value.$type) {
|
|
53
|
-
case 'SelectExpression':
|
|
54
|
-
return SelectExpression.fromJson(value);
|
|
55
|
-
case 'ExpandExpression':
|
|
56
|
-
return ExpandExpression.fromJson(value);
|
|
57
|
-
case 'ComputeExpression':
|
|
58
|
-
return ComputeExpression.fromJson(value);
|
|
59
|
-
case 'ApplyExpression':
|
|
60
|
-
return ApplyExpression.fromJson(value);
|
|
61
|
-
case 'FilterExpression':
|
|
62
|
-
return FilterExpression.fromJson(value);
|
|
63
|
-
case 'OrderByExpression':
|
|
64
|
-
return OrderByExpression.fromJson(value);
|
|
65
|
-
case 'SearchExpression':
|
|
66
|
-
return SearchExpression.fromJson(value);
|
|
67
|
-
case 'CountExpression':
|
|
68
|
-
return CountExpression.fromJson(value);
|
|
69
|
-
case 'GroupByTransformations':
|
|
70
|
-
return GroupByTransformations.fromJson(value);
|
|
71
|
-
case 'Function':
|
|
72
|
-
return Function.fromJson(value);
|
|
73
|
-
case 'Operator':
|
|
74
|
-
return Operator.fromJson(value);
|
|
75
|
-
case 'Grouping':
|
|
76
|
-
return Grouping.fromJson(value);
|
|
77
|
-
case 'Aggregate':
|
|
78
|
-
return Aggregate.fromJson(value);
|
|
79
|
-
case 'GroupBy':
|
|
80
|
-
return GroupBy.fromJson(value);
|
|
81
|
-
case 'Lambda':
|
|
82
|
-
return Lambda.fromJson(value);
|
|
83
|
-
case 'Type':
|
|
84
|
-
return Type.fromJson(value);
|
|
85
|
-
case 'Field':
|
|
86
|
-
return FieldFactory(value['names']);
|
|
87
|
-
default:
|
|
88
|
-
return value;
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
return value;
|
|
92
|
-
};
|
|
93
|
-
function applyMixins(derivedCtor, constructors) {
|
|
94
|
-
constructors.forEach((baseCtor) => {
|
|
95
|
-
Object.getOwnPropertyNames(baseCtor.prototype).forEach((name) => {
|
|
96
|
-
Object.defineProperty(derivedCtor.prototype, name, Object.getOwnPropertyDescriptor(baseCtor.prototype, name) ||
|
|
97
|
-
Object.create(null));
|
|
98
|
-
});
|
|
99
|
-
});
|
|
100
|
-
}
|
|
101
|
-
export function render(value, { aliases, normalize, escape, prefix, parser, options, } = {}) {
|
|
102
|
-
if (Types.isFunction(value)) {
|
|
103
|
-
return render(value(syntax), {
|
|
104
|
-
aliases,
|
|
105
|
-
normalize,
|
|
106
|
-
prefix,
|
|
107
|
-
parser,
|
|
108
|
-
options,
|
|
109
|
-
});
|
|
110
|
-
}
|
|
111
|
-
if (Types.isObject(value) && 'render' in value) {
|
|
112
|
-
return render(value.render({ aliases, escape, prefix, parser, options }), {
|
|
113
|
-
aliases,
|
|
114
|
-
normalize,
|
|
115
|
-
escape,
|
|
116
|
-
prefix,
|
|
117
|
-
parser,
|
|
118
|
-
options,
|
|
119
|
-
});
|
|
120
|
-
}
|
|
121
|
-
return normalize ? normalizeValue(value, { aliases, escape }) : value;
|
|
122
|
-
}
|
|
123
|
-
export function resolve(values, parser) {
|
|
124
|
-
if (parser !== undefined) {
|
|
125
|
-
let fields = values.filter((v) => Types.isObject(v) && 'isField' in v && v.isField());
|
|
126
|
-
if (fields.length === 1 && Types.isObject(parser) && 'field' in parser) {
|
|
127
|
-
return fields[0].resolve(parser);
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
return parser;
|
|
131
|
-
}
|
|
132
|
-
export function encode(values, parser, options) {
|
|
133
|
-
if (parser !== undefined) {
|
|
134
|
-
return values.map((v) => {
|
|
135
|
-
if (Types.isArray(v))
|
|
136
|
-
return encode(v, parser, options);
|
|
137
|
-
if (Types.isObject(v) || v == null)
|
|
138
|
-
return v;
|
|
139
|
-
try {
|
|
140
|
-
return parser.encode(v, options);
|
|
141
|
-
}
|
|
142
|
-
catch {
|
|
143
|
-
return v;
|
|
144
|
-
}
|
|
145
|
-
});
|
|
146
|
-
}
|
|
147
|
-
return values;
|
|
148
|
-
}
|
|
149
|
-
export class Function {
|
|
150
|
-
name;
|
|
151
|
-
values;
|
|
152
|
-
normalize;
|
|
153
|
-
escape;
|
|
154
|
-
constructor(name, values, normalize, escape = false) {
|
|
155
|
-
this.name = name;
|
|
156
|
-
this.values = values;
|
|
157
|
-
this.normalize = normalize;
|
|
158
|
-
this.escape = escape;
|
|
159
|
-
}
|
|
160
|
-
get [Symbol.toStringTag]() {
|
|
161
|
-
return 'Function';
|
|
162
|
-
}
|
|
163
|
-
toJson() {
|
|
164
|
-
return {
|
|
165
|
-
$type: Types.rawType(this),
|
|
166
|
-
name: this.name,
|
|
167
|
-
values: this.values.map((v) => Types.isObject(v) && 'toJson' in v ? v.toJson() : v),
|
|
168
|
-
normalize: this.normalize,
|
|
169
|
-
};
|
|
170
|
-
}
|
|
171
|
-
static fromJson(json) {
|
|
172
|
-
return new Function(json['name'], json['values'].map((v) => RenderableFactory(v)), json['normalize'], json['escape']);
|
|
173
|
-
}
|
|
174
|
-
render({ aliases, escape, prefix, parser, options, }) {
|
|
175
|
-
parser = resolve(this.values, parser);
|
|
176
|
-
let [left, ...values] = encode(this.values, parser, options);
|
|
177
|
-
left = render(left, {
|
|
178
|
-
aliases,
|
|
179
|
-
escape,
|
|
180
|
-
prefix,
|
|
181
|
-
parser,
|
|
182
|
-
normalize: this.normalize === 'all' || this.normalize === 'left',
|
|
183
|
-
options,
|
|
184
|
-
});
|
|
185
|
-
const params = [
|
|
186
|
-
left,
|
|
187
|
-
...values.map((v) => render(v, {
|
|
188
|
-
aliases,
|
|
189
|
-
escape,
|
|
190
|
-
prefix,
|
|
191
|
-
parser,
|
|
192
|
-
normalize: this.normalize === 'all' || this.normalize === 'right',
|
|
193
|
-
options,
|
|
194
|
-
})),
|
|
195
|
-
];
|
|
196
|
-
return `${this.name}(${params.join(', ')})`;
|
|
197
|
-
}
|
|
198
|
-
clone() {
|
|
199
|
-
return new Function(this.name, this.values.map((v) => Objects.clone(v)), this.normalize, this.escape);
|
|
200
|
-
}
|
|
201
|
-
resolve(parser) {
|
|
202
|
-
return parser;
|
|
203
|
-
}
|
|
204
|
-
}
|
|
205
|
-
export class StringAndCollectionFunctions {
|
|
206
|
-
concat(left, right, normalize = 'right') {
|
|
207
|
-
return new Function('concat', [left, right], normalize);
|
|
208
|
-
}
|
|
209
|
-
contains(left, right, normalize = 'right') {
|
|
210
|
-
return new Function('contains', [left, right], normalize);
|
|
211
|
-
}
|
|
212
|
-
endsWith(left, right, normalize = 'right') {
|
|
213
|
-
return new Function('endswith', [left, right], normalize);
|
|
214
|
-
}
|
|
215
|
-
indexOf(left, right, normalize = 'right') {
|
|
216
|
-
return new Function('indexof', [left, right], normalize);
|
|
217
|
-
}
|
|
218
|
-
length(left, normalize = 'right') {
|
|
219
|
-
return new Function('length', [left], normalize);
|
|
220
|
-
}
|
|
221
|
-
startsWith(left, right, normalize = 'right') {
|
|
222
|
-
return new Function('startswith', [left, right], normalize);
|
|
223
|
-
}
|
|
224
|
-
subString(left, right, length, normalize = 'none') {
|
|
225
|
-
let values = [left, right];
|
|
226
|
-
if (length !== undefined) {
|
|
227
|
-
values.push(length);
|
|
228
|
-
}
|
|
229
|
-
return new Function('substring', values, normalize);
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
|
-
export class CollectionFunctions {
|
|
233
|
-
hasSubset(left, right, normalize = 'none') {
|
|
234
|
-
return new Function('hassubset', [left, right], normalize);
|
|
235
|
-
}
|
|
236
|
-
hasSubsequence(left, right, normalize = 'none') {
|
|
237
|
-
return new Function('hassubsequence', [left, right], normalize);
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
|
-
export class StringFunctions {
|
|
241
|
-
matchesPattern(left, pattern, normalize = 'none') {
|
|
242
|
-
return new Function('matchesPattern', [left, pattern], normalize);
|
|
243
|
-
}
|
|
244
|
-
toLower(left, normalize = 'none') {
|
|
245
|
-
return new Function('tolower', [left], normalize);
|
|
246
|
-
}
|
|
247
|
-
toUpper(left, normalize = 'none') {
|
|
248
|
-
return new Function('toupper', [left], normalize);
|
|
249
|
-
}
|
|
250
|
-
trim(left, normalize = 'none') {
|
|
251
|
-
return new Function('trim', [left], normalize);
|
|
252
|
-
}
|
|
253
|
-
}
|
|
254
|
-
export class DateAndTimeFunctions {
|
|
255
|
-
date(left, normalize = 'none') {
|
|
256
|
-
return new Function('date', [left], normalize);
|
|
257
|
-
}
|
|
258
|
-
day(left, normalize = 'none') {
|
|
259
|
-
return new Function('day', [left], normalize);
|
|
260
|
-
}
|
|
261
|
-
fractionalseconds(left, normalize = 'none') {
|
|
262
|
-
return new Function('fractionalseconds', [left], normalize);
|
|
263
|
-
}
|
|
264
|
-
hour(left, normalize = 'none') {
|
|
265
|
-
return new Function('hour', [left], normalize);
|
|
266
|
-
}
|
|
267
|
-
maxdatetime(left, normalize = 'none') {
|
|
268
|
-
return new Function('maxdatetime', [left], normalize);
|
|
269
|
-
}
|
|
270
|
-
mindatetime(left, normalize = 'none') {
|
|
271
|
-
return new Function('mindatetime', [left], normalize);
|
|
272
|
-
}
|
|
273
|
-
minute(left, normalize = 'none') {
|
|
274
|
-
return new Function('minute', [left], normalize);
|
|
275
|
-
}
|
|
276
|
-
month(left, normalize = 'none') {
|
|
277
|
-
return new Function('month', [left], normalize);
|
|
278
|
-
}
|
|
279
|
-
now() {
|
|
280
|
-
return new Function('now', [], 'none');
|
|
281
|
-
}
|
|
282
|
-
second(left, normalize = 'none') {
|
|
283
|
-
return new Function('second', [left], normalize);
|
|
284
|
-
}
|
|
285
|
-
time(left, normalize = 'none') {
|
|
286
|
-
return new Function('time', [left], normalize);
|
|
287
|
-
}
|
|
288
|
-
totaloffsetminutes(left, normalize = 'none') {
|
|
289
|
-
return new Function('totaloffsetminutes', [left], normalize);
|
|
290
|
-
}
|
|
291
|
-
totalseconds(left, normalize = 'none') {
|
|
292
|
-
return new Function('totalseconds', [left], normalize);
|
|
293
|
-
}
|
|
294
|
-
year(left, normalize = 'none') {
|
|
295
|
-
return new Function('year', [left], normalize);
|
|
296
|
-
}
|
|
297
|
-
}
|
|
298
|
-
export class ArithmeticFunctions {
|
|
299
|
-
ceiling(left, normalize = 'none') {
|
|
300
|
-
return new Function('ceiling', [left], normalize);
|
|
301
|
-
}
|
|
302
|
-
floor(left, normalize = 'none') {
|
|
303
|
-
return new Function('floor', [left], normalize);
|
|
304
|
-
}
|
|
305
|
-
round(left, normalize = 'none') {
|
|
306
|
-
return new Function('round', [left], normalize);
|
|
307
|
-
}
|
|
308
|
-
}
|
|
309
|
-
export class TypeFunctions {
|
|
310
|
-
cast(left, type) {
|
|
311
|
-
return FieldFactory([
|
|
312
|
-
type !== undefined
|
|
313
|
-
? new Type('cast', type, left)
|
|
314
|
-
: new Type('cast', left),
|
|
315
|
-
]);
|
|
316
|
-
}
|
|
317
|
-
isof(left, type) {
|
|
318
|
-
return type !== undefined
|
|
319
|
-
? new Type('isof', type, left)
|
|
320
|
-
: new Type('isof', left);
|
|
321
|
-
}
|
|
322
|
-
}
|
|
323
|
-
export class GeoFunctions {
|
|
324
|
-
geoDistance(left, right, normalize = 'right') {
|
|
325
|
-
return new Function('geo.distance', [left, right], normalize);
|
|
326
|
-
}
|
|
327
|
-
geoIntersects(left, right, normalize = 'right') {
|
|
328
|
-
return new Function('geo.intersects', [left, right], normalize);
|
|
329
|
-
}
|
|
330
|
-
geoLength(left, normalize = 'none') {
|
|
331
|
-
return new Function('geo.length', [left], normalize);
|
|
332
|
-
}
|
|
333
|
-
}
|
|
334
|
-
export class ConditionalFunctions {
|
|
335
|
-
case(left, right, normalize = 'none') {
|
|
336
|
-
return new Function('case', [left, right], normalize);
|
|
337
|
-
}
|
|
338
|
-
}
|
|
339
|
-
export class Operator {
|
|
340
|
-
op;
|
|
341
|
-
values;
|
|
342
|
-
normalize;
|
|
343
|
-
constructor(op, values, normalize) {
|
|
344
|
-
this.op = op;
|
|
345
|
-
this.values = values;
|
|
346
|
-
this.normalize = normalize;
|
|
347
|
-
}
|
|
348
|
-
get [Symbol.toStringTag]() {
|
|
349
|
-
return 'Operator';
|
|
350
|
-
}
|
|
351
|
-
toJson() {
|
|
352
|
-
return {
|
|
353
|
-
$type: Types.rawType(this),
|
|
354
|
-
op: this.op,
|
|
355
|
-
values: this.values.map((v) => Types.isObject(v) && 'toJson' in v ? v.toJson() : v),
|
|
356
|
-
normalize: this.normalize,
|
|
357
|
-
};
|
|
358
|
-
}
|
|
359
|
-
static fromJson(json) {
|
|
360
|
-
return new Operator(json['op'], json['values'].map((v) => RenderableFactory(v)), json['normalize']);
|
|
361
|
-
}
|
|
362
|
-
render({ aliases, escape, prefix, parser, options, }) {
|
|
363
|
-
parser = resolve(this.values, parser);
|
|
364
|
-
let [left, right] = encode(this.values, parser, options);
|
|
365
|
-
left = render(left, {
|
|
366
|
-
aliases,
|
|
367
|
-
escape,
|
|
368
|
-
prefix,
|
|
369
|
-
parser,
|
|
370
|
-
normalize: this.normalize === 'all' || this.normalize === 'left',
|
|
371
|
-
options,
|
|
372
|
-
});
|
|
373
|
-
if (right !== undefined) {
|
|
374
|
-
right = Array.isArray(right)
|
|
375
|
-
? `(${right
|
|
376
|
-
.map((v) => render(v, {
|
|
377
|
-
aliases,
|
|
378
|
-
escape,
|
|
379
|
-
prefix,
|
|
380
|
-
parser,
|
|
381
|
-
normalize: this.normalize === 'all' || this.normalize === 'right',
|
|
382
|
-
options,
|
|
383
|
-
}))
|
|
384
|
-
.join(',')})`
|
|
385
|
-
: render(right, {
|
|
386
|
-
aliases,
|
|
387
|
-
escape,
|
|
388
|
-
prefix,
|
|
389
|
-
parser,
|
|
390
|
-
normalize: this.normalize === 'all' || this.normalize === 'right',
|
|
391
|
-
options,
|
|
392
|
-
});
|
|
393
|
-
return `${left} ${this.op} ${right}`;
|
|
394
|
-
}
|
|
395
|
-
return `${this.op}(${left})`;
|
|
396
|
-
}
|
|
397
|
-
clone() {
|
|
398
|
-
return new Operator(this.op, this.values.map((v) => Objects.clone(v)), this.normalize);
|
|
399
|
-
}
|
|
400
|
-
resolve(parser) {
|
|
401
|
-
return parser;
|
|
402
|
-
}
|
|
403
|
-
}
|
|
404
|
-
export class LogicalOperators {
|
|
405
|
-
eq(left, right, normalize = 'right') {
|
|
406
|
-
return new Operator('eq', [left, right], normalize);
|
|
407
|
-
}
|
|
408
|
-
ne(left, right, normalize = 'right') {
|
|
409
|
-
return new Operator('ne', [left, right], normalize);
|
|
410
|
-
}
|
|
411
|
-
gt(left, right, normalize = 'right') {
|
|
412
|
-
return new Operator('gt', [left, right], normalize);
|
|
413
|
-
}
|
|
414
|
-
ge(left, right, normalize = 'right') {
|
|
415
|
-
return new Operator('ge', [left, right], normalize);
|
|
416
|
-
}
|
|
417
|
-
lt(left, right, normalize = 'right') {
|
|
418
|
-
return new Operator('lt', [left, right], normalize);
|
|
419
|
-
}
|
|
420
|
-
le(left, right, normalize = 'right') {
|
|
421
|
-
return new Operator('le', [left, right], normalize);
|
|
422
|
-
}
|
|
423
|
-
/*
|
|
424
|
-
and(left: any, right: any, normalize: Normalize = 'right') {
|
|
425
|
-
return new Operator('and', [left, right], normalize);
|
|
426
|
-
}
|
|
427
|
-
or(left: any, right: any, normalize: Normalize = 'right') {
|
|
428
|
-
return new Operator('or', [left, right], normalize);
|
|
429
|
-
}
|
|
430
|
-
*/
|
|
431
|
-
not(left, normalize = 'none') {
|
|
432
|
-
return new Operator('not', [left], normalize);
|
|
433
|
-
}
|
|
434
|
-
has(left, right, normalize = 'right') {
|
|
435
|
-
return new Operator('has', [left, right], normalize);
|
|
436
|
-
}
|
|
437
|
-
in(left, right, normalize = 'right') {
|
|
438
|
-
return new Operator('in', [left, right], normalize);
|
|
439
|
-
}
|
|
440
|
-
}
|
|
441
|
-
export class ArithmeticOperators {
|
|
442
|
-
add(left, right, normalize = 'right') {
|
|
443
|
-
return new Operator('add', [left, right], normalize);
|
|
444
|
-
}
|
|
445
|
-
sub(left, right, normalize = 'right') {
|
|
446
|
-
return new Operator('sub', [left, right], normalize);
|
|
447
|
-
}
|
|
448
|
-
mul(left, right, normalize = 'right') {
|
|
449
|
-
return new Operator('mul', [left, right], normalize);
|
|
450
|
-
}
|
|
451
|
-
div(left, right, normalize = 'right') {
|
|
452
|
-
return new Operator('div', [left, right], normalize);
|
|
453
|
-
}
|
|
454
|
-
mod(left, right, normalize = 'right') {
|
|
455
|
-
return new Operator('mod', [left, right], normalize);
|
|
456
|
-
}
|
|
457
|
-
neg(value, normalize = 'right') {
|
|
458
|
-
return new Operator('-', [value], normalize);
|
|
459
|
-
}
|
|
460
|
-
}
|
|
461
|
-
export class Grouping {
|
|
462
|
-
group;
|
|
463
|
-
constructor(group) {
|
|
464
|
-
this.group = group;
|
|
465
|
-
}
|
|
466
|
-
get [Symbol.toStringTag]() {
|
|
467
|
-
return 'Grouping';
|
|
468
|
-
}
|
|
469
|
-
toJson() {
|
|
470
|
-
return {
|
|
471
|
-
$type: Types.rawType(this),
|
|
472
|
-
group: this.group.toJson(),
|
|
473
|
-
};
|
|
474
|
-
}
|
|
475
|
-
static fromJson(json) {
|
|
476
|
-
return new Grouping(json['group'].map((v) => RenderableFactory(v)));
|
|
477
|
-
}
|
|
478
|
-
render({ aliases, escape, prefix, parser, options, }) {
|
|
479
|
-
return `(${render(this.group, {
|
|
480
|
-
aliases,
|
|
481
|
-
escape,
|
|
482
|
-
prefix,
|
|
483
|
-
parser,
|
|
484
|
-
options,
|
|
485
|
-
})})`;
|
|
486
|
-
}
|
|
487
|
-
clone() {
|
|
488
|
-
return new Grouping(Objects.clone(this.group));
|
|
489
|
-
}
|
|
490
|
-
resolve(parser) {
|
|
491
|
-
return parser;
|
|
492
|
-
}
|
|
493
|
-
}
|
|
494
|
-
export class GroupingOperators {
|
|
495
|
-
group(value) {
|
|
496
|
-
return new Grouping(value);
|
|
497
|
-
}
|
|
498
|
-
rollup(...values) {
|
|
499
|
-
return new Function('rollup', values, 'none');
|
|
500
|
-
}
|
|
501
|
-
}
|
|
502
|
-
export class Aggregate {
|
|
503
|
-
value;
|
|
504
|
-
method;
|
|
505
|
-
alias;
|
|
506
|
-
constructor(value, method, alias) {
|
|
507
|
-
this.value = value;
|
|
508
|
-
this.method = method;
|
|
509
|
-
this.alias = alias;
|
|
510
|
-
}
|
|
511
|
-
get [Symbol.toStringTag]() {
|
|
512
|
-
return 'Aggregate';
|
|
513
|
-
}
|
|
514
|
-
toJson() {
|
|
515
|
-
return {
|
|
516
|
-
$type: Types.rawType(this),
|
|
517
|
-
value: this.value.toJson(),
|
|
518
|
-
method: this.method,
|
|
519
|
-
alias: this.alias,
|
|
520
|
-
};
|
|
521
|
-
}
|
|
522
|
-
static fromJson(json) {
|
|
523
|
-
return new Aggregate(RenderableFactory(json['value']), json['method'], json['alias']);
|
|
524
|
-
}
|
|
525
|
-
render({ aliases, escape, prefix, parser, options, }) {
|
|
526
|
-
return `aggregate(${render(this.value, {
|
|
527
|
-
aliases,
|
|
528
|
-
escape,
|
|
529
|
-
prefix,
|
|
530
|
-
parser,
|
|
531
|
-
options,
|
|
532
|
-
})} with ${this.method} as ${this.alias})`;
|
|
533
|
-
}
|
|
534
|
-
clone() {
|
|
535
|
-
return new Aggregate(Objects.clone(this.value), this.method, this.alias);
|
|
536
|
-
}
|
|
537
|
-
resolve(parser) {
|
|
538
|
-
return parser;
|
|
539
|
-
}
|
|
540
|
-
}
|
|
541
|
-
export class GroupBy {
|
|
542
|
-
properties;
|
|
543
|
-
transformations;
|
|
544
|
-
constructor(properties, transformations) {
|
|
545
|
-
this.properties = properties;
|
|
546
|
-
this.transformations = transformations;
|
|
547
|
-
}
|
|
548
|
-
get [Symbol.toStringTag]() {
|
|
549
|
-
return 'GroupBy';
|
|
550
|
-
}
|
|
551
|
-
toJson() {
|
|
552
|
-
return {
|
|
553
|
-
$type: Types.rawType(this),
|
|
554
|
-
properties: this.properties.map((p) => p.toJson()),
|
|
555
|
-
transformations: this.transformations?.toJson(),
|
|
556
|
-
};
|
|
557
|
-
}
|
|
558
|
-
static fromJson(json) {
|
|
559
|
-
return new GroupBy(json['properties'].map((p) => RenderableFactory(p)), RenderableFactory(json['transformations']));
|
|
560
|
-
}
|
|
561
|
-
render({ aliases, escape, prefix, parser, options, }) {
|
|
562
|
-
const properties = this.properties
|
|
563
|
-
.map((p) => render(p, {
|
|
564
|
-
aliases,
|
|
565
|
-
escape,
|
|
566
|
-
prefix,
|
|
567
|
-
parser,
|
|
568
|
-
options,
|
|
569
|
-
}))
|
|
570
|
-
.join(',');
|
|
571
|
-
const transformations = this.transformations
|
|
572
|
-
? ', ' +
|
|
573
|
-
render(this.transformations, {
|
|
574
|
-
aliases,
|
|
575
|
-
escape,
|
|
576
|
-
prefix,
|
|
577
|
-
parser,
|
|
578
|
-
options,
|
|
579
|
-
})
|
|
580
|
-
: '';
|
|
581
|
-
return `groupby((${properties})${transformations})`;
|
|
582
|
-
}
|
|
583
|
-
clone() {
|
|
584
|
-
return new GroupBy(Objects.clone(this.properties), Objects.clone(this.transformations));
|
|
585
|
-
}
|
|
586
|
-
resolve(parser) {
|
|
587
|
-
return parser;
|
|
588
|
-
}
|
|
589
|
-
}
|
|
590
|
-
export class Transformations {
|
|
591
|
-
aggregate(value, method, alias) {
|
|
592
|
-
return new Aggregate(value, method, alias);
|
|
593
|
-
}
|
|
594
|
-
groupby(properties, options) {
|
|
595
|
-
return new GroupBy(properties, options);
|
|
596
|
-
}
|
|
597
|
-
topCount(value, field, normalize = 'none') {
|
|
598
|
-
return new Function('topcount', [value, field], normalize);
|
|
599
|
-
}
|
|
600
|
-
topSum(value, field, normalize = 'none') {
|
|
601
|
-
return new Function('topsum', [value, field], normalize);
|
|
602
|
-
}
|
|
603
|
-
topPercent(value, field, normalize = 'none') {
|
|
604
|
-
return new Function('toppercent', [value, field], normalize);
|
|
605
|
-
}
|
|
606
|
-
bottomCount(value, field, normalize = 'none') {
|
|
607
|
-
return new Function('bottomcount', [value, field], normalize);
|
|
608
|
-
}
|
|
609
|
-
bottomSum(value, field, normalize = 'none') {
|
|
610
|
-
return new Function('bottomsum', [value, field], normalize);
|
|
611
|
-
}
|
|
612
|
-
bottomPercent(value, field, normalize = 'none') {
|
|
613
|
-
return new Function('bottompercent', [value, field], normalize);
|
|
614
|
-
}
|
|
615
|
-
identity() {
|
|
616
|
-
return new Function('identity', [], 'none');
|
|
617
|
-
}
|
|
618
|
-
search(value, normalize = 'none') {
|
|
619
|
-
return new Function('search', [value], normalize);
|
|
620
|
-
}
|
|
621
|
-
filter(value, normalize = 'none') {
|
|
622
|
-
return new Function('filter', [value], normalize);
|
|
623
|
-
}
|
|
624
|
-
skip(value, normalize = 'none') {
|
|
625
|
-
return new Function('top', [value], normalize);
|
|
626
|
-
}
|
|
627
|
-
top(value, normalize = 'none') {
|
|
628
|
-
return new Function('top', [value], normalize);
|
|
629
|
-
}
|
|
630
|
-
orderby(value, normalize = 'none') {
|
|
631
|
-
return new Function('filter', [value], normalize);
|
|
632
|
-
}
|
|
633
|
-
}
|
|
634
|
-
export class Type {
|
|
635
|
-
name;
|
|
636
|
-
type;
|
|
637
|
-
value;
|
|
638
|
-
constructor(name, type, value) {
|
|
639
|
-
this.name = name;
|
|
640
|
-
this.type = type;
|
|
641
|
-
this.value = value;
|
|
642
|
-
}
|
|
643
|
-
get [Symbol.toStringTag]() {
|
|
644
|
-
return 'Type';
|
|
645
|
-
}
|
|
646
|
-
toJson() {
|
|
647
|
-
return {
|
|
648
|
-
$type: Types.rawType(this),
|
|
649
|
-
name: this.name,
|
|
650
|
-
type: this.type,
|
|
651
|
-
value: this.value,
|
|
652
|
-
};
|
|
653
|
-
}
|
|
654
|
-
static fromJson(json) {
|
|
655
|
-
return new Type(json['name'], json['type'], RenderableFactory(json['value']));
|
|
656
|
-
}
|
|
657
|
-
render({ aliases, escape, prefix, parser, options, }) {
|
|
658
|
-
let value;
|
|
659
|
-
if (this.value) {
|
|
660
|
-
parser = resolve([this.value], parser);
|
|
661
|
-
let [left, right] = encode([this.value], parser, options);
|
|
662
|
-
value = render(left, { aliases, escape, prefix, parser, options });
|
|
663
|
-
}
|
|
664
|
-
return value
|
|
665
|
-
? `${this.name}(${value}, '${this.type}')`
|
|
666
|
-
: `${this.name}('${this.type}')`;
|
|
667
|
-
}
|
|
668
|
-
clone() {
|
|
669
|
-
return new Type(this.name, this.type, Objects.clone(this.value));
|
|
670
|
-
}
|
|
671
|
-
resolve(parser) {
|
|
672
|
-
parser =
|
|
673
|
-
parser instanceof ODataStructuredTypeFieldParser &&
|
|
674
|
-
parser.isStructuredType()
|
|
675
|
-
? parser.structuredType()
|
|
676
|
-
: parser;
|
|
677
|
-
return parser?.findChildParser((p) => p.isTypeOf(this.type));
|
|
678
|
-
}
|
|
679
|
-
}
|
|
680
|
-
export class Lambda {
|
|
681
|
-
op;
|
|
682
|
-
values;
|
|
683
|
-
alias;
|
|
684
|
-
constructor(op, values, alias) {
|
|
685
|
-
this.op = op;
|
|
686
|
-
this.values = values;
|
|
687
|
-
this.alias = alias;
|
|
688
|
-
}
|
|
689
|
-
get [Symbol.toStringTag]() {
|
|
690
|
-
return 'Lambda';
|
|
691
|
-
}
|
|
692
|
-
toJson() {
|
|
693
|
-
return {
|
|
694
|
-
$type: Types.rawType(this),
|
|
695
|
-
op: this.op,
|
|
696
|
-
values: this.values.map((v) => Types.isObject(v) && 'toJson' in v ? v.toJson() : v),
|
|
697
|
-
alias: this.alias,
|
|
698
|
-
};
|
|
699
|
-
}
|
|
700
|
-
static fromJson(json) {
|
|
701
|
-
return new Lambda(json['op'], json['values'].map((v) => RenderableFactory(v)), json['alias']);
|
|
702
|
-
}
|
|
703
|
-
render({ aliases, escape, prefix, parser, options, }) {
|
|
704
|
-
parser = resolve(this.values, parser);
|
|
705
|
-
let [left, right] = encode(this.values, parser, options);
|
|
706
|
-
left = render(left, { aliases, escape, prefix, parser });
|
|
707
|
-
if (right) {
|
|
708
|
-
let alias = this.alias || left.split('/').pop().toLowerCase()[0];
|
|
709
|
-
return `${left}/${this.op}(${alias}:${render(right, {
|
|
710
|
-
aliases,
|
|
711
|
-
escape,
|
|
712
|
-
prefix: alias,
|
|
713
|
-
options,
|
|
714
|
-
parser,
|
|
715
|
-
})})`;
|
|
716
|
-
}
|
|
717
|
-
else {
|
|
718
|
-
return `${left}/${this.op}()`;
|
|
719
|
-
}
|
|
720
|
-
}
|
|
721
|
-
clone() {
|
|
722
|
-
return new Lambda(this.op, this.values.map((v) => Objects.clone(v)), this.alias);
|
|
723
|
-
}
|
|
724
|
-
resolve(parser) {
|
|
725
|
-
return parser;
|
|
726
|
-
}
|
|
727
|
-
}
|
|
728
|
-
export class LambdaOperators {
|
|
729
|
-
any(left, right, alias) {
|
|
730
|
-
return new Lambda('any', [left, right], alias);
|
|
731
|
-
}
|
|
732
|
-
all(left, right, alias) {
|
|
733
|
-
return new Lambda('all', [left, right], alias);
|
|
734
|
-
}
|
|
735
|
-
}
|
|
736
|
-
export class ODataOperators {
|
|
737
|
-
}
|
|
738
|
-
applyMixins(ODataOperators, [
|
|
739
|
-
LogicalOperators,
|
|
740
|
-
ArithmeticOperators,
|
|
741
|
-
GroupingOperators,
|
|
742
|
-
LambdaOperators,
|
|
743
|
-
]);
|
|
744
|
-
export const operators = new ODataOperators();
|
|
745
|
-
export class ODataFunctions {
|
|
746
|
-
}
|
|
747
|
-
applyMixins(ODataFunctions, [
|
|
748
|
-
StringAndCollectionFunctions,
|
|
749
|
-
CollectionFunctions,
|
|
750
|
-
StringFunctions,
|
|
751
|
-
DateAndTimeFunctions,
|
|
752
|
-
ArithmeticFunctions,
|
|
753
|
-
TypeFunctions,
|
|
754
|
-
GeoFunctions,
|
|
755
|
-
ConditionalFunctions,
|
|
756
|
-
]);
|
|
757
|
-
export const functions = new ODataFunctions();
|
|
758
|
-
export class ODataTransformations {
|
|
759
|
-
}
|
|
760
|
-
applyMixins(ODataTransformations, [Transformations]);
|
|
761
|
-
export const transformations = new ODataTransformations();
|
|
762
|
-
export class ODataSyntax {
|
|
763
|
-
}
|
|
764
|
-
applyMixins(ODataSyntax, [
|
|
765
|
-
ODataOperators,
|
|
766
|
-
ODataFunctions,
|
|
767
|
-
ODataTransformations,
|
|
768
|
-
]);
|
|
769
|
-
export const syntax = new ODataSyntax();
|
|
770
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3ludGF4LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1vZGF0YS9zcmMvbGliL3Jlc291cmNlcy9xdWVyeS9leHByZXNzaW9ucy9zeW50YXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFakUsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVoRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxlQUFlLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDbEUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQzlDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDMUMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUM1QyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDOUMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQXVCNUMsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLENBQzFCLFFBQWlDLEVBQUUsRUFDOUIsRUFBRSxDQUNQLElBQUksS0FBSyxDQUFDLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBTyxFQUFFO0lBQ2hDLEdBQUcsQ0FBQyxNQUFTLEVBQUUsR0FBb0I7UUFDakMsSUFBSSxLQUFLLEdBQUksTUFBYyxDQUFDLFFBQVEsQ0FBNEIsQ0FBQztRQUNqRSxJQUFJLEdBQUcsS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUNyQixPQUFP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Q2YsQ0FBQztJQUNKLENBQUM7SUFDRCxPQUFPLENBQUMsTUFBVztRQUNqQixPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0NBQ0Y7QUFFRCxNQUFNLE9BQU8sZ0JBQWdCO0lBQzNCLEVBQUUsQ0FBQyxJQUFTLEVBQUUsS0FBVSxFQUFFLFlBQXVCLE9BQU87UUFDdEQsT0FBTyxJQUFJLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUNELEVBQUUsQ0FBQyxJQUFTLEVBQUUsS0FBVSxFQUFFLFlBQXVCLE9BQU87UUFDdEQsT0FBTyxJQUFJLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUNELEVBQUUsQ0FBQyxJQUFTLEVBQUUsS0FBVSxFQUFFLFlBQXVCLE9BQU87UUFDdEQsT0FBTyxJQUFJLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUNELEVBQUUsQ0FBQyxJQUFTLEVBQUUsS0FBVSxFQUFFLFlBQXVCLE9BQU87UUFDdEQsT0FBTyxJQUFJLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUNELEVBQUUsQ0FBQyxJQUFTLEVBQUUsS0FBVSxFQUFFLFlBQXVCLE9BQU87UUFDdEQsT0FBTyxJQUFJLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUNELEVBQUUsQ0FBQyxJQUFTLEVBQUUsS0FBVSxFQUFFLFlBQXVCLE9BQU87UUFDdEQsT0FBTyxJQUFJLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEVBQUUs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QUFDO0NBQ0Y7QUFFRCxNQUFNLE9BQU8sY0FBYztDQUFNO0FBT2pDLFdBQVcsQ0FBQyxjQUFjLEVBQUU7SUFDMUIsZ0JBQWdCO0lBQ2hCLG1CQUFtQjtJQUNuQixpQkFBaUI7SUFDakIsZUFBZTtDQUNoQixDQUFDLENBQUM7QUFDSCxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQXdCLElBQUksY0FBYyxFQUFPLENBQUM7QUFFeEUsTUFBTSxPQUFPLGNBQWM7Q0FBTTtBQVdqQyxXQUFXLENBQUMsY0FBYyxFQUFFO0lBQzFCLDRCQUE0QjtJQUM1QixtQkFBbUI7SUFDbkIsZUFBZTtJQUNmLG9CQUFvQjtJQUNwQixtQkFBbUI7SUFDbkIsYUFBYTtJQUNiLFlBQVk7SUFDWixvQkFBb0I7Q0FDckIsQ0FBQyxDQUFDO0FBQ0gsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUF3QixJQUFJLGNBQWMsRUFBTyxDQUFDO0FBRXhFLE1BQU0sT0FBTyxvQkFBb0I7Q0FBTTtBQUd2QyxXQUFXLENBQUMsb0JBQW9CLEVBQUUsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDO0FBQ3JELE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FDMUIsSUFBSSxvQkFBb0IsRUFBTyxDQUFDO0FBRWxDLE1BQU0sT0FBTyxXQUFXO0NBQU07QUFLOUIsV0FBVyxDQUFDLFdBQVcsRUFBRTtJQUN2QixjQUFjO0lBQ2QsY0FBYztJQUNkLG9CQUFvQjtDQUNyQixDQUFDLENBQUM7QUFFSCxNQUFNLENBQUMsTUFBTSxNQUFNLEdBQXFCLElBQUksV0FBVyxFQUFPLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPRGF0YVN0cnVjdHVyZWRUeXBlRmllbGRQYXJzZXIgfSBmcm9tICcuLi8uLi8uLi9zY2hlbWEnO1xuaW1wb3J0IHsgUGFyc2VyLCBQYXJzZXJPcHRpb25zIH0gZnJvbSAnLi4vLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHsgT2JqZWN0cywgVHlwZXMgfSBmcm9tICcuLi8uLi8uLi91dGlscyc7XG5pbXBvcnQgeyBRdWVyeUN1c3RvbVR5cGUgfSBmcm9tICcuLi9idWlsZGVyJztcbmltcG9ydCB7IG5vcm1hbGl6ZVZhbHVlIH0gZnJvbSAnLi4vYnVpbGRlcic7XG5pbXBvcnQgeyBBcHBseUV4cHJlc3Npb24sIEdyb3VwQnlUcmFuc2Zvcm1hdGlvbnMgfSBmcm9tICcuL2FwcGx5JztcbmltcG9ydCB7IENvbXB1dGVFeHByZXNzaW9uIH0gZnJvbSAnLi9jb21wdXRlJztcbmltcG9ydCB7IENvdW50RXhwcmVzc2lvbiB9IGZyb20gJy4vY291bnQnO1xuaW1wb3J0IHsgRXhwYW5kRXhwcmVzc2lvbiB9IGZyb20gJy4vZXhwYW5kJztcbmltcG9ydCB7IEZpbHRlckV4cHJlc3Npb24gfSBmcm9tICcuL2ZpbHRlcic7XG5pbXBvcnQgeyBPcmRlckJ5RXhwcmVzc2lvbiB9IGZyb20gJy4vb3JkZXJieSc7XG5pbXBvcnQgeyBTZWFyY2hFeHByZXNzaW9uIH0gZnJvbSAnLi9zZWFyY2gnO1xuaW1wb3J0IHsgU2VsZWN0RXhwcmVzc2lvbiB9IGZyb20gJy4vc2VsZWN0JztcblxuZXhwb3J0IHR5cGUgTm9ybWFsaXplID0gJ2FsbCcgfCAncmlnaHQnIHwgJ2xlZnQnIHwgJ25vbmUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFJlbmRlcmFibGUge1xuICByZW5kZXIoe1xuICAgIGFsaWFzZXMsXG4gICAgZXNjYXBlLFxuICAgIHByZWZpeCxcbiAgICBwYXJzZXIsXG4gICAgb3B0aW9ucyxcbiAgfToge1xuICAgIGFsaWFzZXM/OiBRdWVyeUN1c3RvbVR5cGVbXTtcbiAgICBlc2NhcGU/OiBib29sZWFuO1xuICAgIHByZWZpeD86IHN0cmluZztcbiAgICBwYXJzZXI/OiBQYXJzZXI8YW55PjtcbiAgICBvcHRpb25zPzogUGFyc2VyT3B0aW9ucztcbiAgfSk6IHN0cmluZztcbiAgdG9Kc29uKCk6IGFueTtcbiAgY2xvbmUoKTogYW55O1xuICByZXNvbHZlKHBhcnNlcjogYW55KTogYW55O1xufVxuXG5leHBvcnQgY29uc3QgRmllbGRGYWN0b3J5ID0gPFQgZXh0ZW5kcyBvYmplY3Q+KFxuICBuYW1lczogKHN0cmluZyB8IFJlbmRlcmFibGUpW10gPSBbXSxcbik6IGFueSA9PlxuICBuZXcgUHJveHkoeyBfbmFtZXM6IG5hbWVzIH0gYXMgVCwge1xuICAgIGdldCh0YXJnZXQ6IFQsIGtleTogc3RyaW5nIHwgc3ltYm9sKSB7XG4gICAgICBsZXQgbmFtZXMgPSAodGFyZ2V0IGFzIGFueSlbJ19uYW1lcyddIGFzIChzdHJpbmcgfCBSZW5kZXJhYmxlKVtdO1xuICAgICAgaWYgKGtleSA9PT0gJ3JlbmRlcicpIHtcbiAgICAgICAgcmV0dXJuICh7XG4gICAgICAgICAgYWxpYXNlcyxcbiAgICAgICAgICBlc2NhcGUsXG4gICAgICAgICAgcHJlZml4LFxuICAgICAgICAgIHBhcnNlcixcbiAgICAgICAgICBvcHRpb25zLFxuICAgICAgICB9OiB7XG4gICAgICAgICAgYWxpYXNlcz86IFF1ZXJ5Q3VzdG9tVHlwZVtdO1xuICAgICAgICAgIGVzY2FwZT86IGJvb2xlYW47XG4gICAgICAgICAgcHJlZml4Pzogc3RyaW5nO1xuICAgICAgICAgIHBhcnNlcj86IFBhcnNlcjxUPjtcbiAgICAgICAgICBvcHRpb25zPzogUGFyc2VyT3B0aW9ucztcbiAgICAgICAgfSkgPT4ge1xuICAgICAgICAgIGxldCB2YWx1ZXMgPSBuYW1lcy5tYXAoKG46IGFueSkgPT5cbiAgICAgICAgICAgIHJlbmRlcihuLCB7IGFsaWFzZXMsIGVzY2FwZSwgcHJlZml4LCBwYXJzZXIsIG9wdGlvbnMgfSksXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAocHJlZml4ICYmIChuYW1lcy5sZW5ndGggPT09IDAgfHwgdHlwZW9mIG5hbWVzWzBdID09PSAnc3RyaW5nJykpIHtcbiAgICAgICAgICAgIHZhbHVlcyA9IFtwcmVmaXgsIC4uLnZhbHVlc107XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB2YWx1ZXMuam9pbignLycpO1xuICAgICAgICB9O1xuICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICdjbG9uZScpIHtcbiAgICAgICAgcmV0dXJuICgpID0+IEZpZWxkRmFjdG9yeShbLi4ubmFtZXNdKTtcbiAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAnaXNGaWVsZCcpIHtcbiAgICAgICAgcmV0dXJuICgpID0+IHRydWU7XG4gICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ3RvSnNvbicpIHtcbiAgICAgICAgcmV0dXJuICgpID0+ICh7XG4gICAgICAgICAgJHR5cGU6ICdGaWVsZCcsXG4gICAgICAgICAgbmFtZXM6IG5hbWVzLFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAncmVzb2x2ZScpIHtcbiAgICAgICAgcmV0dXJuIChwYXJzZXI6IGFueSkgPT5cbiAgICAgICAgICBuYW1lcy5yZWR1Y2UoXG4gICAgICAgICAgICAoYWNjOiBhbnksIG5hbWU6IHN0cmluZyB8IFJlbmRlcmFibGUpID0+XG4gICAgICAgICAgICAgIHR5cGVvZiBuYW1lID09PSAnc3RyaW5nJ1xuICAgICAgICAgICAgICAgID8gYWNjPy5maWVsZChuYW1lKVxuICAgICAgICAgICAgICAgIDogbmFtZT8ucmVzb2x2ZShwYXJzZXIpLFxuICAgICAgICAgICAgcGFyc2VyLFxuICAgICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gRmllbGRGYWN0b3J5KFsuLi5uYW1lcywga2V5IGFzIHN0cmluZ10pO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBoYXModGFyZ2V0OiBULCBrZXk6IHN0cmluZyk6IGFueSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBbJ3RvSnNvbicsICdpc0ZpZWxkJywgJ2Nsb25lJywgJ3JlbmRlcicsICdyZXNvbHZlJ10uaW5jbHVkZXMoa2V5KSB8fFxuICAgICAgICBrZXkgaW4gdGFyZ2V0XG4gICAgICApO1xuICAgIH0sXG4gIH0pO1xuXG5leHBvcnQgY29uc3QgUmVuZGVyYWJsZUZhY3RvcnkgPSAodmFsdWU6IGFueSk6IFJlbmRlcmFibGUgPT4ge1xuICBpZiAoVHlwZXMuaXNQbGFpbk9iamVjdCh2YWx1ZSkgJiYgJyR0eXBlJyBpbiB2YWx1ZSkge1xuICAgIHN3aXRjaCAodmFsdWUuJHR5cGUpIHtcbiAgICAgIGNhc2UgJ1NlbGVjdEV4cHJlc3Npb24nOlxuICAgICAgICByZXR1cm4gU2VsZWN0RXhwcmVzc2lvbi5mcm9tSnNvbih2YWx1ZSk7XG4gICAgICBjYXNlICdFeHBhbmRFeHByZXNzaW9uJzpcbiAgICAgICAgcmV0dXJuIEV4cGFuZEV4cHJlc3Npb24uZnJvbUpzb24odmFsdWUpO1xuICAgICAgY2FzZSAnQ29tcHV0ZUV4cHJlc3Npb24nOlxuICAgICAgICByZXR1cm4gQ29tcHV0ZUV4cHJlc3Npb24uZnJvbUpzb24odmFsdWUpO1xuICAgICAgY2FzZSAnQXBwbHlFeHByZXNzaW9uJzpcbiAgICAgICAgcmV0dXJuIEFwcGx5RXhwcmVzc2lvbi5mcm9tSnNvbih2YWx1ZSk7XG4gICAgICBjYXNlICdGaWx0ZXJFeHByZXNzaW9uJzpcbiAgICAgICAgcmV0dXJuIEZpbHRlckV4cHJlc3Npb24uZnJvbUpzb24odmFsdWUpO1xuICAgICAgY2FzZSAnT3JkZXJCeUV4cHJlc3Npb24nOlxuICAgICAgICByZXR1cm4gT3JkZXJCeUV4cHJlc3Npb24uZnJvbUpzb24odmFsdWUpO1xuICAgICAgY2FzZSAnU2VhcmNoRXhwcmVzc2lvbic6XG4gICAgICAgIHJldHVybiBTZWFyY2hFeHByZXNzaW9uLmZyb21Kc29uKHZhbHVlKTtcbiAgICAgIGNhc2UgJ0NvdW50RXhwcmVzc2lvbic6XG4gICAgICAgIHJldHVybiBDb3VudEV4cHJlc3Npb24uZnJvbUpzb24odmFsdWUpO1xuICAgICAgY2FzZSAnR3JvdXBCeVRyYW5zZm9ybWF0aW9ucyc6XG4gICAgICAgIHJldHVybiBHcm91cEJ5VHJhbnNmb3JtYXRpb25zLmZyb21Kc29uKHZhbHVlKTtcbiAgICAgIGNhc2UgJ0Z1bmN0aW9uJzpcbiAgICAgICAgcmV0dXJuIEZ1bmN0aW9uLmZyb21Kc29uKHZhbHVlKTtcbiAgICAgIGNhc2UgJ09wZXJhdG9yJzpcbiAgICAgICAgcmV0dXJuIE9wZXJhdG9yLmZyb21Kc29uKHZhbHVlKTtcbiAgICAgIGNhc2UgJ0dyb3VwaW5nJzpcbiAgICAgICAgcmV0dXJuIEdyb3VwaW5nLmZyb21Kc29uKHZhbHVlKTtcbiAgICAgIGNhc2UgJ0FnZ3JlZ2F0ZSc6XG4gICAgICAgIHJldHVybiBBZ2dyZWdhdGUuZnJvbUpzb24odmFsdWUpO1xuICAgICAgY2FzZSAnR3JvdXBCeSc6XG4gICAgICAgIHJldHVybiBHcm91cEJ5LmZyb21Kc29uKHZhbHVlKTtcbiAgICAgIGNhc2UgJ0xhbWJkYSc6XG4gICAgICAgIHJldHVybiBMYW1iZGEuZnJvbUpzb24odmFsdWUpO1xuICAgICAgY2FzZSAnVHlwZSc6XG4gICAgICAgIHJldHVybiBUeXBlLmZyb21Kc29uKHZhbHVlKTtcbiAgICAgIGNhc2UgJ0ZpZWxkJzpcbiAgICAgICAgcmV0dXJuIEZpZWxkRmFjdG9yeSh2YWx1ZVsnbmFtZXMnXSk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICB9XG4gIHJldHVybiB2YWx1ZTtcbn07XG5cbmZ1bmN0aW9uIGFwcGx5TWl4aW5zKGRlcml2ZWRDdG9yOiBhbnksIGNvbnN0cnVjdG9yczogYW55W10pIHtcbiAgY29uc3RydWN0b3JzLmZvckVhY2goKGJhc2VDdG9yKSA9PiB7XG4gICAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoYmFzZUN0b3IucHJvdG90eXBlKS5mb3JFYWNoKChuYW1lKSA9PiB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoXG4gICAgICAgIGRlcml2ZWRDdG9yLnByb3RvdHlwZSxcbiAgICAgICAgbmFtZSxcbiAgICAgICAgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihiYXNlQ3Rvci5wcm90b3R5cGUsIG5hbWUpIHx8XG4gICAgICAgICAgT2JqZWN0LmNyZWF0ZShudWxsKSxcbiAgICAgICk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyKFxuICB2YWx1ZTogYW55LFxuICB7XG4gICAgYWxpYXNlcyxcbiAgICBub3JtYWxpemUsXG4gICAgZXNjYXBlLFxuICAgIHByZWZpeCxcbiAgICBwYXJzZXIsXG4gICAgb3B0aW9ucyxcbiAgfToge1xuICAgIGFsaWFzZXM/OiBRdWVyeUN1c3RvbVR5cGVbXTtcbiAgICBub3JtYWxpemU/OiBib29sZWFuO1xuICAgIGVzY2FwZT86IGJvb2xlYW47XG4gICAgcHJlZml4Pzogc3RyaW5nO1xuICAgIHBhcnNlcj86IFBhcnNlcjxhbnk+O1xuICAgIG9wdGlvbnM/OiBQYXJzZXJPcHRpb25zO1xuICB9ID0ge30sXG4pOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgbnVsbCB7XG4gIGlmIChUeXBlcy5pc0Z1bmN0aW9uKHZhbHVlKSkge1xuICAgIHJldHVybiByZW5kZXIodmFsdWUoc3ludGF4KSwge1xuICAgICAgYWxpYXNlcyxcbiAgICAgIG5vcm1hbGl6ZSxcbiAgICAgIHByZWZpeCxcbiAgICAgIHBhcnNlcixcbiAgICAgIG9wdGlvbnMsXG4gICAgfSk7XG4gIH1cbiAgaWYgKFR5cGVzLmlzT2JqZWN0KHZhbHVlKSAmJiAncmVuZGVyJyBpbiB2YWx1ZSkge1xuICAgIHJldHVybiByZW5kZXIodmFsdWUucmVuZGVyKHsgYWxpYXNlcywgZXNjYXBlLCBwcmVmaXgsIHBhcnNlciwgb3B0aW9ucyB9KSwge1xuICAgICAgYWxpYXNlcyxcbiAgICAgIG5vcm1hbGl6ZSxcbiAgICAgIGVzY2FwZSxcbiAgICAgIHByZWZpeCxcbiAgICAgIHBhcnNlcixcbiAgICAgIG9wdGlvbnMsXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIG5vcm1hbGl6ZSA/IG5vcm1hbGl6ZVZhbHVlKHZhbHVlLCB7IGFsaWFzZXMsIGVzY2FwZSB9KSA6IHZhbHVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZSh2YWx1ZXM6IGFueSwgcGFyc2VyPzogUGFyc2VyPGFueT4pIHtcbiAgaWYgKHBhcnNlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgbGV0IGZpZWxkcyA9IHZhbHVlcy5maWx0ZXIoXG4gICAgICAodjogYW55KSA9PiBUeXBlcy5pc09iamVjdCh2KSAmJiAnaXNGaWVsZCcgaW4gdiAmJiB2LmlzRmllbGQoKSxcbiAgICApO1xuICAgIGlmIChmaWVsZHMubGVuZ3RoID09PSAxICYmIFR5cGVzLmlzT2JqZWN0KHBhcnNlcikgJiYgJ2ZpZWxkJyBpbiBwYXJzZXIpIHtcbiAgICAgIHJldHVybiBmaWVsZHNbMF0ucmVzb2x2ZShwYXJzZXIpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcGFyc2VyO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZW5jb2RlKFxuICB2YWx1ZXM6IGFueSxcbiAgcGFyc2VyPzogUGFyc2VyPGFueT4sXG4gIG9wdGlvbnM/OiBQYXJzZXJPcHRpb25zLFxuKSB7XG4gIGlmIChwYXJzZXIgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB2YWx1ZXMubWFwKCh2OiBhbnkpID0+IHtcbiAgICAgIGlmIChUeXBlcy5pc0FycmF5KHYpKSByZXR1cm4gZW5jb2RlKHYsIHBhcnNlciwgb3B0aW9ucyk7XG4gICAgICBpZiAoVHlwZXMuaXNPYmplY3QodikgfHwgdiA9PSBudWxsKSByZXR1cm4gdjtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBwYXJzZXIuZW5jb2RlKHYsIG9wdGlvbnMpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiB2O1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIHJldHVybiB2YWx1ZXM7XG59XG5cbmV4cG9ydCBjbGFzcyBGdW5jdGlvbjxUPiBpbXBsZW1lbnRzIFJlbmRlcmFibGUge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgbmFtZTogc3RyaW5nLFxuICAgIHByb3RlY3RlZCB2YWx1ZXM6IGFueVtdLFxuICAgIHByb3RlY3RlZCBub3JtYWxpemU6IE5vcm1hbGl6ZSxcbiAgICBwcm90ZWN0ZWQgZXNjYXBlOiBib29sZWFuID0gZmFsc2UsXG4gICkge31cblxuICBnZXQgW1N5bWJvbC50b1N0cmluZ1RhZ10oKSB7XG4gICAgcmV0dXJuICdGdW5jdGlvbic7XG4gIH1cblxuICB0b0pzb24oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICR0eXBlOiBUeXBlcy5yYXdUeXBlKHRoaXMpLFxuICAgICAgbmFtZTogdGhpcy5uYW1lLFxuICAgICAgdmFsdWVzOiB0aGlzLnZhbHVlcy5tYXAoKHYpID0+XG4gICAgICAgIFR5cGVzLmlzT2JqZWN0KHYpICYmICd0b0pzb24nIGluIHYgPyB2LnRvSnNvbigpIDogdixcbiAgICAgICksXG4gICAgICBub3JtYWxpemU6IHRoaXMubm9ybWFsaXplLFxuICAgIH07XG4gIH1cblxuICBzdGF0aWMgZnJvbUpzb248VD4oanNvbjogeyBbbmFtZTogc3RyaW5nXTogYW55IH0pOiBGdW5jdGlvbjxUPiB7XG4gICAgcmV0dXJuIG5ldyBGdW5jdGlvbjxUPihcbiAgICAgIGpzb25bJ25hbWUnXSxcbiAgICAgIGpzb25bJ3ZhbHVlcyddLm1hcCgodjogYW55KSA9PiBSZW5kZXJhYmxlRmFjdG9yeSh2KSksXG4gICAgICBqc29uWydub3JtYWxpemUnXSxcbiAgICAgIGpzb25bJ2VzY2FwZSddLFxuICAgICk7XG4gIH1cblxuICByZW5kZXIoe1xuICAgIGFsaWFzZXMsXG4gICAgZXNjYXBlLFxuICAgIHByZWZpeCxcbiAgICBwYXJzZXIsXG4gICAgb3B0aW9ucyxcbiAgfToge1xuICAgIGFsaWFzZXM/OiBRdWVyeUN1c3RvbVR5cGVbXTtcbiAgICBlc2NhcGU/OiBib29sZWFuO1xuICAgIHByZWZpeD86IHN0cmluZztcbiAgICBwYXJzZXI/OiBQYXJzZXI8VD47XG4gICAgb3B0aW9ucz86IFBhcnNlck9wdGlvbnM7XG4gIH0pOiBzdHJpbmcge1xuICAgIHBhcnNlciA9IHJlc29sdmUodGhpcy52YWx1ZXMsIHBhcnNlcik7XG4gICAgbGV0IFtsZWZ0LCAuLi52YWx1ZXNdID0gZW5jb2RlKHRoaXMudmFsdWVzLCBwYXJzZXIsIG9wdGlvbnMpO1xuXG4gICAgbGVmdCA9IHJlbmRlcihsZWZ0LCB7XG4gICAgICBhbGlhc2VzLFxuICAgICAgZXNjYXBlLFxuICAgICAgcHJlZml4LFxuICAgICAgcGFyc2VyLFxuICAgICAgbm9ybWFsaXplOiB0aGlzLm5vcm1hbGl6ZSA9PT0gJ2FsbCcgfHwgdGhpcy5ub3JtYWxpemUgPT09ICdsZWZ0JyxcbiAgICAgIG9wdGlvbnMsXG4gICAgfSk7XG4gICAgY29uc3QgcGFyYW1zID0gW1xuICAgICAgbGVmdCxcbiAgICAgIC4uLnZhbHVlcy5tYXAoKHY6IGFueSkgPT5cbiAgICAgICAgcmVuZGVyKHYsIHtcbiAgICAgICAgICBhbGlhc2VzLFxuICAgICAgICAgIGVzY2FwZSxcbiAgICAgICAgICBwcmVmaXgsXG4gICAgICAgICAgcGFyc2VyLFxuICAgICAgICAgIG5vcm1hbGl6ZTogdGhpcy5ub3JtYWxpemUgPT09ICdhbGwnIHx8IHRoaXMubm9ybWFsaXplID09PSAncmlnaHQnLFxuICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgIH0pLFxuICAgICAgKSxcbiAgICBdO1xuICAgIHJldHVybiBgJHt0aGlzLm5hbWV9KCR7cGFyYW1zLmpvaW4oJywgJyl9KWA7XG4gIH1cblxuICBjbG9uZSgpIHtcbiAgICByZXR1cm4gbmV3IEZ1bmN0aW9uPFQ+KFxuICAgICAgdGhpcy5uYW1lLFxuICAgICAgdGhpcy52YWx1ZXMubWFwKCh2KSA9PiBPYmplY3RzLmNsb25lKHYpKSxcbiAgICAgIHRoaXMubm9ybWFsaXplLFxuICAgICAgdGhpcy5lc2NhcGUsXG4gICAgKTtcbiAgfVxuXG4gIHJlc29sdmUocGFyc2VyOiBhbnkpIHtcbiAgICByZXR1cm4gcGFyc2VyO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTdHJpbmdBbmRDb2xsZWN0aW9uRnVuY3Rpb25zPFQ+IHtcbiAgY29uY2F0KGxlZnQ6IGFueSwgcmlnaHQ6IGFueSwgbm9ybWFsaXplOiBOb3JtYWxpemUgPSAncmlnaHQnKSB7XG4gICAgcmV0dXJuIG5ldyBGdW5jdGlvbjxUPignY29uY2F0JywgW2xlZnQsIHJpZ2h0XSwgbm9ybWFsaXplKTtcbiAgfVxuXG4gIGNvbnRhaW5zKGxlZnQ6IGFueSwgcmlnaHQ6IGFueSwgbm9ybWFsaXplOiBOb3JtYWxpemUgPSAncmlnaHQnKSB7XG4gICAgcmV0dXJuIG5ldyBGdW5jdGlvbjxUPignY29udGFpbnMnLCBbbGVmdCwgcmlnaHRdLCBub3JtYWxpemUpO1xuICB9XG5cbiAgZW5kc1dpdGgobGVmdDogYW55LCByaWdodDogYW55LCBub3JtYWxpemU6IE5vcm1hbGl6ZSA9ICdyaWdodCcpIHtcbiAgICByZXR1cm4gbmV3IEZ1bmN0aW9uPFQ+KCdlbmRzd2l0aCcsIFtsZWZ0LCByaWdodF0sIG5vcm1hbGl6ZSk7XG4gIH1cblxuICBpbmRleE9mKGxlZnQ6IGFueSwgcmlnaHQ6IGFueSwgbm9ybWFsaXplOiBOb3JtYWxpemUgPSAncmlnaHQnKSB7XG4gICAgcmV0dXJuIG5ldyBGdW5jdGlvbjxUPignaW5kZXhvZicsIFtsZWZ0LCByaWdodF0sIG5vcm1hbGl6ZSk7XG4gIH1cblxuICBsZW5ndGgobGVmdDogYW55LCBub3JtYWxpemU6IE5vcm1hbGl6ZSA9ICdyaWdodCcpIHtcbiAgICByZXR1cm4gbmV3IEZ1bmN0aW9uPFQ+KCdsZW5ndGgnLCBbbGVmdF0sIG5vcm1hbGl6ZSk7XG4gIH1cblxuICBzdGFydHNXaXRoKGxlZnQ6IGFueSwgcmlnaHQ6IGFueSwgbm9ybWFsaXplOiBOb3JtYWxpemUgPSAncmlnaHQnKSB7XG4gICAgcmV0dXJuIG5ldyBGdW5jdGlvbjxUPignc3RhcnRzd2l0aCcsIFtsZWZ0LCByaWdodF0sIG5vcm1hbGl6ZSk7XG4gIH1cblxuICBzdWJTdHJpbmcoXG4gICAgbGVmdDogYW55LFxuICAgIHJpZ2h0OiBudW1iZXIsXG4gICAgbGVuZ3RoPzogbnVtYmVyLFxuICAgIG5vcm1hbGl6ZTogTm9ybWFsaXplID0gJ25vbmUnLFxuICApIHtcbiAgICBsZXQgdmFsdWVzID0gW2xlZnQsIHJpZ2h0XTtcbiAgICBpZiAobGVuZ3RoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHZhbHVlcy5wdXNoKGxlbmd0aCk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgRnVuY3Rpb248VD4oJ3N1YnN0cmluZycsIHZhbHVlcywgbm9ybWFsaXplKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ29sbGVjdGlvbkZ1bmN0aW9uczxUPiB7XG4gIGhhc1N1YnNldChsZWZ0OiBULCByaWdodDogYW55LCBub3JtYWxpemU6IE5vcm1hbGl6ZSA9ICdub25lJykge1xuICAgIHJldHVybiBuZXcgRnVuY3Rpb248VD4oJ2hhc3N1YnNldCcsIFtsZWZ0LCByaWdodF0sIG5vcm1hbGl6ZSk7XG4gIH1cbiAgaGFzU3Vic2VxdWVuY2UobGVmdDogVCwgcmlnaHQ6IGFueSwgbm9ybWFsaXplOiBOb3JtYWxpemUgPSAnbm9uZScpIHtcbiAgICByZXR1cm4gbmV3IEZ1bmN0aW9uPFQ+KCdoYXNzdWJzZXF1ZW5jZScsIFtsZWZ0LCByaWdodF0sIG5vcm1hbGl6ZSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFN0cmluZ0Z1bmN0aW9uczxUPiB7XG4gIG1hdGNoZXNQYXR0ZXJuKFxuICAgIGxlZnQ6IGFueSB8IHN0cmluZyxcbiAgICBwYXR0ZXJuOiBzdHJpbmcsXG4gICAgbm9ybWFsaXplOiBOb3JtYWxpemUgPSAnbm9uZScsXG4gICkge1xuICAgIHJldHVybiBuZXcgRnVuY3Rpb248VD4oJ21hdGNoZXNQYXR0ZXJuJywgW2xlZnQsIHBhdHRlcm5dLCBub3JtYWxpemUpO1xuICB9XG4gIHRvTG93ZXIobGVmdDogYW55LCBub3JtYWxpemU6IE5vcm1hbGl6ZSA9ICdub25lJykge1xuICAgIHJldHVybiBuZXcgRnVuY3Rpb248VD4oJ3RvbG93ZXInLCBbbGVmdF0sIG5vcm1hbGl6ZSk7XG4gIH1cbiAgdG9VcHBlcihsZWZ0OiBhbnksIG5vcm1hbGl6ZTogTm9ybWFsaXplID0gJ25vbmUnKSB7XG4gICAgcmV0dXJuIG5ldyBGdW5jdGlvbjxUPigndG91cHBlcicsIFtsZWZ0XSwgbm9ybWFsaXplKTtcbiAgfVxuICB0cmltKGxlZnQ6IGFueSwgbm9ybWFsaXplOiBOb3JtYWxpemUgPSAnbm9uZScpIHtcbiAgICByZXR1cm4gbmV3IEZ1bmN0aW9uPFQ+KCd0cmltJywgW2xlZnRdLCBub3JtYWxpemUpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBEYXRlQW5kVGltZUZ1bmN0aW9uczxUPiB7XG4gIGRhdGUobGVmdDogYW55LCBub3JtYWxpemU6IE5vcm1hbGl6ZSA9ICdub25lJykge1xuICAgIHJldHVybiBuZXcgRnVuY3Rpb248VD4oJ2RhdGUnLCBbbGVmdF0sIG5vcm1hbGl6ZSk7XG4gIH1cbiAgZGF5KGxlZnQ6IGFueSwgbm9ybWFsaXplOiBOb3JtYWxpemUgPSAnbm9uZScpIHtcbiAgICByZXR1cm4gbmV3IEZ1bmN0aW9uPFQ+KCdkYXknLCBbbGVmdF0sIG5vcm1hbGl6ZSk7XG4gIH1cbiAgZnJhY3Rpb25hbHNlY29uZHMobGVmdDogYW55LCBub3JtYWxpemU6IE5vcm1hbGl6ZSA9ICdub25lJykge1xuICAgIHJldHVybiBuZXcgRnVuY3Rpb248VD4oJ2ZyYWN0aW9uYWxzZWNvbmRzJywgW2xlZnRdLCBub3JtYWxpemUpO1xuICB9XG4gIGhvdXIobGVmdDogYW55LCBub3JtYWxpemU6IE5vcm1hbGl6ZSA9ICdub25lJykge1xuICAgIHJldHVybiBuZXcgRnVuY3Rpb248VD4oJ2hvdXInLCBbbGVmdF0sIG5vcm1hbGl6ZSk7XG4gIH1cbiAgbWF4ZGF0ZXRpbWUobGVmdDogYW55LCBub3JtYWxpemU6IE5vcm1hbGl6ZSA9ICdub25lJykge1xuICAgIHJldHVybiBuZXcgRnVuY3Rpb248VD4oJ21heGRhdGV0aW1lJywgW2xlZnRdLCBub3JtYWxpemUpO1xuICB9XG4gIG1pbmRhdGV0aW1lKGxlZnQ6IGFueSwgbm9ybWFsaXplOiBOb3JtYWxpemUgPSAnbm9uZScpIHtcbiAgICByZXR1cm4gbmV3IEZ1bmN0aW9uPFQ+KCdtaW5kYXRldGltZScsIFtsZWZ0XSwgbm9ybWFsaXplKTtcbiAgfVxuICBtaW51dGUobGVmdDogYW55LCBub3JtYWxpemU6IE5vcm1hbGl6ZSA9ICdub25lJykge1xuICAgIHJldHVybiBuZXcgRnVuY3Rpb248VD4oJ21pbnV0ZScsIFtsZWZ0XSwgbm9ybWFsaXplKTtcbiAgfVxuICBtb250aChsZWZ0OiBhbnksIG5vcm1hbGl6ZTogTm9ybWFsaXplID0gJ25vbmUnKSB7XG4gICAgcmV0dXJuIG5ldyBGdW5jdGlvbjxUPignbW9udGgnLCBbbGVmdF0sIG5vcm1hbGl6ZSk7XG4gIH1cbiAgbm93KCkge1xuICAgIHJldHVybiBuZXcgRnVuY3Rpb248VD4oJ25vdycsIFtdLCAnbm9uZScpO1xuICB9XG4gIHNlY29uZChsZWZ0OiBhbnksIG5vcm1hbGl6ZTogTm9ybWFsaXplID0gJ25vbmUnKSB7XG4gICAgcmV0dXJuIG5ldyBGdW5jdGlvbjxUPignc2Vjb25kJywgW2xlZnRdLCBub3JtYWxpemUpO1xuICB9XG4gIHRpbWUobGVmdDogYW55LCBub3JtYWxpemU6IE5vcm1hbGl6ZSA9ICdub25lJykge1xuICAgIHJldHVybiBuZXcgRnVuY3Rpb248VD4oJ3RpbWUnLCBbbGVmdF0sIG5vcm1hbGl6ZSk7XG4gIH1cbiAgdG90YWxvZmZzZXRtaW51dGVzKGxlZnQ6IGFueSwgbm9ybWFsaXplOiBOb3JtYWxpemUgPSAnbm9uZScpIHtcbiAgICByZXR1cm4gbmV3IEZ1bmN0aW9uPFQ+KCd0b3RhbG9mZnNldG1pbnV0ZXMnLCBbbGVmdF0sIG5vcm1hbGl6ZSk7XG4gIH1cbiAgdG90YWxzZWNvbmRzKGxlZnQ6IGFueSwgbm9ybWFsaXplOiBOb3JtYWxpemUgPSAnbm9uZScpIHtcbiAgICByZXR1cm4gbmV3IEZ1bmN0aW9uPFQ+KCd0b3RhbHNlY29uZHMnLCBbbGVmdF0sIG5vcm1hbGl6ZSk7XG4gIH1cbiAgeWVhcihsZWZ0OiBhbnksIG5vcm1hbGl6ZTogTm9ybWFsaXplID0gJ25vbmUnKSB7XG4gICAgcmV0dXJuIG5ldyBGdW5jdGlvbjxUPigneWVhcicsIFtsZWZ0XSwgbm9ybWFsaXplKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQXJpdGhtZXRpY0Z1bmN0aW9uczxUPiB7XG4gIGNlaWxpbmcobGVmdDogVCB8IHN0cmluZywgbm9ybWFsaXplOiBOb3JtYWxpemUgPSAnbm9uZScpIHtcbiAgICByZXR1cm4gbmV3IEZ1bmN0aW9uPFQ+KCdjZWlsaW5nJywgW2xlZnRdLCBub3JtYWxpemUpO1xuICB9XG4gIGZsb29yKGxlZnQ6IFQgfCBzdHJpbmcsIG5vcm1hbGl6ZTogTm9ybWFsaXplID0gJ25vbmUnKSB7XG4gICAgcmV0dXJuIG5ldyBGdW5jdGlvbjxUPignZmxvb3InLCBbbGVmdF0sIG5vcm1hbGl6ZSk7XG4gIH1cbiAgcm91bmQobGVmdDogVCB8IHN0cmluZywgbm9ybWFsaXplOiBOb3JtYWxpemUgPSAnbm9uZScpIHtcbiAgICByZXR1cm4gbmV3IEZ1bmN0aW9uPFQ+KCdyb3VuZCcsIFtsZWZ0XSwgbm9ybWFsaXplKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVHlwZUZ1bmN0aW9uczxUPiB7XG4gIGNhc3Q8Tj4obGVmdDogVCB8IHN0cmluZywgdHlwZT86IHN0cmluZyk6IE4ge1xuICAgIHJldHVybiBGaWVsZEZhY3Rvcnk8UmVxdWlyZWQ8Tj4+KFtcbiAgICAgIHR5cGUgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IG5ldyBUeXBlPFQ+KCdjYXN0JywgdHlwZSwgbGVmdClcbiAgICAgICAgOiBuZXcgVHlwZTxUPignY2FzdCcsIGxlZnQgYXMgc3RyaW5nKSxcbiAgICBdKTtcbiAgfVxuXG4gIGlzb2YobGVmdDogVCB8IHN0cmluZywgdHlwZT86IHN0cmluZykge1xuICAgIHJldHVybiB0eXBlICE9PSB1bmRlZmluZWRcbiAgICAgID8gbmV3IFR5cGU8VD4oJ2lzb2YnLCB0eXBlLCBsZWZ0KVxuICAgICAgOiBuZXcgVHlwZTxUPignaXNvZicsIGxlZnQgYXMgc3RyaW5nKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgR2VvRnVuY3Rpb25zPFQ+IHtcbiAgZ2VvRGlzdGFuY2UobGVmdDogVCwgcmlnaHQ6IHN0cmluZywgbm9ybWFsaXplOiBOb3JtYWxpemUgPSAncmlnaHQnKSB7XG4gICAgcmV0dXJuIG5ldyBGdW5jdGlvbjxUPignZ2VvLmRpc3RhbmNlJywgW2xlZnQsIHJpZ2h0XSwgbm9ybWFsaXplKTtcbiAgfVxuICBnZW9JbnRlcnNlY3RzKGxlZnQ6IFQsIHJpZ2h0OiBzdHJpbmcsIG5vcm1hbGl6ZTogTm9ybWFsaXplID0gJ3JpZ2h0Jykge1xuICAgIHJldHVybiBuZXcgRnVuY3Rpb248VD4oJ2dlby5pbnRlcnNlY3RzJywgW2xlZnQsIHJpZ2h0XSwgbm9ybWFsaXplKTtcbiAgfVxuICBnZW9MZW5ndGgobGVmdDogVCwgbm9ybWFsaXplOiBOb3JtYWxpemUgPSAnbm9uZScpIHtcbiAgICByZXR1cm4gbmV3IEZ1bmN0aW9uPFQ+KCdnZW8ubGVuZ3RoJywgW2xlZnRdLCBub3JtYWxpemUpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDb25kaXRpb25hbEZ1bmN0aW9uczxUPiB7XG4gIGNhc2UobGVmdDogVCB8IHN0cmluZywgcmlnaHQ6IGFueSwgbm9ybWFsaXplOiBOb3JtYWxpemUgPSAnbm9uZScpIHtcbiAgICByZXR1cm4gbmV3IEZ1bmN0aW9uPFQ+KCdjYXNlJywgW2xlZnQsIHJpZ2h0XSwgbm9ybWFsaXplKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgT3BlcmF0b3I8VD4gaW1wbGVtZW50cyBSZW5kZXJhYmxlIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIG9wOiBzdHJpbmcsXG4gICAgcHJvdGVjdGVkIHZhbHVlczogYW55W10sXG4gICAgcHJvdGVjdGVkIG5vcm1hbGl6ZTogTm9ybWFsaXplLFxuICApIHt9XG5cbiAgZ2V0IFtTeW1ib2wudG9TdHJpbmdUYWddKCkge1xuICAgIHJldHVybiAnT3BlcmF0b3InO1xuICB9XG5cbiAgdG9Kc29uKCkge1xuICAgIHJldHVybiB7XG4gICAgICAkdHlwZTogVHlwZXMucmF3VHlwZSh0aGlzKSxcbiAgICAgIG9wOiB0aGlzLm9wLFxuICAgICAgdmFsdWVzOiB0aGlzLnZhbHVlcy5tYXAoKHYpID0+XG4gICAgICAgIFR5cGVzLmlzT2JqZWN0KHYpICYmICd0b0pzb24nIGluIHYgPyB2LnRvSnNvbigpIDogdixcbiAgICAgICksXG4gICAgICBub3JtYWxpemU6IHRoaXMubm9ybWFsaXplLFxuICAgIH07XG4gIH1cblxuICBzdGF0aWMgZnJvbUpzb248VD4oanNvbjogeyBbbmFtZTogc3RyaW5nXTogYW55IH0pOiBPcGVyYXRvcjxUPiB7XG4gICAgcmV0dXJuIG5ldyBPcGVyYXRvcjxUPihcbiAgICAgIGpzb25bJ29wJ10sXG4gICAgICBqc29uWyd2YWx1ZXMnXS5tYXAoKHY6IGFueSkgPT4gUmVuZGVyYWJsZUZhY3RvcnkodikpLFxuICAgICAganNvblsnbm9ybWFsaXplJ10sXG4gICAgKTtcbiAgfVxuXG4gIHJlbmRlcih7XG4gICAgYWxpYXNlcyxcbiAgICBlc2NhcGUsXG4gICAgcHJlZml4LFxuICAgIHBhcnNlcixcbiAgICBvcHRpb25zLFxuICB9OiB7XG4gICAgYWxpYXNlcz86IFF1ZXJ5Q3VzdG9tVHlwZVtdO1xuICAgIGVzY2FwZT86IGJvb2xlYW47XG4gICAgcHJlZml4Pzogc3RyaW5nO1xuICAgIHBhcnNlcj86IFBhcnNlcjxUPjtcbiAgICBvcHRpb25zPzogUGFyc2VyT3B0aW9ucztcbiAgfSk6IHN0cmluZyB7XG4gICAgcGFyc2VyID0gcmVzb2x2ZSh0aGlzLnZhbHVlcywgcGFyc2VyKTtcbiAgICBsZXQgW2xlZnQsIHJpZ2h0XSA9IGVuY29kZSh0aGlzLnZhbHVlcywgcGFyc2VyLCBvcHRpb25zKTtcblxuICAgIGxlZnQgPSByZW5kZXIobGVmdCwge1xuICAgICAgYWxpYXNlcyxcbiAgICAgIGVzY2FwZSxcbiAgICAgIHByZWZpeCxcbiAgICAgIHBhcnNlcixcbiAgICAgIG5vcm1hbGl6ZTogdGhpcy5ub3JtYWxpemUgPT09ICdhbGwnIHx8IHRoaXMubm9ybWFsaXplID09PSAnbGVmdCcsXG4gICAgICBvcHRpb25zLFxuICAgIH0pO1xuICAgIGlmIChyaWdodCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByaWdodCA9IEFycmF5LmlzQXJyYXkocmlnaHQpXG4gICAgICAgID8gYCgke3JpZ2h0XG4gICAgICAgICAgICAubWFwKCh2KSA9PlxuICAgICAgICAgICAgICByZW5kZXIodiwge1xuICAgICAgICAgICAgICAgIGFsaWFzZXMsXG4gICAgICAgICAgICAgICAgZXNjYXBlLFxuICAgICAgICAgICAgICAgIHByZWZpeCxcbiAgICAgICAgICAgICAgICBwYXJzZXIsXG4gICAgICAgICAgICAgICAgbm9ybWFsaXplOlxuICAgICAgICAgICAgICAgICAgdGhpcy5ub3JtYWxpemUgPT09ICdhbGwnIHx8IHRoaXMubm9ybWFsaXplID09PSAncmlnaHQnLFxuICAgICAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLmpvaW4oJywnKX0pYFxuICAgICAgICA6IHJlbmRlcihyaWdodCwge1xuICAgICAgICAgICAgYWxpYXNlcyxcbiAgICAgICAgICAgIGVzY2FwZSxcbiAgICAgICAgICAgIHByZWZpeCxcbiAgICAgICAgICAgIHBhcnNlcixcbiAgICAgICAgICAgIG5vcm1hbGl6ZTogdGhpcy5ub3JtYWxpemUgPT09ICdhbGwnIHx8IHRoaXMubm9ybWFsaXplID09PSAncmlnaHQnLFxuICAgICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgICB9KTtcbiAgICAgIHJldHVybiBgJHtsZWZ0fSAke3RoaXMub3B9ICR7cmlnaHR9YDtcbiAgICB9XG4gICAgcmV0dXJuIGAke3RoaXMub3B9KCR7bGVmdH0pYDtcbiAgfVxuXG4gIGNsb25lKCkge1xuICAgIHJldHVybiBuZXcgT3BlcmF0b3IoXG4gICAgICB0aGlzLm9wLFxuICAgICAgdGhpcy52YWx1ZXMubWFwKCh2KSA9PiBPYmplY3RzLmNsb25lKHYpKSxcbiAgICAgIHRoaXMubm9ybWFsaXplLFxuICAgICk7XG4gIH1cbiAgcmVzb2x2ZShwYXJzZXI6IGFueSkge1xuICAgIHJldHVybiBwYXJzZXI7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIExvZ2ljYWxPcGVyYXRvcnM8VD4ge1xuICBlcShsZWZ0OiBhbnksIHJpZ2h0OiBhbnksIG5vcm1hbGl6ZTogTm9ybWFsaXplID0gJ3JpZ2h0Jykge1xuICAgIHJldHVybiBuZXcgT3BlcmF0b3IoJ2VxJywgW2xlZnQsIHJpZ2h0XSwgbm9ybWFsaXplKTtcbiAgfVxuICBuZShsZWZ0OiBhbnksIHJpZ2h0OiBhbnksIG5vcm1hbGl6ZTogTm9ybWFsaXplID0gJ3JpZ2h0Jykge1xuICAgIHJldHVybiBuZXcgT3BlcmF0b3IoJ25lJywgW2xlZnQsIHJpZ2h0XSwgbm9ybWFsaXplKTtcbiAgfVxuICBndChsZWZ0OiBhbnksIHJpZ2h0OiBhbnksIG5vcm1hbGl6ZTogTm9ybWFsaXplID0gJ3JpZ2h0Jykge1xuICAgIHJldHVybiBuZXcgT3BlcmF0b3IoJ2d0JywgW2xlZnQsIHJpZ2h0XSwgbm9ybWFsaXplKTtcbiAgfVxuICBnZShsZWZ0OiBhbnksIHJpZ2h0OiBhbnksIG5vcm1hbGl6ZTogTm9ybWFsaXplID0gJ3JpZ2h0Jykge1xuICAgIHJldHVybiBuZXcgT3BlcmF0b3IoJ2dlJywgW2xlZnQsIHJpZ2h0XSwgbm9ybWFsaXplKTtcbiAgfVxuICBsdChsZWZ0OiBhbnksIHJpZ2h0OiBhbnksIG5vcm1hbGl6ZTogTm9ybWFsaXplID0gJ3JpZ2h0Jykge1xuICAgIHJldHVybiBuZXcgT3BlcmF0b3IoJ2x0JywgW2xlZnQsIHJpZ2h0XSwgbm9ybWFsaXplKTtcbiAgfVxuICBsZShsZWZ0OiBhbnksIHJpZ2h0OiBhbnksIG5vcm1hbGl6ZTogTm9ybWFsaXplID0gJ3JpZ2h0Jykge1xuICAgIHJldHVybiBuZXcgT3BlcmF0b3IoJ2xlJywgW2xlZnQsIHJpZ2h0XSwgbm9ybWFsaXplKTtcbiAgfVxuICAvKlxuICBhbmQobGVmdDogYW55LCByaWdodDogYW55LCBub3JtYWxpemU6IE5vcm1hbGl6ZSA9ICdyaWdodCcpIHtcbiAgICByZXR1cm4gbmV3IE9wZXJhdG9yKCdhbmQnLCBbbGVmdCwgcmlnaHRdLCBub3JtYWxpemUpO1xuICB9XG4gIG9yKGxlZnQ6IGFueSwgcmlnaHQ6IGFueSwgbm9ybWFsaXplOiBOb3JtYWxpemUgPSAncmlnaHQnKSB7XG4gICAgcmV0dXJuIG5ldyBPcGVyYXRvcignb3InLCBbbGVmdCwgcmlnaHRdLCBub3JtYWxpemUpO1xuICB9XG4gICovXG4gIG5vdChsZWZ0OiBhbnksIG5vcm1hbGl6ZTogTm9ybWFsaXplID0gJ25vbmUnKSB7XG4gICAgcmV0dXJuIG5ldyBPcGVyYXRvcjxUPignbm90JywgW2xlZnRdLCBub3JtYWxpemUpO1xuICB9XG4gIGhhcyhsZWZ0OiBhbnksIHJpZ2h0OiBhbnksIG5vcm1hbGl6ZTogTm9ybWFsaXplID0gJ3JpZ2h0Jykge1xuICAgIHJldHVybiBuZXcgT3BlcmF0b3IoJ2hhcycsIFtsZWZ0LCByaWdodF0sIG5vcm1hbGl6ZSk7XG4gIH1cbiAgaW4obGVmdDogYW55LCByaWdodDogYW55LCBub3JtYWxpemU6IE5vcm1hbGl6ZSA9ICdyaWdodCcpIHtcbiAgICByZXR1cm4gbmV3IE9wZXJhdG9yKCdpbicsIFtsZWZ0LCByaWdodF0sIG5vcm1hbGl6ZSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFyaXRobWV0aWNPcGVyYXRvcnM8VD4ge1xuICBhZGQobGVmdDogYW55LCByaWdodDogYW55LCBub3JtYWxpemU6IE5vcm1hbGl6ZSA9ICdyaWdodCcpIHtcbiAgICByZXR1cm4gbmV3IE9wZXJhdG9yPFQ+KCdhZGQnLCBbbGVmdCwgcmlnaHRdLCBub3JtYWxpemUpO1xuICB9XG4gIHN1YihsZWZ0OiBhbnksIHJpZ2h0OiBhbnksIG5vcm1hbGl6ZTogTm9ybWFsaXplID0gJ3JpZ2h0Jykge1xuICAgIHJldHVybiBuZXcgT3BlcmF0b3IoJ3N1YicsIFtsZWZ0LCByaWdodF0sIG5vcm1hbGl6ZSk7XG4gIH1cbiAgbXVsKGxlZnQ6IGFueSwgcmlnaHQ6IGFueSwgbm9ybWFsaXplOiBOb3JtYWxpemUgPSAncmlnaHQnKSB7XG4gICAgcmV0dXJuIG5ldyBPcGVyYXRvcignbXVsJywgW2xlZnQsIHJpZ2h0XSwgbm9ybWFsaXplKTtcbiAgfVxuICBkaXYobGVmdDogYW55LCByaWdodDogYW55LCBub3JtYWxpemU6IE5vcm1hbGl6ZSA9ICdyaWdodCcpIHtcbiAgICByZXR1cm4gbmV3IE9wZXJhdG9yKCdkaXYnLCBbbGVmdCwgcmlnaHRdLCBub3JtYWxpemUpO1xuICB9XG4gIG1vZChsZWZ0OiBhbnksIHJpZ2h0OiBhbnksIG5vcm1hbGl6ZTogTm9ybWFsaXplID0gJ3JpZ2h0Jykge1xuICAgIHJldHVybiBuZXcgT3BlcmF0b3IoJ21vZCcsIFtsZWZ0LCByaWdodF0sIG5vcm1hbGl6ZSk7XG4gIH1cbiAgbmVnKHZhbHVlOiBhbnksIG5vcm1hbGl6ZTogTm9ybWFsaXplID0gJ3JpZ2h0Jykge1xuICAgIHJldHVybiBuZXcgT3BlcmF0b3IoJy0nLCBbdmFsdWVdLCBub3JtYWxpemUpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBHcm91cGluZzxUPiBpbXBsZW1lbnRzIFJlbmRlcmFibGUge1xuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgZ3JvdXA6IFJlbmRlcmFibGUpIHt9XG5cbiAgZ2V0IFtTeW1ib2wudG9TdHJpbmdUYWddKCkge1xuICAgIHJldHVybiAnR3JvdXBpbmcnO1xuICB9XG5cbiAgdG9Kc29uKCkge1xuICAgIHJldHVybiB7XG4gICAgICAkdHlwZTogVHlwZXMucmF3VHlwZSh0aGlzKSxcbiAgICAgIGdyb3VwOiB0aGlzLmdyb3VwLnRvSnNvbigpLFxuICAgIH07XG4gIH1cblxuICBzdGF0aWMgZnJvbUpzb248VD4oanNvbjogeyBbbmFtZTogc3RyaW5nXTogYW55IH0pOiBHcm91cGluZzxUPiB7XG4gICAgcmV0dXJuIG5ldyBHcm91cGluZzxUPihqc29uWydncm91cCddLm1hcCgodjogYW55KSA9PiBSZW5kZXJhYmxlRmFjdG9yeSh2KSkpO1xuICB9XG5cbiAgcmVuZGVyKHtcbiAgICBhbGlhc2VzLFxuICAgIGVzY2FwZSxcbiAgICBwcmVmaXgsXG4gICAgcGFyc2VyLFxuICAgIG9wdGlvbnMsXG4gIH06IHtcbiAgICBhbGlhc2VzPzogUXVlcnlDdXN0b21UeXBlW107XG4gICAgZXNjYXBlPzogYm9vbGVhbjtcbiAgICBwcmVmaXg/OiBzdHJpbmc7XG4gICAgcGFyc2VyPzogUGFyc2VyPFQ+O1xuICAgIG9wdGlvbnM/OiBQYXJzZXJPcHRpb25zO1xuICB9KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCgke3JlbmRlcih0aGlzLmdyb3VwLCB7XG4gICAgICBhbGlhc2VzLFxuICAgICAgZXNjYXBlLFxuICAgICAgcHJlZml4LFxuICAgICAgcGFyc2VyLFxuICAgICAgb3B0aW9ucyxcbiAgICB9KX0pYDtcbiAgfVxuXG4gIGNsb25lKCkge1xuICAgIHJldHVybiBuZXcgR3JvdXBpbmcoT2JqZWN0cy5jbG9uZSh0aGlzLmdyb3VwKSk7XG4gIH1cbiAgcmVzb2x2ZShwYXJzZXI6IGFueSkge1xuICAgIHJldHVybiBwYXJzZXI7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEdyb3VwaW5nT3BlcmF0b3JzPFQ+IHtcbiAgZ3JvdXAodmFsdWU6IGFueSkge1xuICAgIHJldHVybiBuZXcgR3JvdXBpbmc8VD4odmFsdWUpO1xuICB9XG4gIHJvbGx1cCguLi52YWx1ZXM6IGFueSkge1xuICAgIHJldHVybiBuZXcgRnVuY3Rpb248VD4oJ3JvbGx1cCcsIHZhbHVlcywgJ25vbmUnKTtcbiAgfVxufVxuXG5leHBvcnQgdHlwZSBBZ2dyZWdhdGVNZXRob2QgPVxuICB8ICdzdW0nXG4gIHwgJ21pbidcbiAgfCAnbWF4J1xuICB8ICdhdmVyYWdlJ1xuICB8ICdjb3VudGRpc3RpbmN0JzsgLy8sIG9yIHdpdGggY3VzdG9tIGFnZ3JlZ2F0aW9uIG1ldGhvZHM7XG5cbmV4cG9ydCBjbGFzcyBBZ2dyZWdhdGU8VD4gaW1wbGVtZW50cyBSZW5kZXJhYmxlIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIHZhbHVlOiBSZW5kZXJhYmxlLFxuICAgIHByb3RlY3RlZCBtZXRob2Q6IEFnZ3JlZ2F0ZU1ldGhvZCxcbiAgICBwcm90ZWN0ZWQgYWxpYXM6IHN0cmluZyxcbiAgKSB7fVxuXG4gIGdldCBbU3ltYm9sLnRvU3RyaW5nVGFnXSgpIHtcbiAgICByZXR1cm4gJ0FnZ3JlZ2F0ZSc7XG4gIH1cblxuICB0b0pzb24oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICR0eXBlOiBUeXBlcy5yYXdUeXBlKHRoaXMpLFxuICAgICAgdmFsdWU6IHRoaXMudmFsdWUudG9Kc29uKCksXG4gICAgICBtZXRob2Q6IHRoaXMubWV0aG9kLFxuICAgICAgYWxpYXM6IHRoaXMuYWxpYXMsXG4gICAgfTtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tSnNvbjxUPihqc29uOiB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSk6IEFnZ3JlZ2F0ZTxUPiB7XG4gICAgcmV0dXJuIG5ldyBBZ2dyZWdhdGU8VD4oXG4gICAgICBSZW5kZXJhYmxlRmFjdG9yeShqc29uWyd2YWx1ZSddKSxcbiAgICAgIGpzb25bJ21ldGhvZCddLFxuICAgICAganNvblsnYWxpYXMnXSxcbiAgICApO1xuICB9XG5cbiAgcmVuZGVyKHtcbiAgICBhbGlhc2VzLFxuICAgIGVzY2FwZSxcbiAgICBwcmVmaXgsXG4gICAgcGFyc2VyLFxuICAgIG9wdGlvbnMsXG4gIH06IHtcbiAgICBhbGlhc2VzPzogUXVlcnlDdXN0b21UeXBlW107XG4gICAgZXNjYXBlPzogYm9vbGVhbjtcbiAgICBwcmVmaXg/OiBzdHJpbmc7XG4gICAgcGFyc2VyPzogUGFyc2VyPFQ+O1xuICAgIG9wdGlvbnM/OiBQYXJzZXJPcHRpb25zO1xuICB9KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYGFnZ3JlZ2F0ZSgke3JlbmRlcih0aGlzLnZhbHVlLCB7XG4gICAgICBhbGlhc2VzLFxuICAgICAgZXNjYXBlLFxuICAgICAgcHJlZml4LFxuICAgICAgcGFyc2VyLFxuICAgICAgb3B0aW9ucyxcbiAgICB9KX0gd2l0aCAke3RoaXMubWV0aG9kfSBhcyAke3RoaXMuYWxpYXN9KWA7XG4gIH1cblxuICBjbG9uZSgpIHtcbiAgICByZXR1cm4gbmV3IEFnZ3JlZ2F0ZShPYmplY3RzLmNsb25lKHRoaXMudmFsdWUpLCB0aGlzLm1ldGhvZCwgdGhpcy5hbGlhcyk7XG4gIH1cbiAgcmVzb2x2ZShwYXJzZXI6IGFueSkge1xuICAgIHJldHVybiBwYXJzZXI7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEdyb3VwQnk8VD4gaW1wbGVtZW50cyBSZW5kZXJhYmxlIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIHByb3BlcnRpZXM6IFJlbmRlcmFibGVbXSxcbiAgICBwcm90ZWN0ZWQgdHJhbnNmb3JtYXRpb25zPzogUmVuZGVyYWJsZSxcbiAgKSB7fVxuXG4gIGdldCBbU3ltYm9sLnRvU3RyaW5nVGFnXSgpIHtcbiAgICByZXR1cm4gJ0dyb3VwQnknO1xuICB9XG5cbiAgdG9Kc29uKCkge1xuICAgIHJldHVybiB7XG4gICAgICAkdHlwZTogVHlwZXMucmF3VHlwZSh0aGlzKSxcbiAgICAgIHByb3BlcnRpZXM6IHRoaXMucHJvcGVydGllcy5tYXAoKHApID0+IHAudG9Kc29uKCkpLFxuICAgICAgdHJhbnNmb3JtYXRpb25zOiB0aGlzLnRyYW5zZm9ybWF0aW9ucz8udG9Kc29uKCksXG4gICAgfTtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tSnNvbjxUPihqc29uOiB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSk6IEdyb3VwQnk8VD4ge1xuICAgIHJldHVybiBuZXcgR3JvdXBCeTxUPihcbiAgICAgIGpzb25bJ3Byb3BlcnRpZXMnXS5tYXAoKHA6IGFueSkgPT4gUmVuZGVyYWJsZUZhY3RvcnkocCkpLFxuICAgICAgUmVuZGVyYWJsZUZhY3RvcnkoanNvblsndHJhbnNmb3JtYXRpb25zJ10pLFxuICAgICk7XG4gIH1cblxuICByZW5kZXIoe1xuICAgIGFsaWFzZXMsXG4gICAgZXNjYXBlLFxuICAgIHByZWZpeCxcbiAgICBwYXJzZXIsXG4gICAgb3B0aW9ucyxcbiAgfToge1xuICAgIGFsaWFzZXM/OiBRdWVyeUN1c3RvbVR5cGVbXTtcbiAgICBlc2NhcGU/OiBib29sZWFuO1xuICAgIHByZWZpeD86IHN0cmluZztcbiAgICBwYXJzZXI/OiBQYXJzZXI8VD47XG4gICAgb3B0aW9ucz86IFBhcnNlck9wdGlvbnM7XG4gIH0pOiBzdHJpbmcge1xuICAgIGNvbnN0IHByb3BlcnRpZXMgPSB0aGlzLnByb3BlcnRpZXNcbiAgICAgIC5tYXAoKHApID0+XG4gICAgICAgIHJlbmRlcihwLCB7XG4gICAgICAgICAgYWxpYXNlcyxcbiAgICAgICAgICBlc2NhcGUsXG4gICAgICAgICAgcHJlZml4LFxuICAgICAgICAgIHBhcnNlcixcbiAgICAgICAgICBvcHRpb25zLFxuICAgICAgICB9KSxcbiAgICAgIClcbiAgICAgIC5qb2luKCcsJyk7XG4gICAgY29uc3QgdHJhbnNmb3JtYXRpb25zID0gdGhpcy50cmFuc2Zvcm1hdGlvbnNcbiAgICAgID8gJywgJyArXG4gICAgICAgIHJlbmRlcih0aGlzLnRyYW5zZm9ybWF0aW9ucywge1xuICAgICAgICAgIGFsaWFzZXMsXG4gICAgICAgICAgZXNjYXBlLFxuICAgICAgICAgIHByZWZpeCxcbiAgICAgICAgICBwYXJzZXIsXG4gICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgfSlcbiAgICAgIDogJyc7XG4gICAgcmV0dXJuIGBncm91cGJ5KCgke3Byb3BlcnRpZXN9KSR7dHJhbnNmb3JtYXRpb25zfSlgO1xuICB9XG5cbiAgY2xvbmUoKSB7XG4gICAgcmV0dXJuIG5ldyBHcm91cEJ5KFxuICAgICAgT2JqZWN0cy5jbG9uZSh0aGlzLnByb3BlcnRpZXMpLFxuICAgICAgT2JqZWN0cy5jbG9uZSh0aGlzLnRyYW5zZm9ybWF0aW9ucyksXG4gICAgKTtcbiAgfVxuICByZXNvbHZlKHBhcnNlcjogYW55KSB7XG4gICAgcmV0dXJuIHBhcnNlcjtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVHJhbnNmb3JtYXRpb25zPFQ+IHtcbiAgYWdncmVnYXRlKHZhbHVlOiBSZW5kZXJhYmxlLCBtZXRob2Q6IEFnZ3JlZ2F0ZU1ldGhvZCwgYWxpYXM6IHN0cmluZykge1xuICAgIHJldHVybiBuZXcgQWdncmVnYXRlPFQ+KHZhbHVlLCBtZXRob2QsIGFsaWFzKTtcbiAgfVxuICBncm91cGJ5KHByb3BlcnRpZXM6IFJlbmRlcmFibGVbXSwgb3B0aW9ucz86IFJlbmRlcmFibGUpIHtcbiAgICByZXR1cm4gbmV3IEdyb3VwQnk8VD4ocHJvcGVydGllcywgb3B0aW9ucyk7XG4gIH1cbiAgdG9wQ291bnQodmFsdWU6IG51bWJlciwgZmllbGQ6IFJlbmRlcmFibGUsIG5vcm1hbGl6ZTogTm9ybWFsaXplID0gJ25vbmUnKSB7XG4gICAgcmV0dXJuIG5ldyBGdW5jdGlvbjxUPigndG9wY291bnQnLCBbdmFsdWUsIGZpZWxkXSwgbm9ybWFsaXplKTtcbiAgfVxuXG4gIHRvcFN1bSh2YWx1ZTogbnVtYmVyLCBmaWVsZDogUmVuZGVyYWJsZSwgbm9ybWFsaXplOiBOb3JtYWxpemUgPSAnbm9uZScpIHtcbiAgICByZXR1cm4gbmV3IEZ1bmN0aW9uPFQ+KCd0b3BzdW0nLCBbdmFsdWUsIGZpZWxkXSwgbm9ybWFsaXplKTtcbiAgfVxuICB0b3BQZXJjZW50KHZhbHVlOiBudW1iZXIsIGZpZWxkOiBSZW5kZXJhYmxlLCBub3JtYWxpemU6IE5vcm1hbGl6ZSA9ICdub25lJykge1xuICAgIHJldHVybiBuZXcgRnVuY3Rpb248VD4oJ3RvcHBlcmNlbnQnLCBbdmFsdWUsIGZpZWxkXSwgbm9ybWFsaXplKTtcbiAgfVxuXG4gIGJvdHRvbUNvdW50KHZhbHVlOiBudW1iZXIsIGZpZWxkOiBSZW5kZXJhYmxlLCBub3JtYWxpemU6IE5vcm1hbGl6ZSA9ICdub25lJykge1xuICAgIHJldHVybiBuZXcgRnVuY3Rpb248VD4oJ2JvdHRvbWNvdW50JywgW3ZhbHVlLCBmaWVsZF0sIG5vcm1hbGl6ZSk7XG4gIH1cblxuICBib3R0b21TdW0odmFsdWU6IG51bWJlciwgZmllbGQ6IFJlbmRlcmFibGUsIG5vcm1hbGl6ZTogTm9ybWFsaXplID0gJ25vbmUnKSB7XG4gICAgcmV0dXJuIG5ldyBGdW5jdGlvbjxUPignYm90dG9tc3VtJywgW3ZhbHVlLCBmaWVsZF0sIG5vcm1hbGl6ZSk7XG4gIH1cblxuICBib3R0b21QZXJjZW50KFxuICAgIHZhbHVlOiBudW1iZXIsXG4gICAgZmllbGQ6IFJlbmRlcmFibGUsXG4gICAgbm9ybWFsaXplOiBOb3JtYWxpemUgPSAnbm9uZScsXG4gICkge1xuICAgIHJldHVybiBuZXcgRnVuY3Rpb248VD4oJ2JvdHRvbXBlcmNlbnQnLCBbdmFsdWUsIGZpZWxkXSwgbm9ybWFsaXplKTtcbiAgfVxuXG4gIGlkZW50aXR5KCkge1xuICAgIHJldHVybiBuZXcgRnVuY3Rpb248VD4oJ2lkZW50aXR5JywgW10sICdub25lJyk7XG4gIH1cbiAgc2VhcmNoKHZhbHVlOiBhbnksIG5vcm1hbGl6ZTogTm9ybWFsaXplID0gJ25vbmUnKSB7XG4gICAgcmV0dXJuIG5ldyBGdW5jdGlvbjxUPignc2VhcmNoJywgW3ZhbHVlXSwgbm9ybWFsaXplKTtcbiAgfVxuICBmaWx0ZXIodmFsdWU6IGFueSwgbm9ybWFsaXplOiBOb3JtYWxpemUgPSAnbm9uZScpIHtcbiAgICByZXR1cm4gbmV3IEZ1bmN0aW9uPFQ+KCdmaWx0ZXInLCBbdmFsdWVdLCBub3JtYWxpemUpO1xuICB9XG5cbiAgc2tpcCh2YWx1ZTogbnVtYmVyLCBub3JtYWxpemU6IE5vcm1hbGl6ZSA9ICdub25lJykge1xuICAgIHJldHVybiBuZXcgRnVuY3Rpb248VD4oJ3RvcCcsIFt2YWx1ZV0sIG5vcm1hbGl6ZSk7XG4gIH1cblxuICB0b3AodmFsdWU6IG51bWJlciwgbm9ybWFsaXplOiBOb3JtYWxpemUgPSAnbm9uZScpIHtcbiAgICByZXR1cm4gbmV3IEZ1bmN0aW9uPFQ+KCd0b3AnLCBbdmFsdWVdLCBub3JtYWxpemUpO1xuICB9XG5cbiAgb3JkZXJieSh2YWx1ZTogYW55LCBub3JtYWxpemU6IE5vcm1hbGl6ZSA9ICdub25lJykge1xuICAgIHJldHVybiBuZXcgRnVuY3Rpb248VD4oJ2ZpbHRlcicsIFt2YWx1ZV0sIG5vcm1hbGl6ZSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFR5cGU8VD4gaW1wbGVtZW50cyBSZW5kZXJhYmxlIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIG5hbWU6IHN0cmluZyxcbiAgICBwcm90ZWN0ZWQgdHlwZTogc3RyaW5nLFxuICAgIHByb3RlY3RlZCB2YWx1ZT86IGFueSxcbiAgKSB7fVxuICBnZXQgW1N5bWJvbC50b1N0cmluZ1RhZ10oKSB7XG4gICAgcmV0dXJuICdUeXBlJztcbiAgfVxuXG4gIHRvSnNvbigpIHtcbiAgICByZXR1cm4ge1xuICAgICAgJHR5cGU6IFR5cGVzLnJhd1R5cGUodGhpcyksXG4gICAgICBuYW1lOiB0aGlzLm5hbWUsXG4gICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgICB2YWx1ZTogdGhpcy52YWx1ZSxcbiAgICB9O1xuICB9XG5cbiAgc3RhdGljIGZyb21Kc29uPFQ+KGpzb246IHsgW25hbWU6IHN0cmluZ106IGFueSB9KTogVHlwZTxUPiB7XG4gICAgcmV0dXJuIG5ldyBUeXBlPFQ+KFxuICAgICAganNvblsnbmFtZSddLFxuICAgICAganNvblsndHlwZSddLFxuICAgICAgUmVuZGVyYWJsZUZhY3RvcnkoanNvblsndmFsdWUnXSksXG4gICAgKTtcbiAgfVxuXG4gIHJlbmRlcih7XG4gICAgYWxpYXNlcyxcbiAgICBlc2NhcGUsXG4gICAgcHJlZml4LFxuICAgIHBhcnNlcixcbiAgICBvcHRpb25zLFxuICB9OiB7XG4gICAgYWxpYXNlcz86IFF1ZXJ5Q3VzdG9tVHlwZVtdO1xuICAgIGVzY2FwZT86IGJvb2xlYW47XG4gICAgcHJlZml4Pzogc3RyaW5nO1xuICAgIHBhcnNlcj86IFBhcnNlcjxUPjtcbiAgICBvcHRpb25zPzogUGFyc2VyT3B0aW9ucztcbiAgfSk6IHN0cmluZyB7XG4gICAgbGV0IHZhbHVlO1xuICAgIGlmICh0aGlzLnZhbHVlKSB7XG4gICAgICBwYXJzZXIgPSByZXNvbHZlKFt0aGlzLnZhbHVlXSwgcGFyc2VyKTtcbiAgICAgIGxldCBbbGVmdCwgcmlnaHRdID0gZW5jb2RlKFt0aGlzLnZhbHVlXSwgcGFyc2VyLCBvcHRpb25zKTtcblxuICAgICAgdmFsdWUgPSByZW5kZXIobGVmdCwgeyBhbGlhc2VzLCBlc2NhcGUsIHByZWZpeCwgcGFyc2VyLCBvcHRpb25zIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWVcbiAgICAgID8gYCR7dGhpcy5uYW1lfSgke3ZhbHVlfSwgJyR7dGhpcy50eXBlfScpYFxuICAgICAgOiBgJHt0aGlzLm5hbWV9KCcke3RoaXMudHlwZX0nKWA7XG4gIH1cblxuICBjbG9uZSgpIHtcbiAgICByZXR1cm4gbmV3IFR5cGUodGhpcy5uYW1lLCB0aGlzLnR5cGUsIE9iamVjdHMuY2xvbmUodGhpcy52YWx1ZSkpO1xuICB9XG5cbiAgcmVzb2x2ZShwYXJzZXI6IGFueSkge1xuICAgIHBhcnNlciA9XG4gICAgICBwYXJzZXIgaW5zdGFuY2VvZiBPRGF0YVN0cnVjdHVyZWRUeXBlRmllbGRQYXJzZXIgJiZcbiAgICAgIHBhcnNlci5pc1N0cnVjdHVyZWRUeXBlKClcbiAgICAgICAgPyBwYXJzZXIuc3RydWN0dXJlZFR5cGUoKVxuICAgICAgICA6IHBhcnNlcjtcbiAgICByZXR1cm4gcGFyc2VyPy5maW5kQ2hpbGRQYXJzZXIoKHA6IGFueSkgPT4gcC5pc1R5cGVPZih0aGlzLnR5cGUpKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTGFtYmRhPFQ+IGltcGxlbWVudHMgUmVuZGVyYWJsZSB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBvcDogc3RyaW5nLFxuICAgIHByb3RlY3RlZCB2YWx1ZXM6IGFueVtdLFxuICAgIHByb3RlY3RlZCBhbGlhcz86IHN0cmluZyxcbiAgKSB7fVxuXG4gIGdldCBbU3ltYm9sLnRvU3RyaW5nVGFnXSgpIHtcbiAgICByZXR1cm4gJ0xhbWJkYSc7XG4gIH1cblxuICB0b0pzb24oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICR0eXBlOiBUeXBlcy5yYXdUeXBlKHRoaXMpLFxuICAgICAgb3A6IHRoaXMub3AsXG4gICAgICB2YWx1ZXM6IHRoaXMudmFsdWVzLm1hcCgodikgPT5cbiAgICAgICAgVHlwZXMuaXNPYmplY3QodikgJiYgJ3RvSnNvbicgaW4gdiA/IHYudG9Kc29uKCkgOiB2LFxuICAgICAgKSxcbiAgICAgIGFsaWFzOiB0aGlzLmFsaWFzLFxuICAgIH07XG4gIH1cblxuICBzdGF0aWMgZnJvbUpzb248VD4oanNvbjogeyBbbmFtZTogc3RyaW5nXTogYW55IH0pOiBMYW1iZGE8VD4ge1xuICAgIHJldHVybiBuZXcgTGFtYmRhPFQ+KFxuICAgICAganNvblsnb3AnXSxcbiAgICAgIGpzb25bJ3ZhbHVlcyddLm1hcCgodjogYW55KSA9PiBSZW5kZXJhYmxlRmFjdG9yeSh2KSksXG4gICAgICBqc29uWydhbGlhcyddLFxuICAgICk7XG4gIH1cblxuICByZW5kZXIoe1xuICAgIGFsaWFzZXMsXG4gICAgZXNjYXBlLFxuICAgIHByZWZpeCxcbiAgICBwYXJzZXIsXG4gICAgb3B0aW9ucyxcbiAgfToge1xuICAgIGFsaWFzZXM/OiBRdWVyeUN1c3RvbVR5cGVbXTtcbiAgICBlc2NhcGU/OiBib29sZWFuO1xuICAgIHByZWZpeD86IHN0cmluZztcbiAgICBwYXJzZXI/OiBQYXJzZXI8VD47XG4gICAgb3B0aW9ucz86IFBhcnNlck9wdGlvbnM7XG4gIH0pOiBzdHJpbmcge1xuICAgIHBhcnNlciA9IHJlc29sdmUodGhpcy52YWx1ZXMsIHBhcnNlcik7XG4gICAgbGV0IFtsZWZ0LCByaWdodF0gPSBlbmNvZGUodGhpcy52YWx1ZXMsIHBhcnNlciwgb3B0aW9ucyk7XG5cbiAgICBsZWZ0ID0gcmVuZGVyKGxlZnQsIHsgYWxpYXNlcywgZXNjYXBlLCBwcmVmaXgsIHBhcnNlciB9KTtcbiAgICBpZiAocmlnaHQpIHtcbiAgICAgIGxldCBhbGlhcyA9IHRoaXMuYWxpYXMgfHwgbGVmdC5zcGxpdCgnLycpLnBvcCgpLnRvTG93ZXJDYXNlKClbMF07XG4gICAgICByZXR1cm4gYCR7bGVmdH0vJHt0aGlzLm9wfSgke2FsaWFzfToke3JlbmRlcihyaWdodCwge1xuICAgICAgICBhbGlhc2VzLFxuICAgICAgICBlc2NhcGUsXG4gICAgICAgIHByZWZpeDogYWxpYXMsXG4gICAgICAgIG9wdGlvbnMsXG4gICAgICAgIHBhcnNlcixcbiAgICAgIH0pfSlgO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYCR7bGVmdH0vJHt0aGlzLm9wfSgpYDtcbiAgICB9XG4gIH1cblxuICBjbG9uZSgpIHtcbiAgICByZXR1cm4gbmV3IExhbWJkYShcbiAgICAgIHRoaXMub3AsXG4gICAgICB0aGlzLnZhbHVlcy5tYXAoKHYpID0+IE9iamVjdHMuY2xvbmUodikpLFxuICAgICAgdGhpcy5hbGlhcyxcbiAgICApO1xuICB9XG4gIHJlc29sdmUocGFyc2VyOiBhbnkpIHtcbiAgICByZXR1cm4gcGFyc2VyO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBMYW1iZGFPcGVyYXRvcnM8VD4ge1xuICBhbnkobGVmdDogVCwgcmlnaHQ6IGFueSwgYWxpYXM/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gbmV3IExhbWJkYSgnYW55JywgW2xlZnQsIHJpZ2h0XSwgYWxpYXMpO1xuICB9XG5cbiAgYWxsKGxlZnQ6IFQsIHJpZ2h0OiBhbnksIGFsaWFzPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIG5ldyBMYW1iZGEoJ2FsbCcsIFtsZWZ0LCByaWdodF0sIGFsaWFzKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgT0RhdGFPcGVyYXRvcnM8VD4ge31cbmV4cG9ydCBpbnRlcmZhY2UgT0RhdGFPcGVyYXRvcnM8VD5cbiAgZXh0ZW5kcyBMb2dpY2FsT3BlcmF0b3JzPFQ+LFxuICAgIEFyaXRobWV0aWNPcGVyYXRvcnM8VD4sXG4gICAgR3JvdXBpbmdPcGVyYXRvcnM8VD4sXG4gICAgTGFtYmRhT3BlcmF0b3JzPFQ+IHt9XG5cbmFwcGx5TWl4aW5zKE9EYXRhT3BlcmF0b3JzLCBbXG4gIExvZ2ljYWxPcGVyYXRvcnMsXG4gIEFyaXRobWV0aWNPcGVyYXRvcnMsXG4gIEdyb3VwaW5nT3BlcmF0b3JzLFxuICBMYW1iZGFPcGVyYXRvcnMsXG5dKTtcbmV4cG9ydCBjb25zdCBvcGVyYXRvcnM6IE9EYXRhT3BlcmF0b3JzPGFueT4gPSBuZXcgT0RhdGFPcGVyYXRvcnM8YW55PigpO1xuXG5leHBvcnQgY2xhc3MgT0RhdGFGdW5jdGlvbnM8VD4ge31cbmV4cG9ydCBpbnRlcmZhY2UgT0RhdGFGdW5jdGlvbnM8VD5cbiAgZXh0ZW5kcyBTdHJpbmdBbmRDb2xsZWN0aW9uRnVuY3Rpb25zPFQ+LFxuICAgIENvbGxlY3Rpb25GdW5jdGlvbnM8VD4sXG4gICAgU3RyaW5nRnVuY3Rpb25zPFQ+LFxuICAgIERhdGVBbmRUaW1lRnVuY3Rpb25zPFQ+LFxuICAgIEFyaXRobWV0aWNGdW5jdGlvbnM8VD4sXG4gICAgVHlwZUZ1bmN0aW9uczxUPixcbiAgICBHZW9GdW5jdGlvbnM8VD4sXG4gICAgQ29uZGl0aW9uYWxGdW5jdGlvbnM8VD4ge31cblxuYXBwbHlNaXhpbnMoT0RhdGFGdW5jdGlvbnMsIFtcbiAgU3RyaW5nQW5kQ29sbGVjdGlvbkZ1bmN0aW9ucyxcbiAgQ29sbGVjdGlvbkZ1bmN0aW9ucyxcbiAgU3RyaW5nRnVuY3Rpb25zLFxuICBEYXRlQW5kVGltZUZ1bmN0aW9ucyxcbiAgQXJpdGhtZXRpY0Z1bmN0aW9ucyxcbiAgVHlwZUZ1bmN0aW9ucyxcbiAgR2VvRnVuY3Rpb25zLFxuICBDb25kaXRpb25hbEZ1bmN0aW9ucyxcbl0pO1xuZXhwb3J0IGNvbnN0IGZ1bmN0aW9uczogT0RhdGFGdW5jdGlvbnM8YW55PiA9IG5ldyBPRGF0YUZ1bmN0aW9uczxhbnk+KCk7XG5cbmV4cG9ydCBjbGFzcyBPRGF0YVRyYW5zZm9ybWF0aW9uczxUPiB7fVxuZXhwb3J0IGludGVyZmFjZSBPRGF0YVRyYW5zZm9ybWF0aW9uczxUPiBleHRlbmRzIFRyYW5zZm9ybWF0aW9uczxUPiB7fVxuXG5hcHBseU1peGlucyhPRGF0YVRyYW5zZm9ybWF0aW9ucywgW1RyYW5zZm9ybWF0aW9uc10pO1xuZXhwb3J0IGNvbnN0IHRyYW5zZm9ybWF0aW9uczogT0RhdGFUcmFuc2Zvcm1hdGlvbnM8YW55PiA9XG4gIG5ldyBPRGF0YVRyYW5zZm9ybWF0aW9uczxhbnk+KCk7XG5cbmV4cG9ydCBjbGFzcyBPRGF0YVN5bnRheDxUPiB7fVxuZXhwb3J0IGludGVyZmFjZSBPRGF0YVN5bnRheDxUPlxuICBleHRlbmRzIE9EYXRhT3BlcmF0b3JzPFQ+LFxuICAgIE9EYXRhRnVuY3Rpb25zPFQ+LFxuICAgIE9EYXRhVHJhbnNmb3JtYXRpb25zPFQ+IHt9XG5hcHBseU1peGlucyhPRGF0YVN5bnRheCwgW1xuICBPRGF0YU9wZXJhdG9ycyxcbiAgT0RhdGFGdW5jdGlvbnMsXG4gIE9EYXRhVHJhbnNmb3JtYXRpb25zLFxuXSk7XG5cbmV4cG9ydCBjb25zdCBzeW50YXg6IE9EYXRhU3ludGF4PGFueT4gPSBuZXcgT0RhdGFTeW50YXg8YW55PigpO1xuIl19
|