@plumile/backoffice-core 0.1.200 → 0.1.205
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/README.md +3 -1
- package/lib/esm/builders.d.ts +11 -5
- package/lib/esm/builders.d.ts.map +1 -1
- package/lib/esm/builders.js +1 -1
- package/lib/esm/config/entity-builders.d.ts +3 -3
- package/lib/esm/config/entity-builders.d.ts.map +1 -1
- package/lib/esm/config/entity-builders.js +3 -5
- package/lib/esm/detailParams.d.ts +8 -2
- package/lib/esm/detailParams.d.ts.map +1 -1
- package/lib/esm/detailParams.js +3 -3
- package/lib/esm/index.d.ts +1 -0
- package/lib/esm/index.d.ts.map +1 -1
- package/lib/esm/index.js +1 -1
- package/lib/esm/resolve.d.ts +2 -1
- package/lib/esm/resolve.d.ts.map +1 -1
- package/lib/esm/resolve.js +1 -1
- package/lib/esm/runtimeErasure.d.ts +2 -0
- package/lib/esm/runtimeErasure.d.ts.map +1 -0
- package/lib/esm/runtimeErasure.js +2 -0
- package/lib/esm/types.d.ts +27 -24
- package/lib/esm/types.d.ts.map +1 -1
- package/lib/esm/types.js +1 -1
- package/lib/tsconfig.esm.tsbuildinfo +1 -1
- package/lib/types/builders.d.ts +11 -5
- package/lib/types/builders.d.ts.map +1 -1
- package/lib/types/config/entity-builders.d.ts +3 -3
- package/lib/types/config/entity-builders.d.ts.map +1 -1
- package/lib/types/detailParams.d.ts +8 -2
- package/lib/types/detailParams.d.ts.map +1 -1
- package/lib/types/index.d.ts +1 -0
- package/lib/types/index.d.ts.map +1 -1
- package/lib/types/resolve.d.ts +2 -1
- package/lib/types/resolve.d.ts.map +1 -1
- package/lib/types/runtimeErasure.d.ts +2 -0
- package/lib/types/runtimeErasure.d.ts.map +1 -0
- package/lib/types/types.d.ts +27 -24
- package/lib/types/types.d.ts.map +1 -1
- package/package.json +3 -3
- package/lib/esm/type-tests/operation-bound-config.test-d.d.ts +0 -50
- package/lib/esm/type-tests/operation-bound-config.test-d.d.ts.map +0 -1
- package/lib/esm/type-tests/operation-bound-config.test-d.js +0 -666
- package/lib/types/type-tests/operation-bound-config.test-d.d.ts +0 -50
- package/lib/types/type-tests/operation-bound-config.test-d.d.ts.map +0 -1
|
@@ -1,666 +0,0 @@
|
|
|
1
|
-
import { defineSchema, stringField } from '@plumile/filter-query/schema.js';
|
|
2
|
-
import { createListDetailManifest, defineBackofficeConnectionList, defineBackofficeDashboardConfig, defineBackofficeDashboardHrefTarget, defineBackofficeDashboardListTarget, defineBackofficeDashboardQueryWidget, defineBackofficeDashboardStaticWidget, defineBackofficeFormMutationAction, defineBackofficeFilters, defineBackofficeMutationAction, defineBackofficePicker, defineBackofficeRelationFilter, defineBackofficeSorts, datetimeFilter, entityIdFilter, enumFilter, numberFilter, } from '../builders.js';
|
|
3
|
-
import { defineBackofficeListNavigation } from '../state/listNavigation.js';
|
|
4
|
-
const label = (t) => {
|
|
5
|
-
return t('common.label');
|
|
6
|
-
};
|
|
7
|
-
const testListQuerySchema = defineSchema({
|
|
8
|
-
projectId: stringField(['eq']),
|
|
9
|
-
kind: stringField(['eq']),
|
|
10
|
-
});
|
|
11
|
-
const testListNavigation = defineBackofficeListNavigation()({
|
|
12
|
-
defaults: { where: null, sort: 'CREATED_AT_DESC' },
|
|
13
|
-
filterSchema: {
|
|
14
|
-
schema: testListQuerySchema,
|
|
15
|
-
toWhere: (filters) => {
|
|
16
|
-
const rawKind = filters.kind?.eq;
|
|
17
|
-
let kind;
|
|
18
|
-
if (rawKind === 'A' || rawKind === 'B') {
|
|
19
|
-
kind = rawKind;
|
|
20
|
-
}
|
|
21
|
-
return {
|
|
22
|
-
projectId: filters.projectId?.eq,
|
|
23
|
-
kind,
|
|
24
|
-
};
|
|
25
|
-
},
|
|
26
|
-
fromWhere: (where) => {
|
|
27
|
-
return {
|
|
28
|
-
projectId: { eq: where?.projectId ?? undefined },
|
|
29
|
-
kind: { eq: where?.kind ?? undefined },
|
|
30
|
-
};
|
|
31
|
-
},
|
|
32
|
-
},
|
|
33
|
-
sortIds: ['CREATED_AT_ASC', 'CREATED_AT_DESC'],
|
|
34
|
-
});
|
|
35
|
-
testListNavigation.encode({
|
|
36
|
-
where: { projectId: 'project-1', kind: 'A' },
|
|
37
|
-
sort: 'CREATED_AT_ASC',
|
|
38
|
-
});
|
|
39
|
-
testListNavigation.encode({
|
|
40
|
-
where: { status: 'OPEN' },
|
|
41
|
-
});
|
|
42
|
-
testListNavigation.decode({
|
|
43
|
-
filters: { missing: { eq: 'value' } },
|
|
44
|
-
});
|
|
45
|
-
const typedListManifest = createListDetailManifest({
|
|
46
|
-
id: 'tasks',
|
|
47
|
-
routeSegment: 'tasks',
|
|
48
|
-
label,
|
|
49
|
-
routes: {
|
|
50
|
-
list: '/tasks',
|
|
51
|
-
detail: (id) => {
|
|
52
|
-
return `/tasks/${id}`;
|
|
53
|
-
},
|
|
54
|
-
detailPage: (id, pageId) => {
|
|
55
|
-
return `/tasks/${id}/${pageId}`;
|
|
56
|
-
},
|
|
57
|
-
},
|
|
58
|
-
hasList: true,
|
|
59
|
-
listNavigation: testListNavigation,
|
|
60
|
-
detailPages: [
|
|
61
|
-
{
|
|
62
|
-
id: 'overview',
|
|
63
|
-
pathSegment: 'overview',
|
|
64
|
-
label,
|
|
65
|
-
isDefault: true,
|
|
66
|
-
},
|
|
67
|
-
],
|
|
68
|
-
defaultDetailPageId: 'overview',
|
|
69
|
-
facets: {
|
|
70
|
-
list: async () => {
|
|
71
|
-
throw new Error('type test');
|
|
72
|
-
},
|
|
73
|
-
detailLayout: async () => {
|
|
74
|
-
throw new Error('type test');
|
|
75
|
-
},
|
|
76
|
-
detailPage: async () => {
|
|
77
|
-
throw new Error('type test');
|
|
78
|
-
},
|
|
79
|
-
},
|
|
80
|
-
});
|
|
81
|
-
const runtimeListManifest = typedListManifest;
|
|
82
|
-
export const runtimeListManifestId = runtimeListManifest.id;
|
|
83
|
-
export const typedListState = {
|
|
84
|
-
where: { projectId: 'project-1' },
|
|
85
|
-
sort: 'CREATED_AT_ASC',
|
|
86
|
-
};
|
|
87
|
-
export const invalidTypedListState = {
|
|
88
|
-
where: { status: 'OPEN' },
|
|
89
|
-
};
|
|
90
|
-
export const runtimeListState = {
|
|
91
|
-
where: { status: 'OPEN' },
|
|
92
|
-
sort: 'CREATED_AT_DESC',
|
|
93
|
-
};
|
|
94
|
-
createListDetailManifest({
|
|
95
|
-
id: 'tasks',
|
|
96
|
-
routeSegment: 'tasks',
|
|
97
|
-
label,
|
|
98
|
-
routes: {
|
|
99
|
-
list: '/tasks',
|
|
100
|
-
detail: (id) => {
|
|
101
|
-
return `/tasks/${id}`;
|
|
102
|
-
},
|
|
103
|
-
detailPage: (id, pageId) => {
|
|
104
|
-
return `/tasks/${id}/${pageId}`;
|
|
105
|
-
},
|
|
106
|
-
},
|
|
107
|
-
hasList: true,
|
|
108
|
-
detailPages: typedListManifest.detailPages,
|
|
109
|
-
defaultDetailPageId: typedListManifest.defaultDetailPageId,
|
|
110
|
-
facets: {
|
|
111
|
-
list: typedListManifest.facets.list,
|
|
112
|
-
detailLayout: async () => {
|
|
113
|
-
throw new Error('type test');
|
|
114
|
-
},
|
|
115
|
-
detailPage: async () => {
|
|
116
|
-
throw new Error('type test');
|
|
117
|
-
},
|
|
118
|
-
},
|
|
119
|
-
});
|
|
120
|
-
createListDetailManifest({
|
|
121
|
-
...typedListManifest,
|
|
122
|
-
listNavigation: { kind: 'list-navigation' },
|
|
123
|
-
});
|
|
124
|
-
createListDetailManifest({
|
|
125
|
-
...typedListManifest,
|
|
126
|
-
detailPages: [],
|
|
127
|
-
});
|
|
128
|
-
createListDetailManifest({
|
|
129
|
-
...typedListManifest,
|
|
130
|
-
facets: {
|
|
131
|
-
detailLayout: typedListManifest.facets.detailLayout,
|
|
132
|
-
detailPage: typedListManifest.facets.detailPage,
|
|
133
|
-
},
|
|
134
|
-
});
|
|
135
|
-
createListDetailManifest({
|
|
136
|
-
...typedListManifest,
|
|
137
|
-
facets: {
|
|
138
|
-
list: typedListManifest.facets.list,
|
|
139
|
-
detailPage: typedListManifest.facets.detailPage,
|
|
140
|
-
},
|
|
141
|
-
});
|
|
142
|
-
createListDetailManifest({
|
|
143
|
-
...typedListManifest,
|
|
144
|
-
facets: {
|
|
145
|
-
list: typedListManifest.facets.list,
|
|
146
|
-
detailLayout: typedListManifest.facets.detailLayout,
|
|
147
|
-
},
|
|
148
|
-
});
|
|
149
|
-
defineBackofficeFormMutationAction()({
|
|
150
|
-
id: 'create-organization',
|
|
151
|
-
kind: 'formMutation',
|
|
152
|
-
label,
|
|
153
|
-
mutation: {},
|
|
154
|
-
fields: [],
|
|
155
|
-
getVariables: (_node, values) => {
|
|
156
|
-
return {
|
|
157
|
-
input: {
|
|
158
|
-
name: values.name,
|
|
159
|
-
currency: values.currency,
|
|
160
|
-
},
|
|
161
|
-
};
|
|
162
|
-
},
|
|
163
|
-
toasts: {
|
|
164
|
-
success: {
|
|
165
|
-
title: label,
|
|
166
|
-
view: {
|
|
167
|
-
entityId: 'organizations',
|
|
168
|
-
getTargetId: (response) => {
|
|
169
|
-
return response.createOrganization.organization?.id ?? null;
|
|
170
|
-
},
|
|
171
|
-
},
|
|
172
|
-
},
|
|
173
|
-
},
|
|
174
|
-
});
|
|
175
|
-
defineBackofficeFormMutationAction()({
|
|
176
|
-
id: 'missing-currency',
|
|
177
|
-
kind: 'formMutation',
|
|
178
|
-
label,
|
|
179
|
-
mutation: {},
|
|
180
|
-
fields: [],
|
|
181
|
-
getVariables: (_node, values) => {
|
|
182
|
-
return {
|
|
183
|
-
input: {
|
|
184
|
-
name: values.name,
|
|
185
|
-
},
|
|
186
|
-
};
|
|
187
|
-
},
|
|
188
|
-
});
|
|
189
|
-
defineBackofficeFormMutationAction()({
|
|
190
|
-
id: 'invalid-currency',
|
|
191
|
-
kind: 'formMutation',
|
|
192
|
-
label,
|
|
193
|
-
mutation: {},
|
|
194
|
-
fields: [],
|
|
195
|
-
getVariables: (_node, values) => {
|
|
196
|
-
return {
|
|
197
|
-
input: {
|
|
198
|
-
name: values.name,
|
|
199
|
-
currency: values.currency,
|
|
200
|
-
},
|
|
201
|
-
};
|
|
202
|
-
},
|
|
203
|
-
});
|
|
204
|
-
defineBackofficeMutationAction()({
|
|
205
|
-
id: 'archive',
|
|
206
|
-
kind: 'mutation',
|
|
207
|
-
label,
|
|
208
|
-
mutation: {},
|
|
209
|
-
getVariables: (node) => {
|
|
210
|
-
return {
|
|
211
|
-
id: node.id,
|
|
212
|
-
};
|
|
213
|
-
},
|
|
214
|
-
});
|
|
215
|
-
defineBackofficeMutationAction()({
|
|
216
|
-
id: 'archive-missing-id',
|
|
217
|
-
kind: 'mutation',
|
|
218
|
-
label,
|
|
219
|
-
mutation: {},
|
|
220
|
-
getVariables: () => {
|
|
221
|
-
return {};
|
|
222
|
-
},
|
|
223
|
-
});
|
|
224
|
-
export const responsiveMeta = {
|
|
225
|
-
id: 'state',
|
|
226
|
-
label,
|
|
227
|
-
value: 'ready',
|
|
228
|
-
};
|
|
229
|
-
export const invalidResponsiveMeta = {
|
|
230
|
-
id: 'state',
|
|
231
|
-
label: 'State',
|
|
232
|
-
value: 'ready',
|
|
233
|
-
};
|
|
234
|
-
export const titleMeta = {
|
|
235
|
-
id: 'state',
|
|
236
|
-
label,
|
|
237
|
-
value: 'ready',
|
|
238
|
-
};
|
|
239
|
-
export const invalidTitleMeta = {
|
|
240
|
-
id: 'state',
|
|
241
|
-
label: 'State',
|
|
242
|
-
value: 'ready',
|
|
243
|
-
};
|
|
244
|
-
const filters = defineBackofficeFilters()([
|
|
245
|
-
entityIdFilter('projectId', {
|
|
246
|
-
entity: 'projects',
|
|
247
|
-
label,
|
|
248
|
-
}),
|
|
249
|
-
enumFilter('kind', {
|
|
250
|
-
label,
|
|
251
|
-
options: ['A', 'B'],
|
|
252
|
-
}),
|
|
253
|
-
numberFilter('attempt', {
|
|
254
|
-
label,
|
|
255
|
-
}),
|
|
256
|
-
datetimeFilter('createdFrom', {
|
|
257
|
-
label,
|
|
258
|
-
mode: 'from',
|
|
259
|
-
}),
|
|
260
|
-
]);
|
|
261
|
-
defineBackofficeSorts()([{ id: 'CREATED_AT_DESC', label }]);
|
|
262
|
-
defineBackofficeConnectionList()({
|
|
263
|
-
title: label,
|
|
264
|
-
query: {},
|
|
265
|
-
fragment: {},
|
|
266
|
-
count: {
|
|
267
|
-
query: {},
|
|
268
|
-
buildVariables: ({ where }) => {
|
|
269
|
-
return { where };
|
|
270
|
-
},
|
|
271
|
-
getCount: (data) => {
|
|
272
|
-
return data.rowsCount;
|
|
273
|
-
},
|
|
274
|
-
},
|
|
275
|
-
filters,
|
|
276
|
-
sorts: defineBackofficeSorts()([
|
|
277
|
-
{ id: 'CREATED_AT_ASC', label },
|
|
278
|
-
]),
|
|
279
|
-
defaultState: {
|
|
280
|
-
where: { projectId: 'project-1' },
|
|
281
|
-
sort: 'CREATED_AT_DESC',
|
|
282
|
-
},
|
|
283
|
-
getConnection: () => {
|
|
284
|
-
return { edges: [] };
|
|
285
|
-
},
|
|
286
|
-
toRow: (row) => {
|
|
287
|
-
return row;
|
|
288
|
-
},
|
|
289
|
-
getRowId: () => {
|
|
290
|
-
return 'row';
|
|
291
|
-
},
|
|
292
|
-
columns: [],
|
|
293
|
-
});
|
|
294
|
-
defineBackofficePicker()({
|
|
295
|
-
query: {},
|
|
296
|
-
fragment: {},
|
|
297
|
-
getConnection: () => {
|
|
298
|
-
return { edges: [] };
|
|
299
|
-
},
|
|
300
|
-
toRow: () => {
|
|
301
|
-
return { id: 'row', title: 'Row' };
|
|
302
|
-
},
|
|
303
|
-
getRowId: (row) => {
|
|
304
|
-
return row.id;
|
|
305
|
-
},
|
|
306
|
-
buildQueryVariables: ({ scope }) => {
|
|
307
|
-
return {
|
|
308
|
-
where: {
|
|
309
|
-
organizationId: scope?.organizationId,
|
|
310
|
-
},
|
|
311
|
-
count: 20,
|
|
312
|
-
cursor: null,
|
|
313
|
-
};
|
|
314
|
-
},
|
|
315
|
-
});
|
|
316
|
-
defineBackofficeDashboardConfig({
|
|
317
|
-
title: label,
|
|
318
|
-
widgets: [
|
|
319
|
-
defineBackofficeDashboardQueryWidget()({
|
|
320
|
-
id: 'users',
|
|
321
|
-
kind: 'metricGroup',
|
|
322
|
-
query: {},
|
|
323
|
-
variables: {},
|
|
324
|
-
resolve: (data) => {
|
|
325
|
-
return [
|
|
326
|
-
{
|
|
327
|
-
id: 'users',
|
|
328
|
-
label,
|
|
329
|
-
value: data.users.totalCount,
|
|
330
|
-
target: defineBackofficeDashboardListTarget()({
|
|
331
|
-
entityId: 'tasks',
|
|
332
|
-
state: {
|
|
333
|
-
where: { kind: 'A' },
|
|
334
|
-
sort: 'CREATED_AT_DESC',
|
|
335
|
-
},
|
|
336
|
-
}),
|
|
337
|
-
},
|
|
338
|
-
];
|
|
339
|
-
},
|
|
340
|
-
}),
|
|
341
|
-
defineBackofficeDashboardStaticWidget({
|
|
342
|
-
id: 'window',
|
|
343
|
-
kind: 'windowControl',
|
|
344
|
-
title: label,
|
|
345
|
-
}),
|
|
346
|
-
defineBackofficeDashboardQueryWidget()({
|
|
347
|
-
id: 'throughput',
|
|
348
|
-
kind: 'trendMetric',
|
|
349
|
-
query: {},
|
|
350
|
-
variables: ({ window }) => {
|
|
351
|
-
return {
|
|
352
|
-
from: window.from,
|
|
353
|
-
to: window.to,
|
|
354
|
-
severity: 'A',
|
|
355
|
-
};
|
|
356
|
-
},
|
|
357
|
-
resolve: (data) => {
|
|
358
|
-
return {
|
|
359
|
-
label,
|
|
360
|
-
value: data.throughputCount,
|
|
361
|
-
delta: {
|
|
362
|
-
value: 12,
|
|
363
|
-
direction: 'up',
|
|
364
|
-
tone: 'success',
|
|
365
|
-
label,
|
|
366
|
-
},
|
|
367
|
-
sparkline: [{ x: '2026-01-01T00:00:00.000Z', y: 1 }],
|
|
368
|
-
target: defineBackofficeDashboardListTarget()({
|
|
369
|
-
entityId: 'tasks',
|
|
370
|
-
state: {
|
|
371
|
-
where: { kind: 'A' },
|
|
372
|
-
sort: 'CREATED_AT_DESC',
|
|
373
|
-
},
|
|
374
|
-
}),
|
|
375
|
-
};
|
|
376
|
-
},
|
|
377
|
-
}),
|
|
378
|
-
defineBackofficeDashboardQueryWidget()({
|
|
379
|
-
id: 'failure-rate',
|
|
380
|
-
kind: 'slaGauge',
|
|
381
|
-
query: {},
|
|
382
|
-
variables: ({ window }) => {
|
|
383
|
-
return { from: window.from, to: window.to };
|
|
384
|
-
},
|
|
385
|
-
resolve: (data) => {
|
|
386
|
-
return {
|
|
387
|
-
label,
|
|
388
|
-
value: data.failureRate,
|
|
389
|
-
max: 1,
|
|
390
|
-
threshold: 0.05,
|
|
391
|
-
unit: '%',
|
|
392
|
-
tone: 'warning',
|
|
393
|
-
};
|
|
394
|
-
},
|
|
395
|
-
}),
|
|
396
|
-
defineBackofficeDashboardQueryWidget()({
|
|
397
|
-
id: 'top-failures',
|
|
398
|
-
kind: 'breakdownList',
|
|
399
|
-
query: {},
|
|
400
|
-
variables: ({ window }) => {
|
|
401
|
-
return { from: window.from, to: window.to };
|
|
402
|
-
},
|
|
403
|
-
resolve: (data) => {
|
|
404
|
-
return data.topFailures.map((failure) => {
|
|
405
|
-
return {
|
|
406
|
-
id: failure.id,
|
|
407
|
-
label: () => {
|
|
408
|
-
return failure.label;
|
|
409
|
-
},
|
|
410
|
-
value: failure.count,
|
|
411
|
-
tone: 'danger',
|
|
412
|
-
};
|
|
413
|
-
});
|
|
414
|
-
},
|
|
415
|
-
}),
|
|
416
|
-
defineBackofficeDashboardQueryWidget()({
|
|
417
|
-
id: 'timeline',
|
|
418
|
-
kind: 'timelineChart',
|
|
419
|
-
query: {},
|
|
420
|
-
variables: ({ window }) => {
|
|
421
|
-
return { from: window.from, to: window.to };
|
|
422
|
-
},
|
|
423
|
-
ariaLabel: label,
|
|
424
|
-
chart: 'bar',
|
|
425
|
-
resolve: (data) => {
|
|
426
|
-
return {
|
|
427
|
-
series: [
|
|
428
|
-
{
|
|
429
|
-
id: 'throughput',
|
|
430
|
-
label,
|
|
431
|
-
color: '#2563eb',
|
|
432
|
-
data: data.buckets.map((bucket) => {
|
|
433
|
-
return {
|
|
434
|
-
x: bucket.bucket,
|
|
435
|
-
y: bucket.count,
|
|
436
|
-
};
|
|
437
|
-
}),
|
|
438
|
-
},
|
|
439
|
-
],
|
|
440
|
-
};
|
|
441
|
-
},
|
|
442
|
-
}),
|
|
443
|
-
defineBackofficeDashboardQueryWidget()({
|
|
444
|
-
id: 'risk-queue',
|
|
445
|
-
kind: 'riskQueue',
|
|
446
|
-
query: {},
|
|
447
|
-
variables: ({ window }) => {
|
|
448
|
-
return { from: window.from, to: window.to };
|
|
449
|
-
},
|
|
450
|
-
resolve: () => {
|
|
451
|
-
return [
|
|
452
|
-
{
|
|
453
|
-
id: 'dead-outbox',
|
|
454
|
-
label,
|
|
455
|
-
severity: 'danger',
|
|
456
|
-
value: 4,
|
|
457
|
-
},
|
|
458
|
-
];
|
|
459
|
-
},
|
|
460
|
-
}),
|
|
461
|
-
defineBackofficeDashboardQueryWidget()({
|
|
462
|
-
id: 'spotlight',
|
|
463
|
-
kind: 'entitySpotlight',
|
|
464
|
-
query: {},
|
|
465
|
-
variables: ({ window }) => {
|
|
466
|
-
return { from: window.from, to: window.to };
|
|
467
|
-
},
|
|
468
|
-
resolve: () => {
|
|
469
|
-
return {
|
|
470
|
-
label,
|
|
471
|
-
title: label,
|
|
472
|
-
tone: 'info',
|
|
473
|
-
meta: [{ id: 'age', label, value: '45 min' }],
|
|
474
|
-
};
|
|
475
|
-
},
|
|
476
|
-
}),
|
|
477
|
-
defineBackofficeDashboardQueryWidget()({
|
|
478
|
-
id: 'health',
|
|
479
|
-
kind: 'healthMatrix',
|
|
480
|
-
query: {},
|
|
481
|
-
variables: ({ window }) => {
|
|
482
|
-
return { from: window.from, to: window.to };
|
|
483
|
-
},
|
|
484
|
-
resolve: () => {
|
|
485
|
-
return [
|
|
486
|
-
{
|
|
487
|
-
id: 'work',
|
|
488
|
-
label,
|
|
489
|
-
cells: [
|
|
490
|
-
{
|
|
491
|
-
id: 'tasks',
|
|
492
|
-
label,
|
|
493
|
-
value: 2,
|
|
494
|
-
tone: 'warning',
|
|
495
|
-
},
|
|
496
|
-
],
|
|
497
|
-
},
|
|
498
|
-
];
|
|
499
|
-
},
|
|
500
|
-
}),
|
|
501
|
-
defineBackofficeDashboardStaticWidget({
|
|
502
|
-
id: 'actions',
|
|
503
|
-
kind: 'quickActions',
|
|
504
|
-
actions: [
|
|
505
|
-
{
|
|
506
|
-
id: 'users',
|
|
507
|
-
label,
|
|
508
|
-
target: defineBackofficeDashboardHrefTarget('/users'),
|
|
509
|
-
},
|
|
510
|
-
],
|
|
511
|
-
}),
|
|
512
|
-
],
|
|
513
|
-
});
|
|
514
|
-
defineBackofficeDashboardQueryWidget()({
|
|
515
|
-
id: 'invalid-users',
|
|
516
|
-
kind: 'metricGroup',
|
|
517
|
-
query: {},
|
|
518
|
-
variables: {},
|
|
519
|
-
resolve: (data) => {
|
|
520
|
-
return [
|
|
521
|
-
{
|
|
522
|
-
id: 'users',
|
|
523
|
-
label,
|
|
524
|
-
value: data.projects.totalCount,
|
|
525
|
-
},
|
|
526
|
-
];
|
|
527
|
-
},
|
|
528
|
-
});
|
|
529
|
-
defineBackofficeDashboardQueryWidget()({
|
|
530
|
-
id: 'invalid-window-variables',
|
|
531
|
-
kind: 'trendMetric',
|
|
532
|
-
query: {},
|
|
533
|
-
variables: ({ window }) => {
|
|
534
|
-
return {
|
|
535
|
-
from: window.from,
|
|
536
|
-
};
|
|
537
|
-
},
|
|
538
|
-
resolve: (data) => {
|
|
539
|
-
return {
|
|
540
|
-
label,
|
|
541
|
-
value: data.throughputCount,
|
|
542
|
-
};
|
|
543
|
-
},
|
|
544
|
-
});
|
|
545
|
-
defineBackofficeDashboardListTarget()({
|
|
546
|
-
entityId: 'tasks',
|
|
547
|
-
state: {
|
|
548
|
-
where: { organizationId: 'org-1' },
|
|
549
|
-
},
|
|
550
|
-
});
|
|
551
|
-
defineBackofficeDashboardListTarget()({
|
|
552
|
-
entityId: 'tasks',
|
|
553
|
-
state: {
|
|
554
|
-
sort: 'UPDATED_AT_DESC',
|
|
555
|
-
},
|
|
556
|
-
});
|
|
557
|
-
export const invalidDashboardConfig = {
|
|
558
|
-
title: label,
|
|
559
|
-
query: {},
|
|
560
|
-
widgets: [],
|
|
561
|
-
};
|
|
562
|
-
defineBackofficeDashboardQueryWidget()({
|
|
563
|
-
id: 'missing-query',
|
|
564
|
-
kind: 'metricGroup',
|
|
565
|
-
variables: {},
|
|
566
|
-
resolve: (data) => {
|
|
567
|
-
return [
|
|
568
|
-
{
|
|
569
|
-
id: 'users',
|
|
570
|
-
label,
|
|
571
|
-
value: data.users.totalCount,
|
|
572
|
-
},
|
|
573
|
-
];
|
|
574
|
-
},
|
|
575
|
-
});
|
|
576
|
-
defineBackofficeRelationFilter()({
|
|
577
|
-
target: 'projects',
|
|
578
|
-
whereKey: 'projectId',
|
|
579
|
-
});
|
|
580
|
-
defineBackofficeRelationFilter()({
|
|
581
|
-
target: 'projects',
|
|
582
|
-
whereKey: 'organizationId',
|
|
583
|
-
});
|
|
584
|
-
defineBackofficeFilters()([
|
|
585
|
-
entityIdFilter('missingField', {
|
|
586
|
-
entity: 'projects',
|
|
587
|
-
label,
|
|
588
|
-
}),
|
|
589
|
-
]);
|
|
590
|
-
defineBackofficeFilters()([
|
|
591
|
-
enumFilter('kind', {
|
|
592
|
-
label,
|
|
593
|
-
options: [
|
|
594
|
-
'A',
|
|
595
|
-
'C',
|
|
596
|
-
],
|
|
597
|
-
}),
|
|
598
|
-
]);
|
|
599
|
-
defineBackofficeFilters()([
|
|
600
|
-
numberFilter('kind', {
|
|
601
|
-
label,
|
|
602
|
-
}),
|
|
603
|
-
]);
|
|
604
|
-
defineBackofficeFilters()([
|
|
605
|
-
datetimeFilter('attempt', {
|
|
606
|
-
label,
|
|
607
|
-
}),
|
|
608
|
-
]);
|
|
609
|
-
defineBackofficeSorts()([
|
|
610
|
-
{ id: 'UPDATED_AT_DESC', label },
|
|
611
|
-
]);
|
|
612
|
-
defineBackofficeConnectionList()({
|
|
613
|
-
title: label,
|
|
614
|
-
query: {},
|
|
615
|
-
fragment: {},
|
|
616
|
-
count: {
|
|
617
|
-
query: {},
|
|
618
|
-
buildVariables: ({ where }) => {
|
|
619
|
-
return { where };
|
|
620
|
-
},
|
|
621
|
-
getCount: (data) => {
|
|
622
|
-
return data.rowsCount;
|
|
623
|
-
},
|
|
624
|
-
},
|
|
625
|
-
filters,
|
|
626
|
-
sorts: defineBackofficeSorts()([
|
|
627
|
-
{ id: 'CREATED_AT_ASC', label },
|
|
628
|
-
]),
|
|
629
|
-
defaultState: {
|
|
630
|
-
where: { organizationId: 'org-1' },
|
|
631
|
-
sort: 'CREATED_AT_ASC',
|
|
632
|
-
},
|
|
633
|
-
getConnection: () => {
|
|
634
|
-
return { edges: [] };
|
|
635
|
-
},
|
|
636
|
-
toRow: (row) => {
|
|
637
|
-
return row;
|
|
638
|
-
},
|
|
639
|
-
getRowId: () => {
|
|
640
|
-
return 'row';
|
|
641
|
-
},
|
|
642
|
-
columns: [],
|
|
643
|
-
});
|
|
644
|
-
defineBackofficePicker()({
|
|
645
|
-
query: {},
|
|
646
|
-
fragment: {},
|
|
647
|
-
getConnection: () => {
|
|
648
|
-
return { edges: [] };
|
|
649
|
-
},
|
|
650
|
-
toRow: () => {
|
|
651
|
-
return { id: 'row', title: 'Row' };
|
|
652
|
-
},
|
|
653
|
-
getRowId: (row) => {
|
|
654
|
-
return row.id;
|
|
655
|
-
},
|
|
656
|
-
buildQueryVariables: ({ scope }) => {
|
|
657
|
-
return {
|
|
658
|
-
where: {
|
|
659
|
-
projectId: scope?.projectId,
|
|
660
|
-
},
|
|
661
|
-
count: 20,
|
|
662
|
-
cursor: null,
|
|
663
|
-
};
|
|
664
|
-
},
|
|
665
|
-
});
|
|
666
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlcmF0aW9uLWJvdW5kLWNvbmZpZy50ZXN0LWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdHlwZS10ZXN0cy9vcGVyYXRpb24tYm91bmQtY29uZmlnLnRlc3QtZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQzVFLE9BQU8sRUFDTCx3QkFBd0IsRUFDeEIsOEJBQThCLEVBQzlCLCtCQUErQixFQUMvQixtQ0FBbUMsRUFDbkMsbUNBQW1DLEVBQ25DLG9DQUFvQyxFQUNwQyxxQ0FBcUMsRUFDckMsa0NBQWtDLEVBQ2xDLHVCQUF1QixFQUN2Qiw4QkFBOEIsRUFDOUIsc0JBQXNCLEVBQ3RCLDhCQUE4QixFQUM5QixxQkFBcUIsRUFDckIsY0FBYyxFQUNkLGNBQWMsRUFDZCxVQUFVLEVBQ1YsWUFBWSxHQUNiLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFxSDVFLE1BQU0sS0FBSyxHQUFjLENBQUMsQ0FBQyxFQUFFLEVBQUU7SUFDN0IsT0FBTyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUM7QUFDM0IsQ0FBQyxDQUFDO0FBRUYsTUFBTSxtQkFBbUIsR0FBRyxZQUFZLENBQUM7SUFDdkMsU0FBUyxFQUFFLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzlCLElBQUksRUFBRSxXQUFXLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztDQUMxQixDQUFDLENBQUM7QUFFSCxNQUFNLGtCQUFrQixHQUFHLDhCQUE4QixFQUFxQixDQUFDO0lBQzdFLFFBQVEsRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLGlCQUFpQixFQUFFO0lBQ2xELFlBQVksRUFBRTtRQUNaLE1BQU0sRUFBRSxtQkFBbUI7UUFDM0IsT0FBTyxFQUFFLENBQUMs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VztJQUNsQixRQUFRLEVBQUUsRUFBVztJQUNyQixhQUFhLEVBQUUsR0FBRyxFQUFFO1FBQ2xCLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQUM7SUFDdkIsQ0FBQztJQUNELEtBQUssRUFBRSxHQUFHLEVBQUU7UUFDVixPQUFPLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUM7SUFDckMsQ0FBQztJQUNELFFBQVEsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFO1FBQ2hCLE9BQU8sR0FBRyxDQUFDLEVBQUUsQ0FBQztJQUNoQixDQUFDO0lBRUQsbUJBQW1CLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUU7UUFDakMsT0FBTztZQUNMLEtBQUssRUFBRTtnQkFDTCxTQUFTLEVBQUcsS0FBNEMsRUFBRSxTQUFTO2FBQ3BFO1lBQ0QsS0FBSyxFQUFFLEVBQUU7WUFDVCxNQUFNLEVBQUUsSUFBSTtTQUNiLENBQUM7SUFDSixDQUFDO0NBQ0YsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBPcGVyYXRpb25UeXBlIH0gZnJvbSAncmVsYXktcnVudGltZSc7XG5pbXBvcnQgeyBkZWZpbmVTY2hlbWEsIHN0cmluZ0ZpZWxkIH0gZnJvbSAnQHBsdW1pbGUvZmlsdGVyLXF1ZXJ5L3NjaGVtYS5qcyc7XG5pbXBvcnQge1xuICBjcmVhdGVMaXN0RGV0YWlsTWFuaWZlc3QsXG4gIGRlZmluZUJhY2tvZmZpY2VDb25uZWN0aW9uTGlzdCxcbiAgZGVmaW5lQmFja29mZmljZURhc2hib2FyZENvbmZpZyxcbiAgZGVmaW5lQmFja29mZmljZURhc2hib2FyZEhyZWZUYXJnZXQsXG4gIGRlZmluZUJhY2tvZmZpY2VEYXNoYm9hcmRMaXN0VGFyZ2V0LFxuICBkZWZpbmVCYWNrb2ZmaWNlRGFzaGJvYXJkUXVlcnlXaWRnZXQsXG4gIGRlZmluZUJhY2tvZmZpY2VEYXNoYm9hcmRTdGF0aWNXaWRnZXQsXG4gIGRlZmluZUJhY2tvZmZpY2VGb3JtTXV0YXRpb25BY3Rpb24sXG4gIGRlZmluZUJhY2tvZmZpY2VGaWx0ZXJzLFxuICBkZWZpbmVCYWNrb2ZmaWNlTXV0YXRpb25BY3Rpb24sXG4gIGRlZmluZUJhY2tvZmZpY2VQaWNrZXIsXG4gIGRlZmluZUJhY2tvZmZpY2VSZWxhdGlvbkZpbHRlcixcbiAgZGVmaW5lQmFja29mZmljZVNvcnRzLFxuICBkYXRldGltZUZpbHRlcixcbiAgZW50aXR5SWRGaWx0ZXIsXG4gIGVudW1GaWx0ZXIsXG4gIG51bWJlckZpbHRlcixcbn0gZnJvbSAnLi4vYnVpbGRlcnMuanMnO1xuaW1wb3J0IHsgZGVmaW5lQmFja29mZmljZUxpc3ROYXZpZ2F0aW9uIH0gZnJvbSAnLi4vc3RhdGUvbGlzdE5hdmlnYXRpb24uanMnO1xuaW1wb3J0IHR5cGUge1xuICBCYWNrb2ZmaWNlRGFzaGJvYXJkQ29uZmlnLFxuICBCYWNrb2ZmaWNlRGV0YWlsVGl0bGVNZXRhSXRlbSxcbiAgQmFja29mZmljZUVudGl0eU1hbmlmZXN0SXRlbSxcbiAgQmFja29mZmljZU1hbmlmZXN0TGlzdFN0YXRlSW5wdXQsXG4gIEJhY2tvZmZpY2VMaXN0UmVzcG9uc2l2ZU1ldGFJdGVtLFxuICBCYWNrb2ZmaWNlT3BlcmF0aW9uV2hlcmUsXG4gIEkxOG5MYWJlbCxcbn0gZnJvbSAnLi4vdHlwZXMuanMnO1xuXG50eXBlIFRlc3RTb3J0ID0gJ0NSRUFURURfQVRfQVNDJyB8ICdDUkVBVEVEX0FUX0RFU0MnO1xudHlwZSBUZXN0S2luZCA9ICdBJyB8ICdCJztcbnR5cGUgVGVzdEN1cnJlbmN5ID0gJ0VVUicgfCAnVVNEJztcblxuaW50ZXJmYWNlIFRlc3RMaXN0T3BlcmF0aW9uIGV4dGVuZHMgT3BlcmF0aW9uVHlwZSB7XG4gIHZhcmlhYmxlczoge1xuICAgIHdoZXJlPzoge1xuICAgICAgcHJvamVjdElkPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZDtcbiAgICAgIGtpbmQ/OiBUZXN0S2luZCB8IG51bGwgfCB1bmRlZmluZWQ7XG4gICAgICBhdHRlbXB0PzogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZDtcbiAgICAgIGNyZWF0ZWRGcm9tPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZDtcbiAgICB9IHwgbnVsbDtcbiAgICBzb3J0PzogVGVzdFNvcnQgfCBudWxsIHwgdW5kZWZpbmVkO1xuICAgIGNvdW50OiBudW1iZXI7XG4gICAgY3Vyc29yPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZDtcbiAgfTtcbiAgcmVzcG9uc2U6IHtcbiAgICByZWFkb25seSByb3dzOiByZWFkb25seSB1bmtub3duW107XG4gIH07XG59XG5cbmludGVyZmFjZSBUZXN0UGlja2VyT3BlcmF0aW9uIGV4dGVuZHMgT3BlcmF0aW9uVHlwZSB7XG4gIHZhcmlhYmxlczoge1xuICAgIHdoZXJlPzoge1xuICAgICAgb3JnYW5pemF0aW9uSWQ/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkO1xuICAgIH0gfCBudWxsO1xuICAgIGNvdW50OiBudW1iZXI7XG4gICAgY3Vyc29yPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZDtcbiAgfTtcbiAgcmVzcG9uc2U6IHtcbiAgICByZWFkb25seSByb3dzOiByZWFkb25seSB1bmtub3duW107XG4gIH07XG59XG5cbmludGVyZmFjZSBUZXN0Q291bnRPcGVyYXRpb24gZXh0ZW5kcyBPcGVyYXRpb25UeXBlIHtcbiAgdmFyaWFibGVzOiB7XG4gICAgd2hlcmU/OiBCYWNrb2ZmaWNlT3BlcmF0aW9uV2hlcmU8VGVzdExpc3RPcGVyYXRpb24+IHwgbnVsbDtcbiAgfTtcbiAgcmVzcG9uc2U6IHtcbiAgICByZWFkb25seSByb3dzQ291bnQ6IG51bWJlcjtcbiAgfTtcbn1cblxuaW50ZXJmYWNlIFRlc3REYXNoYm9hcmRPcGVyYXRpb24gZXh0ZW5kcyBPcGVyYXRpb25UeXBlIHtcbiAgdmFyaWFibGVzOiBSZWNvcmQ8c3RyaW5nLCBuZXZlcj47XG4gIHJlc3BvbnNlOiB7XG4gICAgcmVhZG9ubHkgdXNlcnM6IHtcbiAgICAgIHJlYWRvbmx5IHRvdGFsQ291bnQ6IG51bWJlcjtcbiAgICB9O1xuICB9O1xufVxuXG5pbnRlcmZhY2UgVGVzdERhc2hib2FyZFdpbmRvd09wZXJhdGlvbiBleHRlbmRzIE9wZXJhdGlvblR5cGUge1xuICB2YXJpYWJsZXM6IHtcbiAgICBmcm9tOiBzdHJpbmc7XG4gICAgdG86IHN0cmluZztcbiAgICBzZXZlcml0eT86IFRlc3RLaW5kIHwgbnVsbCB8IHVuZGVmaW5lZDtcbiAgfTtcbiAgcmVzcG9uc2U6IHtcbiAgICByZWFkb25seSB0aHJvdWdocHV0Q291bnQ6IG51bWJlcjtcbiAgICByZWFkb25seSBmYWlsdXJlUmF0ZTogbnVtYmVyO1xuICAgIHJlYWRvbmx5IHRvcEZhaWx1cmVzOiByZWFkb25seSB7XG4gICAgICByZWFkb25seSBpZDogc3RyaW5nO1xuICAgICAgcmVhZG9ubHkgbGFiZWw6IHN0cmluZztcbiAgICAgIHJlYWRvbmx5IGNvdW50OiBudW1iZXI7XG4gICAgfVtdO1xuICAgIHJlYWRvbmx5IGJ1Y2tldHM6IHJlYWRvbmx5IHtcbiAgICAgIHJlYWRvbmx5IGJ1Y2tldDogc3RyaW5nO1xuICAgICAgcmVhZG9ubHkgY291bnQ6IG51bWJlcjtcbiAgICB9W107XG4gIH07XG59XG5cbmludGVyZmFjZSBUZXN0Q3JlYXRlT3JnYW5pemF0aW9uT3BlcmF0aW9uIGV4dGVuZHMgT3BlcmF0aW9uVHlwZSB7XG4gIHZhcmlhYmxlczoge1xuICAgIGlucHV0OiB7XG4gICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICBjdXJyZW5jeTogVGVzdEN1cnJlbmN5O1xuICAgIH07XG4gIH07XG4gIHJlc3BvbnNlOiB7XG4gICAgcmVhZG9ubHkgY3JlYXRlT3JnYW5pemF0aW9uOiB7XG4gICAgICByZWFkb25seSBzdGF0dXM6IHN0cmluZztcbiAgICAgIHJlYWRvbmx5IG9yZ2FuaXphdGlvbjoge1xuICAgICAgICByZWFkb25seSBpZDogc3RyaW5nO1xuICAgICAgfSB8IG51bGw7XG4gICAgfTtcbiAgfTtcbn1cblxuaW50ZXJmYWNlIFRlc3RBcmNoaXZlT3BlcmF0aW9uIGV4dGVuZHMgT3BlcmF0aW9uVHlwZSB7XG4gIHZhcmlhYmxlczoge1xuICAgIGlkOiBzdHJpbmc7XG4gIH07XG4gIHJlc3BvbnNlOiB7XG4gICAgcmVhZG9ubHkgYXJjaGl2ZToge1xuICAgICAgcmVhZG9ubHkgc3RhdHVzOiBzdHJpbmc7XG4gICAgfTtcbiAgfTtcbn1cblxudHlwZSBUZXN0Q3JlYXRlT3JnYW5pemF0aW9uRm9ybVZhbHVlcyA9IHtcbiAgbmFtZTogc3RyaW5nO1xuICBjdXJyZW5jeTogVGVzdEN1cnJlbmN5O1xufTtcblxuY29uc3QgbGFiZWw6IEkxOG5MYWJlbCA9ICh0KSA9PiB7XG4gIHJldHVybiB0KCdjb21tb24ubGFiZWwnKTtcbn07XG5cbmNvbnN0IHRlc3RMaXN0UXVlcnlTY2hlbWEgPSBkZWZpbmVTY2hlbWEoe1xuICBwcm9qZWN0SWQ6IHN0cmluZ0ZpZWxkKFsnZXEnXSksXG4gIGtpbmQ6IHN0cmluZ0ZpZWxkKFsnZXEnXSksXG59KTtcblxuY29uc3QgdGVzdExpc3ROYXZpZ2F0aW9uID0gZGVmaW5lQmFja29mZmljZUxpc3ROYXZpZ2F0aW9uPFRlc3RMaXN0T3BlcmF0aW9uPigpKHtcbiAgZGVmYXVsdHM6IHsgd2hlcmU6IG51bGwsIHNvcnQ6ICdDUkVBVEVEX0FUX0RFU0MnIH0sXG4gIGZpbHRlclNjaGVtYToge1xuICAgIHNjaGVtYTogdGVzdExpc3RRdWVyeVNjaGVtYSxcbiAgICB0b1doZXJlOiAoZmlsdGVycykgPT4ge1xuICAgICAgY29uc3QgcmF3S2luZCA9IGZpbHRlcnMua2luZD8uZXE7XG4gICAgICBsZXQga2luZDogVGVzdEtpbmQgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAocmF3S2luZCA9PT0gJ0EnIHx8IHJhd0tpbmQgPT09ICdCJykge1xuICAgICAgICBraW5kID0gcmF3S2luZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHByb2plY3RJZDogZmlsdGVycy5wcm9qZWN0SWQ/LmVxLFxuICAgICAgICBraW5kLFxuICAgICAgfTtcbiAgICB9LFxuICAgIGZyb21XaGVyZTogKHdoZXJlKSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBwcm9qZWN0SWQ6IHsgZXE6IHdoZXJlPy5wcm9qZWN0SWQgPz8gdW5kZWZpbmVkIH0sXG4gICAgICAgIGtpbmQ6IHsgZXE6IHdoZXJlPy5raW5kID8/IHVuZGVmaW5lZCB9LFxuICAgICAgfTtcbiAgICB9LFxuICB9LFxuICBzb3J0SWRzOiBbJ0NSRUFURURfQVRfQVNDJywgJ0NSRUFURURfQVRfREVTQyddLFxufSk7XG5cbnRlc3RMaXN0TmF2aWdhdGlvbi5lbmNvZGUoe1xuICB3aGVyZTogeyBwcm9qZWN0SWQ6ICdwcm9qZWN0LTEnLCBraW5kOiAnQScgfSxcbiAgc29ydDogJ0NSRUFURURfQVRfQVNDJyxcbn0pO1xuXG50ZXN0TGlzdE5hdmlnYXRpb24uZW5jb2RlKHtcbiAgLy8gQHRzLWV4cGVjdC1lcnJvciBsaXN0IG5hdmlnYXRpb24gc3RhdGUgaXMgZXhhY3QgdG8gdGhlIG9wZXJhdGlvbiB3aGVyZSBpbnB1dC5cbiAgd2hlcmU6IHsgc3RhdHVzOiAnT1BFTicgfSxcbn0pO1xuXG50ZXN0TGlzdE5hdmlnYXRpb24uZGVjb2RlKHtcbiAgLy8gQHRzLWV4cGVjdC1lcnJvciBsaXN0IG5hdmlnYXRpb24gZmlsdGVycyBhcmUgZXhhY3QgdG8gdGhlIGRlc3RpbmF0aW9uIHNjaGVtYS5cbiAgZmlsdGVyczogeyBtaXNzaW5nOiB7IGVxOiAndmFsdWUnIH0gfSxcbn0pO1xuXG5jb25zdCB0eXBlZExpc3RNYW5pZmVzdCA9IGNyZWF0ZUxpc3REZXRhaWxNYW5pZmVzdCh7XG4gIGlkOiAndGFza3MnLFxuICByb3V0ZVNlZ21lbnQ6ICd0YXNrcycsXG4gIGxhYmVsLFxuICByb3V0ZXM6IHtcbiAgICBsaXN0OiAnL3Rhc2tzJyxcbiAgICBkZXRhaWw6IChpZCkgPT4ge1xuICAgICAgcmV0dXJuIGAvdGFza3MvJHtpZH1gO1xuICAgIH0sXG4gICAgZGV0YWlsUGFnZTogKGlkLCBwYWdlSWQpID0+IHtcbiAgICAgIHJldHVybiBgL3Rhc2tzLyR7aWR9LyR7cGFnZUlkfWA7XG4gICAgfSxcbiAgfSxcbiAgaGFzTGlzdDogdHJ1ZSxcbiAgbGlzdE5hdmlnYXRpb246IHRlc3RMaXN0TmF2aWdhdGlvbixcbiAgZGV0YWlsUGFnZXM6IFtcbiAgICB7XG4gICAgICBpZDogJ292ZXJ2aWV3JyxcbiAgICAgIHBhdGhTZWdtZW50OiAnb3ZlcnZpZXcnLFxuICAgICAgbGFiZWwsXG4gICAgICBpc0RlZmF1bHQ6IHRydWUsXG4gICAgfSxcbiAgXSxcbiAgZGVmYXVsdERldGFpbFBhZ2VJZDogJ292ZXJ2aWV3JyxcbiAgZmFjZXRzOiB7XG4gICAgbGlzdDogYXN5bmMgKCkgPT4ge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd0eXBlIHRlc3QnKTtcbiAgICB9LFxuICAgIGRldGFpbExheW91dDogYXN5bmMgKCkgPT4ge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd0eXBlIHRlc3QnKTtcbiAgICB9LFxuICAgIGRldGFpbFBhZ2U6IGFzeW5jICgpID0+IHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndHlwZSB0ZXN0Jyk7XG4gICAgfSxcbiAgfSxcbn0pO1xuXG5jb25zdCBydW50aW1lTGlzdE1hbmlmZXN0OiBCYWNrb2ZmaWNlRW50aXR5TWFuaWZlc3RJdGVtID0gdHlwZWRMaXN0TWFuaWZlc3Q7XG5leHBvcnQgY29uc3QgcnVudGltZUxpc3RNYW5pZmVzdElkID0gcnVudGltZUxpc3RNYW5pZmVzdC5pZDtcblxudHlwZSBUeXBlZExpc3RTdGF0ZSA9IEJhY2tvZmZpY2VNYW5pZmVzdExpc3RTdGF0ZUlucHV0PFxuICB7IHRhc2tzOiB0eXBlb2YgdHlwZWRMaXN0TWFuaWZlc3QgfSxcbiAgJ3Rhc2tzJ1xuPjtcblxuZXhwb3J0IGNvbnN0IHR5cGVkTGlzdFN0YXRlOiBUeXBlZExpc3RTdGF0ZSA9IHtcbiAgd2hlcmU6IHsgcHJvamVjdElkOiAncHJvamVjdC0xJyB9LFxuICBzb3J0OiAnQ1JFQVRFRF9BVF9BU0MnLFxufTtcblxuZXhwb3J0IGNvbnN0IGludmFsaWRUeXBlZExpc3RTdGF0ZTogVHlwZWRMaXN0U3RhdGUgPSB7XG4gIC8vIEB0cy1leHBlY3QtZXJyb3IgbWFuaWZlc3QtZGVyaXZlZCBsaXN0IHN0YXRlIHJlamVjdHMgdW5rbm93biB3aGVyZSBmaWVsZHMuXG4gIHdoZXJlOiB7IHN0YXR1czogJ09QRU4nIH0sXG59O1xuXG5leHBvcnQgY29uc3QgcnVudGltZUxpc3RTdGF0ZTogQmFja29mZmljZU1hbmlmZXN0TGlzdFN0YXRlSW5wdXQ8XG4gIFJlY29yZDxzdHJpbmcsIEJhY2tvZmZpY2VFbnRpdHlNYW5pZmVzdEl0ZW0+LFxuICBzdHJpbmdcbj4gPSB7XG4gIHdoZXJlOiB7IHN0YXR1czogJ09QRU4nIH0sXG4gIHNvcnQ6ICdDUkVBVEVEX0FUX0RFU0MnLFxufTtcblxuLy8gQHRzLWV4cGVjdC1lcnJvciBsaXN0IG1hbmlmZXN0cyByZXF1aXJlIHN5bmNocm9ub3VzIGxpc3QgbmF2aWdhdGlvbi5cbmNyZWF0ZUxpc3REZXRhaWxNYW5pZmVzdCh7XG4gIGlkOiAndGFza3MnLFxuICByb3V0ZVNlZ21lbnQ6ICd0YXNrcycsXG4gIGxhYmVsLFxuICByb3V0ZXM6IHtcbiAgICBsaXN0OiAnL3Rhc2tzJyxcbiAgICBkZXRhaWw6IChpZCkgPT4ge1xuICAgICAgcmV0dXJuIGAvdGFza3MvJHtpZH1gO1xuICAgIH0sXG4gICAgZGV0YWlsUGFnZTogKGlkLCBwYWdlSWQpID0+IHtcbiAgICAgIHJldHVybiBgL3Rhc2tzLyR7aWR9LyR7cGFnZUlkfWA7XG4gICAgfSxcbiAgfSxcbiAgaGFzTGlzdDogdHJ1ZSxcbiAgZGV0YWlsUGFnZXM6IHR5cGVkTGlzdE1hbmlmZXN0LmRldGFpbFBhZ2VzLFxuICBkZWZhdWx0RGV0YWlsUGFnZUlkOiB0eXBlZExpc3RNYW5pZmVzdC5kZWZhdWx0RGV0YWlsUGFnZUlkLFxuICBmYWNldHM6IHtcbiAgICBsaXN0OiB0eXBlZExpc3RNYW5pZmVzdC5mYWNldHMubGlzdCxcbiAgICBkZXRhaWxMYXlvdXQ6IGFzeW5jICgpID0+IHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndHlwZSB0ZXN0Jyk7XG4gICAgfSxcbiAgICBkZXRhaWxQYWdlOiBhc3luYyAoKSA9PiB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3R5cGUgdGVzdCcpO1xuICAgIH0sXG4gIH0sXG59KTtcblxuY3JlYXRlTGlzdERldGFpbE1hbmlmZXN0KHtcbiAgLi4udHlwZWRMaXN0TWFuaWZlc3QsXG4gIC8vIEB0cy1leHBlY3QtZXJyb3IgbGlzdCBuYXZpZ2F0aW9uIG11c3QgcHJvdmlkZSB0aGUgY29tcGxldGUgc3luY2hyb25vdXMgY29udHJhY3QuXG4gIGxpc3ROYXZpZ2F0aW9uOiB7IGtpbmQ6ICdsaXN0LW5hdmlnYXRpb24nIH0sXG59KTtcblxuY3JlYXRlTGlzdERldGFpbE1hbmlmZXN0KHtcbiAgLi4udHlwZWRMaXN0TWFuaWZlc3QsXG4gIC8vIEB0cy1leHBlY3QtZXJyb3IgbGlzdC1kZXRhaWwgbWFuaWZlc3RzIHJlcXVpcmUgYXQgbGVhc3Qgb25lIGRldGFpbCBwYWdlLlxuICBkZXRhaWxQYWdlczogW10sXG59KTtcblxuLy8gQHRzLWV4cGVjdC1lcnJvciBsaXN0IG1hbmlmZXN0cyByZXF1aXJlIGEgbGlzdCBmYWNldCBsb2FkZXIuXG5jcmVhdGVMaXN0RGV0YWlsTWFuaWZlc3Qoe1xuICAuLi50eXBlZExpc3RNYW5pZmVzdCxcbiAgZmFjZXRzOiB7XG4gICAgZGV0YWlsTGF5b3V0OiB0eXBlZExpc3RNYW5pZmVzdC5mYWNldHMuZGV0YWlsTGF5b3V0LFxuICAgIGRldGFpbFBhZ2U6IHR5cGVkTGlzdE1hbmlmZXN0LmZhY2V0cy5kZXRhaWxQYWdlLFxuICB9LFxufSk7XG5cbmNyZWF0ZUxpc3REZXRhaWxNYW5pZmVzdCh7XG4gIC4uLnR5cGVkTGlzdE1hbmlmZXN0LFxuICAvLyBAdHMtZXhwZWN0LWVycm9yIGxpc3QtZGV0YWlsIG1hbmlmZXN0cyByZXF1aXJlIGEgZGV0YWlsLWxheW91dCBmYWNldCBsb2FkZXIuXG4gIGZhY2V0czoge1xuICAgIGxpc3Q6IHR5cGVkTGlzdE1hbmlmZXN0LmZhY2V0cy5saXN0LFxuICAgIGRldGFpbFBhZ2U6IHR5cGVkTGlzdE1hbmlmZXN0LmZhY2V0cy5kZXRhaWxQYWdlLFxuICB9LFxufSk7XG5cbmNyZWF0ZUxpc3REZXRhaWxNYW5pZmVzdCh7XG4gIC4uLnR5cGVkTGlzdE1hbmlmZXN0LFxuICAvLyBAdHMtZXhwZWN0LWVycm9yIGxpc3QtZGV0YWlsIG1hbmlmZXN0cyByZXF1aXJlIGEgZGV0YWlsLXBhZ2UgZmFjZXQgbG9hZGVyLlxuICBmYWNldHM6IHtcbiAgICBsaXN0OiB0eXBlZExpc3RNYW5pZmVzdC5mYWNldHMubGlzdCxcbiAgICBkZXRhaWxMYXlvdXQ6IHR5cGVkTGlzdE1hbmlmZXN0LmZhY2V0cy5kZXRhaWxMYXlvdXQsXG4gIH0sXG59KTtcblxuZGVmaW5lQmFja29mZmljZUZvcm1NdXRhdGlvbkFjdGlvbjxcbiAgVGVzdENyZWF0ZU9yZ2FuaXphdGlvbk9wZXJhdGlvbixcbiAgbnVsbCxcbiAgVGVzdENyZWF0ZU9yZ2FuaXphdGlvbkZvcm1WYWx1ZXNcbj4oKSh7XG4gIGlkOiAnY3JlYXRlLW9yZ2FuaXphdGlvbicsXG4gIGtpbmQ6ICdmb3JtTXV0YXRpb24nLFxuICBsYWJlbCxcbiAgbXV0YXRpb246IHt9IGFzIG5ldmVyLFxuICBmaWVsZHM6IFtdLFxuICBnZXRWYXJpYWJsZXM6IChfbm9kZSwgdmFsdWVzKSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlucHV0OiB7XG4gICAgICAgIG5hbWU6IHZhbHVlcy5uYW1lLFxuICAgICAgICBjdXJyZW5jeTogdmFsdWVzLmN1cnJlbmN5LFxuICAgICAgfSxcbiAgICB9O1xuICB9LFxuICB0b2FzdHM6IHtcbiAgICBzdWNjZXNzOiB7XG4gICAgICB0aXRsZTogbGFiZWwsXG4gICAgICB2aWV3OiB7XG4gICAgICAgIGVudGl0eUlkOiAnb3JnYW5pemF0aW9ucycsXG4gICAgICAgIGdldFRhcmdldElkOiAocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICByZXR1cm4gcmVzcG9uc2UuY3JlYXRlT3JnYW5pemF0aW9uLm9yZ2FuaXphdGlvbj8uaWQgPz8gbnVsbDtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbn0pO1xuXG5kZWZpbmVCYWNrb2ZmaWNlRm9ybU11dGF0aW9uQWN0aW9uPFxuICBUZXN0Q3JlYXRlT3JnYW5pemF0aW9uT3BlcmF0aW9uLFxuICBudWxsLFxuICBUZXN0Q3JlYXRlT3JnYW5pemF0aW9uRm9ybVZhbHVlc1xuPigpKHtcbiAgaWQ6ICdtaXNzaW5nLWN1cnJlbmN5JyxcbiAga2luZDogJ2Zvcm1NdXRhdGlvbicsXG4gIGxhYmVsLFxuICBtdXRhdGlvbjoge30gYXMgbmV2ZXIsXG4gIGZpZWxkczogW10sXG4gIC8vIEB0cy1leHBlY3QtZXJyb3IgY3JlYXRlIG9yZ2FuaXphdGlvbiB2YXJpYWJsZXMgbXVzdCBpbmNsdWRlIHJlcXVpcmVkIGlucHV0LmN1cnJlbmN5LlxuICBnZXRWYXJpYWJsZXM6IChfbm9kZSwgdmFsdWVzKSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlucHV0OiB7XG4gICAgICAgIG5hbWU6IHZhbHVlcy5uYW1lLFxuICAgICAgfSxcbiAgICB9O1xuICB9LFxufSk7XG5cbmRlZmluZUJhY2tvZmZpY2VGb3JtTXV0YXRpb25BY3Rpb248XG4gIFRlc3RDcmVhdGVPcmdhbml6YXRpb25PcGVyYXRpb24sXG4gIG51bGwsXG4gIHsgbmFtZTogc3RyaW5nOyBjdXJyZW5jeTogJ0dCUCcgfVxuPigpKHtcbiAgaWQ6ICdpbnZhbGlkLWN1cnJlbmN5JyxcbiAga2luZDogJ2Zvcm1NdXRhdGlvbicsXG4gIGxhYmVsLFxuICBtdXRhdGlvbjoge30gYXMgbmV2ZXIsXG4gIGZpZWxkczogW10sXG4gIC8vIEB0cy1leHBlY3QtZXJyb3IgY3JlYXRlIG9yZ2FuaXphdGlvbiBjdXJyZW5jeSBtdXN0IGJlIG9uZSBvZiB0aGUgUmVsYXkgZ2VuZXJhdGVkIGVudW0gdmFsdWVzLlxuICBnZXRWYXJpYWJsZXM6IChfbm9kZSwgdmFsdWVzKSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlucHV0OiB7XG4gICAgICAgIG5hbWU6IHZhbHVlcy5uYW1lLFxuICAgICAgICBjdXJyZW5jeTogdmFsdWVzLmN1cnJlbmN5LFxuICAgICAgfSxcbiAgICB9O1xuICB9LFxufSk7XG5cbmRlZmluZUJhY2tvZmZpY2VNdXRhdGlvbkFjdGlvbjxUZXN0QXJjaGl2ZU9wZXJhdGlvbiwgeyBpZDogc3RyaW5nIH0+KCkoe1xuICBpZDogJ2FyY2hpdmUnLFxuICBraW5kOiAnbXV0YXRpb24nLFxuICBsYWJlbCxcbiAgbXV0YXRpb246IHt9IGFzIG5ldmVyLFxuICBnZXRWYXJpYWJsZXM6IChub2RlKSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiBub2RlLmlkLFxuICAgIH07XG4gIH0sXG59KTtcblxuZGVmaW5lQmFja29mZmljZU11dGF0aW9uQWN0aW9uPFRlc3RBcmNoaXZlT3BlcmF0aW9uLCB7IGlkOiBzdHJpbmcgfT4oKSh7XG4gIGlkOiAnYXJjaGl2ZS1taXNzaW5nLWlkJyxcbiAga2luZDogJ211dGF0aW9uJyxcbiAgbGFiZWwsXG4gIG11dGF0aW9uOiB7fSBhcyBuZXZlcixcbiAgLy8gQHRzLWV4cGVjdC1lcnJvciBtdXRhdGlvbiB2YXJpYWJsZXMgbXVzdCBpbmNsdWRlIHJlcXVpcmVkIGlkLlxuICBnZXRWYXJpYWJsZXM6ICgpID0+IHtcbiAgICByZXR1cm4ge307XG4gIH0sXG59KTtcblxuZXhwb3J0IGNvbnN0IHJlc3BvbnNpdmVNZXRhOiBCYWNrb2ZmaWNlTGlzdFJlc3BvbnNpdmVNZXRhSXRlbSA9IHtcbiAgaWQ6ICdzdGF0ZScsXG4gIGxhYmVsLFxuICB2YWx1ZTogJ3JlYWR5Jyxcbn07XG5cbmV4cG9ydCBjb25zdCBpbnZhbGlkUmVzcG9uc2l2ZU1ldGE6IEJhY2tvZmZpY2VMaXN0UmVzcG9uc2l2ZU1ldGFJdGVtID0ge1xuICBpZDogJ3N0YXRlJyxcbiAgLy8gQHRzLWV4cGVjdC1lcnJvciByZXNwb25zaXZlIG1ldGEgbGFiZWxzIG11c3QgYmUgaTE4biBsYWJlbCBmdW5jdGlvbnMsIG5vdCByYXcgc3RyaW5ncy5cbiAgbGFiZWw6ICdTdGF0ZScsXG4gIHZhbHVlOiAncmVhZHknLFxufTtcblxuZXhwb3J0IGNvbnN0IHRpdGxlTWV0YTogQmFja29mZmljZURldGFpbFRpdGxlTWV0YUl0ZW0gPSB7XG4gIGlkOiAnc3RhdGUnLFxuICBsYWJlbCxcbiAgdmFsdWU6ICdyZWFkeScsXG59O1xuXG5leHBvcnQgY29uc3QgaW52YWxpZFRpdGxlTWV0YTogQmFja29mZmljZURldGFpbFRpdGxlTWV0YUl0ZW0gPSB7XG4gIGlkOiAnc3RhdGUnLFxuICAvLyBAdHMtZXhwZWN0LWVycm9yIHRpdGxlIG1ldGEgbGFiZWxzIG11c3QgYmUgaTE4biBsYWJlbCBmdW5jdGlvbnMsIG5vdCByYXcgc3RyaW5ncy5cbiAgbGFiZWw6ICdTdGF0ZScsXG4gIHZhbHVlOiAncmVhZHknLFxufTtcblxuY29uc3QgZmlsdGVycyA9IGRlZmluZUJhY2tvZmZpY2VGaWx0ZXJzPFRlc3RMaXN0T3BlcmF0aW9uPigpKFtcbiAgZW50aXR5SWRGaWx0ZXI8QmFja29mZmljZU9wZXJhdGlvbldoZXJlPFRlc3RMaXN0T3BlcmF0aW9uPiwgJ3Byb2plY3RJZCc+KFxuICAgICdwcm9qZWN0SWQnLFxuICAgIHtcbiAgICAgIGVudGl0eTogJ3Byb2plY3RzJyxcbiAgICAgIGxhYmVsLFxuICAgIH0sXG4gICksXG4gIGVudW1GaWx0ZXI8QmFja29mZmljZU9wZXJhdGlvbldoZXJlPFRlc3RMaXN0T3BlcmF0aW9uPiwgJ2tpbmQnPigna2luZCcsIHtcbiAgICBsYWJlbCxcbiAgICBvcHRpb25zOiBbJ0EnLCAnQiddLFxuICB9KSxcbiAgbnVtYmVyRmlsdGVyPEJhY2tvZmZpY2VPcGVyYXRpb25XaGVyZTxUZXN0TGlzdE9wZXJhdGlvbj4sICdhdHRlbXB0Jz4oXG4gICAgJ2F0dGVtcHQnLFxuICAgIHtcbiAgICAgIGxhYmVsLFxuICAgIH0sXG4gICksXG4gIGRhdGV0aW1lRmlsdGVyPEJhY2tvZmZpY2VPcGVyYXRpb25XaGVyZTxUZXN0TGlzdE9wZXJhdGlvbj4sICdjcmVhdGVkRnJvbSc+KFxuICAgICdjcmVhdGVkRnJvbScsXG4gICAge1xuICAgICAgbGFiZWwsXG4gICAgICBtb2RlOiAnZnJvbScsXG4gICAgfSxcbiAgKSxcbl0pO1xuXG5kZWZpbmVCYWNrb2ZmaWNlU29ydHM8VGVzdExpc3RPcGVyYXRpb24+KCkoW3sgaWQ6ICdDUkVBVEVEX0FUX0RFU0MnLCBsYWJlbCB9XSk7XG5cbmRlZmluZUJhY2tvZmZpY2VDb25uZWN0aW9uTGlzdDxUZXN0TGlzdE9wZXJhdGlvbiwgVGVzdENvdW50T3BlcmF0aW9uPigpKHtcbiAgdGl0bGU6IGxhYmVsLFxuICBxdWVyeToge30gYXMgbmV2ZXIsXG4gIGZyYWdtZW50OiB7fSBhcyBuZXZlcixcbiAgY291bnQ6IHtcbiAgICBxdWVyeToge30gYXMgbmV2ZXIsXG4gICAgYnVpbGRWYXJpYWJsZXM6ICh7IHdoZXJlIH0pID0+IHtcbiAgICAgIHJldHVybiB7IHdoZXJlIH07XG4gICAgfSxcbiAgICBnZXRDb3VudDogKGRhdGEpID0+IHtcbiAgICAgIHJldHVybiAoZGF0YSBhcyBUZXN0Q291bnRPcGVyYXRpb25bJ3Jlc3BvbnNlJ10pLnJvd3NDb3VudDtcbiAgICB9LFxuICB9LFxuICBmaWx0ZXJzLFxuICBzb3J0czogZGVmaW5lQmFja29mZmljZVNvcnRzPFRlc3RMaXN0T3BlcmF0aW9uPigpKFtcbiAgICB7IGlkOiAnQ1JFQVRFRF9BVF9BU0MnLCBsYWJlbCB9LFxuICBdKSxcbiAgZGVmYXVsdFN0YXRlOiB7XG4gICAgd2hlcmU6IHsgcHJvamVjdElkOiAncHJvamVjdC0xJyB9LFxuICAgIHNvcnQ6ICdDUkVBVEVEX0FUX0RFU0MnLFxuICB9LFxuICBnZXRDb25uZWN0aW9uOiAoKSA9PiB7XG4gICAgcmV0dXJuIHsgZWRnZXM6IFtdIH07XG4gIH0sXG4gIHRvUm93OiAocm93KSA9PiB7XG4gICAgcmV0dXJuIHJvdztcbiAgfSxcbiAgZ2V0Um93SWQ6ICgpID0+IHtcbiAgICByZXR1cm4gJ3Jvdyc7XG4gIH0sXG4gIGNvbHVtbnM6IFtdLFxufSk7XG5cbmRlZmluZUJhY2tvZmZpY2VQaWNrZXI8VGVzdFBpY2tlck9wZXJhdGlvbj4oKSh7XG4gIHF1ZXJ5OiB7fSBhcyBuZXZlcixcbiAgZnJhZ21lbnQ6IHt9IGFzIG5ldmVyLFxuICBnZXRDb25uZWN0aW9uOiAoKSA9PiB7XG4gICAgcmV0dXJuIHsgZWRnZXM6IFtdIH07XG4gIH0sXG4gIHRvUm93OiAoKSA9PiB7XG4gICAgcmV0dXJuIHsgaWQ6ICdyb3cnLCB0aXRsZTogJ1JvdycgfTtcbiAgfSxcbiAgZ2V0Um93SWQ6IChyb3cpID0+IHtcbiAgICByZXR1cm4gcm93LmlkO1xuICB9LFxuICBidWlsZFF1ZXJ5VmFyaWFibGVzOiAoeyBzY29wZSB9KSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHdoZXJlOiB7XG4gICAgICAgIG9yZ2FuaXphdGlvbklkOiBzY29wZT8ub3JnYW5pemF0aW9uSWQsXG4gICAgICB9LFxuICAgICAgY291bnQ6IDIwLFxuICAgICAgY3Vyc29yOiBudWxsLFxuICAgIH07XG4gIH0sXG59KTtcblxuZGVmaW5lQmFja29mZmljZURhc2hib2FyZENvbmZpZyh7XG4gIHRpdGxlOiBsYWJlbCxcbiAgd2lkZ2V0czogW1xuICAgIGRlZmluZUJhY2tvZmZpY2VEYXNoYm9hcmRRdWVyeVdpZGdldDxUZXN0RGFzaGJvYXJkT3BlcmF0aW9uPigpKHtcbiAgICAgIGlkOiAndXNlcnMnLFxuICAgICAga2luZDogJ21ldHJpY0dyb3VwJyxcbiAgICAgIHF1ZXJ5OiB7fSBhcyBuZXZlcixcbiAgICAgIHZhcmlhYmxlczoge30sXG4gICAgICByZXNvbHZlOiAoZGF0YSkgPT4ge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlkOiAndXNlcnMnLFxuICAgICAgICAgICAgbGFiZWwsXG4gICAgICAgICAgICB2YWx1ZTogZGF0YS51c2Vycy50b3RhbENvdW50LFxuICAgICAgICAgICAgdGFyZ2V0OiBkZWZpbmVCYWNrb2ZmaWNlRGFzaGJvYXJkTGlzdFRhcmdldDxUZXN0TGlzdE9wZXJhdGlvbj4oKSh7XG4gICAgICAgICAgICAgIGVudGl0eUlkOiAndGFza3MnLFxuICAgICAgICAgICAgICBzdGF0ZToge1xuICAgICAgICAgICAgICAgIHdoZXJlOiB7IGtpbmQ6ICdBJyB9LFxuICAgICAgICAgICAgICAgIHNvcnQ6ICdDUkVBVEVEX0FUX0RFU0MnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgfSxcbiAgICAgICAgXTtcbiAgICAgIH0sXG4gICAgfSksXG4gICAgZGVmaW5lQmFja29mZmljZURhc2hib2FyZFN0YXRpY1dpZGdldCh7XG4gICAgICBpZDogJ3dpbmRvdycsXG4gICAgICBraW5kOiAnd2luZG93Q29udHJvbCcsXG4gICAgICB0aXRsZTogbGFiZWwsXG4gICAgfSksXG4gICAgZGVmaW5lQmFja29mZmljZURhc2hib2FyZFF1ZXJ5V2lkZ2V0PFRlc3REYXNoYm9hcmRXaW5kb3dPcGVyYXRpb24+KCkoe1xuICAgICAgaWQ6ICd0aHJvdWdocHV0JyxcbiAgICAgIGtpbmQ6ICd0cmVuZE1ldHJpYycsXG4gICAgICBxdWVyeToge30gYXMgbmV2ZXIsXG4gICAgICB2YXJpYWJsZXM6ICh7IHdpbmRvdyB9KSA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZnJvbTogd2luZG93LmZyb20sXG4gICAgICAgICAgdG86IHdpbmRvdy50byxcbiAgICAgICAgICBzZXZlcml0eTogJ0EnLFxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICAgIHJlc29sdmU6IChkYXRhKSA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbGFiZWwsXG4gICAgICAgICAgdmFsdWU6IGRhdGEudGhyb3VnaHB1dENvdW50LFxuICAgICAgICAgIGRlbHRhOiB7XG4gICAgICAgICAgICB2YWx1ZTogMTIsXG4gICAgICAgICAgICBkaXJlY3Rpb246ICd1cCcsXG4gICAgICAgICAgICB0b25lOiAnc3VjY2VzcycsXG4gICAgICAgICAgICBsYWJlbCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHNwYXJrbGluZTogW3sgeDogJzIwMjYtMDEtMDFUMDA6MDA6MDAuMDAwWicsIHk6IDEgfV0sXG4gICAgICAgICAgdGFyZ2V0OiBkZWZpbmVCYWNrb2ZmaWNlRGFzaGJvYXJkTGlzdFRhcmdldDxUZXN0TGlzdE9wZXJhdGlvbj4oKSh7XG4gICAgICAgICAgICBlbnRpdHlJZDogJ3Rhc2tzJyxcbiAgICAgICAgICAgIHN0YXRlOiB7XG4gICAgICAgICAgICAgIHdoZXJlOiB7IGtpbmQ6ICdBJyB9LFxuICAgICAgICAgICAgICBzb3J0OiAnQ1JFQVRFRF9BVF9ERVNDJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSksXG4gICAgICAgIH07XG4gICAgICB9LFxuICAgIH0pLFxuICAgIGRlZmluZUJhY2tvZmZpY2VEYXNoYm9hcmRRdWVyeVdpZGdldDxUZXN0RGFzaGJvYXJkV2luZG93T3BlcmF0aW9uPigpKHtcbiAgICAgIGlkOiAnZmFpbHVyZS1yYXRlJyxcbiAgICAgIGtpbmQ6ICdzbGFHYXVnZScsXG4gICAgICBxdWVyeToge30gYXMgbmV2ZXIsXG4gICAgICB2YXJpYWJsZXM6ICh7IHdpbmRvdyB9KSA9PiB7XG4gICAgICAgIHJldHVybiB7IGZyb206IHdpbmRvdy5mcm9tLCB0bzogd2luZG93LnRvIH07XG4gICAgICB9LFxuICAgICAgcmVzb2x2ZTogKGRhdGEpID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBsYWJlbCxcbiAgICAgICAgICB2YWx1ZTogZGF0YS5mYWlsdXJlUmF0ZSxcbiAgICAgICAgICBtYXg6IDEsXG4gICAgICAgICAgdGhyZXNob2xkOiAwLjA1LFxuICAgICAgICAgIHVuaXQ6ICclJyxcbiAgICAgICAgICB0b25lOiAnd2FybmluZycsXG4gICAgICAgIH07XG4gICAgICB9LFxuICAgIH0pLFxuICAgIGRlZmluZUJhY2tvZmZpY2VEYXNoYm9hcmRRdWVyeVdpZGdldDxUZXN0RGFzaGJvYXJkV2luZG93T3BlcmF0aW9uPigpKHtcbiAgICAgIGlkOiAndG9wLWZhaWx1cmVzJyxcbiAgICAgIGtpbmQ6ICdicmVha2Rvd25MaXN0JyxcbiAgICAgIHF1ZXJ5OiB7fSBhcyBuZXZlcixcbiAgICAgIHZhcmlhYmxlczogKHsgd2luZG93IH0pID0+IHtcbiAgICAgICAgcmV0dXJuIHsgZnJvbTogd2luZG93LmZyb20sIHRvOiB3aW5kb3cudG8gfTtcbiAgICAgIH0sXG4gICAgICByZXNvbHZlOiAoZGF0YSkgPT4ge1xuICAgICAgICByZXR1cm4gZGF0YS50b3BGYWlsdXJlcy5tYXAoKGZhaWx1cmUpID0+IHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaWQ6IGZhaWx1cmUuaWQsXG4gICAgICAgICAgICBsYWJlbDogKCkgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4gZmFpbHVyZS5sYWJlbDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB2YWx1ZTogZmFpbHVyZS5jb3VudCxcbiAgICAgICAgICAgIHRvbmU6ICdkYW5nZXInLFxuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICB9KSxcbiAgICBkZWZpbmVCYWNrb2ZmaWNlRGFzaGJvYXJkUXVlcnlXaWRnZXQ8VGVzdERhc2hib2FyZFdpbmRvd09wZXJhdGlvbj4oKSh7XG4gICAgICBpZDogJ3RpbWVsaW5lJyxcbiAgICAgIGtpbmQ6ICd0aW1lbGluZUNoYXJ0JyxcbiAgICAgIHF1ZXJ5OiB7fSBhcyBuZXZlcixcbiAgICAgIHZhcmlhYmxlczogKHsgd2luZG93IH0pID0+IHtcbiAgICAgICAgcmV0dXJuIHsgZnJvbTogd2luZG93LmZyb20sIHRvOiB3aW5kb3cudG8gfTtcbiAgICAgIH0sXG4gICAgICBhcmlhTGFiZWw6IGxhYmVsLFxuICAgICAgY2hhcnQ6ICdiYXInLFxuICAgICAgcmVzb2x2ZTogKGRhdGEpID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzZXJpZXM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaWQ6ICd0aHJvdWdocHV0JyxcbiAgICAgICAgICAgICAgbGFiZWwsXG4gICAgICAgICAgICAgIGNvbG9yOiAnIzI1NjNlYicsXG4gICAgICAgICAgICAgIGRhdGE6IGRhdGEuYnVja2V0cy5tYXAoKGJ1Y2tldCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICB4OiBidWNrZXQuYnVja2V0LFxuICAgICAgICAgICAgICAgICAgeTogYnVja2V0LmNvdW50LFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICB9KSxcbiAgICBkZWZpbmVCYWNrb2ZmaWNlRGFzaGJvYXJkUXVlcnlXaWRnZXQ8VGVzdERhc2hib2FyZFdpbmRvd09wZXJhdGlvbj4oKSh7XG4gICAgICBpZDogJ3Jpc2stcXVldWUnLFxuICAgICAga2luZDogJ3Jpc2tRdWV1ZScsXG4gICAgICBxdWVyeToge30gYXMgbmV2ZXIsXG4gICAgICB2YXJpYWJsZXM6ICh7IHdpbmRvdyB9KSA9PiB7XG4gICAgICAgIHJldHVybiB7IGZyb206IHdpbmRvdy5mcm9tLCB0bzogd2luZG93LnRvIH07XG4gICAgICB9LFxuICAgICAgcmVzb2x2ZTogKCkgPT4ge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlkOiAnZGVhZC1vdXRib3gnLFxuICAgICAgICAgICAgbGFiZWwsXG4gICAgICAgICAgICBzZXZlcml0eTogJ2RhbmdlcicsXG4gICAgICAgICAgICB2YWx1ZTogNCxcbiAgICAgICAgICB9LFxuICAgICAgICBdO1xuICAgICAgfSxcbiAgICB9KSxcbiAgICBkZWZpbmVCYWNrb2ZmaWNlRGFzaGJvYXJkUXVlcnlXaWRnZXQ8VGVzdERhc2hib2FyZFdpbmRvd09wZXJhdGlvbj4oKSh7XG4gICAgICBpZDogJ3Nwb3RsaWdodCcsXG4gICAgICBraW5kOiAnZW50aXR5U3BvdGxpZ2h0JyxcbiAgICAgIHF1ZXJ5OiB7fSBhcyBuZXZlcixcbiAgICAgIHZhcmlhYmxlczogKHsgd2luZG93IH0pID0+IHtcbiAgICAgICAgcmV0dXJuIHsgZnJvbTogd2luZG93LmZyb20sIHRvOiB3aW5kb3cudG8gfTtcbiAgICAgIH0sXG4gICAgICByZXNvbHZlOiAoKSA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbGFiZWwsXG4gICAgICAgICAgdGl0bGU6IGxhYmVsLFxuICAgICAgICAgIHRvbmU6ICdpbmZvJyxcbiAgICAgICAgICBtZXRhOiBbeyBpZDogJ2FnZScsIGxhYmVsLCB2YWx1ZTogJzQ1IG1pbicgfV0sXG4gICAgICAgIH07XG4gICAgICB9LFxuICAgIH0pLFxuICAgIGRlZmluZUJhY2tvZmZpY2VEYXNoYm9hcmRRdWVyeVdpZGdldDxUZXN0RGFzaGJvYXJkV2luZG93T3BlcmF0aW9uPigpKHtcbiAgICAgIGlkOiAnaGVhbHRoJyxcbiAgICAgIGtpbmQ6ICdoZWFsdGhNYXRyaXgnLFxuICAgICAgcXVlcnk6IHt9IGFzIG5ldmVyLFxuICAgICAgdmFyaWFibGVzOiAoeyB3aW5kb3cgfSkgPT4ge1xuICAgICAgICByZXR1cm4geyBmcm9tOiB3aW5kb3cuZnJvbSwgdG86IHdpbmRvdy50byB9O1xuICAgICAgfSxcbiAgICAgIHJlc29sdmU6ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZDogJ3dvcmsnLFxuICAgICAgICAgICAgbGFiZWwsXG4gICAgICAgICAgICBjZWxsczogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaWQ6ICd0YXNrcycsXG4gICAgICAgICAgICAgICAgbGFiZWwsXG4gICAgICAgICAgICAgICAgdmFsdWU6IDIsXG4gICAgICAgICAgICAgICAgdG9uZTogJ3dhcm5pbmcnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICBdO1xuICAgICAgfSxcbiAgICB9KSxcbiAgICBkZWZpbmVCYWNrb2ZmaWNlRGFzaGJvYXJkU3RhdGljV2lkZ2V0KHtcbiAgICAgIGlkOiAnYWN0aW9ucycsXG4gICAgICBraW5kOiAncXVpY2tBY3Rpb25zJyxcbiAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGlkOiAndXNlcnMnLFxuICAgICAgICAgIGxhYmVsLFxuICAgICAgICAgIHRhcmdldDogZGVmaW5lQmFja29mZmljZURhc2hib2FyZEhyZWZUYXJnZXQoJy91c2VycycpLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9KSxcbiAgXSxcbn0pO1xuXG5kZWZpbmVCYWNrb2ZmaWNlRGFzaGJvYXJkUXVlcnlXaWRnZXQ8VGVzdERhc2hib2FyZE9wZXJhdGlvbj4oKSh7XG4gIGlkOiAnaW52YWxpZC11c2VycycsXG4gIGtpbmQ6ICdtZXRyaWNHcm91cCcsXG4gIHF1ZXJ5OiB7fSBhcyBuZXZlcixcbiAgdmFyaWFibGVzOiB7fSxcbiAgcmVzb2x2ZTogKGRhdGEpID0+IHtcbiAgICByZXR1cm4gW1xuICAgICAge1xuICAgICAgICBpZDogJ3VzZXJzJyxcbiAgICAgICAgbGFiZWwsXG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgZGFzaGJvYXJkIHdpZGdldCByZXNvbHZlIGRhdGEgaXMgdHlwZWQgZnJvbSB0aGUgb3BlcmF0aW9uIHJlc3BvbnNlLlxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1tZW1iZXItYWNjZXNzXG4gICAgICAgIHZhbHVlOiBkYXRhLnByb2plY3RzLnRvdGFsQ291bnQsXG4gICAgICB9LFxuICAgIF07XG4gIH0sXG59KTtcblxuZGVmaW5lQmFja29mZmljZURhc2hib2FyZFF1ZXJ5V2lkZ2V0PFRlc3REYXNoYm9hcmRXaW5kb3dPcGVyYXRpb24+KCkoe1xuICBpZDogJ2ludmFsaWQtd2luZG93LXZhcmlhYmxlcycsXG4gIGtpbmQ6ICd0cmVuZE1ldHJpYycsXG4gIHF1ZXJ5OiB7fSBhcyBuZXZlcixcbiAgLy8gQHRzLWV4cGVjdC1lcnJvciBkYXNoYm9hcmQgd2lkZ2V0IHZhcmlhYmxlcyBtdXN0IG1hdGNoIHRoZSBvcGVyYXRpb24gdmFyaWFibGVzLlxuICB2YXJpYWJsZXM6ICh7IHdpbmRvdyB9KSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZyb206IHdpbmRvdy5mcm9tLFxuICAgIH07XG4gIH0sXG4gIHJlc29sdmU6IChkYXRhKSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxhYmVsLFxuICAgICAgdmFsdWU6IGRhdGEudGhyb3VnaHB1dENvdW50LFxuICAgIH07XG4gIH0sXG59KTtcblxuZGVmaW5lQmFja29mZmljZURhc2hib2FyZExpc3RUYXJnZXQ8VGVzdExpc3RPcGVyYXRpb24+KCkoe1xuICBlbnRpdHlJZDogJ3Rhc2tzJyxcbiAgc3RhdGU6IHtcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGRhc2hib2FyZCBsaXN0IHRhcmdldCB3aGVyZSBtdXN0IG1hdGNoIHRoZSB0YXJnZXQgbGlzdCBvcGVyYXRpb24gd2hlcmUgaW5wdXQuXG4gICAgd2hlcmU6IHsgb3JnYW5pemF0aW9uSWQ6ICdvcmctMScgfSxcbiAgfSxcbn0pO1xuXG5kZWZpbmVCYWNrb2ZmaWNlRGFzaGJvYXJkTGlzdFRhcmdldDxUZXN0TGlzdE9wZXJhdGlvbj4oKSh7XG4gIGVudGl0eUlkOiAndGFza3MnLFxuICBzdGF0ZToge1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgZGFzaGJvYXJkIGxpc3QgdGFyZ2V0IHNvcnQgbXVzdCBtYXRjaCB0aGUgdGFyZ2V0IGxpc3Qgb3BlcmF0aW9uIHNvcnQgaW5wdXQuXG4gICAgc29ydDogJ1VQREFURURfQVRfREVTQycsXG4gIH0sXG59KTtcblxuZXhwb3J0IGNvbnN0IGludmFsaWREYXNoYm9hcmRDb25maWc6IEJhY2tvZmZpY2VEYXNoYm9hcmRDb25maWcgPSB7XG4gIHRpdGxlOiBsYWJlbCxcbiAgLy8gQHRzLWV4cGVjdC1lcnJvciBkYXNoYm9hcmQgY29uZmlncyBkbyBub3Qgc3VwcG9ydCBnbG9iYWwgcXVlcmllcy5cbiAgcXVlcnk6IHt9IGFzIG5ldmVyLFxuICB3aWRnZXRzOiBbXSxcbn07XG5cbi8vIEB0cy1leHBlY3QtZXJyb3IgZGF0YS1kcml2ZW4gZGFzaGJvYXJkIHdpZGdldHMgbXVzdCBkZWNsYXJlIGEgcXVlcnkuXG5kZWZpbmVCYWNrb2ZmaWNlRGFzaGJvYXJkUXVlcnlXaWRnZXQ8VGVzdERhc2hib2FyZE9wZXJhdGlvbj4oKSh7XG4gIGlkOiAnbWlzc2luZy1xdWVyeScsXG4gIGtpbmQ6ICdtZXRyaWNHcm91cCcsXG4gIHZhcmlhYmxlczoge30sXG4gIHJlc29sdmU6IChkYXRhKSA9PiB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHtcbiAgICAgICAgaWQ6ICd1c2VycycsXG4gICAgICAgIGxhYmVsLFxuICAgICAgICB2YWx1ZTogZGF0YS51c2Vycy50b3RhbENvdW50LFxuICAgICAgfSxcbiAgICBdO1xuICB9LFxufSk7XG5cbmRlZmluZUJhY2tvZmZpY2VSZWxhdGlvbkZpbHRlcjxUZXN0TGlzdE9wZXJhdGlvbj4oKSh7XG4gIHRhcmdldDogJ3Byb2plY3RzJyxcbiAgd2hlcmVLZXk6ICdwcm9qZWN0SWQnLFxufSk7XG5cbmRlZmluZUJhY2tvZmZpY2VSZWxhdGlvbkZpbHRlcjxUZXN0TGlzdE9wZXJhdGlvbj4oKSh7XG4gIHRhcmdldDogJ3Byb2plY3RzJyxcbiAgLy8gQHRzLWV4cGVjdC1lcnJvciBvcmdhbml6YXRpb25JZCBpcyBub3QgZGVjbGFyZWQgYnkgdGhlIHRhcmdldCBsaXN0IHdoZXJlIGlucHV0LlxuICB3aGVyZUtleTogJ29yZ2FuaXphdGlvbklkJyxcbn0pO1xuXG5kZWZpbmVCYWNrb2ZmaWNlRmlsdGVyczxUZXN0TGlzdE9wZXJhdGlvbj4oKShbXG4gIC8vIEB0cy1leHBlY3QtZXJyb3IgbWlzc2luZ0ZpZWxkIGlzIG5vdCBkZWNsYXJlZCBieSB0aGUgb3BlcmF0aW9uIHdoZXJlIGlucHV0LlxuICBlbnRpdHlJZEZpbHRlcjxCYWNrb2ZmaWNlT3BlcmF0aW9uV2hlcmU8VGVzdExpc3RPcGVyYXRpb24+LCAnbWlzc2luZ0ZpZWxkJz4oXG4gICAgJ21pc3NpbmdGaWVsZCcsXG4gICAge1xuICAgICAgZW50aXR5OiAncHJvamVjdHMnLFxuICAgICAgbGFiZWwsXG4gICAgfSxcbiAgKSxcbl0pO1xuXG5kZWZpbmVCYWNrb2ZmaWNlRmlsdGVyczxUZXN0TGlzdE9wZXJhdGlvbj4oKShbXG4gIGVudW1GaWx0ZXI8QmFja29mZmljZU9wZXJhdGlvbldoZXJlPFRlc3RMaXN0T3BlcmF0aW9uPiwgJ2tpbmQnPigna2luZCcsIHtcbiAgICBsYWJlbCxcbiAgICBvcHRpb25zOiBbXG4gICAgICAnQScsXG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIEMgaXMgbm90IGEgdmFsaWQgVGVzdEtpbmQgdmFsdWUuXG4gICAgICAnQycsXG4gICAgXSxcbiAgfSksXG5dKTtcblxuZGVmaW5lQmFja29mZmljZUZpbHRlcnM8VGVzdExpc3RPcGVyYXRpb24+KCkoW1xuICAvLyBAdHMtZXhwZWN0LWVycm9yIGtpbmQgaXMgYW4gZW51bSBzdHJpbmcgZmllbGQsIG5vdCBhIG51bWJlciBmaWVsZC5cbiAgbnVtYmVyRmlsdGVyPEJhY2tvZmZpY2VPcGVyYXRpb25XaGVyZTxUZXN0TGlzdE9wZXJhdGlvbj4sICdraW5kJz4oJ2tpbmQnLCB7XG4gICAgbGFiZWwsXG4gIH0pLFxuXSk7XG5cbmRlZmluZUJhY2tvZmZpY2VGaWx0ZXJzPFRlc3RMaXN0T3BlcmF0aW9uPigpKFtcbiAgLy8gQHRzLWV4cGVjdC1lcnJvciBhdHRlbXB0IGlzIGEgbnVtYmVyIGZpZWxkLCBub3QgYSBkYXRldGltZSBzdHJpbmcgZmllbGQuXG4gIGRhdGV0aW1lRmlsdGVyPEJhY2tvZmZpY2VPcGVyYXRpb25XaGVyZTxUZXN0TGlzdE9wZXJhdGlvbj4sICdhdHRlbXB0Jz4oXG4gICAgJ2F0dGVtcHQnLFxuICAgIHtcbiAgICAgIGxhYmVsLFxuICAgIH0sXG4gICksXG5dKTtcblxuZGVmaW5lQmFja29mZmljZVNvcnRzPFRlc3RMaXN0T3BlcmF0aW9uPigpKFtcbiAgLy8gQHRzLWV4cGVjdC1lcnJvciBVUERBVEVEX0FUX0RFU0MgaXMgbm90IGRlY2xhcmVkIGJ5IHRoZSBvcGVyYXRpb24gc29ydC5cbiAgeyBpZDogJ1VQREFURURfQVRfREVTQycsIGxhYmVsIH0sXG5dKTtcblxuZGVmaW5lQmFja29mZmljZUNvbm5lY3Rpb25MaXN0PFRlc3RMaXN0T3BlcmF0aW9uLCBUZXN0Q291bnRPcGVyYXRpb24+KCkoe1xuICB0aXRsZTogbGFiZWwsXG4gIHF1ZXJ5OiB7fSBhcyBuZXZlcixcbiAgZnJhZ21lbnQ6IHt9IGFzIG5ldmVyLFxuICBjb3VudDoge1xuICAgIHF1ZXJ5OiB7fSBhcyBuZXZlcixcbiAgICBidWlsZFZhcmlhYmxlczogKHsgd2hlcmUgfSkgPT4ge1xuICAgICAgcmV0dXJuIHsgd2hlcmUgfTtcbiAgICB9LFxuICAgIGdldENvdW50OiAoZGF0YSkgPT4ge1xuICAgICAgcmV0dXJuIChkYXRhIGFzIFRlc3RDb3VudE9wZXJhdGlvblsncmVzcG9uc2UnXSkucm93c0NvdW50O1xuICAgIH0sXG4gIH0sXG4gIGZpbHRlcnMsXG4gIHNvcnRzOiBkZWZpbmVCYWNrb2ZmaWNlU29ydHM8VGVzdExpc3RPcGVyYXRpb24+KCkoW1xuICAgIHsgaWQ6ICdDUkVBVEVEX0FUX0FTQycsIGxhYmVsIH0sXG4gIF0pLFxuICBkZWZhdWx0U3RhdGU6IHtcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIG9yZ2FuaXphdGlvbklkIGlzIG5vdCBkZWNsYXJlZCBieSB0aGUgbGlzdCB3aGVyZSBpbnB1dC5cbiAgICB3aGVyZTogeyBvcmdhbml6YXRpb25JZDogJ29yZy0xJyB9LFxuICAgIHNvcnQ6ICdDUkVBVEVEX0FUX0FTQycsXG4gIH0sXG4gIGdldENvbm5lY3Rpb246ICgpID0+IHtcbiAgICByZXR1cm4geyBlZGdlczogW10gfTtcbiAgfSxcbiAgdG9Sb3c6IChyb3cpID0+IHtcbiAgICByZXR1cm4gcm93O1xuICB9LFxuICBnZXRSb3dJZDogKCkgPT4ge1xuICAgIHJldHVybiAncm93JztcbiAgfSxcbiAgY29sdW1uczogW10sXG59KTtcblxuZGVmaW5lQmFja29mZmljZVBpY2tlcjxUZXN0UGlja2VyT3BlcmF0aW9uPigpKHtcbiAgcXVlcnk6IHt9IGFzIG5ldmVyLFxuICBmcmFnbWVudDoge30gYXMgbmV2ZXIsXG4gIGdldENvbm5lY3Rpb246ICgpID0+IHtcbiAgICByZXR1cm4geyBlZGdlczogW10gfTtcbiAgfSxcbiAgdG9Sb3c6ICgpID0+IHtcbiAgICByZXR1cm4geyBpZDogJ3JvdycsIHRpdGxlOiAnUm93JyB9O1xuICB9LFxuICBnZXRSb3dJZDogKHJvdykgPT4ge1xuICAgIHJldHVybiByb3cuaWQ7XG4gIH0sXG4gIC8vIEB0cy1leHBlY3QtZXJyb3IgcmV0dXJuZWQgd2hlcmUgc2hhcGUgaXMgbm90IGRlY2xhcmVkIGJ5IHRoZSBwaWNrZXIgb3BlcmF0aW9uLlxuICBidWlsZFF1ZXJ5VmFyaWFibGVzOiAoeyBzY29wZSB9KSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHdoZXJlOiB7XG4gICAgICAgIHByb2plY3RJZDogKHNjb3BlIGFzIHsgcHJvamVjdElkPzogc3RyaW5nIH0gfCB1bmRlZmluZWQpPy5wcm9qZWN0SWQsXG4gICAgICB9LFxuICAgICAgY291bnQ6IDIwLFxuICAgICAgY3Vyc29yOiBudWxsLFxuICAgIH07XG4gIH0sXG59KTtcbiJdfQ==
|