@payloadcms/graphql 3.0.0-alpha.4 → 3.0.0-alpha.41

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. package/dist/index.js +27 -83
  2. package/dist/resolvers/auth/access.d.ts +1 -1
  3. package/dist/resolvers/auth/access.d.ts.map +1 -1
  4. package/dist/resolvers/auth/access.js +8 -23
  5. package/dist/resolvers/auth/forgotPassword.js +6 -16
  6. package/dist/resolvers/auth/init.d.ts +1 -1
  7. package/dist/resolvers/auth/init.d.ts.map +1 -1
  8. package/dist/resolvers/auth/init.js +6 -16
  9. package/dist/resolvers/auth/login.d.ts +1 -4
  10. package/dist/resolvers/auth/login.d.ts.map +1 -1
  11. package/dist/resolvers/auth/login.js +8 -18
  12. package/dist/resolvers/auth/logout.js +8 -18
  13. package/dist/resolvers/auth/me.js +6 -16
  14. package/dist/resolvers/auth/refresh.d.ts +1 -2
  15. package/dist/resolvers/auth/refresh.d.ts.map +1 -1
  16. package/dist/resolvers/auth/refresh.js +9 -19
  17. package/dist/resolvers/auth/resetPassword.d.ts +1 -2
  18. package/dist/resolvers/auth/resetPassword.d.ts.map +1 -1
  19. package/dist/resolvers/auth/resetPassword.js +8 -18
  20. package/dist/resolvers/auth/unlock.d.ts +1 -1
  21. package/dist/resolvers/auth/unlock.d.ts.map +1 -1
  22. package/dist/resolvers/auth/unlock.js +6 -16
  23. package/dist/resolvers/auth/verifyEmail.d.ts +1 -1
  24. package/dist/resolvers/auth/verifyEmail.d.ts.map +1 -1
  25. package/dist/resolvers/auth/verifyEmail.js +6 -16
  26. package/dist/resolvers/collections/create.js +6 -16
  27. package/dist/resolvers/collections/delete.js +8 -18
  28. package/dist/resolvers/collections/docAccess.js +6 -16
  29. package/dist/resolvers/collections/find.js +8 -18
  30. package/dist/resolvers/collections/findByID.js +8 -18
  31. package/dist/resolvers/collections/findVersionByID.js +8 -18
  32. package/dist/resolvers/collections/findVersions.js +8 -18
  33. package/dist/resolvers/collections/restoreVersion.js +6 -16
  34. package/dist/resolvers/collections/update.js +8 -18
  35. package/dist/resolvers/globals/docAccess.js +6 -16
  36. package/dist/resolvers/globals/findOne.js +6 -16
  37. package/dist/resolvers/globals/findVersionByID.js +6 -16
  38. package/dist/resolvers/globals/findVersions.js +6 -16
  39. package/dist/resolvers/globals/index.d.ts +5 -5
  40. package/dist/resolvers/globals/index.d.ts.map +1 -1
  41. package/dist/resolvers/globals/index.js +7 -38
  42. package/dist/resolvers/globals/restoreVersion.js +6 -16
  43. package/dist/resolvers/globals/update.js +6 -16
  44. package/dist/resolvers/types.js +2 -5
  45. package/dist/schema/buildFallbackLocaleInputType.js +6 -21
  46. package/dist/schema/buildLocaleInputType.js +6 -21
  47. package/dist/schema/buildMutationInputType.js +53 -75
  48. package/dist/schema/buildObjectType.js +55 -70
  49. package/dist/schema/buildPaginatedListType.js +15 -25
  50. package/dist/schema/buildPoliciesType.js +27 -53
  51. package/dist/schema/buildWhereInputType.js +19 -34
  52. package/dist/schema/fieldToWhereInputSchemaMap.d.ts.map +1 -1
  53. package/dist/schema/fieldToWhereInputSchemaMap.js +34 -48
  54. package/dist/schema/initCollections.js +120 -135
  55. package/dist/schema/initGlobals.js +41 -56
  56. package/dist/schema/isFieldNullable.js +4 -14
  57. package/dist/schema/operators.js +2 -12
  58. package/dist/schema/recursivelyBuildNestedPaths.js +9 -24
  59. package/dist/schema/withNullableType.js +4 -14
  60. package/dist/schema/withOperators.js +80 -84
  61. package/dist/utilities/combineParentName.js +4 -19
  62. package/dist/utilities/formatName.js +2 -12
  63. package/dist/utilities/formatName.spec.js +3 -12
  64. package/dist/utilities/formatOptions.js +5 -20
  65. package/dist/utilities/getCheckIfLocaleObject.js +2 -12
  66. package/dist/utilities/groupOrTabHasRequiredSubfield.js +4 -14
  67. package/dist/utilities/uppercase.js +2 -12
  68. package/dist/utilities/wrapCustomResolver.d.ts +2 -2
  69. package/dist/utilities/wrapCustomResolver.d.ts.map +1 -1
  70. package/dist/utilities/wrapCustomResolver.js +4 -14
  71. package/package.json +5 -4
  72. package/src/index.ts +7 -7
  73. package/dist/utilities/isolateTransactionID.d.ts +0 -2
  74. package/dist/utilities/isolateTransactionID.d.ts.map +0 -1
  75. package/dist/utilities/isolateTransactionID.js +0 -3
@@ -1,49 +1,27 @@
1
- /* eslint-disable no-use-before-define */ "use strict";
2
- Object.defineProperty(exports, "__esModule", {
3
- value: true
4
- });
5
- function _export(target, all) {
6
- for(var name in all)Object.defineProperty(target, name, {
7
- enumerable: true,
8
- get: all[name]
9
- });
10
- }
11
- _export(exports, {
12
- buildMutationInputType: function() {
13
- return buildMutationInputType;
14
- },
15
- getCollectionIDType: function() {
16
- return getCollectionIDType;
17
- }
18
- });
19
- const _graphql = require("graphql");
20
- const _graphqltypejson = require("graphql-type-json");
21
- const _types = require("payload/types");
22
- const _utilities = require("payload/utilities");
23
- const _groupOrTabHasRequiredSubfield = require("../utilities/groupOrTabHasRequiredSubfield");
24
- const _combineParentName = /*#__PURE__*/ _interop_require_default(require("../utilities/combineParentName"));
25
- const _formatName = /*#__PURE__*/ _interop_require_default(require("../utilities/formatName"));
26
- const _withNullableType = /*#__PURE__*/ _interop_require_default(require("./withNullableType"));
27
- function _interop_require_default(obj) {
28
- return obj && obj.__esModule ? obj : {
29
- default: obj
30
- };
31
- }
1
+ /* eslint-disable no-use-before-define */ import { GraphQLBoolean, GraphQLEnumType, GraphQLFloat, GraphQLInputObjectType, GraphQLInt, GraphQLList, GraphQLNonNull, GraphQLString } from 'graphql';
2
+ import { GraphQLJSON } from 'graphql-type-json';
3
+ import { fieldAffectsData, optionIsObject, tabHasName } from 'payload/types';
4
+ import { toWords } from 'payload/utilities';
5
+ import { groupOrTabHasRequiredSubfield } from '../utilities/groupOrTabHasRequiredSubfield.js';
6
+ import combineParentName from '../utilities/combineParentName.js';
7
+ import formatName from '../utilities/formatName.js';
8
+ import withNullableType from './withNullableType.js';
9
+ import { flattenTopLevelFields } from 'payload/utilities';
32
10
  const idFieldTypes = {
33
- number: _graphql.GraphQLInt,
34
- text: _graphql.GraphQLString
11
+ number: GraphQLInt,
12
+ text: GraphQLString
35
13
  };
36
- const getCollectionIDType = (type, collection)=>{
37
- const idField = (0, _utilities.flattenTopLevelFields)(collection.fields).find((field)=>(0, _types.fieldAffectsData)(field) && field.name === 'id');
14
+ export const getCollectionIDType = (type, collection)=>{
15
+ const idField = flattenTopLevelFields(collection.fields).find((field)=>fieldAffectsData(field) && field.name === 'id');
38
16
  if (!idField) {
39
17
  return idFieldTypes[type];
40
18
  }
41
19
  return idFieldTypes[idField.type];
42
20
  };
43
- function buildMutationInputType({ name, fields, parentName, forceNullable = false, graphqlResult, config }) {
21
+ export function buildMutationInputType({ name, fields, parentName, forceNullable = false, graphqlResult, config }) {
44
22
  const fieldToSchemaMap = {
45
23
  array: (inputObjectTypeConfig, field)=>{
46
- const fullName = (0, _combineParentName.default)(parentName, (0, _utilities.toWords)(field.name, true));
24
+ const fullName = combineParentName(parentName, toWords(field.name, true));
47
25
  let type = buildMutationInputType({
48
26
  name: fullName,
49
27
  fields: field.fields,
@@ -52,7 +30,7 @@ function buildMutationInputType({ name, fields, parentName, forceNullable = fals
52
30
  config
53
31
  });
54
32
  if (!type) return inputObjectTypeConfig;
55
- type = new _graphql.GraphQLList((0, _withNullableType.default)(field, type, forceNullable));
33
+ type = new GraphQLList(withNullableType(field, type, forceNullable));
56
34
  return {
57
35
  ...inputObjectTypeConfig,
58
36
  [field.name]: {
@@ -63,19 +41,19 @@ function buildMutationInputType({ name, fields, parentName, forceNullable = fals
63
41
  blocks: (inputObjectTypeConfig, field)=>({
64
42
  ...inputObjectTypeConfig,
65
43
  [field.name]: {
66
- type: _graphqltypejson.GraphQLJSON
44
+ type: GraphQLJSON
67
45
  }
68
46
  }),
69
47
  checkbox: (inputObjectTypeConfig, field)=>({
70
48
  ...inputObjectTypeConfig,
71
49
  [field.name]: {
72
- type: _graphql.GraphQLBoolean
50
+ type: GraphQLBoolean
73
51
  }
74
52
  }),
75
53
  code: (inputObjectTypeConfig, field)=>({
76
54
  ...inputObjectTypeConfig,
77
55
  [field.name]: {
78
- type: (0, _withNullableType.default)(field, _graphql.GraphQLString, forceNullable)
56
+ type: withNullableType(field, GraphQLString, forceNullable)
79
57
  }
80
58
  }),
81
59
  collapsible: (inputObjectTypeConfig, field)=>field.fields.reduce((acc, subField)=>{
@@ -86,18 +64,18 @@ function buildMutationInputType({ name, fields, parentName, forceNullable = fals
86
64
  date: (inputObjectTypeConfig, field)=>({
87
65
  ...inputObjectTypeConfig,
88
66
  [field.name]: {
89
- type: (0, _withNullableType.default)(field, _graphql.GraphQLString, forceNullable)
67
+ type: withNullableType(field, GraphQLString, forceNullable)
90
68
  }
91
69
  }),
92
70
  email: (inputObjectTypeConfig, field)=>({
93
71
  ...inputObjectTypeConfig,
94
72
  [field.name]: {
95
- type: (0, _withNullableType.default)(field, _graphql.GraphQLString, forceNullable)
73
+ type: withNullableType(field, GraphQLString, forceNullable)
96
74
  }
97
75
  }),
98
76
  group: (inputObjectTypeConfig, field)=>{
99
- const requiresAtLeastOneField = (0, _groupOrTabHasRequiredSubfield.groupOrTabHasRequiredSubfield)(field);
100
- const fullName = (0, _combineParentName.default)(parentName, (0, _utilities.toWords)(field.name, true));
77
+ const requiresAtLeastOneField = groupOrTabHasRequiredSubfield(field);
78
+ const fullName = combineParentName(parentName, toWords(field.name, true));
101
79
  let type = buildMutationInputType({
102
80
  name: fullName,
103
81
  fields: field.fields,
@@ -106,7 +84,7 @@ function buildMutationInputType({ name, fields, parentName, forceNullable = fals
106
84
  config
107
85
  });
108
86
  if (!type) return inputObjectTypeConfig;
109
- if (requiresAtLeastOneField) type = new _graphql.GraphQLNonNull(type);
87
+ if (requiresAtLeastOneField) type = new GraphQLNonNull(type);
110
88
  return {
111
89
  ...inputObjectTypeConfig,
112
90
  [field.name]: {
@@ -117,51 +95,51 @@ function buildMutationInputType({ name, fields, parentName, forceNullable = fals
117
95
  json: (inputObjectTypeConfig, field)=>({
118
96
  ...inputObjectTypeConfig,
119
97
  [field.name]: {
120
- type: (0, _withNullableType.default)(field, _graphqltypejson.GraphQLJSON, forceNullable)
98
+ type: withNullableType(field, GraphQLJSON, forceNullable)
121
99
  }
122
100
  }),
123
101
  number: (inputObjectTypeConfig, field)=>{
124
- const type = field.name === 'id' ? _graphql.GraphQLInt : _graphql.GraphQLFloat;
102
+ const type = field.name === 'id' ? GraphQLInt : GraphQLFloat;
125
103
  return {
126
104
  ...inputObjectTypeConfig,
127
105
  [field.name]: {
128
- type: (0, _withNullableType.default)(field, field.hasMany === true ? new _graphql.GraphQLList(type) : type, forceNullable)
106
+ type: withNullableType(field, field.hasMany === true ? new GraphQLList(type) : type, forceNullable)
129
107
  }
130
108
  };
131
109
  },
132
110
  point: (inputObjectTypeConfig, field)=>({
133
111
  ...inputObjectTypeConfig,
134
112
  [field.name]: {
135
- type: (0, _withNullableType.default)(field, new _graphql.GraphQLList(_graphql.GraphQLFloat), forceNullable)
113
+ type: withNullableType(field, new GraphQLList(GraphQLFloat), forceNullable)
136
114
  }
137
115
  }),
138
116
  radio: (inputObjectTypeConfig, field)=>({
139
117
  ...inputObjectTypeConfig,
140
118
  [field.name]: {
141
- type: (0, _withNullableType.default)(field, _graphql.GraphQLString, forceNullable)
119
+ type: withNullableType(field, GraphQLString, forceNullable)
142
120
  }
143
121
  }),
144
122
  relationship: (inputObjectTypeConfig, field)=>{
145
123
  const { relationTo } = field;
146
124
  let type;
147
125
  if (Array.isArray(relationTo)) {
148
- const fullName = `${(0, _combineParentName.default)(parentName, (0, _utilities.toWords)(field.name, true))}RelationshipInput`;
149
- type = new _graphql.GraphQLInputObjectType({
126
+ const fullName = `${combineParentName(parentName, toWords(field.name, true))}RelationshipInput`;
127
+ type = new GraphQLInputObjectType({
150
128
  name: fullName,
151
129
  fields: {
152
130
  relationTo: {
153
- type: new _graphql.GraphQLEnumType({
131
+ type: new GraphQLEnumType({
154
132
  name: `${fullName}RelationTo`,
155
133
  values: relationTo.reduce((values, option)=>({
156
134
  ...values,
157
- [(0, _formatName.default)(option)]: {
135
+ [formatName(option)]: {
158
136
  value: option
159
137
  }
160
138
  }), {})
161
139
  })
162
140
  },
163
141
  value: {
164
- type: _graphqltypejson.GraphQLJSON
142
+ type: GraphQLJSON
165
143
  }
166
144
  }
167
145
  });
@@ -171,14 +149,14 @@ function buildMutationInputType({ name, fields, parentName, forceNullable = fals
171
149
  return {
172
150
  ...inputObjectTypeConfig,
173
151
  [field.name]: {
174
- type: field.hasMany ? new _graphql.GraphQLList(type) : type
152
+ type: field.hasMany ? new GraphQLList(type) : type
175
153
  }
176
154
  };
177
155
  },
178
156
  richText: (inputObjectTypeConfig, field)=>({
179
157
  ...inputObjectTypeConfig,
180
158
  [field.name]: {
181
- type: (0, _withNullableType.default)(field, _graphqltypejson.GraphQLJSON, forceNullable)
159
+ type: withNullableType(field, GraphQLJSON, forceNullable)
182
160
  }
183
161
  }),
184
162
  row: (inputObjectTypeConfig, field)=>field.fields.reduce((acc, subField)=>{
@@ -187,28 +165,28 @@ function buildMutationInputType({ name, fields, parentName, forceNullable = fals
187
165
  return acc;
188
166
  }, inputObjectTypeConfig),
189
167
  select: (inputObjectTypeConfig, field)=>{
190
- const formattedName = `${(0, _combineParentName.default)(parentName, field.name)}_MutationInput`;
191
- let type = new _graphql.GraphQLEnumType({
168
+ const formattedName = `${combineParentName(parentName, field.name)}_MutationInput`;
169
+ let type = new GraphQLEnumType({
192
170
  name: formattedName,
193
171
  values: field.options.reduce((values, option)=>{
194
- if ((0, _types.optionIsObject)(option)) {
172
+ if (optionIsObject(option)) {
195
173
  return {
196
174
  ...values,
197
- [(0, _formatName.default)(option.value)]: {
175
+ [formatName(option.value)]: {
198
176
  value: option.value
199
177
  }
200
178
  };
201
179
  }
202
180
  return {
203
181
  ...values,
204
- [(0, _formatName.default)(option)]: {
182
+ [formatName(option)]: {
205
183
  value: option
206
184
  }
207
185
  };
208
186
  }, {})
209
187
  });
210
- type = field.hasMany ? new _graphql.GraphQLList(type) : type;
211
- type = (0, _withNullableType.default)(field, type, forceNullable);
188
+ type = field.hasMany ? new GraphQLList(type) : type;
189
+ type = withNullableType(field, type, forceNullable);
212
190
  return {
213
191
  ...inputObjectTypeConfig,
214
192
  [field.name]: {
@@ -218,9 +196,9 @@ function buildMutationInputType({ name, fields, parentName, forceNullable = fals
218
196
  },
219
197
  tabs: (inputObjectTypeConfig, field)=>{
220
198
  return field.tabs.reduce((acc, tab)=>{
221
- if ((0, _types.tabHasName)(tab)) {
222
- const fullName = (0, _combineParentName.default)(parentName, (0, _utilities.toWords)(tab.name, true));
223
- const requiresAtLeastOneField = (0, _groupOrTabHasRequiredSubfield.groupOrTabHasRequiredSubfield)(field);
199
+ if (tabHasName(tab)) {
200
+ const fullName = combineParentName(parentName, toWords(tab.name, true));
201
+ const requiresAtLeastOneField = groupOrTabHasRequiredSubfield(field);
224
202
  let type = buildMutationInputType({
225
203
  name: fullName,
226
204
  fields: tab.fields,
@@ -229,7 +207,7 @@ function buildMutationInputType({ name, fields, parentName, forceNullable = fals
229
207
  config
230
208
  });
231
209
  if (!type) return acc;
232
- if (requiresAtLeastOneField) type = new _graphql.GraphQLNonNull(type);
210
+ if (requiresAtLeastOneField) type = new GraphQLNonNull(type);
233
211
  return {
234
212
  ...acc,
235
213
  [tab.name]: {
@@ -250,23 +228,23 @@ function buildMutationInputType({ name, fields, parentName, forceNullable = fals
250
228
  text: (inputObjectTypeConfig, field)=>({
251
229
  ...inputObjectTypeConfig,
252
230
  [field.name]: {
253
- type: (0, _withNullableType.default)(field, field.hasMany === true ? new _graphql.GraphQLList(_graphql.GraphQLString) : _graphql.GraphQLString, forceNullable)
231
+ type: withNullableType(field, field.hasMany === true ? new GraphQLList(GraphQLString) : GraphQLString, forceNullable)
254
232
  }
255
233
  }),
256
234
  textarea: (inputObjectTypeConfig, field)=>({
257
235
  ...inputObjectTypeConfig,
258
236
  [field.name]: {
259
- type: (0, _withNullableType.default)(field, _graphql.GraphQLString, forceNullable)
237
+ type: withNullableType(field, GraphQLString, forceNullable)
260
238
  }
261
239
  }),
262
240
  upload: (inputObjectTypeConfig, field)=>({
263
241
  ...inputObjectTypeConfig,
264
242
  [field.name]: {
265
- type: (0, _withNullableType.default)(field, _graphql.GraphQLString, forceNullable)
243
+ type: withNullableType(field, GraphQLString, forceNullable)
266
244
  }
267
245
  })
268
246
  };
269
- const fieldName = (0, _formatName.default)(name);
247
+ const fieldName = formatName(name);
270
248
  const fieldSchemas = fields.reduce((inputObjectTypeConfig, field)=>{
271
249
  const fieldSchema = fieldToSchemaMap[field.type];
272
250
  if (typeof fieldSchema !== 'function') {
@@ -284,10 +262,10 @@ function buildMutationInputType({ name, fields, parentName, forceNullable = fals
284
262
  if (Object.keys(fieldSchemas).length === 0) {
285
263
  return null;
286
264
  }
287
- return new _graphql.GraphQLInputObjectType({
265
+ return new GraphQLInputObjectType({
288
266
  name: `mutation${fieldName}Input`,
289
267
  fields: fieldSchemas
290
268
  });
291
269
  }
292
270
 
293
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zY2hlbWEvYnVpbGRNdXRhdGlvbklucHV0VHlwZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBuby11c2UtYmVmb3JlLWRlZmluZSAqL1xuaW1wb3J0IHR5cGUgeyBHcmFwaFFMSW5wdXRGaWVsZENvbmZpZywgR3JhcGhRTFNjYWxhclR5cGUsIEdyYXBoUUxUeXBlIH0gZnJvbSAnZ3JhcGhxbCdcblxuaW1wb3J0IHtcbiAgR3JhcGhRTEJvb2xlYW4sXG4gIEdyYXBoUUxFbnVtVHlwZSxcbiAgR3JhcGhRTEZsb2F0LFxuICBHcmFwaFFMSW5wdXRPYmplY3RUeXBlLFxuICBHcmFwaFFMSW50LFxuICBHcmFwaFFMTGlzdCxcbiAgR3JhcGhRTE5vbk51bGwsXG4gIEdyYXBoUUxTdHJpbmcsXG59IGZyb20gJ2dyYXBocWwnXG5pbXBvcnQgeyBHcmFwaFFMSlNPTiB9IGZyb20gJ2dyYXBocWwtdHlwZS1qc29uJ1xuXG5pbXBvcnQgdHlwZSB7IEdyYXBoUUxJbmZvIH0gZnJvbSAncGF5bG9hZC9jb25maWcnXG5pbXBvcnQgdHlwZSB7XG4gIFNhbml0aXplZENvbGxlY3Rpb25Db25maWcsXG4gIFNhbml0aXplZENvbmZpZyxcbiAgQXJyYXlGaWVsZCxcbiAgQmxvY2tGaWVsZCxcbiAgQ2hlY2tib3hGaWVsZCxcbiAgQ29kZUZpZWxkLFxuICBDb2xsYXBzaWJsZUZpZWxkLFxuICBEYXRlRmllbGQsXG4gIEVtYWlsRmllbGQsXG4gIEZpZWxkLFxuICBHcm91cEZpZWxkLFxuICBKU09ORmllbGQsXG4gIE51bWJlckZpZWxkLFxuICBQb2ludEZpZWxkLFxuICBSYWRpb0ZpZWxkLFxuICBSZWxhdGlvbnNoaXBGaWVsZCxcbiAgUmljaFRleHRGaWVsZCxcbiAgUm93RmllbGQsXG4gIFNlbGVjdEZpZWxkLFxuICBUYWJzRmllbGQsXG4gIFRleHRGaWVsZCxcbiAgVGV4dGFyZWFGaWVsZCxcbiAgVXBsb2FkRmllbGQsXG59IGZyb20gJ3BheWxvYWQvdHlwZXMnXG5pbXBvcnQgeyBmaWVsZEFmZmVjdHNEYXRhLCBvcHRpb25Jc09iamVjdCwgdGFiSGFzTmFtZSB9IGZyb20gJ3BheWxvYWQvdHlwZXMnXG5pbXBvcnQgeyB0b1dvcmRzIH0gZnJvbSAncGF5bG9hZC91dGlsaXRpZXMnXG5cbmltcG9ydCB7IGdyb3VwT3JUYWJIYXNSZXF1aXJlZFN1YmZpZWxkIH0gZnJvbSAnLi4vdXRpbGl0aWVzL2dyb3VwT3JUYWJIYXNSZXF1aXJlZFN1YmZpZWxkJ1xuaW1wb3J0IGNvbWJpbmVQYXJlbnROYW1lIGZyb20gJy4uL3V0aWxpdGllcy9jb21iaW5lUGFyZW50TmFtZSdcbmltcG9ydCBmb3JtYXROYW1lIGZyb20gJy4uL3V0aWxpdGllcy9mb3JtYXROYW1lJ1xuaW1wb3J0IHdpdGhOdWxsYWJsZVR5cGUgZnJvbSAnLi93aXRoTnVsbGFibGVUeXBlJ1xuaW1wb3J0IHsgZmxhdHRlblRvcExldmVsRmllbGRzIH0gZnJvbSAncGF5bG9hZC91dGlsaXRpZXMnXG5cbmNvbnN0IGlkRmllbGRUeXBlcyA9IHtcbiAgbnVtYmVyOiBHcmFwaFFMSW50LFxuICB0ZXh0OiBHcmFwaFFMU3RyaW5nLFxufVxuXG5leHBvcnQgY29uc3QgZ2V0Q29sbGVjdGlvbklEVHlwZSA9IChcbiAgdHlwZToga2V5b2YgdHlwZW9mIGlkRmllbGRUeXBlcyxcbiAgY29sbGVjdGlvbjogU2FuaXRpemVkQ29sbGVjdGlvbkNvbmZpZyxcbik6IEdyYXBoUUxTY2FsYXJUeXBlID0+IHtcbiAgY29uc3QgaWRGaWVsZCA9IGZsYXR0ZW5Ub3BMZXZlbEZpZWxkcyhjb2xsZWN0aW9uLmZpZWxkcykuZmluZChcbiAgICAoZmllbGQpID0+IGZpZWxkQWZmZWN0c0RhdGEoZmllbGQpICYmIGZpZWxkLm5hbWUgPT09ICdpZCcsXG4gIClcblxuICBpZiAoIWlkRmllbGQpIHtcbiAgICByZXR1cm4gaWRGaWVsZFR5cGVzW3R5cGVdXG4gIH1cblxuICByZXR1cm4gaWRGaWVsZFR5cGVzW2lkRmllbGQudHlwZV1cbn1cblxuZXhwb3J0IHR5cGUgSW5wdXRPYmplY3RUeXBlQ29uZmlnID0ge1xuICBbcGF0aDogc3RyaW5nXTogR3JhcGhRTElucHV0RmllbGRDb25maWdcbn1cblxudHlwZSBCdWlsZE11dGF0aW9uSW5wdXRUeXBlQXJncyA9IHtcbiAgbmFtZTogc3RyaW5nXG4gIGZpZWxkczogRmllbGRbXVxuICBwYXJlbnROYW1lOiBzdHJpbmdcbiAgZm9yY2VOdWxsYWJsZT86IGJvb2xlYW5cbiAgZ3JhcGhxbFJlc3VsdDogR3JhcGhRTEluZm9cbiAgY29uZmlnOiBTYW5pdGl6ZWRDb25maWdcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkTXV0YXRpb25JbnB1dFR5cGUoe1xuICBuYW1lLFxuICBmaWVsZHMsXG4gIHBhcmVudE5hbWUsXG4gIGZvcmNlTnVsbGFibGUgPSBmYWxzZSxcbiAgZ3JhcGhxbFJlc3VsdCxcbiAgY29uZmlnLFxufTogQnVpbGRNdXRhdGlvbklucHV0VHlwZUFyZ3MpOiBHcmFwaFFMSW5wdXRPYmplY3RUeXBlIHwgbnVsbCB7XG4gIGNvbnN0IGZpZWxkVG9TY2hlbWFNYXAgPSB7XG4gICAgYXJyYXk6IChpbnB1dE9iamVjdFR5cGVDb25maWc6IElucHV0T2JqZWN0VHlwZUNvbmZpZywgZmllbGQ6IEFycmF5RmllbGQpID0+IHtcbiAgICAgIGNvbnN0IGZ1bGxOYW1lID0gY29tYmluZVBhcmVudE5hbWUocGFyZW50TmFtZSwgdG9Xb3JkcyhmaWVsZC5uYW1lLCB0cnVlKSlcbiAgICAgIGxldCB0eXBlOiBHcmFwaFFMTGlzdDxHcmFwaFFMVHlwZT4gfCBHcmFwaFFMVHlwZSA9IGJ1aWxkTXV0YXRpb25JbnB1dFR5cGUoe1xuICAgICAgICBuYW1lOiBmdWxsTmFtZSxcbiAgICAgICAgZmllbGRzOiBmaWVsZC5maWVsZHMsXG4gICAgICAgIHBhcmVudE5hbWU6IGZ1bGxOYW1lLFxuICAgICAgICBncmFwaHFsUmVzdWx0LFxuICAgICAgICBjb25maWcsXG4gICAgICB9KVxuXG4gICAgICBpZiAoIXR5cGUpIHJldHVybiBpbnB1dE9iamVjdFR5cGVDb25maWdcblxuICAgICAgdHlwZSA9IG5ldyBHcmFwaFFMTGlzdCh3aXRoTnVsbGFibGVUeXBlKGZpZWxkLCB0eXBlLCBmb3JjZU51bGxhYmxlKSlcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmlucHV0T2JqZWN0VHlwZUNvbmZpZyxcbiAgICAgICAgW2ZpZWxkLm5hbWVdOiB7IHR5cGUgfSxcbiAgICAgIH1cbiAgICB9LFxuICAgIGJsb2NrczogKGlucHV0T2JqZWN0VHlwZUNvbmZpZzogSW5wdXRPYmplY3RUeXBlQ29uZmlnLCBmaWVsZDogQmxvY2tGaWVsZCkgPT4gKHtcbiAgICAgIC4uLmlucHV0T2JqZWN0VHlwZUNvbmZpZyxcbiAgICAgIFtmaWVsZC5uYW1lXTogeyB0eXBlOiBHcmFwaFFMSlNPTiB9LFxuICAgIH0pLFxuICAgIGNoZWNrYm94OiAoaW5wdXRPYmplY3RUeXBlQ29uZmlnOiBJbnB1dE9iamVjdFR5cGVDb25maWcsIGZpZWxkOiBDaGVja2JveEZpZWxkKSA9PiAoe1xuICAgICAgLi4uaW5wdXRPYmplY3RUeXBlQ29uZmlnLFxuICAgICAgW2ZpZWxkLm5hbWVdOiB7IHR5cGU6IEdyYXBoUUxCb29sZWFuIH0sXG4gICAgfSksXG4gICAgY29kZTogKGlucHV0T2JqZWN0VHlwZUNvbmZpZzogSW5wdXRPYmplY3RUeXBlQ29uZmlnLCBmaWVsZDogQ29kZUZpZWxkKSA9PiAoe1xuICAgICAgLi4uaW5wdXRPYmplY3RUeXBlQ29uZmlnLFxuICAgICAgW2ZpZWxkLm5hbWVdOiB7IHR5cGU6IHdpdGhOdWxsYWJsZVR5cGUoZmllbGQsIEdyYXBoUUxTdHJpbmcsIGZvcmNlTnVsbGFibGUpIH0sXG4gICAgfSksXG4gICAgY29sbGFwc2libGU6IChpbnB1dE9iamVjdFR5cGVDb25maWc6IElucHV0T2JqZWN0VHlwZUNvbmZpZywgZmllbGQ6IENvbGxhcHNpYmxlRmllbGQpID0+XG4gICAgICBmaWVsZC5maWVsZHMucmVkdWNlKChhY2MsIHN1YkZpZWxkOiBDb2xsYXBzaWJsZUZpZWxkKSA9PiB7XG4gICAgICAgIGNvbnN0IGFkZFN1YkZpZWxkID0gZmllbGRUb1NjaGVtYU1hcFtzdWJGaWVsZC50eXBlXVxuICAgICAgICBpZiAoYWRkU3ViRmllbGQpIHJldHVybiBhZGRTdWJGaWVsZChhY2MsIHN1YkZpZWxkKVxuICAgICAgICByZXR1cm4gYWNjXG4gICAgICB9LCBpbnB1dE9iamVjdFR5cGVDb25maWcpLFxuICAgIGRhdGU6IChpbnB1dE9iamVjdFR5cGVDb25maWc6IElucHV0T2JqZWN0VHlwZUNvbmZpZywgZmllbGQ6IERhdGVGaWVsZCkgPT4gKHtcbiAgICAgIC4uLmlucHV0T2JqZWN0VHlwZUNvbmZpZyxcbiAgICAgIFtmaWVsZC5uYW1lXTogeyB0eXBlOiB3aXRoTnVsbGFibGVUeXBlKGZpZWxkLCBHcmFwaFFMU3RyaW5nLCBmb3JjZU51bGxhYmxlKSB9LFxuICAgIH0pLFxuICAgIGVtYWlsOiAoaW5wdXRPYmplY3RUeXBlQ29uZmlnOiBJbnB1dE9iamVjdFR5cGVDb25maWcsIGZpZWxkOiBFbWFpbEZpZWxkKSA9PiAoe1xuICAgICAgLi4uaW5wdXRPYmplY3RUeXBlQ29uZmlnLFxuICAgICAgW2ZpZWxkLm5hbWVdOiB7IHR5cGU6IHdpdGhOdWxsYWJsZVR5cGUoZmllbGQsIEdyYXBoUUxTdHJpbmcsIGZvcmNlTnVsbGFibGUpIH0sXG4gICAgfSksXG4gICAgZ3JvdXA6IChpbnB1dE9iamVjdFR5cGVDb25maWc6IElucHV0T2JqZWN0VHlwZUNvbmZpZywgZmllbGQ6IEdyb3VwRmllbGQpID0+IHtcbiAgICAgIGNvbnN0IHJlcXVpcmVzQXRMZWFzdE9uZUZpZWxkID0gZ3JvdXBPclRhYkhhc1JlcXVpcmVkU3ViZmllbGQoZmllbGQpXG4gICAgICBjb25zdCBmdWxsTmFtZSA9IGNvbWJpbmVQYXJlbnROYW1lKHBhcmVudE5hbWUsIHRvV29yZHMoZmllbGQubmFtZSwgdHJ1ZSkpXG4gICAgICBsZXQgdHlwZTogR3JhcGhRTFR5cGUgPSBidWlsZE11dGF0aW9uSW5wdXRUeXBlKHtcbiAgICAgICAgbmFtZTogZnVsbE5hbWUsXG4gICAgICAgIGZpZWxkczogZmllbGQuZmllbGRzLFxuICAgICAgICBwYXJlbnROYW1lOiBmdWxsTmFtZSxcbiAgICAgICAgZ3JhcGhxbFJlc3VsdCxcbiAgICAgICAgY29uZmlnLFxuICAgICAgfSlcblxuICAgICAgaWYgKCF0eXBlKSByZXR1cm4gaW5wdXRPYmplY3RUeXBlQ29uZmlnXG5cbiAgICAgIGlmIChyZXF1aXJlc0F0TGVhc3RPbmVGaWVsZCkgdHlwZSA9IG5ldyBHcmFwaFFMTm9uTnVsbCh0eXBlKVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uaW5wdXRPYmplY3RUeXBlQ29uZmlnLFxuICAgICAgICBbZmllbGQubmFtZV06IHsgdHlwZSB9LFxuICAgICAgfVxuICAgIH0sXG4gICAganNvbjogKGlucHV0T2JqZWN0VHlwZUNvbmZpZzogSW5wdXRPYmplY3RUeXBlQ29uZmlnLCBmaWVsZDogSlNPTkZpZWxkKSA9PiAoe1xuICAgICAgLi4uaW5wdXRPYmplY3RUeXBlQ29uZmlnLFxuICAgICAgW2ZpZWxkLm5hbWVdOiB7IHR5cGU6IHdpdGhOdWxsYWJsZVR5cGUoZmllbGQsIEdyYXBoUUxKU09OLCBmb3JjZU51bGxhYmxlKSB9LFxuICAgIH0pLFxuICAgIG51bWJlcjogKGlucHV0T2JqZWN0VHlwZUNvbmZpZzogSW5wdXRPYmplY3RUeXBlQ29uZmlnLCBmaWVsZDogTnVtYmVyRmllbGQpID0+IHtcbiAgICAgIGNvbnN0IHR5cGUgPSBmaWVsZC5uYW1lID09PSAnaWQnID8gR3JhcGhRTEludCA6IEdyYXBoUUxGbG9hdFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uaW5wdXRPYmplY3RUeXBlQ29uZmlnLFxuICAgICAgICBbZmllbGQubmFtZV06IHtcbiAgICAgICAgICB0eXBlOiB3aXRoTnVsbGFibGVUeXBlKFxuICAgICAgICAgICAgZmllbGQsXG4gICAgICAgICAgICBmaWVsZC5oYXNNYW55ID09PSB0cnVlID8gbmV3IEdyYXBoUUxMaXN0KHR5cGUpIDogdHlwZSxcbiAgICAgICAgICAgIGZvcmNlTnVsbGFibGUsXG4gICAgICAgICAgKSxcbiAgICAgICAgfSxcbiAgICAgIH1cbiAgICB9LFxuICAgIHBvaW50OiAoaW5wdXRPYmplY3RUeXBlQ29uZmlnOiBJbnB1dE9iamVjdFR5cGVDb25maWcsIGZpZWxkOiBQb2ludEZpZWxkKSA9PiAoe1xuICAgICAgLi4uaW5wdXRPYmplY3RUeXBlQ29uZmlnLFxuICAgICAgW2ZpZWxkLm5hbWVdOiB7IHR5cGU6IHdpdGhOdWxsYWJsZVR5cGUoZmllbGQsIG5ldyBHcmFwaFFMTGlzdChHcmFwaFFMRmxvYXQpLCBmb3JjZU51bGxhYmxlKSB9LFxuICAgIH0pLFxuICAgIHJhZGlvOiAoaW5wdXRPYmplY3RUeXBlQ29uZmlnOiBJbnB1dE9iamVjdFR5cGVDb25maWcsIGZpZWxkOiBSYWRpb0ZpZWxkKSA9PiAoe1xuICAgICAgLi4uaW5wdXRPYmplY3RUeXBlQ29uZmlnLFxuICAgICAgW2ZpZWxkLm5hbWVdOiB7IHR5cGU6IHdpdGhOdWxsYWJsZVR5cGUoZmllbGQsIEdyYXBoUUxTdHJpbmcsIGZvcmNlTnVsbGFibGUpIH0sXG4gICAgfSksXG4gICAgcmVsYXRpb25zaGlwOiAoaW5wdXRPYmplY3RUeXBlQ29uZmlnOiBJbnB1dE9iamVjdFR5cGVDb25maWcsIGZpZWxkOiBSZWxhdGlvbnNoaXBGaWVsZCkgPT4ge1xuICAgICAgY29uc3QgeyByZWxhdGlvblRvIH0gPSBmaWVsZFxuICAgICAgdHlwZSBQYXlsb2FkR3JhcGhRTFJlbGF0aW9uc2hpcFR5cGUgPVxuICAgICAgICB8IEdyYXBoUUxJbnB1dE9iamVjdFR5cGVcbiAgICAgICAgfCBHcmFwaFFMTGlzdDxHcmFwaFFMU2NhbGFyVHlwZT5cbiAgICAgICAgfCBHcmFwaFFMU2NhbGFyVHlwZVxuICAgICAgbGV0IHR5cGU6IFBheWxvYWRHcmFwaFFMUmVsYXRpb25zaGlwVHlwZVxuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShyZWxhdGlvblRvKSkge1xuICAgICAgICBjb25zdCBmdWxsTmFtZSA9IGAke2NvbWJpbmVQYXJlbnROYW1lKFxuICAgICAgICAgIHBhcmVudE5hbWUsXG4gICAgICAgICAgdG9Xb3JkcyhmaWVsZC5uYW1lLCB0cnVlKSxcbiAgICAgICAgKX1SZWxhdGlvbnNoaXBJbnB1dGBcbiAgICAgICAgdHlwZSA9IG5ldyBHcmFwaFFMSW5wdXRPYmplY3RUeXBlKHtcbiAgICAgICAgICBuYW1lOiBmdWxsTmFtZSxcbiAgICAgICAgICBmaWVsZHM6IHtcbiAgICAgICAgICAgIHJlbGF0aW9uVG86IHtcbiAgICAgICAgICAgICAgdHlwZTogbmV3IEdyYXBoUUxFbnVtVHlwZSh7XG4gICAgICAgICAgICAgICAgbmFtZTogYCR7ZnVsbE5hbWV9UmVsYXRpb25Ub2AsXG4gICAgICAgICAgICAgICAgdmFsdWVzOiByZWxhdGlvblRvLnJlZHVjZShcbiAgICAgICAgICAgICAgICAgICh2YWx1ZXMsIG9wdGlvbikgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgLi4udmFsdWVzLFxuICAgICAgICAgICAgICAgICAgICBbZm9ybWF0TmFtZShvcHRpb24pXToge1xuICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBvcHRpb24sXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZhbHVlOiB7IHR5cGU6IEdyYXBoUUxKU09OIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHR5cGUgPSBnZXRDb2xsZWN0aW9uSURUeXBlKFxuICAgICAgICAgIGNvbmZpZy5kYi5kZWZhdWx0SURUeXBlLFxuICAgICAgICAgIGdyYXBocWxSZXN1bHQuY29sbGVjdGlvbnNbcmVsYXRpb25Ub10uY29uZmlnLFxuICAgICAgICApXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmlucHV0T2JqZWN0VHlwZUNvbmZpZyxcbiAgICAgICAgW2ZpZWxkLm5hbWVdOiB7IHR5cGU6IGZpZWxkLmhhc01hbnkgPyBuZXcgR3JhcGhRTExpc3QodHlwZSkgOiB0eXBlIH0sXG4gICAgICB9XG4gICAgfSxcbiAgICByaWNoVGV4dDogKGlucHV0T2JqZWN0VHlwZUNvbmZpZzogSW5wdXRPYmplY3RUeXBlQ29uZmlnLCBmaWVsZDogUmljaFRleHRGaWVsZCkgPT4gKHtcbiAgICAgIC4uLmlucHV0T2JqZWN0VHlwZUNvbmZpZyxcbiAgICAgIFtmaWVsZC5uYW1lXTogeyB0eXBlOiB3aXRoTnVsbGFibGVUeXBlKGZpZWxkLCBHcmFwaFFMSlNPTiwgZm9yY2VOdWxsYWJsZSkgfSxcbiAgICB9KSxcbiAgICByb3c6IChpbnB1dE9iamVjdFR5cGVDb25maWc6IElucHV0T2JqZWN0VHlwZUNvbmZpZywgZmllbGQ6IFJvd0ZpZWxkKSA9PlxuICAgICAgZmllbGQuZmllbGRzLnJlZHVjZSgoYWNjLCBzdWJGaWVsZDogRmllbGQpID0+IHtcbiAgICAgICAgY29uc3QgYWRkU3ViRmllbGQgPSBmaWVsZFRvU2NoZW1hTWFwW3N1YkZpZWxkLnR5cGVdXG4gICAgICAgIGlmIChhZGRTdWJGaWVsZCkgcmV0dXJuIGFkZFN1YkZpZWxkKGFjYywgc3ViRmllbGQpXG4gICAgICAgIHJldHVybiBhY2NcbiAgICAgIH0sIGlucHV0T2JqZWN0VHlwZUNvbmZpZyksXG4gICAgc2VsZWN0OiAoaW5wdXRPYmplY3RUeXBlQ29uZmlnOiBJbnB1dE9iamVjdFR5cGVDb25maWcsIGZpZWxkOiBTZWxlY3RGaWVsZCkgPT4ge1xuICAgICAgY29uc3QgZm9ybWF0dGVkTmFtZSA9IGAke2NvbWJpbmVQYXJlbnROYW1lKHBhcmVudE5hbWUsIGZpZWxkLm5hbWUpfV9NdXRhdGlvbklucHV0YFxuICAgICAgbGV0IHR5cGU6IEdyYXBoUUxUeXBlID0gbmV3IEdyYXBoUUxFbnVtVHlwZSh7XG4gICAgICAgIG5hbWU6IGZvcm1hdHRlZE5hbWUsXG4gICAgICAgIHZhbHVlczogZmllbGQub3B0aW9ucy5yZWR1Y2UoKHZhbHVlcywgb3B0aW9uKSA9PiB7XG4gICAgICAgICAgaWYgKG9wdGlvbklzT2JqZWN0KG9wdGlvbikpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIC4uLnZhbHVlcyxcbiAgICAgICAgICAgICAgW2Zvcm1hdE5hbWUob3B0aW9uLnZhbHVlKV06IHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogb3B0aW9uLnZhbHVlLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi52YWx1ZXMsXG4gICAgICAgICAgICBbZm9ybWF0TmFtZShvcHRpb24pXToge1xuICAgICAgICAgICAgICB2YWx1ZTogb3B0aW9uLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9XG4gICAgICAgIH0sIHt9KSxcbiAgICAgIH0pXG5cbiAgICAgIHR5cGUgPSBmaWVsZC5oYXNNYW55ID8gbmV3IEdyYXBoUUxMaXN0KHR5cGUpIDogdHlwZVxuICAgICAgdHlwZSA9IHdpdGhOdWxsYWJsZVR5cGUoZmllbGQsIHR5cGUsIGZvcmNlTnVsbGFibGUpXG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmlucHV0T2JqZWN0VHlwZUNvbmZpZyxcbiAgICAgICAgW2ZpZWxkLm5hbWVdOiB7IHR5cGUgfSxcbiAgICAgIH1cbiAgICB9LFxuICAgIHRhYnM6IChpbnB1dE9iamVjdFR5cGVDb25maWc6IElucHV0T2JqZWN0VHlwZUNvbmZpZywgZmllbGQ6IFRhYnNGaWVsZCkgPT4ge1xuICAgICAgcmV0dXJuIGZpZWxkLnRhYnMucmVkdWNlKChhY2MsIHRhYikgPT4ge1xuICAgICAgICBpZiAodGFiSGFzTmFtZSh0YWIpKSB7XG4gICAgICAgICAgY29uc3QgZnVsbE5hbWUgPSBjb21iaW5lUGFyZW50TmFtZShwYXJlbnROYW1lLCB0b1dvcmRzKHRhYi5uYW1lLCB0cnVlKSlcbiAgICAgICAgICBjb25zdCByZXF1aXJlc0F0TGVhc3RPbmVGaWVsZCA9IGdyb3VwT3JUYWJIYXNSZXF1aXJlZFN1YmZpZWxkKGZpZWxkKVxuICAgICAgICAgIGxldCB0eXBlOiBHcmFwaFFMVHlwZSA9IGJ1aWxkTXV0YXRpb25JbnB1dFR5cGUoe1xuICAgICAgICAgICAgbmFtZTogZnVsbE5hbWUsXG4gICAgICAgICAgICBmaWVsZHM6IHRhYi5maWVsZHMsXG4gICAgICAgICAgICBwYXJlbnROYW1lOiBmdWxsTmFtZSxcbiAgICAgICAgICAgIGdyYXBocWxSZXN1bHQsXG4gICAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgfSlcblxuICAgICAgICAgIGlmICghdHlwZSkgcmV0dXJuIGFjY1xuXG4gICAgICAgICAgaWYgKHJlcXVpcmVzQXRMZWFzdE9uZUZpZWxkKSB0eXBlID0gbmV3IEdyYXBoUUxOb25OdWxsKHR5cGUpXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLmFjYyxcbiAgICAgICAgICAgIFt0YWIubmFtZV06IHsgdHlwZSB9LFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uYWNjLFxuICAgICAgICAgIC4uLnRhYi5maWVsZHMucmVkdWNlKChzdWJGaWVsZFNjaGVtYSwgc3ViRmllbGQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGFkZFN1YkZpZWxkID0gZmllbGRUb1NjaGVtYU1hcFtzdWJGaWVsZC50eXBlXVxuICAgICAgICAgICAgaWYgKGFkZFN1YkZpZWxkKSByZXR1cm4gYWRkU3ViRmllbGQoc3ViRmllbGRTY2hlbWEsIHN1YkZpZWxkKVxuICAgICAgICAgICAgcmV0dXJuIHN1YkZpZWxkU2NoZW1hXG4gICAgICAgICAgfSwgYWNjKSxcbiAgICAgICAgfVxuICAgICAgfSwgaW5wdXRPYmplY3RUeXBlQ29uZmlnKVxuICAgIH0sXG4gICAgdGV4dDogKGlucHV0T2JqZWN0VHlwZUNvbmZpZzogSW5wdXRPYmplY3RUeXBlQ29uZmlnLCBmaWVsZDogVGV4dEZpZWxkKSA9PiAoe1xuICAgICAgLi4uaW5wdXRPYmplY3RUeXBlQ29uZmlnLFxuICAgICAgW2ZpZWxkLm5hbWVdOiB7XG4gICAgICAgIHR5cGU6IHdpdGhOdWxsYWJsZVR5cGUoXG4gICAgICAgICAgZmllbGQsXG4gICAgICAgICAgZmllbGQuaGFzTWFueSA9PT0gdHJ1ZSA/IG5ldyBHcmFwaFFMTGlzdChHcmFwaFFMU3RyaW5nKSA6IEdyYXBoUUxTdHJpbmcsXG4gICAgICAgICAgZm9yY2VOdWxsYWJsZSxcbiAgICAgICAgKSxcbiAgICAgIH0sXG4gICAgfSksXG4gICAgdGV4dGFyZWE6IChpbnB1dE9iamVjdFR5cGVDb25maWc6IElucHV0T2JqZWN0VHlwZUNvbmZpZywgZmllbGQ6IFRleHRhcmVhRmllbGQpID0+ICh7XG4gICAgICAuLi5pbnB1dE9iamVjdFR5cGVDb25maWcsXG4gICAgICBbZmllbGQubmFtZV06IHsgdHlwZTogd2l0aE51bGxhYmxlVHlwZShmaWVsZCwgR3JhcGhRTFN0cmluZywgZm9yY2VOdWxsYWJsZSkgfSxcbiAgICB9KSxcbiAgICB1cGxvYWQ6IChpbnB1dE9iamVjdFR5cGVDb25maWc6IElucHV0T2JqZWN0VHlwZUNvbmZpZywgZmllbGQ6IFVwbG9hZEZpZWxkKSA9PiAoe1xuICAgICAgLi4uaW5wdXRPYmplY3RUeXBlQ29uZmlnLFxuICAgICAgW2ZpZWxkLm5hbWVdOiB7IHR5cGU6IHdpdGhOdWxsYWJsZVR5cGUoZmllbGQsIEdyYXBoUUxTdHJpbmcsIGZvcmNlTnVsbGFibGUpIH0sXG4gICAgfSksXG4gIH1cblxuICBjb25zdCBmaWVsZE5hbWUgPSBmb3JtYXROYW1lKG5hbWUpXG5cbiAgY29uc3QgZmllbGRTY2hlbWFzID0gZmllbGRzLnJlZHVjZSgoaW5wdXRPYmplY3RUeXBlQ29uZmlnLCBmaWVsZCkgPT4ge1xuICAgIGNvbnN0IGZpZWxkU2NoZW1hID0gZmllbGRUb1NjaGVtYU1hcFtmaWVsZC50eXBlXVxuXG4gICAgaWYgKHR5cGVvZiBmaWVsZFNjaGVtYSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIGlucHV0T2JqZWN0VHlwZUNvbmZpZ1xuICAgIH1cblxuICAgIGNvbnN0IHNjaGVtYSA9IGZpZWxkU2NoZW1hKGlucHV0T2JqZWN0VHlwZUNvbmZpZywgZmllbGQpXG4gICAgaWYgKE9iamVjdC5rZXlzKHNjaGVtYSkubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gaW5wdXRPYmplY3RUeXBlQ29uZmlnXG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmlucHV0T2JqZWN0VHlwZUNvbmZpZyxcbiAgICAgIC4uLmZpZWxkU2NoZW1hKGlucHV0T2JqZWN0VHlwZUNvbmZpZywgZmllbGQpLFxuICAgIH1cbiAgfSwge30pXG5cbiAgaWYgKE9iamVjdC5rZXlzKGZpZWxkU2NoZW1hcykubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIHJldHVybiBuZXcgR3JhcGhRTElucHV0T2JqZWN0VHlwZSh7XG4gICAgbmFtZTogYG11dGF0aW9uJHtmaWVsZE5hbWV9SW5wdXRgLFxuICAgIGZpZWxkczogZmllbGRTY2hlbWFzLFxuICB9KVxufVxuIl0sIm5hbWVzIjpbImJ1aWxkTXV0YXRpb25JbnB1dFR5cGUiLCJnZXRDb2xsZWN0aW9uSURUeXBlIiwiaWRGaWVsZFR5cGVzIiwibnVtYmVyIiwiR3JhcGhRTEludCIsInRleHQiLCJHcmFwaFFMU3RyaW5nIiwidHlwZSIsImNvbGxlY3Rpb24iLCJpZEZpZWxkIiwiZmxhdHRlblRvcExldmVsRmllbGRzIiwiZmllbGRzIiwiZmluZCIsImZpZWxkIiwiZmllbGRBZmZlY3RzRGF0YSIsIm5hbWUiLCJwYXJlbnROYW1lIiwiZm9yY2VOdWxsYWJsZSIsImdyYXBocWxSZXN1bHQiLCJjb25maWciLCJmaWVsZFRvU2NoZW1hTWFwIiwiYXJyYXkiLCJpbnB1dE9iamVjdFR5cGVDb25maWciLCJmdWxsTmFtZSIsImNvbWJpbmVQYXJlbnROYW1lIiwidG9Xb3JkcyIsIkdyYXBoUUxMaXN0Iiwid2l0aE51bGxhYmxlVHlwZSIsImJsb2NrcyIsIkdyYXBoUUxKU09OIiwiY2hlY2tib3giLCJHcmFwaFFMQm9vbGVhbiIsImNvZGUiLCJjb2xsYXBzaWJsZSIsInJlZHVjZSIsImFjYyIsInN1YkZpZWxkIiwiYWRkU3ViRmllbGQiLCJkYXRlIiwiZW1haWwiLCJncm91cCIsInJlcXVpcmVzQXRMZWFzdE9uZUZpZWxkIiwiZ3JvdXBPclRhYkhhc1JlcXVpcmVkU3ViZmllbGQiLCJHcmFwaFFMTm9uTnVsbCIsImpzb24iLCJHcmFwaFFMRmxvYXQiLCJoYXNNYW55IiwicG9pbnQiLCJyYWRpbyIsInJlbGF0aW9uc2hpcCIsInJlbGF0aW9uVG8iLCJBcnJheSIsImlzQXJyYXkiLCJHcmFwaFFMSW5wdXRPYmplY3RUeXBlIiwiR3JhcGhRTEVudW1UeXBlIiwidmFsdWVzIiwib3B0aW9uIiwiZm9ybWF0TmFtZSIsInZhbHVlIiwiZGIiLCJkZWZhdWx0SURUeXBlIiwiY29sbGVjdGlvbnMiLCJyaWNoVGV4dCIsInJvdyIsInNlbGVjdCIsImZvcm1hdHRlZE5hbWUiLCJvcHRpb25zIiwib3B0aW9uSXNPYmplY3QiLCJ0YWJzIiwidGFiIiwidGFiSGFzTmFtZSIsInN1YkZpZWxkU2NoZW1hIiwidGV4dGFyZWEiLCJ1cGxvYWQiLCJmaWVsZE5hbWUiLCJmaWVsZFNjaGVtYXMiLCJmaWVsZFNjaGVtYSIsInNjaGVtYSIsIk9iamVjdCIsImtleXMiLCJsZW5ndGgiXSwibWFwcGluZ3MiOiJBQUFBLHVDQUF1Qzs7Ozs7Ozs7Ozs7SUFtRnZCQSxzQkFBc0I7ZUFBdEJBOztJQTVCSEMsbUJBQW1CO2VBQW5CQTs7O3lCQTNDTjtpQ0FDcUI7dUJBNEJpQzsyQkFDckM7K0NBRXNCOzBFQUNoQjtt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
271
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zY2hlbWEvYnVpbGRNdXRhdGlvbklucHV0VHlwZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBuby11c2UtYmVmb3JlLWRlZmluZSAqL1xuaW1wb3J0IHR5cGUgeyBHcmFwaFFMSW5wdXRGaWVsZENvbmZpZywgR3JhcGhRTFNjYWxhclR5cGUsIEdyYXBoUUxUeXBlIH0gZnJvbSAnZ3JhcGhxbCdcblxuaW1wb3J0IHtcbiAgR3JhcGhRTEJvb2xlYW4sXG4gIEdyYXBoUUxFbnVtVHlwZSxcbiAgR3JhcGhRTEZsb2F0LFxuICBHcmFwaFFMSW5wdXRPYmplY3RUeXBlLFxuICBHcmFwaFFMSW50LFxuICBHcmFwaFFMTGlzdCxcbiAgR3JhcGhRTE5vbk51bGwsXG4gIEdyYXBoUUxTdHJpbmcsXG59IGZyb20gJ2dyYXBocWwnXG5pbXBvcnQgeyBHcmFwaFFMSlNPTiB9IGZyb20gJ2dyYXBocWwtdHlwZS1qc29uJ1xuXG5pbXBvcnQgdHlwZSB7IEdyYXBoUUxJbmZvIH0gZnJvbSAncGF5bG9hZC9jb25maWcnXG5pbXBvcnQgdHlwZSB7XG4gIFNhbml0aXplZENvbGxlY3Rpb25Db25maWcsXG4gIFNhbml0aXplZENvbmZpZyxcbiAgQXJyYXlGaWVsZCxcbiAgQmxvY2tGaWVsZCxcbiAgQ2hlY2tib3hGaWVsZCxcbiAgQ29kZUZpZWxkLFxuICBDb2xsYXBzaWJsZUZpZWxkLFxuICBEYXRlRmllbGQsXG4gIEVtYWlsRmllbGQsXG4gIEZpZWxkLFxuICBHcm91cEZpZWxkLFxuICBKU09ORmllbGQsXG4gIE51bWJlckZpZWxkLFxuICBQb2ludEZpZWxkLFxuICBSYWRpb0ZpZWxkLFxuICBSZWxhdGlvbnNoaXBGaWVsZCxcbiAgUmljaFRleHRGaWVsZCxcbiAgUm93RmllbGQsXG4gIFNlbGVjdEZpZWxkLFxuICBUYWJzRmllbGQsXG4gIFRleHRGaWVsZCxcbiAgVGV4dGFyZWFGaWVsZCxcbiAgVXBsb2FkRmllbGQsXG59IGZyb20gJ3BheWxvYWQvdHlwZXMnXG5pbXBvcnQgeyBmaWVsZEFmZmVjdHNEYXRhLCBvcHRpb25Jc09iamVjdCwgdGFiSGFzTmFtZSB9IGZyb20gJ3BheWxvYWQvdHlwZXMnXG5pbXBvcnQgeyB0b1dvcmRzIH0gZnJvbSAncGF5bG9hZC91dGlsaXRpZXMnXG5cbmltcG9ydCB7IGdyb3VwT3JUYWJIYXNSZXF1aXJlZFN1YmZpZWxkIH0gZnJvbSAnLi4vdXRpbGl0aWVzL2dyb3VwT3JUYWJIYXNSZXF1aXJlZFN1YmZpZWxkLmpzJ1xuaW1wb3J0IGNvbWJpbmVQYXJlbnROYW1lIGZyb20gJy4uL3V0aWxpdGllcy9jb21iaW5lUGFyZW50TmFtZS5qcydcbmltcG9ydCBmb3JtYXROYW1lIGZyb20gJy4uL3V0aWxpdGllcy9mb3JtYXROYW1lLmpzJ1xuaW1wb3J0IHdpdGhOdWxsYWJsZVR5cGUgZnJvbSAnLi93aXRoTnVsbGFibGVUeXBlLmpzJ1xuaW1wb3J0IHsgZmxhdHRlblRvcExldmVsRmllbGRzIH0gZnJvbSAncGF5bG9hZC91dGlsaXRpZXMnXG5cbmNvbnN0IGlkRmllbGRUeXBlcyA9IHtcbiAgbnVtYmVyOiBHcmFwaFFMSW50LFxuICB0ZXh0OiBHcmFwaFFMU3RyaW5nLFxufVxuXG5leHBvcnQgY29uc3QgZ2V0Q29sbGVjdGlvbklEVHlwZSA9IChcbiAgdHlwZToga2V5b2YgdHlwZW9mIGlkRmllbGRUeXBlcyxcbiAgY29sbGVjdGlvbjogU2FuaXRpemVkQ29sbGVjdGlvbkNvbmZpZyxcbik6IEdyYXBoUUxTY2FsYXJUeXBlID0+IHtcbiAgY29uc3QgaWRGaWVsZCA9IGZsYXR0ZW5Ub3BMZXZlbEZpZWxkcyhjb2xsZWN0aW9uLmZpZWxkcykuZmluZChcbiAgICAoZmllbGQpID0+IGZpZWxkQWZmZWN0c0RhdGEoZmllbGQpICYmIGZpZWxkLm5hbWUgPT09ICdpZCcsXG4gIClcblxuICBpZiAoIWlkRmllbGQpIHtcbiAgICByZXR1cm4gaWRGaWVsZFR5cGVzW3R5cGVdXG4gIH1cblxuICByZXR1cm4gaWRGaWVsZFR5cGVzW2lkRmllbGQudHlwZV1cbn1cblxuZXhwb3J0IHR5cGUgSW5wdXRPYmplY3RUeXBlQ29uZmlnID0ge1xuICBbcGF0aDogc3RyaW5nXTogR3JhcGhRTElucHV0RmllbGRDb25maWdcbn1cblxudHlwZSBCdWlsZE11dGF0aW9uSW5wdXRUeXBlQXJncyA9IHtcbiAgbmFtZTogc3RyaW5nXG4gIGZpZWxkczogRmllbGRbXVxuICBwYXJlbnROYW1lOiBzdHJpbmdcbiAgZm9yY2VOdWxsYWJsZT86IGJvb2xlYW5cbiAgZ3JhcGhxbFJlc3VsdDogR3JhcGhRTEluZm9cbiAgY29uZmlnOiBTYW5pdGl6ZWRDb25maWdcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkTXV0YXRpb25JbnB1dFR5cGUoe1xuICBuYW1lLFxuICBmaWVsZHMsXG4gIHBhcmVudE5hbWUsXG4gIGZvcmNlTnVsbGFibGUgPSBmYWxzZSxcbiAgZ3JhcGhxbFJlc3VsdCxcbiAgY29uZmlnLFxufTogQnVpbGRNdXRhdGlvbklucHV0VHlwZUFyZ3MpOiBHcmFwaFFMSW5wdXRPYmplY3RUeXBlIHwgbnVsbCB7XG4gIGNvbnN0IGZpZWxkVG9TY2hlbWFNYXAgPSB7XG4gICAgYXJyYXk6IChpbnB1dE9iamVjdFR5cGVDb25maWc6IElucHV0T2JqZWN0VHlwZUNvbmZpZywgZmllbGQ6IEFycmF5RmllbGQpID0+IHtcbiAgICAgIGNvbnN0IGZ1bGxOYW1lID0gY29tYmluZVBhcmVudE5hbWUocGFyZW50TmFtZSwgdG9Xb3JkcyhmaWVsZC5uYW1lLCB0cnVlKSlcbiAgICAgIGxldCB0eXBlOiBHcmFwaFFMTGlzdDxHcmFwaFFMVHlwZT4gfCBHcmFwaFFMVHlwZSA9IGJ1aWxkTXV0YXRpb25JbnB1dFR5cGUoe1xuICAgICAgICBuYW1lOiBmdWxsTmFtZSxcbiAgICAgICAgZmllbGRzOiBmaWVsZC5maWVsZHMsXG4gICAgICAgIHBhcmVudE5hbWU6IGZ1bGxOYW1lLFxuICAgICAgICBncmFwaHFsUmVzdWx0LFxuICAgICAgICBjb25maWcsXG4gICAgICB9KVxuXG4gICAgICBpZiAoIXR5cGUpIHJldHVybiBpbnB1dE9iamVjdFR5cGVDb25maWdcblxuICAgICAgdHlwZSA9IG5ldyBHcmFwaFFMTGlzdCh3aXRoTnVsbGFibGVUeXBlKGZpZWxkLCB0eXBlLCBmb3JjZU51bGxhYmxlKSlcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmlucHV0T2JqZWN0VHlwZUNvbmZpZyxcbiAgICAgICAgW2ZpZWxkLm5hbWVdOiB7IHR5cGUgfSxcbiAgICAgIH1cbiAgICB9LFxuICAgIGJsb2NrczogKGlucHV0T2JqZWN0VHlwZUNvbmZpZzogSW5wdXRPYmplY3RUeXBlQ29uZmlnLCBmaWVsZDogQmxvY2tGaWVsZCkgPT4gKHtcbiAgICAgIC4uLmlucHV0T2JqZWN0VHlwZUNvbmZpZyxcbiAgICAgIFtmaWVsZC5uYW1lXTogeyB0eXBlOiBHcmFwaFFMSlNPTiB9LFxuICAgIH0pLFxuICAgIGNoZWNrYm94OiAoaW5wdXRPYmplY3RUeXBlQ29uZmlnOiBJbnB1dE9iamVjdFR5cGVDb25maWcsIGZpZWxkOiBDaGVja2JveEZpZWxkKSA9PiAoe1xuICAgICAgLi4uaW5wdXRPYmplY3RUeXBlQ29uZmlnLFxuICAgICAgW2ZpZWxkLm5hbWVdOiB7IHR5cGU6IEdyYXBoUUxCb29sZWFuIH0sXG4gICAgfSksXG4gICAgY29kZTogKGlucHV0T2JqZWN0VHlwZUNvbmZpZzogSW5wdXRPYmplY3RUeXBlQ29uZmlnLCBmaWVsZDogQ29kZUZpZWxkKSA9PiAoe1xuICAgICAgLi4uaW5wdXRPYmplY3RUeXBlQ29uZmlnLFxuICAgICAgW2ZpZWxkLm5hbWVdOiB7IHR5cGU6IHdpdGhOdWxsYWJsZVR5cGUoZmllbGQsIEdyYXBoUUxTdHJpbmcsIGZvcmNlTnVsbGFibGUpIH0sXG4gICAgfSksXG4gICAgY29sbGFwc2libGU6IChpbnB1dE9iamVjdFR5cGVDb25maWc6IElucHV0T2JqZWN0VHlwZUNvbmZpZywgZmllbGQ6IENvbGxhcHNpYmxlRmllbGQpID0+XG4gICAgICBmaWVsZC5maWVsZHMucmVkdWNlKChhY2MsIHN1YkZpZWxkOiBDb2xsYXBzaWJsZUZpZWxkKSA9PiB7XG4gICAgICAgIGNvbnN0IGFkZFN1YkZpZWxkID0gZmllbGRUb1NjaGVtYU1hcFtzdWJGaWVsZC50eXBlXVxuICAgICAgICBpZiAoYWRkU3ViRmllbGQpIHJldHVybiBhZGRTdWJGaWVsZChhY2MsIHN1YkZpZWxkKVxuICAgICAgICByZXR1cm4gYWNjXG4gICAgICB9LCBpbnB1dE9iamVjdFR5cGVDb25maWcpLFxuICAgIGRhdGU6IChpbnB1dE9iamVjdFR5cGVDb25maWc6IElucHV0T2JqZWN0VHlwZUNvbmZpZywgZmllbGQ6IERhdGVGaWVsZCkgPT4gKHtcbiAgICAgIC4uLmlucHV0T2JqZWN0VHlwZUNvbmZpZyxcbiAgICAgIFtmaWVsZC5uYW1lXTogeyB0eXBlOiB3aXRoTnVsbGFibGVUeXBlKGZpZWxkLCBHcmFwaFFMU3RyaW5nLCBmb3JjZU51bGxhYmxlKSB9LFxuICAgIH0pLFxuICAgIGVtYWlsOiAoaW5wdXRPYmplY3RUeXBlQ29uZmlnOiBJbnB1dE9iamVjdFR5cGVDb25maWcsIGZpZWxkOiBFbWFpbEZpZWxkKSA9PiAoe1xuICAgICAgLi4uaW5wdXRPYmplY3RUeXBlQ29uZmlnLFxuICAgICAgW2ZpZWxkLm5hbWVdOiB7IHR5cGU6IHdpdGhOdWxsYWJsZVR5cGUoZmllbGQsIEdyYXBoUUxTdHJpbmcsIGZvcmNlTnVsbGFibGUpIH0sXG4gICAgfSksXG4gICAgZ3JvdXA6IChpbnB1dE9iamVjdFR5cGVDb25maWc6IElucHV0T2JqZWN0VHlwZUNvbmZpZywgZmllbGQ6IEdyb3VwRmllbGQpID0+IHtcbiAgICAgIGNvbnN0IHJlcXVpcmVzQXRMZWFzdE9uZUZpZWxkID0gZ3JvdXBPclRhYkhhc1JlcXVpcmVkU3ViZmllbGQoZmllbGQpXG4gICAgICBjb25zdCBmdWxsTmFtZSA9IGNvbWJpbmVQYXJlbnROYW1lKHBhcmVudE5hbWUsIHRvV29yZHMoZmllbGQubmFtZSwgdHJ1ZSkpXG4gICAgICBsZXQgdHlwZTogR3JhcGhRTFR5cGUgPSBidWlsZE11dGF0aW9uSW5wdXRUeXBlKHtcbiAgICAgICAgbmFtZTogZnVsbE5hbWUsXG4gICAgICAgIGZpZWxkczogZmllbGQuZmllbGRzLFxuICAgICAgICBwYXJlbnROYW1lOiBmdWxsTmFtZSxcbiAgICAgICAgZ3JhcGhxbFJlc3VsdCxcbiAgICAgICAgY29uZmlnLFxuICAgICAgfSlcblxuICAgICAgaWYgKCF0eXBlKSByZXR1cm4gaW5wdXRPYmplY3RUeXBlQ29uZmlnXG5cbiAgICAgIGlmIChyZXF1aXJlc0F0TGVhc3RPbmVGaWVsZCkgdHlwZSA9IG5ldyBHcmFwaFFMTm9uTnVsbCh0eXBlKVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uaW5wdXRPYmplY3RUeXBlQ29uZmlnLFxuICAgICAgICBbZmllbGQubmFtZV06IHsgdHlwZSB9LFxuICAgICAgfVxuICAgIH0sXG4gICAganNvbjogKGlucHV0T2JqZWN0VHlwZUNvbmZpZzogSW5wdXRPYmplY3RUeXBlQ29uZmlnLCBmaWVsZDogSlNPTkZpZWxkKSA9PiAoe1xuICAgICAgLi4uaW5wdXRPYmplY3RUeXBlQ29uZmlnLFxuICAgICAgW2ZpZWxkLm5hbWVdOiB7IHR5cGU6IHdpdGhOdWxsYWJsZVR5cGUoZmllbGQsIEdyYXBoUUxKU09OLCBmb3JjZU51bGxhYmxlKSB9LFxuICAgIH0pLFxuICAgIG51bWJlcjogKGlucHV0T2JqZWN0VHlwZUNvbmZpZzogSW5wdXRPYmplY3RUeXBlQ29uZmlnLCBmaWVsZDogTnVtYmVyRmllbGQpID0+IHtcbiAgICAgIGNvbnN0IHR5cGUgPSBmaWVsZC5uYW1lID09PSAnaWQnID8gR3JhcGhRTEludCA6IEdyYXBoUUxGbG9hdFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uaW5wdXRPYmplY3RUeXBlQ29uZmlnLFxuICAgICAgICBbZmllbGQubmFtZV06IHtcbiAgICAgICAgICB0eXBlOiB3aXRoTnVsbGFibGVUeXBlKFxuICAgICAgICAgICAgZmllbGQsXG4gICAgICAgICAgICBmaWVsZC5oYXNNYW55ID09PSB0cnVlID8gbmV3IEdyYXBoUUxMaXN0KHR5cGUpIDogdHlwZSxcbiAgICAgICAgICAgIGZvcmNlTnVsbGFibGUsXG4gICAgICAgICAgKSxcbiAgICAgICAgfSxcbiAgICAgIH1cbiAgICB9LFxuICAgIHBvaW50OiAoaW5wdXRPYmplY3RUeXBlQ29uZmlnOiBJbnB1dE9iamVjdFR5cGVDb25maWcsIGZpZWxkOiBQb2ludEZpZWxkKSA9PiAoe1xuICAgICAgLi4uaW5wdXRPYmplY3RUeXBlQ29uZmlnLFxuICAgICAgW2ZpZWxkLm5hbWVdOiB7IHR5cGU6IHdpdGhOdWxsYWJsZVR5cGUoZmllbGQsIG5ldyBHcmFwaFFMTGlzdChHcmFwaFFMRmxvYXQpLCBmb3JjZU51bGxhYmxlKSB9LFxuICAgIH0pLFxuICAgIHJhZGlvOiAoaW5wdXRPYmplY3RUeXBlQ29uZmlnOiBJbnB1dE9iamVjdFR5cGVDb25maWcsIGZpZWxkOiBSYWRpb0ZpZWxkKSA9PiAoe1xuICAgICAgLi4uaW5wdXRPYmplY3RUeXBlQ29uZmlnLFxuICAgICAgW2ZpZWxkLm5hbWVdOiB7IHR5cGU6IHdpdGhOdWxsYWJsZVR5cGUoZmllbGQsIEdyYXBoUUxTdHJpbmcsIGZvcmNlTnVsbGFibGUpIH0sXG4gICAgfSksXG4gICAgcmVsYXRpb25zaGlwOiAoaW5wdXRPYmplY3RUeXBlQ29uZmlnOiBJbnB1dE9iamVjdFR5cGVDb25maWcsIGZpZWxkOiBSZWxhdGlvbnNoaXBGaWVsZCkgPT4ge1xuICAgICAgY29uc3QgeyByZWxhdGlvblRvIH0gPSBmaWVsZFxuICAgICAgdHlwZSBQYXlsb2FkR3JhcGhRTFJlbGF0aW9uc2hpcFR5cGUgPVxuICAgICAgICB8IEdyYXBoUUxJbnB1dE9iamVjdFR5cGVcbiAgICAgICAgfCBHcmFwaFFMTGlzdDxHcmFwaFFMU2NhbGFyVHlwZT5cbiAgICAgICAgfCBHcmFwaFFMU2NhbGFyVHlwZVxuICAgICAgbGV0IHR5cGU6IFBheWxvYWRHcmFwaFFMUmVsYXRpb25zaGlwVHlwZVxuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShyZWxhdGlvblRvKSkge1xuICAgICAgICBjb25zdCBmdWxsTmFtZSA9IGAke2NvbWJpbmVQYXJlbnROYW1lKFxuICAgICAgICAgIHBhcmVudE5hbWUsXG4gICAgICAgICAgdG9Xb3JkcyhmaWVsZC5uYW1lLCB0cnVlKSxcbiAgICAgICAgKX1SZWxhdGlvbnNoaXBJbnB1dGBcbiAgICAgICAgdHlwZSA9IG5ldyBHcmFwaFFMSW5wdXRPYmplY3RUeXBlKHtcbiAgICAgICAgICBuYW1lOiBmdWxsTmFtZSxcbiAgICAgICAgICBmaWVsZHM6IHtcbiAgICAgICAgICAgIHJlbGF0aW9uVG86IHtcbiAgICAgICAgICAgICAgdHlwZTogbmV3IEdyYXBoUUxFbnVtVHlwZSh7XG4gICAgICAgICAgICAgICAgbmFtZTogYCR7ZnVsbE5hbWV9UmVsYXRpb25Ub2AsXG4gICAgICAgICAgICAgICAgdmFsdWVzOiByZWxhdGlvblRvLnJlZHVjZShcbiAgICAgICAgICAgICAgICAgICh2YWx1ZXMsIG9wdGlvbikgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgLi4udmFsdWVzLFxuICAgICAgICAgICAgICAgICAgICBbZm9ybWF0TmFtZShvcHRpb24pXToge1xuICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBvcHRpb24sXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZhbHVlOiB7IHR5cGU6IEdyYXBoUUxKU09OIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHR5cGUgPSBnZXRDb2xsZWN0aW9uSURUeXBlKFxuICAgICAgICAgIGNvbmZpZy5kYi5kZWZhdWx0SURUeXBlLFxuICAgICAgICAgIGdyYXBocWxSZXN1bHQuY29sbGVjdGlvbnNbcmVsYXRpb25Ub10uY29uZmlnLFxuICAgICAgICApXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmlucHV0T2JqZWN0VHlwZUNvbmZpZyxcbiAgICAgICAgW2ZpZWxkLm5hbWVdOiB7IHR5cGU6IGZpZWxkLmhhc01hbnkgPyBuZXcgR3JhcGhRTExpc3QodHlwZSkgOiB0eXBlIH0sXG4gICAgICB9XG4gICAgfSxcbiAgICByaWNoVGV4dDogKGlucHV0T2JqZWN0VHlwZUNvbmZpZzogSW5wdXRPYmplY3RUeXBlQ29uZmlnLCBmaWVsZDogUmljaFRleHRGaWVsZCkgPT4gKHtcbiAgICAgIC4uLmlucHV0T2JqZWN0VHlwZUNvbmZpZyxcbiAgICAgIFtmaWVsZC5uYW1lXTogeyB0eXBlOiB3aXRoTnVsbGFibGVUeXBlKGZpZWxkLCBHcmFwaFFMSlNPTiwgZm9yY2VOdWxsYWJsZSkgfSxcbiAgICB9KSxcbiAgICByb3c6IChpbnB1dE9iamVjdFR5cGVDb25maWc6IElucHV0T2JqZWN0VHlwZUNvbmZpZywgZmllbGQ6IFJvd0ZpZWxkKSA9PlxuICAgICAgZmllbGQuZmllbGRzLnJlZHVjZSgoYWNjLCBzdWJGaWVsZDogRmllbGQpID0+IHtcbiAgICAgICAgY29uc3QgYWRkU3ViRmllbGQgPSBmaWVsZFRvU2NoZW1hTWFwW3N1YkZpZWxkLnR5cGVdXG4gICAgICAgIGlmIChhZGRTdWJGaWVsZCkgcmV0dXJuIGFkZFN1YkZpZWxkKGFjYywgc3ViRmllbGQpXG4gICAgICAgIHJldHVybiBhY2NcbiAgICAgIH0sIGlucHV0T2JqZWN0VHlwZUNvbmZpZyksXG4gICAgc2VsZWN0OiAoaW5wdXRPYmplY3RUeXBlQ29uZmlnOiBJbnB1dE9iamVjdFR5cGVDb25maWcsIGZpZWxkOiBTZWxlY3RGaWVsZCkgPT4ge1xuICAgICAgY29uc3QgZm9ybWF0dGVkTmFtZSA9IGAke2NvbWJpbmVQYXJlbnROYW1lKHBhcmVudE5hbWUsIGZpZWxkLm5hbWUpfV9NdXRhdGlvbklucHV0YFxuICAgICAgbGV0IHR5cGU6IEdyYXBoUUxUeXBlID0gbmV3IEdyYXBoUUxFbnVtVHlwZSh7XG4gICAgICAgIG5hbWU6IGZvcm1hdHRlZE5hbWUsXG4gICAgICAgIHZhbHVlczogZmllbGQub3B0aW9ucy5yZWR1Y2UoKHZhbHVlcywgb3B0aW9uKSA9PiB7XG4gICAgICAgICAgaWYgKG9wdGlvbklzT2JqZWN0KG9wdGlvbikpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIC4uLnZhbHVlcyxcbiAgICAgICAgICAgICAgW2Zvcm1hdE5hbWUob3B0aW9uLnZhbHVlKV06IHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogb3B0aW9uLnZhbHVlLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi52YWx1ZXMsXG4gICAgICAgICAgICBbZm9ybWF0TmFtZShvcHRpb24pXToge1xuICAgICAgICAgICAgICB2YWx1ZTogb3B0aW9uLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9XG4gICAgICAgIH0sIHt9KSxcbiAgICAgIH0pXG5cbiAgICAgIHR5cGUgPSBmaWVsZC5oYXNNYW55ID8gbmV3IEdyYXBoUUxMaXN0KHR5cGUpIDogdHlwZVxuICAgICAgdHlwZSA9IHdpdGhOdWxsYWJsZVR5cGUoZmllbGQsIHR5cGUsIGZvcmNlTnVsbGFibGUpXG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmlucHV0T2JqZWN0VHlwZUNvbmZpZyxcbiAgICAgICAgW2ZpZWxkLm5hbWVdOiB7IHR5cGUgfSxcbiAgICAgIH1cbiAgICB9LFxuICAgIHRhYnM6IChpbnB1dE9iamVjdFR5cGVDb25maWc6IElucHV0T2JqZWN0VHlwZUNvbmZpZywgZmllbGQ6IFRhYnNGaWVsZCkgPT4ge1xuICAgICAgcmV0dXJuIGZpZWxkLnRhYnMucmVkdWNlKChhY2MsIHRhYikgPT4ge1xuICAgICAgICBpZiAodGFiSGFzTmFtZSh0YWIpKSB7XG4gICAgICAgICAgY29uc3QgZnVsbE5hbWUgPSBjb21iaW5lUGFyZW50TmFtZShwYXJlbnROYW1lLCB0b1dvcmRzKHRhYi5uYW1lLCB0cnVlKSlcbiAgICAgICAgICBjb25zdCByZXF1aXJlc0F0TGVhc3RPbmVGaWVsZCA9IGdyb3VwT3JUYWJIYXNSZXF1aXJlZFN1YmZpZWxkKGZpZWxkKVxuICAgICAgICAgIGxldCB0eXBlOiBHcmFwaFFMVHlwZSA9IGJ1aWxkTXV0YXRpb25JbnB1dFR5cGUoe1xuICAgICAgICAgICAgbmFtZTogZnVsbE5hbWUsXG4gICAgICAgICAgICBmaWVsZHM6IHRhYi5maWVsZHMsXG4gICAgICAgICAgICBwYXJlbnROYW1lOiBmdWxsTmFtZSxcbiAgICAgICAgICAgIGdyYXBocWxSZXN1bHQsXG4gICAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgfSlcblxuICAgICAgICAgIGlmICghdHlwZSkgcmV0dXJuIGFjY1xuXG4gICAgICAgICAgaWYgKHJlcXVpcmVzQXRMZWFzdE9uZUZpZWxkKSB0eXBlID0gbmV3IEdyYXBoUUxOb25OdWxsKHR5cGUpXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLmFjYyxcbiAgICAgICAgICAgIFt0YWIubmFtZV06IHsgdHlwZSB9LFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uYWNjLFxuICAgICAgICAgIC4uLnRhYi5maWVsZHMucmVkdWNlKChzdWJGaWVsZFNjaGVtYSwgc3ViRmllbGQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGFkZFN1YkZpZWxkID0gZmllbGRUb1NjaGVtYU1hcFtzdWJGaWVsZC50eXBlXVxuICAgICAgICAgICAgaWYgKGFkZFN1YkZpZWxkKSByZXR1cm4gYWRkU3ViRmllbGQoc3ViRmllbGRTY2hlbWEsIHN1YkZpZWxkKVxuICAgICAgICAgICAgcmV0dXJuIHN1YkZpZWxkU2NoZW1hXG4gICAgICAgICAgfSwgYWNjKSxcbiAgICAgICAgfVxuICAgICAgfSwgaW5wdXRPYmplY3RUeXBlQ29uZmlnKVxuICAgIH0sXG4gICAgdGV4dDogKGlucHV0T2JqZWN0VHlwZUNvbmZpZzogSW5wdXRPYmplY3RUeXBlQ29uZmlnLCBmaWVsZDogVGV4dEZpZWxkKSA9PiAoe1xuICAgICAgLi4uaW5wdXRPYmplY3RUeXBlQ29uZmlnLFxuICAgICAgW2ZpZWxkLm5hbWVdOiB7XG4gICAgICAgIHR5cGU6IHdpdGhOdWxsYWJsZVR5cGUoXG4gICAgICAgICAgZmllbGQsXG4gICAgICAgICAgZmllbGQuaGFzTWFueSA9PT0gdHJ1ZSA/IG5ldyBHcmFwaFFMTGlzdChHcmFwaFFMU3RyaW5nKSA6IEdyYXBoUUxTdHJpbmcsXG4gICAgICAgICAgZm9yY2VOdWxsYWJsZSxcbiAgICAgICAgKSxcbiAgICAgIH0sXG4gICAgfSksXG4gICAgdGV4dGFyZWE6IChpbnB1dE9iamVjdFR5cGVDb25maWc6IElucHV0T2JqZWN0VHlwZUNvbmZpZywgZmllbGQ6IFRleHRhcmVhRmllbGQpID0+ICh7XG4gICAgICAuLi5pbnB1dE9iamVjdFR5cGVDb25maWcsXG4gICAgICBbZmllbGQubmFtZV06IHsgdHlwZTogd2l0aE51bGxhYmxlVHlwZShmaWVsZCwgR3JhcGhRTFN0cmluZywgZm9yY2VOdWxsYWJsZSkgfSxcbiAgICB9KSxcbiAgICB1cGxvYWQ6IChpbnB1dE9iamVjdFR5cGVDb25maWc6IElucHV0T2JqZWN0VHlwZUNvbmZpZywgZmllbGQ6IFVwbG9hZEZpZWxkKSA9PiAoe1xuICAgICAgLi4uaW5wdXRPYmplY3RUeXBlQ29uZmlnLFxuICAgICAgW2ZpZWxkLm5hbWVdOiB7IHR5cGU6IHdpdGhOdWxsYWJsZVR5cGUoZmllbGQsIEdyYXBoUUxTdHJpbmcsIGZvcmNlTnVsbGFibGUpIH0sXG4gICAgfSksXG4gIH1cblxuICBjb25zdCBmaWVsZE5hbWUgPSBmb3JtYXROYW1lKG5hbWUpXG5cbiAgY29uc3QgZmllbGRTY2hlbWFzID0gZmllbGRzLnJlZHVjZSgoaW5wdXRPYmplY3RUeXBlQ29uZmlnLCBmaWVsZCkgPT4ge1xuICAgIGNvbnN0IGZpZWxkU2NoZW1hID0gZmllbGRUb1NjaGVtYU1hcFtmaWVsZC50eXBlXVxuXG4gICAgaWYgKHR5cGVvZiBmaWVsZFNjaGVtYSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIGlucHV0T2JqZWN0VHlwZUNvbmZpZ1xuICAgIH1cblxuICAgIGNvbnN0IHNjaGVtYSA9IGZpZWxkU2NoZW1hKGlucHV0T2JqZWN0VHlwZUNvbmZpZywgZmllbGQpXG4gICAgaWYgKE9iamVjdC5rZXlzKHNjaGVtYSkubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gaW5wdXRPYmplY3RUeXBlQ29uZmlnXG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmlucHV0T2JqZWN0VHlwZUNvbmZpZyxcbiAgICAgIC4uLmZpZWxkU2NoZW1hKGlucHV0T2JqZWN0VHlwZUNvbmZpZywgZmllbGQpLFxuICAgIH1cbiAgfSwge30pXG5cbiAgaWYgKE9iamVjdC5rZXlzKGZpZWxkU2NoZW1hcykubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIHJldHVybiBuZXcgR3JhcGhRTElucHV0T2JqZWN0VHlwZSh7XG4gICAgbmFtZTogYG11dGF0aW9uJHtmaWVsZE5hbWV9SW5wdXRgLFxuICAgIGZpZWxkczogZmllbGRTY2hlbWFzLFxuICB9KVxufVxuIl0sIm5hbWVzIjpbIkdyYXBoUUxCb29sZWFuIiwiR3JhcGhRTEVudW1UeXBlIiwiR3JhcGhRTEZsb2F0IiwiR3JhcGhRTElucHV0T2JqZWN0VHlwZSIsIkdyYXBoUUxJbnQiLCJHcmFwaFFMTGlzdCIsIkdyYXBoUUxOb25OdWxsIiwiR3JhcGhRTFN0cmluZyIsIkdyYXBoUUxKU09OIiwiZmllbGRBZmZlY3RzRGF0YSIsIm9wdGlvbklzT2JqZWN0IiwidGFiSGFzTmFtZSIsInRvV29yZHMiLCJncm91cE9yVGFiSGFzUmVxdWlyZWRTdWJmaWVsZCIsImNvbWJpbmVQYXJlbnROYW1lIiwiZm9ybWF0TmFtZSIsIndpdGhOdWxsYWJsZVR5cGUiLCJmbGF0dGVuVG9wTGV2ZWxGaWVsZHMiLCJpZEZpZWxkVHlwZXMiLCJudW1iZXIiLCJ0ZXh0IiwiZ2V0Q29sbGVjdGlvbklEVHlwZSIsInR5cGUiLCJjb2xsZWN0aW9uIiwiaWRGaWVsZCIsImZpZWxkcyIsImZpbmQiLCJmaWVsZCIsIm5hbWUiLCJidWlsZE11dGF0aW9uSW5wdXRUeXBlIiwicGFyZW50TmFtZSIsImZvcmNlTnVsbGFibGUiLCJncmFwaHFsUmVzdWx0IiwiY29uZmlnIiwiZmllbGRUb1NjaGVtYU1hcCIsImFycmF5IiwiaW5wdXRPYmplY3RUeXBlQ29uZmlnIiwiZnVsbE5hbWUiLCJibG9ja3MiLCJjaGVja2JveCIsImNvZGUiLCJjb2xsYXBzaWJsZSIsInJlZHVjZSIsImFjYyIsInN1YkZpZWxkIiwiYWRkU3ViRmllbGQiLCJkYXRlIiwiZW1haWwiLCJncm91cCIsInJlcXVpcmVzQXRMZWFzdE9uZUZpZWxkIiwianNvbiIsImhhc01hbnkiLCJwb2ludCIsInJhZGlvIiwicmVsYXRpb25zaGlwIiwicmVsYXRpb25UbyIsIkFycmF5IiwiaXNBcnJheSIsInZhbHVlcyIsIm9wdGlvbiIsInZhbHVlIiwiZGIiLCJkZWZhdWx0SURUeXBlIiwiY29sbGVjdGlvbnMiLCJyaWNoVGV4dCIsInJvdyIsInNlbGVjdCIsImZvcm1hdHRlZE5hbWUiLCJvcHRpb25zIiwidGFicyIsInRhYiIsInN1YkZpZWxkU2NoZW1hIiwidGV4dGFyZWEiLCJ1cGxvYWQiLCJmaWVsZE5hbWUiLCJmaWVsZFNjaGVtYXMiLCJmaWVsZFNjaGVtYSIsInNjaGVtYSIsIk9iamVjdCIsImtleXMiLCJsZW5ndGgiXSwibWFwcGluZ3MiOiJBQUFBLHVDQUF1QyxHQUd2QyxTQUNFQSxjQUFjLEVBQ2RDLGVBQWUsRUFDZkMsWUFBWSxFQUNaQyxzQkFBc0IsRUFDdEJDLFVBQVUsRUFDVkMsV0FBVyxFQUNYQyxjQUFjLEVB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