@mediusinc/mng-commons-data-api 5.5.0 → 6.0.0-rc.2

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.
@@ -137,11 +137,12 @@ export class SchemaFieldsBuilder {
137
137
  * @experimental
138
138
  *
139
139
  * @param {Property} property - The property to create the lookup field for.
140
+ * @param {FieldLookupProviderType<LookupModel, Service>} provider - Data provider for the lookup field.
140
141
  *
141
142
  * @return The created lookup field.
142
143
  */
143
- addLookup(property) {
144
- const field = this.descriptor.addFieldLookup(property);
144
+ addLookup(property, provider) {
145
+ const field = this.descriptor.addFieldLookup(property, { serviceProvider: provider });
145
146
  setFieldBasicOptionsFromSchema(field, this.schema.properties[property]);
146
147
  return field;
147
148
  }
@@ -152,117 +153,13 @@ export class SchemaFieldsBuilder {
152
153
  * @experimental
153
154
  *
154
155
  * @param {Property} property - The property to create the lookup field for.
156
+ * @param {FieldLookupProviderType<LookupModel, Service> | undefined} provider - Data provider for the lookup field.
155
157
  * @param {SchemaProperty} schemaProperty - Manually provided schema property.
156
158
  *
157
159
  * @return The created lookup field.
158
160
  */
159
- addLookupFromSchema(property, schemaProperty) {
160
- const field = this.descriptor.addFieldLookup(property);
161
- setFieldBasicOptionsFromSchema(field, schemaProperty);
162
- return field;
163
- }
164
- /**
165
- * <em>Experimental:</em> Adds a lookup field.
166
- * {EditorDescriptorInt.addFieldLookupWithOptionsValueProperty} is used to create field and ${setFieldBasicOptionsFromSchema} to add basic field's options from schema.
167
- *
168
- * @experimental
169
- *
170
- * @param {Property} property - The property to create the lookup field for.
171
- * @param {TypeDescriptor<LookupModel>} type - Type of lookup model.
172
- * @param {LookupValueProperty} lookupOptionsValueProperty - Value property from lookup model.
173
- *
174
- * @return The created lookup field.
175
- */
176
- addLookupWithOptionsValueProperty(property, type, lookupOptionsValueProperty) {
177
- const field = this.descriptor.addFieldLookupWithOptionsValueProperty(property, type, lookupOptionsValueProperty);
178
- setFieldBasicOptionsFromSchema(field, this.schema.properties[property]);
179
- return field;
180
- }
181
- /**
182
- * <em>Experimental:</em> Adds a lookup field where property schema is manually provided.
183
- * {EditorDescriptorInt.addFieldLookupWithOptionsValueProperty} is used to create field and ${setFieldBasicOptionsFromSchema} to add basic field's options from schema.
184
- *
185
- * @experimental
186
- *
187
- * @param {Property} property - The property to create the lookup field for.
188
- * @param {TypeDescriptor<LookupModel>} type - Type of lookup model.
189
- * @param {LookupValueProperty} lookupOptionsValueProperty - Value property from lookup model.
190
- * @param {SchemaProperty} schemaProperty - Manually provided schema property.
191
- *
192
- * @return The created lookup field.
193
- */
194
- addLookupWithOptionsValuePropertyFromSchema(property, type, lookupOptionsValueProperty, schemaProperty) {
195
- const field = this.descriptor.addFieldLookupWithOptionsValueProperty(property, type, lookupOptionsValueProperty);
196
- setFieldBasicOptionsFromSchema(field, schemaProperty);
197
- return field;
198
- }
199
- /**
200
- * <em>Experimental:</em> Adds a lookup field.
201
- * {EditorDescriptorInt.addFieldLookupWithProvider} is used to create field and ${setFieldBasicOptionsFromSchema} to add basic field's options from schema.
202
- *
203
- * @experimental
204
- *
205
- * @param {Property} property - The property to create the lookup field for.
206
- * @param {FieldLookupProviderType<LookupModel, Service>} provider - Lookup provider.
207
- *
208
- * @return The created lookup field.
209
- */
210
- addLookupWithProvider(property, provider) {
211
- const field = this.descriptor.addFieldLookupWithProvider(property, provider);
212
- setFieldBasicOptionsFromSchema(field, this.schema.properties[property]);
213
- return field;
214
- }
215
- /**
216
- * <em>Experimental:</em> Adds a lookup field where property schema is manually provided.
217
- * {EditorDescriptorInt.addFieldLookupWithProvider} is used to create field and ${setFieldBasicOptionsFromSchema} to add basic field's options from schema.
218
- *
219
- * @experimental
220
- *
221
- * @param {Property} property - The property to create the lookup field for.
222
- * @param {FieldLookupProviderType<LookupModel, Service>} provider - Lookup provider.
223
- * @param {SchemaProperty} schemaProperty - Manually provided schema property.
224
- *
225
- * @return The created lookup field.
226
- */
227
- addLookupWithProviderFromSchema(property, provider, schemaProperty) {
228
- const field = this.descriptor.addFieldLookupWithProvider(property, provider);
229
- setFieldBasicOptionsFromSchema(field, schemaProperty);
230
- return field;
231
- }
232
- /**
233
- * <em>Experimental:</em> Adds a lookup field.
234
- * {EditorDescriptorInt.addFieldLookupWithProviderAndOptionsValueProperty} is used to create field and ${setFieldBasicOptionsFromSchema} to add basic field's options from schema.
235
- *
236
- * @experimental
237
- *
238
- * @param {Property} property - The property to create the lookup field for.
239
- * @param {FieldLookupProviderType<LookupModel, Service>} provider - Lookup provider.
240
- * @param {TypeDescriptor<LookupModel>} type - Type of lookup model.
241
- * @param {LookupValueProperty} lookupOptionsValueProperty - Value property from lookup model.
242
- *
243
- * @return The created lookup field.
244
- */
245
- addLookupWithProviderAndOptionsValueProperty(property, provider, type, lookupOptionsValueProperty) {
246
- const field = this.descriptor.addFieldLookupWithProviderAndOptionsValueProperty(property, provider, type, lookupOptionsValueProperty);
247
- setFieldBasicOptionsFromSchema(field, this.schema.properties[property]);
248
- return field;
249
- }
250
- /**
251
- * <em>Experimental:</em> Adds a lookup field where property schema is manually provided.
252
- * {EditorDescriptorInt.addFieldLookupWithProviderAndOptionsValueProperty} is used to create field and ${setFieldBasicOptionsFromSchema} to add basic field's options from schema.
253
- *
254
- * @experimental
255
- *
256
- * @param {Property} property - The property to create the lookup field for.
257
- * @param {FieldLookupProviderType<LookupModel, Service>} provider - Lookup provider.
258
- * @param {TypeDescriptor<LookupModel>} type - Type of lookup model.
259
- * @param {LookupValueProperty} lookupOptionsValueProperty - Value property from lookup model.
260
- * @param {SchemaProperty} schemaProperty - Manually provided schema property.
261
- *
262
- * @return The created lookup field.
263
- */
264
- addLookupWithProviderAndOptionsValuePropertyFromSchema(property, provider, type, lookupOptionsValueProperty, schemaProperty) {
265
- const field = this.descriptor.addFieldLookupWithProviderAndOptionsValueProperty(property, provider, type, lookupOptionsValueProperty);
161
+ addLookupFromSchema(property, provider, schemaProperty) {
162
+ const field = this.descriptor.addFieldLookup(property, { serviceProvider: provider });
266
163
  setFieldBasicOptionsFromSchema(field, schemaProperty);
267
164
  return field;
268
165
  }
@@ -273,7 +170,7 @@ export class SchemaFieldsBuilder {
273
170
  * @experimental
274
171
  *
275
172
  * @param {Property} property - The property to create the many editor field for.
276
- * @param {TableviewDescriptorInst<FieldModel, any, any, Model>} tableviewDescriptor - Tableview descriptor.
173
+ * @param {TableviewDescriptorInst<FieldModel, any, any, FieldsModel>} tableviewDescriptor - Tableview descriptor.
277
174
  *
278
175
  * @return The created one-to-many editor field.
279
176
  */
@@ -289,7 +186,7 @@ export class SchemaFieldsBuilder {
289
186
  * @experimental
290
187
  *
291
188
  * @param {Property} property - The property to create the many editor field for.
292
- * @param {TableviewDescriptorInst<FieldModel, any, any, Model>} tableviewDescriptor - Tableview descriptor.
189
+ * @param {TableviewDescriptorType<FieldModel, any, any, FieldsModel>} tableviewDescriptor - Tableview descriptor.
293
190
  * @param {SchemaProperty} schemaProperty - Manually provided schema property.
294
191
  *
295
192
  * @return The created one-to-many editor field.
@@ -342,11 +239,11 @@ export class SchemaFieldsBuilder {
342
239
  *
343
240
  * @experimental
344
241
  *
345
- * @param {TableviewDescriptorInst<Model, any, any, Parent> | EditorDescriptorInst<Model, Parent>} descriptor - Descriptor to add fields to.
242
+ * @param {TableviewDescriptorInst<Model, any, any, Parent, any, AddModel, EditModel, FieldsModel> | EditorDescriptorInst<Model, Parent>} descriptor - Descriptor to add fields to.
346
243
  * @param {SchemaModel<SchModel>} schema - The schema with metadata about properties for fields.
347
244
  * @param {FieldsFromSchemaOptsType<SchModel>} [opts] - Additional options.
348
245
  *
349
- * @return {SchemaFieldsBuilder<Model, Parent, SchModel>} - The SchemaFieldsBuilder object containing the extracted fields.
246
+ * @return {SchemaFieldsBuilder<Model, Parent, AddModel, EditModel , FieldsModel, SchModel>} - The SchemaFieldsBuilder object containing the extracted fields.
350
247
  */
351
248
  export function fieldsFromSchema(descriptor, schema, opts) {
352
249
  return new SchemaFieldsBuilder(descriptor, schema, opts);
@@ -367,9 +264,7 @@ export function addFieldInputFromSchema(descriptor, property, propertySchema, op
367
264
  const propertyType = opts?.fieldType ?? propertySchema.type;
368
265
  const field = new FieldInputDescriptor(property);
369
266
  if (descriptor instanceof TableviewDescriptorInst) {
370
- descriptor.detailsEditor.addFieldDescriptor(field);
371
- descriptor.editEditor.addFieldDescriptor(field);
372
- descriptor.addEditor.addFieldDescriptor(field);
267
+ descriptor.addFieldDescriptor(field);
373
268
  }
374
269
  else {
375
270
  descriptor.addFieldDescriptor(field);
@@ -479,4 +374,4 @@ export function setFieldBasicOptionsFromSchema(field, propertySchema) {
479
374
  if (propertySchema.isReadOnly)
480
375
  field.withDisabled();
481
376
  }
482
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmllbGRzLWZyb20tc2NoZW1hLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGFibGV2aWV3L3NyYy9zY2hlbWEvZmllbGRzLWZyb20tc2NoZW1hLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBZ0Isb0JBQW9CLEVBQWtCLDRCQUE0QixFQUFDLE1BQU0sNkJBQTZCLENBQUM7QUFDOUgsT0FBTyxFQUFDLGNBQWMsRUFBaUIsTUFBTSw4QkFBOEIsQ0FBQztBQUU1RSxPQUFPLEVBR0gsb0JBQW9CLEVBTXBCLHVCQUF1QixFQUMxQixNQUFNLHNDQUFzQyxDQUFDO0FBRTlDLE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBQ3ZELE9BQU8sRUFBQyxrQ0FBa0MsRUFBQyxNQUFNLCtCQUErQixDQUFDO0FBNkJqRjs7OztHQUlHO0FBQ0gsTUFBTSxPQUFPLG1CQUFtQjtJQUM1QixZQUNxQixVQUFrRyxFQUNsRyxNQUE2QixFQUN0QyxJQUF5QztRQUZoQyxlQUFVLEdBQVYsVUFBVSxDQUF3RjtRQUNsRyxXQUFNLEdBQU4sTUFBTSxDQUF1QjtRQUN0QyxTQUFJLEdBQUosSUFBSSxDQUFxQztJQUNsRCxDQUFDO0lBRUksb0JBQW9CLENBQUMsUUFBYSxFQUFFLElBQStCO1FBQ3ZFLE9BQXFDO1lBQ2pDLEdBQUcsSUFBSSxDQUFDLElBQUk7WUFDWixTQUFTLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLENBQUMsUUFBd0IsQ0FBQztZQUM1RixTQUFTLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLENBQUMsUUFBd0IsQ0FBQztZQUM1RixVQUFVLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxJ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QUFPLEtBQUssQ0FBQztBQUNqQixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsOEJBQThCLENBQzFDLEtBQStFLEVBQy9FLGNBQThCO0lBRTlCLElBQUksY0FBYyxDQUFDLFFBQVE7UUFBRSxLQUFLLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDbEQsSUFBSSxjQUFjLENBQUMsVUFBVTtRQUFFLEtBQUssQ0FBQyxZQUFZLEVBQUUsQ0FBQztBQUN4RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtTY2hlbWFFbnVtLCBTY2hlbWFNb2RlbCwgU2NoZW1hUHJvcGVydHl9IGZyb20gJ0BtZWRpdXNpbmMvbW5nLWNvbW1vbnMtZGF0YS1hcGknO1xuaW1wb3J0IHtBcnJheUl0ZW1UeXBlLCBDb21tb25zSW50ZXJuYWxFcnJvciwgS2V5b2ZBbmRPZlR5cGUsIGZyb21Bbmd1bGFyRGF0ZUZvcm1hdFRvUHJpbWV9IGZyb20gJ0BtZWRpdXNpbmMvbW5nLWNvbW1vbnMvY29yZSc7XG5pbXBvcnQge0VudW1EZXNjcmlwdG9yLCBUeXBlRGVzY3JpcHRvcn0gZnJvbSAnQG1lZGl1c2luYy9tbmctY29tbW9ucy9tb2RlbCc7XG5pbXBvcnQge0lUYWJsZURhdGFQcm92aWRlciwgVGFibGVEZXNjcmlwdG9ySW5zdH0gZnJvbSAnQG1lZGl1c2luYy9tbmctY29tbW9ucy90YWJsZS9hcGknO1xuaW1wb3J0IHtcbiAgICBBRmllbGREZXNjcmlwdG9yLFxuICAgIEVkaXRvckRlc2NyaXB0b3JJbnN0LFxuICAgIEZpZWxkSW5wdXREZXNjcmlwdG9yLFxuICAgIEZpZWxkTG9va3VwRGVzY3JpcHRvcixcbiAgICBGaWVsZExvb2t1cEVudW1EZXNjcmlwdG9yLFxuICAgIEZpZWxkTG9va3VwUHJvdmlkZXJUeXBlLFxuICAgIEZpZWxkTWFueUVkaXRvckRlc2NyaXB0b3IsXG4gICAgRmllbGRNYW55VG9NYW55RWRpdG9yRGVzY3JpcHRvcixcbiAgICBUYWJsZXZpZXdEZXNjcmlwdG9ySW5zdFxufSBmcm9tICdAbWVkaXVzaW5jL21uZy1jb21tb25zL3RhYmxldmlldy9hcGknO1xuXG5pbXBvcnQge2VudW1Nb2RlbEZyb21TY2hlbWF9IGZyb20gJy4vZW51bS1mcm9tLXNjaGVtYSc7XG5pbXBvcnQge2Zyb21TY2hlbWFGaWx0ZXJOb25BcnJheVByb3BlcnRpZXN9IGZyb20gJy4vaW50ZXJuYWwvY29tbW9uLWZyb20tc2NoZW1hJztcblxudHlwZSBGaWVsZElucHV0VHlwZSA9ICdudW1iZXInIHwgJ2N1cnJlbmN5JyB8ICdib29sZWFuJyB8ICdzdHJpbmcnIHwgJ3RleHQnIHwgJ3RleHRhcmVhJyB8ICdkYXRlJyB8ICdkYXRlLXRpbWUnIHwgJ2VudW0nIHwgJ2hpZGRlbic7XG5cbnR5cGUgRnJvbVNjaGVtYUNvbW1vbk9wdHNUeXBlPE1vZGVsPiA9IHtcbiAgICBkYXRlRm9ybWF0Pzogc3RyaW5nO1xuICAgIGRhdGVUaW1lRm9ybWF0Pzogc3RyaW5nO1xuICAgIHRleHRhcmVhUm93cz86IG51bWJlcjtcbiAgICBudW1iZXJVc2VHcm91cGluZz86IGJvb2xlYW47XG4gICAgbnVtYmVyU3RlcD86IG51bWJlcjtcbiAgICBudW1iZXJNaW5GcmFjdGlvbkRpZ2l0cz86IG51bWJlcjtcbiAgICBudW1iZXJNYXhGcmFjdGlvbkRpZ2l0cz86IG51bWJlcjtcbiAgICBjdXJyZW5jeT86IHN0cmluZztcbiAgICBjdXJyZW5jeVByb3BlcnR5Pzoga2V5b2YgTW9kZWw7XG4gICAgY3VycmVuY3lEaXNwbGF5PzogJ3N5bWJvbCcgfCAnY29kZScgfCAnbmFtZSc7XG59O1xuXG50eXBlIEZpZWxkc0Zyb21TY2hlbWFPcHRzVHlwZTxNb2RlbCA9IGFueT4gPSBGcm9tU2NoZW1hQ29tbW9uT3B0c1R5cGU8TW9kZWw+ICYge1xuICAgIGZpZWxkVHlwZXM/OiBQYXJ0aWFsPFJlY29yZDxrZXlvZiBNb2RlbCwgRmllbGRJbnB1dFR5cGU+PjtcbiAgICBlbnVtTW9kZWxzPzogUGFydGlhbDxSZWNvcmQ8a2V5b2YgTW9kZWwsIEVudW1EZXNjcmlwdG9yPGFueT4+PjtcbiAgICBlbnVtU2NoZW1hcz86IFBhcnRpYWw8UmVjb3JkPGtleW9mIE1vZGVsLCBTY2hlbWFFbnVtPGFueT4+Pjtcbn07XG5cbnR5cGUgRmllbGRJbnB1dEZyb21TY2hlbWFPcHRzVHlwZTxNb2RlbCA9IGFueSwgRW51bSA9IGFueT4gPSBGcm9tU2NoZW1hQ29tbW9uT3B0c1R5cGU8TW9kZWw+ICYge1xuICAgIGZpZWxkVHlwZT86IEZpZWxkSW5wdXRUeXBlO1xuICAgIGVudW1TY2hlbWE/OiBTY2hlbWFFbnVtPEVudW0+O1xuICAgIGVudW1Nb2RlbD86IEVudW1EZXNjcmlwdG9yPEVudW0+O1xufTtcblxuLyoqXG4gKiA8ZW0+RXhwZXJpbWVudGFsOjwvZW0+IEJ1aWxkZXIgZm9yIGFkZGluZyBmaWVsZHMgdG8gZWRpdG9yLlxuICpcbiAqIEBleHBlcmltZW50YWxcbiAqL1xuZXhwb3J0IGNsYXNzIFNjaGVtYUZpZWxkc0J1aWxkZXI8TW9kZWwsIFBhcmVudCA9IHVua25vd24sIFNjaE1vZGVsID0gTW9kZWw+IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBkZXNjcmlwdG9yOiBUYWJsZXZpZXdEZXNjcmlwdG9ySW5zdDxNb2RlbCwgYW55LCBhbnksIFBhcmVudD4gfCBFZGl0b3JEZXNjcmlwdG9ySW5zdDxNb2RlbCwgUGFyZW50PixcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBzY2hlbWE6IFNjaGVtYU1vZGVsPFNjaE1vZGVsPixcbiAgICAgICAgcHJpdmF0ZSBvcHRzPzogRmllbGRzRnJvbVNjaGVtYU9wdHNUeXBlPFNjaE1vZGVsPlxuICAgICkge31cblxuICAgIHByaXZhdGUgbWVyZ2VGaWVsZHNJbnB1dE9wdHMocHJvcGVydHk6IGFueSwgb3B0cz86IEZpZWxkc0Zyb21TY2hlbWFPcHRzVHlwZSkge1xuICAgICAgICByZXR1cm4gPEZpZWxkSW5wdXRGcm9tU2NoZW1hT3B0c1R5cGU+e1xuICAgICAgICAgICAgLi4udGhpcy5vcHRzLFxuICAgICAgICAgICAgZmllbGRUeXBlOiBvcHRzPy5maWVsZFR5cGVzPy5bcHJvcGVydHldID8/IHRoaXMub3B0cz8uZmllbGRUeXBlcz8uW3Byb3BlcnR5IGFzIGtleW9mIG9iamVjdF0sXG4gICAgICAgICAgICBlbnVtTW9kZWw6IG9wdHM/LmVudW1Nb2RlbHM/Lltwcm9wZXJ0eV0gPz8gdGhpcy5vcHRzPy5lbnVtTW9kZWxzPy5bcHJvcGVydHkgYXMga2V5b2Ygb2JqZWN0XSxcbiAgICAgICAgICAgIGVudW1TY2hlbWE6IG9wdHM/LmVudW1TY2hlbWFzPy5bcHJvcGVydHldID8/IHRoaXMub3B0cz8uZW51bVNjaGVtYXM/Lltwcm9wZXJ0eSBhcyBrZXlvZiBvYmplY3RdLFxuICAgICAgICAgICAgLi4ub3B0c1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgbWVyZ2VGaWVsZElucHV0T3B0cyhwcm9wZXJ0eTogYW55LCBvcHRzPzogRmllbGRJbnB1dEZyb21TY2hlbWFPcHRzVHlwZSkge1xuICAgICAgICByZXR1cm4gPEZpZWxkSW5wdXRGcm9tU2NoZW1hT3B0c1R5cGU+e1xuICAgICAgICAgICAgLi4udGhpcy5vcHRzLFxuICAgICAgICAgICAgZmllbGRUeXBlOiB0aGlzLm9wdHM/LmZpZWxkVHlwZXM/Lltwcm9wZXJ0eSBhcyBrZXlvZiBvYmplY3RdLFxuICAgICAgICAgICAgZW51bU1vZGVsOiB0aGlzLm9wdHM/LmVudW1Nb2RlbHM/Lltwcm9wZXJ0eSBhcyBrZXlvZiBvYmplY3RdLFxuICAgICAgICAgICAgZW51bVNjaGVtYTogdGhpcy5vcHRzPy5lbnVtU2NoZW1hcz8uW3Byb3BlcnR5IGFzIGtleW9mIG9iamVjdF0sXG4gICAgICAgICAgICAuLi5vcHRzXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogPGVtPkV4cGVyaW1lbnRhbDo8L2VtPiBBZGRzIGEgc2luZ2xlIGlucHV0IGZpZWxkIHZpYSB7YWRkRmllbGRJbnB1dEZyb21TY2hlbWF9LlxuICAgICAqXG4gICAgICogQGV4cGVyaW1lbnRhbFxuICAgICAqXG4gICAgICogQHBhcmFtIHtQcm9wZXJ0eX0gcHJvcGVydHkgLSBUaGUgcHJvcGVydHkgdG8gYWRkIHRoZSBmaWVsZCBmb3IuXG4gICAgICogQHBhcmFtIHtGaWVsZElucHV0RnJvbVNjaGVtYU9wdHNUeXBlPFNjaE1vZGVsPn0gb3B0cyAtIEFkZGl0aW9uYWwgb3B0aW9ucy5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge0ZpZWxkSW5wdXREZXNjcmlwdG9yPE1vZGVsLCBOb25OdWxsYWJsZTxNb2RlbFtQcm9wZXJ0eV0+LCBNb2RlbFtQcm9wZXJ0eV0sIFBhcmVudD59IFRoZSBhZGRlZCBmaWVsZCBkZXNjcmlwdG9yLlxuICAgICAqL1xuICAgIHB1YmxpYyBhZGQ8UHJvcGVydHkgZXh0ZW5kcyBFeHRyYWN0PGtleW9mIE1vZGVsLCBrZXlvZiBTY2hNb2RlbD4+KFxuICAgICAgICBwcm9wZXJ0eTogUHJvcGVydHksXG4gICAgICAgIG9wdHM/OiBGaWVsZElucHV0RnJvbVNjaGVtYU9wdHNUeXBlPFNjaE1vZGVsPlxuICAgICk6IEZpZWxkSW5wdXREZXNjcmlwdG9yPE1vZGVsLCBOb25OdWxsYWJsZTxNb2RlbFtQcm9wZXJ0eV0+LCBNb2RlbFtQcm9wZXJ0eV0sIFBhcmVudD4ge1xuICAgICAgICByZXR1cm4gYWRkRmllbGRJbnB1dEZyb21TY2hlbWEoXG4gICAgICAgICAgICB0aGlzLmRlc2NyaXB0b3IsXG4gICAgICAgICAgICBwcm9wZXJ0eSxcbiAgICAgICAgICAgIHRoaXMuc2NoZW1hLnByb3BlcnRpZXNbcHJvcGVydHldLFxuICAgICAgICAgICAgdGhpcy5tZXJnZUZpZWxkSW5wdXRPcHRzKHByb3BlcnR5LCBvcHRzKSBhcyBGaWVsZElucHV0RnJvbVNjaGVtYU9wdHNUeXBlPE1vZGVsLCBhbnk+IHwgdW5kZWZpbmVkXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogPGVtPkV4cGVyaW1lbnRhbDo8L2VtPiBBZGRzIGFsbCBpbnB1dCBmaWVsZHMgZm9yIHRoZSBub24tYXJyYXkgcHJvcGVydGllcyB2aWEge2FkZEZpZWxkSW5wdXRGcm9tU2NoZW1hfS5cbiAgICAgKlxuICAgICAqIEBleHBlcmltZW50YWxcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7RmllbGRzRnJvbVNjaGVtYU9wdHNUeXBlPFNjaE1vZGVsPn0gb3B0cyAtIEFkZGl0aW9uYWwgb3B0aW9ucy5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge3RoaXN9IC0gVGhlIGN1cnJlbnQgaW5zdGFuY2Ugb2YgdGhlIGJ1aWxkZXIuXG4gICAgICovXG4gICAgcHVibGljIHdpdGhBZGRBbGwob3B0cz86IEZpZWxkc0Zyb21TY2hlbWFPcHRzVHlwZTxTY2hNb2RlbD4pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5hZGRGaWVsZHModW5kZWZpbmVkLCBvcHRzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogPGVtPkV4cGVyaW1lbnRhbDo8L2VtPiBBZGRzIGlucHV0IGZpZWxkcyBmb3IgcHJvcGVydGllcyB2aWEge2FkZEZpZWxkSW5wdXRGcm9tU2NoZW1hfS5cbiAgICAgKlxuICAgICAqIEBleHBlcmltZW50YWxcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7RmllbGRzRnJvbVNjaGVtYU9wdHNUeXBlPFNjaE1vZGVsPn0gb3B0cyAtIEFkZGl0aW9uYWwgb3B0aW9ucy5cbiAgICAgKiBAcGFyYW0gey4uLlByb3BlcnR5W119IHByb3BlcnRpZXMgLSBQcm9wZXJ0aWVzIHRvIGFkZCBmaWVsZHMgZm9yLiBJZiBub24gcHJvdmlkZWQsIGFsbCBub24tYXJyYXkgcHJvcGVydGllcyBmcm9tIHNjaGVtYSB3aWxsIGJlIGFkZGVkLlxuICAgICAqXG4gICAgICogQHJldHVybiB7dGhpc30gLSBUaGUgY3VycmVudCBpbnN0YW5jZSBvZiB0aGUgYnVpbGRlci5cbiAgICAgKi9cbiAgICBwdWJsaWMgd2l0aEFkZDxQcm9wZXJ0eUtleSBleHRlbmRzIEV4dHJhY3Q8a2V5b2YgTW9kZWwsIGtleW9mIFNjaE1vZGVsPj4ob3B0czogRmllbGRzRnJvbVNjaGVtYU9wdHNUeXBlPFNjaE1vZGVsPiwgLi4ucHJvcGVydGllczogUHJvcGVydHlLZXlbXSk6IHRoaXM7XG4gICAgLyoqXG4gICAgICogPGVtPkV4cGVyaW1lbnRhbDo8L2VtPiBBZGRzIGZpZWxkcyBmb3IgcHJvcGVydGllcyB2aWEge2FkZEZpZWxkSW5wdXRGcm9tU2NoZW1hfS5cbiAgICAgKlxuICAgICAqIEBleHBlcmltZW50YWxcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Li4uUHJvcGVydHlbXX0gcHJvcGVydGllcyAtIFByb3BlcnRpZXMgdG8gYWRkIGZpZWxkcyBmb3IuIElmIG5vbiBwcm92aWRlZCwgYWxsIG5vbi1hcnJheSBwcm9wZXJ0aWVzIGZyb20gc2NoZW1hIHdpbGwgYmUgYWRkZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSAtIFRoZSBjdXJyZW50IGluc3RhbmNlIG9mIHRoZSBidWlsZGVyLlxuICAgICAqL1xuICAgIHB1YmxpYyB3aXRoQWRkPFByb3BlcnR5S2V5IGV4dGVuZHMgRXh0cmFjdDxrZXlvZiBNb2RlbCwga2V5b2YgU2NoTW9kZWw+PiguLi5wcm9wZXJ0aWVzOiBQcm9wZXJ0eUtleVtdKTogdGhpcztcbiAgICBwdWJsaWMgd2l0aEFkZDxQcm9wZXJ0eUtleSBleHRlbmRzIEV4dHJhY3Q8a2V5b2YgTW9kZWwsIGtleW9mIFNjaE1vZGVsPj4ocHJvcE9yT3B0czogRmllbGRzRnJvbVNjaGVtYU9wdHNUeXBlPFNjaE1vZGVsPiB8IFByb3BlcnR5S2V5LCAuLi5wcm9wZXJ0aWVzOiBQcm9wZXJ0eUtleVtdKTogdGhpcyB7XG4gICAgICAgIGlmICh0eXBlb2YgcHJvcE9yT3B0cyA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkRmllbGRzKHByb3BlcnRpZXMubGVuZ3RoID09PSAwID8gdW5kZWZpbmVkIDogcHJvcGVydGllcywgcHJvcE9yT3B0cyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmFkZEZpZWxkcyhwcm9wT3JPcHRzID09PSB1bmRlZmluZWQgPyBwcm9wZXJ0aWVzIDogW3Byb3BPck9wdHMsIC4uLnByb3BlcnRpZXNdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwcml2YXRlIGFkZEZpZWxkczxQcm9wZXJ0eSBleHRlbmRzIEV4dHJhY3Q8a2V5b2YgTW9kZWwsIGtleW9mIFNjaE1vZGVsPj4ocHJvcGVydGllcz86IFByb3BlcnR5W10sIG9wdHM/OiBGaWVsZHNGcm9tU2NoZW1hT3B0c1R5cGU8U2NoTW9kZWw+KSB7XG4gICAgICAgIGNvbnN0IGFkZFByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzID8/IGZyb21TY2hlbWFGaWx0ZXJOb25BcnJheVByb3BlcnRpZXModGhpcy5zY2hlbWEucHJvcGVydGllcyk7XG5cbiAgICAgICAgYWRkUHJvcGVydGllcy5mb3JFYWNoKHByb3BlcnR5ID0+IHtcbiAgICAgICAgICAgIGFkZEZpZWxkSW5wdXRGcm9tU2NoZW1hKFxuICAgICAgICAgICAgICAgIHRoaXMuZGVzY3JpcHRvcixcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eSBhcyB1bmtub3duIGFzIGtleW9mIE1vZGVsLFxuICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hLnByb3BlcnRpZXNbcHJvcGVydHldLFxuICAgICAgICAgICAgICAgIHRoaXMubWVyZ2VGaWVsZHNJbnB1dE9wdHMocHJvcGVydHksIG9wdHMpIGFzIEZpZWxkSW5wdXRGcm9tU2NoZW1hT3B0c1R5cGU8TW9kZWwsIGFueT4gfCB1bmRlZmluZWRcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIDxlbT5FeHBlcmltZW50YWw6PC9lbT4gQWRkcyBhIHNpbmdsZSBpbnB1dCBmaWVsZCB2aWEge2FkZEZpZWxkSW5wdXRGcm9tU2NoZW1hfSB3aGVyZSBwcm9wZXJ0eSBzY2hlbWEgaXMgbWFudWFsbHkgcHJvdmlkZWQuXG4gICAgICpcbiAgICAgKiBAZXhwZXJpbWVudGFsXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1Byb3BlcnR5fSBwcm9wZXJ0eSAtIFRoZSBwcm9wZXJ0eSB0byBhZGQgdGhlIGZpZWxkIGZvci5cbiAgICAgKiBAcGFyYW0ge1NjaGVtYVByb3BlcnR5fSBzY2hlbWFQcm9wZXJ0eSAtIE1hbnVhbGx5IHByb3ZpZGVkIHNjaGVtYSBwcm9wZXJ0eS5cbiAgICAgKiBAcGFyYW0ge0ZpZWxkSW5wdXRGcm9tU2NoZW1hT3B0c1R5cGU8TW9kZWw+fSBvcHRzIC0gQWRkaXRpb25hbCBvcHRpb25zLlxuICAgICAqXG4gICAgICogQHJldHVybiB7RmllbGRJbnB1dERlc2NyaXB0b3I8TW9kZWwsIE5vbk51bGxhYmxlPE1vZGVsW1Byb3BlcnR5XT4sIE1vZGVsW1Byb3BlcnR5XSwgUGFyZW50Pn0gVGhlIGFkZGVkIGZpZWxkIGRlc2NyaXB0b3IuXG4gICAgICovXG4gICAgcHVibGljIGFkZEZyb21TY2hlbWE8UHJvcGVydHkgZXh0ZW5kcyBrZXlvZiBNb2RlbD4oXG4gICAgICAgIHByb3BlcnR5OiBQcm9wZXJ0eSxcbiAgICAgICAgc2NoZW1hUHJvcGVydHk6IFNjaGVtYVByb3BlcnR5LFxuICAgICAgICBvcHRzPzogRmllbGRJbnB1dEZyb21TY2hlbWFPcHRzVHlwZTxNb2RlbD5cbiAgICApOiBGaWVsZElucHV0RGVzY3JpcHRvcjxNb2RlbCwgTm9uTnVsbGFibGU8TW9kZWxbUHJvcGVydHldPiwgTW9kZWxbUHJvcGVydHldLCBQYXJlbnQ+IHtcbiAgICAgICAgcmV0dXJuIGFkZEZpZWxkSW5wdXRGcm9tU2NoZW1hKHRoaXMuZGVzY3JpcHRvciwgcHJvcGVydHksIHNjaGVtYVByb3BlcnR5LCB0aGlzLm1lcmdlRmllbGRJbnB1dE9wdHMocHJvcGVydHksIG9wdHMpIGFzIEZpZWxkSW5wdXRGcm9tU2NoZW1hT3B0c1R5cGU8TW9kZWwsIGFueT4gfCB1bmRlZmluZWQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIDxlbT5FeHBlcmltZW50YWw6PC9lbT4gQWRkcyBhbiBlbnVtIGxvb2t1cCBmaWVsZCB2aWEge2FkZEZpZWxkRW51bUxvb2t1cEZyb21TY2hlbWF9LlxuICAgICAqXG4gICAgICogQGV4cGVyaW1lbnRhbFxuICAgICAqXG4gICAgICogQHBhcmFtIHtQcm9wZXJ0eX0gcHJvcGVydHkgLSBUaGUgcHJvcGVydHkgdG8gYWRkIHRoZSBlbnVtIGxvb2t1cCBmaWVsZCBmb3IuXG4gICAgICogQHBhcmFtIHtTY2hlbWFFbnVtPEVudW0+IHwgRW51bURlc2NyaXB0b3I8RW51bT59IFtlbnVtT3B0XSAtIFRoZSBlbnVtIHNjaGVtYSBvciB0aGUgZW51bSBtb2RlbCBkZXNjcmlwdG9yLiBJZiBub24gcHJvdmlkZWQsIGJ1aWxkZXIgb3B0cyB3aWxsIGJlIGNoZWNrZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7RmllbGRMb29rdXBFbnVtRGVzY3JpcHRvcjxFbnVtLCBNb2RlbCwgUGFyZW50Pn0gLSBUaGUgYWRkZWQgZmllbGQgZGVzY3JpcHRvci5cbiAgICAgKlxuICAgICAqIEB0aHJvd3Mge0NvbW1vbnNJbnRlcm5hbEVycm9yfSAtIElmIG5vIGVudW0gbWV0YWRhdGEgaXMgZm91bmQgZm9yIHRoZSBwcm9wZXJ0eSBlaXRoZXIgZnJvbSBwYXJhbWV0ZXIgb3IgZnJvbSBidWlsZGVyJ3Mgb3B0cy5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWRkRW51bTxQcm9wZXJ0eSBleHRlbmRzIEV4dHJhY3Q8a2V5b2YgTW9kZWwsIGtleW9mIFNjaE1vZGVsPiwgRW51bT4oXG4gICAgICAgIHByb3BlcnR5OiBQcm9wZXJ0eSxcbiAgICAgICAgZW51bU9wdD86IFNjaGVtYUVudW08RW51bT4gfCBFbnVtRGVzY3JpcHRvcjxFbnVtPlxuICAgICk6IEZpZWxkTG9va3VwRW51bURlc2NyaXB0b3I8RW51bSwgTW9kZWwsIFBhcmVudD4ge1xuICAgICAgICBpZiAoIWVudW1PcHQpIHtcbiAgICAgICAgICAgIGVudW1PcHQgPSB0aGlzLm9wdHM/LmVudW1Nb2RlbHM/Lltwcm9wZXJ0eV0gPz8gdGhpcy5vcHRzPy5lbnVtU2NoZW1hcz8uW3Byb3BlcnR5XTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWVudW1PcHQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBDb21tb25zSW50ZXJuYWxFcnJvcihgRW51bSBsb29rdXAgZmllbGQgZm9yIHByb3BlcnR5ICR7cHJvcGVydHkgYXMgc3RyaW5nfSBjYW5ub3QgYmUgYWRkZWQgYmVjYXVzZSBlbnVtIG1ldGFkYXRhIHdhcyBub3QgcHJvdmlkZWQuYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFkZEZpZWxkRW51bUxvb2t1cEZyb21TY2hlbWE8TW9kZWwsIFBhcmVudCwgRW51bT4odGhpcy5kZXNjcmlwdG9yLCBwcm9wZXJ0eSwgZW51bU9wdCwgdGhpcy5zY2hlbWEucHJvcGVydGllc1twcm9wZXJ0eV0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIDxlbT5FeHBlcmltZW50YWw6PC9lbT4gQWRkcyBhbiBlbnVtIGxvb2t1cCBmaWVsZCB2aWEge2FkZEZpZWxkRW51bUxvb2t1cEZyb21TY2hlbWF9IHdoZXJlIHByb3BlcnR5IHNjaGVtYSBpcyBtYW51YWxseSBwcm92aWRlZC5cbiAgICAgKlxuICAgICAqIEBleHBlcmltZW50YWxcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UHJvcGVydHl9IHByb3BlcnR5IC0gVGhlIHByb3BlcnR5IHRvIGFkZCB0aGUgZW51bSBsb29rdXAgZmllbGQgZm9yLlxuICAgICAqIEBwYXJhbSB7U2NoZW1hRW51bTxFbnVtPiB8IEVudW1EZXNjcmlwdG9yPEVudW0+fSBbZW51bU9wdF0gLSBUaGUgZW51bSBzY2hlbWEgb3IgdGhlIGVudW0gbW9kZWwgZGVzY3JpcHRvci4gSWYgbm9uIHByb3ZpZGVkLCBidWlsZGVyIG9wdHMgd2lsbCBiZSBjaGVja2VkLlxuICAgICAqIEBwYXJhbSB7U2NoZW1hUHJvcGVydHl9IHNjaGVtYVByb3BlcnR5IC0gTWFudWFsbHkgcHJvdmlkZWQgc2NoZW1hIHByb3BlcnR5LlxuICAgICAqXG4gICAgICogQHJldHVybnMge0ZpZWxkTG9va3VwRW51bURlc2NyaXB0b3I8RW51bSwgTW9kZWwsIFBhcmVudD59IC0gVGhlIGFkZGVkIGZpZWxkIGRlc2NyaXB0b3IuXG4gICAgICpcbiAgICAgKiBAdGhyb3dzIHtDb21tb25zSW50ZXJuYWxFcnJvcn0gLSBJZiBubyBlbnVtIG1ldGFkYXRhIGlzIGZvdW5kIGZvciB0aGUgcHJvcGVydHkgZWl0aGVyIGZyb20gcGFyYW1ldGVyIG9yIGZyb20gYnVpbGRlcidzIG9wdHMuXG4gICAgICovXG4gICAgcHVibGljIGFkZEVudW1Gcm9tU2NoZW1hPFByb3BlcnR5IGV4dGVuZHMga2V5b2YgTW9kZWwsIEVudW0+KFxuICAgICAgICBwcm9wZXJ0eTogUHJvcGVydHksXG4gICAgICAgIGVudW1PcHQ6IFNjaGVtYUVudW08RW51bT4gfCBFbnVtRGVzY3JpcHRvcjxFbnVtPiB8IHVuZGVmaW5lZCxcbiAgICAgICAgc2NoZW1hUHJvcGVydHk6IFNjaGVtYVByb3BlcnR5XG4gICAgKTogRmllbGRMb29rdXBFbnVtRGVzY3JpcHRvcjxFbnVtLCBNb2RlbCwgUGFyZW50PiB7XG4gICAgICAgIGlmICghZW51bU9wdCkge1xuICAgICAgICAgICAgZW51bU9wdCA9IHRoaXMub3B0cz8uZW51bU1vZGVscz8uW3Byb3BlcnR5XSA/PyB0aGlzLm9wdHM/LmVudW1TY2hlbWFzPy5bcHJvcGVydHldO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZW51bU9wdCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IENvbW1vbnNJbnRlcm5hbEVycm9yKGBFbnVtIGxvb2t1cCBmaWVsZCBmb3IgcHJvcGVydHkgJHtwcm9wZXJ0eSBhcyBzdHJpbmd9IGNhbm5vdCBiZSBhZGRlZCBiZWNhdXNlIGVudW0gbWV0YWRhdGEgd2FzIG5vdCBwcm92aWRlZC5gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWRkRmllbGRFbnVtTG9va3VwRnJvbVNjaGVtYSh0aGlzLmRlc2NyaXB0b3IsIHByb3BlcnR5LCBlbnVtT3B0LCBzY2hlbWFQcm9wZXJ0eSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogPGVtPkV4cGVyaW1lbnRhbDo8L2VtPiBBZGRzIGEgbG9va3VwIGZpZWxkLlxuICAgICAqIHtFZGl0b3JEZXNjcmlwdG9ySW50LmFkZEZpZWxkTG9va3VwfSBpcyB1c2VkIHRvIGNyZWF0ZSBmaWVsZCBhbmQgJHtzZXRGaWVsZEJhc2ljT3B0aW9uc0Zyb21TY2hlbWF9IHRvIGFkZCBiYXNpYyBmaWVsZCdzIG9wdGlvbnMgZnJvbSBzY2hlbWEuXG4gICAgICpcbiAgICAgKiBAZXhwZXJpbWVudGFsXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1Byb3BlcnR5fSBwcm9wZXJ0eSAtIFRoZSBwcm9wZXJ0eSB0byBjcmVhdGUgdGhlIGxvb2t1cCBmaWVsZCBmb3IuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIGxvb2t1cCBmaWVsZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWRkTG9va3VwPFByb3BlcnR5IGV4dGVuZHMgRXh0cmFjdDxrZXlvZiBNb2RlbCwga2V5b2YgU2NoTW9kZWw+LCBMb29rdXBNb2RlbCA9IE5vbk51bGxhYmxlPE1vZGVsW1Byb3BlcnR5XT4+KHByb3BlcnR5OiBQcm9wZXJ0eSkge1xuICAgICAgICBjb25zdCBmaWVsZCA9IHRoaXMuZGVzY3JpcHRvci5hZGRGaWVsZExvb2t1cDxQcm9wZXJ0eSwgTG9va3VwTW9kZWw+KHByb3BlcnR5KTtcbiAgICAgICAgc2V0RmllbGRCYXNpY09wdGlvbnNGcm9tU2NoZW1hKGZpZWxkLCB0aGlzLnNjaGVtYS5wcm9wZXJ0aWVzW3Byb3BlcnR5XSk7XG4gICAgICAgIHJldHVybiBmaWVsZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiA8ZW0+RXhwZXJpbWVudGFsOjwvZW0+IEFkZHMgYSBsb29rdXAgZmllbGQgd2hlcmUgcHJvcGVydHkgc2NoZW1hIGlzIG1hbnVhbGx5IHByb3ZpZGVkLlxuICAgICAqIHtFZGl0b3JEZXNjcmlwdG9ySW50LmFkZEZpZWxkTG9va3VwfSBpcyB1c2VkIHRvIGNyZWF0ZSBmaWVsZCBhbmQgJHtzZXRGaWVsZEJhc2ljT3B0aW9uc0Zyb21TY2hlbWF9IHRvIGFkZCBiYXNpYyBmaWVsZCdzIG9wdGlvbnMgZnJvbSBzY2hlbWEuXG4gICAgICpcbiAgICAgKiBAZXhwZXJpbWVudGFsXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1Byb3BlcnR5fSBwcm9wZXJ0eSAtIFRoZSBwcm9wZXJ0eSB0byBjcmVhdGUgdGhlIGxvb2t1cCBmaWVsZCBmb3IuXG4gICAgICogQHBhcmFtIHtTY2hlbWFQcm9wZXJ0eX0gc2NoZW1hUHJvcGVydHkgLSBNYW51YWxseSBwcm92aWRlZCBzY2hlbWEgcHJvcGVydHkuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIGxvb2t1cCBmaWVsZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWRkTG9va3VwRnJvbVNjaGVtYTxQcm9wZXJ0eSBleHRlbmRzIGtleW9mIE1vZGVsPihwcm9wZXJ0eTogUHJvcGVydHksIHNjaGVtYVByb3BlcnR5OiBTY2hlbWFQcm9wZXJ0eSkge1xuICAgICAgICBjb25zdCBmaWVsZCA9IHRoaXMuZGVzY3JpcHRvci5hZGRGaWVsZExvb2t1cChwcm9wZXJ0eSk7XG4gICAgICAgIHNldEZpZWxkQmFzaWNPcHRpb25zRnJvbVNjaGVtYShmaWVsZCwgc2NoZW1hUHJvcGVydHkpO1xuICAgICAgICByZXR1cm4gZmllbGQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogPGVtPkV4cGVyaW1lbnRhbDo8L2VtPiBBZGRzIGEgbG9va3VwIGZpZWxkLlxuICAgICAqIHtFZGl0b3JEZXNjcmlwdG9ySW50LmFkZEZpZWxkTG9va3VwV2l0aE9wdGlvbnNWYWx1ZVByb3BlcnR5fSBpcyB1c2VkIHRvIGNyZWF0ZSBmaWVsZCBhbmQgJHtzZXRGaWVsZEJhc2ljT3B0aW9uc0Zyb21TY2hlbWF9IHRvIGFkZCBiYXNpYyBmaWVsZCdzIG9wdGlvbnMgZnJvbSBzY2hlbWEuXG4gICAgICpcbiAgICAgKiBAZXhwZXJpbWVudGFsXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1Byb3BlcnR5fSBwcm9wZXJ0eSAtIFRoZSBwcm9wZXJ0eSB0byBjcmVhdGUgdGhlIGxvb2t1cCBmaWVsZCBmb3IuXG4gICAgICogQHBhcmFtIHtUeXBlRGVzY3JpcHRvcjxMb29rdXBNb2RlbD59IHR5cGUgLSBUeXBlIG9mIGxvb2t1cCBtb2RlbC5cbiAgICAgKiBAcGFyYW0ge0xvb2t1cFZhbHVlUHJvcGVydHl9IGxvb2t1cE9wdGlvbnNWYWx1ZVByb3BlcnR5IC0gVmFsdWUgcHJvcGVydHkgZnJvbSBsb29rdXAgbW9kZWwuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIGxvb2t1cCBmaWVsZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWRkTG9va3VwV2l0aE9wdGlvbnNWYWx1ZVByb3BlcnR5PFxuICAgICAgICBQcm9wZXJ0eSBleHRlbmRzIEV4dHJhY3Q8a2V5b2YgTW9kZWwsIGtleW9mIFNjaE1vZGVsPixcbiAgICAgICAgTG9va3VwTW9kZWwsXG4gICAgICAgIExvb2t1cFZhbHVlUHJvcGVydHkgZXh0ZW5kcyBLZXlvZkFuZE9mVHlwZTxMb29rdXBNb2RlbCwgTW9kZWxbUHJvcGVydHldPlxuICAgID4ocHJvcGVydHk6IFByb3BlcnR5LCB0eXBlOiBUeXBlRGVzY3JpcHRvcjxMb29rdXBNb2RlbD4sIGxvb2t1cE9wdGlvbnNWYWx1ZVByb3BlcnR5OiBMb29rdXBWYWx1ZVByb3BlcnR5KSB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gdGhpcy5kZXNjcmlwdG9yLmFkZEZpZWxkTG9va3VwV2l0aE9wdGlvbnNWYWx1ZVByb3BlcnR5KHByb3BlcnR5LCB0eXBlLCBsb29rdXBPcHRpb25zVmFsdWVQcm9wZXJ0eSk7XG4gICAgICAgIHNldEZpZWxkQmFzaWNPcHRpb25zRnJvbVNjaGVtYShmaWVsZCwgdGhpcy5zY2hlbWEucHJvcGVydGllc1twcm9wZXJ0eV0pO1xuICAgICAgICByZXR1cm4gZmllbGQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogPGVtPkV4cGVyaW1lbnRhbDo8L2VtPiBBZGRzIGEgbG9va3VwIGZpZWxkIHdoZXJlIHByb3BlcnR5IHNjaGVtYSBpcyBtYW51YWxseSBwcm92aWRlZC5cbiAgICAgKiB7RWRpdG9yRGVzY3JpcHRvckludC5hZGRGaWVsZExvb2t1cFdpdGhPcHRpb25zVmFsdWVQcm9wZXJ0eX0gaXMgdXNlZCB0byBjcmVhdGUgZmllbGQgYW5kICR7c2V0RmllbGRCYXNpY09wdGlvbnNGcm9tU2NoZW1hfSB0byBhZGQgYmFzaWMgZmllbGQncyBvcHRpb25zIGZyb20gc2NoZW1hLlxuICAgICAqXG4gICAgICogQGV4cGVyaW1lbnRhbFxuICAgICAqXG4gICAgICogQHBhcmFtIHtQcm9wZXJ0eX0gcHJvcGVydHkgLSBUaGUgcHJvcGVydHkgdG8gY3JlYXRlIHRoZSBsb29rdXAgZmllbGQgZm9yLlxuICAgICAqIEBwYXJhbSB7VHlwZURlc2NyaXB0b3I8TG9va3VwTW9kZWw+fSB0eXBlIC0gVHlwZSBvZiBsb29rdXAgbW9kZWwuXG4gICAgICogQHBhcmFtIHtMb29rdXBWYWx1ZVByb3BlcnR5fSBsb29rdXBPcHRpb25zVmFsdWVQcm9wZXJ0eSAtIFZhbHVlIHByb3BlcnR5IGZyb20gbG9va3VwIG1vZGVsLlxuICAgICAqIEBwYXJhbSB7U2NoZW1hUHJvcGVydHl9IHNjaGVtYVByb3BlcnR5IC0gTWFudWFsbHkgcHJvdmlkZWQgc2NoZW1hIHByb3BlcnR5LlxuICAgICAqXG4gICAgICogQHJldHVybiBUaGUgY3JlYXRlZCBsb29rdXAgZmllbGQuXG4gICAgICovXG4gICAgcHVibGljIGFkZExvb2t1cFdpdGhPcHRpb25zVmFsdWVQcm9wZXJ0eUZyb21TY2hlbWE8UHJvcGVydHkgZXh0ZW5kcyBrZXlvZiBNb2RlbCwgTG9va3VwTW9kZWwsIExvb2t1cFZhbHVlUHJvcGVydHkgZXh0ZW5kcyBLZXlvZkFuZE9mVHlwZTxMb29rdXBNb2RlbCwgTW9kZWxbUHJvcGVydHldPj4oXG4gICAgICAgIHByb3BlcnR5OiBQcm9wZXJ0eSxcbiAgICAgICAgdHlwZTogVHlwZURlc2NyaXB0b3I8TG9va3VwTW9kZWw+LFxuICAgICAgICBsb29rdXBPcHRpb25zVmFsdWVQcm9wZXJ0eTogTG9va3VwVmFsdWVQcm9wZXJ0eSxcbiAgICAgICAgc2NoZW1hUHJvcGVydHk6IFNjaGVtYVByb3BlcnR5XG4gICAgKSB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gdGhpcy5kZXNjcmlwdG9yLmFkZEZpZWxkTG9va3VwV2l0aE9wdGlvbnNWYWx1ZVByb3BlcnR5KHByb3BlcnR5LCB0eXBlLCBsb29rdXBPcHRpb25zVmFsdWVQcm9wZXJ0eSk7XG4gICAgICAgIHNldEZpZWxkQmFzaWNPcHRpb25zRnJvbVNjaGVtYShmaWVsZCwgc2NoZW1hUHJvcGVydHkpO1xuICAgICAgICByZXR1cm4gZmllbGQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogPGVtPkV4cGVyaW1lbnRhbDo8L2VtPiBBZGRzIGEgbG9va3VwIGZpZWxkLlxuICAgICAqIHtFZGl0b3JEZXNjcmlwdG9ySW50LmFkZEZpZWxkTG9va3VwV2l0aFByb3ZpZGVyfSBpcyB1c2VkIHRvIGNyZWF0ZSBmaWVsZCBhbmQgJHtzZXRGaWVsZEJhc2ljT3B0aW9uc0Zyb21TY2hlbWF9IHRvIGFkZCBiYXNpYyBmaWVsZCdzIG9wdGlvbnMgZnJvbSBzY2hlbWEuXG4gICAgICpcbiAgICAgKiBAZXhwZXJpbWVudGFsXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1Byb3BlcnR5fSBwcm9wZXJ0eSAtIFRoZSBwcm9wZXJ0eSB0byBjcmVhdGUgdGhlIGxvb2t1cCBmaWVsZCBmb3IuXG4gICAgICogQHBhcmFtIHtGaWVsZExvb2t1cFByb3ZpZGVyVHlwZTxMb29rdXBNb2RlbCwgU2VydmljZT59IHByb3ZpZGVyIC0gTG9va3VwIHByb3ZpZGVyLlxuICAgICAqXG4gICAgICogQHJldHVybiBUaGUgY3JlYXRlZCBsb29rdXAgZmllbGQuXG4gICAgICovXG4gICAgcHVibGljIGFkZExvb2t1cFdpdGhQcm92aWRlcjxQcm9wZXJ0eSBleHRlbmRzIEV4dHJhY3Q8a2V5b2YgTW9kZWwsIGtleW9mIFNjaE1vZGVsPiwgU2VydmljZSwgTG9va3VwTW9kZWwgPSBOb25OdWxsYWJsZTxNb2RlbFtQcm9wZXJ0eV0+PihcbiAgICAgICAgcHJvcGVydHk6IFByb3BlcnR5LFxuICAgICAgICBwcm92aWRlcjogRmllbGRMb29rdXBQcm92aWRlclR5cGU8TG9va3VwTW9kZWwsIFNlcnZpY2U+XG4gICAgKSB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gdGhpcy5kZXNjcmlwdG9yLmFkZEZpZWxkTG9va3VwV2l0aFByb3ZpZGVyKHByb3BlcnR5LCBwcm92aWRlcik7XG4gICAgICAgIHNldEZpZWxkQmFzaWNPcHRpb25zRnJvbVNjaGVtYShmaWVsZCwgdGhpcy5zY2hlbWEucHJvcGVydGllc1twcm9wZXJ0eV0pO1xuICAgICAgICByZXR1cm4gZmllbGQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogPGVtPkV4cGVyaW1lbnRhbDo8L2VtPiBBZGRzIGEgbG9va3VwIGZpZWxkIHdoZXJlIHByb3BlcnR5IHNjaGVtYSBpcyBtYW51YWxseSBwcm92aWRlZC5cbiAgICAgKiB7RWRpdG9yRGVzY3JpcHRvckludC5hZGRGaWVsZExvb2t1cFdpdGhQcm92aWRlcn0gaXMgdXNlZCB0byBjcmVhdGUgZmllbGQgYW5kICR7c2V0RmllbGRCYXNpY09wdGlvbnNGcm9tU2NoZW1hfSB0byBhZGQgYmFzaWMgZmllbGQncyBvcHRpb25zIGZyb20gc2NoZW1hLlxuICAgICAqXG4gICAgICogQGV4cGVyaW1lbnRhbFxuICAgICAqXG4gICAgICogQHBhcmFtIHtQcm9wZXJ0eX0gcHJvcGVydHkgLSBUaGUgcHJvcGVydHkgdG8gY3JlYXRlIHRoZSBsb29rdXAgZmllbGQgZm9yLlxuICAgICAqIEBwYXJhbSB7RmllbGRMb29rdXBQcm92aWRlclR5cGU8TG9va3VwTW9kZWwsIFNlcnZpY2U+fSBwcm92aWRlciAtIExvb2t1cCBwcm92aWRlci5cbiAgICAgKiBAcGFyYW0ge1NjaGVtYVByb3BlcnR5fSBzY2hlbWFQcm9wZXJ0eSAtIE1hbnVhbGx5IHByb3ZpZGVkIHNjaGVtYSBwcm9wZXJ0eS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVGhlIGNyZWF0ZWQgbG9va3VwIGZpZWxkLlxuICAgICAqL1xuICAgIHB1YmxpYyBhZGRMb29rdXBXaXRoUHJvdmlkZXJGcm9tU2NoZW1hPFByb3BlcnR5IGV4dGVuZHMga2V5b2YgTW9kZWwsIFNlcnZpY2UsIExvb2t1cE1vZGVsID0gTm9uTnVsbGFibGU8TW9kZWxbUHJvcGVydHldPj4oXG4gICAgICAgIHByb3BlcnR5OiBQcm9wZXJ0eSxcbiAgICAgICAgcHJvdmlkZXI6IEZpZWxkTG9va3VwUHJvdmlkZXJUeXBlPExvb2t1cE1vZGVsLCBTZXJ2aWNlPixcbiAgICAgICAgc2NoZW1hUHJvcGVydHk6IFNjaGVtYVByb3BlcnR5XG4gICAgKSB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gdGhpcy5kZXNjcmlwdG9yLmFkZEZpZWxkTG9va3VwV2l0aFByb3ZpZGVyKHByb3BlcnR5LCBwcm92aWRlcik7XG4gICAgICAgIHNldEZpZWxkQmFzaWNPcHRpb25zRnJvbVNjaGVtYShmaWVsZCwgc2NoZW1hUHJvcGVydHkpO1xuICAgICAgICByZXR1cm4gZmllbGQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogPGVtPkV4cGVyaW1lbnRhbDo8L2VtPiBBZGRzIGEgbG9va3VwIGZpZWxkLlxuICAgICAqIHtFZGl0b3JEZXNjcmlwdG9ySW50LmFkZEZpZWxkTG9va3VwV2l0aFByb3ZpZGVyQW5kT3B0aW9uc1ZhbHVlUHJvcGVydHl9IGlzIHVzZWQgdG8gY3JlYXRlIGZpZWxkIGFuZCAke3NldEZpZWxkQmFzaWNPcHRpb25zRnJvbVNjaGVtYX0gdG8gYWRkIGJhc2ljIGZpZWxkJ3Mgb3B0aW9ucyBmcm9tIHNjaGVtYS5cbiAgICAgKlxuICAgICAqIEBleHBlcmltZW50YWxcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UHJvcGVydHl9IHByb3BlcnR5IC0gVGhlIHByb3BlcnR5IHRvIGNyZWF0ZSB0aGUgbG9va3VwIGZpZWxkIGZvci5cbiAgICAgKiBAcGFyYW0ge0ZpZWxkTG9va3VwUHJvdmlkZXJUeXBlPExvb2t1cE1vZGVsLCBTZXJ2aWNlPn0gcHJvdmlkZXIgLSBMb29rdXAgcHJvdmlkZXIuXG4gICAgICogQHBhcmFtIHtUeXBlRGVzY3JpcHRvcjxMb29rdXBNb2RlbD59IHR5cGUgLSBUeXBlIG9mIGxvb2t1cCBtb2RlbC5cbiAgICAgKiBAcGFyYW0ge0xvb2t1cFZhbHVlUHJvcGVydHl9IGxvb2t1cE9wdGlvbnNWYWx1ZVByb3BlcnR5IC0gVmFsdWUgcHJvcGVydHkgZnJvbSBsb29rdXAgbW9kZWwuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIGxvb2t1cCBmaWVsZC5cbiAgICAgKi9cbiAgICBhZGRMb29rdXBXaXRoUHJvdmlkZXJBbmRPcHRpb25zVmFsdWVQcm9wZXJ0eTxcbiAgICAgICAgUHJvcGVydHkgZXh0ZW5kcyBFeHRyYWN0PGtleW9mIE1vZGVsLCBrZXlvZiBTY2hNb2RlbD4sXG4gICAgICAgIFNlcnZpY2UsXG4gICAgICAgIExvb2t1cE1vZGVsLFxuICAgICAgICBMb29rdXBWYWx1ZVByb3BlcnR5IGV4dGVuZHMgS2V5b2ZBbmRPZlR5cGU8TG9va3VwTW9kZWwsIE1vZGVsW1Byb3BlcnR5XT4sXG4gICAgICAgIEZpZWxkVmFsdWUgPSBNb2RlbFtQcm9wZXJ0eV1cbiAgICA+KFxuICAgICAgICBwcm9wZXJ0eTogUHJvcGVydHksXG4gICAgICAgIHByb3ZpZGVyOiBGaWVsZExvb2t1cFByb3ZpZGVyVHlwZTxMb29rdXBNb2RlbCwgU2VydmljZT4sXG4gICAgICAgIHR5cGU6IFR5cGVEZXNjcmlwdG9yPExvb2t1cE1vZGVsPixcbiAgICAgICAgbG9va3VwT3B0aW9uc1ZhbHVlUHJvcGVydHk6IExvb2t1cFZhbHVlUHJvcGVydHlcbiAgICApOiBGaWVsZExvb2t1cERlc2NyaXB0b3I8TG9va3VwTW9kZWwsIE1vZGVsLCBTZXJ2aWNlLCBGaWVsZFZhbHVlLCBQYXJlbnQ+IHtcbiAgICAgICAgY29uc3QgZmllbGQgPSB0aGlzLmRlc2NyaXB0b3IuYWRkRmllbGRMb29rdXBXaXRoUHJvdmlkZXJBbmRPcHRpb25zVmFsdWVQcm9wZXJ0eShwcm9wZXJ0eSwgcHJvdmlkZXIsIHR5cGUsIGxvb2t1cE9wdGlvbnNWYWx1ZVByb3BlcnR5KTtcbiAgICAgICAgc2V0RmllbGRCYXNpY09wdGlvbnNGcm9tU2NoZW1hKGZpZWxkLCB0aGlzLnNjaGVtYS5wcm9wZXJ0aWVzW3Byb3BlcnR5XSk7XG4gICAgICAgIHJldHVybiBmaWVsZCBhcyBGaWVsZExvb2t1cERlc2NyaXB0b3I8TG9va3VwTW9kZWwsIE1vZGVsLCBTZXJ2aWNlLCBGaWVsZFZhbHVlLCBQYXJlbnQ+O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIDxlbT5FeHBlcmltZW50YWw6PC9lbT4gQWRkcyBhIGxvb2t1cCBmaWVsZCB3aGVyZSBwcm9wZXJ0eSBzY2hlbWEgaXMgbWFudWFsbHkgcHJvdmlkZWQuXG4gICAgICoge0VkaXRvckRlc2NyaXB0b3JJbnQuYWRkRmllbGRMb29rdXBXaXRoUHJvdmlkZXJBbmRPcHRpb25zVmFsdWVQcm9wZXJ0eX0gaXMgdXNlZCB0byBjcmVhdGUgZmllbGQgYW5kICR7c2V0RmllbGRCYXNpY09wdGlvbnNGcm9tU2NoZW1hfSB0byBhZGQgYmFzaWMgZmllbGQncyBvcHRpb25zIGZyb20gc2NoZW1hLlxuICAgICAqXG4gICAgICogQGV4cGVyaW1lbnRhbFxuICAgICAqXG4gICAgICogQHBhcmFtIHtQcm9wZXJ0eX0gcHJvcGVydHkgLSBUaGUgcHJvcGVydHkgdG8gY3JlYXRlIHRoZSBsb29rdXAgZmllbGQgZm9yLlxuICAgICAqIEBwYXJhbSB7RmllbGRMb29rdXBQcm92aWRlclR5cGU8TG9va3VwTW9kZWwsIFNlcnZpY2U+fSBwcm92aWRlciAtIExvb2t1cCBwcm92aWRlci5cbiAgICAgKiBAcGFyYW0ge1R5cGVEZXNjcmlwdG9yPExvb2t1cE1vZGVsPn0gdHlwZSAtIFR5cGUgb2YgbG9va3VwIG1vZGVsLlxuICAgICAqIEBwYXJhbSB7TG9va3VwVmFsdWVQcm9wZXJ0eX0gbG9va3VwT3B0aW9uc1ZhbHVlUHJvcGVydHkgLSBWYWx1ZSBwcm9wZXJ0eSBmcm9tIGxvb2t1cCBtb2RlbC5cbiAgICAgKiBAcGFyYW0ge1NjaGVtYVByb3BlcnR5fSBzY2hlbWFQcm9wZXJ0eSAtIE1hbnVhbGx5IHByb3ZpZGVkIHNjaGVtYSBwcm9wZXJ0eS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVGhlIGNyZWF0ZWQgbG9va3VwIGZpZWxkLlxuICAgICAqL1xuICAgIGFkZExvb2t1cFdpdGhQcm92aWRlckFuZE9wdGlvbnNWYWx1ZVByb3BlcnR5RnJvbVNjaGVtYTxcbiAgICAgICAgUHJvcGVydHkgZXh0ZW5kcyBrZXlvZiBNb2RlbCxcbiAgICAgICAgU2VydmljZSxcbiAgICAgICAgTG9va3VwTW9kZWwsXG4gICAgICAgIExvb2t1cFZhbHVlUHJvcGVydHkgZXh0ZW5kcyBLZXlvZkFuZE9mVHlwZTxMb29rdXBNb2RlbCwgTW9kZWxbUHJvcGVydHldPixcbiAgICAgICAgRmllbGRWYWx1ZSA9IE1vZGVsW1Byb3BlcnR5XVxuICAgID4oXG4gICAgICAgIHByb3BlcnR5OiBQcm9wZXJ0eSxcbiAgICAgICAgcHJvdmlkZXI6IEZpZWxkTG9va3VwUHJvdmlkZXJUeXBlPExvb2t1cE1vZGVsLCBTZXJ2aWNlPixcbiAgICAgICAgdHlwZTogVHlwZURlc2NyaXB0b3I8TG9va3VwTW9kZWw+LFxuICAgICAgICBsb29rdXBPcHRpb25zVmFsdWVQcm9wZXJ0eTogTG9va3VwVmFsdWVQcm9wZXJ0eSxcbiAgICAgICAgc2NoZW1hUHJvcGVydHk6IFNjaGVtYVByb3BlcnR5XG4gICAgKTogRmllbGRMb29rdXBEZXNjcmlwdG9yPExvb2t1cE1vZGVsLCBNb2RlbCwgU2VydmljZSwgRmllbGRWYWx1ZSwgUGFyZW50PiB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gdGhpcy5kZXNjcmlwdG9yLmFkZEZpZWxkTG9va3VwV2l0aFByb3ZpZGVyQW5kT3B0aW9uc1ZhbHVlUHJvcGVydHkocHJvcGVydHksIHByb3ZpZGVyLCB0eXBlLCBsb29rdXBPcHRpb25zVmFsdWVQcm9wZXJ0eSk7XG4gICAgICAgIHNldEZpZWxkQmFzaWNPcHRpb25zRnJvbVNjaGVtYShmaWVsZCwgc2NoZW1hUHJvcGVydHkpO1xuICAgICAgICByZXR1cm4gZmllbGQgYXMgRmllbGRMb29rdXBEZXNjcmlwdG9yPExvb2t1cE1vZGVsLCBNb2RlbCwgU2VydmljZSwgRmllbGRWYWx1ZSwgUGFyZW50PjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiA8ZW0+RXhwZXJpbWVudGFsOjwvZW0+IEFkZHMgYSBvbmUtdG8tbWFueSBlZGl0b3IgZmllbGQuXG4gICAgICoge0VkaXRvckRlc2NyaXB0b3JJbnQuYWRkRmllbGRNYW55RWRpdG9yfSBpcyB1c2VkIHRvIGNyZWF0ZSBmaWVsZCBhbmQgJHtzZXRGaWVsZEJhc2ljT3B0aW9uc0Zyb21TY2hlbWF9IHRvIGFkZCBiYXNpYyBmaWVsZCdzIG9wdGlvbnMgZnJvbSBzY2hlbWEuXG4gICAgICpcbiAgICAgKiBAZXhwZXJpbWVudGFsXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1Byb3BlcnR5fSBwcm9wZXJ0eSAtIFRoZSBwcm9wZXJ0eSB0byBjcmVhdGUgdGhlIG1hbnkgZWRpdG9yIGZpZWxkIGZvci5cbiAgICAgKiBAcGFyYW0ge1RhYmxldmlld0Rlc2NyaXB0b3JJbnN0PEZpZWxkTW9kZWwsIGFueSwgYW55LCBNb2RlbD59IHRhYmxldmlld0Rlc2NyaXB0b3IgLSBUYWJsZXZpZXcgZGVzY3JpcHRvci5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVGhlIGNyZWF0ZWQgb25lLXRvLW1hbnkgZWRpdG9yIGZpZWxkLlxuICAgICAqL1xuICAgIGFkZE1hbnlFZGl0b3I8UHJvcGVydHkgZXh0ZW5kcyBFeHRyYWN0PGtleW9mIE1vZGVsLCBrZXlvZiBTY2hNb2RlbD4sIEZpZWxkTW9kZWwgPSBBcnJheUl0ZW1UeXBlPE1vZGVsW1Byb3BlcnR5XT4sIEZpZWxkVmFsdWUgPSBNb2RlbFtQcm9wZXJ0eV0+KFxuICAgICAgICBwcm9wZXJ0eTogUHJvcGVydHksXG4gICAgICAgIHRhYmxldmlld0Rlc2NyaXB0b3I6IFRhYmxldmlld0Rlc2NyaXB0b3JJbnN0PEZpZWxkTW9kZWwsIGFueSwgYW55LCBNb2RlbD5cbiAgICApOiBGaWVsZE1hbnlFZGl0b3JEZXNjcmlwdG9yPEZpZWxkTW9kZWwsIE1vZGVsLCBGaWVsZFZhbHVlLCBQYXJlbnQ+IHtcbiAgICAgICAgY29uc3QgZmllbGQgPSB0aGlzLmRlc2NyaXB0b3IuYWRkRmllbGRNYW55RWRpdG9yPFByb3BlcnR5LCBGaWVsZE1vZGVsLCBGaWVsZFZhbHVlPihwcm9wZXJ0eSwgdGFibGV2aWV3RGVzY3JpcHRvcik7XG4gICAgICAgIHNldEZpZWxkQmFzaWNPcHRpb25zRnJvbVNjaGVtYShmaWVsZCwgdGhpcy5zY2hlbWEucHJvcGVydGllc1twcm9wZXJ0eV0pO1xuICAgICAgICByZXR1cm4gZmllbGQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogPGVtPkV4cGVyaW1lbnRhbDo8L2VtPiBBZGRzIGFuIG9uZS10by1tYW55IGVkaXRvciBmaWVsZCB3aGVyZSBwcm9wZXJ0eSBzY2hlbWEgaXMgbWFudWFsbHkgcHJvdmlkZWQuXG4gICAgICoge0VkaXRvckRlc2NyaXB0b3JJbnQuYWRkRmllbGRNYW55RWRpdG9yfSBpcyB1c2VkIHRvIGNyZWF0ZSBmaWVsZCBhbmQgJHtzZXRGaWVsZEJhc2ljT3B0aW9uc0Zyb21TY2hlbWF9IHRvIGFkZCBiYXNpYyBmaWVsZCdzIG9wdGlvbnMgZnJvbSBzY2hlbWEuXG4gICAgICpcbiAgICAgKiBAZXhwZXJpbWVudGFsXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1Byb3BlcnR5fSBwcm9wZXJ0eSAtIFRoZSBwcm9wZXJ0eSB0byBjcmVhdGUgdGhlIG1hbnkgZWRpdG9yIGZpZWxkIGZvci5cbiAgICAgKiBAcGFyYW0ge1RhYmxldmlld0Rlc2NyaXB0b3JJbnN0PEZpZWxkTW9kZWwsIGFueSwgYW55LCBNb2RlbD59IHRhYmxldmlld0Rlc2NyaXB0b3IgLSBUYWJsZXZpZXcgZGVzY3JpcHRvci5cbiAgICAgKiBAcGFyYW0ge1NjaGVtYVByb3BlcnR5fSBzY2hlbWFQcm9wZXJ0eSAtIE1hbnVhbGx5IHByb3ZpZGVkIHNjaGVtYSBwcm9wZXJ0eS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVGhlIGNyZWF0ZWQgb25lLXRvLW1hbnkgZWRpdG9yIGZpZWxkLlxuICAgICAqL1xuICAgIGFkZE1hbnlFZGl0b3JGcm9tU2NoZW1hPFByb3BlcnR5IGV4dGVuZHMga2V5b2YgTW9kZWwsIEZpZWxkTW9kZWwgPSBBcnJheUl0ZW1UeXBlPE1vZGVsW1Byb3BlcnR5XT4sIEZpZWxkVmFsdWUgPSBNb2RlbFtQcm9wZXJ0eV0+KFxuICAgICAgICBwcm9wZXJ0eTogUHJvcGVydHksXG4gICAgICAgIHRhYmxldmlld0Rlc2NyaXB0b3I6IFRhYmxldmlld0Rlc2NyaXB0b3JJbnN0PEZpZWxkTW9kZWwsIGFueSwgYW55LCBNb2RlbD4sXG4gICAgICAgIHNjaGVtYVByb3BlcnR5OiBTY2hlbWFQcm9wZXJ0eVxuICAgICk6IEZpZWxkTWFueUVkaXRvckRlc2NyaXB0b3I8RmllbGRNb2RlbCwgTW9kZWwsIEZpZWxkVmFsdWUsIFBhcmVudD4ge1xuICAgICAgICBjb25zdCBmaWVsZCA9IHRoaXMuZGVzY3JpcHRvci5hZGRGaWVsZE1hbnlFZGl0b3I8UHJvcGVydHksIEZpZWxkTW9kZWwsIEZpZWxkVmFsdWU+KHByb3BlcnR5LCB0YWJsZXZpZXdEZXNjcmlwdG9yKTtcbiAgICAgICAgc2V0RmllbGRCYXNpY09wdGlvbnNGcm9tU2NoZW1hKGZpZWxkLCBzY2hlbWFQcm9wZXJ0eSk7XG4gICAgICAgIHJldHVybiBmaWVsZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiA8ZW0+RXhwZXJpbWVudGFsOjwvZW0+IEFkZHMgYSBtYW55LXRvLW1hbnkgZWRpdG9yIGZpZWxkLlxuICAgICAqIHtFZGl0b3JEZXNjcmlwdG9ySW50LmFkZEZpZWxkTWFueVRvTWFueUVkaXRvcn0gaXMgdXNlZCB0byBjcmVhdGUgZmllbGQgYW5kICR7c2V0RmllbGRCYXNpY09wdGlvbnNGcm9tU2NoZW1hfSB0byBhZGQgYmFzaWMgZmllbGQncyBvcHRpb25zIGZyb20gc2NoZW1hLlxuICAgICAqXG4gICAgICogQGV4cGVyaW1lbnRhbFxuICAgICAqXG4gICAgICogQHBhcmFtIHtQcm9wZXJ0eX0gcHJvcGVydHkgLSBUaGUgcHJvcGVydHkgdG8gY3JlYXRlIHRoZSBtYW55IGVkaXRvciBmaWVsZCBmb3IuXG4gICAgICogQHBhcmFtIHtUYWJsZURlc2NyaXB0b3JJbnN0PEZpZWxkTW9kZWw+fSBtYWluVGFibGVEZXNjcmlwdG9yIC0gTWFpbiB0YWJsZSBkZXNjcmlwdG9yLlxuICAgICAqIEBwYXJhbSB7VGFibGVEZXNjcmlwdG9ySW5zdDxGaWVsZE1vZGVsPn0gbG9va3VwVGFibGVEZXNjcmlwdG9yIC0gTG9va3VwIHRhYmxlIGRlc2NyaXB0b3IuXG4gICAgICogQHBhcmFtIHtJVGFibGVEYXRhUHJvdmlkZXI8RmllbGRNb2RlbCwgU2VydmljZVR5cGU+fSBsb29rdXBEYXRhUHJvdmlkZXIgLSBMb29rdXAgZGF0YSBwcm92aWRlci5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVGhlIGNyZWF0ZWQgbWFueS10by1tYW55IGVkaXRvciBmaWVsZC5cbiAgICAgKi9cbiAgICBhZGRNYW55VG9NYW55RWRpdG9yPFByb3BlcnR5IGV4dGVuZHMgRXh0cmFjdDxrZXlvZiBNb2RlbCwga2V5b2YgU2NoTW9kZWw+LCBTZXJ2aWNlVHlwZSwgRmllbGRNb2RlbCA9IEFycmF5SXRlbVR5cGU8TW9kZWxbUHJvcGVydHldPiwgRmllbGRWYWx1ZSA9IE1vZGVsW1Byb3BlcnR5XT4oXG4gICAgICAgIHByb3BlcnR5OiBQcm9wZXJ0eSxcbiAgICAgICAgbWFpblRhYmxlRGVzY3JpcHRvcjogVGFibGVEZXNjcmlwdG9ySW5zdDxGaWVsZE1vZGVsPixcbiAgICAgICAgbG9va3VwVGFibGVEZXNjcmlwdG9yOiBUYWJsZURlc2NyaXB0b3JJbnN0PEZpZWxkTW9kZWw+LFxuICAgICAgICBsb29rdXBEYXRhUHJvdmlkZXI6IElUYWJsZURhdGFQcm92aWRlcjxGaWVsZE1vZGVsLCBTZXJ2aWNlVHlwZT5cbiAgICApOiBGaWVsZE1hbnlUb01hbnlFZGl0b3JEZXNjcmlwdG9yPEZpZWxkTW9kZWwsIE1vZGVsLCBTZXJ2aWNlVHlwZSwgRmllbGRWYWx1ZSwgUGFyZW50PiB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gdGhpcy5kZXNjcmlwdG9yLmFkZEZpZWxkTWFueVRvTWFueUVkaXRvcjxQcm9wZXJ0eSwgU2VydmljZVR5cGUsIEZpZWxkTW9kZWwsIEZpZWxkVmFsdWU+KFxuICAgICAgICAgICAgcHJvcGVydHksXG4gICAgICAgICAgICBtYWluVGFibGVEZXNjcmlwdG9yLFxuICAgICAgICAgICAgbG9va3VwVGFibGVEZXNjcmlwdG9yLFxuICAgICAgICAgICAgbG9va3VwRGF0YVByb3ZpZGVyXG4gICAgICAgICk7XG4gICAgICAgIHNldEZpZWxkQmFzaWNPcHRpb25zRnJvbVNjaGVtYShmaWVsZCwgdGhpcy5zY2hlbWEucHJvcGVydGllc1twcm9wZXJ0eV0pO1xuICAgICAgICByZXR1cm4gZmllbGQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogPGVtPkV4cGVyaW1lbnRhbDo8L2VtPiBBZGRzIGEgbWFueS10by1tYW55IGVkaXRvciBmaWVsZCB3aGVyZSBwcm9wZXJ0eSBzY2hlbWEgaXMgbWFudWFsbHkgcHJvdmlkZWQuXG4gICAgICoge0VkaXRvckRlc2NyaXB0b3JJbnQuYWRkRmllbGRNYW55VG9NYW55RWRpdG9yfSBpcyB1c2VkIHRvIGNyZWF0ZSBmaWVsZCBhbmQgJHtzZXRGaWVsZEJhc2ljT3B0aW9uc0Zyb21TY2hlbWF9IHRvIGFkZCBiYXNpYyBmaWVsZCdzIG9wdGlvbnMgZnJvbSBzY2hlbWEuXG4gICAgICpcbiAgICAgKiBAZXhwZXJpbWVudGFsXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1Byb3BlcnR5fSBwcm9wZXJ0eSAtIFRoZSBwcm9wZXJ0eSB0byBjcmVhdGUgdGhlIG1hbnkgZWRpdG9yIGZpZWxkIGZvci5cbiAgICAgKiBAcGFyYW0ge1RhYmxlRGVzY3JpcHRvckluc3Q8RmllbGRNb2RlbD59IG1haW5UYWJsZURlc2NyaXB0b3IgLSBNYWluIHRhYmxlIGRlc2NyaXB0b3IuXG4gICAgICogQHBhcmFtIHtUYWJsZURlc2NyaXB0b3JJbnN0PEZpZWxkTW9kZWw+fSBsb29rdXBUYWJsZURlc2NyaXB0b3IgLSBMb29rdXAgdGFibGUgZGVzY3JpcHRvci5cbiAgICAgKiBAcGFyYW0ge0lUYWJsZURhdGFQcm92aWRlcjxGaWVsZE1vZGVsLCBTZXJ2aWNlVHlwZT59IGxvb2t1cERhdGFQcm92aWRlciAtIExvb2t1cCBkYXRhIHByb3ZpZGVyLlxuICAgICAqIEBwYXJhbSB7U2NoZW1hUHJvcGVydHl9IHNjaGVtYVByb3BlcnR5IC0gTWFudWFsbHkgcHJvdmlkZWQgc2NoZW1hIHByb3BlcnR5LlxuICAgICAqXG4gICAgICogQHJldHVybiBUaGUgY3JlYXRlZCBtYW55LXRvLW1hbnkgZWRpdG9yIGZpZWxkLlxuICAgICAqL1xuICAgIGFkZE1hbnlUb01hbnlFZGl0b3JGcm9tU2NoZW1hPFByb3BlcnR5IGV4dGVuZHMga2V5b2YgTW9kZWwsIFNlcnZpY2VUeXBlLCBGaWVsZE1vZGVsID0gQXJyYXlJdGVtVHlwZTxNb2RlbFtQcm9wZXJ0eV0+LCBGaWVsZFZhbHVlID0gTW9kZWxbUHJvcGVydHldPihcbiAgICAgICAgcHJvcGVydHk6IFByb3BlcnR5LFxuICAgICAgICBtYWluVGFibGVEZXNjcmlwdG9yOiBUYWJsZURlc2NyaXB0b3JJbnN0PEZpZWxkTW9kZWw+LFxuICAgICAgICBsb29rdXBUYWJsZURlc2NyaXB0b3I6IFRhYmxlRGVzY3JpcHRvckluc3Q8RmllbGRNb2RlbD4sXG4gICAgICAgIGxvb2t1cERhdGFQcm92aWRlcjogSVRhYmxlRGF0YVByb3ZpZGVyPEZpZWxkTW9kZWwsIFNlcnZpY2VUeXBlPixcbiAgICAgICAgc2NoZW1hUHJvcGVydHk6IFNjaGVtYVByb3BlcnR5XG4gICAgKTogRmllbGRNYW55VG9NYW55RWRpdG9yRGVzY3JpcHRvcjxGaWVsZE1vZGVsLCBNb2RlbCwgU2VydmljZVR5cGUsIEZpZWxkVmFsdWUsIFBhcmVudD4ge1xuICAgICAgICBjb25zdCBmaWVsZCA9IHRoaXMuZGVzY3JpcHRvci5hZGRGaWVsZE1hbnlUb01hbnlFZGl0b3I8UHJvcGVydHksIFNlcnZpY2VUeXBlLCBGaWVsZE1vZGVsLCBGaWVsZFZhbHVlPihcbiAgICAgICAgICAgIHByb3BlcnR5LFxuICAgICAgICAgICAgbWFpblRhYmxlRGVzY3JpcHRvcixcbiAgICAgICAgICAgIGxvb2t1cFRhYmxlRGVzY3JpcHRvcixcbiAgICAgICAgICAgIGxvb2t1cERhdGFQcm92aWRlclxuICAgICAgICApO1xuICAgICAgICBzZXRGaWVsZEJhc2ljT3B0aW9uc0Zyb21TY2hlbWEoZmllbGQsIHNjaGVtYVByb3BlcnR5KTtcbiAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgIH1cbn1cblxuLyoqXG4gKiA8ZW0+RXhwZXJpbWVudGFsOjwvZW0+IENyZWF0ZXMgYnVpbGRlciBmb3IgYWRkaW5nIGZpZWxkcyB0byBkZXNjcmlwdG9yIGJhc2VkIG9uIHByb3ZpZGVkIG1vZGVsIHNjaGVtYS5cbiAqXG4gKiBAZXhwZXJpbWVudGFsXG4gKlxuICogQHBhcmFtIHtUYWJsZXZpZXdEZXNjcmlwdG9ySW5zdDxNb2RlbCwgYW55LCBhbnksIFBhcmVudD4gfCBFZGl0b3JEZXNjcmlwdG9ySW5zdDxNb2RlbCwgUGFyZW50Pn0gZGVzY3JpcHRvciAtIERlc2NyaXB0b3IgdG8gYWRkIGZpZWxkcyB0by5cbiAqIEBwYXJhbSB7U2NoZW1hTW9kZWw8U2NoTW9kZWw+fSBzY2hlbWEgLSBUaGUgc2NoZW1hIHdpdGggbWV0YWRhdGEgYWJvdXQgcHJvcGVydGllcyBmb3IgZmllbGRzLlxuICogQHBhcmFtIHtGaWVsZHNGcm9tU2NoZW1hT3B0c1R5cGU8U2NoTW9kZWw+fSBbb3B0c10gLSBBZGRpdGlvbmFsIG9wdGlvbnMuXG4gKlxuICogQHJldHVybiB7U2NoZW1hRmllbGRzQnVpbGRlcjxNb2RlbCwgUGFyZW50LCBTY2hNb2RlbD59IC0gVGhlIFNjaGVtYUZpZWxkc0J1aWxkZXIgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGV4dHJhY3RlZCBmaWVsZHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaWVsZHNGcm9tU2NoZW1hPE1vZGVsLCBQYXJlbnQgPSB1bmtub3duLCBTY2hNb2RlbCA9IE1vZGVsPihcbiAgICBkZXNjcmlwdG9yOiBUYWJsZXZpZXdEZXNjcmlwdG9ySW5zdDxNb2RlbCwgYW55LCBhbnksIFBhcmVudD4gfCBFZGl0b3JEZXNjcmlwdG9ySW5zdDxNb2RlbCwgUGFyZW50PixcbiAgICBzY2hlbWE6IFNjaGVtYU1vZGVsPFNjaE1vZGVsPixcbiAgICBvcHRzPzogRmllbGRzRnJvbVNjaGVtYU9wdHNUeXBlPFNjaE1vZGVsPlxuKTogU2NoZW1hRmllbGRzQnVpbGRlcjxNb2RlbCwgUGFyZW50LCBTY2hNb2RlbD4ge1xuICAgIHJldHVybiBuZXcgU2NoZW1hRmllbGRzQnVpbGRlcjxNb2RlbCwgUGFyZW50LCBTY2hNb2RlbD4oZGVzY3JpcHRvciwgc2NoZW1hLCBvcHRzKTtcbn1cblxuLyoqXG4gKiA8ZW0+RXhwZXJpbWVudGFsOjwvZW0+IEFkZHMgYSBmaWVsZCBpbnB1dCB0byBlZGl0b3IgZGVzY3JpcHRvciBiYXNlZCBvbiB0aGUgZ2l2ZW4gc2NoZW1hIHByb3BlcnR5IGFuZCBvcHRpb25zLlxuICpcbiAqIEBleHBlcmltZW50YWxcbiAqXG4gKiBAcGFyYW0ge1RhYmxldmlld0Rlc2NyaXB0b3JJbnN0IHwgRWRpdG9yRGVzY3JpcHRvckluc3R9IGRlc2NyaXB0b3IgLSBEZXNjcmlwdG9yIHRvIGFkZCBmaWVsZCB0by5cbiAqIEBwYXJhbSB7a2V5b2YgTW9kZWx9IHByb3BlcnR5IC0gVGhlIHByb3BlcnR5IG9mIHRoZSBtb2RlbC5cbiAqIEBwYXJhbSB7U2NoZW1hUHJvcGVydHl9IHByb3BlcnR5U2NoZW1hIC0gVGhlIHByb3BlcnR5J3Mgc2NoZW1hIGZvciB0aGUgZmllbGQuXG4gKiBAcGFyYW0ge0ZpZWxkSW5wdXRGcm9tU2NoZW1hT3B0c1R5cGU8TW9kZWw+fSBbb3B0c10gLSBBZGRpdGlvbmFsIG9wdGlvbnMuXG4gKlxuICogQHJldHVybiB7RmllbGRJbnB1dERlc2NyaXB0b3I8TW9kZWwsIE5vbk51bGxhYmxlPE1vZGVsW1Byb3BlcnR5XT4sIE1vZGVsW1Byb3BlcnR5XSwgUGFyZW50Pn0gLSBUaGUgZ2VuZXJhdGVkIGZpZWxkIGlucHV0IGRlc2NyaXB0b3IuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGRGaWVsZElucHV0RnJvbVNjaGVtYTxQcm9wZXJ0eSBleHRlbmRzIGtleW9mIE1vZGVsLCBNb2RlbCwgUGFyZW50ID0gdW5rbm93bj4oXG4gICAgZGVzY3JpcHRvcjogVGFibGV2aWV3RGVzY3JpcHRvckluc3Q8TW9kZWwsIGFueSwgYW55LCBQYXJlbnQ+IHwgRWRpdG9yRGVzY3JpcHRvckluc3Q8TW9kZWwsIFBhcmVudD4sXG4gICAgcHJvcGVydHk6IFByb3BlcnR5LFxuICAgIHByb3BlcnR5U2NoZW1hOiBTY2hlbWFQcm9wZXJ0eSxcbiAgICBvcHRzPzogRmllbGRJbnB1dEZyb21TY2hlbWFPcHRzVHlwZTxNb2RlbD5cbik6IEZpZWxkSW5wdXREZXNjcmlwdG9yPE1vZGVsLCBOb25OdWxsYWJsZTxNb2RlbFtQcm9wZXJ0eV0+LCBNb2RlbFtQcm9wZXJ0eV0sIFBhcmVudD4ge1xuICAgIGNvbnN0IHByb3BlcnR5VHlwZSA9IG9wdHM/LmZpZWxkVHlwZSA/PyBwcm9wZXJ0eVNjaGVtYS50eXBlO1xuXG4gICAgY29uc3QgZmllbGQgPSBuZXcgRmllbGRJbnB1dERlc2NyaXB0b3I8TW9kZWwsIE5vbk51bGxhYmxlPE1vZGVsW1Byb3BlcnR5XT4sIE1vZGVsW1Byb3BlcnR5XSwgUGFyZW50Pihwcm9wZXJ0eSBhcyBzdHJpbmcpO1xuICAgIGlmIChkZXNjcmlwdG9yIGluc3RhbmNlb2YgVGFibGV2aWV3RGVzY3JpcHRvckluc3QpIHtcbiAgICAgICAgZGVzY3JpcHRvci5kZXRhaWxzRWRpdG9yLmFkZEZpZWxkRGVzY3JpcHRvcihmaWVsZCk7XG4gICAgICAgIGRlc2NyaXB0b3IuZWRpdEVkaXRvci5hZGRGaWVsZERlc2NyaXB0b3IoZmllbGQpO1xuICAgICAgICBkZXNjcmlwdG9yLmFkZEVkaXRvci5hZGRGaWVsZERlc2NyaXB0b3IoZmllbGQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGRlc2NyaXB0b3IuYWRkRmllbGREZXNjcmlwdG9yKGZpZWxkKTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgZGlmZmVyZW50IHByb3BlcnR5IHR5cGVzXG4gICAgc3dpdGNoIChwcm9wZXJ0eVR5cGUgYXMgRmllbGRJbnB1dFR5cGUpIHtcbiAgICAgICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgICAgICAgIGZpZWxkLmFzTnVtYmVyKCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnY3VycmVuY3knOlxuICAgICAgICAgICAgZmllbGQuYXNDdXJyZW5jeSh7XG4gICAgICAgICAgICAgICAgY3VycmVuY3k6IG9wdHM/LmN1cnJlbmN5LFxuICAgICAgICAgICAgICAgIGN1cnJlbmN5RGlzcGxheTogb3B0cz8uY3VycmVuY3lEaXNwbGF5LFxuICAgICAgICAgICAgICAgIGN1cnJlbmN5UHJvcGVydHk6IG9wdHM/LmN1cnJlbmN5UHJvcGVydHlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgICAgICAgZmllbGQuYXNTd2l0Y2goKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICd0ZXh0JzpcbiAgICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgICAgICAgIGZpZWxkLmFzVGV4dCgpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3RleHRhcmVhJzpcbiAgICAgICAgICAgIGZpZWxkLmFzVGV4dGFyZWEoKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdkYXRlJzpcbiAgICAgICAgICAgIGZpZWxkLmFzRGF0ZVBpY2tlcih7Zm9ybWF0OiBvcHRzPy5kYXRlRm9ybWF0ID8gZnJvbUFuZ3VsYXJEYXRlRm9ybWF0VG9QcmltZShvcHRzLmRhdGVGb3JtYXQpIDogdW5kZWZpbmVkfSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnZGF0ZS10aW1lJzpcbiAgICAgICAgICAgIGZpZWxkLmFzRGF0ZVBpY2tlcih7c2hvd1RpbWU6IHRydWUsIGZvcm1hdDogb3B0cz8uZGF0ZVRpbWVGb3JtYXQgPyBmcm9tQW5ndWxhckRhdGVGb3JtYXRUb1ByaW1lKG9wdHMuZGF0ZVRpbWVGb3JtYXQpIDogdW5kZWZpbmVkfSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnZW51bSc6XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY2FzZS1kZWNsYXJhdGlvbnNcbiAgICAgICAgICAgIGNvbnN0IGVudW1Nb2RlbCA9IG9wdHM/LmVudW1TY2hlbWEgPyBlbnVtTW9kZWxGcm9tU2NoZW1hKG9wdHMuZW51bVNjaGVtYSkgOiBvcHRzPy5lbnVtTW9kZWw7XG4gICAgICAgICAgICBpZiAoZW51bU1vZGVsKSB7XG4gICAgICAgICAgICAgICAgZmllbGQuYXNSYWRpb0Zyb21FbnVtKGVudW1Nb2RlbCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZpZWxkLmFzVGV4dCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2hpZGRlbic6XG4gICAgICAgICAgICBmaWVsZC5hc0hpZGRlbigpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGRpZmZlcmVudCBwcm9wZXJ0eSB2YWxpZGF0aW9uc1xuICAgIGlmIChwcm9wZXJ0eVR5cGUgPT09ICdudW1iZXInIHx8IHByb3BlcnR5VHlwZSA9PT0gJ2N1cnJlbmN5Jykge1xuICAgICAgICBmaWVsZC53aXRoTnVtYmVyVmFsaWRhdGlvbih7XG4gICAgICAgICAgICBtaW46IHByb3BlcnR5U2NoZW1hLmV4Y2x1c2l2ZU1pbmltdW0gJiYgcHJvcGVydHlTY2hlbWEubWluaW11bSAhPSB1bmRlZmluZWQgPyBwcm9wZXJ0eVNjaGVtYS5taW5pbXVtICsgKHByb3BlcnR5U2NoZW1hLmlzSW50ZWdlciA/IDEgOiAwLjAwMDEpIDogcHJvcGVydHlTY2hlbWEubWluaW11bSxcbiAgICAgICAgICAgIG1heDogcHJvcGVydHlTY2hlbWEuZXhjbHVzaXZlTWF4aW11bSAmJiBwcm9wZXJ0eVNjaGVtYS5tYXhpbXVtICE9IHVuZGVmaW5lZCA/IHByb3BlcnR5U2NoZW1hLm1heGltdW0gLSAocHJvcGVydHlTY2hlbWEuaXNJbnRlZ2VyID8gMSA6IDAuMDAwMSkgOiBwcm9wZXJ0eVNjaGVtYS5tYXhpbXVtLFxuICAgICAgICAgICAgc3RlcDogb3B0cz8ubnVtYmVyU3RlcFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKG9wdHM/Lm51bWJlclVzZUdyb3VwaW5nKSB7XG4gICAgICAgICAgICBmaWVsZC53aXRoTnVtYmVyR3JvdXBpbmcoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0cz8ubnVtYmVyTWluRnJhY3Rpb25EaWdpdHMgIT0gbnVsbCB8fCBvcHRzPy5udW1iZXJNYXhGcmFjdGlvbkRpZ2l0cyAhPSBudWxsKSB7XG4gICAgICAgICAgICBmaWVsZC53aXRoTnVtYmVyRnJhY3Rpb25zKHtcbiAgICAgICAgICAgICAgICBtaW5GcmFjdGlvbkRpZ2l0czogb3B0cz8ubnVtYmVyTWluRnJhY3Rpb25EaWdpdHMsXG4gICAgICAgICAgICAgICAgbWF4RnJhY3Rpb25EaWdpdHM6IG9wdHM/Lm51bWJlck1heEZyYWN0aW9uRGlnaXRzXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmIChwcm9wZXJ0eVR5cGUgPT09ICdzdHJpbmcnIHx8IHByb3BlcnR5VHlwZSA9PT0gJ3RleHRhcmVhJyB8fCBwcm9wZXJ0eVR5cGUgPT09ICd0ZXh0Jykge1xuICAgICAgICBmaWVsZC53aXRoVGV4dFZhbGlkYXRpb24oe1xuICAgICAgICAgICAgbWluTGVuZ3RoOiBwcm9wZXJ0eVNjaGVtYS5taW5MZW5ndGgsXG4gICAgICAgICAgICBtYXhMZW5ndGg6IHByb3BlcnR5U2NoZW1hLm1heExlbmd0aCxcbiAgICAgICAgICAgIHBhdHRlcm46IHByb3BlcnR5U2NoZW1hLnBhdHRlcm4gPyBuZXcgUmVnRXhwKHByb3BlcnR5U2NoZW1hLnBhdHRlcm4uc2xpY2UoMSwgLTEpKSA6IHVuZGVmaW5lZFxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAocHJvcGVydHlUeXBlID09PSAndGV4dGFyZWEnICYmIG9wdHM/LnRleHRhcmVhUm93cyAhPSBudWxsKSB7XG4gICAgICAgICAgICBmaWVsZC53aXRoVGV4dGFyZWFSb3dzKG9wdHMudGV4dGFyZWFSb3dzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvcGVydHlUeXBlICE9PSAndGV4dGFyZWEnICYmIHByb3BlcnR5U2NoZW1hLmlzRW1haWwpIHtcbiAgICAgICAgICAgIGZpZWxkLndpdGhUZXh0VmFsaWRhdGlvbkVtYWlsKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRGaWVsZEJhc2ljT3B0aW9uc0Zyb21TY2hlbWEoZmllbGQsIHByb3BlcnR5U2NoZW1hKTtcblxuICAgIHJldHVybiBmaWVsZDtcbn1cblxuLyoqXG4gKiA8ZW0+RXhwZXJpbWVudGFsOjwvZW0+IEFkZHMgYSBmaWVsZCBlbnVtIGxvb2t1cCB0byBlZGl0b3IgZGVzY3JpcHRvciBiYXNlZCBvbiB0aGUgZ2l2ZW4gc2NoZW1hIHByb3BlcnR5IGFuZCBvcHRpb25zLlxuICpcbiAqIEBleHBlcmltZW50YWxcbiAqXG4gKiBAcGFyYW0ge1RhYmxldmlld0Rlc2NyaXB0b3JJbnN0PE1vZGVsLCBhbnksIGFueSwgUGFyZW50PiB8IEVkaXRvckRlc2NyaXB0b3JJbnN0PE1vZGVsLCBQYXJlbnQ+fSBkZXNjcmlwdG9yIC0gRGVzY3JpcHRvciB0byBhZGQgZmllbGQgdG8uXG4gKiBAcGFyYW0ge2tleW9mIE1vZGVsfSBwcm9wZXJ0eSAtIFRoZSBwcm9wZXJ0eSBvZiB0aGUgbW9kZWwuXG4gKiBAcGFyYW0ge1NjaGVtYUVudW08RW51bT4gfCBFbnVtRGVzY3JpcHRvcjxFbnVtPn0gZW51bU9wdCAtIFRoZSBlbnVtIHNjaGVtYSBvciBlbnVtIG1vZGVsIGRlc2NyaXB0b3IuXG4gKiBAcGFyYW0ge1NjaGVtYVByb3BlcnR5fSBwcm9wZXJ0eVNjaGVtYSAtIFRoZSBwcm9wZXJ0eSdzIHNjaGVtYSBmb3IgdGhlIGZpZWxkLlxuICpcbiAqIEByZXR1cm5zIHtGaWVsZExvb2t1cEVudW08RW51bT59IC0gVGhlIGZpZWxkIHdpdGggZW51bWVyYXRpb24gdmFsdWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkRmllbGRFbnVtTG9va3VwRnJvbVNjaGVtYTxNb2RlbCwgUGFyZW50ID0gdW5rbm93biwgRW51bSA9IGFueT4oXG4gICAgZGVzY3JpcHRvcjogVGFibGV2aWV3RGVzY3JpcHRvckluc3Q8TW9kZWwsIGFueSwgYW55LCBQYXJlbnQ+IHwgRWRpdG9yRGVzY3JpcHRvckluc3Q8TW9kZWwsIFBhcmVudD4sXG4gICAgcHJvcGVydHk6IGtleW9mIE1vZGVsLFxuICAgIGVudW1PcHQ6IFNjaGVtYUVudW08RW51bT4gfCBFbnVtRGVzY3JpcHRvcjxFbnVtPixcbiAgICBwcm9wZXJ0eVNjaGVtYTogU2NoZW1hUHJvcGVydHlcbikge1xuICAgIGNvbnN0IGVudW1EZXNjcmlwdG9yID0gZW51bU9wdCBpbnN0YW5jZW9mIEVudW1EZXNjcmlwdG9yID8gZW51bU9wdCA6IGVudW1Nb2RlbEZyb21TY2hlbWEoZW51bU9wdCk7XG4gICAgY29uc3QgZmllbGQgPSBkZXNjcmlwdG9yLmFkZEZpZWxkTG9va3VwRW51bVVuc2FmZTxFbnVtPihwcm9wZXJ0eSBhcyBzdHJpbmcsIGVudW1EZXNjcmlwdG9yKTtcbiAgICBzZXRGaWVsZEJhc2ljT3B0aW9uc0Zyb21TY2hlbWEoZmllbGQsIHByb3BlcnR5U2NoZW1hKTtcbiAgICByZXR1cm4gZmllbGQ7XG59XG5cbi8qKlxuICogPGVtPkV4cGVyaW1lbnRhbDo8L2VtPiBTZXRzIGJhc2ljIG9wdGlvbnMgZm9yIGEgZmllbGQgYmFzZWQgb24gYSBnaXZlbiBwcm9wZXJ0eSBzY2hlbWEuXG4gKlxuICogQHBhcmFtIHtBRmllbGREZXNjcmlwdG9yPEZpZWxkTW9kZWwsIEVkaXRvck1vZGVsLCBGaWVsZFZhbHVlLCBQYXJlbnRFZGl0b3JNb2RlbD59IGZpZWxkIC0gVGhlIGZpZWxkIHRvIHNldCBvcHRpb25zIGZvci5cbiAqIEBwYXJhbSB7U2NoZW1hUHJvcGVydHl9IHByb3BlcnR5U2NoZW1hIC0gVGhlIHByb3BlcnR5IHNjaGVtYSB0byBiYXNlIHRoZSBvcHRpb25zIG9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0RmllbGRCYXNpY09wdGlvbnNGcm9tU2NoZW1hPEZpZWxkTW9kZWwgPSBhbnksIEVkaXRvck1vZGVsID0gYW55LCBGaWVsZFZhbHVlID0gRmllbGRNb2RlbCwgUGFyZW50RWRpdG9yTW9kZWwgPSB1bmRlZmluZWQ+KFxuICAgIGZpZWxkOiBBRmllbGREZXNjcmlwdG9yPEZpZWxkTW9kZWwsIEVkaXRvck1vZGVsLCBGaWVsZFZhbHVlLCBQYXJlbnRFZGl0b3JNb2RlbD4sXG4gICAgcHJvcGVydHlTY2hlbWE6IFNjaGVtYVByb3BlcnR5XG4pOiB2b2lkIHtcbiAgICBpZiAocHJvcGVydHlTY2hlbWEucmVxdWlyZWQpIGZpZWxkLndpdGhSZXF1aXJlZCgpO1xuICAgIGlmIChwcm9wZXJ0eVNjaGVtYS5pc1JlYWRPbmx5KSBmaWVsZC53aXRoRGlzYWJsZWQoKTtcbn1cbiJdfQ==
377
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmllbGRzLWZyb20tc2NoZW1hLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGFibGV2aWV3L3NyYy9zY2hlbWEvZmllbGRzLWZyb20tc2NoZW1hLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBZ0Isb0JBQW9CLEVBQUUsNEJBQTRCLEVBQUMsTUFBTSw2QkFBNkIsQ0FBQztBQUM5RyxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sOEJBQThCLENBQUM7QUFFNUQsT0FBTyxFQUdILG9CQUFvQixFQU1wQix1QkFBdUIsRUFDMUIsTUFBTSxzQ0FBc0MsQ0FBQztBQUU5QyxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUN2RCxPQUFPLEVBQUMsa0NBQWtDLEVBQUMsTUFBTSwrQkFBK0IsQ0FBQztBQTZCakY7Ozs7R0FJRztBQUNILE1BQU0sT0FBTyxtQkFBbUI7SUFRNUIsWUFDcUIsVUFBK0ksRUFDL0ksTUFBNkIsRUFDdEMsSUFBeUM7UUFGaEMsZUFBVSxHQUFWLFVBQVUsQ0FBcUk7UUFDL0ksV0FBTSxHQUFOLE1BQU0sQ0FBdUI7UUFDdEMsU0FBSSxHQUFKLElBQUksQ0FBcUM7SUFDbEQsQ0FBQztJQUVJLG9CQUFvQixDQUFDLFFBQWEsRUFBRSxJQUErQjtRQUN2RSxPQUFxQztZQUNqQyxHQUFHLElBQUksQ0FBQyxJQUFJO1lBQ1osU0FBUyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxDQUFDLFFBQXdCLENBQUM7WUFDNUYsU0FBUyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxDQUFDLFFBQXdCLENBQUM7WUFDNUYsVUFBVSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFB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LGNBQThCO0lBRTlCLE1BQU0sY0FBYyxHQUFHLE9BQU8sWUFBWSxjQUFjLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbEcsTUFBTSxLQUFLLEdBQUcsVUFBVSxDQUFDLHdCQUF3QixDQUFPLFFBQWtCLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFDNUYsOEJBQThCLENBQUMsS0FBSyxFQUFFLGNBQWMsQ0FBQyxDQUFDO0lBQ3RELE9BQU8sS0FBSyxDQUFDO0FBQ2pCLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSw4QkFBOEIsQ0FDMUMsS0FBK0UsRUFDL0UsY0FBOEI7SUFFOUIsSUFBSSxjQUFjLENBQUMsUUFBUTtRQUFFLEtBQUssQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUNsRCxJQUFJLGNBQWMsQ0FBQyxVQUFVO1FBQUUsS0FBSyxDQUFDLFlBQVksRUFBRSxDQUFDO0FBQ3hELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1NjaGVtYUVudW0sIFNjaGVtYU1vZGVsLCBTY2hlbWFQcm9wZXJ0eX0gZnJvbSAnQG1lZGl1c2luYy9tbmctY29tbW9ucy1kYXRhLWFwaSc7XG5pbXBvcnQge0FycmF5SXRlbVR5cGUsIENvbW1vbnNJbnRlcm5hbEVycm9yLCBmcm9tQW5ndWxhckRhdGVGb3JtYXRUb1ByaW1lfSBmcm9tICdAbWVkaXVzaW5jL21uZy1jb21tb25zL2NvcmUnO1xuaW1wb3J0IHtFbnVtRGVzY3JpcHRvcn0gZnJvbSAnQG1lZGl1c2luYy9tbmctY29tbW9ucy9tb2RlbCc7XG5pbXBvcnQge0lUYWJsZURhdGFQcm92aWRlciwgVGFibGVEZXNjcmlwdG9ySW5zdH0gZnJvbSAnQG1lZGl1c2luYy9tbmctY29tbW9ucy90YWJsZS9hcGknO1xuaW1wb3J0IHtcbiAgICBBRmllbGREZXNjcmlwdG9yLFxuICAgIEVkaXRvckRlc2NyaXB0b3JJbnN0LFxuICAgIEZpZWxkSW5wdXREZXNjcmlwdG9yLFxuICAgIEZpZWxkTG9va3VwRW51bURlc2NyaXB0b3IsXG4gICAgRmllbGRMb29rdXBQcm92aWRlclR5cGUsXG4gICAgRmllbGRNYW55RWRpdG9yRGVzY3JpcHRvcixcbiAgICBGaWVsZE1hbnlUb01hbnlFZGl0b3JEZXNjcmlwdG9yLFxuICAgIFRhYmxldmlld0Rlc2NyaXB0b3JGaWVsZHNNYW5hZ2VNdWx0aVR5cGUsXG4gICAgVGFibGV2aWV3RGVzY3JpcHRvckluc3Rcbn0gZnJvbSAnQG1lZGl1c2luYy9tbmctY29tbW9ucy90YWJsZXZpZXcvYXBpJztcblxuaW1wb3J0IHtlbnVtTW9kZWxGcm9tU2NoZW1hfSBmcm9tICcuL2VudW0tZnJvbS1zY2hlbWEnO1xuaW1wb3J0IHtmcm9tU2NoZW1hRmlsdGVyTm9uQXJyYXlQcm9wZXJ0aWVzfSBmcm9tICcuL2ludGVybmFsL2NvbW1vbi1mcm9tLXNjaGVtYSc7XG5cbnR5cGUgRmllbGRJbnB1dFR5cGUgPSAnbnVtYmVyJyB8ICdjdXJyZW5jeScgfCAnYm9vbGVhbicgfCAnc3RyaW5nJyB8ICd0ZXh0JyB8ICd0ZXh0YXJlYScgfCAnZGF0ZScgfCAnZGF0ZS10aW1lJyB8ICdlbnVtJyB8ICdoaWRkZW4nO1xuXG50eXBlIEZyb21TY2hlbWFDb21tb25PcHRzVHlwZTxNb2RlbD4gPSB7XG4gICAgZGF0ZUZvcm1hdD86IHN0cmluZztcbiAgICBkYXRlVGltZUZvcm1hdD86IHN0cmluZztcbiAgICB0ZXh0YXJlYVJvd3M/OiBudW1iZXI7XG4gICAgbnVtYmVyVXNlR3JvdXBpbmc/OiBib29sZWFuO1xuICAgIG51bWJlclN0ZXA/OiBudW1iZXI7XG4gICAgbnVtYmVyTWluRnJhY3Rpb25EaWdpdHM/OiBudW1iZXI7XG4gICAgbnVtYmVyTWF4RnJhY3Rpb25EaWdpdHM/OiBudW1iZXI7XG4gICAgY3VycmVuY3k/OiBzdHJpbmc7XG4gICAgY3VycmVuY3lQcm9wZXJ0eT86IGtleW9mIE1vZGVsO1xuICAgIGN1cnJlbmN5RGlzcGxheT86ICdzeW1ib2wnIHwgJ2NvZGUnIHwgJ25hbWUnO1xufTtcblxudHlwZSBGaWVsZHNGcm9tU2NoZW1hT3B0c1R5cGU8TW9kZWwgPSBhbnk+ID0gRnJvbVNjaGVtYUNvbW1vbk9wdHNUeXBlPE1vZGVsPiAmIHtcbiAgICBmaWVsZFR5cGVzPzogUGFydGlhbDxSZWNvcmQ8a2V5b2YgTW9kZWwsIEZpZWxkSW5wdXRUeXBlPj47XG4gICAgZW51bU1vZGVscz86IFBhcnRpYWw8UmVjb3JkPGtleW9mIE1vZGVsLCBFbnVtRGVzY3JpcHRvcjxhbnk+Pj47XG4gICAgZW51bVNjaGVtYXM/OiBQYXJ0aWFsPFJlY29yZDxrZXlvZiBNb2RlbCwgU2NoZW1hRW51bTxhbnk+Pj47XG59O1xuXG50eXBlIEZpZWxkSW5wdXRGcm9tU2NoZW1hT3B0c1R5cGU8TW9kZWwgPSBhbnksIEVudW0gPSBhbnk+ID0gRnJvbVNjaGVtYUNvbW1vbk9wdHNUeXBlPE1vZGVsPiAmIHtcbiAgICBmaWVsZFR5cGU/OiBGaWVsZElucHV0VHlwZTtcbiAgICBlbnVtU2NoZW1hPzogU2NoZW1hRW51bTxFbnVtPjtcbiAgICBlbnVtTW9kZWw/OiBFbnVtRGVzY3JpcHRvcjxFbnVtPjtcbn07XG5cbi8qKlxuICogPGVtPkV4cGVyaW1lbnRhbDo8L2VtPiBCdWlsZGVyIGZvciBhZGRpbmcgZmllbGRzIHRvIGVkaXRvci5cbiAqXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmV4cG9ydCBjbGFzcyBTY2hlbWFGaWVsZHNCdWlsZGVyPFxuICAgIE1vZGVsLFxuICAgIFBhcmVudCA9IHVua25vd24sXG4gICAgQWRkTW9kZWwgPSBNb2RlbCxcbiAgICBFZGl0TW9kZWwgPSBNb2RlbCxcbiAgICBGaWVsZHNNb2RlbCA9IFRhYmxldmlld0Rlc2NyaXB0b3JGaWVsZHNNYW5hZ2VNdWx0aVR5cGU8TW9kZWwsIEFkZE1vZGVsLCBFZGl0TW9kZWw+LFxuICAgIFNjaE1vZGVsID0gTW9kZWxcbj4ge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGRlc2NyaXB0b3I6IFRhYmxldmlld0Rlc2NyaXB0b3JJbnN0PE1vZGVsLCBhbnksIGFueSwgUGFyZW50LCBhbnksIEFkZE1vZGVsLCBFZGl0TW9kZWwsIEZpZWxkc01vZGVsPiB8IEVkaXRvckRlc2NyaXB0b3JJbnN0PEZpZWxkc01vZGVsLCBQYXJlbnQ+LFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHNjaGVtYTogU2NoZW1hTW9kZWw8U2NoTW9kZWw+LFxuICAgICAgICBwcml2YXRlIG9wdHM/OiBGaWVsZHNGcm9tU2NoZW1hT3B0c1R5cGU8U2NoTW9kZWw+XG4gICAgKSB7fVxuXG4gICAgcHJpdmF0ZSBtZXJnZUZpZWxkc0lucHV0T3B0cyhwcm9wZXJ0eTogYW55LCBvcHRzPzogRmllbGRzRnJvbVNjaGVtYU9wdHNUeXBlKSB7XG4gICAgICAgIHJldHVybiA8RmllbGRJbnB1dEZyb21TY2hlbWFPcHRzVHlwZT57XG4gICAgICAgICAgICAuLi50aGlzLm9wdHMsXG4gICAgICAgICAgICBmaWVsZFR5cGU6IG9wdHM/LmZpZWxkVHlwZXM/Lltwcm9wZXJ0eV0gPz8gdGhpcy5vcHRzPy5maWVsZFR5cGVzPy5bcHJvcGVydHkgYXMga2V5b2Ygb2JqZWN0XSxcbiAgICAgICAgICAgIGVudW1Nb2RlbDogb3B0cz8uZW51bU1vZGVscz8uW3Byb3BlcnR5XSA/PyB0aGlzLm9wdHM/LmVudW1Nb2RlbHM/Lltwcm9wZXJ0eSBhcyBrZXlvZiBvYmplY3RdLFxuICAgICAgICAgICAgZW51bVNjaGVtYTogb3B0cz8uZW51bVNjaGVtYXM/Lltwcm9wZXJ0eV0gPz8gdGhpcy5vcHRzPy5lbnVtU2NoZW1hcz8uW3Byb3BlcnR5IGFzIGtleW9mIG9iamVjdF0sXG4gICAgICAgICAgICAuLi5vcHRzXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBtZXJnZUZpZWxkSW5wdXRPcHRzKHByb3BlcnR5OiBhbnksIG9wdHM/OiBGaWVsZElucHV0RnJvbVNjaGVtYU9wdHNUeXBlKSB7XG4gICAgICAgIHJldHVybiA8RmllbGRJbnB1dEZyb21TY2hlbWFPcHRzVHlwZTxGaWVsZHNNb2RlbD4+e1xuICAgICAgICAgICAgLi4udGhpcy5vcHRzLFxuICAgICAgICAgICAgZmllbGRUeXBlOiB0aGlzLm9wdHM/LmZpZWxkVHlwZXM/Lltwcm9wZXJ0eSBhcyBrZXlvZiBvYmplY3RdLFxuICAgICAgICAgICAgZW51bU1vZGVsOiB0aGlzLm9wdHM/LmVudW1Nb2RlbHM/Lltwcm9wZXJ0eSBhcyBrZXlvZiBvYmplY3RdLFxuICAgICAgICAgICAgZW51bVNjaGVtYTogdGhpcy5vcHRzPy5lbnVtU2NoZW1hcz8uW3Byb3BlcnR5IGFzIGtleW9mIG9iamVjdF0sXG4gICAgICAgICAgICAuLi5vcHRzXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogPGVtPkV4cGVyaW1lbnRhbDo8L2VtPiBBZGRzIGEgc2luZ2xlIGlucHV0IGZpZWxkIHZpYSB7YWRkRmllbGRJbnB1dEZyb21TY2hlbWF9LlxuICAgICAqXG4gICAgICogQGV4cGVyaW1lbnRhbFxuICAgICAqXG4gICAgICogQHBhcmFtIHtQcm9wZXJ0eX0gcHJvcGVydHkgLSBUaGUgcHJvcGVydHkgdG8gYWRkIHRoZSBmaWVsZCBmb3IuXG4gICAgICogQHBhcmFtIHtGaWVsZElucHV0RnJvbVNjaGVtYU9wdHNUeXBlPFNjaE1vZGVsPn0gb3B0cyAtIEFkZGl0aW9uYWwgb3B0aW9ucy5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge0ZpZWxkSW5wdXREZXNjcmlwdG9yPE1vZGVsLCBOb25OdWxsYWJsZTxNb2RlbFtQcm9wZXJ0eV0+LCBNb2RlbFtQcm9wZXJ0eV0sIFBhcmVudD59IFRoZSBhZGRlZCBmaWVsZCBkZXNjcmlwdG9yLlxuICAgICAqL1xuICAgIHB1YmxpYyBhZGQ8UHJvcGVydHkgZXh0ZW5kcyBFeHRyYWN0PGtleW9mIEZpZWxkc01vZGVsLCBrZXlvZiBTY2hNb2RlbD4+KFxuICAgICAgICBwcm9wZXJ0eTogUHJvcGVydHksXG4gICAgICAgIG9wdHM/OiBGaWVsZElucHV0RnJvbVNjaGVtYU9wdHNUeXBlPFNjaE1vZGVsPlxuICAgICk6IEZpZWxkSW5wdXREZXNjcmlwdG9yPEZpZWxkc01vZGVsLCBOb25OdWxsYWJsZTxGaWVsZHNNb2RlbFtQcm9wZXJ0eV0+LCBGaWVsZHNNb2RlbFtQcm9wZXJ0eV0sIFBhcmVudD4ge1xuICAgICAgICByZXR1cm4gYWRkRmllbGRJbnB1dEZyb21TY2hlbWE8UHJvcGVydHksIE1vZGVsLCBQYXJlbnQsIEFkZE1vZGVsLCBFZGl0TW9kZWwsIEZpZWxkc01vZGVsPihcbiAgICAgICAgICAgIHRoaXMuZGVzY3JpcHRvcixcbiAgICAgICAgICAgIHByb3BlcnR5LFxuICAgICAgICAgICAgdGhpcy5zY2hlbWEucHJvcGVydGllc1twcm9wZXJ0eV0sXG4gICAgICAgICAgICB0aGlzLm1lcmdlRmllbGRJbnB1dE9wdHMocHJvcGVydHksIG9wdHMpIGFzIEZpZWxkSW5wdXRGcm9tU2NoZW1hT3B0c1R5cGU8RmllbGRzTW9kZWwsIGFueT4gfCB1bmRlZmluZWRcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiA8ZW0+RXhwZXJpbWVudGFsOjwvZW0+IEFkZHMgYWxsIGlucHV0IGZpZWxkcyBmb3IgdGhlIG5vbi1hcnJheSBwcm9wZXJ0aWVzIHZpYSB7YWRkRmllbGRJbnB1dEZyb21TY2hlbWF9LlxuICAgICAqXG4gICAgICogQGV4cGVyaW1lbnRhbFxuICAgICAqXG4gICAgICogQHBhcmFtIHtGaWVsZHNGcm9tU2NoZW1hT3B0c1R5cGU8U2NoTW9kZWw+fSBvcHRzIC0gQWRkaXRpb25hbCBvcHRpb25zLlxuICAgICAqXG4gICAgICogQHJldHVybiB7dGhpc30gLSBUaGUgY3VycmVudCBpbnN0YW5jZSBvZiB0aGUgYnVpbGRlci5cbiAgICAgKi9cbiAgICBwdWJsaWMgd2l0aEFkZEFsbChvcHRzPzogRmllbGRzRnJvbVNjaGVtYU9wdHNUeXBlPFNjaE1vZGVsPik6IHRoaXMge1xuICAgICAgICB0aGlzLmFkZEZpZWxkcyh1bmRlZmluZWQsIG9wdHMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiA8ZW0+RXhwZXJpbWVudGFsOjwvZW0+IEFkZHMgaW5wdXQgZmllbGRzIGZvciBwcm9wZXJ0aWVzIHZpYSB7YWRkRmllbGRJbnB1dEZyb21TY2hlbWF9LlxuICAgICAqXG4gICAgICogQGV4cGVyaW1lbnRhbFxuICAgICAqXG4gICAgICogQHBhcmFtIHtGaWVsZHNGcm9tU2NoZW1hT3B0c1R5cGU8U2NoTW9kZWw+fSBvcHRzIC0gQWRkaXRpb25hbCBvcHRpb25zLlxuICAgICAqIEBwYXJhbSB7Li4uUHJvcGVydHlbXX0gcHJvcGVydGllcyAtIFByb3BlcnRpZXMgdG8gYWRkIGZpZWxkcyBmb3IuIElmIG5vbiBwcm92aWRlZCwgYWxsIG5vbi1hcnJheSBwcm9wZXJ0aWVzIGZyb20gc2NoZW1hIHdpbGwgYmUgYWRkZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSAtIFRoZSBjdXJyZW50IGluc3RhbmNlIG9mIHRoZSBidWlsZGVyLlxuICAgICAqL1xuICAgIHB1YmxpYyB3aXRoQWRkPFByb3BlcnR5S2V5IGV4dGVuZHMgRXh0cmFjdDxrZXlvZiBNb2RlbCwga2V5b2YgU2NoTW9kZWw+PihvcHRzOiBGaWVsZHNGcm9tU2NoZW1hT3B0c1R5cGU8U2NoTW9kZWw+LCAuLi5wcm9wZXJ0aWVzOiBQcm9wZXJ0eUtleVtdKTogdGhpcztcbiAgICAvKipcbiAgICAgKiA8ZW0+RXhwZXJpbWVudGFsOjwvZW0+IEFkZHMgZmllbGRzIGZvciBwcm9wZXJ0aWVzIHZpYSB7YWRkRmllbGRJbnB1dEZyb21TY2hlbWF9LlxuICAgICAqXG4gICAgICogQGV4cGVyaW1lbnRhbFxuICAgICAqXG4gICAgICogQHBhcmFtIHsuLi5Qcm9wZXJ0eVtdfSBwcm9wZXJ0aWVzIC0gUHJvcGVydGllcyB0byBhZGQgZmllbGRzIGZvci4gSWYgbm9uIHByb3ZpZGVkLCBhbGwgbm9uLWFycmF5IHByb3BlcnRpZXMgZnJvbSBzY2hlbWEgd2lsbCBiZSBhZGRlZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge3RoaXN9IC0gVGhlIGN1cnJlbnQgaW5zdGFuY2Ugb2YgdGhlIGJ1aWxkZXIuXG4gICAgICovXG4gICAgcHVibGljIHdpdGhBZGQ8UHJvcGVydHkgZXh0ZW5kcyBFeHRyYWN0PGtleW9mIEZpZWxkc01vZGVsLCBrZXlvZiBTY2hNb2RlbD4+KC4uLnByb3BlcnRpZXM6IFByb3BlcnR5W10pOiB0aGlzO1xuICAgIHB1YmxpYyB3aXRoQWRkPFByb3BlcnR5IGV4dGVuZHMgRXh0cmFjdDxrZXlvZiBGaWVsZHNNb2RlbCwga2V5b2YgU2NoTW9kZWw+Pihwcm9wT3JPcHRzOiBGaWVsZHNGcm9tU2NoZW1hT3B0c1R5cGU8U2NoTW9kZWw+IHwgUHJvcGVydHksIC4uLnByb3BlcnRpZXM6IFByb3BlcnR5W10pOiB0aGlzIHtcbiAgICAgICAgaWYgKHR5cGVvZiBwcm9wT3JPcHRzID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgdGhpcy5hZGRGaWVsZHMocHJvcGVydGllcy5sZW5ndGggPT09IDAgPyB1bmRlZmluZWQgOiBwcm9wZXJ0aWVzLCBwcm9wT3JPcHRzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYWRkRmllbGRzKHByb3BPck9wdHMgPT09IHVuZGVmaW5lZCA/IHByb3BlcnRpZXMgOiBbcHJvcE9yT3B0cywgLi4ucHJvcGVydGllc10pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHByaXZhdGUgYWRkRmllbGRzPFByb3BlcnR5IGV4dGVuZHMgRXh0cmFjdDxrZXlvZiBGaWVsZHNNb2RlbCwga2V5b2YgU2NoTW9kZWw+Pihwcm9wZXJ0aWVzPzogUHJvcGVydHlbXSwgb3B0cz86IEZpZWxkc0Zyb21TY2hlbWFPcHRzVHlwZTxTY2hNb2RlbD4pIHtcbiAgICAgICAgY29uc3QgYWRkUHJvcGVydGllcyA9IHByb3BlcnRpZXMgPz8gZnJvbVNjaGVtYUZpbHRlck5vbkFycmF5UHJvcGVydGllcyh0aGlzLnNjaGVtYS5wcm9wZXJ0aWVzKTtcblxuICAgICAgICBhZGRQcm9wZXJ0aWVzLmZvckVhY2gocHJvcGVydHkgPT4ge1xuICAgICAgICAgICAgYWRkRmllbGRJbnB1dEZyb21TY2hlbWE8a2V5b2YgRmllbGRzTW9kZWwsIE1vZGVsLCBQYXJlbnQsIEFkZE1vZGVsLCBFZGl0TW9kZWwsIEZpZWxkc01vZGVsPihcbiAgICAgICAgICAgICAgICB0aGlzLmRlc2NyaXB0b3IsXG4gICAgICAgICAgICAgICAgcHJvcGVydHkgYXMgdW5rbm93biBhcyBrZXlvZiBGaWVsZHNNb2RlbCxcbiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtYS5wcm9wZXJ0aWVzW3Byb3BlcnR5XSxcbiAgICAgICAgICAgICAgICB0aGlzLm1lcmdlRmllbGRzSW5wdXRPcHRzKHByb3BlcnR5LCBvcHRzKSBhcyBGaWVsZElucHV0RnJvbVNjaGVtYU9wdHNUeXBlPEZpZWxkc01vZGVsLCBhbnk+IHwgdW5kZWZpbmVkXG4gICAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiA8ZW0+RXhwZXJpbWVudGFsOjwvZW0+IEFkZHMgYSBzaW5nbGUgaW5wdXQgZmllbGQgdmlhIHthZGRGaWVsZElucHV0RnJvbVNjaGVtYX0gd2hlcmUgcHJvcGVydHkgc2NoZW1hIGlzIG1hbnVhbGx5IHByb3ZpZGVkLlxuICAgICAqXG4gICAgICogQGV4cGVyaW1lbnRhbFxuICAgICAqXG4gICAgICogQHBhcmFtIHtQcm9wZXJ0eX0gcHJvcGVydHkgLSBUaGUgcHJvcGVydHkgdG8gYWRkIHRoZSBmaWVsZCBmb3IuXG4gICAgICogQHBhcmFtIHtTY2hlbWFQcm9wZXJ0eX0gc2NoZW1hUHJvcGVydHkgLSBNYW51YWxseSBwcm92aWRlZCBzY2hlbWEgcHJvcGVydHkuXG4gICAgICogQHBhcmFtIHtGaWVsZElucHV0RnJvbVNjaGVtYU9wdHNUeXBlPE1vZGVsPn0gb3B0cyAtIEFkZGl0aW9uYWwgb3B0aW9ucy5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge0ZpZWxkSW5wdXREZXNjcmlwdG9yPE1vZGVsLCBOb25OdWxsYWJsZTxNb2RlbFtQcm9wZXJ0eV0+LCBNb2RlbFtQcm9wZXJ0eV0sIFBhcmVudD59IFRoZSBhZGRlZCBmaWVsZCBkZXNjcmlwdG9yLlxuICAgICAqL1xuICAgIHB1YmxpYyBhZGRGcm9tU2NoZW1hPFByb3BlcnR5IGV4dGVuZHMga2V5b2YgRmllbGRzTW9kZWw+KFxuICAgICAgICBwcm9wZXJ0eTogUHJvcGVydHksXG4gICAgICAgIHNjaGVtYVByb3BlcnR5OiBTY2hlbWFQcm9wZXJ0eSxcbiAgICAgICAgb3B0cz86IEZpZWxkSW5wdXRGcm9tU2NoZW1hT3B0c1R5cGU8RmllbGRzTW9kZWw+XG4gICAgKTogRmllbGRJbnB1dERlc2NyaXB0b3I8RmllbGRzTW9kZWwsIE5vbk51bGxhYmxlPEZpZWxkc01vZGVsW1Byb3BlcnR5XT4sIEZpZWxkc01vZGVsW1Byb3BlcnR5XSwgUGFyZW50PiB7XG4gICAgICAgIHJldHVybiBhZGRGaWVsZElucHV0RnJvbVNjaGVtYShcbiAgICAgICAgICAgIHRoaXMuZGVzY3JpcHRvcixcbiAgICAgICAgICAgIHByb3BlcnR5LFxuICAgICAgICAgICAgc2NoZW1hUHJvcGVydHksXG4gICAgICAgICAgICB0aGlzLm1lcmdlRmllbGRJbnB1dE9wdHMocHJvcGVydHksIG9wdHMpIGFzIEZpZWxkSW5wdXRGcm9tU2NoZW1hT3B0c1R5cGU8RmllbGRzTW9kZWwsIGFueT4gfCB1bmRlZmluZWRcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiA8ZW0+RXhwZXJpbWVudGFsOjwvZW0+IEFkZHMgYW4gZW51bSBsb29rdXAgZmllbGQgdmlhIHthZGRGaWVsZEVudW1Mb29rdXBGcm9tU2NoZW1hfS5cbiAgICAgKlxuICAgICAqIEBleHBlcmltZW50YWxcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UHJvcGVydHl9IHByb3BlcnR5IC0gVGhlIHByb3BlcnR5IHRvIGFkZCB0aGUgZW51bSBsb29rdXAgZmllbGQgZm9yLlxuICAgICAqIEBwYXJhbSB7U2NoZW1hRW51bTxFbnVtPiB8IEVudW1EZXNjcmlwdG9yPEVudW0+fSBbZW51bU9wdF0gLSBUaGUgZW51bSBzY2hlbWEgb3IgdGhlIGVudW0gbW9kZWwgZGVzY3JpcHRvci4gSWYgbm9uIHByb3ZpZGVkLCBidWlsZGVyIG9wdHMgd2lsbCBiZSBjaGVja2VkLlxuICAgICAqXG4gICAgICogQHJldHVybnMge0ZpZWxkTG9va3VwRW51bURlc2NyaXB0b3I8RW51bSwgTW9kZWwsIFBhcmVudD59IC0gVGhlIGFkZGVkIGZpZWxkIGRlc2NyaXB0b3IuXG4gICAgICpcbiAgICAgKiBAdGhyb3dzIHtDb21tb25zSW50ZXJuYWxFcnJvcn0gLSBJZiBubyBlbnVtIG1ldGFkYXRhIGlzIGZvdW5kIGZvciB0aGUgcHJvcGVydHkgZWl0aGVyIGZyb20gcGFyYW1ldGVyIG9yIGZyb20gYnVpbGRlcidzIG9wdHMuXG4gICAgICovXG4gICAgcHVibGljIGFkZEVudW08UHJvcGVydHkgZXh0ZW5kcyBFeHRyYWN0PGtleW9mIEZpZWxkc01vZGVsLCBrZXlvZiBTY2hNb2RlbD4sIEVudW0+KFxuICAgICAgICBwcm9wZXJ0eTogUHJvcGVydHksXG4gICAgICAgIGVudW1PcHQ/OiBTY2hlbWFFbnVtPEVudW0+IHwgRW51bURlc2NyaXB0b3I8RW51bT5cbiAgICApOiBGaWVsZExvb2t1cEVudW1EZXNjcmlwdG9yPEVudW0sIEZpZWxkc01vZGVsLCBQYXJlbnQ+IHtcbiAgICAgICAgaWYgKCFlbnVtT3B0KSB7XG4gICAgICAgICAgICBlbnVtT3B0ID0gdGhpcy5vcHRzPy5lbnVtTW9kZWxzPy5bcHJvcGVydHldID8/IHRoaXMub3B0cz8uZW51bVNjaGVtYXM/Lltwcm9wZXJ0eV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFlbnVtT3B0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQ29tbW9uc0ludGVybmFsRXJyb3IoYEVudW0gbG9va3VwIGZpZWxkIGZvciBwcm9wZXJ0eSAke3Byb3BlcnR5IGFzIHN0cmluZ30gY2Fubm90IGJlIGFkZGVkIGJlY2F1c2UgZW51bSBtZXRhZGF0YSB3YXMgbm90IHByb3ZpZGVkLmApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhZGRGaWVsZEVudW1Mb29rdXBGcm9tU2NoZW1hKHRoaXMuZGVzY3JpcHRvciwgcHJvcGVydHksIGVudW1PcHQsIHRoaXMuc2NoZW1hLnByb3BlcnRpZXNbcHJvcGVydHldKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiA8ZW0+RXhwZXJpbWVudGFsOjwvZW0+IEFkZHMgYW4gZW51bSBsb29rdXAgZmllbGQgdmlhIHthZGRGaWVsZEVudW1Mb29rdXBGcm9tU2NoZW1hfSB3aGVyZSBwcm9wZXJ0eSBzY2hlbWEgaXMgbWFudWFsbHkgcHJvdmlkZWQuXG4gICAgICpcbiAgICAgKiBAZXhwZXJpbWVudGFsXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1Byb3BlcnR5fSBwcm9wZXJ0eSAtIFRoZSBwcm9wZXJ0eSB0byBhZGQgdGhlIGVudW0gbG9va3VwIGZpZWxkIGZvci5cbiAgICAgKiBAcGFyYW0ge1NjaGVtYUVudW08RW51bT4gfCBFbnVtRGVzY3JpcHRvcjxFbnVtPn0gW2VudW1PcHRdIC0gVGhlIGVudW0gc2NoZW1hIG9yIHRoZSBlbnVtIG1vZGVsIGRlc2NyaXB0b3IuIElmIG5vbiBwcm92aWRlZCwgYnVpbGRlciBvcHRzIHdpbGwgYmUgY2hlY2tlZC5cbiAgICAgKiBAcGFyYW0ge1NjaGVtYVByb3BlcnR5fSBzY2hlbWFQcm9wZXJ0eSAtIE1hbnVhbGx5IHByb3ZpZGVkIHNjaGVtYSBwcm9wZXJ0eS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtGaWVsZExvb2t1cEVudW1EZXNjcmlwdG9yPEVudW0sIE1vZGVsLCBQYXJlbnQ+fSAtIFRoZSBhZGRlZCBmaWVsZCBkZXNjcmlwdG9yLlxuICAgICAqXG4gICAgICogQHRocm93cyB7Q29tbW9uc0ludGVybmFsRXJyb3J9IC0gSWYgbm8gZW51bSBtZXRhZGF0YSBpcyBmb3VuZCBmb3IgdGhlIHByb3BlcnR5IGVpdGhlciBmcm9tIHBhcmFtZXRlciBvciBmcm9tIGJ1aWxkZXIncyBvcHRzLlxuICAgICAqL1xuICAgIHB1YmxpYyBhZGRFbnVtRnJvbVNjaGVtYTxQcm9wZXJ0eSBleHRlbmRzIGtleW9mIEZpZWxkc01vZGVsLCBFbnVtPihcbiAgICAgICAgcHJvcGVydHk6IFByb3BlcnR5LFxuICAgICAgICBlbnVtT3B0OiBTY2hlbWFFbnVtPEVudW0+IHwgRW51bURlc2NyaXB0b3I8RW51bT4gfCB1bmRlZmluZWQsXG4gICAgICAgIHNjaGVtYVByb3BlcnR5OiBTY2hlbWFQcm9wZXJ0eVxuICAgICk6IEZpZWxkTG9va3VwRW51bURlc2NyaXB0b3I8RW51bSwgRmllbGRzTW9kZWwsIFBhcmVudD4ge1xuICAgICAgICBpZiAoIWVudW1PcHQpIHtcbiAgICAgICAgICAgIGVudW1PcHQgPSB0aGlzLm9wdHM/LmVudW1Nb2RlbHM/Lltwcm9wZXJ0eV0gPz8gdGhpcy5vcHRzPy5lbnVtU2NoZW1hcz8uW3Byb3BlcnR5XTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWVudW1PcHQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBDb21tb25zSW50ZXJuYWxFcnJvcihgRW51bSBsb29rdXAgZmllbGQgZm9yIHByb3BlcnR5ICR7cHJvcGVydHkgYXMgc3RyaW5nfSBjYW5ub3QgYmUgYWRkZWQgYmVjYXVzZSBlbnVtIG1ldGFkYXRhIHdhcyBub3QgcHJvdmlkZWQuYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFkZEZpZWxkRW51bUxvb2t1cEZyb21TY2hlbWEodGhpcy5kZXNjcmlwdG9yLCBwcm9wZXJ0eSwgZW51bU9wdCwgc2NoZW1hUHJvcGVydHkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIDxlbT5FeHBlcmltZW50YWw6PC9lbT4gQWRkcyBhIGxvb2t1cCBmaWVsZC5cbiAgICAgKiB7RWRpdG9yRGVzY3JpcHRvckludC5hZGRGaWVsZExvb2t1cH0gaXMgdXNlZCB0byBjcmVhdGUgZmllbGQgYW5kICR7c2V0RmllbGRCYXNpY09wdGlvbnNGcm9tU2NoZW1hfSB0byBhZGQgYmFzaWMgZmllbGQncyBvcHRpb25zIGZyb20gc2NoZW1hLlxuICAgICAqXG4gICAgICogQGV4cGVyaW1lbnRhbFxuICAgICAqXG4gICAgICogQHBhcmFtIHtQcm9wZXJ0eX0gcHJvcGVydHkgLSBUaGUgcHJvcGVydHkgdG8gY3JlYXRlIHRoZSBsb29rdXAgZmllbGQgZm9yLlxuICAgICAqIEBwYXJhbSB7RmllbGRMb29rdXBQcm92aWRlclR5cGU8TG9va3VwTW9kZWwsIFNlcnZpY2U+fSBwcm92aWRlciAtIERhdGEgcHJvdmlkZXIgZm9yIHRoZSBsb29rdXAgZmllbGQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIGxvb2t1cCBmaWVsZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWRkTG9va3VwPFxuICAgICAgICBQcm9wZXJ0eSBleHRlbmRzIEV4dHJhY3Q8a2V5b2YgRmllbGRzTW9kZWwsIGtleW9mIFNjaE1vZGVsPixcbiAgICAgICAgU2VydmljZSA9IHVuZGVmaW5lZCxcbiAgICAgICAgTG9va3VwTW9kZWwgZXh0ZW5kcyBOb25OdWxsYWJsZTxGaWVsZHNNb2RlbFtQcm9wZXJ0eV0+ID0gTm9uTnVsbGFibGU8RmllbGRzTW9kZWxbUHJvcGVydHldPlxuICAgID4ocHJvcGVydHk6IFByb3BlcnR5LCBwcm92aWRlcj86IEZpZWxkTG9va3VwUHJvdmlkZXJUeXBlPExvb2t1cE1vZGVsLCBTZXJ2aWNlPikge1xuICAgICAgICBjb25zdCBmaWVsZCA9IHRoaXMuZGVzY3JpcHRvci5hZGRGaWVsZExvb2t1cDxQcm9wZXJ0eSwgU2VydmljZSwgTG9va3VwTW9kZWw+KHByb3BlcnR5LCB7c2VydmljZVByb3ZpZGVyOiBwcm92aWRlcn0pO1xuICAgICAgICBzZXRGaWVsZEJhc2ljT3B0aW9uc0Zyb21TY2hlbWEoZmllbGQsIHRoaXMuc2NoZW1hLnByb3BlcnRpZXNbcHJvcGVydHldKTtcbiAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIDxlbT5FeHBlcmltZW50YWw6PC9lbT4gQWRkcyBhIGxvb2t1cCBmaWVsZCB3aGVyZSBwcm9wZXJ0eSBzY2hlbWEgaXMgbWFudWFsbHkgcHJvdmlkZWQuXG4gICAgICoge0VkaXRvckRlc2NyaXB0b3JJbnQuYWRkRmllbGRMb29rdXB9IGlzIHVzZWQgdG8gY3JlYXRlIGZpZWxkIGFuZCAke3NldEZpZWxkQmFzaWNPcHRpb25zRnJvbVNjaGVtYX0gdG8gYWRkIGJhc2ljIGZpZWxkJ3Mgb3B0aW9ucyBmcm9tIHNjaGVtYS5cbiAgICAgKlxuICAgICAqIEBleHBlcmltZW50YWxcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UHJvcGVydHl9IHByb3BlcnR5IC0gVGhlIHByb3BlcnR5IHRvIGNyZWF0ZSB0aGUgbG9va3VwIGZpZWxkIGZvci5cbiAgICAgKiBAcGFyYW0ge0ZpZWxkTG9va3VwUHJvdmlkZXJUeXBlPExvb2t1cE1vZGVsLCBTZXJ2aWNlPiB8IHVuZGVmaW5lZH0gcHJvdmlkZXIgLSBEYXRhIHByb3ZpZGVyIGZvciB0aGUgbG9va3VwIGZpZWxkLlxuICAgICAqIEBwYXJhbSB7U2NoZW1hUHJvcGVydHl9IHNjaGVtYVByb3BlcnR5IC0gTWFudWFsbHkgcHJvdmlkZWQgc2NoZW1hIHByb3BlcnR5LlxuICAgICAqXG4gICAgICogQHJldHVybiBUaGUgY3JlYXRlZCBsb29rdXAgZmllbGQuXG4gICAgICovXG4gICAgcHVibGljIGFkZExvb2t1cEZyb21TY2hlbWE8XG4gICAgICAgIFByb3BlcnR5IGV4dGVuZHMga2V5b2YgRmllbGRzTW9kZWwsXG4gICAgICAgIFNlcnZpY2UgPSB1bmRlZmluZWQsXG4gICAgICAgIExvb2t1cE1vZGVsIGV4dGVuZHMgTm9uTnVsbGFibGU8RmllbGRzTW9kZWxbUHJvcGVydHldPiA9IE5vbk51bGxhYmxlPEZpZWxkc01vZGVsW1Byb3BlcnR5XT5cbiAgICA+KHByb3BlcnR5OiBQcm9wZXJ0eSwgcHJvdmlkZXI6IEZpZWxkTG9va3VwUHJvdmlkZXJUeXBlPExvb2t1cE1vZGVsLCBTZXJ2aWNlPiB8IHVuZGVmaW5lZCwgc2NoZW1hUHJvcGVydHk6IFNjaGVtYVByb3BlcnR5KSB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gdGhpcy5kZXNjcmlwdG9yLmFkZEZpZWxkTG9va3VwPFByb3BlcnR5LCBTZXJ2aWNlLCBMb29rdXBNb2RlbD4ocHJvcGVydHksIHtzZXJ2aWNlUHJvdmlkZXI6IHByb3ZpZGVyfSk7XG4gICAgICAgIHNldEZpZWxkQmFzaWNPcHRpb25zRnJvbVNjaGVtYShmaWVsZCwgc2NoZW1hUHJvcGVydHkpO1xuICAgICAgICByZXR1cm4gZmllbGQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogPGVtPkV4cGVyaW1lbnRhbDo8L2VtPiBBZGRzIGEgb25lLXRvLW1hbnkgZWRpdG9yIGZpZWxkLlxuICAgICAqIHtFZGl0b3JEZXNjcmlwdG9ySW50LmFkZEZpZWxkTWFueUVkaXRvcn0gaXMgdXNlZCB0byBjcmVhdGUgZmllbGQgYW5kICR7c2V0RmllbGRCYXNpY09wdGlvbnNGcm9tU2NoZW1hfSB0byBhZGQgYmFzaWMgZmllbGQncyBvcHRpb25zIGZyb20gc2NoZW1hLlxuICAgICAqXG4gICAgICogQGV4cGVyaW1lbnRhbFxuICAgICAqXG4gICAgICogQHBhcmFtIHtQcm9wZXJ0eX0gcHJvcGVydHkgLSBUaGUgcHJvcGVydHkgdG8gY3JlYXRlIHRoZSBtYW55IGVkaXRvciBmaWVsZCBmb3IuXG4gICAgICogQHBhcmFtIHtUYWJsZXZpZXdEZXNjcmlwdG9ySW5zdDxGaWVsZE1vZGVsLCBhbnksIGFueSwgRmllbGRzTW9kZWw+fSB0YWJsZXZpZXdEZXNjcmlwdG9yIC0gVGFibGV2aWV3IGRlc2NyaXB0b3IuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIG9uZS10by1tYW55IGVkaXRvciBmaWVsZC5cbiAgICAgKi9cbiAgICBhZGRNYW55RWRpdG9yPFByb3BlcnR5IGV4dGVuZHMgRXh0cmFjdDxrZXlvZiBGaWVsZHNNb2RlbCwga2V5b2YgU2NoTW9kZWw+LCBGaWVsZE1vZGVsID0gQXJyYXlJdGVtVHlwZTxGaWVsZHNNb2RlbFtQcm9wZXJ0eV0+LCBGaWVsZFZhbHVlID0gRmllbGRzTW9kZWxbUHJvcGVydHldPihcbiAgICAgICAgcHJvcGVydHk6IFByb3BlcnR5LFxuICAgICAgICB0YWJsZXZpZXdEZXNjcmlwdG9yOiBUYWJsZXZpZXdEZXNjcmlwdG9ySW5zdDxGaWVsZE1vZGVsLCBhbnksIGFueSwgRmllbGRzTW9kZWwsIEZpZWxkTW9kZWwsIEZpZWxkTW9kZWwsIEZpZWxkTW9kZWwsIEZpZWxkTW9kZWw+XG4gICAgKTogRmllbGRNYW55RWRpdG9yRGVzY3JpcHRvcjxGaWVsZE1vZGVsLCBGaWVsZHNNb2RlbCwgRmllbGRWYWx1ZSwgUGFyZW50PiB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gdGhpcy5kZXNjcmlwdG9yLmFkZEZpZWxkTWFueUVkaXRvcjxQcm9wZXJ0eSwgRmllbGRNb2RlbCwgRmllbGRWYWx1ZT4ocHJvcGVydHksIHRhYmxldmlld0Rlc2NyaXB0b3IpO1xuICAgICAgICBzZXRGaWVsZEJhc2ljT3B0aW9uc0Zyb21TY2hlbWEoZmllbGQsIHRoaXMuc2NoZW1hLnByb3BlcnRpZXNbcHJvcGVydHldKTtcbiAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIDxlbT5FeHBlcmltZW50YWw6PC9lbT4gQWRkcyBhbiBvbmUtdG8tbWFueSBlZGl0b3IgZmllbGQgd2hlcmUgcHJvcGVydHkgc2NoZW1hIGlzIG1hbnVhbGx5IHByb3ZpZGVkLlxuICAgICAqIHtFZGl0b3JEZXNjcmlwdG9ySW50LmFkZEZpZWxkTWFueUVkaXRvcn0gaXMgdXNlZCB0byBjcmVhdGUgZmllbGQgYW5kICR7c2V0RmllbGRCYXNpY09wdGlvbnNGcm9tU2NoZW1hfSB0byBhZGQgYmFzaWMgZmllbGQncyBvcHRpb25zIGZyb20gc2NoZW1hLlxuICAgICAqXG4gICAgICogQGV4cGVyaW1lbnRhbFxuICAgICAqXG4gICAgICogQHBhcmFtIHtQcm9wZXJ0eX0gcHJvcGVydHkgLSBUaGUgcHJvcGVydHkgdG8gY3JlYXRlIHRoZSBtYW55IGVkaXRvciBmaWVsZCBmb3IuXG4gICAgICogQHBhcmFtIHtUYWJsZXZpZXdEZXNjcmlwdG9yVHlwZTxGaWVsZE1vZGVsLCBhbnksIGFueSwgRmllbGRzTW9kZWw+fSB0YWJsZXZpZXdEZXNjcmlwdG9yIC0gVGFibGV2aWV3IGRlc2NyaXB0b3IuXG4gICAgICogQHBhcmFtIHtTY2hlbWFQcm9wZXJ0eX0gc2NoZW1hUHJvcGVydHkgLSBNYW51YWxseSBwcm92aWRlZCBzY2hlbWEgcHJvcGVydHkuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIG9uZS10by1tYW55IGVkaXRvciBmaWVsZC5cbiAgICAgKi9cbiAgICBhZGRNYW55RWRpdG9yRnJvbVNjaGVtYTxQcm9wZXJ0eSBleHRlbmRzIGtleW9mIEZpZWxkc01vZGVsLCBGaWVsZE1vZGVsID0gQXJyYXlJdGVtVHlwZTxGaWVsZHNNb2RlbFtQcm9wZXJ0eV0+LCBGaWVsZFZhbHVlID0gRmllbGRzTW9kZWxbUHJvcGVydHldPihcbiAgICAgICAgcHJvcGVydHk6IFByb3BlcnR5LFxuICAgICAgICB0YWJsZXZpZXdEZXNjcmlwdG9yOiBUYWJsZXZpZXdEZXNjcmlwdG9ySW5zdDxGaWVsZE1vZGVsLCBhbnksIGFueSwgRmllbGRzTW9kZWwsIEZpZWxkTW9kZWwsIEZpZWxkTW9kZWwsIEZpZWxkTW9kZWwsIEZpZWxkTW9kZWw+LFxuICAgICAgICBzY2hlbWFQcm9wZXJ0eTogU2NoZW1hUHJvcGVydHlcbiAgICApOiBGaWVsZE1hbnlFZGl0b3JEZXNjcmlwdG9yPEZpZWxkTW9kZWwsIEZpZWxkc01vZGVsLCBGaWVsZFZhbHVlLCBQYXJlbnQ+IHtcbiAgICAgICAgY29uc3QgZmllbGQgPSB0aGlzLmRlc2NyaXB0b3IuYWRkRmllbGRNYW55RWRpdG9yPFByb3BlcnR5LCBGaWVsZE1vZGVsLCBGaWVsZFZhbHVlPihwcm9wZXJ0eSwgdGFibGV2aWV3RGVzY3JpcHRvcik7XG4gICAgICAgIHNldEZpZWxkQmFzaWNPcHRpb25zRnJvbVNjaGVtYShmaWVsZCwgc2NoZW1hUHJvcGVydHkpO1xuICAgICAgICByZXR1cm4gZmllbGQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogPGVtPkV4cGVyaW1lbnRhbDo8L2VtPiBBZGRzIGEgbWFueS10by1tYW55IGVkaXRvciBmaWVsZC5cbiAgICAgKiB7RWRpdG9yRGVzY3JpcHRvckludC5hZGRGaWVsZE1hbnlUb01hbnlFZGl0b3J9IGlzIHVzZWQgdG8gY3JlYXRlIGZpZWxkIGFuZCAke3NldEZpZWxkQmFzaWNPcHRpb25zRnJvbVNjaGVtYX0gdG8gYWRkIGJhc2ljIGZpZWxkJ3Mgb3B0aW9ucyBmcm9tIHNjaGVtYS5cbiAgICAgKlxuICAgICAqIEBleHBlcmltZW50YWxcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UHJvcGVydHl9IHByb3BlcnR5IC0gVGhlIHByb3BlcnR5IHRvIGNyZWF0ZSB0aGUgbWFueSBlZGl0b3IgZmllbGQgZm9yLlxuICAgICAqIEBwYXJhbSB7VGFibGVEZXNjcmlwdG9ySW5zdDxGaWVsZE1vZGVsPn0gbWFpblRhYmxlRGVzY3JpcHRvciAtIE1haW4gdGFibGUgZGVzY3JpcHRvci5cbiAgICAgKiBAcGFyYW0ge1RhYmxlRGVzY3JpcHRvckluc3Q8RmllbGRNb2RlbD59IGxvb2t1cFRhYmxlRGVzY3JpcHRvciAtIExvb2t1cCB0YWJsZSBkZXNjcmlwdG9yLlxuICAgICAqIEBwYXJhbSB7SVRhYmxlRGF0YVByb3ZpZGVyPEZpZWxkTW9kZWwsIFNlcnZpY2VUeXBlPn0gbG9va3VwRGF0YVByb3ZpZGVyIC0gTG9va3VwIGRhdGEgcHJvdmlkZXIuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIG1hbnktdG8tbWFueSBlZGl0b3IgZmllbGQuXG4gICAgICovXG4gICAgYWRkTWFueVRvTWFueUVkaXRvcjxcbiAgICAgICAgUHJvcGVydHkgZXh0ZW5kcyBFeHRyYWN0PGtleW9mIEZpZWxkc01vZGVsLCBrZXlvZiBTY2hNb2RlbD4sXG4gICAgICAgIFNlcnZpY2VUeXBlLFxuICAgICAgICBGaWVsZE1vZGVsID0gQXJyYXlJdGVtVHlwZTxGaWVsZHNNb2RlbFtQcm9wZXJ0eV0+LFxuICAgICAgICBGaWVsZFZhbHVlID0gRmllbGRzTW9kZWxbUHJvcGVydHldXG4gICAgPihcbiAgICAgICAgcHJvcGVydHk6IFByb3BlcnR5LFxuICAgICAgICBtYWluVGFibGVEZXNjcmlwdG9yOiBUYWJsZURlc2NyaXB0b3JJbnN0PEZpZWxkTW9kZWw+LFxuICAgICAgICBsb29rdXBUYWJsZURlc2NyaXB0b3I6IFRhYmxlRGVzY3JpcHRvckluc3Q8RmllbGRNb2RlbD4sXG4gICAgICAgIGxvb2t1cERhdGFQcm92aWRlcjogSVRhYmxlRGF0YVByb3ZpZGVyPEZpZWxkTW9kZWwsIFNlcnZpY2VUeXBlPlxuICAgICk6IEZpZWxkTWFueVRvTWFueUVkaXRvckRlc2NyaXB0b3I8RmllbGRNb2RlbCwgRmllbGRzTW9kZWwsIFNlcnZpY2VUeXBlLCBGaWVsZFZhbHVlLCBQYXJlbnQ+IHtcbiAgICAgICAgY29uc3QgZmllbGQgPSB0aGlzLmRlc2NyaXB0b3IuYWRkRmllbGRNYW55VG9NYW55RWRpdG9yPFByb3BlcnR5LCBTZXJ2aWNlVHlwZSwgRmllbGRNb2RlbCwgRmllbGRWYWx1ZT4oXG4gICAgICAgICAgICBwcm9wZXJ0eSxcbiAgICAgICAgICAgIG1haW5UYWJsZURlc2NyaXB0b3IsXG4gICAgICAgICAgICBsb29rdXBUYWJsZURlc2NyaXB0b3IsXG4gICAgICAgICAgICBsb29rdXBEYXRhUHJvdmlkZXJcbiAgICAgICAgKTtcbiAgICAgICAgc2V0RmllbGRCYXNpY09wdGlvbnNGcm9tU2NoZW1hKGZpZWxkLCB0aGlzLnNjaGVtYS5wcm9wZXJ0aWVzW3Byb3BlcnR5XSk7XG4gICAgICAgIHJldHVybiBmaWVsZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiA8ZW0+RXhwZXJpbWVudGFsOjwvZW0+IEFkZHMgYSBtYW55LXRvLW1hbnkgZWRpdG9yIGZpZWxkIHdoZXJlIHByb3BlcnR5IHNjaGVtYSBpcyBtYW51YWxseSBwcm92aWRlZC5cbiAgICAgKiB7RWRpdG9yRGVzY3JpcHRvckludC5hZGRGaWVsZE1hbnlUb01hbnlFZGl0b3J9IGlzIHVzZWQgdG8gY3JlYXRlIGZpZWxkIGFuZCAke3NldEZpZWxkQmFzaWNPcHRpb25zRnJvbVNjaGVtYX0gdG8gYWRkIGJhc2ljIGZpZWxkJ3Mgb3B0aW9ucyBmcm9tIHNjaGVtYS5cbiAgICAgKlxuICAgICAqIEBleHBlcmltZW50YWxcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UHJvcGVydHl9IHByb3BlcnR5IC0gVGhlIHByb3BlcnR5IHRvIGNyZWF0ZSB0aGUgbWFueSBlZGl0b3IgZmllbGQgZm9yLlxuICAgICAqIEBwYXJhbSB7VGFibGVEZXNjcmlwdG9ySW5zdDxGaWVsZE1vZGVsPn0gbWFpblRhYmxlRGVzY3JpcHRvciAtIE1haW4gdGFibGUgZGVzY3JpcHRvci5cbiAgICAgKiBAcGFyYW0ge1RhYmxlRGVzY3JpcHRvckluc3Q8RmllbGRNb2RlbD59IGxvb2t1cFRhYmxlRGVzY3JpcHRvciAtIExvb2t1cCB0YWJsZSBkZXNjcmlwdG9yLlxuICAgICAqIEBwYXJhbSB7SVRhYmxlRGF0YVByb3ZpZGVyPEZpZWxkTW9kZWwsIFNlcnZpY2VUeXBlPn0gbG9va3VwRGF0YVByb3ZpZGVyIC0gTG9va3VwIGRhdGEgcHJvdmlkZXIuXG4gICAgICogQHBhcmFtIHtTY2hlbWFQcm9wZXJ0eX0gc2NoZW1hUHJvcGVydHkgLSBNYW51YWxseSBwcm92aWRlZCBzY2hlbWEgcHJvcGVydHkuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIG1hbnktdG8tbWFueSBlZGl0b3IgZmllbGQuXG4gICAgICovXG4gICAgYWRkTWFueVRvTWFueUVkaXRvckZyb21TY2hlbWE8UHJvcGVydHkgZXh0ZW5kcyBrZXlvZiBGaWVsZHNNb2RlbCwgU2VydmljZVR5cGUsIEZpZWxkTW9kZWwgPSBBcnJheUl0ZW1UeXBlPEZpZWxkc01vZGVsW1Byb3BlcnR5XT4sIEZpZWxkVmFsdWUgPSBGaWVsZHNNb2RlbFtQcm9wZXJ0eV0+KFxuICAgICAgICBwcm9wZXJ0eTogUHJvcGVydHksXG4gICAgICAgIG1haW5UYWJsZURlc2NyaXB0b3I6IFRhYmxlRGVzY3JpcHRvckluc3Q8RmllbGRNb2RlbD4sXG4gICAgICAgIGxvb2t1cFRhYmxlRGVzY3JpcHRvcjogVGFibGVEZXNjcmlwdG9ySW5zdDxGaWVsZE1vZGVsPixcbiAgICAgICAgbG9va3VwRGF0YVByb3ZpZGVyOiBJVGFibGVEYXRhUHJvdmlkZXI8RmllbGRNb2RlbCwgU2VydmljZVR5cGU+LFxuICAgICAgICBzY2hlbWFQcm9wZXJ0eTogU2NoZW1hUHJvcGVydHlcbiAgICApOiBGaWVsZE1hbnlUb01hbnlFZGl0b3JEZXNjcmlwdG9yPEZpZWxkTW9kZWwsIEZpZWxkc01vZGVsLCBTZXJ2aWNlVHlwZSwgRmllbGRWYWx1ZSwgUGFyZW50PiB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gdGhpcy5kZXNjcmlwdG9yLmFkZEZpZWxkTWFueVRvTWFueUVkaXRvcjxQcm9wZXJ0eSwgU2VydmljZVR5cGUsIEZpZWxkTW9kZWwsIEZpZWxkVmFsdWU+KFxuICAgICAgICAgICAgcHJvcGVydHksXG4gICAgICAgICAgICBtYWluVGFibGVEZXNjcmlwdG9yLFxuICAgICAgICAgICAgbG9va3VwVGFibGVEZXNjcmlwdG9yLFxuICAgICAgICAgICAgbG9va3VwRGF0YVByb3ZpZGVyXG4gICAgICAgICk7XG4gICAgICAgIHNldEZpZWxkQmFzaWNPcHRpb25zRnJvbVNjaGVtYShmaWVsZCwgc2NoZW1hUHJvcGVydHkpO1xuICAgICAgICByZXR1cm4gZmllbGQ7XG4gICAgfVxufVxuXG4vKipcbiAqIDxlbT5FeHBlcmltZW50YWw6PC9lbT4gQ3JlYXRlcyBidWlsZGVyIGZvciBhZGRpbmcgZmllbGRzIHRvIGRlc2NyaXB0b3IgYmFzZWQgb24gcHJvdmlkZWQgbW9kZWwgc2NoZW1hLlxuICpcbiAqIEBleHBlcmltZW50YWxcbiAqXG4gKiBAcGFyYW0ge1RhYmxldmlld0Rlc2NyaXB0b3JJbnN0PE1vZGVsLCBhbnksIGFueSwgUGFyZW50LCBhbnksIEFkZE1vZGVsLCBFZGl0TW9kZWwsIEZpZWxkc01vZGVsPiB8IEVkaXRvckRlc2NyaXB0b3JJbnN0PE1vZGVsLCBQYXJlbnQ+fSBkZXNjcmlwdG9yIC0gRGVzY3JpcHRvciB0byBhZGQgZmllbGRzIHRvLlxuICogQHBhcmFtIHtTY2hlbWFNb2RlbDxTY2hNb2RlbD59IHNjaGVtYSAtIFRoZSBzY2hlbWEgd2l0aCBtZXRhZGF0YSBhYm91dCBwcm9wZXJ0aWVzIGZvciBmaWVsZHMuXG4gKiBAcGFyYW0ge0ZpZWxkc0Zyb21TY2hlbWFPcHRzVHlwZTxTY2hNb2RlbD59IFtvcHRzXSAtIEFkZGl0aW9uYWwgb3B0aW9ucy5cbiAqXG4gKiBAcmV0dXJuIHtTY2hlbWFGaWVsZHNCdWlsZGVyPE1vZGVsLCBQYXJlbnQsIEFkZE1vZGVsLCBFZGl0TW9kZWwgLCBGaWVsZHNNb2RlbCwgU2NoTW9kZWw+fSAtIFRoZSBTY2hlbWFGaWVsZHNCdWlsZGVyIG9iamVjdCBjb250YWluaW5nIHRoZSBleHRyYWN0ZWQgZmllbGRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmllbGRzRnJvbVNjaGVtYTxcbiAgICBNb2RlbCxcbiAgICBQYXJlbnQgPSB1bmRlZmluZWQsXG4gICAgQWRkTW9kZWwgPSBNb2RlbCxcbiAgICBFZGl0TW9kZWwgPSBNb2RlbCxcbiAgICBGaWVsZHNNb2RlbCA9IFRhYmxldmlld0Rlc2NyaXB0b3JGaWVsZHNNYW5hZ2VNdWx0aVR5cGU8TW9kZWwsIEFkZE1vZGVsLCBFZGl0TW9kZWw+LFxuICAgIFNjaE1vZGVsID0gTW9kZWxcbj4oXG4gICAgZGVzY3JpcHRvcjogVGFibGV2aWV3RGVzY3JpcHRvckluc3Q8TW9kZWwsIGFueSwgYW55LCBQYXJlbnQsIGFueSwgQWRkTW9kZWwsIEVkaXRNb2RlbCwgRmllbGRzTW9kZWw+IHwgRWRpdG9yRGVzY3JpcHRvckluc3Q8RmllbGRzTW9kZWwsIFBhcmVudD4sXG4gICAgc2NoZW1hOiBTY2hlbWFNb2RlbDxTY2hNb2RlbD4sXG4gICAgb3B0cz86IEZpZWxkc0Zyb21TY2hlbWFPcHRzVHlwZTxTY2hNb2RlbD5cbik6IFNjaGVtYUZpZWxkc0J1aWxkZXI8TW9kZWwsIFBhcmVudCwgQWRkTW9kZWwsIEVkaXRNb2RlbCwgRmllbGRzTW9kZWwsIFNjaE1vZGVsPiB7XG4gICAgcmV0dXJuIG5ldyBTY2hlbWFGaWVsZHNCdWlsZGVyPE1vZGVsLCBQYXJlbnQsIEFkZE1vZGVsLCBFZGl0TW9kZWwsIEZpZWxkc01vZGVsLCBTY2hNb2RlbD4oZGVzY3JpcHRvciwgc2NoZW1hLCBvcHRzKTtcbn1cblxuLyoqXG4gKiA8ZW0+RXhwZXJpbWVudGFsOjwvZW0+IEFkZHMgYSBmaWVsZCBpbnB1dCB0byBlZGl0b3IgZGVzY3JpcHRvciBiYXNlZCBvbiB0aGUgZ2l2ZW4gc2NoZW1hIHByb3BlcnR5IGFuZCBvcHRpb25zLlxuICpcbiAqIEBleHBlcmltZW50YWxcbiAqXG4gKiBAcGFyYW0ge1RhYmxldmlld0Rlc2NyaXB0b3JJbnN0IHwgRWRpdG9yRGVzY3JpcHRvckluc3R9IGRlc2NyaXB0b3IgLSBEZXNjcmlwdG9yIHRvIGFkZCBmaWVsZCB0by5cbiAqIEBwYXJhbSB7a2V5b2YgTW9kZWx9IHByb3BlcnR5IC0gVGhlIHByb3BlcnR5IG9mIHRoZSBtb2RlbC5cbiAqIEBwYXJhbSB7U2NoZW1hUHJvcGVydHl9IHByb3BlcnR5U2NoZW1hIC0gVGhlIHByb3BlcnR5J3Mgc2NoZW1hIGZvciB0aGUgZmllbGQuXG4gKiBAcGFyYW0ge0ZpZWxkSW5wdXRGcm9tU2NoZW1hT3B0c1R5cGU8TW9kZWw+fSBbb3B0c10gLSBBZGRpdGlvbmFsIG9wdGlvbnMuXG4gKlxuICogQHJldHVybiB7RmllbGRJbnB1dERlc2NyaXB0b3I8TW9kZWwsIE5vbk51bGxhYmxlPE1vZGVsW1Byb3BlcnR5XT4sIE1vZGVsW1Byb3BlcnR5XSwgUGFyZW50Pn0gLSBUaGUgZ2VuZXJhdGVkIGZpZWxkIGlucHV0IGRlc2NyaXB0b3IuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGRGaWVsZElucHV0RnJvbVNjaGVtYTxcbiAgICBQcm9wZXJ0eSBleHRlbmRzIGtleW9mIEZpZWxkc01vZGVsLFxuICAgIE1vZGVsLFxuICAgIFBhcmVudCA9IHVua25vd24sXG4gICAgQWRkTW9kZWwgPSBNb2RlbCxcbiAgICBFZGl0TW9kZWwgPSBNb2RlbCxcbiAgICBGaWVsZHNNb2RlbCA9IFRhYmxldmlld0Rlc2NyaXB0b3JGaWVsZHNNYW5hZ2VNdWx0aVR5cGU8TW9kZWwsIEFkZE1vZGVsLCBFZGl0TW9kZWw+XG4+KFxuICAgIGRlc2NyaXB0b3I6IFRhYmxldmlld0Rlc2NyaXB0b3JJbnN0PE1vZGVsLCBhbnksIGFueSwgUGFyZW50LCBhbnksIEFkZE1vZGVsLCBFZGl0TW9kZWwsIEZpZWxkc01vZGVsPiB8IEVkaXRvckRlc2NyaXB0b3JJbnN0PEZpZWxkc01vZGVsLCBQYXJlbnQ+LFxuICAgIHByb3BlcnR5OiBQcm9wZXJ0eSxcbiAgICBwcm9wZXJ0eVNjaGVtYTogU2NoZW1hUHJvcGVydHksXG4gICAgb3B0cz86IEZpZWxkSW5wdXRGcm9tU2NoZW1hT3B0c1R5cGU8RmllbGRzTW9kZWw+XG4pOiBGaWVsZElucHV0RGVzY3JpcHRvcjxGaWVsZHNNb2RlbCwgTm9uTnVsbGFibGU8RmllbGRzTW9kZWxbUHJvcGVydHldPiwgRmllbGRzTW9kZWxbUHJvcGVydHldLCBQYXJlbnQ+IHtcbiAgICBjb25zdCBwcm9wZXJ0eVR5cGUgPSBvcHRzPy5maWVsZFR5cGUgPz8gcHJvcGVydHlTY2hlbWEudHlwZTtcblxuICAgIGNvbnN0IGZpZWxkID0gbmV3IEZpZWxkSW5wdXREZXNjcmlwdG9yPEZpZWxkc01vZGVsLCBOb25OdWxsYWJsZTxGaWVsZHNNb2RlbFtQcm9wZXJ0eV0+LCBGaWVsZHNNb2RlbFtQcm9wZXJ0eV0sIFBhcmVudD4ocHJvcGVydHkgYXMgc3RyaW5nKTtcbiAgICBpZiAoZGVzY3JpcHRvciBpbnN0YW5jZW9mIFRhYmxldmlld0Rlc2NyaXB0b3JJbnN0KSB7XG4gICAgICAgIGRlc2NyaXB0b3IuYWRkRmllbGREZXNjcmlwdG9yKGZpZWxkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBkZXNjcmlwdG9yLmFkZEZpZWxkRGVzY3JpcHRvcihmaWVsZCk7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGRpZmZlcmVudCBwcm9wZXJ0eSB0eXBlc1xuICAgIHN3aXRjaCAocHJvcGVydHlUeXBlIGFzIEZpZWxkSW5wdXRUeXBlKSB7XG4gICAgICAgIGNhc2UgJ251bWJlcic6XG4gICAgICAgICAgICBmaWVsZC5hc051bWJlcigpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2N1cnJlbmN5JzpcbiAgICAgICAgICAgIGZpZWxkLmFzQ3VycmVuY3koe1xuICAgICAgICAgICAgICAgIGN1cnJlbmN5OiBvcHRzPy5jdXJyZW5jeSxcbiAgICAgICAgICAgICAgICBjdXJyZW5jeURpc3BsYXk6IG9wdHM/LmN1cnJlbmN5RGlzcGxheSxcbiAgICAgICAgICAgICAgICBjdXJyZW5jeVByb3BlcnR5OiBvcHRzPy5jdXJyZW5jeVByb3BlcnR5XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdib29sZWFuJzpcbiAgICAgICAgICAgIGZpZWxkLmFzU3dpdGNoKCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAndGV4dCc6XG4gICAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgICAgICBmaWVsZC5hc1RleHQoKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICd0ZXh0YXJlYSc6XG4gICAgICAgICAgICBmaWVsZC5hc1RleHRhcmVhKCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnZGF0ZSc6XG4gICAgICAgICAgICBmaWVsZC5hc0RhdGVQaWNrZXIoe2Zvcm1hdDogb3B0cz8uZGF0ZUZvcm1hdCA/IGZyb21Bbmd1bGFyRGF0ZUZvcm1hdFRvUHJpbWUob3B0cy5kYXRlRm9ybWF0KSA6IHVuZGVmaW5lZH0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2RhdGUtdGltZSc6XG4gICAgICAgICAgICBmaWVsZC5hc0RhdGVQaWNrZXIoe3Nob3dUaW1lOiB0cnVlLCBmb3JtYXQ6IG9wdHM/LmRhdGVUaW1lRm9ybWF0ID8gZnJvbUFuZ3VsYXJEYXRlRm9ybWF0VG9QcmltZShvcHRzLmRhdGVUaW1lRm9ybWF0KSA6IHVuZGVmaW5lZH0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2VudW0nOlxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNhc2UtZGVjbGFyYXRpb25zXG4gICAgICAgICAgICBjb25zdCBlbnVtTW9kZWwgPSBvcHRzPy5lbnVtU2NoZW1hID8gZW51bU1vZGVsRnJvbVNjaGVtYShvcHRzLmVudW1TY2hlbWEpIDogb3B0cz8uZW51bU1vZGVsO1xuICAgICAgICAgICAgaWYgKGVudW1Nb2RlbCkge1xuICAgICAgICAgICAgICAgIGZpZWxkLmFzUmFkaW9Gcm9tRW51bShlbnVtTW9kZWwpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmaWVsZC5hc1RleHQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdoaWRkZW4nOlxuICAgICAgICAgICAgZmllbGQuYXNIaWRkZW4oKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBkaWZmZXJlbnQgcHJvcGVydHkgdmFsaWRhdGlvbnNcbiAgICBpZiAocHJvcGVydHlUeXBlID09PSAnbnVtYmVyJyB8fCBwcm9wZXJ0eVR5cGUgPT09ICdjdXJyZW5jeScpIHtcbiAgICAgICAgZmllbGQud2l0aE51bWJlclZhbGlkYXRpb24oe1xuICAgICAgICAgICAgbWluOiBwcm9wZXJ0eVNjaGVtYS5leGNsdXNpdmVNaW5pbXVtICYmIHByb3BlcnR5U2NoZW1hLm1pbmltdW0gIT0gdW5kZWZpbmVkID8gcHJvcGVydHlTY2hlbWEubWluaW11bSArIChwcm9wZXJ0eVNjaGVtYS5pc0ludGVnZXIgPyAxIDogMC4wMDAxKSA6IHByb3BlcnR5U2NoZW1hLm1pbmltdW0sXG4gICAgICAgICAgICBtYXg6IHByb3BlcnR5U2NoZW1hLmV4Y2x1c2l2ZU1heGltdW0gJiYgcHJvcGVydHlTY2hlbWEubWF4aW11bSAhPSB1bmRlZmluZWQgPyBwcm9wZXJ0eVNjaGVtYS5tYXhpbXVtIC0gKHByb3BlcnR5U2NoZW1hLmlzSW50ZWdlciA/IDEgOiAwLjAwMDEpIDogcHJvcGVydHlTY2hlbWEubWF4aW11bSxcbiAgICAgICAgICAgIHN0ZXA6IG9wdHM/Lm51bWJlclN0ZXBcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChvcHRzPy5udW1iZXJVc2VHcm91cGluZykge1xuICAgICAgICAgICAgZmllbGQud2l0aE51bWJlckdyb3VwaW5nKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdHM/Lm51bWJlck1pbkZyYWN0aW9uRGlnaXRzICE9IG51bGwgfHwgb3B0cz8ubnVtYmVyTWF4RnJhY3Rpb25EaWdpdHMgIT0gbnVsbCkge1xuICAgICAgICAgICAgZmllbGQud2l0aE51bWJlckZyYWN0aW9ucyh7XG4gICAgICAgICAgICAgICAgbWluRnJhY3Rpb25EaWdpdHM6IG9wdHM/Lm51bWJlck1pbkZyYWN0aW9uRGlnaXRzLFxuICAgICAgICAgICAgICAgIG1heEZyYWN0aW9uRGlnaXRzOiBvcHRzPy5udW1iZXJNYXhGcmFjdGlvbkRpZ2l0c1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocHJvcGVydHlUeXBlID09PSAnc3RyaW5nJyB8fCBwcm9wZXJ0eVR5cGUgPT09ICd0ZXh0YXJlYScgfHwgcHJvcGVydHlUeXBlID09PSAndGV4dCcpIHtcbiAgICAgICAgZmllbGQud2l0aFRleHRWYWxpZGF0aW9uKHtcbiAgICAgICAgICAgIG1pbkxlbmd0aDogcHJvcGVydHlTY2hlbWEubWluTGVuZ3RoLFxuICAgICAgICAgICAgbWF4TGVuZ3RoOiBwcm9wZXJ0eVNjaGVtYS5tYXhMZW5ndGgsXG4gICAgICAgICAgICBwYXR0ZXJuOiBwcm9wZXJ0eVNjaGVtYS5wYXR0ZXJuID8gbmV3IFJlZ0V4cChwcm9wZXJ0eVNjaGVtYS5wYXR0ZXJuLnNsaWNlKDEsIC0xKSkgOiB1bmRlZmluZWRcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHByb3BlcnR5VHlwZSA9PT0gJ3RleHRhcmVhJyAmJiBvcHRzPy50ZXh0YXJlYVJvd3MgIT0gbnVsbCkge1xuICAgICAgICAgICAgZmllbGQud2l0aFRleHRhcmVhUm93cyhvcHRzLnRleHRhcmVhUm93cyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb3BlcnR5VHlwZSAhPT0gJ3RleHRhcmVhJyAmJiBwcm9wZXJ0eVNjaGVtYS5pc0VtYWlsKSB7XG4gICAgICAgICAgICBmaWVsZC53aXRoVGV4dFZhbGlkYXRpb25FbWFpbCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2V0RmllbGRCYXNpY09wdGlvbnNGcm9tU2NoZW1hKGZpZWxkLCBwcm9wZXJ0eVNjaGVtYSk7XG5cbiAgICByZXR1cm4gZmllbGQ7XG59XG5cbi8qKlxuICogPGVtPkV4cGVyaW1lbnRhbDo8L2VtPiBBZGRzIGEgZmllbGQgZW51bSBsb29rdXAgdG8gZWRpdG9yIGRlc2NyaXB0b3IgYmFzZWQgb24gdGhlIGdpdmVuIHNjaGVtYSBwcm9wZXJ0eSBhbmQgb3B0aW9ucy5cbiAqXG4gKiBAZXhwZXJpbWVudGFsXG4gKlxuICogQHBhcmFtIHtUYWJsZXZpZXdEZXNjcmlwdG9ySW5zdDxNb2RlbCwgYW55LCBhbnksIFBhcmVudD4gfCBFZGl0b3JEZXNjcmlwdG9ySW5zdDxNb2RlbCwgUGFyZW50Pn0gZGVzY3JpcHRvciAtIERlc2NyaXB0b3IgdG8gYWRkIGZpZWxkIHRvLlxuICogQHBhcmFtIHtrZXlvZiBNb2RlbH0gcHJvcGVydHkgLSBUaGUgcHJvcGVydHkgb2YgdGhlIG1vZGVsLlxuICogQHBhcmFtIHtTY2hlbWFFbnVtPEVudW0+IHwgRW51bURlc2NyaXB0b3I8RW51bT59IGVudW1PcHQgLSBUaGUgZW51bSBzY2hlbWEgb3IgZW51bSBtb2RlbCBkZXNjcmlwdG9yLlxuICogQHBhcmFtIHtTY2hlbWFQcm9wZXJ0eX0gcHJvcGVydHlTY2hlbWEgLSBUaGUgcHJvcGVydHkncyBzY2hlbWEgZm9yIHRoZSBmaWVsZC5cbiAqXG4gKiBAcmV0dXJucyB7RmllbGRMb29rdXBFbnVtPEVudW0+fSAtIFRoZSBmaWVsZCB3aXRoIGVudW1lcmF0aW9uIHZhbHVlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZEZpZWxkRW51bUxvb2t1cEZyb21TY2hlbWE8XG4gICAgTW9kZWwsXG4gICAgUGFyZW50ID0gdW5rbm93bixcbiAgICBBZGRNb2RlbCA9IE1vZGVsLFxuICAgIEVkaXRNb2RlbCA9IE1vZGVsLFxuICAgIEZpZWxkc01vZGVsID0gVGFibGV2aWV3RGVzY3JpcHRvckZpZWxkc01hbmFnZU11bHRpVHlwZTxNb2RlbCwgQWRkTW9kZWwsIEVkaXRNb2RlbD4sXG4gICAgRW51bSA9IGFueVxuPihcbiAgICBkZXNjcmlwdG9yOiBUYWJsZXZpZXdEZXNjcmlwdG9ySW5zdDxNb2RlbCwgYW55LCBhbnksIFBhcmVudCwgYW55LCBBZGRNb2RlbCwgRWRpdE1vZGVsLCBGaWVsZHNNb2RlbD4gfCBFZGl0b3JEZXNjcmlwdG9ySW5zdDxGaWVsZHNNb2RlbCwgUGFyZW50PixcbiAgICBwcm9wZXJ0eToga2V5b2YgRmllbGRzTW9kZWwsXG4gICAgZW51bU9wdDogU2NoZW1hRW51bTxFbnVtPiB8IEVudW1EZXNjcmlwdG9yPEVudW0+LFxuICAgIHByb3BlcnR5U2NoZW1hOiBTY2hlbWFQcm9wZXJ0eVxuKSB7XG4gICAgY29uc3QgZW51bURlc2NyaXB0b3IgPSBlbnVtT3B0IGluc3RhbmNlb2YgRW51bURlc2NyaXB0b3IgPyBlbnVtT3B0IDogZW51bU1vZGVsRnJvbVNjaGVtYShlbnVtT3B0KTtcbiAgICBjb25zdCBmaWVsZCA9IGRlc2NyaXB0b3IuYWRkRmllbGRMb29rdXBFbnVtVW5zYWZlPEVudW0+KHByb3BlcnR5IGFzIHN0cmluZywgZW51bURlc2NyaXB0b3IpO1xuICAgIHNldEZpZWxkQmFzaWNPcHRpb25zRnJvbVNjaGVtYShmaWVsZCwgcHJvcGVydHlTY2hlbWEpO1xuICAgIHJldHVybiBmaWVsZDtcbn1cblxuLyoqXG4gKiA8ZW0+RXhwZXJpbWVudGFsOjwvZW0+IFNldHMgYmFzaWMgb3B0aW9ucyBmb3IgYSBmaWVsZCBiYXNlZCBvbiBhIGdpdmVuIHByb3BlcnR5IHNjaGVtYS5cbiAqXG4gKiBAcGFyYW0ge0FGaWVsZERlc2NyaXB0b3I8RmllbGRNb2RlbCwgRWRpdG9yTW9kZWwsIEZpZWxkVmFsdWUsIFBhcmVudEVkaXRvck1vZGVsPn0gZmllbGQgLSBUaGUgZmllbGQgdG8gc2V0IG9wdGlvbnMgZm9yLlxuICogQHBhcmFtIHtTY2hlbWFQcm9wZXJ0eX0gcHJvcGVydHlTY2hlbWEgLSBUaGUgcHJvcGVydHkgc2NoZW1hIHRvIGJhc2UgdGhlIG9wdGlvbnMgb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRGaWVsZEJhc2ljT3B0aW9uc0Zyb21TY2hlbWE8RmllbGRNb2RlbCA9IGFueSwgRWRpdG9yTW9kZWwgPSBhbnksIEZpZWxkVmFsdWUgPSBGaWVsZE1vZGVsLCBQYXJlbnRFZGl0b3JNb2RlbCA9IHVuZGVmaW5lZD4oXG4gICAgZmllbGQ6IEFGaWVsZERlc2NyaXB0b3I8RmllbGRNb2RlbCwgRWRpdG9yTW9kZWwsIEZpZWxkVmFsdWUsIFBhcmVudEVkaXRvck1vZGVsPixcbiAgICBwcm9wZXJ0eVNjaGVtYTogU2NoZW1hUHJvcGVydHlcbik6IHZvaWQge1xuICAgIGlmIChwcm9wZXJ0eVNjaGVtYS5yZXF1aXJlZCkgZmllbGQud2l0aFJlcXVpcmVkKCk7XG4gICAgaWYgKHByb3BlcnR5U2NoZW1hLmlzUmVhZE9ubHkpIGZpZWxkLndpdGhEaXNhYmxlZCgpO1xufVxuIl19