kwikid-forms 0.1.8 → 0.1.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/bundles/kwikid-forms.umd.js +405 -878
  2. package/bundles/kwikid-forms.umd.js.map +1 -1
  3. package/esm2015/lib/renderer/form-view/definitions/form-view.actions.definition.js +21 -0
  4. package/esm2015/lib/renderer/form-view/definitions/form-view.apis.definition.js +8 -0
  5. package/esm2015/lib/renderer/form-view/definitions/form-view.commons.definition.js +8 -0
  6. package/esm2015/lib/renderer/form-view/definitions/form-view.fields.definition.js +16 -0
  7. package/esm2015/lib/renderer/form-view/definitions/form-view.form-validations.definition.js +2 -0
  8. package/esm2015/lib/renderer/form-view/definitions/form-view.triggers.definition.js +2 -0
  9. package/esm2015/lib/renderer/form-view/form-view.component.js +101 -93
  10. package/esm2015/lib/renderer/form-view/form-view.service.js +14 -7
  11. package/esm2015/lib/renderer/form-view/helpers/form-view.apis.helper.js +29 -79
  12. package/esm2015/lib/renderer/form-view/helpers/form-view.defaults.helper.js +17 -15
  13. package/esm2015/lib/renderer/form-view/helpers/form-view.fields.helper.js +43 -59
  14. package/esm2015/lib/renderer/form-view/helpers/form-view.form-validations.helper.js +101 -0
  15. package/esm2015/lib/renderer/renderer.component.js +8 -7
  16. package/esm2015/lib/renderer/renderer.config-converter.helper.js +5 -5
  17. package/esm2015/lib/renderer/renderer.service.js +11 -14
  18. package/fesm2015/kwikid-forms.js +289 -675
  19. package/fesm2015/kwikid-forms.js.map +1 -1
  20. package/lib/renderer/form-view/definitions/{actions/form-view.actions.type.definitions.d.ts → form-view.actions.definition.d.ts} +21 -9
  21. package/lib/renderer/form-view/definitions/{apis/form-view.apis.type.definitions.d.ts → form-view.apis.definition.d.ts} +7 -3
  22. package/lib/renderer/form-view/definitions/form-view.commons.definition.d.ts +11 -0
  23. package/lib/renderer/form-view/definitions/{fields/form-view.fields.type.definitions.d.ts → form-view.fields.definition.d.ts} +19 -6
  24. package/lib/renderer/form-view/definitions/form-view.form-validations.definition.d.ts +8 -0
  25. package/lib/renderer/form-view/definitions/{triggers/form-view.triggers.type.definitions.d.ts → form-view.triggers.definition.d.ts} +0 -0
  26. package/lib/renderer/form-view/form-view.component.d.ts +3 -3
  27. package/lib/renderer/form-view/helpers/form-view.apis.helper.d.ts +7 -10
  28. package/lib/renderer/form-view/helpers/form-view.defaults.helper.d.ts +3 -3
  29. package/lib/renderer/form-view/helpers/form-view.fields.helper.d.ts +12 -17
  30. package/lib/renderer/form-view/helpers/form-view.form-validations.helper.d.ts +10 -0
  31. package/package.json +2 -2
  32. package/esm2015/lib/renderer/form-view/definitions/actions/form-view.actions.enum.definitions.js +0 -21
  33. package/esm2015/lib/renderer/form-view/definitions/actions/form-view.actions.type.definitions.js +0 -2
  34. package/esm2015/lib/renderer/form-view/definitions/apis/form-view.apis.enum.definitions.js +0 -8
  35. package/esm2015/lib/renderer/form-view/definitions/apis/form-view.apis.type.definitions.js +0 -2
  36. package/esm2015/lib/renderer/form-view/definitions/common/form-view.common.enum.definitions.js +0 -101
  37. package/esm2015/lib/renderer/form-view/definitions/common/form-view.common.type.definitions.js +0 -2
  38. package/esm2015/lib/renderer/form-view/definitions/fields/form-view.fields.enum.definitions.js +0 -16
  39. package/esm2015/lib/renderer/form-view/definitions/fields/form-view.fields.type.definitions.js +0 -2
  40. package/esm2015/lib/renderer/form-view/definitions/sources/form-view.sources.type.definitions.js +0 -2
  41. package/esm2015/lib/renderer/form-view/definitions/triggers/form-view.triggers.type.definitions.js +0 -2
  42. package/esm2015/lib/renderer/form-view/definitions/validations/form-view.validations.type.definitions.js +0 -2
  43. package/esm2015/lib/renderer/form-view/helpers/form-view.common.helper.js +0 -136
  44. package/esm2015/lib/renderer/form-view/helpers/form-view.validations.helper.js +0 -170
  45. package/esm2015/lib/renderer/renderer.helper.js +0 -50
  46. package/lib/renderer/form-view/definitions/actions/form-view.actions.enum.definitions.d.ts +0 -19
  47. package/lib/renderer/form-view/definitions/apis/form-view.apis.enum.definitions.d.ts +0 -6
  48. package/lib/renderer/form-view/definitions/common/form-view.common.enum.definitions.d.ts +0 -97
  49. package/lib/renderer/form-view/definitions/common/form-view.common.type.definitions.d.ts +0 -7
  50. package/lib/renderer/form-view/definitions/fields/form-view.fields.enum.definitions.d.ts +0 -14
  51. package/lib/renderer/form-view/definitions/sources/form-view.sources.type.definitions.d.ts +0 -16
  52. package/lib/renderer/form-view/definitions/validations/form-view.validations.type.definitions.d.ts +0 -16
  53. package/lib/renderer/form-view/helpers/form-view.common.helper.d.ts +0 -19
  54. package/lib/renderer/form-view/helpers/form-view.validations.helper.d.ts +0 -28
  55. package/lib/renderer/renderer.helper.d.ts +0 -6
@@ -3,18 +3,15 @@ import { Component, EventEmitter, Inject, Input, Output } from "@angular/core";
3
3
  import { FormGroup } from "@angular/forms";
4
4
  import { TuiAlertService } from "@taiga-ui/core";
5
5
  import { TuiPushService } from "@taiga-ui/kit";
6
- import { Actions, checkObjectKeyExists, Condition, getObjectValueFromPath, isEmptyValue, isNotEmptyValue, isUndefined, logMethod, replaceString, Rules, Sources } from "kwikid-toolkit";
6
+ import { Action, checkObjectKeyExists, Condition, getObjectValueFromPath, isEmptyValue, isNotEmptyValue, isUndefined, logMethod, replaceString, Rule, Source, Validation } from "kwikid-toolkit";
7
7
  import { pairwise } from "rxjs/operators";
8
- import { EActionKey } from "./definitions/actions/form-view.actions.enum.definitions";
9
- import { EApiStatusType } from "./definitions/apis/form-view.apis.enum.definitions";
10
- import { EMessageType } from "./definitions/common/form-view.common.enum.definitions";
11
- import { EFieldType } from "./definitions/fields/form-view.fields.enum.definitions";
8
+ import { EActionKey } from "./definitions/form-view.actions.definition";
9
+ import { EApiStatusType } from "./definitions/form-view.apis.definition";
10
+ import { EMessageType } from "./definitions/form-view.commons.definition";
12
11
  import { KwikIDFormViewService } from "./form-view.service";
13
12
  import { Apis } from "./helpers/form-view.apis.helper";
14
- import { setEmptyValue } from "./helpers/form-view.common.helper";
15
- import { Defaults } from "./helpers/form-view.defaults.helper";
16
- import { addMessage, convertValueFromKwikUIFormatToBasicFormat, findFieldFromKey, findFieldIndexFromKey, highlightFieldError, removeMessage, setFieldError } from "./helpers/form-view.fields.helper";
17
- import { Validations } from "./helpers/form-view.validations.helper";
13
+ import { appendFormFieldMessage, convertFormFieldEmptyValueToKwikUIFormat, convertFormFieldValueToStandardFormat, getFormFieldByKey, getFormFieldIndexByKey, highlightFormFieldError, removeFormFieldMessage, showFormFieldError } from "./helpers/form-view.fields.helper";
14
+ import { FormValidation } from "./helpers/form-view.form-validations.helper";
18
15
  import * as i0 from "@angular/core";
19
16
  import * as i1 from "./form-view.service";
20
17
  import * as i2 from "kwikui";
@@ -69,10 +66,16 @@ export class KwikIDFormViewComponent {
69
66
  this.formGroup.patchValue({
70
67
  [this.apiCallResponse.key]: this.apiCallResponse.response
71
68
  }, { emitEvent: false });
72
- let field = findFieldFromKey(this.formFields, this.apiCallResponse.key);
73
- const apis = new Apis(field, this.formFields, this.formData, this.previousFormData, this.allFormsData, this.takeAction.bind(this));
69
+ let field = getFormFieldByKey(this.formFields, this.apiCallResponse.key);
70
+ const apis = new Apis({
71
+ FIELD_CONFIG: field,
72
+ FORM_FIELDS: this.formFields,
73
+ FORM_DATA: this.formData,
74
+ PREVIOUS_FORM_DATA: this.previousFormData,
75
+ ALL_FORMS_DATA: this.allFormsData
76
+ }, this.takeAction.bind(this));
74
77
  (() => __awaiter(this, void 0, void 0, function* () {
75
- field = yield apis.validateApiCallResponse();
78
+ field = yield apis.validateResponse();
76
79
  }))();
77
80
  }
78
81
  if (verifyChange("isMobileView")) {
@@ -103,34 +106,30 @@ export class KwikIDFormViewComponent {
103
106
  this.formGroup.controls[field.key].valueChanges
104
107
  .pipe(pairwise())
105
108
  .subscribe(([previousValue, currentValue]) => {
106
- this.previousFormData = Object.assign(Object.assign({}, this.previousFormData), { [field.key]: previousValue });
107
- this.formData = Object.assign(Object.assign({}, this.formData), { [field.key]: currentValue });
109
+ this.previousFormData = Object.assign(Object.assign({}, this.previousFormData), { [field.key]: convertFormFieldValueToStandardFormat(field, previousValue) });
110
+ this.formData = Object.assign(Object.assign({}, this.formData), { [field.key]: convertFormFieldValueToStandardFormat(field, currentValue) });
108
111
  });
109
112
  }
110
113
  }
111
114
  for (let field of this.formFields) {
112
115
  if (field.isFormElement) {
113
116
  if (field.validation.triggers.includes("ON_INIT")) {
114
- const validations = new Validations(field, this.formFields, this.formData, this.previousFormData, this.allFormsData, this.takeAction.bind(this));
117
+ const validations = new Validation({
118
+ FIELD_CONFIG: field,
119
+ FORM_FIELDS: this.formFields,
120
+ FORM_DATA: this.formData,
121
+ PREVIOUS_FORM_DATA: this.previousFormData,
122
+ ALL_FORMS_DATA: this.allFormsData
123
+ }, this.takeAction.bind(this));
115
124
  (() => __awaiter(this, void 0, void 0, function* () {
116
- yield validations.validateField();
125
+ yield validations.validate(field.validation);
117
126
  }))();
118
127
  }
119
128
  if (checkObjectKeyExists(field, "connectedElements")) {
120
- if (checkObjectKeyExists(field.connectedElements, "connectedFields")) {
121
- this.handleConnectedElements({
122
- key: field.key,
123
- value: this.formGroup.controls[field.key].value
124
- }, "ON_INIT");
125
- }
126
- }
127
- if (checkObjectKeyExists(field, "default")) {
128
- if (checkObjectKeyExists(field.default, "options")) {
129
- if (field.default.options.triggers.includes("ON_INIT")) {
130
- const defaults = new Defaults(field, this.formFields, this.allFormsData, this.formData, this.previousFormData, this.takeAction);
131
- yield defaults.getDefaultDropdownOptions();
132
- }
133
- }
129
+ this.handleConnectedElements({
130
+ key: field.key,
131
+ value: this.formGroup.controls[field.key].value
132
+ }, "ON_INIT");
134
133
  }
135
134
  }
136
135
  }
@@ -159,7 +158,7 @@ export class KwikIDFormViewComponent {
159
158
  handleConnectedElementFieldGroupActions(childFieldGroupConfig, parentField) {
160
159
  return __awaiter(this, void 0, void 0, function* () {
161
160
  if (checkObjectKeyExists(childFieldGroupConfig, "rules")) {
162
- const rulesMapping = new Rules(childFieldGroupConfig.rules, {
161
+ const rulesMapping = new Rule(childFieldGroupConfig.rules, {
163
162
  FIELD_CONFIG: parentField,
164
163
  FORM_DATA: this.formData,
165
164
  PREVIOUS_FORM_DATA: this.previousFormData,
@@ -168,7 +167,7 @@ export class KwikIDFormViewComponent {
168
167
  for (let action of childFieldGroupConfig.actions) {
169
168
  const conditionSuccess = new Condition(action.condition, rulesMapping).evaluate();
170
169
  if (conditionSuccess) {
171
- const actions = new Actions(action, rulesMapping, {
170
+ const actions = new Action(action, rulesMapping, {
172
171
  FIELD_CONFIG: parentField,
173
172
  FORM_FIELDS: this.formFields,
174
173
  FORM_DATA: this.formData,
@@ -193,7 +192,7 @@ export class KwikIDFormViewComponent {
193
192
  handleConnectedElementFieldActions(connectedFieldConfig, connectedField) {
194
193
  return __awaiter(this, void 0, void 0, function* () {
195
194
  if (checkObjectKeyExists(connectedFieldConfig, "rules")) {
196
- const rulesMapping = new Rules(connectedFieldConfig.rules, {
195
+ const rulesMapping = new Rule(connectedFieldConfig.rules, {
197
196
  FIELD_CONFIG: connectedField,
198
197
  FORM_DATA: this.formData,
199
198
  PREVIOUS_FORM_DATA: this.previousFormData,
@@ -202,7 +201,7 @@ export class KwikIDFormViewComponent {
202
201
  for (let action of connectedFieldConfig.actions) {
203
202
  const conditionSuccess = new Condition(action.condition, rulesMapping).evaluate();
204
203
  if (conditionSuccess) {
205
- const actions = new Actions(action, rulesMapping, {
204
+ const actions = new Action(action, rulesMapping, {
206
205
  FORM_FIELDS: this.formFields,
207
206
  FIELD_CONFIG: connectedField,
208
207
  FORM_DATA: this.formData,
@@ -218,7 +217,7 @@ export class KwikIDFormViewComponent {
218
217
  }
219
218
  handleConnectedElementFields(currentField, connectedFieldConfig, eventType, nested) {
220
219
  return __awaiter(this, void 0, void 0, function* () {
221
- let connectedField = findFieldFromKey(this.formFields, connectedFieldConfig["key"]);
220
+ let connectedField = getFormFieldByKey(this.formFields, connectedFieldConfig["key"]);
222
221
  if (checkObjectKeyExists(connectedFieldConfig, "triggers")) {
223
222
  if (connectedFieldConfig.triggers.includes(eventType)) {
224
223
  connectedField = yield this.handleConnectedElementFieldActions(connectedFieldConfig, connectedField);
@@ -226,14 +225,7 @@ export class KwikIDFormViewComponent {
226
225
  }
227
226
  if (checkObjectKeyExists(connectedFieldConfig, "handleNestedFields")) {
228
227
  if (connectedFieldConfig.handleNestedFields) {
229
- if (checkObjectKeyExists(connectedField, "connectedElements")) {
230
- if (checkObjectKeyExists(connectedField.connectedElements, "connectedFields")) {
231
- for (const connectedFieldConfig of connectedField.connectedElements
232
- .connectedFields) {
233
- connectedField = this.handleConnectedElementFields(connectedField, connectedFieldConfig, eventType, "NESTED");
234
- }
235
- }
236
- }
228
+ this.handleConnectedElements({ key: connectedFieldConfig.key }, eventType);
237
229
  }
238
230
  }
239
231
  return currentField;
@@ -241,7 +233,7 @@ export class KwikIDFormViewComponent {
241
233
  }
242
234
  handleConnectedElements(e, eventType) {
243
235
  return __awaiter(this, void 0, void 0, function* () {
244
- let currentField = findFieldFromKey(this.formFields, e.key);
236
+ let currentField = getFormFieldByKey(this.formFields, e.key);
245
237
  if (currentField !== undefined) {
246
238
  if (checkObjectKeyExists(currentField, "connectedElements")) {
247
239
  if (checkObjectKeyExists(currentField.connectedElements, "connectedFieldGroups")) {
@@ -268,31 +260,35 @@ export class KwikIDFormViewComponent {
268
260
  this.formGroup.patchValue({
269
261
  [e.key]: e.value
270
262
  }, { emitEvent: false });
271
- // Currently set only for dropdown-with-search connected fields
272
- let field = findFieldFromKey(this.formFields, e.key);
263
+ const field = getFormFieldByKey(this.formFields, e.key);
264
+ this.formData[e.key] = convertFormFieldValueToStandardFormat(field, e.value);
273
265
  if (field.isFormElement &&
274
266
  field.validation.triggers.includes("ON_CHANGE")) {
275
- const validations = new Validations(field, this.formFields, this.formData, this.previousFormData, this.allFormsData, this.takeAction.bind(this));
267
+ const validations = new Validation({
268
+ FIELD_CONFIG: field,
269
+ FORM_FIELDS: this.formFields,
270
+ FORM_DATA: this.formData,
271
+ PREVIOUS_FORM_DATA: this.previousFormData,
272
+ ALL_FORMS_DATA: this.allFormsData
273
+ }, this.takeAction.bind(this));
276
274
  (() => __awaiter(this, void 0, void 0, function* () {
277
- yield validations.validateField();
275
+ yield validations.validate(field.validation);
278
276
  }))();
279
277
  }
280
278
  if (field.isFormElement &&
281
279
  checkObjectKeyExists(field, "connectedElements")) {
282
- if (checkObjectKeyExists(field.connectedElements, "connectedFields")) {
283
- this.handleConnectedElements({
284
- key: field.key,
285
- value: this.formGroup.controls[field.key].value
286
- }, "ON_CHANGE");
287
- }
280
+ this.handleConnectedElements({
281
+ key: field.key,
282
+ value: this.formGroup.controls[field.key].value
283
+ }, "ON_CHANGE");
288
284
  }
289
285
  }
290
286
  handleOnClickResetFormFields(e, field) {
291
287
  return __awaiter(this, void 0, void 0, function* () {
292
288
  for (let f of field.reset.fields) {
293
289
  for (let action of f.actions) {
294
- const resetField = findFieldFromKey(this.formFields, action.props.fieldKey);
295
- const actions = new Actions(action, {}, {
290
+ const resetField = getFormFieldByKey(this.formFields, action.props.fieldKey);
291
+ const actions = new Action(action, {}, {
296
292
  FIELD_CONFIG: resetField,
297
293
  FORM_FIELDS: this.formFields,
298
294
  FORM_DATA: this.formData,
@@ -306,7 +302,7 @@ export class KwikIDFormViewComponent {
306
302
  }
307
303
  handleOnClickApiCall(e) {
308
304
  return __awaiter(this, void 0, void 0, function* () {
309
- let field = findFieldFromKey(this.formFields, e.key);
305
+ let field = getFormFieldByKey(this.formFields, e.key);
310
306
  if (field.type === "api-call") {
311
307
  // set button status to loading
312
308
  field["api"]["status"]["value"] = EApiStatusType.LOADING;
@@ -315,8 +311,14 @@ export class KwikIDFormViewComponent {
315
311
  this.viewFormsButton["showLoader"] = true;
316
312
  this.saveFormButton["disabled"] = true;
317
313
  this.saveFormButton["showLoader"] = true;
318
- const apis = new Apis(field, this.formFields, this.formData, this.previousFormData, this.allFormsData, this.takeAction.bind(this));
319
- field = yield apis.setRequestBodyParams();
314
+ const apis = new Apis({
315
+ FIELD_CONFIG: field,
316
+ FORM_FIELDS: this.formFields,
317
+ FORM_DATA: this.formData,
318
+ PREVIOUS_FORM_DATA: this.previousFormData,
319
+ ALL_FORMS_DATA: this.allFormsData
320
+ }, this.takeAction.bind(this));
321
+ field = yield apis.setRequestBody();
320
322
  field = yield apis.validateRequestBody();
321
323
  if (field.api.request.body.validation.is_valid) {
322
324
  // Call API Here
@@ -333,7 +335,7 @@ export class KwikIDFormViewComponent {
333
335
  else {
334
336
  // Request Body Validation Failed
335
337
  // Highlight Error in UI to User to Retry After Sometime.
336
- // Take Actions based on Validation
338
+ // Take Action based on Validation
337
339
  setTimeout(() => {
338
340
  field["api"]["status"]["value"] = EApiStatusType.FAILED;
339
341
  field["showLoader"] = false;
@@ -354,32 +356,38 @@ export class KwikIDFormViewComponent {
354
356
  handleOnClickSaveForm(e) {
355
357
  let formData = this.formGroup.getRawValue();
356
358
  for (let field of this.formFields) {
357
- if (field.type !== EFieldType.TITLE) {
359
+ if (field.isFormElement) {
358
360
  if (field.hidden) {
359
361
  delete formData[field.key];
360
362
  }
361
363
  else {
362
- formData[field.key] = convertValueFromKwikUIFormatToBasicFormat(field, formData[field.key]);
364
+ formData[field.key] = convertFormFieldValueToStandardFormat(field, formData[field.key]);
363
365
  }
364
366
  }
365
367
  }
366
368
  for (let field of this.formFields) {
367
- if (field.type !== EFieldType.TITLE &&
369
+ if (field.isFormElement &&
368
370
  field.validation.triggers.includes("ON_SAVE")) {
369
- const validations = new Validations(field, this.formFields, formData, this.previousFormData, this.allFormsData, this.takeAction.bind(this));
371
+ const validations = new Validation({
372
+ FIELD_CONFIG: field,
373
+ FORM_FIELDS: this.formFields,
374
+ FORM_DATA: this.formData,
375
+ PREVIOUS_FORM_DATA: this.previousFormData,
376
+ ALL_FORMS_DATA: this.allFormsData
377
+ }, this.takeAction.bind(this));
370
378
  (() => __awaiter(this, void 0, void 0, function* () {
371
- yield validations.validateField();
379
+ yield validations.validate(field.validation);
372
380
  }))();
373
381
  }
374
382
  }
375
383
  if (this.formGroup.invalid) {
376
- const controls = new Validations(undefined, this.formFields, formData, this.previousFormData, this.allFormsData, this.takeAction.bind(this)).findInvalidControlsRecursive(this.formGroup);
384
+ const controls = new FormValidation().getFormFieldsInvalidControls(this.formGroup);
377
385
  let firstFieldWithError = "";
378
386
  for (let control of controls) {
379
387
  if (control.invalid && isEmptyValue(firstFieldWithError)) {
380
388
  firstFieldWithError = control.key;
381
389
  }
382
- this.formFields = setFieldError(this.formFields, this.formGroup.controls[control.key].errors, control.key, control.invalid);
390
+ this.formFields = showFormFieldError(this.formFields, this.formGroup.controls[control.key].errors, control.key, control.invalid);
383
391
  }
384
392
  this.toggleErrorNotification(true);
385
393
  setTimeout(() => {
@@ -399,7 +407,7 @@ export class KwikIDFormViewComponent {
399
407
  }
400
408
  // Component Helpers
401
409
  fieldHide(fieldKey) {
402
- let field = findFieldFromKey(this.formFields, fieldKey);
410
+ let field = getFormFieldByKey(this.formFields, fieldKey);
403
411
  let fieldIndex = this.formFields.findIndex((_) => {
404
412
  return field.key === _.key;
405
413
  });
@@ -412,7 +420,7 @@ export class KwikIDFormViewComponent {
412
420
  }
413
421
  }
414
422
  fieldShow(fieldKey) {
415
- let field = findFieldFromKey(this.formFields, fieldKey);
423
+ let field = getFormFieldByKey(this.formFields, fieldKey);
416
424
  let fieldIndex = this.formFields.findIndex((_) => {
417
425
  return field.key === _.key;
418
426
  });
@@ -425,11 +433,11 @@ export class KwikIDFormViewComponent {
425
433
  }
426
434
  }
427
435
  fieldDisable(fieldKey) {
428
- let field = findFieldFromKey(this.formFields, fieldKey);
436
+ let field = getFormFieldByKey(this.formFields, fieldKey);
429
437
  let fieldIndex = this.formFields.findIndex((_) => {
430
438
  return field.key === _.key;
431
439
  });
432
- if (field.type !== EFieldType.TITLE) {
440
+ if (field.isFormElement) {
433
441
  this.formFields[fieldIndex]["disabled"] = true;
434
442
  if (isNotEmptyValue(this.formGroup.controls)) {
435
443
  this.formGroup.controls[field.key].disable({
@@ -445,11 +453,11 @@ export class KwikIDFormViewComponent {
445
453
  }
446
454
  }
447
455
  fieldEnable(fieldKey) {
448
- let field = findFieldFromKey(this.formFields, fieldKey);
456
+ let field = getFormFieldByKey(this.formFields, fieldKey);
449
457
  let fieldIndex = this.formFields.findIndex((_) => {
450
458
  return field.key === _.key;
451
459
  });
452
- if (field.type !== EFieldType.TITLE) {
460
+ if (field.isFormElement) {
453
461
  this.formFields[fieldIndex]["disabled"] = false;
454
462
  if (isNotEmptyValue(this.formGroup.controls)) {
455
463
  this.formGroup.controls[field.key].enable({
@@ -466,20 +474,20 @@ export class KwikIDFormViewComponent {
466
474
  }
467
475
  fieldReset(fieldKey) {
468
476
  // Find the field and its index in the formFields array
469
- let field = findFieldFromKey(this.formFields, fieldKey);
470
- let fieldIndex = findFieldIndexFromKey(this.formFields, fieldKey);
477
+ let field = getFormFieldByKey(this.formFields, fieldKey);
478
+ let fieldIndex = getFormFieldIndexByKey(this.formFields, fieldKey);
471
479
  // Delete the field from the formData object
472
480
  delete this.formData[fieldKey];
473
481
  // Reset the value of the field in the formGroup
474
- this.formGroup.controls[field.key].reset(setEmptyValue(field), {
482
+ this.formGroup.controls[field.key].reset(convertFormFieldEmptyValueToKwikUIFormat(field), {
475
483
  emitEvent: false
476
484
  });
477
485
  // Reset the messages and errors for the field
478
- field = removeMessage(field, {
486
+ field = removeFormFieldMessage(field, {
479
487
  type: EMessageType.WARNING,
480
488
  message: ""
481
489
  });
482
- field = removeMessage(field, {
490
+ field = removeFormFieldMessage(field, {
483
491
  type: EMessageType.SUCCESS,
484
492
  message: ""
485
493
  });
@@ -502,37 +510,37 @@ export class KwikIDFormViewComponent {
502
510
  }
503
511
  }
504
512
  fieldErrorShow(fieldKey, message) {
505
- let field = findFieldFromKey(this.formFields, fieldKey);
513
+ let field = getFormFieldByKey(this.formFields, fieldKey);
506
514
  let fieldIndex = this.formFields.findIndex((_) => {
507
515
  return field.key === _.key;
508
516
  });
509
- field = highlightFieldError(field, true);
510
- field = addMessage(field, message);
517
+ field = highlightFormFieldError(field, true);
518
+ field = appendFormFieldMessage(field, message);
511
519
  this.formFields[fieldIndex] = field;
512
520
  }
513
521
  fieldErrorHide(fieldKey, message) {
514
- let field = findFieldFromKey(this.formFields, fieldKey);
522
+ let field = getFormFieldByKey(this.formFields, fieldKey);
515
523
  let fieldIndex = this.formFields.findIndex((_) => {
516
524
  return field.key === _.key;
517
525
  });
518
- field = highlightFieldError(field, false);
519
- field = removeMessage(field, message);
526
+ field = highlightFormFieldError(field, false);
527
+ field = removeFormFieldMessage(field, message);
520
528
  this.formFields[fieldIndex] = field;
521
529
  }
522
530
  fieldMessageShow(fieldKey, message) {
523
- let field = findFieldFromKey(this.formFields, fieldKey);
531
+ let field = getFormFieldByKey(this.formFields, fieldKey);
524
532
  let fieldIndex = this.formFields.findIndex((_) => {
525
533
  return field.key === _.key;
526
534
  });
527
- field = addMessage(field, message);
535
+ field = appendFormFieldMessage(field, message);
528
536
  this.formFields[fieldIndex] = field;
529
537
  }
530
538
  fieldMessageHide(fieldKey, message) {
531
- let field = findFieldFromKey(this.formFields, fieldKey);
539
+ let field = getFormFieldByKey(this.formFields, fieldKey);
532
540
  let fieldIndex = this.formFields.findIndex((_) => {
533
541
  return field.key === _.key;
534
542
  });
535
- field = removeMessage(field, message);
543
+ field = removeFormFieldMessage(field, message);
536
544
  this.formFields[fieldIndex] = field;
537
545
  }
538
546
  setObjectValue(field, path, value) { }
@@ -558,7 +566,7 @@ export class KwikIDFormViewComponent {
558
566
  getFormGroupRawValues() {
559
567
  return this.formGroup.getRawValue();
560
568
  }
561
- takeActionOnFieldGroup(action, field, allFormsData, formData, previousFormData) {
569
+ takeActionOnFieldGroup(action, object) {
562
570
  return __awaiter(this, void 0, void 0, function* () {
563
571
  switch (action.key) {
564
572
  case EActionKey.FIELD_GROUP_HIDE:
@@ -609,7 +617,7 @@ export class KwikIDFormViewComponent {
609
617
  this.fieldMessageHide(action.props.fieldKey, action.props.message);
610
618
  break;
611
619
  case EActionKey.SET_VALUE:
612
- const setValue_Sources = new Sources(object);
620
+ const setValue_Sources = new Source(object);
613
621
  const sourceValue = yield setValue_Sources.getValueFromSource(action.props.value.source);
614
622
  setValue_Sources.setValueToSource(action.props.value.destination, sourceValue);
615
623
  object.FIELD_CONFIG = setValue_Sources.object.FIELD_CONFIG;
@@ -619,7 +627,7 @@ export class KwikIDFormViewComponent {
619
627
  this.previousFormData = setValue_Sources.object.PREVIOUS_FORM_DATA;
620
628
  break;
621
629
  case EActionKey.SET_DROPDOWN_OPTIONS:
622
- const setDropdownValue_Sources = new Sources(object);
630
+ const setDropdownValue_Sources = new Source(object);
623
631
  let dropdownValue = yield setDropdownValue_Sources.getValueFromSource(action.props.value.source);
624
632
  if (checkObjectKeyExists(action.props, "options")) {
625
633
  if (checkObjectKeyExists(action.props.options, "appendToPath")) {
@@ -642,7 +650,7 @@ export class KwikIDFormViewComponent {
642
650
  setDropdownValue_Sources.object.PREVIOUS_FORM_DATA;
643
651
  break;
644
652
  case EActionKey.HANDLE_CONNECTED_ELEMENTS:
645
- this.handleConnectedElements({ key: action.props.fieldKey }, "ACTION");
653
+ this.handleConnectedElements({ key: action.props.fieldKey }, "ON_ACTION");
646
654
  break;
647
655
  case EActionKey.CUSTOM:
648
656
  break;
@@ -806,4 +814,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImpo
806
814
  }], getActiveFormData: [{
807
815
  type: Output
808
816
  }], ngOnInit: [], ngAfterViewInit: [], ngOnChanges: [], initFormConfig: [], setFormFieldsFromFormConfig: [], setFormFieldGroupsFromFormConfig: [], setFormDataFromAllFormsData: [], handleConnectedElementFieldGroupActions: [], handleConnectedElementFieldGroup: [], handleConnectedElementFieldActions: [], handleConnectedElementFields: [], handleConnectedElements: [], handleGetKeyValue: [], handleOnClickResetFormFields: [], handleOnClickApiCall: [], handleOnClickViewForms: [], handleOnClickSaveForm: [], toggleErrorNotification: [], fieldHide: [], fieldGroupHide: [], fieldShow: [], fieldGroupShow: [], fieldDisable: [], fieldGroupDisable: [], fieldEnable: [], fieldGroupEnable: [], fieldReset: [], fieldErrorShow: [], fieldErrorHide: [], fieldMessageShow: [], fieldMessageHide: [], setObjectValue: [], patchFieldControlValue: [], patchFormGroup: [], isFieldValid: [], isFieldEnabled: [], getFormGroupRawValues: [], takeActionOnFieldGroup: [], takeAction: [] } });
809
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS12aWV3LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2t3aWtpZC1mb3Jtcy9zcmMvbGliL3JlbmRlcmVyL2Zvcm0tdmlldy9mb3JtLXZpZXcuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva3dpa2lkLWZvcm1zL3NyYy9saWIvcmVuZGVyZXIvZm9ybS12aWV3L2Zvcm0tdmlldy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUVMLFNBQVMsRUFDVCxZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFFTCxNQUFNLEVBRVAsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQy9DLE9BQU8sRUFDTCxPQUFPLEVBQ1Asb0JBQW9CLEVBQ3BCLFNBQVMsRUFDVCxzQkFBc0IsRUFDdEIsWUFBWSxFQUNaLGVBQWUsRUFDZixXQUFXLEVBQ1gsU0FBUyxFQUNULGFBQWEsRUFDYixLQUFLLEVBQ0wsT0FBTyxFQUVSLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzFDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwwREFBMEQsQ0FBQztBQUN0RixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sb0RBQW9ELENBQUM7QUFDcEYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHdEQUF3RCxDQUFDO0FBRXRGLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx3REFBd0QsQ0FBQztBQU1wRixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDdkQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUMvRCxPQUFPLEVBQ0wsVUFBVSxFQUNWLHlDQUF5QyxFQUN6QyxnQkFBZ0IsRUFDaEIscUJBQXFCLEVBQ3JCLG1CQUFtQixFQUNuQixhQUFhLEVBQ2IsYUFBYSxFQUNkLE1BQU0sbUNBQW1DLENBQUM7QUFDM0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHdDQUF3QyxDQUFDOzs7Ozs7Ozs7QUFRckUsTUFBTSxPQUFPLHVCQUF1QjtJQStDbEMsWUFDNkMsSUFBb0IsRUFDbkIsS0FBc0IsRUFDMUQsZUFBc0M7UUFGSCxTQUFJLEdBQUosSUFBSSxDQUFnQjtRQUNuQixVQUFLLEdBQUwsS0FBSyxDQUFpQjtRQUMxRCxvQkFBZSxHQUFmLGVBQWUsQ0FBdUI7UUExQ2hELG9CQUFlLEdBQVEsRUFBRSxDQUFDO1FBRzFCLGlCQUFZLEdBQVksS0FBSyxDQUFDO1FBUzlCLHFCQUFnQixHQUFzQixJQUFJLFlBQVksRUFBTyxDQUFDO1FBRzlELG9CQUFlLEdBQXNCLElBQUksWUFBWSxFQUFPLENBQUM7UUFHN0QsbUJBQWMsR0FBc0IsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUc1RCxzQkFBaUIsR0FBc0IsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUUvRCxnQkFBVyxHQUFRLEVBQUUsQ0FBQztRQUN0QixlQUFVLEdBQVUsRUFBRSxDQUFDO1FBQ3ZCLHFCQUFnQixHQUFRLEVBQUUsQ0FBQztRQUUzQixZQUFPLEdBQVksSUFBSSxDQUFDO1FBQ3hCLG9CQUFlLEdBQUc7WUFDaEIsUUFBUSxFQUFFLEtBQUs7WUFDZixVQUFVLEVBQUUsS0FBSztTQUNsQixDQUFDO1FBQ0YsbUJBQWMsR0FBRztZQUNmLFFBQVEsRUFBRSxLQUFLO1lBQ2YsVUFBVSxFQUFFLEtBQUs7U0FDbEIsQ0FBQztRQUVGLGNBQVMsR0FBYyxJQUFJLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQWlsQnpDLDBCQUFxQixHQUFZLEtBQUssQ0FBQztJQTNrQnBDLENBQUM7SUFHSixRQUFRO1FBQ04sQ0FBQyxHQUFTLEVBQUU7WUFDVixNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBRTNDLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1FBQ3ZCLENBQUMsQ0FBQSxDQUFDLEVBQUUsQ0FBQztJQUNQLENBQUM7SUFHRCxlQUFlLEtBQVUsQ0FBQztJQUcxQixXQUFXLENBQUMsT0FBc0I7UUFDaEMsTUFBTSxZQUFZLEdBQUcsQ0FBQyxHQUFXLEVBQUUsRUFBRTtZQUNuQyxPQUFPLG9CQUFvQixDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxXQUFXLENBQUM7UUFDekUsQ0FBQyxDQUFDO1FBQ0YsSUFBSSxZQUFZLENBQUMsVUFBVSxDQUFDLEVBQUU7WUFDNUIsSUFBSSxDQUFDLFFBQVEsbUNBQ1IsSUFBSSxDQUFDLFFBQVEsR0FDYixPQUFPLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FDakMsQ0FBQztTQUNIO1FBQ0QsSUFBSSxZQUFZLENBQUMsaUJBQWlCLENBQUMsRUFBRTtZQUNuQyxJQUFJLENBQUMsZUFBZSxHQUFHLE9BQU8sQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDO1lBRTVELElBQUksQ0FBQyxRQUFRLG1DQUNSLElBQUksQ0FBQyxRQUFRLEtBQ2hCLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsR0FDMUQsQ0FBQztZQUVGLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUN2QjtnQkFDRSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRO2FBQzFELEVBQ0QsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQ3JCLENBQUM7WUFFRixJQUFJLEtBQUssR0FBa0IsZ0JBQWdCLENBQ3pDLElBQUksQ0FBQyxVQUFVLEVBQ2YsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQ3pCLENBQUM7WUFFRixNQUFNLElBQUksR0FBRyxJQUFJLElBQUksQ0FDbkIsS0FBSyxFQUNMLElBQUksQ0FBQyxVQUFVLEVBQ2YsSUFBSSxDQUFDLFFBQVEsRUFDYixJQUFJLENBQUMsZ0JBQWdCLEVBQ3JCLElBQUksQ0FBQyxZQUFZLEVBQ2pCLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUMzQixDQUFDO1lBRUYsQ0FBQyxHQUFTLEVBQUU7Z0JBQ1YsS0FBSyxHQUFHLE1BQU0sSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7WUFDL0MsQ0FBQyxDQUFBLENBQUMsRUFBRSxDQUFDO1NBQ047UUFDRCxJQUFJLFlBQVksQ0FBQyxjQUFjLENBQUMsRUFBRTtZQUNoQyxJQUFJLENBQUMsWUFBWSxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDO1NBQ3ZEO1FBQ0QsSUFBSSxZQUFZLENBQUMsY0FBYyxDQUFDLEVBQUU7WUFDaEMsSUFBSSxDQUFDLFlBQVksR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQztTQUN2RDtRQUNELElBQUksWUFBWSxDQUFDLFdBQVcsQ0FBQyxFQUFFO1lBQzdCLElBQUksQ0FBQyxTQUFTLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUM7U0FDakQ7UUFDRCxJQUFJLFlBQVksQ0FBQyxZQUFZLENBQUMsRUFBRTtZQUM5QixJQUFJLENBQUMsVUFBVSxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDO1lBRWxELENBQUMsR0FBUyxFQUFFO2dCQUNWLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDN0MsQ0FBQyxDQUFBLENBQUMsRUFBRSxDQUFDO1NBQ047SUFDSCxDQUFDO0lBR0ssY0FBYyxDQUFDLFVBQWU7O1lBQ2xDLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUU3QyxJQUFJLENBQUMsZ0NBQWdDLENBQUMsVUFBVSxDQUFDLENBQUM7WUFFbEQsSUFBSSxDQUFDLDJCQUEyQixFQUFFLENBQUM7WUFFbkMsSUFBSSxDQUFDLFNBQVMsR0FBRyxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsZUFBZSxDQUN6RCxJQUFJLENBQUMsVUFBVSxFQUNmLElBQUksQ0FBQyxRQUFRLEVBQ2IsSUFBSSxDQUFDLGdCQUFnQixFQUNyQixJQUFJLENBQUMsWUFBWSxFQUNqQixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FDM0IsQ0FBQztZQUVGLEtBQUssSUFBSSxLQUFLLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtnQkFDakMsSUFBSSxLQUFLLENBQUMsYUFBYSxFQUFFO29CQUN2QixJQUFJLENBQUMsZ0JBQWdCLG1DQUNoQixJQUFJLENBQUMsZ0JBQWdCLEtBQ3hCLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEdBQ3RELENBQUM7b0JBRUYsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFlBQVk7eUJBQzVDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQzt5QkFDaEIsU0FBUyxDQUFDLENBQUMsQ0FBQyxhQUFhLEVBQUUsWUFBWSxDQUFDLEVBQUUsRUFBRTt3QkFDM0MsSUFBSSxDQUFDLGdCQUFnQixtQ0FDaEIsSUFBSSxDQUFDLGdCQUFnQixLQUN4QixDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxhQUFhLEdBQzNCLENBQUM7d0JBRUYsSUFBSSxDQUFDLFFBQVEsbUNBQ1IsSUFBSSxDQUFDLFFBQVEsS0FDaEIsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsWUFBWSxHQUMxQixDQUFDO29CQUNKLENBQUMsQ0FBQyxDQUFDO2lCQUNOO2FBQ0Y7WUFDRCxLQUFLLElBQUksS0FBSyxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7Z0JBQ2pDLElBQUksS0FBSyxDQUFDLGFBQWEsRUFBRTtvQkFDdkIsSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEVBQUU7d0JBQ2pELE1BQU0sV0FBVyxHQUFHLElBQUksV0FBVyxDQUNqQyxLQUFLLEVBQ0wsSUFBSSxDQUFDLFVBQVUsRUFDZixJQUFJLENBQUMsUUFBUSxFQUNiLElBQUksQ0FBQyxnQkFBZ0IsRUFDckIsSUFBSSxDQUFDLFlBQVksRUFDakIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQzNCLENBQUM7d0JBRUYsQ0FBQyxHQUFTLEVBQUU7NEJBQ1YsTUFBTSxXQUFXLENBQUMsYUFBYSxFQUFFLENBQUM7d0JBQ3BDLENBQUMsQ0FBQSxDQUFDLEVBQUUsQ0FBQztxQkFDTjtvQkFDRCxJQUFJLG9CQUFvQixDQUFDLEtBQUssRUFBRSxtQkFBbUIsQ0FBQyxFQUFFO3dCQUNwRCxJQUNFLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxpQkFBaUIsQ0FBQyxFQUNoRTs0QkFDQSxJQUFJLENBQUMsdUJBQXVCLENBQzFCO2dDQUNFLEdBQUcsRUFBRSxLQUFLLENBQUMsR0FBRztnQ0FDZCxLQUFLLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUs7NkJBQ2hELEVBQ0QsU0FBUyxDQUNWLENBQUM7eUJBQ0g7cUJBQ0Y7b0JBQ0QsSUFBSSxvQkFBb0IsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLEVBQUU7d0JBQzFDLElBQUksb0JBQW9CLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsRUFBRTs0QkFDbEQsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxFQUFFO2dDQUN0RCxNQUFNLFFBQVEsR0FBRyxJQUFJLFFBQVEsQ0FDM0IsS0FBSyxFQUNMLElBQUksQ0FBQyxVQUFVLEVBQ2YsSUFBSSxDQUFDLFlBQVksRUFDakIsSUFBSSxDQUFDLFFBQVEsRUFDYixJQUFJLENBQUMsZ0JBQWdCLEVBQ3JCLElBQUksQ0FBQyxVQUFVLENBQ2hCLENBQUM7Z0NBRUYsTUFBTSxRQUFRLENBQUMseUJBQXlCLEVBQUUsQ0FBQzs2QkFDNUM7eUJBQ0Y7cUJBQ0Y7aUJBQ0Y7YUFDRjtRQUNILENBQUM7S0FBQTtJQUdELDJCQUEyQixDQUFDLFVBQWU7UUFDekMsSUFBSSxvQkFBb0IsQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLEVBQUU7WUFDOUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDO1NBQ3JDO2FBQU0sSUFDTCxvQkFBb0IsQ0FBQyxVQUFVLEVBQUUsV0FBVyxDQUFDO1lBQzdDLG9CQUFvQixDQUFDLFVBQVUsQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLEVBQ3BEO1lBQ0EsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQztTQUMvQztJQUNILENBQUM7SUFHRCxnQ0FBZ0MsQ0FBQyxVQUFlO1FBQzlDLElBQUksQ0FBQyxXQUFXLEdBQUcsVUFBVSxDQUFDLFdBQVcsQ0FBQztJQUM1QyxDQUFDO0lBR0QsMkJBQTJCO1FBQ3pCLElBQUksb0JBQW9CLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ2hFLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ3hEO2FBQU07WUFDTCxJQUFJLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQztTQUNwQjtJQUNILENBQUM7SUFHSyx1Q0FBdUMsQ0FDM0MscUJBQTBCLEVBQzFCLFdBQWdCOztZQUVoQixJQUFJLG9CQUFvQixDQUFDLHFCQUFxQixFQUFFLE9BQU8sQ0FBQyxFQUFFO2dCQUN4RCxNQUFNLFlBQVksR0FBRyxJQUFJLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLEVBQUU7b0JBQzFELFlBQVksRUFBRSxXQUFXO29CQUN6QixTQUFTLEVBQUUsSUFBSSxDQUFDLFFBQVE7b0JBQ3hCLGtCQUFrQixFQUFFLElBQUksQ0FBQyxnQkFBZ0I7b0JBQ3pDLGNBQWMsRUFBRSxJQUFJLENBQUMsWUFBWTtpQkFDbEMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUViLEtBQUssSUFBSSxNQUFNLElBQUkscUJBQXFCLENBQUMsT0FBTyxFQUFFO29CQUNoRCxNQUFNLGdCQUFnQixHQUFHLElBQUksU0FBUyxDQUNwQyxNQUFNLENBQUMsU0FBUyxFQUNoQixZQUFZLENBQ2IsQ0FBQyxRQUFRLEVBQUUsQ0FBQztvQkFFYixJQUFJLGdCQUFnQixFQUFFO3dCQUNwQixNQUFNLE9BQU8sR0FBRyxJQUFJLE9BQU8sQ0FDekIsTUFBTSxFQUNOLFlBQVksRUFDWjs0QkFDRSxZQUFZLEVBQUUsV0FBVzs0QkFDekIsV0FBVyxFQUFFLElBQUksQ0FBQyxVQUFVOzRCQUM1QixTQUFTLEVBQUUsSUFBSSxDQUFDLFFBQVE7NEJBQ3hCLGtCQUFrQixFQUFFLElBQUksQ0FBQyxnQkFBZ0I7NEJBQ3pDLGNBQWMsRUFBRSxJQUFJLENBQUMsWUFBWTt5QkFDbEMsRUFDRCxJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUN2QyxDQUFDO3dCQUVGLE1BQU0sT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO3FCQUN6QjtpQkFDRjthQUNGO1FBQ0gsQ0FBQztLQUFBO0lBR0ssZ0NBQWdDLENBQ3BDLFlBQWlCLEVBQ2pCLHlCQUE4QixFQUM5QixTQUFpQjs7WUFFakIsSUFBSSxvQkFBb0IsQ0FBQyx5QkFBeUIsRUFBRSxVQUFVLENBQUMsRUFBRTtnQkFDL0QsSUFBSSx5QkFBeUIsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxFQUFFO29CQUMxRCxNQUFNLElBQUksQ0FBQyx1Q0FBdUMsQ0FDaEQseUJBQXlCLEVBQ3pCLFlBQVksQ0FDYixDQUFDO2lCQUNIO2FBQ0Y7UUFDSCxDQUFDO0tBQUE7SUFHSyxrQ0FBa0MsQ0FDdEMsb0JBQXlCLEVBQ3pCLGNBQW1COztZQUVuQixJQUFJLG9CQUFvQixDQUFDLG9CQUFvQixFQUFFLE9BQU8sQ0FBQyxFQUFFO2dCQUN2RCxNQUFNLFlBQVksR0FBRyxJQUFJLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLEVBQUU7b0JBQ3pELFlBQVksRUFBRSxjQUFjO29CQUM1QixTQUFTLEVBQUUsSUFBSSxDQUFDLFFBQVE7b0JBQ3hCLGtCQUFrQixFQUFFLElBQUksQ0FBQyxnQkFBZ0I7b0JBQ3pDLGNBQWMsRUFBRSxJQUFJLENBQUMsWUFBWTtpQkFDbEMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUViLEtBQUssSUFBSSxNQUFNLElBQUksb0JBQW9CLENBQUMsT0FBTyxFQUFFO29CQUMvQyxNQUFNLGdCQUFnQixHQUFHLElBQUksU0FBUyxDQUNwQyxNQUFNLENBQUMsU0FBUyxFQUNoQixZQUFZLENBQ2IsQ0FBQyxRQUFRLEVBQUUsQ0FBQztvQkFFYixJQUFJLGdCQUFnQixFQUFFO3dCQUNwQixNQUFNLE9BQU8sR0FBRyxJQUFJLE9BQU8sQ0FDekIsTUFBTSxFQUNOLFlBQVksRUFDWjs0QkFDRSxXQUFXLEVBQUUsSUFBSSxDQUFDLFVBQVU7NEJBQzVCLFlBQVksRUFBRSxjQUFjOzRCQUM1QixTQUFTLEVBQUUsSUFBSSxDQUFDLFFBQVE7NEJBQ3hCLGtCQUFrQixFQUFFLElBQUksQ0FBQyxnQkFBZ0I7NEJBQ3pDLGNBQWMsRUFBRSxJQUFJLENBQUMsWUFBWTt5QkFDbEMsRUFDRCxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FDM0IsQ0FBQzt3QkFFRixNQUFNLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztxQkFDekI7aUJBQ0Y7YUFDRjtZQUVELE9BQU8sY0FBYyxDQUFDO1FBQ3hCLENBQUM7S0FBQTtJQUdLLDRCQUE0QixDQUNoQyxZQUFpQixFQUNqQixvQkFBeUIsRUFDekIsU0FBaUIsRUFDakIsTUFBYzs7WUFFZCxJQUFJLGNBQWMsR0FBRyxnQkFBZ0IsQ0FDbkMsSUFBSSxDQUFDLFVBQVUsRUFDZixvQkFBb0IsQ0FBQyxLQUFLLENBQUMsQ0FDNUIsQ0FBQztZQUVGLElBQUksb0JBQW9CLENBQUMsb0JBQW9CLEVBQUUsVUFBVSxDQUFDLEVBQUU7Z0JBQzFELElBQUksb0JBQW9CLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsRUFBRTtvQkFDckQsY0FBYyxHQUFHLE1BQU0sSUFBSSxDQUFDLGtDQUFrQyxDQUM1RCxvQkFBb0IsRUFDcEIsY0FBYyxDQUNmLENBQUM7aUJBQ0g7YUFDRjtZQUNELElBQUksb0JBQW9CLENBQUMsb0JBQW9CLEVBQUUsb0JBQW9CLENBQUMsRUFBRTtnQkFDcEUsSUFBSSxvQkFBb0IsQ0FBQyxrQkFBa0IsRUFBRTtvQkFDM0MsSUFBSSxvQkFBb0IsQ0FBQyxjQUFjLEVBQUUsbUJBQW1CLENBQUMsRUFBRTt3QkFDN0QsSUFDRSxvQkFBb0IsQ0FDbEIsY0FBYyxDQUFDLGlCQUFpQixFQUNoQyxpQkFBaUIsQ0FDbEIsRUFDRDs0QkFDQSxLQUFLLE1BQU0sb0JBQW9CLElBQUksY0FBYyxDQUFDLGlCQUFpQjtpQ0FDaEUsZUFBZSxFQUFFO2dDQUNsQixjQUFjLEdBQUcsSUFBSSxDQUFDLDRCQUE0QixDQUNoRCxjQUFjLEVBQ2Qsb0JBQW9CLEVBQ3BCLFNBQVMsRUFDVCxRQUFRLENBQ1QsQ0FBQzs2QkFDSDt5QkFDRjtxQkFDRjtpQkFDRjthQUNGO1lBQ0QsT0FBTyxZQUFZLENBQUM7UUFDdEIsQ0FBQztLQUFBO0lBR0ssdUJBQXVCLENBQUMsQ0FBTSxFQUFFLFNBQWlCOztZQUNyRCxJQUFJLFlBQVksR0FBRyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUU1RCxJQUFJLFlBQVksS0FBSyxTQUFTLEVBQUU7Z0JBQzlCLElBQUksb0JBQW9CLENBQUMsWUFBWSxFQUFFLG1CQUFtQixDQUFDLEVBQUU7b0JBQzNELElBQ0Usb0JBQW9CLENBQ2xCLFlBQVksQ0FBQyxpQkFBaUIsRUFDOUIsc0JBQXNCLENBQ3ZCLEVBQ0Q7d0JBQ0EsSUFBSSxvQkFBb0IsR0FDdEIsWUFBWSxDQUFDLGlCQUFpQixDQUFDLG9CQUFvQixDQUFDO3dCQUN0RCxLQUFLLElBQUkseUJBQXlCLElBQUksb0JBQW9CLEVBQUU7NEJBQzFELE1BQU0sSUFBSSxDQUFDLGdDQUFnQyxDQUN6QyxZQUFZLEVBQ1oseUJBQXlCLEVBQ3pCLFNBQVMsQ0FDVixDQUFDO3lCQUNIO3FCQUNGO29CQUNELElBQ0Usb0JBQW9CLENBQ2xCLFlBQVksQ0FBQyxpQkFBaUIsRUFDOUIsaUJBQWlCLENBQ2xCLEVBQ0Q7d0JBQ0EsSUFBSSxlQUFlLEdBQUcsWUFBWSxDQUFDLGlCQUFpQixDQUFDLGVBQWUsQ0FBQzt3QkFDckUsS0FBSyxJQUFJLG9CQUFvQixJQUFJLGVBQWUsRUFBRTs0QkFDaEQsWUFBWSxHQUFHLE1BQU0sSUFBSSxDQUFDLDRCQUE0QixDQUNwRCxZQUFZLEVBQ1osb0JBQW9CLEVBQ3BCLFNBQVMsRUFDVCxTQUFTLENBQ1YsQ0FBQzt5QkFDSDtxQkFDRjtpQkFDRjthQUNGO2lCQUFNO2dCQUNMLE1BQU0sSUFBSSxLQUFLLENBQ2IsNkJBQTZCLENBQUMsQ0FBQyxHQUFHLG9DQUFvQyxTQUFTLElBQUksQ0FDcEYsQ0FBQzthQUNIO1FBQ0gsQ0FBQztLQUFBO0lBRUQscUJBQXFCO0lBRXJCLGlCQUFpQixDQUFDLENBQU07UUFDdEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQ3ZCO1lBQ0UsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUs7U0FDakIsRUFDRCxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FDckIsQ0FBQztRQUVGLCtEQUErRDtRQUMvRCxJQUFJLEtBQUssR0FBRyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUVyRCxJQUNFLEtBQUssQ0FBQyxhQUFhO1lBQ25CLEtBQUssQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsRUFDL0M7WUFDQSxNQUFNLFdBQVcsR0FBRyxJQUFJLFdBQVcsQ0FDakMsS0FBSyxFQUNMLElBQUksQ0FBQyxVQUFVLEVBQ2YsSUFBSSxDQUFDLFFBQVEsRUFDYixJQUFJLENBQUMsZ0JBQWdCLEVBQ3JCLElBQUksQ0FBQyxZQUFZLEVBQ2pCLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUMzQixDQUFDO1lBRUYsQ0FBQyxHQUFTLEVBQUU7Z0JBQ1YsTUFBTSxXQUFXLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDcEMsQ0FBQyxDQUFBLENBQUMsRUFBRSxDQUFDO1NBQ047UUFFRCxJQUNFLEtBQUssQ0FBQyxhQUFhO1lBQ25CLG9CQUFvQixDQUFDLEtBQUssRUFBRSxtQkFBbUIsQ0FBQyxFQUNoRDtZQUNBLElBQUksb0JBQW9CLENBQUMsS0FBSyxDQUFDLGlCQUFpQixFQUFFLGlCQUFpQixDQUFDLEVBQUU7Z0JBQ3BFLElBQUksQ0FBQyx1QkFBdUIsQ0FDMUI7b0JBQ0UsR0FBRyxFQUFFLEtBQUssQ0FBQyxHQUFHO29CQUNkLEtBQUssRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSztpQkFDaEQsRUFDRCxXQUFXLENBQ1osQ0FBQzthQUNIO1NBQ0Y7SUFDSCxDQUFDO0lBR0ssNEJBQTRCLENBQUMsQ0FBTSxFQUFFLEtBQWtCOztZQUMzRCxLQUFLLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFO2dCQUNoQyxLQUFLLElBQUksTUFBTSxJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUU7b0JBQzVCLE1BQU0sVUFBVSxHQUFHLGdCQUFnQixDQUNqQyxJQUFJLENBQUMsVUFBVSxFQUNmLE1BQU0sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUN0QixDQUFDO29CQUNGLE1BQU0sT0FBTyxHQUFHLElBQUksT0FBTyxDQUN6QixNQUFNLEVBQ04sRUFBRSxFQUNGO3dCQUNFLFlBQVksRUFBRSxVQUFVO3dCQUN4QixXQUFXLEVBQUUsSUFBSSxDQUFDLFVBQVU7d0JBQzVCLFNBQVMsRUFBRSxJQUFJLENBQUMsUUFBUTt3QkFDeEIsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLGdCQUFnQjt3QkFDekMsY0FBYyxFQUFFLElBQUksQ0FBQyxZQUFZO3FCQUNsQyxFQUNELElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUMzQixDQUFDO29CQUNGLE1BQU0sT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO2lCQUN6QjthQUNGO1FBQ0gsQ0FBQztLQUFBO0lBR0ssb0JBQW9CLENBQUMsQ0FBTTs7WUFDL0IsSUFBSSxLQUFLLEdBQWtCLGdCQUFnQixDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBRXBFLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxVQUFVLEVBQUU7Z0JBQzdCLCtCQUErQjtnQkFDL0IsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLGNBQWMsQ0FBQyxPQUFPLENBQUM7Z0JBQ3pELEtBQUssQ0FBQyxZQUFZLENBQUMsR0FBRyxJQUFJLENBQUM7Z0JBQzNCLElBQUksQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLEdBQUcsSUFBSSxDQUFDO2dCQUN4QyxJQUFJLENBQUMsZUFBZSxDQUFDLFlBQVksQ0FBQyxHQUFHLElBQUksQ0FBQztnQkFDMUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsR0FBRyxJQUFJLENBQUM7Z0JBQ3ZDLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLEdBQUcsSUFBSSxDQUFDO2dCQUV6QyxNQUFNLElBQUksR0FBRyxJQUFJLElBQUksQ0FDbkIsS0FBSyxFQUNMLElBQUksQ0FBQyxVQUFVLEVBQ2YsSUFBSSxDQUFDLFFBQVEsRUFDYixJQUFJLENBQUMsZ0JBQWdCLEVBQ3JCLElBQUksQ0FBQyxZQUFZLEVBQ2pCLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUMzQixDQUFDO2dCQUVGLEtBQUssR0FBRyxNQUFNLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO2dCQUUxQyxLQUFLLEdBQUcsTUFBTSxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztnQkFFekMsSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRTtvQkFDOUMsZ0JBQWdCO29CQUNoQixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQzt3QkFDdkIsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHO3dCQUNWLE9BQU8sRUFBRTs0QkFDUCxJQUFJLEVBQUUsTUFBTTs0QkFDWixJQUFJLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUs7NEJBQ2xDLE9BQU8sRUFBRSxFQUFFOzRCQUNYLEdBQUcsRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHO3lCQUMzQjtxQkFDRixDQUFDLENBQUM7aUJBQ0o7cUJBQU07b0JBQ0wsaUNBQWlDO29CQUNqQyx5REFBeUQ7b0JBQ3pELG1DQUFtQztvQkFDbkMsVUFBVSxDQUFDLEdBQUcsRUFBRTt3QkFDZCxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsY0FBYyxDQUFDLE1BQU0sQ0FBQzt3QkFDeEQsS0FBSyxDQUFDLFlBQVksQ0FBQyxHQUFHLEtBQUssQ0FBQztvQkFDOUIsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO2lCQUNUO2dCQUVELElBQUksQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLEdBQUcsS0FBSyxDQUFDO2dCQUN6QyxJQUFJLENBQUMsZUFBZSxDQUFDLFlBQVksQ0FBQyxHQUFHLEtBQUssQ0FBQztnQkFDM0MsSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsR0FBRyxLQUFLLENBQUM7Z0JBQ3hDLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLEdBQUcsS0FBSyxDQUFDO2FBQzNDO1FBQ0gsQ0FBQztLQUFBO0lBR0Qsc0JBQXNCLENBQUMsQ0FBTTtRQUMzQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDO1lBQ3pCLE9BQU8sRUFBRSxJQUFJO1NBQ2QsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUdELHFCQUFxQixDQUFDLENBQU07UUFDMUIsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUU1QyxLQUFLLElBQUksS0FBSyxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDakMsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLFVBQVUsQ0FBQyxLQUFLLEVBQUU7Z0JBQ25DLElBQUksS0FBSyxDQUFDLE1BQU0sRUFBRTtvQkFDaEIsT0FBTyxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2lCQUM1QjtxQkFBTTtvQkFDTCxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLHlDQUF5QyxDQUM3RCxLQUFLLEVBQ0wsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FDcEIsQ0FBQztpQkFDSDthQUNGO1NBQ0Y7UUFFRCxLQUFLLElBQUksS0FBSyxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDakMsSUFDRSxLQUFLLENBQUMsSUFBSSxLQUFLLFVBQVUsQ0FBQyxLQUFLO2dCQUMvQixLQUFLLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEVBQzdDO2dCQUNBLE1BQU0sV0FBVyxHQUFHLElBQUksV0FBVyxDQUNqQyxLQUFLLEVBQ0wsSUFBSSxDQUFDLFVBQVUsRUFDZixRQUFRLEVBQ1IsSUFBSSxDQUFDLGdCQUFnQixFQUNyQixJQUFJLENBQUMsWUFBWSxFQUNqQixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FDM0IsQ0FBQztnQkFFRixDQUFDLEdBQVMsRUFBRTtvQkFDVixNQUFNLFdBQVcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztnQkFDcEMsQ0FBQyxDQUFBLENBQUMsRUFBRSxDQUFDO2FBQ047U0FDRjtRQUVELElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUU7WUFDMUIsTUFBTSxRQUFRLEdBQUcsSUFBSSxXQUFXLENBQzlCLFNBQVMsRUFDVCxJQUFJLENBQUMsVUFBVSxFQUNmLFFBQVEsRUFDUixJQUFJLENBQUMsZ0JBQWdCLEVBQ3JCLElBQUksQ0FBQyxZQUFZLEVBQ2pCLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUMzQixDQUFDLDRCQUE0QixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUUvQyxJQUFJLG1CQUFtQixHQUFXLEVBQUUsQ0FBQztZQUVyQyxLQUFLLElBQUksT0FBTyxJQUFJLFFBQVEsRUFBRTtnQkFDNUIsSUFBSSxPQUFPLENBQUMsT0FBTyxJQUFJLFlBQVksQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFO29CQUN4RCxtQkFBbUIsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDO2lCQUNuQztnQkFDRCxJQUFJLENBQUMsVUFBVSxHQUFHLGFBQWEsQ0FDN0IsSUFBSSxDQUFDLFVBQVUsRUFDZixJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUMzQyxPQUFPLENBQUMsR0FBRyxFQUNYLE9BQU8sQ0FBQyxPQUFPLENBQ2hCLENBQUM7YUFDSDtZQUVELElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNuQyxVQUFVLENBQUMsR0FBRyxFQUFFO2dCQUNkLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN0QyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFFVCxPQUFPO1NBQ1I7UUFFRCxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQ2hDLElBQUksWUFBWSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFO2dCQUMvQixRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO2FBQ3BCO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO0lBQzdFLENBQUM7SUFJRCx1QkFBdUIsQ0FBQyxJQUFJO1FBQzFCLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLENBQUM7SUFDcEMsQ0FBQztJQUVELG9CQUFvQjtJQUVwQixTQUFTLENBQUMsUUFBZ0I7UUFDeEIsSUFBSSxLQUFLLEdBQUcsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUN4RCxJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFO1lBQ3BELE9BQU8sS0FBSyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDO1FBQzdCLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxJQUFJLENBQUM7UUFDN0MsSUFBSSxDQUFDLFNBQVMsQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO0lBQzFDLENBQUM7SUFHRCxjQUFjLENBQUMsVUFBa0I7UUFDL0IsS0FBSyxJQUFJLFFBQVEsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxFQUFFO1lBQ2pELElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDMUI7SUFDSCxDQUFDO0lBR0QsU0FBUyxDQUFDLFFBQWdCO1FBQ3hCLElBQUksS0FBSyxHQUFHLGdCQUFnQixDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDeEQsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRTtZQUNwRCxPQUFPLEtBQUssQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQztRQUM3QixDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQzlDLElBQUksQ0FBQyxTQUFTLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztJQUMxQyxDQUFDO0lBR0QsY0FBYyxDQUFDLFVBQWtCO1FBQy9CLEtBQUssSUFBSSxRQUFRLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsRUFBRTtZQUNqRCxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQzFCO0lBQ0gsQ0FBQztJQUdELFlBQVksQ0FBQyxRQUFnQjtRQUMzQixJQUFJLEtBQUssR0FBRyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3hELElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUU7WUFDcEQsT0FBTyxLQUFLLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUM7UUFDN0IsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssVUFBVSxDQUFDLEtBQUssRUFBRTtZQUNuQyxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxHQUFHLElBQUksQ0FBQztZQUUvQyxJQUFJLGVBQWUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxFQUFFO2dCQUM1QyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDO29CQUN6QyxTQUFTLEVBQUUsS0FBSztpQkFDakIsQ0FBQyxDQUFDO2FBQ0o7WUFDRCxJQUFJLENBQUMsU0FBUyxDQUFDLHNCQUFzQixFQUFFLENBQUM7U0FDekM7SUFDSCxDQUFDO0lBR0QsaUJBQWlCLENBQUMsVUFBa0I7UUFDbEMsS0FBSyxJQUFJLFFBQVEsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxFQUFFO1lBQ2pELElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDN0I7SUFDSCxDQUFDO0lBR0QsV0FBVyxDQUFDLFFBQWdCO1FBQzFCLElBQUksS0FBSyxHQUFHLGdCQUFnQixDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDeEQsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRTtZQUNwRCxPQUFPLEtBQUssQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQztRQUM3QixDQUFDLENBQUMsQ0FBQztRQUVILElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxVQUFVLENBQUMsS0FBSyxFQUFFO1lBQ25DLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUMsVUFBVSxDQUFDLEdBQUcsS0FBSyxDQUFDO1lBRWhELElBQUksZUFBZSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEVBQUU7Z0JBQzVDLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUM7b0JBQ3hDLFNBQVMsRUFBRSxLQUFLO2lCQUNqQixDQUFDLENBQUM7YUFDSjtZQUNELElBQUksQ0FBQyxTQUFTLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztTQUN6QztJQUNILENBQUM7SUFHRCxnQkFBZ0IsQ0FBQyxVQUFrQjtRQUNqQyxLQUFLLElBQUksUUFBUSxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLEVBQUU7WUFDakQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUM1QjtJQUNILENBQUM7SUFHRCxVQUFVLENBQUMsUUFBZ0I7UUFDekIsdURBQXVEO1FBQ3ZELElBQUksS0FBSyxHQUFHLGdCQUFnQixDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDeEQsSUFBSSxVQUFVLEdBQUcscUJBQXFCLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUVsRSw0Q0FBNEM7UUFDNUMsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRS9CLGdEQUFnRDtRQUNoRCxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUM3RCxTQUFTLEVBQUUsS0FBSztTQUNqQixDQUFDLENBQUM7UUFFSCw4Q0FBOEM7UUFDOUMsS0FBSyxHQUFHLGFBQWEsQ0FBQyxLQUFLLEVBQUU7WUFDM0IsSUFBSSxFQUFFLFlBQVksQ0FBQyxPQUFPO1lBQzFCLE9BQU8sRUFBRSxFQUFFO1NBQ1osQ0FBQyxDQUFDO1FBQ0gsS0FBSyxHQUFHLGFBQWEsQ0FBQyxLQUFLLEVBQUU7WUFDM0IsSUFBSSxFQUFFLFlBQVksQ0FBQyxPQUFPO1lBQzFCLE9BQU8sRUFBRSxFQUFFO1NBQ1osQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUU7WUFDNUIsSUFBSSxFQUFFLFlBQVksQ0FBQyxLQUFLO1lBQ3hCLE9BQU8sRUFBRSxFQUFFO1NBQ1osQ0FBQyxDQUFDO1FBRUgsdURBQXVEO1FBQ3ZELFFBQVEsS0FBSyxDQUFDLElBQUksRUFBRTtZQUNsQixLQUFLLFVBQVU7Z0JBQ2IsTUFBTSxZQUFZLEdBQUcsS0FBc0IsQ0FBQztnQkFDNUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxHQUFHLGNBQWMsQ0FBQyxPQUFPLENBQUM7Z0JBQ3ZELElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLEdBQUcsWUFBWSxDQUFDO2dCQUMzQyxNQUFNO1lBQ1I7Z0JBQ0UsS0FBSyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7Z0JBQ3BCLEtBQUssQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO2dCQUN0QixJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEtBQUssQ0FBQztnQkFDcEMsTUFBTTtTQUNUO0lBQ0gsQ0FBQztJQUdELGNBQWMsQ0FBQyxRQUFnQixFQUFFLE9BQWlCO1FBQ2hELElBQUksS0FBSyxHQUFHLGdCQUFnQixDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDeEQsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRTtZQUNwRCxPQUFPLEtBQUssQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQztRQUM3QixDQUFDLENBQUMsQ0FBQztRQUVILEtBQUssR0FBRyxtQkFBbUIsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDekMsS0FBSyxHQUFHLFVBQVUsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFFbkMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsR0FBRyxLQUFLLENBQUM7SUFDdEMsQ0FBQztJQUdELGNBQWMsQ0FBQyxRQUFnQixFQUFFLE9BQWlCO1FBQ2hELElBQUksS0FBSyxHQUFHLGdCQUFnQixDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDeEQsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRTtZQUNwRCxPQUFPLEtBQUssQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQztRQUM3QixDQUFDLENBQUMsQ0FBQztRQUVILEtBQUssR0FBRyxtQkFBbUIsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDMUMsS0FBSyxHQUFHLGFBQWEsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFFdEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsR0FBRyxLQUFLLENBQUM7SUFDdEMsQ0FBQztJQUdELGdCQUFnQixDQUFDLFFBQWdCLEVBQUUsT0FBaUI7UUFDbEQsSUFBSSxLQUFLLEdBQUcsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUN4RCxJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFO1lBQ3BELE9BQU8sS0FBSyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDO1FBQzdCLENBQUMsQ0FBQyxDQUFDO1FBRUgsS0FBSyxHQUFHLFVBQVUsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFFbkMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsR0FBRyxLQUFLLENBQUM7SUFDdEMsQ0FBQztJQUdELGdCQUFnQixDQUFDLFFBQWdCLEVBQUUsT0FBaUI7UUFDbEQsSUFBSSxLQUFLLEdBQUcsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUN4RCxJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFO1lBQ3BELE9BQU8sS0FBSyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDO1FBQzdCLENBQUMsQ0FBQyxDQUFDO1FBRUgsS0FBSyxHQUFHLGFBQWEsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFFdEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsR0FBRyxLQUFLLENBQUM7SUFDdEMsQ0FBQztJQUdELGNBQWMsQ0FBQyxLQUFVLEVBQUUsSUFBWSxFQUFFLEtBQVUsSUFBRyxDQUFDO0lBR3ZELHNCQUFzQixDQUFDLEdBQVcsRUFBRSxLQUFVO1FBQzVDLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUN2QjtZQUNFLENBQUMsR0FBRyxDQUFDLEVBQUUsS0FBSztTQUNiLEVBQ0QsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQ3JCLENBQUM7SUFDSixDQUFDO0lBR0QsY0FBYyxDQUFDLFFBQWE7UUFDMUIsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLFdBQVcsQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUN4RCxNQUFNLElBQUksS0FBSyxDQUFDLHVDQUF1QyxDQUFDLENBQUM7U0FDMUQ7YUFBTTtZQUNMLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1NBQzNEO0lBQ0gsQ0FBQztJQUdELFlBQVksQ0FBQyxRQUFnQjtRQUMzQixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUNqRCxDQUFDO0lBR0QsY0FBYyxDQUFDLFFBQWdCO1FBQzdCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxDQUFDO0lBQ25ELENBQUM7SUFHRCxxQkFBcUI7UUFDbkIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3RDLENBQUM7SUFHSyxzQkFBc0IsQ0FDMUIsTUFBZSxFQUNmLEtBQWEsRUFDYixZQUFpQixFQUNqQixRQUFhLEVBQ2IsZ0JBQXFCOztZQUVyQixRQUFRLE1BQU0sQ0FBQyxHQUFHLEVBQUU7Z0JBQ2xCLEtBQUssVUFBVSxDQUFDLGdCQUFnQjtvQkFDOUIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO29CQUMzQyxNQUFNO2dCQUNSLEtBQUssVUFBVSxDQUFDLGdCQUFnQjtvQkFDOUIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO29CQUMzQyxNQUFNO2dCQUNSLEtBQUssVUFBVSxDQUFDLGtCQUFrQjtvQkFDaEMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7b0JBQzdDLE1BQU07Z0JBQ1IsS0FBSyxVQUFVLENBQUMsbUJBQW1CO29CQUNqQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztvQkFDOUMsTUFBTTtnQkFDUjtvQkFDRSxNQUFNO2FBQ1Q7UUFDSCxDQUFDO0tBQUE7SUFHSyxVQUFVLENBQUMsTUFBZSxFQUFFLE1BQVc7O1lBQzNDLFFBQVEsTUFBTSxDQUFDLEdBQUcsRUFBRTtnQkFDbEIsS0FBSyxVQUFVLENBQUMsVUFBVTtvQkFDeEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO29CQUN0QyxNQUFNO2dCQUNSLEtBQUssVUFBVSxDQUFDLFVBQVU7b0JBQ3hCLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztvQkFDdEMsTUFBTTtnQkFDUixLQUFLLFVBQVUsQ0FBQyxhQUFhO29CQUMzQixJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7b0JBQ3pDLE1BQU07Z0JBQ1IsS0FBSyxVQUFVLENBQUMsWUFBWTtvQkFDMUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO29CQUN4QyxNQUFNO2dCQUNSLEtBQUssVUFBVSxDQUFDLFdBQVc7b0JBQ3pCLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztvQkFDdkMsTUFBTTtnQkFDUixLQUFLLFVBQVUsQ0FBQyxnQkFBZ0I7b0JBQzlCLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFDakUsTUFBTTtnQkFDUixLQUFLLFVBQVUsQ0FBQyxnQkFBZ0I7b0JBQzlCLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFDakUsTUFBTTtnQkFDUixLQUFLLFVBQVUsQ0FBQyxrQkFBa0I7b0JBQ2hDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO29CQUNuRSxNQUFNO2dCQUNSLEtBQUssVUFBVSxDQUFDLG1CQUFtQjtvQkFDakMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7b0JBQ25FLE1BQU07Z0JBQ1IsS0FBSyxVQUFVLENBQUMsU0FBUztvQkFDdkIsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztvQkFFN0MsTUFBTSxXQUFXLEdBQUcsTUFBTSxnQkFBZ0IsQ0FBQyxrQkFBa0IsQ0FDM0QsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUMxQixDQUFDO29CQUNGLGdCQUFnQixDQUFDLGdCQUFnQixDQUMvQixNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQzlCLFdBQVcsQ0FDWixDQUFDO29CQUVGLE1BQU0sQ0FBQyxZQUFZLEdBQUcsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQztvQkFDM0QsSUFBSSxDQUFDLFFBQVEsR0FBRyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDO29CQUNsRCxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztvQkFDbkMsSUFBSSxDQUFDLFlBQVksR0FBRyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDO29CQUMzRCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLGtCQUFrQixDQUFDO29CQUNuRSxNQUFNO2dCQUNSLEtBQUssVUFBVSxDQUFDLG9CQUFvQjtvQkFDbEMsTUFBTSx3QkFBd0IsR0FBRyxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztvQkFFckQsSUFBSSxhQUFhLEdBQUcsTUFBTSx3QkFBd0IsQ0FBQyxrQkFBa0IsQ0FDbkUsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUMxQixDQUFDO29CQUNGLElBQUksb0JBQW9CLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsRUFBRTt3QkFDakQsSUFBSSxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxjQUFjLENBQUMsRUFBRTs0QkFDOUQsSUFBSSxZQUFZLEdBQ2QsTUFBTSx3QkFBd0IsQ0FBQyxrQkFBa0IsQ0FDL0MsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FDekMsQ0FBQzs0QkFDSixJQUFJLGVBQWUsQ0FBQyxZQUFZLENBQUMsRUFBRTtnQ0FDakMsTUFBTSxlQUFlLEdBQUcsYUFBYSxDQUNuQyxZQUFZLENBQUMsS0FBSyxDQUNoQixHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxpQkFBaUIsRUFBRSxDQUN6RCxDQUFDLENBQUMsQ0FBQyxFQUNKLGVBQWUsRUFDZixHQUFHLENBQ0osQ0FBQztnQ0FFRixNQUFNLFdBQVcsR0FBRyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksR0FBRyxlQUFlLEVBQUUsQ0FBQztnQ0FDckUsYUFBYSxHQUFHLHNCQUFzQixDQUNwQyxhQUFhLEVBQ2IsV0FBVyxDQUNaLENBQUM7NkJBQ0g7eUJBQ0Y7NkJBQU07NEJBQ0wsYUFBYSxHQUFHLHNCQUFzQixDQUNwQyxhQUFhLEVBQ2IsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUMxQixDQUFDO3lCQUNIO3FCQUNGO29CQUVELHdCQUF3QixDQUFDLGdCQUFnQixDQUN2QyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQzlCLGFBQWEsQ0FDZCxDQUFDO29CQUVGLE1BQU0sQ0FBQyxZQUFZLEdBQUcsd0JBQXdCLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQztvQkFDbkUsSUFBSSxDQUFDLFFBQVEsR0FBRyx3QkFBd0IsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDO29CQUMxRCxJQUFJLENBQUMsWUFBWSxHQUFHLHdCQUF3QixDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUM7b0JBQ25FLElBQUksQ0FBQyxnQkFBZ0I7d0JBQ25CLHdCQUF3QixDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQztvQkFDckQsTUFBTTtnQkFDUixLQUFLLFVBQVUsQ0FBQyx5QkFBeUI7b0JBQ3ZDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxFQUFFLEdBQUcsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDO29CQUN2RSxNQUFNO2dCQUNSLEtBQUssVUFBVSxDQUFDLE1BQU07b0JBQ3BCLE1BQU07Z0JBQ1I7b0JBQ0UsTUFBTTthQUNUO1FBQ0gsQ0FBQztLQUFBOzt3SUE5OUJVLHVCQUF1QixrQkFnRHhCLGNBQWMsYUFDZCxlQUFlOzRIQWpEZCx1QkFBdUIsZ1lBRnZCLENBQUMscUJBQXFCLENBQUMsK0NDekRwQyw0NGRBd2FBO0FEdlRFO0lBREMsU0FBUzt1REFPVDtBQUdEO0lBREMsU0FBUzs4REFDZ0I7QUFHMUI7SUFEQyxTQUFTOzBEQTREVDtBQUdEO0lBREMsU0FBUzs2REFxRlQ7QUFHRDtJQURDLFNBQVM7MEVBVVQ7QUFHRDtJQURDLFNBQVM7K0VBR1Q7QUFHRDtJQURDLFNBQVM7MEVBT1Q7QUFHRDtJQURDLFNBQVM7c0ZBcUNUO0FBR0Q7SUFEQyxTQUFTOytFQWNUO0FBR0Q7SUFEQyxTQUFTO2lGQXVDVDtBQUdEO0lBREMsU0FBUzsyRUEyQ1Q7QUFHRDtJQURDLFNBQVM7c0VBNENUO0FBSUQ7SUFEQyxTQUFTO2dFQTRDVDtBQUdEO0lBREMsU0FBUzsyRUF1QlQ7QUFHRDtJQURDLFNBQVM7bUVBb0RUO0FBR0Q7SUFEQyxTQUFTO3FFQUtUO0FBR0Q7SUFEQyxTQUFTO29FQTRFVDtBQUlEO0lBREMsU0FBUztzRUFHVDtBQUlEO0lBREMsU0FBUzt3REFTVDtBQUdEO0lBREMsU0FBUzs2REFLVDtBQUdEO0lBREMsU0FBUzt3REFTVDtBQUdEO0lBREMsU0FBUzs2REFLVDtBQUdEO0lBREMsU0FBUzsyREFpQlQ7QUFHRDtJQURDLFNBQVM7Z0VBS1Q7QUFHRDtJQURDLFNBQVM7MERBaUJUO0FBR0Q7SUFEQyxTQUFTOytEQUtUO0FBR0Q7SUFEQyxTQUFTO3lEQXlDVDtBQUdEO0lBREMsU0FBUzs2REFXVDtBQUdEO0lBREMsU0FBUzs2REFXVDtBQUdEO0lBREMsU0FBUzsrREFVVDtBQUdEO0lBREMsU0FBUzsrREFVVDtBQUdEO0lBREMsU0FBUzs2REFDNkM7QUFHdkQ7SUFEQyxTQUFTO3FFQVFUO0FBR0Q7SUFEQyxTQUFTOzZEQU9UO0FBR0Q7SUFEQyxTQUFTOzJEQUdUO0FBR0Q7SUFEQyxTQUFTOzZEQUdUO0FBR0Q7SUFEQyxTQUFTO29FQUdUO0FBR0Q7SUFEQyxTQUFTO3FFQXdCVDtBQUdEO0lBREMsU0FBUzt5REFxR1Q7NEZBOTlCVSx1QkFBdUI7a0JBTm5DLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLGtCQUFrQjtvQkFDNUIsV0FBVyxFQUFFLDRCQUE0QjtvQkFDekMsU0FBUyxFQUFFLENBQUMsNEJBQTRCLENBQUM7b0JBQ3pDLFNBQVMsRUFBRSxDQUFDLHFCQUFxQixDQUFDO2lCQUNuQzs7MEJBaURJLE1BQU07MkJBQUMsY0FBYzs7MEJBQ3JCLE1BQU07MkJBQUMsZUFBZTtnRkEvQ3pCLFVBQVU7c0JBRFQsS0FBSztnQkFJTixRQUFRO3NCQURQLEtBQUs7Z0JBSU4sZUFBZTtzQkFEZCxLQUFLO2dCQUlOLFlBQVk7c0JBRFgsS0FBSztnQkFJTixZQUFZO3NCQURYLEtBQUs7Z0JBSU4sU0FBUztzQkFEUixLQUFLO2dCQUlOLGdCQUFnQjtzQkFEZixNQUFNO2dCQUlQLGVBQWU7c0JBRGQsTUFBTTtnQkFJUCxjQUFjO3NCQURiLE1BQU07Z0JBSVAsaUJBQWlCO3NCQURoQixNQUFNO2dCQTBCUCxRQUFRLE1BU1IsZUFBZSxNQUdmLFdBQVcsTUE4REwsY0FBYyxNQXVGcEIsMkJBQTJCLE1BWTNCLGdDQUFnQyxNQUtoQywyQkFBMkIsTUFTckIsdUNBQXVDLE1BdUN2QyxnQ0FBZ0MsTUFnQmhDLGtDQUFrQyxNQXlDbEMsNEJBQTRCLE1BNkM1Qix1QkFBdUIsTUErQzdCLGlCQUFpQixNQThDWCw0QkFBNEIsTUF5QjVCLG9CQUFvQixNQXNEMUIsc0JBQXNCLE1BT3RCLHFCQUFxQixNQStFckIsdUJBQXVCLE1BTXZCLFNBQVMsTUFXVCxjQUFjLE1BT2QsU0FBUyxNQVdULGNBQWMsTUFPZCxZQUFZLE1BbUJaLGlCQUFpQixNQU9qQixXQUFXLE1BbUJYLGdCQUFnQixNQU9oQixVQUFVLE1BMkNWLGNBQWMsTUFhZCxjQUFjLE1BYWQsZ0JBQWdCLE1BWWhCLGdCQUFnQixNQVloQixjQUFjLE1BR2Qsc0JBQXNCLE1BVXRCLGNBQWMsTUFTZCxZQUFZLE1BS1osY0FBYyxNQUtkLHFCQUFxQixNQUtmLHNCQUFzQixNQTBCdEIsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbmplY3QsXG4gIElucHV0LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlc1xufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgRm9ybUdyb3VwIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XG5pbXBvcnQgeyBUdWlBbGVydFNlcnZpY2UgfSBmcm9tIFwiQHRhaWdhLXVpL2NvcmVcIjtcbmltcG9ydCB7IFR1aVB1c2hTZXJ2aWNlIH0gZnJvbSBcIkB0YWlnYS11aS9raXRcIjtcbmltcG9ydCB7XG4gIEFjdGlvbnMsXG4gIGNoZWNrT2JqZWN0S2V5RXhpc3RzLFxuICBDb25kaXRpb24sXG4gIGdldE9iamVjdFZhbHVlRnJvbVBhdGgsXG4gIGlzRW1wdHlWYWx1ZSxcbiAgaXNOb3RFbXB0eVZhbHVlLFxuICBpc1VuZGVmaW5lZCxcbiAgbG9nTWV0aG9kLFxuICByZXBsYWNlU3RyaW5nLFxuICBSdWxlcyxcbiAgU291cmNlcyxcbiAgVEFjdGlvblxufSBmcm9tIFwia3dpa2lkLXRvb2xraXRcIjtcbmltcG9ydCB7IHBhaXJ3aXNlIH0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XG5pbXBvcnQgeyBFQWN0aW9uS2V5IH0gZnJvbSBcIi4vZGVmaW5pdGlvbnMvYWN0aW9ucy9mb3JtLXZpZXcuYWN0aW9ucy5lbnVtLmRlZmluaXRpb25zXCI7XG5pbXBvcnQgeyBFQXBpU3RhdHVzVHlwZSB9IGZyb20gXCIuL2RlZmluaXRpb25zL2FwaXMvZm9ybS12aWV3LmFwaXMuZW51bS5kZWZpbml0aW9uc1wiO1xuaW1wb3J0IHsgRU1lc3NhZ2VUeXBlIH0gZnJvbSBcIi4vZGVmaW5pdGlvbnMvY29tbW9uL2Zvcm0tdmlldy5jb21tb24uZW51bS5kZWZpbml0aW9uc1wiO1xuaW1wb3J0IHsgVE1lc3NhZ2UgfSBmcm9tIFwiLi9kZWZpbml0aW9ucy9jb21tb24vZm9ybS12aWV3LmNvbW1vbi50eXBlLmRlZmluaXRpb25zXCI7XG5pbXBvcnQgeyBFRmllbGRUeXBlIH0gZnJvbSBcIi4vZGVmaW5pdGlvbnMvZmllbGRzL2Zvcm0tdmlldy5maWVsZHMuZW51bS5kZWZpbml0aW9uc1wiO1xuaW1wb3J0IHtcbiAgVEZpZWxkLFxuICBURmllbGRBcGlDYWxsLFxuICBURmllbGRUaXRsZVxufSBmcm9tIFwiLi9kZWZpbml0aW9ucy9maWVsZHMvZm9ybS12aWV3LmZpZWxkcy50eXBlLmRlZmluaXRpb25zXCI7XG5pbXBvcnQgeyBLd2lrSURGb3JtVmlld1NlcnZpY2UgfSBmcm9tIFwiLi9mb3JtLXZpZXcuc2VydmljZVwiO1xuaW1wb3J0IHsgQXBpcyB9IGZyb20gXCIuL2hlbHBlcnMvZm9ybS12aWV3LmFwaXMuaGVscGVyXCI7XG5pbXBvcnQgeyBzZXRFbXB0eVZhbHVlIH0gZnJvbSBcIi4vaGVscGVycy9mb3JtLXZpZXcuY29tbW9uLmhlbHBlclwiO1xuaW1wb3J0IHsgRGVmYXVsdHMgfSBmcm9tIFwiLi9oZWxwZXJzL2Zvcm0tdmlldy5kZWZhdWx0cy5oZWxwZXJcIjtcbmltcG9ydCB7XG4gIGFkZE1lc3NhZ2UsXG4gIGNvbnZlcnRWYWx1ZUZyb21Ld2lrVUlGb3JtYXRUb0Jhc2ljRm9ybWF0LFxuICBmaW5kRmllbGRGcm9tS2V5LFxuICBmaW5kRmllbGRJbmRleEZyb21LZXksXG4gIGhpZ2hsaWdodEZpZWxkRXJyb3IsXG4gIHJlbW92ZU1lc3NhZ2UsXG4gIHNldEZpZWxkRXJyb3Jcbn0gZnJvbSBcIi4vaGVscGVycy9mb3JtLXZpZXcuZmllbGRzLmhlbHBlclwiO1xuaW1wb3J0IHsgVmFsaWRhdGlvbnMgfSBmcm9tIFwiLi9oZWxwZXJzL2Zvcm0tdmlldy52YWxpZGF0aW9ucy5oZWxwZXJcIjtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiBcImt3aWtpZC1mb3JtLXZpZXdcIixcbiAgdGVtcGxhdGVVcmw6IFwiLi9mb3JtLXZpZXcuY29tcG9uZW50Lmh0bWxcIixcbiAgc3R5bGVVcmxzOiBbXCIuL2Zvcm0tdmlldy5jb21wb25lbnQuc2Nzc1wiXSxcbiAgcHJvdmlkZXJzOiBbS3dpa0lERm9ybVZpZXdTZXJ2aWNlXVxufSlcbmV4cG9ydCBjbGFzcyBLd2lrSURGb3JtVmlld0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCB7XG4gIEBJbnB1dCgpXG4gIGZvcm1Db25maWc6IGFueTtcblxuICBASW5wdXQoKVxuICBmb3JtRGF0YTogYW55O1xuXG4gIEBJbnB1dCgpXG4gIGFwaUNhbGxSZXNwb25zZTogYW55ID0ge307XG5cbiAgQElucHV0KClcbiAgaXNNb2JpbGVWaWV3OiBib29sZWFuID0gZmFsc2U7XG5cbiAgQElucHV0KClcbiAgYWxsRm9ybXNEYXRhOiBhbnk7XG5cbiAgQElucHV0KClcbiAgZm9ybXNMaXN0OiBhbnlbXTtcblxuICBAT3V0cHV0KClcbiAgb25DbGlja1ZpZXdGb3JtczogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICBAT3V0cHV0KClcbiAgb25DbGlja1NhdmVGb3JtOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gIEBPdXRwdXQoKVxuICBvbkNsaWNrQXBpQ2FsbDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICBAT3V0cHV0KClcbiAgZ2V0QWN0aXZlRm9ybURhdGE6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgZmllbGRHcm91cHM6IGFueSA9IHt9O1xuICBmb3JtRmllbGRzOiBhbnlbXSA9IFtdO1xuICBwcmV2aW91c0Zvcm1EYXRhOiBhbnkgPSB7fTtcblxuICBsb2FkaW5nOiBib29sZWFuID0gdHJ1ZTtcbiAgdmlld0Zvcm1zQnV0dG9uID0ge1xuICAgIGRpc2FibGVkOiBmYWxzZSxcbiAgICBzaG93TG9hZGVyOiBmYWxzZVxuICB9O1xuICBzYXZlRm9ybUJ1dHRvbiA9IHtcbiAgICBkaXNhYmxlZDogZmFsc2UsXG4gICAgc2hvd0xvYWRlcjogZmFsc2VcbiAgfTtcblxuICBmb3JtR3JvdXA6IEZvcm1Hcm91cCA9IG5ldyBGb3JtR3JvdXAoe30pO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoVHVpUHVzaFNlcnZpY2UpIHByb3RlY3RlZCByZWFkb25seSBwdXNoOiBUdWlQdXNoU2VydmljZSxcbiAgICBASW5qZWN0KFR1aUFsZXJ0U2VydmljZSkgcHJvdGVjdGVkIHJlYWRvbmx5IGFsZXJ0OiBUdWlBbGVydFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBmb3JtVmlld1NlcnZpY2U6IEt3aWtJREZvcm1WaWV3U2VydmljZVxuICApIHt9XG5cbiAgQGxvZ01ldGhvZFxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgdGhpcy5pbml0Rm9ybUNvbmZpZyh0aGlzLmZvcm1Db25maWcpO1xuXG4gICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICB9KSgpO1xuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7fVxuXG4gIEBsb2dNZXRob2RcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGNvbnN0IHZlcmlmeUNoYW5nZSA9IChrZXk6IHN0cmluZykgPT4ge1xuICAgICAgcmV0dXJuIGNoZWNrT2JqZWN0S2V5RXhpc3RzKGNoYW5nZXMsIGtleSkgJiYgIWNoYW5nZXNba2V5XS5maXJzdENoYW5nZTtcbiAgICB9O1xuICAgIGlmICh2ZXJpZnlDaGFuZ2UoXCJmb3JtRGF0YVwiKSkge1xuICAgICAgdGhpcy5mb3JtRGF0YSA9IHtcbiAgICAgICAgLi4udGhpcy5mb3JtRGF0YSxcbiAgICAgICAgLi4uY2hhbmdlcy5mb3JtRGF0YS5jdXJyZW50VmFsdWVcbiAgICAgIH07XG4gICAgfVxuICAgIGlmICh2ZXJpZnlDaGFuZ2UoXCJhcGlDYWxsUmVzcG9uc2VcIikpIHtcbiAgICAgIHRoaXMuYXBpQ2FsbFJlc3BvbnNlID0gY2hhbmdlcy5hcGlDYWxsUmVzcG9uc2UuY3VycmVudFZhbHVlO1xuXG4gICAgICB0aGlzLmZvcm1EYXRhID0ge1xuICAgICAgICAuLi50aGlzLmZvcm1EYXRhLFxuICAgICAgICBbdGhpcy5hcGlDYWxsUmVzcG9uc2Uua2V5XTogdGhpcy5hcGlDYWxsUmVzcG9uc2UucmVzcG9uc2VcbiAgICAgIH07XG5cbiAgICAgIHRoaXMuZm9ybUdyb3VwLnBhdGNoVmFsdWUoXG4gICAgICAgIHtcbiAgICAgICAgICBbdGhpcy5hcGlDYWxsUmVzcG9uc2Uua2V5XTogdGhpcy5hcGlDYWxsUmVzcG9uc2UucmVzcG9uc2VcbiAgICAgICAgfSxcbiAgICAgICAgeyBlbWl0RXZlbnQ6IGZhbHNlIH1cbiAgICAgICk7XG5cbiAgICAgIGxldCBmaWVsZDogVEZpZWxkQXBpQ2FsbCA9IGZpbmRGaWVsZEZyb21LZXkoXG4gICAgICAgIHRoaXMuZm9ybUZpZWxkcyxcbiAgICAgICAgdGhpcy5hcGlDYWxsUmVzcG9uc2Uua2V5XG4gICAgICApO1xuXG4gICAgICBjb25zdCBhcGlzID0gbmV3IEFwaXMoXG4gICAgICAgIGZpZWxkLFxuICAgICAgICB0aGlzLmZvcm1GaWVsZHMsXG4gICAgICAgIHRoaXMuZm9ybURhdGEsXG4gICAgICAgIHRoaXMucHJldmlvdXNGb3JtRGF0YSxcbiAgICAgICAgdGhpcy5hbGxGb3Jtc0RhdGEsXG4gICAgICAgIHRoaXMudGFrZUFjdGlvbi5iaW5kKHRoaXMpXG4gICAgICApO1xuXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBmaWVsZCA9IGF3YWl0IGFwaXMudmFsaWRhdGVBcGlDYWxsUmVzcG9uc2UoKTtcbiAgICAgIH0pKCk7XG4gICAgfVxuICAgIGlmICh2ZXJpZnlDaGFuZ2UoXCJpc01vYmlsZVZpZXdcIikpIHtcbiAgICAgIHRoaXMuaXNNb2JpbGVWaWV3ID0gY2hhbmdlcy5pc01vYmlsZVZpZXcuY3VycmVudFZhbHVlO1xuICAgIH1cbiAgICBpZiAodmVyaWZ5Q2hhbmdlKFwiYWxsRm9ybXNEYXRhXCIpKSB7XG4gICAgICB0aGlzLmFsbEZvcm1zRGF0YSA9IGNoYW5nZXMuYWxsRm9ybXNEYXRhLmN1cnJlbnRWYWx1ZTtcbiAgICB9XG4gICAgaWYgKHZlcmlmeUNoYW5nZShcImZvcm1zTGlzdFwiKSkge1xuICAgICAgdGhpcy5mb3Jtc0xpc3QgPSBjaGFuZ2VzLmZvcm1zTGlzdC5jdXJyZW50VmFsdWU7XG4gICAgfVxuICAgIGlmICh2ZXJpZnlDaGFuZ2UoXCJmb3JtQ29uZmlnXCIpKSB7XG4gICAgICB0aGlzLmZvcm1Db25maWcgPSBjaGFuZ2VzLmZvcm1Db25maWcuY3VycmVudFZhbHVlO1xuXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCB0aGlzLmluaXRGb3JtQ29uZmlnKHRoaXMuZm9ybUNvbmZpZyk7XG4gICAgICB9KSgpO1xuICAgIH1cbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgYXN5bmMgaW5pdEZvcm1Db25maWcoZm9ybUNvbmZpZzogYW55KSB7XG4gICAgdGhpcy5zZXRGb3JtRmllbGRzRnJvbUZvcm1Db25maWcoZm9ybUNvbmZpZyk7XG5cbiAgICB0aGlzLnNldEZvcm1GaWVsZEdyb3Vwc0Zyb21Gb3JtQ29uZmlnKGZvcm1Db25maWcpO1xuXG4gICAgdGhpcy5zZXRGb3JtRGF0YUZyb21BbGxGb3Jtc0RhdGEoKTtcblxuICAgIHRoaXMuZm9ybUdyb3VwID0gYXdhaXQgdGhpcy5mb3JtVmlld1NlcnZpY2UuY3JlYXRlRm9ybUdyb3VwKFxuICAgICAgdGhpcy5mb3JtRmllbGRzLFxuICAgICAgdGhpcy5mb3JtRGF0YSxcbiAgICAgIHRoaXMucHJldmlvdXNGb3JtRGF0YSxcbiAgICAgIHRoaXMuYWxsRm9ybXNEYXRhLFxuICAgICAgdGhpcy50YWtlQWN0aW9uLmJpbmQodGhpcylcbiAgICApO1xuXG4gICAgZm9yIChsZXQgZmllbGQgb2YgdGhpcy5mb3JtRmllbGRzKSB7XG4gICAgICBpZiAoZmllbGQuaXNGb3JtRWxlbWVudCkge1xuICAgICAgICB0aGlzLnByZXZpb3VzRm9ybURhdGEgPSB7XG4gICAgICAgICAgLi4udGhpcy5wcmV2aW91c0Zvcm1EYXRhLFxuICAgICAgICAgIFtmaWVsZC5rZXldOiB0aGlzLmZvcm1Hcm91cC5jb250cm9sc1tmaWVsZC5rZXldLnZhbHVlXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHNbZmllbGQua2V5XS52YWx1ZUNoYW5nZXNcbiAgICAgICAgICAucGlwZShwYWlyd2lzZSgpKVxuICAgICAgICAgIC5zdWJzY3JpYmUoKFtwcmV2aW91c1ZhbHVlLCBjdXJyZW50VmFsdWVdKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnByZXZpb3VzRm9ybURhdGEgPSB7XG4gICAgICAgICAgICAgIC4uLnRoaXMucHJldmlvdXNGb3JtRGF0YSxcbiAgICAgICAgICAgICAgW2ZpZWxkLmtleV06IHByZXZpb3VzVmFsdWVcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHRoaXMuZm9ybURhdGEgPSB7XG4gICAgICAgICAgICAgIC4uLnRoaXMuZm9ybURhdGEsXG4gICAgICAgICAgICAgIFtmaWVsZC5rZXldOiBjdXJyZW50VmFsdWVcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAobGV0IGZpZWxkIG9mIHRoaXMuZm9ybUZpZWxkcykge1xuICAgICAgaWYgKGZpZWxkLmlzRm9ybUVsZW1lbnQpIHtcbiAgICAgICAgaWYgKGZpZWxkLnZhbGlkYXRpb24udHJpZ2dlcnMuaW5jbHVkZXMoXCJPTl9JTklUXCIpKSB7XG4gICAgICAgICAgY29uc3QgdmFsaWRhdGlvbnMgPSBuZXcgVmFsaWRhdGlvbnMoXG4gICAgICAgICAgICBmaWVsZCxcbiAgICAgICAgICAgIHRoaXMuZm9ybUZpZWxkcyxcbiAgICAgICAgICAgIHRoaXMuZm9ybURhdGEsXG4gICAgICAgICAgICB0aGlzLnByZXZpb3VzRm9ybURhdGEsXG4gICAgICAgICAgICB0aGlzLmFsbEZvcm1zRGF0YSxcbiAgICAgICAgICAgIHRoaXMudGFrZUFjdGlvbi5iaW5kKHRoaXMpXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBhd2FpdCB2YWxpZGF0aW9ucy52YWxpZGF0ZUZpZWxkKCk7XG4gICAgICAgICAgfSkoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hlY2tPYmplY3RLZXlFeGlzdHMoZmllbGQsIFwiY29ubmVjdGVkRWxlbWVudHNcIikpIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBjaGVja09iamVjdEtleUV4aXN0cyhmaWVsZC5jb25uZWN0ZWRFbGVtZW50cywgXCJjb25uZWN0ZWRGaWVsZHNcIilcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlQ29ubmVjdGVkRWxlbWVudHMoXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBrZXk6IGZpZWxkLmtleSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy5mb3JtR3JvdXAuY29udHJvbHNbZmllbGQua2V5XS52YWx1ZVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBcIk9OX0lOSVRcIlxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoZWNrT2JqZWN0S2V5RXhpc3RzKGZpZWxkLCBcImRlZmF1bHRcIikpIHtcbiAgICAgICAgICBpZiAoY2hlY2tPYmplY3RLZXlFeGlzdHMoZmllbGQuZGVmYXVsdCwgXCJvcHRpb25zXCIpKSB7XG4gICAgICAgICAgICBpZiAoZmllbGQuZGVmYXVsdC5vcHRpb25zLnRyaWdnZXJzLmluY2x1ZGVzKFwiT05fSU5JVFwiKSkge1xuICAgICAgICAgICAgICBjb25zdCBkZWZhdWx0cyA9IG5ldyBEZWZhdWx0cyhcbiAgICAgICAgICAgICAgICBmaWVsZCxcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm1GaWVsZHMsXG4gICAgICAgICAgICAgICAgdGhpcy5hbGxGb3Jtc0RhdGEsXG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtRGF0YSxcbiAgICAgICAgICAgICAgICB0aGlzLnByZXZpb3VzRm9ybURhdGEsXG4gICAgICAgICAgICAgICAgdGhpcy50YWtlQWN0aW9uXG4gICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgYXdhaXQgZGVmYXVsdHMuZ2V0RGVmYXVsdERyb3Bkb3duT3B0aW9ucygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgc2V0Rm9ybUZpZWxkc0Zyb21Gb3JtQ29uZmlnKGZvcm1Db25maWc6IGFueSkge1xuICAgIGlmIChjaGVja09iamVjdEtleUV4aXN0cyhmb3JtQ29uZmlnLCBcImZpZWxkc1wiKSkge1xuICAgICAgdGhpcy5mb3JtRmllbGRzID0gZm9ybUNvbmZpZy5maWVsZHM7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIGNoZWNrT2JqZWN0S2V5RXhpc3RzKGZvcm1Db25maWcsIFwibXVsdGlGb3JtXCIpICYmXG4gICAgICBjaGVja09iamVjdEtleUV4aXN0cyhmb3JtQ29uZmlnLm11bHRpRm9ybSwgXCJmaWVsZHNcIilcbiAgICApIHtcbiAgICAgIHRoaXMuZm9ybUZpZWxkcyA9IGZvcm1Db25maWcubXVsdGlGb3JtLmZpZWxkcztcbiAgICB9XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIHNldEZvcm1GaWVsZEdyb3Vwc0Zyb21Gb3JtQ29uZmlnKGZvcm1Db25maWc6IGFueSkge1xuICAgIHRoaXMuZmllbGRHcm91cHMgPSBmb3JtQ29uZmlnLmZpZWxkR3JvdXBzO1xuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBzZXRGb3JtRGF0YUZyb21BbGxGb3Jtc0RhdGEoKSB7XG4gICAgaWYgKGNoZWNrT2JqZWN0S2V5RXhpc3RzKHRoaXMuYWxsRm9ybXNEYXRhLCB0aGlzLmZvcm1Db25maWcua2V5KSkge1xuICAgICAgdGhpcy5mb3JtRGF0YSA9IHRoaXMuYWxsRm9ybXNEYXRhW3RoaXMuZm9ybUNvbmZpZy5rZXldO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmZvcm1EYXRhID0ge307XG4gICAgfVxuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBhc3luYyBoYW5kbGVDb25uZWN0ZWRFbGVtZW50RmllbGRHcm91cEFjdGlvbnMoXG4gICAgY2hpbGRGaWVsZEdyb3VwQ29uZmlnOiBhbnksXG4gICAgcGFyZW50RmllbGQ6IGFueVxuICApIHtcbiAgICBpZiAoY2hlY2tPYmplY3RLZXlFeGlzdHMoY2hpbGRGaWVsZEdyb3VwQ29uZmlnLCBcInJ1bGVzXCIpKSB7XG4gICAgICBjb25zdCBydWxlc01hcHBpbmcgPSBuZXcgUnVsZXMoY2hpbGRGaWVsZEdyb3VwQ29uZmlnLnJ1bGVzLCB7XG4gICAgICAgIEZJRUxEX0NPTkZJRzogcGFyZW50RmllbGQsXG4gICAgICAgIEZPUk1fREFUQTogdGhpcy5mb3JtRGF0YSxcbiAgICAgICAgUFJFVklPVVNfRk9STV9EQVRBOiB0aGlzLnByZXZpb3VzRm9ybURhdGEsXG4gICAgICAgIEFMTF9GT1JNU19EQVRBOiB0aGlzLmFsbEZvcm1zRGF0YVxuICAgICAgfSkubWFwcGluZygpO1xuXG4gICAgICBmb3IgKGxldCBhY3Rpb24gb2YgY2hpbGRGaWVsZEdyb3VwQ29uZmlnLmFjdGlvbnMpIHtcbiAgICAgICAgY29uc3QgY29uZGl0aW9uU3VjY2VzcyA9IG5ldyBDb25kaXRpb24oXG4gICAgICAgICAgYWN0aW9uLmNvbmRpdGlvbixcbiAgICAgICAgICBydWxlc01hcHBpbmdcbiAgICAgICAgKS5ldmFsdWF0ZSgpO1xuXG4gICAgICAgIGlmIChjb25kaXRpb25TdWNjZXNzKSB7XG4gICAgICAgICAgY29uc3QgYWN0aW9ucyA9IG5ldyBBY3Rpb25zKFxuICAgICAgICAgICAgYWN0aW9uLFxuICAgICAgICAgICAgcnVsZXNNYXBwaW5nLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBGSUVMRF9DT05GSUc6IHBhcmVudEZpZWxkLFxuICAgICAgICAgICAgICBGT1JNX0ZJRUxEUzogdGhpcy5mb3JtRmllbGRzLFxuICAgICAgICAgICAgICBGT1JNX0RBVEE6IHRoaXMuZm9ybURhdGEsXG4gICAgICAgICAgICAgIFBSRVZJT1VTX0ZPUk1fREFUQTogdGhpcy5wcmV2aW91c0Zvcm1EYXRhLFxuICAgICAgICAgICAgICBBTExfRk9STVNfREFUQTogdGhpcy5hbGxGb3Jtc0RhdGFcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0aGlzLnRha2VBY3Rpb25PbkZpZWxkR3JvdXAuYmluZCh0aGlzKVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBhd2FpdCBhY3Rpb25zLmV4ZWN1dGUoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgYXN5bmMgaGFuZGxlQ29ubmVjdGVkRWxlbWVudEZpZWxkR3JvdXAoXG4gICAgY3VycmVudEZpZWxkOiBhbnksXG4gICAgY29ubmVjdGVkRmllbGRHcm91cENvbmZpZzogYW55LFxuICAgIGV2ZW50VHlwZTogc3RyaW5nXG4gICkge1xuICAgIGlmIChjaGVja09iamVjdEtleUV4aXN0cyhjb25uZWN0ZWRGaWVsZEdyb3VwQ29uZmlnLCBcInRyaWdnZXJzXCIpKSB7XG4gICAgICBpZiAoY29ubmVjdGVkRmllbGRHcm91cENvbmZpZy50cmlnZ2Vycy5pbmNsdWRlcyhldmVudFR5cGUpKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlQ29ubmVjdGVkRWxlbWVudEZpZWxkR3JvdXBBY3Rpb25zKFxuICAgICAgICAgIGNvbm5lY3RlZEZpZWxkR3JvdXBDb25maWcsXG4gICAgICAgICAgY3VycmVudEZpZWxkXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBhc3luYyBoYW5kbGVDb25uZWN0ZWRFbGVtZW50RmllbGRBY3Rpb25zKFxuICAgIGNvbm5lY3RlZEZpZWxkQ29uZmlnOiBhbnksXG4gICAgY29ubmVjdGVkRmllbGQ6IGFueVxuICApIHtcbiAgICBpZiAoY2hlY2tPYmplY3RLZXlFeGlzdHMoY29ubmVjdGVkRmllbGRDb25maWcsIFwicnVsZXNcIikpIHtcbiAgICAgIGNvbnN0IHJ1bGVzTWFwcGluZyA9IG5ldyBSdWxlcyhjb25uZWN0ZWRGaWVsZENvbmZpZy5ydWxlcywge1xuICAgICAgICBGSUVMRF9DT05GSUc6IGNvbm5lY3RlZEZpZWxkLFxuICAgICAgICBGT1JNX0RBVEE6IHRoaXMuZm9ybURhdGEsXG4gICAgICAgIFBSRVZJT1VTX0ZPUk1fREFUQTogdGhpcy5wcmV2aW91c0Zvcm1EYXRhLFxuICAgICAgICBBTExfRk9STVNfREFUQTogdGhpcy5hbGxGb3Jtc0RhdGFcbiAgICAgIH0pLm1hcHBpbmcoKTtcblxuICAgICAgZm9yIChsZXQgYWN0aW9uIG9mIGNvbm5lY3RlZEZpZWxkQ29uZmlnLmFjdGlvbnMpIHtcbiAgICAgICAgY29uc3QgY29uZGl0aW9uU3VjY2VzcyA9IG5ldyBDb25kaXRpb24oXG4gICAgICAgICAgYWN0aW9uLmNvbmRpdGlvbixcbiAgICAgICAgICBydWxlc01hcHBpbmdcbiAgICAgICAgKS5ldmFsdWF0ZSgpO1xuXG4gICAgICAgIGlmIChjb25kaXRpb25TdWNjZXNzKSB7XG4gICAgICAgICAgY29uc3QgYWN0aW9ucyA9IG5ldyBBY3Rpb25zKFxuICAgICAgICAgICAgYWN0aW9uLFxuICAgICAgICAgICAgcnVsZXNNYXBwaW5nLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBGT1JNX0ZJRUxEUzogdGhpcy5mb3JtRmllbGRzLFxuICAgICAgICAgICAgICBGSUVMRF9DT05GSUc6IGNvbm5lY3RlZEZpZWxkLFxuICAgICAgICAgICAgICBGT1JNX0RBVEE6IHRoaXMuZm9ybURhdGEsXG4gICAgICAgICAgICAgIFBSRVZJT1VTX0ZPUk1fREFUQTogdGhpcy5wcmV2aW91c0Zvcm1EYXRhLFxuICAgICAgICAgICAgICBBTExfRk9STVNfREFUQTogdGhpcy5hbGxGb3Jtc0RhdGFcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0aGlzLnRha2VBY3Rpb24uYmluZCh0aGlzKVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBhd2FpdCBhY3Rpb25zLmV4ZWN1dGUoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjb25uZWN0ZWRGaWVsZDtcbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgYXN5bmMgaGFuZGxlQ29ubmVjdGVkRWxlbWVudEZpZWxkcyhcbiAgICBjdXJyZW50RmllbGQ6IGFueSxcbiAgICBjb25uZWN0ZWRGaWVsZENvbmZpZzogYW55LFxuICAgIGV2ZW50VHlwZTogc3RyaW5nLFxuICAgIG5lc3RlZDogc3RyaW5nXG4gICkge1xuICAgIGxldCBjb25uZWN0ZWRGaWVsZCA9IGZpbmRGaWVsZEZyb21LZXkoXG4gICAgICB0aGlzLmZvcm1GaWVsZHMsXG4gICAgICBjb25uZWN0ZWRGaWVsZENvbmZpZ1tcImtleVwiXVxuICAgICk7XG5cbiAgICBpZiAoY2hlY2tPYmplY3RLZXlFeGlzdHMoY29ubmVjdGVkRmllbGRDb25maWcsIFwidHJpZ2dlcnNcIikpIHtcbiAgICAgIGlmIChjb25uZWN0ZWRGaWVsZENvbmZpZy50cmlnZ2Vycy5pbmNsdWRlcyhldmVudFR5cGUpKSB7XG4gICAgICAgIGNvbm5lY3RlZEZpZWxkID0gYXdhaXQgdGhpcy5oYW5kbGVDb25uZWN0ZWRFbGVtZW50RmllbGRBY3Rpb25zKFxuICAgICAgICAgIGNvbm5lY3RlZEZpZWxkQ29uZmlnLFxuICAgICAgICAgIGNvbm5lY3RlZEZpZWxkXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjaGVja09iamVjdEtleUV4aXN0cyhjb25uZWN0ZWRGaWVsZENvbmZpZywgXCJoYW5kbGVOZXN0ZWRGaWVsZHNcIikpIHtcbiAgICAgIGlmIChjb25uZWN0ZWRGaWVsZENvbmZpZy5oYW5kbGVOZXN0ZWRGaWVsZHMpIHtcbiAgICAgICAgaWYgKGNoZWNrT2JqZWN0S2V5RXhpc3RzKGNvbm5lY3RlZEZpZWxkLCBcImNvbm5lY3RlZEVsZW1lbnRzXCIpKSB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgY2hlY2tPYmplY3RLZXlFeGlzdHMoXG4gICAgICAgICAgICAgIGNvbm5lY3RlZEZpZWxkLmNvbm5lY3RlZEVsZW1lbnRzLFxuICAgICAgICAgICAgICBcImNvbm5lY3RlZEZpZWxkc1wiXG4gICAgICAgICAgICApXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNvbm5lY3RlZEZpZWxkQ29uZmlnIG9mIGNvbm5lY3RlZEZpZWxkLmNvbm5lY3RlZEVsZW1lbnRzXG4gICAgICAgICAgICAgIC5jb25uZWN0ZWRGaWVsZHMpIHtcbiAgICAgICAgICAgICAgY29ubmVjdGVkRmllbGQgPSB0aGlzLmhhbmRsZUNvbm5lY3RlZEVsZW1lbnRGaWVsZHMoXG4gICAgICAgICAgICAgICAgY29ubmVjdGVkRmllbGQsXG4gICAgICAgICAgICAgICAgY29ubmVjdGVkRmllbGRDb25maWcsXG4gICAgICAgICAgICAgICAgZXZlbnRUeXBlLFxuICAgICAgICAgICAgICAgIFwiTkVTVEVEXCJcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGN1cnJlbnRGaWVsZDtcbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgYXN5bmMgaGFuZGxlQ29ubmVjdGVkRWxlbWVudHMoZTogYW55LCBldmVudFR5cGU6IHN0cmluZykge1xuICAgIGxldCBjdXJyZW50RmllbGQgPSBmaW5kRmllbGRGcm9tS2V5KHRoaXMuZm9ybUZpZWxkcywgZS5rZXkpO1xuXG4gICAgaWYgKGN1cnJlbnRGaWVsZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoY2hlY2tPYmplY3RLZXlFeGlzdHMoY3VycmVudEZpZWxkLCBcImNvbm5lY3RlZEVsZW1lbnRzXCIpKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBjaGVja09iamVjdEtleUV4aXN0cyhcbiAgICAgICAgICAgIGN1cnJlbnRGaWVsZC5jb25uZWN0ZWRFbGVtZW50cyxcbiAgICAgICAgICAgIFwiY29ubmVjdGVkRmllbGRHcm91cHNcIlxuICAgICAgICAgIClcbiAgICAgICAgKSB7XG4gICAgICAgICAgbGV0IGNvbm5lY3RlZEZpZWxkR3JvdXBzID1cbiAgICAgICAgICAgIGN1cnJlbnRGaWVsZC5jb25uZWN0ZWRFbGVtZW50cy5jb25uZWN0ZWRGaWVsZEdyb3VwcztcbiAgICAgICAgICBmb3IgKGxldCBjb25uZWN0ZWRGaWVsZEdyb3VwQ29uZmlnIG9mIGNvbm5lY3RlZEZpZWxkR3JvdXBzKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUNvbm5lY3RlZEVsZW1lbnRGaWVsZEdyb3VwKFxuICAgICAgICAgICAgICBjdXJyZW50RmllbGQsXG4gICAgICAgICAgICAgIGNvbm5lY3RlZEZpZWxkR3JvdXBDb25maWcsXG4gICAgICAgICAgICAgIGV2ZW50VHlwZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgIGNoZWNrT2JqZWN0S2V5RXhpc3RzKFxuICAgICAgICAgICAgY3VycmVudEZpZWxkLmNvbm5lY3RlZEVsZW1lbnRzLFxuICAgICAgICAgICAgXCJjb25uZWN0ZWRGaWVsZHNcIlxuICAgICAgICAgIClcbiAgICAgICAgKSB7XG4gICAgICAgICAgbGV0IGNvbm5lY3RlZEZpZWxkcyA9IGN1cnJlbnRGaWVsZC5jb25uZWN0ZWRFbGVtZW50cy5jb25uZWN0ZWRGaWVsZHM7XG4gICAgICAgICAgZm9yIChsZXQgY29ubmVjdGVkRmllbGRDb25maWcgb2YgY29ubmVjdGVkRmllbGRzKSB7XG4gICAgICAgICAgICBjdXJyZW50RmllbGQgPSBhd2FpdCB0aGlzLmhhbmRsZUNvbm5lY3RlZEVsZW1lbnRGaWVsZHMoXG4gICAgICAgICAgICAgIGN1cnJlbnRGaWVsZCxcbiAgICAgICAgICAgICAgY29ubmVjdGVkRmllbGRDb25maWcsXG4gICAgICAgICAgICAgIGV2ZW50VHlwZSxcbiAgICAgICAgICAgICAgZXZlbnRUeXBlXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBGaWVsZCBmb3IgdGhlIGdpdmVuIGtleSBbJyR7ZS5rZXl9J10gaXMgbm90IGZvdW5kIHdpdGggZXZlbnRUeXBlOiAnJHtldmVudFR5cGV9Jy5gXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8vIERPTSBFdmVudCBIYW5kbGVyc1xuICBAbG9nTWV0aG9kXG4gIGhhbmRsZUdldEtleVZhbHVlKGU6IGFueSkge1xuICAgIHRoaXMuZm9ybUdyb3VwLnBhdGNoVmFsdWUoXG4gICAgICB7XG4gICAgICAgIFtlLmtleV06IGUudmFsdWVcbiAgICAgIH0sXG4gICAgICB7IGVtaXRFdmVudDogZmFsc2UgfVxuICAgICk7XG5cbiAgICAvLyBDdXJyZW50bHkgc2V0IG9ubHkgZm9yIGRyb3Bkb3duLXdpdGgtc2VhcmNoIGNvbm5lY3RlZCBmaWVsZHNcbiAgICBsZXQgZmllbGQgPSBmaW5kRmllbGRGcm9tS2V5KHRoaXMuZm9ybUZpZWxkcywgZS5rZXkpO1xuXG4gICAgaWYgKFxuICAgICAgZmllbGQuaXNGb3JtRWxlbWVudCAmJlxuICAgICAgZmllbGQudmFsaWRhdGlvbi50cmlnZ2Vycy5pbmNsdWRlcyhcIk9OX0NIQU5HRVwiKVxuICAgICkge1xuICAgICAgY29uc3QgdmFsaWRhdGlvbnMgPSBuZXcgVmFsaWRhdGlvbnMoXG4gICAgICAgIGZpZWxkLFxuICAgICAgICB0aGlzLmZvcm1GaWVsZHMsXG4gICAgICAgIHRoaXMuZm9ybURhdGEsXG4gICAgICAgIHRoaXMucHJldmlvdXNGb3JtRGF0YSxcbiAgICAgICAgdGhpcy5hbGxGb3Jtc0RhdGEsXG4gICAgICAgIHRoaXMudGFrZUFjdGlvbi5iaW5kKHRoaXMpXG4gICAgICApO1xuXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCB2YWxpZGF0aW9ucy52YWxpZGF0ZUZpZWxkKCk7XG4gICAgICB9KSgpO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIGZpZWxkLmlzRm9ybUVsZW1lbnQgJiZcbiAgICAgIGNoZWNrT2JqZWN0S2V5RXhpc3RzKGZpZWxkLCBcImNvbm5lY3RlZEVsZW1lbnRzXCIpXG4gICAgKSB7XG4gICAgICBpZiAoY2hlY2tPYmplY3RLZXlFeGlzdHMoZmllbGQuY29ubmVjdGVkRWxlbWVudHMsIFwiY29ubmVjdGVkRmllbGRzXCIpKSB7XG4gICAgICAgIHRoaXMuaGFuZGxlQ29ubmVjdGVkRWxlbWVudHMoXG4gICAgICAgICAge1xuICAgICAgICAgICAga2V5OiBmaWVsZC5rZXksXG4gICAgICAgICAgICB2YWx1ZTogdGhpcy5mb3JtR3JvdXAuY29udHJvbHNbZmllbGQua2V5XS52YWx1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJPTl9DSEFOR0VcIlxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgYXN5bmMgaGFuZGxlT25DbGlja1Jlc2V0Rm9ybUZpZWxkcyhlOiBhbnksIGZpZWxkOiBURmllbGRUaXRsZSkge1xuICAgIGZvciAobGV0IGYgb2YgZmllbGQucmVzZXQuZmllbGRzKSB7XG4gICAgICBmb3IgKGxldCBhY3Rpb24gb2YgZi5hY3Rpb25zKSB7XG4gICAgICAgIGNvbnN0IHJlc2V0RmllbGQgPSBmaW5kRmllbGRGcm9tS2V5KFxuICAgICAgICAgIHRoaXMuZm9ybUZpZWxkcyxcbiAgICAgICAgICBhY3Rpb24ucHJvcHMuZmllbGRLZXlcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgYWN0aW9ucyA9IG5ldyBBY3Rpb25zKFxuICAgICAgICAgIGFjdGlvbixcbiAgICAgICAgICB7fSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBGSUVMRF9DT05GSUc6IHJlc2V0RmllbGQsXG4gICAgICAgICAgICBGT1JNX0ZJRUxEUzogdGhpcy5mb3JtRmllbGRzLFxuICAgICAgICAgICAgRk9STV9EQVRBOiB0aGlzLmZvcm1EYXRhLFxuICAgICAgICAgICAgUFJFVklPVVNfRk9STV9EQVRBOiB0aGlzLnByZXZpb3VzRm9ybURhdGEsXG4gICAgICAgICAgICBBTExfRk9STVNfREFUQTogdGhpcy5hbGxGb3Jtc0RhdGFcbiAgICAgICAgICB9LFxuICAgICAgICAgIHRoaXMudGFrZUFjdGlvbi5iaW5kKHRoaXMpXG4gICAgICAgICk7XG4gICAgICAgIGF3YWl0IGFjdGlvbnMuZXhlY3V0ZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgYXN5bmMgaGFuZGxlT25DbGlja0FwaUNhbGwoZTogYW55KSB7XG4gICAgbGV0IGZpZWxkOiBURmllbGRBcGlDYWxsID0gZmluZEZpZWxkRnJvbUtleSh0aGlzLmZvcm1GaWVsZHMsIGUua2V5KTtcblxuICAgIGlmIChmaWVsZC50eXBlID09PSBcImFwaS1jYWxsXCIpIHtcbiAgICAgIC8vIHNldCBidXR0b24gc3RhdHVzIHRvIGxvYWRpbmdcbiAgICAgIGZpZWxkW1wiYXBpXCJdW1wic3RhdHVzXCJdW1widmFsdWVcIl0gPSBFQXBpU3RhdHVzVHlwZS5MT0FESU5HO1xuICAgICAgZmllbGRbXCJzaG93TG9hZGVyXCJdID0gdHJ1ZTtcbiAgICAgIHRoaXMudmlld0Zvcm1zQnV0dG9uW1wiZGlzYWJsZWRcIl0gPSB0cnVlO1xuICAgICAgdGhpcy52aWV3Rm9ybXNCdXR0b25bXCJzaG93TG9hZGVyXCJdID0gdHJ1ZTtcbiAgICAgIHRoaXMuc2F2ZUZvcm1CdXR0b25bXCJkaXNhYmxlZFwiXSA9IHRydWU7XG4gICAgICB0aGlzLnNhdmVGb3JtQnV0dG9uW1wic2hvd0xvYWRlclwiXSA9IHRydWU7XG5cbiAgICAgIGNvbnN0IGFwaXMgPSBuZXcgQXBpcyhcbiAgICAgICAgZmllbGQsXG4gICAgICAgIHRoaXMuZm9ybUZpZWxkcyxcbiAgICAgICAgdGhpcy5mb3JtRGF0YSxcbiAgICAgICAgdGhpcy5wcmV2aW91c0Zvcm1EYXRhLFxuICAgICAgICB0aGlzLmFsbEZvcm1zRGF0YSxcbiAgICAgICAgdGhpcy50YWtlQWN0aW9uLmJpbmQodGhpcylcbiAgICAgICk7XG5cbiAgICAgIGZpZWxkID0gYXdhaXQgYXBpcy5zZXRSZXF1ZXN0Qm9keVBhcmFtcygpO1xuXG4gICAgICBmaWVsZCA9IGF3YWl0IGFwaXMudmFsaWRhdGVSZXF1ZXN0Qm9keSgpO1xuXG4gICAgICBpZiAoZmllbGQuYXBpLnJlcXVlc3QuYm9keS52YWxpZGF0aW9uLmlzX3ZhbGlkKSB7XG4gICAgICAgIC8vIENhbGwgQVBJIEhlcmVcbiAgICAgICAgdGhpcy5vbkNsaWNrQXBpQ2FsbC5lbWl0KHtcbiAgICAgICAgICBrZXk6IGUua2V5LFxuICAgICAgICAgIHJlcXVlc3Q6IHtcbiAgICAgICAgICAgIG1vZGU6IFwiUE9TVFwiLFxuICAgICAgICAgICAgYm9keTogZmllbGQuYXBpLnJlcXVlc3QuYm9keS52YWx1ZSxcbiAgICAgICAgICAgIGhlYWRlcnM6IHt9LFxuICAgICAgICAgICAgdXJsOiBmaWVsZC5hcGkucmVxdWVzdC51cmxcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gUmVxdWVzdCBCb2R5IFZhbGlkYXRpb24gRmFpbGVkXG4gICAgICAgIC8vIEhpZ2hsaWdodCBFcnJvciBpbiBVSSB0byBVc2VyIHRvIFJldHJ5IEFmdGVyIFNvbWV0aW1lLlxuICAgICAgICAvLyBUYWtlIEFjdGlvbnMgYmFzZWQgb24gVmFsaWRhdGlvblxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBmaWVsZFtcImFwaVwiXVtcInN0YXR1c1wiXVtcInZhbHVlXCJdID0gRUFwaVN0YXR1c1R5cGUuRkFJTEVEO1xuICAgICAgICAgIGZpZWxkW1wic2hvd0xvYWRlclwiXSA9IGZhbHNlO1xuICAgICAgICB9LCA1MDApO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnZpZXdGb3Jtc0J1dHRvbltcImRpc2FibGVkXCJdID0gZmFsc2U7XG4gICAgICB0aGlzLnZpZXdGb3Jtc0J1dHRvbltcInNob3dMb2FkZXJcIl0gPSBmYWxzZTtcbiAgICAgIHRoaXMuc2F2ZUZvcm1CdXR0b25bXCJkaXNhYmxlZFwiXSA9IGZhbHNlO1xuICAgICAgdGhpcy5zYXZlRm9ybUJ1dHRvbltcInNob3dMb2FkZXJcIl0gPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIGhhbmRsZU9uQ2xpY2tWaWV3Rm9ybXMoZTogYW55KSB7XG4gICAgdGhpcy5vbkNsaWNrVmlld0Zvcm1zLmVtaXQoe1xuICAgICAgY2xpY2tlZDogdHJ1ZVxuICAgIH0pO1xuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBoYW5kbGVPbkNsaWNrU2F2ZUZvcm0oZTogYW55KSB7XG4gICAgbGV0IGZvcm1EYXRhID0gdGhpcy5mb3JtR3JvdXAuZ2V0UmF3VmFsdWUoKTtcblxuICAgIGZvciAobGV0IGZpZWxkIG9mIHRoaXMuZm9ybUZpZWxkcykge1xuICAgICAgaWYgKGZpZWxkLnR5cGUgIT09IEVGaWVsZFR5cGUuVElUTEUpIHtcbiAgICAgICAgaWYgKGZpZWxkLmhpZGRlbikge1xuICAgICAgICAgIGRlbGV0ZSBmb3JtRGF0YVtmaWVsZC5rZXldO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZvcm1EYXRhW2ZpZWxkLmtleV0gPSBjb252ZXJ0VmFsdWVGcm9tS3dpa1VJRm9ybWF0VG9CYXNpY0Zvcm1hdChcbiAgICAgICAgICAgIGZpZWxkLFxuICAgICAgICAgICAgZm9ybURhdGFbZmllbGQua2V5XVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGxldCBmaWVsZCBvZiB0aGlzLmZvcm1GaWVsZHMpIHtcbiAgICAgIGlmIChcbiAgICAgICAgZmllbGQudHlwZSAhPT0gRUZpZWxkVHlwZS5USVRMRSAmJlxuICAgICAgICBmaWVsZC52YWxpZGF0aW9uLnRyaWdnZXJzLmluY2x1ZGVzKFwiT05fU0FWRVwiKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRpb25zID0gbmV3IFZhbGlkYXRpb25zKFxuICAgICAgICAgIGZpZWxkLFxuICAgICAgICAgIHRoaXMuZm9ybUZpZWxkcyxcbiAgICAgICAgICBmb3JtRGF0YSxcbiAgICAgICAgICB0aGlzLnByZXZpb3VzRm9ybURhdGEsXG4gICAgICAgICAgdGhpcy5hbGxGb3Jtc0RhdGEsXG4gICAgICAgICAgdGhpcy50YWtlQWN0aW9uLmJpbmQodGhpcylcbiAgICAgICAgKTtcblxuICAgICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGF3YWl0IHZhbGlkYXRpb25zLnZhbGlkYXRlRmllbGQoKTtcbiAgICAgICAgfSkoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5mb3JtR3JvdXAuaW52YWxpZCkge1xuICAgICAgY29uc3QgY29udHJvbHMgPSBuZXcgVmFsaWRhdGlvbnMoXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgdGhpcy5mb3JtRmllbGRzLFxuICAgICAgICBmb3JtRGF0YSxcbiAgICAgICAgdGhpcy5wcmV2aW91c0Zvcm1EYXRhLFxuICAgICAgICB0aGlzLmFsbEZvcm1zRGF0YSxcbiAgICAgICAgdGhpcy50YWtlQWN0aW9uLmJpbmQodGhpcylcbiAgICAgICkuZmluZEludmFsaWRDb250cm9sc1JlY3Vyc2l2ZSh0aGlzLmZvcm1Hcm91cCk7XG5cbiAgICAgIGxldCBmaXJzdEZpZWxkV2l0aEVycm9yOiBzdHJpbmcgPSBcIlwiO1xuXG4gICAgICBmb3IgKGxldCBjb250cm9sIG9mIGNvbnRyb2xzKSB7XG4gICAgICAgIGlmIChjb250cm9sLmludmFsaWQgJiYgaXNFbXB0eVZhbHVlKGZpcnN0RmllbGRXaXRoRXJyb3IpKSB7XG4gICAgICAgICAgZmlyc3RGaWVsZFdpdGhFcnJvciA9IGNvbnRyb2wua2V5O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZm9ybUZpZWxkcyA9IHNldEZpZWxkRXJyb3IoXG4gICAgICAgICAgdGhpcy5mb3JtRmllbGRzLFxuICAgICAgICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzW2NvbnRyb2wua2V5XS5lcnJvcnMsXG4gICAgICAgICAgY29udHJvbC5rZXksXG4gICAgICAgICAgY29udHJvbC5pbnZhbGlkXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMudG9nZ2xlRXJyb3JOb3RpZmljYXRpb24odHJ1ZSk7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy50b2dnbGVFcnJvck5vdGlmaWNhdGlvbihmYWxzZSk7XG4gICAgICB9LCAzMDAwKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIE9iamVjdC5rZXlzKGZvcm1EYXRhKS5tYXAoKGtleSkgPT4ge1xuICAgICAgaWYgKGlzRW1wdHlWYWx1ZShmb3JtRGF0YVtrZXldKSkge1xuICAgICAgICBmb3JtRGF0YVtrZXldID0gXCJcIjtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMub25DbGlja1NhdmVGb3JtLmVtaXQoeyBmb3JtQ29uZmlnOiB0aGlzLmZvcm1Db25maWcsIGRhdGE6IGZvcm1EYXRhIH0pO1xuICB9XG5cbiAgc2hvd0Vycm9yTm90aWZpY2F0aW9uOiBib29sZWFuID0gZmFsc2U7XG4gIEBsb2dNZXRob2RcbiAgdG9nZ2xlRXJyb3JOb3RpZmljYXRpb24oc2hvdykge1xuICAgIHRoaXMuc2hvd0Vycm9yTm90aWZpY2F0aW9uID0gc2hvdztcbiAgfVxuXG4gIC8vIENvbXBvbmVudCBIZWxwZXJzXG4gIEBsb2dNZXRob2RcbiAgZmllbGRIaWRlKGZpZWxkS2V5OiBzdHJpbmcpIHtcbiAgICBsZXQgZmllbGQgPSBmaW5kRmllbGRGcm9tS2V5KHRoaXMuZm9ybUZpZWxkcywgZmllbGRLZXkpO1xuICAgIGxldCBmaWVsZEluZGV4ID0gdGhpcy5mb3JtRmllbGRzLmZpbmRJbmRleCgoXzogYW55KSA9PiB7XG4gICAgICByZXR1cm4gZmllbGQua2V5ID09PSBfLmtleTtcbiAgICB9KTtcblxuICAgIHRoaXMuZm9ybUZpZWxkc1tmaWVsZEluZGV4XVtcImhpZGRlblwiXSA9IHRydWU7XG4gICAgdGhpcy5mb3JtR3JvdXAudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBmaWVsZEdyb3VwSGlkZShmaWVsZEdyb3VwOiBzdHJpbmcpIHtcbiAgICBmb3IgKGxldCBmaWVsZEtleSBvZiB0aGlzLmZpZWxkR3JvdXBzW2ZpZWxkR3JvdXBdKSB7XG4gICAgICB0aGlzLmZpZWxkSGlkZShmaWVsZEtleSk7XG4gICAgfVxuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBmaWVsZFNob3coZmllbGRLZXk6IHN0cmluZykge1xuICAgIGxldCBmaWVsZCA9IGZpbmRGaWVsZEZyb21LZXkodGhpcy5mb3JtRmllbGRzLCBmaWVsZEtleSk7XG4gICAgbGV0IGZpZWxkSW5kZXggPSB0aGlzLmZvcm1GaWVsZHMuZmluZEluZGV4KChfOiBhbnkpID0+IHtcbiAgICAgIHJldHVybiBmaWVsZC5rZXkgPT09IF8ua2V5O1xuICAgIH0pO1xuXG4gICAgdGhpcy5mb3JtRmllbGRzW2ZpZWxkSW5kZXhdW1wiaGlkZGVuXCJdID0gZmFsc2U7XG4gICAgdGhpcy5mb3JtR3JvdXAudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBmaWVsZEdyb3VwU2hvdyhmaWVsZEdyb3VwOiBzdHJpbmcpIHtcbiAgICBmb3IgKGxldCBmaWVsZEtleSBvZiB0aGlzLmZpZWxkR3JvdXBzW2ZpZWxkR3JvdXBdKSB7XG4gICAgICB0aGlzLmZpZWxkU2hvdyhmaWVsZEtleSk7XG4gICAgfVxuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBmaWVsZERpc2FibGUoZmllbGRLZXk6IHN0cmluZykge1xuICAgIGxldCBmaWVsZCA9IGZpbmRGaWVsZEZyb21LZXkodGhpcy5mb3JtRmllbGRzLCBmaWVsZEtleSk7XG4gICAgbGV0IGZpZWxkSW5kZXggPSB0aGlzLmZvcm1GaWVsZHMuZmluZEluZGV4KChfOiBhbnkpID0+IHtcbiAgICAgIHJldHVybiBmaWVsZC5rZXkgPT09IF8ua2V5O1xuICAgIH0pO1xuXG4gICAgaWYgKGZpZWxkLnR5cGUgIT09IEVGaWVsZFR5cGUuVElUTEUpIHtcbiAgICAgIHRoaXMuZm9ybUZpZWxkc1tmaWVsZEluZGV4XVtcImRpc2FibGVkXCJdID0gdHJ1ZTtcblxuICAgICAgaWYgKGlzTm90RW1wdHlWYWx1ZSh0aGlzLmZvcm1Hcm91cC5jb250cm9scykpIHtcbiAgICAgICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHNbZmllbGQua2V5XS5kaXNhYmxlKHtcbiAgICAgICAgICBlbWl0RXZlbnQ6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgdGhpcy5mb3JtR3JvdXAudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgIH1cbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgZmllbGRHcm91cERpc2FibGUoZmllbGRHcm91cDogc3RyaW5nKSB7XG4gICAgZm9yIChsZXQgZmllbGRLZXkgb2YgdGhpcy5maWVsZEdyb3Vwc1tmaWVsZEdyb3VwXSkge1xuICAgICAgdGhpcy5maWVsZERpc2FibGUoZmllbGRLZXkpO1xuICAgIH1cbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgZmllbGRFbmFibGUoZmllbGRLZXk6IHN0cmluZykge1xuICAgIGxldCBmaWVsZCA9IGZpbmRGaWVsZEZyb21LZXkodGhpcy5mb3JtRmllbGRzLCBmaWVsZEtleSk7XG4gICAgbGV0IGZpZWxkSW5kZXggPSB0aGlzLmZvcm1GaWVsZHMuZmluZEluZGV4KChfOiBhbnkpID0+IHtcbiAgICAgIHJldHVybiBmaWVsZC5rZXkgPT09IF8ua2V5O1xuICAgIH0pO1xuXG4gICAgaWYgKGZpZWxkLnR5cGUgIT09IEVGaWVsZFR5cGUuVElUTEUpIHtcbiAgICAgIHRoaXMuZm9ybUZpZWxkc1tmaWVsZEluZGV4XVtcImRpc2FibGVkXCJdID0gZmFsc2U7XG5cbiAgICAgIGlmIChpc05vdEVtcHR5VmFsdWUodGhpcy5mb3JtR3JvdXAuY29udHJvbHMpKSB7XG4gICAgICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzW2ZpZWxkLmtleV0uZW5hYmxlKHtcbiAgICAgICAgICBlbWl0RXZlbnQ6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgdGhpcy5mb3JtR3JvdXAudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgIH1cbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgZmllbGRHcm91cEVuYWJsZShmaWVsZEdyb3VwOiBzdHJpbmcpIHtcbiAgICBmb3IgKGxldCBmaWVsZEtleSBvZiB0aGlzLmZpZWxkR3JvdXBzW2ZpZWxkR3JvdXBdKSB7XG4gICAgICB0aGlzLmZpZWxkRW5hYmxlKGZpZWxkS2V5KTtcbiAgICB9XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIGZpZWxkUmVzZXQoZmllbGRLZXk6IHN0cmluZykge1xuICAgIC8vIEZpbmQgdGhlIGZpZWxkIGFuZCBpdHMgaW5kZXggaW4gdGhlIGZvcm1GaWVsZHMgYXJyYXlcbiAgICBsZXQgZmllbGQgPSBmaW5kRmllbGRGcm9tS2V5KHRoaXMuZm9ybUZpZWxkcywgZmllbGRLZXkpO1xuICAgIGxldCBmaWVsZEluZGV4ID0gZmluZEZpZWxkSW5kZXhGcm9tS2V5KHRoaXMuZm9ybUZpZWxkcywgZmllbGRLZXkpO1xuXG4gICAgLy8gRGVsZXRlIHRoZSBmaWVsZCBmcm9tIHRoZSBmb3JtRGF0YSBvYmplY3RcbiAgICBkZWxldGUgdGhpcy5mb3JtRGF0YVtmaWVsZEtleV07XG5cbiAgICAvLyBSZXNldCB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkIGluIHRoZSBmb3JtR3JvdXBcbiAgICB0aGlzLmZvcm1Hcm91cC5jb250cm9sc1tmaWVsZC5rZXldLnJlc2V0KHNldEVtcHR5VmFsdWUoZmllbGQpLCB7XG4gICAgICBlbWl0RXZlbnQ6IGZhbHNlXG4gICAgfSk7XG5cbiAgICAvLyBSZXNldCB0aGUgbWVzc2FnZXMgYW5kIGVycm9ycyBmb3IgdGhlIGZpZWxkXG4gICAgZmllbGQgPSByZW1vdmVNZXNzYWdlKGZpZWxkLCB7XG4gICAgICB0eXBlOiBFTWVzc2FnZVR5cGUuV0FSTklORyxcbiAgICAgIG1lc3NhZ2U6IFwiXCJcbiAgICB9KTtcbiAgICBmaWVsZCA9IHJlbW92ZU1lc3NhZ2UoZmllbGQsIHtcbiAgICAgIHR5cGU6IEVNZXNzYWdlVHlwZS5TVUNDRVNTLFxuICAgICAgbWVzc2FnZTogXCJcIlxuICAgIH0pO1xuICAgIHRoaXMuZmllbGRFcnJvckhpZGUoZmllbGRLZXksIHtcbiAgICAgIHR5cGU6IEVNZXNzYWdlVHlwZS5FUlJPUixcbiAgICAgIG1lc3NhZ2U6IFwiXCJcbiAgICB9KTtcblxuICAgIC8vIFJlc2V0IHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQgaW4gdGhlIGZvcm1GaWVsZHMgYXJyYXlcbiAgICBzd2l0Y2ggKGZpZWxkLnR5cGUpIHtcbiAgICAgIGNhc2UgXCJhcGktY2FsbFwiOlxuICAgICAgICBjb25zdCBmaWVsZEFwaUNhbGwgPSBmaWVsZCBhcyBURmllbGRBcGlDYWxsO1xuICAgICAgICBmaWVsZEFwaUNhbGwuYXBpLnN0YXR1cy52YWx1ZSA9IEVBcGlTdGF0dXNUeXBlLkRFRkFVTFQ7XG4gICAgICAgIHRoaXMuZm9ybUZpZWxkc1tmaWVsZEluZGV4XSA9IGZpZWxkQXBpQ2FsbDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBmaWVsZC5mb2N1cyA9IGZhbHNlO1xuICAgICAgICBmaWVsZC5pbnZhbGlkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZm9ybUZpZWxkc1tmaWVsZEluZGV4XSA9IGZpZWxkO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIGZpZWxkRXJyb3JTaG93KGZpZWxkS2V5OiBzdHJpbmcsIG1lc3NhZ2U6IFRNZXNzYWdlKSB7XG4gICAgbGV0IGZpZWxkID0gZmluZEZpZWxkRnJvbUtleSh0aGlzLmZvcm1GaWVsZHMsIGZpZWxkS2V5KTtcbiAgICBsZXQgZmllbGRJbmRleCA9IHRoaXMuZm9ybUZpZWxkcy5maW5kSW5kZXgoKF86IGFueSkgPT4ge1xuICAgICAgcmV0dXJuIGZpZWxkLmtleSA9PT0gXy5rZXk7XG4gICAgfSk7XG5cbiAgICBmaWVsZCA9IGhpZ2hsaWdodEZpZWxkRXJyb3IoZmllbGQsIHRydWUpO1xuICAgIGZpZWxkID0gYWRkTWVzc2FnZShmaWVsZCwgbWVzc2FnZSk7XG5cbiAgICB0aGlzLmZvcm1GaWVsZHNbZmllbGRJbmRleF0gPSBmaWVsZDtcbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgZmllbGRFcnJvckhpZGUoZmllbGRLZXk6IHN0cmluZywgbWVzc2FnZTogVE1lc3NhZ2UpIHtcbiAgICBsZXQgZmllbGQgPSBmaW5kRmllbGRGcm9tS2V5KHRoaXMuZm9ybUZpZWxkcywgZmllbGRLZXkpO1xuICAgIGxldCBmaWVsZEluZGV4ID0gdGhpcy5mb3JtRmllbGRzLmZpbmRJbmRleCgoXzogYW55KSA9PiB7XG4gICAgICByZXR1cm4gZmllbGQua2V5ID09PSBfLmtleTtcbiAgICB9KTtcblxuICAgIGZpZWxkID0gaGlnaGxpZ2h0RmllbGRFcnJvcihmaWVsZCwgZmFsc2UpO1xuICAgIGZpZWxkID0gcmVtb3ZlTWVzc2FnZShmaWVsZCwgbWVzc2FnZSk7XG5cbiAgICB0aGlzLmZvcm1GaWVsZHNbZmllbGRJbmRleF0gPSBmaWVsZDtcbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgZmllbGRNZXNzYWdlU2hvdyhmaWVsZEtleTogc3RyaW5nLCBtZXNzYWdlOiBUTWVzc2FnZSkge1xuICAgIGxldCBmaWVsZCA9IGZpbmRGaWVsZEZyb21LZXkodGhpcy5mb3JtRmllbGRzLCBmaWVsZEtleSk7XG4gICAgbGV0IGZpZWxkSW5kZXggPSB0aGlzLmZvcm1GaWVsZHMuZmluZEluZGV4KChfOiBhbnkpID0+IHtcbiAgICAgIHJldHVybiBmaWVsZC5rZXkgPT09IF8ua2V5O1xuICAgIH0pO1xuXG4gICAgZmllbGQgPSBhZGRNZXNzYWdlKGZpZWxkLCBtZXNzYWdlKTtcblxuICAgIHRoaXMuZm9ybUZpZWxkc1tmaWVsZEluZGV4XSA9IGZpZWxkO1xuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBmaWVsZE1lc3NhZ2VIaWRlKGZpZWxkS2V5OiBzdHJpbmcsIG1lc3NhZ2U6IFRNZXNzYWdlKSB7XG4gICAgbGV0IGZpZWxkID0gZmluZEZpZWxkRnJvbUtleSh0aGlzLmZvcm1GaWVsZHMsIGZpZWxkS2V5KTtcbiAgICBsZXQgZmllbGRJbmRleCA9IHRoaXMuZm9ybUZpZWxkcy5maW5kSW5kZXgoKF86IGFueSkgPT4ge1xuICAgICAgcmV0dXJuIGZpZWxkLmtleSA9PT0gXy5rZXk7XG4gICAgfSk7XG5cbiAgICBmaWVsZCA9IHJlbW92ZU1lc3NhZ2UoZmllbGQsIG1lc3NhZ2UpO1xuXG4gICAgdGhpcy5mb3JtRmllbGRzW2ZpZWxkSW5kZXhdID0gZmllbGQ7XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIHNldE9iamVjdFZhbHVlKGZpZWxkOiBhbnksIHBhdGg6IHN0cmluZywgdmFsdWU6IGFueSkge31cblxuICBAbG9nTWV0aG9kXG4gIHBhdGNoRmllbGRDb250cm9sVmFsdWUoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgICB0aGlzLmZvcm1Hcm91cC5wYXRjaFZhbHVlKFxuICAgICAge1xuICAgICAgICBba2V5XTogdmFsdWVcbiAgICAgIH0sXG4gICAgICB7IGVtaXRFdmVudDogZmFsc2UgfVxuICAgICk7XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIHBhdGNoRm9ybUdyb3VwKGZvcm1EYXRhOiBhbnkpIHtcbiAgICBpZiAoaXNVbmRlZmluZWQodGhpcy5mb3JtR3JvdXApIHx8IGlzVW5kZWZpbmVkKGZvcm1EYXRhKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBmb3JtR3JvdXAgb3IgZm9ybURhdGEgaXMgJ3VuZGVmaW5lZCcuYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZm9ybUdyb3VwLnBhdGNoVmFsdWUoZm9ybURhdGEsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB9XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIGlzRmllbGRWYWxpZChmaWVsZEtleTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzW2ZpZWxkS2V5XS52YWxpZDtcbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgaXNGaWVsZEVuYWJsZWQoZmllbGRLZXk6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmZvcm1Hcm91cC5jb250cm9sc1tmaWVsZEtleV0uZW5hYmxlZDtcbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgZ2V0Rm9ybUdyb3VwUmF3VmFsdWVzKCkge1xuICAgIHJldHVybiB0aGlzLmZvcm1Hcm91cC5nZXRSYXdWYWx1ZSgpO1xuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBhc3luYyB0YWtlQWN0aW9uT25GaWVsZEdyb3VwKFxuICAgIGFjdGlvbjogVEFjdGlvbixcbiAgICBmaWVsZDogVEZpZWxkLFxuICAgIGFsbEZvcm1zRGF0YTogYW55LFxuICAgIGZvcm1EYXRhOiBhbnksXG4gICAgcHJldmlvdXNGb3JtRGF0YTogYW55XG4gICkge1xuICAgIHN3aXRjaCAoYWN0aW9uLmtleSkge1xuICAgICAgY2FzZSBFQWN0aW9uS2V5LkZJRUxEX0dST1VQX0hJREU6XG4gICAgICAgIHRoaXMuZmllbGRHcm91cEhpZGUoYWN0aW9uLnByb3BzLmdyb3VwS2V5KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEVBY3Rpb25LZXkuRklFTERfR1JPVVBfU0hPVzpcbiAgICAgICAgdGhpcy5maWVsZEdyb3VwU2hvdyhhY3Rpb24ucHJvcHMuZ3JvdXBLZXkpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRUFjdGlvbktleS5GSUVMRF9HUk9VUF9FTkFCTEU6XG4gICAgICAgIHRoaXMuZmllbGRHcm91cEVuYWJsZShhY3Rpb24ucHJvcHMuZ3JvdXBLZXkpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRUFjdGlvbktleS5GSUVMRF9HUk9VUF9ESVNBQkxFOlxuICAgICAgICB0aGlzLmZpZWxkR3JvdXBEaXNhYmxlKGFjdGlvbi5wcm9wcy5ncm91cEtleSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBhc3luYyB0YWtlQWN0aW9uKGFjdGlvbjogVEFjdGlvbiwgb2JqZWN0OiBhbnkpIHtcbiAgICBzd2l0Y2ggKGFjdGlvbi5rZXkpIHtcbiAgICAgIGNhc2UgRUFjdGlvbktleS5GSUVMRF9ISURFOlxuICAgICAgICB0aGlzLmZpZWxkSGlkZShhY3Rpb24ucHJvcHMuZmllbGRLZXkpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRUFjdGlvbktleS5GSUVMRF9TSE9XOlxuICAgICAgICB0aGlzLmZpZWxkU2hvdyhhY3Rpb24ucHJvcHMuZmllbGRLZXkpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRUFjdGlvbktleS5GSUVMRF9ESVNBQkxFOlxuICAgICAgICB0aGlzLmZpZWxkRGlzYWJsZShhY3Rpb24ucHJvcHMuZmllbGRLZXkpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRUFjdGlvbktleS5GSUVMRF9FTkFCTEU6XG4gICAgICAgIHRoaXMuZmllbGRFbmFibGUoYWN0aW9uLnByb3BzLmZpZWxkS2V5KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEVBY3Rpb25LZXkuRklFTERfUkVTRVQ6XG4gICAgICAgIHRoaXMuZmllbGRSZXNldChhY3Rpb24ucHJvcHMuZmllbGRLZXkpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRUFjdGlvbktleS5GSUVMRF9FUlJPUl9TSE9XOlxuICAgICAgICB0aGlzLmZpZWxkRXJyb3JTaG93KGFjdGlvbi5wcm9wcy5maWVsZEtleSwgYWN0aW9uLnByb3BzLm1lc3NhZ2UpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRUFjdGlvbktleS5GSUVMRF9FUlJPUl9ISURFOlxuICAgICAgICB0aGlzLmZpZWxkRXJyb3JIaWRlKGFjdGlvbi5wcm9wcy5maWVsZEtleSwgYWN0aW9uLnByb3BzLm1lc3NhZ2UpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRUFjdGlvbktleS5GSUVMRF9NRVNTQUdFX1NIT1c6XG4gICAgICAgIHRoaXMuZmllbGRNZXNzYWdlU2hvdyhhY3Rpb24ucHJvcHMuZmllbGRLZXksIGFjdGlvbi5wcm9wcy5tZXNzYWdlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEVBY3Rpb25LZXkuRklFTERfTUVTU0FHRVNfSElERTpcbiAgICAgICAgdGhpcy5maWVsZE1lc3NhZ2VIaWRlKGFjdGlvbi5wcm9wcy5maWVsZEtleSwgYWN0aW9uLnByb3BzLm1lc3NhZ2UpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRUFjdGlvbktleS5TRVRfVkFMVUU6XG4gICAgICAgIGNvbnN0IHNldFZhbHVlX1NvdXJjZXMgPSBuZXcgU291cmNlcyhvYmplY3QpO1xuXG4gICAgICAgIGNvbnN0IHNvdXJjZVZhbHVlID0gYXdhaXQgc2V0VmFsdWVfU291cmNlcy5nZXRWYWx1ZUZyb21Tb3VyY2UoXG4gICAgICAgICAgYWN0aW9uLnByb3BzLnZhbHVlLnNvdXJjZVxuICAgICAgICApO1xuICAgICAgICBzZXRWYWx1ZV9Tb3VyY2VzLnNldFZhbHVlVG9Tb3VyY2UoXG4gICAgICAgICAgYWN0aW9uLnByb3BzLnZhbHVlLmRlc3RpbmF0aW9uLFxuICAgICAgICAgIHNvdXJjZVZhbHVlXG4gICAgICAgICk7XG5cbiAgICAgICAgb2JqZWN0LkZJRUxEX0NPTkZJRyA9IHNldFZhbHVlX1NvdXJjZXMub2JqZWN0LkZJRUxEX0NPTkZJRztcbiAgICAgICAgdGhpcy5mb3JtRGF0YSA9IHNldFZhbHVlX1NvdXJjZXMub2JqZWN0LkZPUk1fREFUQTtcbiAgICAgICAgdGhpcy5wYXRjaEZvcm1Hcm91cCh0aGlzLmZvcm1EYXRhKTtcbiAgICAgICAgdGhpcy5hbGxGb3Jtc0RhdGEgPSBzZXRWYWx1ZV9Tb3VyY2VzLm9iamVjdC5BTExfRk9STVNfREFUQTtcbiAgICAgICAgdGhpcy5wcmV2aW91c0Zvcm1EYXRhID0gc2V0VmFsdWVfU291cmNlcy5vYmplY3QuUFJFVklPVVNfRk9STV9EQVRBO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRUFjdGlvbktleS5TRVRfRFJPUERPV05fT1BUSU9OUzpcbiAgICAgICAgY29uc3Qgc2V0RHJvcGRvd25WYWx1ZV9Tb3VyY2VzID0gbmV3IFNvdXJjZXMob2JqZWN0KTtcblxuICAgICAgICBsZXQgZHJvcGRvd25WYWx1ZSA9IGF3YWl0IHNldERyb3Bkb3duVmFsdWVfU291cmNlcy5nZXRWYWx1ZUZyb21Tb3VyY2UoXG4gICAgICAgICAgYWN0aW9uLnByb3BzLnZhbHVlLnNvdXJjZVxuICAgICAgICApO1xuICAgICAgICBpZiAoY2hlY2tPYmplY3RLZXlFeGlzdHMoYWN0aW9uLnByb3BzLCBcIm9wdGlvbnNcIikpIHtcbiAgICAgICAgICBpZiAoY2hlY2tPYmplY3RLZXlFeGlzdHMoYWN0aW9uLnByb3BzLm9wdGlvbnMsIFwiYXBwZW5kVG9QYXRoXCIpKSB7XG4gICAgICAgICAgICBsZXQgYXBwZW5kVG9QYXRoID1cbiAgICAgICAgICAgICAgYXdhaXQgc2V0RHJvcGRvd25WYWx1ZV9Tb3VyY2VzLmdldFZhbHVlRnJvbVNvdXJjZShcbiAgICAgICAgICAgICAgICBhY3Rpb24ucHJvcHMub3B0aW9ucy5hcHBlbmRUb1BhdGguc291cmNlXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoaXNOb3RFbXB0eVZhbHVlKGFwcGVuZFRvUGF0aCkpIHtcbiAgICAgICAgICAgICAgY29uc3QgYXBwZW5kVG9QYXRoU3RyID0gcmVwbGFjZVN0cmluZyhcbiAgICAgICAgICAgICAgICBhcHBlbmRUb1BhdGgubWF0Y2goXG4gICAgICAgICAgICAgICAgICBgJHthY3Rpb24ucHJvcHMub3B0aW9ucy5hcHBlbmRUb1BhdGguZmlsdGVyU291cmNlVmFsdWV9YFxuICAgICAgICAgICAgICAgIClbMF0sXG4gICAgICAgICAgICAgICAgXCJbXmEtekEtWjAtOV9dXCIsXG4gICAgICAgICAgICAgICAgXCJfXCJcbiAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICBjb25zdCBvcHRpb25zUGF0aCA9IGAke2FjdGlvbi5wcm9wcy5vcHRpb25zLnBhdGh9JHthcHBlbmRUb1BhdGhTdHJ9YDtcbiAgICAgICAgICAgICAgZHJvcGRvd25WYWx1ZSA9IGdldE9iamVjdFZhbHVlRnJvbVBhdGgoXG4gICAgICAgICAgICAgICAgZHJvcGRvd25WYWx1ZSxcbiAgICAgICAgICAgICAgICBvcHRpb25zUGF0aFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkcm9wZG93blZhbHVlID0gZ2V0T2JqZWN0VmFsdWVGcm9tUGF0aChcbiAgICAgICAgICAgICAgZHJvcGRvd25WYWx1ZSxcbiAgICAgICAgICAgICAgYWN0aW9uLnByb3BzLm9wdGlvbnMucGF0aFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBzZXREcm9wZG93blZhbHVlX1NvdXJjZXMuc2V0VmFsdWVUb1NvdXJjZShcbiAgICAgICAgICBhY3Rpb24ucHJvcHMudmFsdWUuZGVzdGluYXRpb24sXG4gICAgICAgICAgZHJvcGRvd25WYWx1ZVxuICAgICAgICApO1xuXG4gICAgICAgIG9iamVjdC5GSUVMRF9DT05GSUcgPSBzZXREcm9wZG93blZhbHVlX1NvdXJjZXMub2JqZWN0LkZJRUxEX0NPTkZJRztcbiAgICAgICAgdGhpcy5mb3JtRGF0YSA9IHNldERyb3Bkb3duVmFsdWVfU291cmNlcy5vYmplY3QuRk9STV9EQVRBO1xuICAgICAgICB0aGlzLmFsbEZvcm1zRGF0YSA9IHNldERyb3Bkb3duVmFsdWVfU291cmNlcy5vYmplY3QuQUxMX0ZPUk1TX0RBVEE7XG4gICAgICAgIHRoaXMucHJldmlvdXNGb3JtRGF0YSA9XG4gICAgICAgICAgc2V0RHJvcGRvd25WYWx1ZV9Tb3VyY2VzLm9iamVjdC5QUkVWSU9VU19GT1JNX0RBVEE7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBFQWN0aW9uS2V5LkhBTkRMRV9DT05ORUNURURfRUxFTUVOVFM6XG4gICAgICAgIHRoaXMuaGFuZGxlQ29ubmVjdGVkRWxlbWVudHMoeyBrZXk6IGFjdGlvbi5wcm9wcy5maWVsZEtleSB9LCBcIkFDVElPTlwiKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEVBY3Rpb25LZXkuQ1VTVE9NOlxuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxufVxuIiwiPGRpdlxuICBjbGFzcz1cImt3aWtpZC1mb3JtLWNvbnRhaW5lclwiXG4gICpuZ0lmPVwiIXRoaXMubG9hZGluZ1wiXG4+XG4gIDxkaXYgaWQ9XCJ1Zi1mb3JtLWZpZWxkcy1oZWFkZXItY29udGFpbmVyXCI+XG4gICAgPGRpdiBpZD1cInVmLWZvcm0tZmllbGRzLXRpdGxlXCI+XG4gICAgICB7eyB0aGlzLmZvcm1Db25maWcudGl0bGUgfX1cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGlkPVwidWYtZm9ybS1maWVsZHMtc3RlcHNcIj5cbiAgICAgIFN0ZXAge3sgdGhpcy5mb3JtQ29uZmlnLnNlcXVlbmNlTm8gfX0gb2Yge3sgdGhpcy5mb3Jtc0xpc3QubGVuZ3RoIH19XG4gICAgPC9kaXY+XG4gICAgPGhyIC8+XG4gIDwvZGl2PlxuICA8Zm9ybVxuICAgIGNsYXNzPVwia3dpa2lkLWZvcm0gc2hvd1wiXG4gICAgW2Zvcm1Hcm91cF09XCJ0aGlzLmZvcm1Hcm91cFwiXG4gID5cbiAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBmaWVsZCBvZiB0aGlzLmZvcm1GaWVsZHM7IGxldCBpID0gaW5kZXhcIj5cbiAgICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cImZpZWxkLnR5cGVcIj5cbiAgICAgICAgPCEtLSBIVE1MIENvbnRlbnQgLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidodG1sJ1wiPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIFtoaWRkZW5dPVwiZmllbGQ/LmhpZGRlblwiXG4gICAgICAgICAgICBpZD1cImZpZWxkX3t7IGZpZWxkLmtleSB9fVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGRpdiBbaW5uZXJIdG1sXT1cImZpZWxkLmh0bWwgfCBzYWZlSHRtbFwiPjwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPCEtLSBGb3JtIFRpdGxlIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCIndGl0bGUnXCI+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJ0aXRsZVwiXG4gICAgICAgICAgICBbY2xhc3MuaGlkZGVuXT1cImZpZWxkPy5oaWRkZW5cIlxuICAgICAgICAgICAgaWQ9XCJmaWVsZF97eyBmaWVsZC5rZXkgfX1cIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIHt7IGZpZWxkLmxhYmVsIH19XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxrd2lrdWktYnV0dG9uXG4gICAgICAgICAgICAgICpuZ0lmPVwiZmllbGQ/LnJlc2V0XCJcbiAgICAgICAgICAgICAgYXBwZWFyYW5jZT1cIndoaXRlYmxvY2tcIlxuICAgICAgICAgICAgICBzaXplPVwic1wiXG4gICAgICAgICAgICAgIGxhYmVsPVwiUmVzZXRcIlxuICAgICAgICAgICAgICAob25DbGljayk9XCJ0aGlzLmhhbmRsZU9uQ2xpY2tSZXNldEZvcm1GaWVsZHMoJGV2ZW50LCBmaWVsZClcIlxuICAgICAgICAgICAgPjwva3dpa3VpLWJ1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwhLS0gSW5wdXQgVGV4dCAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3RleHQnXCI+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgW2hpZGRlbl09XCJmaWVsZD8uaGlkZGVuXCJcbiAgICAgICAgICAgIGlkPVwiZmllbGRfe3sgZmllbGQua2V5IH19XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8a3dpa3VpLWlucHV0XG4gICAgICAgICAgICAgIFtjYXNlXT1cImZpZWxkPy5wcm9wZXJ0aWVzPy5jYXNlXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImZpZWxkPy5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgIFtmb2N1c109XCJmaWVsZD8uZm9jdXNcIlxuICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwiZm9ybUdyb3VwLmNvbnRyb2xzW2ZpZWxkLmtleV1cIlxuICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cImZpZWxkLmtleVwiXG4gICAgICAgICAgICAgIFtpZF09XCJmaWVsZC5rZXlcIlxuICAgICAgICAgICAgICBbaW52YWxpZF09XCJmaWVsZD8uaW52YWxpZFwiXG4gICAgICAgICAgICAgIFtsYWJlbF09XCJmaWVsZC5sYWJlbFwiXG4gICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJmaWVsZD8ucHJvcGVydGllcz8ucGxhY2Vob2xkZXJcIlxuICAgICAgICAgICAgICBbdHlwZV09XCIndGV4dCdcIlxuICAgICAgICAgICAgICBbdmFsaWRhdG9yc109XCJmaWVsZD8udmFsaWRhdG9yc1wiXG4gICAgICAgICAgICAgIChnZXRLZXlWYWx1ZSk9XCJoYW5kbGVHZXRLZXlWYWx1ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgID48L2t3aWt1aS1pbnB1dD5cbiAgICAgICAgICAgIDxrd2lrdWktbWVzc2FnZXNcbiAgICAgICAgICAgICAgW21lc3NhZ2VzXT1cImZpZWxkLm1lc3NhZ2VzXCJcbiAgICAgICAgICAgICAgW2lkXT1cImZpZWxkLmtleVwiXG4gICAgICAgICAgICA+PC9rd2lrdWktbWVzc2FnZXM+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8IS0tIENoZWNrYm94IC0tPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInY2hlY2tib3gnXCI+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgW2hpZGRlbl09XCJmaWVsZD8uaGlkZGVuXCJcbiAgICAgICAgICAgIGlkPVwiZmllbGRfe3sgZmllbGQua2V5IH19XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8a3dpa3VpLWNoZWNrYm94LWJsb2NrXG4gICAgICAgICAgICAgIFtjb250ZW50QWxpZ25dPVwiZmllbGQ/LnByb3BlcnRpZXM/LmNvbnRlbnRBbGlnbiA/PyAnbGVmdCdcIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZmllbGQ/LmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgW2ZvY3VzXT1cImZpZWxkPy5mb2N1c1wiXG4gICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJmb3JtR3JvdXAuY29udHJvbHNbZmllbGQua2V5XVwiXG4gICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiZmllbGQua2V5XCJcbiAgICAgICAgICAgICAgW2lkXT1cImZpZWxkLmtleVwiXG4gICAgICAgICAgICAgIFtpbnZhbGlkXT1cImZpZWxkPy5pbnZhbGlkXCJcbiAgICAgICAgICAgICAgW2xhYmVsXT1cImZpZWxkPy5wcm9wZXJ0aWVzPy5wbGFjZWhvbGRlclwiXG4gICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJmaWVsZD8ucHJvcGVydGllcz8ucGxhY2Vob2xkZXJcIlxuICAgICAgICAgICAgICBbcHJvcGVydGllc109XCJmaWVsZD8ucHJvcGVydGllc1wiXG4gICAgICAgICAgICAgIFtzaXplXT1cImZpZWxkPy5wcm9wZXJ0aWVzPy5zaXplID8/ICdsJ1wiXG4gICAgICAgICAgICAgIFt2YWxpZGF0b3JzXT1cImZpZWxkPy52YWxpZGF0b3JzXCJcbiAgICAgICAgICAgICAgKGdldEtleVZhbHVlKT1cImhhbmRsZUdldEtleVZhbHVlKCRldmVudClcIlxuICAgICAgICAgICAgPjwva3dpa3VpLWNoZWNrYm94LWJsb2NrXG4gICAgICAgICAgICA+PGt3aWt1aS1tZXNzYWdlc1xuICAgICAgICAgICAgICBbbWVzc2FnZXNdPVwiZmllbGQubWVzc2FnZXNcIlxuICAgICAgICAgICAgICBbaWRdPVwiZmllbGQua2V5XCJcbiAgICAgICAgICAgID48L2t3aWt1aS1tZXNzYWdlcz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwhLS0gSW5wdXQgTnVtYmVyIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInbnVtYmVyJ1wiPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIFtoaWRkZW5dPVwiZmllbGQ/LmhpZGRlblwiXG4gICAgICAgICAgICBpZD1cImZpZWxkX3t7IGZpZWxkLmtleSB9fVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGt3aWt1aS1pbnB1dC1udW1iZXJcbiAgICAgICAgICAgICAgW2RlY2ltYWxdPVwiZmllbGQ/LnByb3BlcnRpZXM/LmRlY2ltYWxcIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZmllbGQ/LmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgW2ZvY3VzXT1cImZpZWxkPy5mb2N1c1wiXG4gICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJmb3JtR3JvdXAuY29udHJvbHNbZmllbGQua2V5XVwiXG4gICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiZmllbGQua2V5XCJcbiAgICAgICAgICAgICAgW2lkXT1cImZpZWxkLmtleVwiXG4gICAgICAgICAgICAgIFtpbnZhbGlkXT1cImZpZWxkPy5pbnZhbGlkXCJcbiAgICAgICAgICAgICAgW2xhYmVsXT1cImZpZWxkPy5sYWJlbFwiXG4gICAgICAgICAgICAgIFttYXhdPVwiZmllbGQ/LnByb3BlcnRpZXM/Lm1heFwiXG4gICAgICAgICAgICAgIFttaW5dPVwiZmllbGQ/LnByb3BlcnRpZXM/Lm1pblwiXG4gICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJmaWVsZD8ucHJvcGVydGllcz8ucGxhY2Vob2xkZXJcIlxuICAgICAgICAgICAgICBbcG9zdGZpeF09XCJmaWVsZD8ucHJvcGVydGllcz8ucG9zdGZpeCA/PyAnJ1wiXG4gICAgICAgICAgICAgIFtwcmVjaXNpb25dPVwiZmllbGQ/LnByb3BlcnRpZXM/LnByZWNpc2lvblwiXG4gICAgICAgICAgICAgIFtwcmVmaXhdPVwiZmllbGQ/LnByb3BlcnRpZXM/LnByZWZpeCA/PyAnJ1wiXG4gICAgICAgICAgICAgIFtwcm9wZXJ0aWVzXT1cImZpZWxkPy5wcm9wZXJ0aWVzXCJcbiAgICAgICAgICAgICAgW3ZhbGlkYXRvcnNdPVwiZmllbGQ/LnZhbGlkYXRvcnNcIlxuICAgICAgICAgICAgICAoZ2V0S2V5VmFsdWUpPVwiaGFuZGxlR2V0S2V5VmFsdWUoJGV2ZW50KVwiXG4gICAgICAgICAgICA+PC9rd2lrdWktaW5wdXQtbnVtYmVyXG4gICAgICAgICAgICA+PGt3aWt1aS1tZXNzYWdlc1xuICAgICAgICAgICAgICBbbWVzc2FnZXNdPVwiZmllbGQubWVzc2FnZXNcIlxuICAgICAgICAgICAgICBbaWRdPVwiZmllbGQua2V5XCJcbiAgICAgICAgICAgID48L2t3aWt1aS1tZXNzYWdlcz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwhLS0gSW5wdXQgRGF0ZSAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2RhdGUnXCI+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgW2hpZGRlbl09XCJmaWVsZD8uaGlkZGVuXCJcbiAgICAgICAgICAgIGlkPVwiZmllbGRfe3sgZmllbGQua2V5IH19XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8a3dpa3VpLWlucHV0LWRhdGVcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImZpZWxkPy5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgIFtmb2N1c109XCJmaWVsZD8uZm9jdXNcIlxuICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwiZm9ybUdyb3VwLmNvbnRyb2xzW2ZpZWxkLmtleV1cIlxuICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cImZpZWxkLmtleVwiXG4gICAgICAgICAgICAgIFtpZF09XCJmaWVsZC5rZXlcIlxuICAgICAgICAgICAgICBbaW52YWxpZF09XCJmaWVsZD8uaW52YWxpZFwiXG4gICAgICAgICAgICAgIFtsYWJlbF09XCJmaWVsZC5sYWJlbFwiXG4gICAgICAgICAgICAgIFttYXhdPVwiZmllbGQ/LnByb3BlcnRpZXM/Lm1heFwiXG4gICAgICAgICAgICAgIFttaW5dPVwiZmllbGQ/LnByb3BlcnRpZXM/Lm1pblwiXG4gICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJmaWVsZD8ucHJvcGVydGllcz8ucGxhY2Vob2xkZXJcIlxuICAgICAgICAgICAgICBbcHJvcGVydGllc109XCJmaWVsZD8ucHJvcGVydGllc1wiXG4gICAgICAgICAgICAgIFt2YWxpZGF0b3JzXT1cImZpZWxkPy52YWxpZGF0b3JzXCJcbiAgICAgICAgICAgICAgKGdldEtleVZhbHVlKT1cImhhbmRsZUdldEtleVZhbHVlKCRldmVudClcIlxuICAgICAgICAgICAgPjwva3dpa3VpLWlucHV0LWRhdGU+XG4gICAgICAgICAgICA8a3dpa3VpLW1lc3NhZ2VzXG4gICAgICAgICAgICAgIFttZXNzYWdlc109XCJmaWVsZC5tZXNzYWdlc1wiXG4gICAgICAgICAgICAgIFtpZF09XCJmaWVsZC5rZXlcIlxuICAgICAgICAgICAgPjwva3dpa3VpLW1lc3NhZ2VzPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPCEtLSBJbnB1dCBQaG9uZSAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3Bob25lJ1wiPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIFtoaWRkZW5dPVwiZmllbGQ/LmhpZGRlblwiXG4gICAgICAgICAgICBpZD1cImZpZWxkX3t7IGZpZWxkLmtleSB9fVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGt3aWt1aS1pbnB1dC1waG9uZVxuICAgICAgICAgICAgICBbY291bnRyeUNvZGVdPVwiZmllbGQ/LnByb3BlcnRpZXM/LmNvdW50cnlDb2RlXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImZpZWxkPy5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgIFtmb2N1c109XCJmaWVsZD8uZm9jdXNcIlxuICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwiZm9ybUdyb3VwLmNvbnRyb2xzW2ZpZWxkLmtleV1cIlxuICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cImZpZWxkLmtleVwiXG4gICAgICAgICAgICAgIFtpZF09XCJmaWVsZC5rZXlcIlxuICAgICAgICAgICAgICBbaW52YWxpZF09XCJmaWVsZD8uaW52YWxpZFwiXG4gICAgICAgICAgICAgIFtsYWJlbF09XCJmaWVsZD8ubGFiZWxcIlxuICAgICAgICAgICAgICBbcGhvbmVNYXNrQWZ0ZXJDb3VudHJ5Q29kZV09XCJcbiAgICAgICAgICAgICAgICBmaWVsZD8ucHJvcGVydGllcz8ucGhvbmVNYXNrQWZ0ZXJDb3VudHJ5Q29kZVxuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiZmllbGQ/LnByb3BlcnRpZXM/LnBsYWNlaG9sZGVyXCJcbiAgICAgICAgICAgICAgW3ZhbGlkYXRvcnNdPVwiZmllbGQ/LnZhbGlkYXRvcnNcIlxuICAgICAgICAgICAgICAoZ2V0S2V5VmFsdWUpPVwiaGFuZGxlR2V0S2V5VmFsdWUoJGV2ZW50KVwiXG4gICAgICAgICAgICA+PC9rd2lrdWktaW5wdXQtcGhvbmU+XG4gICAgICAgICAgICA8a3dpa3VpLW1lc3NhZ2VzXG4gICAgICAgICAgICAgIFttZXNzYWdlc109XCJmaWVsZC5tZXNzYWdlc1wiXG4gICAgICAgICAgICAgIFtpZF09XCJmaWVsZC5rZXlcIlxuICAgICAgICAgICAgPjwva3dpa3VpLW1lc3NhZ2VzPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPCEtLSBJbnB1dCBSYWRpbyAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3JhZGlvJ1wiPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIFtoaWRkZW5dPVwiZmllbGQ/LmhpZGRlblwiXG4gICAgICAgICAgICBpZD1cImZpZWxkX3t7IGZpZWxkLmtleSB9fVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAgIFt0dWlMYWJlbF09XCJsYWJlbFRlbXBsYXRlXCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJtaW4taGVpZ2h0OiBhdXRvXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGt3aWt1aS1yYWRpby1saXN0XG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImZpZWxkPy5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgW2ZvY3VzXT1cImZpZWxkPy5mb2N1c1wiXG4gICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImZvcm1Hcm91cC5jb250cm9sc1tmaWVsZC5rZXldXCJcbiAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cImZpZWxkLmtleVwiXG4gICAgICAgICAgICAgICAgW2lkXT1cImZpZWxkLmtleVwiXG4gICAgICAgICAgICAgICAgW2ludmFsaWRdPVwiZmllbGQ/LmludmFsaWRcIlxuICAgICAgICAgICAgICAgIFtpdGVtc109XCJmaWVsZD8ub3B0aW9uc1wiXG4gICAgICAgICAgICAgICAgW2xhYmVsXT1cImZpZWxkPy5sYWJlbFwiXG4gICAgICAgICAgICAgICAgW29yaWVudGF0aW9uXT1cImZpZWxkPy5wcm9wZXJ0aWVzPy5vcmllbnRhdGlvblwiXG4gICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImZpZWxkPy5wcm9wZXJ0aWVzPy5wbGFjZWhvbGRlclwiXG4gICAgICAgICAgICAgICAgW3Byb3BlcnRpZXNdPVwiZmllbGQ/LnByb3BlcnRpZXNcIlxuICAgICAgICAgICAgICAgIFtzaXplXT1cImZpZWxkPy5wcm9wZXJ0aWVzPy5zaXplXCJcbiAgICAgICAgICAgICAgICBbdmFsaWRhdG9yc109XCJmaWVsZD8udmFsaWRhdG9yc1wiXG4gICAgICAgICAgICAgICAgKGdldEtleVZhbHVlKT1cImhhbmRsZUdldEtleVZhbHVlKCRldmVudClcIlxuICAgICAgICAgICAgICA+PC9rd2lrdWktcmFkaW8tbGlzdD5cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI2xhYmVsVGVtcGxhdGU+XG4gICAgICAgICAgICAgIDxwXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJ0dWktc3BhY2VfYm90dG9tLTJcIlxuICAgICAgICAgICAgICAgIFtoaWRkZW5dPVwiZmllbGQ/LmhpZGRlblwiXG4gICAgICAgICAgICAgICAgaWQ9XCJmaWVsZF97eyBmaWVsZC5rZXkgfX1cIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGI+XG4gICAgICAgICAgICAgICAgICB7eyBmaWVsZC5sYWJlbCB9fVxuICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJmaWVsZC52YWxpZGF0b3JzPy5yZXF1aXJlZFwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2I+XG4gICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8a3dpa3VpLW1lc3NhZ2VzXG4gICAgICAgICAgICAgIFttZXNzYWdlc109XCJmaWVsZC5tZXNzYWdlc1wiXG4gICAgICAgICAgICAgIFtpZF09XCJmaWVsZC5rZXlcIlxuICAgICAgICAgICAgPjwva3dpa3VpLW1lc3NhZ2VzPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPCEtLSBEcm9wZG93biAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2Ryb3Bkb3duLXdpdGgtc2VhcmNoJ1wiPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIFtoaWRkZW5dPVwiZmllbGQ/LmhpZGRlblwiXG4gICAgICAgICAgICBpZD1cImZpZWxkX3t7IGZpZWxkLmtleSB9fVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGt3aWt1aS1zZWxlY3QtY29tYm9ib3hcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImZpZWxkPy5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgIFtmb2N1c109XCJmaWVsZD8uZm9jdXNcIlxuICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwiZm9ybUdyb3VwLmNvbnRyb2xzW2ZpZWxkLmtleV1cIlxuICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cImZpZWxkLmtleVwiXG4gICAgICAgICAgICAgIFtpZF09XCJmaWVsZC5rZXlcIlxuICAgICAgICAgICAgICBbaW52YWxpZF09XCJmaWVsZD8uaW52YWxpZFwiXG4gICAgICAgICAgICAgIFtsYWJlbF09XCJmaWVsZC5sYWJlbFwiXG4gICAgICAgICAgICAgIFtvcHRpb25zXT1cImZpZWxkLm9wdGlvbnNcIlxuICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiZmllbGQ/LnByb3BlcnRpZXM/LnBsYWNlaG9sZGVyXCJcbiAgICAgICAgICAgICAgW3Byb3BlcnRpZXNdPVwiZmllbGQ/LnByb3BlcnRpZXNcIlxuICAgICAgICAgICAgICBbdmFsaWRhdG9yc109XCJmaWVsZD8udmFsaWRhdG9yc1wiXG4gICAgICAgICAgICAgIChnZXRLZXlWYWx1ZSk9XCJoYW5kbGVHZXRLZXlWYWx1ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgID48L2t3aWt1aS1zZWxlY3QtY29tYm9ib3g+XG4gICAgICAgICAgICA8a3dpa3VpLW1lc3NhZ2VzXG4gICAgICAgICAgICAgIFttZXNzYWdlc109XCJmaWVsZC5tZXNzYWdlc1wiXG4gICAgICAgICAgICAgIFtpZF09XCJmaWVsZC5rZXlcIlxuICAgICAgICAgICAgPjwva3dpa3VpLW1lc3NhZ2VzPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPCEtLSBBUEkgQ2FsbCAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2FwaS1jYWxsJ1wiPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIFtoaWRkZW5dPVwiZmllbGQ/LmhpZGRlblwiXG4gICAgICAgICAgICBpZD1cImZpZWxkX3t7IGZpZWxkLmtleSB9fVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGt3aWt1aS1idXR0b24tYXBpLWNhbGxcbiAgICAgICAgICAgICAgW2FwaVN0YXR1c109XCJmaWVsZD8uYXBpPy5zdGF0dXM/LnZhbHVlXCJcbiAgICAgICAgICAgICAgW2NsYXNzXT1cImZpZWxkPy5jbGFzc1wiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJmaWVsZD8uZGlzYWJsZWRcIlxuICAgICAgICAgICAgICBbaWRdPVwiZmllbGQua2V5XCJcbiAgICAgICAgICAgICAgW2xhYmVsXT1cImZpZWxkPy5hcGk/LnN0YXR1cz8ubGFiZWxzW2ZpZWxkPy5hcGk/LnN0YXR1cz8udmFsdWVdXCJcbiAgICAgICAgICAgICAgW3Nob3dMb2FkZXJdPVwiZmllbGQ/LmRpc2FibGVkID09PSAnbG9hZGluZydcIlxuICAgICAgICAgICAgICBzaGFwZT1cIm51bGxcIlxuICAgICAgICAgICAgICBzaXplPVwibVwiXG4gICAgICAgICAgICAgIHN0eWxlcz1cIndpZHRoOiBmaXQtY29udGVudFwiXG4gICAgICAgICAgICAgIChvbkNsaWNrKT1cInRoaXMuaGFuZGxlT25DbGlja0FwaUNhbGwoJGV2ZW50KVwiXG4gICAgICAgICAgICA+PC9rd2lrdWktYnV0dG9uLWFwaS1jYWxsPlxuICAgICAgICAgICAgPGt3aWt1aS1tZXNzYWdlc1xuICAgICAgICAgICAgICBbbWVzc2FnZXNdPVwiZmllbGQubWVzc2FnZXNcIlxuICAgICAgICAgICAgICBbaWRdPVwiZmllbGQua2V5XCJcbiAgICAgICAgICAgID48L2t3aWt1aS1tZXNzYWdlcz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwhLS0gTW9iaWxlIE9UUCAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ290cCdcIj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBbaGlkZGVuXT1cImZpZWxkPy5oaWRkZW5cIlxuICAgICAgICAgICAgaWQ9XCJmaWVsZF97eyBmaWVsZC5rZXkgfX1cIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxrd2lrdWktaW5wdXQtb3RwXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJmaWVsZD8uZGlzYWJsZWRcIlxuICAgICAgICAgICAgICBbZm9jdXNdPVwiZmllbGQ/LmZvY3VzXCJcbiAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImZvcm1Hcm91cC5jb250cm9sc1tmaWVsZC5rZXldXCJcbiAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJmaWVsZC5rZXlcIlxuICAgICAgICAgICAgICBbaWRdPVwiZmllbGQua2V5XCJcbiAgICAgICAgICAgICAgW2ludmFsaWRdPVwiZmllbGQ/LmludmFsaWRcIlxuICAgICAgICAgICAgICBbbGFiZWxdPVwiZmllbGQ/LmxhYmVsXCJcbiAgICAgICAgICAgICAgW21hc2tdPVwiZmllbGQ/LnByb3BlcnRpZXM/Lm1hc2tcIlxuICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiZmllbGQ/LnByb3BlcnRpZXM/LnBsYWNlaG9sZGVyXCJcbiAgICAgICAgICAgICAgW3Byb3BlcnRpZXNdPVwiZmllbGQ/LnByb3BlcnRpZXNcIlxuICAgICAgICAgICAgICBbdmFsaWRhdG9yc109XCJmaWVsZD8udmFsaWRhdG9yc1wiXG4gICAgICAgICAgICAgIChnZXRLZXlWYWx1ZSk9XCJoYW5kbGVHZXRLZXlWYWx1ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgID48L2t3aWt1aS1pbnB1dC1vdHA+XG4gICAgICAgICAgICA8a3dpa3VpLW1lc3NhZ2VzXG4gICAgICAgICAgICAgIFttZXNzYWdlc109XCJmaWVsZC5tZXNzYWdlc1wiXG4gICAgICAgICAgICAgIFtpZF09XCJmaWVsZC5rZXlcIlxuICAgICAgICAgICAgPjwva3dpa3VpLW1lc3NhZ2VzPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPCEtLSBBYWRoYWFyIE51bWJlciAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2FhZGhhYXItbnVtYmVyJ1wiPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIFtoaWRkZW5dPVwiZmllbGQ/LmhpZGRlblwiXG4gICAgICAgICAgICBpZD1cImZpZWxkX3t7IGZpZWxkLmtleSB9fVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGt3aWt1aS1pbnB1dC1hYWRoYWFyXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJmaWVsZD8uZGlzYWJsZWRcIlxuICAgICAgICAgICAgICBbZm9jdXNdPVwiZmllbGQ/LmZvY3VzXCJcbiAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImZvcm1Hcm91cC5jb250cm9sc1tmaWVsZC5rZXldXCJcbiAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJmaWVsZC5rZXlcIlxuICAgICAgICAgICAgICBbaWRdPVwiZmllbGQua2V5XCJcbiAgICAgICAgICAgICAgW2ludmFsaWRdPVwiZmllbGQ/LmludmFsaWRcIlxuICAgICAgICAgICAgICBbbGFiZWxdPVwiZmllbGQ/LmxhYmVsXCJcbiAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImZpZWxkPy5wbGFjZWhvbGRlclwiXG4gICAgICAgICAgICAgIFtwcm9wZXJ0aWVzXT1cImZpZWxkPy5wcm9wZXJ0aWVzXCJcbiAgICAgICAgICAgICAgW3ZhbGlkYXRvcnNdPVwiZmllbGQ/LnZhbGlkYXRvcnNcIlxuICAgICAgICAgICAgICAoZ2V0S2V5VmFsdWUpPVwiaGFuZGxlR2V0S2V5VmFsdWUoJGV2ZW50KVwiXG4gICAgICAgICAgICA+PC9rd2lrdWktaW5wdXQtYWFkaGFhcj5cbiAgICAgICAgICAgIDxrd2lrdWktbWVzc2FnZXNcbiAgICAgICAgICAgICAgW21lc3NhZ2VzXT1cImZpZWxkLm1lc3NhZ2VzXCJcbiAgICAgICAgICAgICAgW2lkXT1cImZpZWxkLmtleVwiXG4gICAgICAgICAgICA+PC9rd2lrdWktbWVzc2FnZXM+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvZm9ybT5cbiAgPGRpdiBjbGFzcz1cImt3aWtpZC1mb3JtLWJ1dHRvbnNcIj5cbiAgICA8a3dpa3VpLWJ1dHRvblxuICAgICAgKm5nSWY9XCJ0aGlzLmlzTW9iaWxlVmlld1wiXG4gICAgICBbZGlzYWJsZWRdPVwidmlld0Zvcm1zQnV0dG9uLmRpc2FibGVkXCJcbiAgICAgIGlkPVwiXCJcbiAgICAgIGxhYmVsPVwiVmlldyBGb3Jtc1wiXG4gICAgICBbc2hvd0xvYWRlcl09XCJ2aWV3Rm9ybXNCdXR0b24uc2hvd0xvYWRlclwiXG4gICAgICBzdHlsZXM9XCJcIlxuICAgICAgY2xhc3M9XCJcIlxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICBhcHBlYXJhbmNlPVwic2Vjb25kYXJ5XCJcbiAgICAgIGljb249XCJcIlxuICAgICAgaWNvblJpZ2h0PVwiXCJcbiAgICAgIFtzaGFwZV09XCJudWxsXCJcbiAgICAgIHNpemU9XCJtXCJcbiAgICAgIHN0eWxlcz1cIndpZHRoOiAxMDAlXCJcbiAgICAgIChvbkNsaWNrKT1cInRoaXMuaGFuZGxlT25DbGlja1ZpZXdGb3JtcygkZXZlbnQpXCJcbiAgICA+PC9rd2lrdWktYnV0dG9uPlxuICAgIDxrd2lrdWktYnV0dG9uXG4gICAgICBbZGlzYWJsZWRdPVwic2F2ZUZvcm1CdXR0b24uZGlzYWJsZWRcIlxuICAgICAgaWQ9XCJcIlxuICAgICAgbGFiZWw9XCJTYXZlXCJcbiAgICAgIFtzaG93TG9hZGVyXT1cInNhdmVGb3JtQnV0dG9uLnNob3dMb2FkZXJcIlxuICAgICAgc3R5bGVzPVwiXCJcbiAgICAgIGNsYXNzPVwiXCJcbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgYXBwZWFyYW5jZT1cInByaW1hcnlcIlxuICAgICAgaWNvbj1cIlwiXG4gICAgICBpY29uUmlnaHQ9XCJcIlxuICAgICAgW3NoYXBlXT1cIm51bGxcIlxuICAgICAgc2l6ZT1cIm1cIlxuICAgICAgc3R5bGVzPVwid2lkdGg6IDEwMCVcIlxuICAgICAgKG9uQ2xpY2spPVwidGhpcy5oYW5kbGVPbkNsaWNrU2F2ZUZvcm0oJGV2ZW50KVwiXG4gICAgPjwva3dpa3VpLWJ1dHRvbj5cbiAgPC9kaXY+XG48L2Rpdj5cbjxkaXZcbiAgY2xhc3M9XCJrd2lraWQtZm9ybS1jb250YWluZXItbG9hZGluZ1wiXG4gICpuZ0lmPVwidGhpcy5sb2FkaW5nXCJcbj5cbiAgPGRpdlxuICAgIGNsYXNzPVwibGFyZ2Utd3JhcHBlclwiXG4gICAgW2NsYXNzLnR1aS1za2VsZXRvbl09XCJ0aGlzLmxvYWRpbmdcIlxuICAgIFtjbGFzcy50dWktc2tlbGV0b25fcm91bmRlZF09XCJ0aGlzLmxvYWRpbmdcIlxuICA+PC9kaXY+XG4gIDxkaXZcbiAgICBjbGFzcz1cImxhcmdlLXdyYXBwZXJcIlxuICAgIFtjbGFzcy50dWktc2tlbGV0b25dPVwidGhpcy5sb2FkaW5nXCJcbiAgICBbY2xhc3MudHVpLXNrZWxldG9uX3JvdW5kZWRdPVwidGhpcy5sb2FkaW5nXCJcbiAgPjwvZGl2PlxuICA8ZGl2XG4gICAgY2xhc3M9XCJsYXJnZS13cmFwcGVyXCJcbiAgICBbY2xhc3MudHVpLXNrZWxldG9uXT1cInRoaXMubG9hZGluZ1wiXG4gICAgW2NsYXNzLnR1aS1za2VsZXRvbl9yb3VuZGVkXT1cInRoaXMubG9hZGluZ1wiXG4gID48L2Rpdj5cbiAgPGRpdlxuICAgIGNsYXNzPVwibGFyZ2Utd3JhcHBlclwiXG4gICAgW2NsYXNzLnR1aS1za2VsZXRvbl09XCJ0aGlzLmxvYWRpbmdcIlxuICAgIFtjbGFzcy50dWktc2tlbGV0b25fcm91bmRlZF09XCJ0aGlzLmxvYWRpbmdcIlxuICA+PC9kaXY+XG4gIDxkaXZcbiAgICBjbGFzcz1cImxhcmdlLXdyYXBwZXJcIlxuICAgIFtjbGFzcy50dWktc2tlbGV0b25dPVwidGhpcy5sb2FkaW5nXCJcbiAgICBbY2xhc3MudHVpLXNrZWxldG9uX3JvdW5kZWRdPVwidGhpcy5sb2FkaW5nXCJcbiAgPjwvZGl2PlxuICA8ZGl2XG4gICAgY2xhc3M9XCJsYXJnZS13cmFwcGVyXCJcbiAgICBbY2xhc3MudHVpLXNrZWxldG9uXT1cInRoaXMubG9hZGluZ1wiXG4gICAgW2NsYXNzLnR1aS1za2VsZXRvbl9yb3VuZGVkXT1cInRoaXMubG9hZGluZ1wiXG4gID48L2Rpdj5cbiAgPGRpdlxuICAgIGNsYXNzPVwibGFyZ2Utd3JhcHBlclwiXG4gICAgW2NsYXNzLnR1aS1za2VsZXRvbl09XCJ0aGlzLmxvYWRpbmdcIlxuICAgIFtjbGFzcy50dWktc2tlbGV0b25fcm91bmRlZF09XCJ0aGlzLmxvYWRpbmdcIlxuICA+PC9kaXY+XG48L2Rpdj5cbjx0dWktcHVzaFxuICBpZD1cImZpZWxkLWVycm9yLW5vdGlmaWNhdGlvblwiXG4gICp0dWlQdXNoPVwic2hvd0Vycm9yTm90aWZpY2F0aW9uXCJcbiAgaGVhZGluZz1cIk1pc3NpbmcvSW5jb3JyZWN0IEZpZWxkcyFcIlxuICB0eXBlPVwiRXJyb3JcIlxuICAoY2xvc2UpPVwidG9nZ2xlRXJyb3JOb3RpZmljYXRpb24oZmFsc2UpXCJcbj5cbiAgPHR1aS1zdmdcbiAgICBzcmM9XCJ0dWlJY29uQ2FuY2VsXCJcbiAgICBzdHlsZT1cImNvbG9yOiAjZmZmICFpbXBvcnRhbnRcIlxuICA+XG4gIDwvdHVpLXN2Zz5cbjwvdHVpLXB1c2g+XG4iXX0=
817
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS12aWV3LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2t3aWtpZC1mb3Jtcy9zcmMvbGliL3JlbmRlcmVyL2Zvcm0tdmlldy9mb3JtLXZpZXcuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva3dpa2lkLWZvcm1zL3NyYy9saWIvcmVuZGVyZXIvZm9ybS12aWV3L2Zvcm0tdmlldy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUVMLFNBQVMsRUFDVCxZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFFTCxNQUFNLEVBRVAsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQy9DLE9BQU8sRUFDTCxNQUFNLEVBQ04sb0JBQW9CLEVBQ3BCLFNBQVMsRUFDVCxzQkFBc0IsRUFDdEIsWUFBWSxFQUNaLGVBQWUsRUFDZixXQUFXLEVBQ1gsU0FBUyxFQUNULGFBQWEsRUFDYixJQUFJLEVBQ0osTUFBTSxFQUdOLFVBQVUsRUFDWCxNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMxQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDeEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQ3pFLE9BQU8sRUFDTCxZQUFZLEVBRWIsTUFBTSw0Q0FBNEMsQ0FBQztBQUtwRCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0saUNB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QVNyQix1Q0FBdUMsTUF1Q3ZDLGdDQUFnQyxNQWdCaEMsa0NBQWtDLE1BeUNsQyw0QkFBNEIsTUErQjVCLHVCQUF1QixNQStDN0IsaUJBQWlCLE1BaURYLDRCQUE0QixNQXlCNUIsb0JBQW9CLE1BOEQxQixzQkFBc0IsTUFPdEIscUJBQXFCLE1BNEVyQix1QkFBdUIsTUFNdkIsU0FBUyxNQVdULGNBQWMsTUFPZCxTQUFTLE1BV1QsY0FBYyxNQU9kLFlBQVksTUFtQlosaUJBQWlCLE1BT2pCLFdBQVcsTUFtQlgsZ0JBQWdCLE1BT2hCLFVBQVUsTUE4Q1YsY0FBYyxNQWFkLGNBQWMsTUFhZCxnQkFBZ0IsTUFZaEIsZ0JBQWdCLE1BWWhCLGNBQWMsTUFHZCxzQkFBc0IsTUFVdEIsY0FBYyxNQVNkLFlBQVksTUFLWixjQUFjLE1BS2QscUJBQXFCLE1BS2Ysc0JBQXNCLE1Bb0J0QixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIEluamVjdCxcbiAgSW5wdXQsXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBTaW1wbGVDaGFuZ2VzXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBGb3JtR3JvdXAgfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcbmltcG9ydCB7IFR1aUFsZXJ0U2VydmljZSB9IGZyb20gXCJAdGFpZ2EtdWkvY29yZVwiO1xuaW1wb3J0IHsgVHVpUHVzaFNlcnZpY2UgfSBmcm9tIFwiQHRhaWdhLXVpL2tpdFwiO1xuaW1wb3J0IHtcbiAgQWN0aW9uLFxuICBjaGVja09iamVjdEtleUV4aXN0cyxcbiAgQ29uZGl0aW9uLFxuICBnZXRPYmplY3RWYWx1ZUZyb21QYXRoLFxuICBpc0VtcHR5VmFsdWUsXG4gIGlzTm90RW1wdHlWYWx1ZSxcbiAgaXNVbmRlZmluZWQsXG4gIGxvZ01ldGhvZCxcbiAgcmVwbGFjZVN0cmluZyxcbiAgUnVsZSxcbiAgU291cmNlLFxuICBUQWN0aW9uLFxuICBUVmFsaWRhdGlvbixcbiAgVmFsaWRhdGlvblxufSBmcm9tIFwia3dpa2lkLXRvb2xraXRcIjtcbmltcG9ydCB7IHBhaXJ3aXNlIH0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XG5pbXBvcnQgeyBFQWN0aW9uS2V5IH0gZnJvbSBcIi4vZGVmaW5pdGlvbnMvZm9ybS12aWV3LmFjdGlvbnMuZGVmaW5pdGlvblwiO1xuaW1wb3J0IHsgRUFwaVN0YXR1c1R5cGUgfSBmcm9tIFwiLi9kZWZpbml0aW9ucy9mb3JtLXZpZXcuYXBpcy5kZWZpbml0aW9uXCI7XG5pbXBvcnQge1xuICBFTWVzc2FnZVR5cGUsXG4gIFRNZXNzYWdlXG59IGZyb20gXCIuL2RlZmluaXRpb25zL2Zvcm0tdmlldy5jb21tb25zLmRlZmluaXRpb25cIjtcbmltcG9ydCB7XG4gIFRGaWVsZEFwaUNhbGwsXG4gIFRGaWVsZFRpdGxlXG59IGZyb20gXCIuL2RlZmluaXRpb25zL2Zvcm0tdmlldy5maWVsZHMuZGVmaW5pdGlvblwiO1xuaW1wb3J0IHsgS3dpa0lERm9ybVZpZXdTZXJ2aWNlIH0gZnJvbSBcIi4vZm9ybS12aWV3LnNlcnZpY2VcIjtcbmltcG9ydCB7IEFwaXMgfSBmcm9tIFwiLi9oZWxwZXJzL2Zvcm0tdmlldy5hcGlzLmhlbHBlclwiO1xuaW1wb3J0IHtcbiAgYXBwZW5kRm9ybUZpZWxkTWVzc2FnZSxcbiAgY29udmVydEZvcm1GaWVsZEVtcHR5VmFsdWVUb0t3aWtVSUZvcm1hdCxcbiAgY29udmVydEZvcm1GaWVsZFZhbHVlVG9TdGFuZGFyZEZvcm1hdCxcbiAgZ2V0Rm9ybUZpZWxkQnlLZXksXG4gIGdldEZvcm1GaWVsZEluZGV4QnlLZXksXG4gIGhpZ2hsaWdodEZvcm1GaWVsZEVycm9yLFxuICByZW1vdmVGb3JtRmllbGRNZXNzYWdlLFxuICBzaG93Rm9ybUZpZWxkRXJyb3Jcbn0gZnJvbSBcIi4vaGVscGVycy9mb3JtLXZpZXcuZmllbGRzLmhlbHBlclwiO1xuaW1wb3J0IHsgRm9ybVZhbGlkYXRpb24gfSBmcm9tIFwiLi9oZWxwZXJzL2Zvcm0tdmlldy5mb3JtLXZhbGlkYXRpb25zLmhlbHBlclwiO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6IFwia3dpa2lkLWZvcm0tdmlld1wiLFxuICB0ZW1wbGF0ZVVybDogXCIuL2Zvcm0tdmlldy5jb21wb25lbnQuaHRtbFwiLFxuICBzdHlsZVVybHM6IFtcIi4vZm9ybS12aWV3LmNvbXBvbmVudC5zY3NzXCJdLFxuICBwcm92aWRlcnM6IFtLd2lrSURGb3JtVmlld1NlcnZpY2VdXG59KVxuZXhwb3J0IGNsYXNzIEt3aWtJREZvcm1WaWV3Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0IHtcbiAgQElucHV0KClcbiAgZm9ybUNvbmZpZzogYW55O1xuXG4gIEBJbnB1dCgpXG4gIGZvcm1EYXRhOiBhbnk7XG5cbiAgQElucHV0KClcbiAgYXBpQ2FsbFJlc3BvbnNlOiBhbnkgPSB7fTtcblxuICBASW5wdXQoKVxuICBpc01vYmlsZVZpZXc6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBASW5wdXQoKVxuICBhbGxGb3Jtc0RhdGE6IGFueTtcblxuICBASW5wdXQoKVxuICBmb3Jtc0xpc3Q6IGFueVtdO1xuXG4gIEBPdXRwdXQoKVxuICBvbkNsaWNrVmlld0Zvcm1zOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gIEBPdXRwdXQoKVxuICBvbkNsaWNrU2F2ZUZvcm06IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgQE91dHB1dCgpXG4gIG9uQ2xpY2tBcGlDYWxsOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gIEBPdXRwdXQoKVxuICBnZXRBY3RpdmVGb3JtRGF0YTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICBmaWVsZEdyb3VwczogYW55ID0ge307XG4gIGZvcm1GaWVsZHM6IGFueVtdID0gW107XG4gIHByZXZpb3VzRm9ybURhdGE6IGFueSA9IHt9O1xuXG4gIGxvYWRpbmc6IGJvb2xlYW4gPSB0cnVlO1xuICB2aWV3Rm9ybXNCdXR0b24gPSB7XG4gICAgZGlzYWJsZWQ6IGZhbHNlLFxuICAgIHNob3dMb2FkZXI6IGZhbHNlXG4gIH07XG4gIHNhdmVGb3JtQnV0dG9uID0ge1xuICAgIGRpc2FibGVkOiBmYWxzZSxcbiAgICBzaG93TG9hZGVyOiBmYWxzZVxuICB9O1xuXG4gIGZvcm1Hcm91cDogRm9ybUdyb3VwID0gbmV3IEZvcm1Hcm91cCh7fSk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdChUdWlQdXNoU2VydmljZSkgcHJvdGVjdGVkIHJlYWRvbmx5IHB1c2g6IFR1aVB1c2hTZXJ2aWNlLFxuICAgIEBJbmplY3QoVHVpQWxlcnRTZXJ2aWNlKSBwcm90ZWN0ZWQgcmVhZG9ubHkgYWxlcnQ6IFR1aUFsZXJ0U2VydmljZSxcbiAgICBwcml2YXRlIGZvcm1WaWV3U2VydmljZTogS3dpa0lERm9ybVZpZXdTZXJ2aWNlXG4gICkge31cblxuICBAbG9nTWV0aG9kXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIChhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCB0aGlzLmluaXRGb3JtQ29uZmlnKHRoaXMuZm9ybUNvbmZpZyk7XG5cbiAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgIH0pKCk7XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHt9XG5cbiAgQGxvZ01ldGhvZFxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgY29uc3QgdmVyaWZ5Q2hhbmdlID0gKGtleTogc3RyaW5nKSA9PiB7XG4gICAgICByZXR1cm4gY2hlY2tPYmplY3RLZXlFeGlzdHMoY2hhbmdlcywga2V5KSAmJiAhY2hhbmdlc1trZXldLmZpcnN0Q2hhbmdlO1xuICAgIH07XG4gICAgaWYgKHZlcmlmeUNoYW5nZShcImZvcm1EYXRhXCIpKSB7XG4gICAgICB0aGlzLmZvcm1EYXRhID0ge1xuICAgICAgICAuLi50aGlzLmZvcm1EYXRhLFxuICAgICAgICAuLi5jaGFuZ2VzLmZvcm1EYXRhLmN1cnJlbnRWYWx1ZVxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKHZlcmlmeUNoYW5nZShcImFwaUNhbGxSZXNwb25zZVwiKSkge1xuICAgICAgdGhpcy5hcGlDYWxsUmVzcG9uc2UgPSBjaGFuZ2VzLmFwaUNhbGxSZXNwb25zZS5jdXJyZW50VmFsdWU7XG5cbiAgICAgIHRoaXMuZm9ybURhdGEgPSB7XG4gICAgICAgIC4uLnRoaXMuZm9ybURhdGEsXG4gICAgICAgIFt0aGlzLmFwaUNhbGxSZXNwb25zZS5rZXldOiB0aGlzLmFwaUNhbGxSZXNwb25zZS5yZXNwb25zZVxuICAgICAgfTtcblxuICAgICAgdGhpcy5mb3JtR3JvdXAucGF0Y2hWYWx1ZShcbiAgICAgICAge1xuICAgICAgICAgIFt0aGlzLmFwaUNhbGxSZXNwb25zZS5rZXldOiB0aGlzLmFwaUNhbGxSZXNwb25zZS5yZXNwb25zZVxuICAgICAgICB9LFxuICAgICAgICB7IGVtaXRFdmVudDogZmFsc2UgfVxuICAgICAgKTtcblxuICAgICAgbGV0IGZpZWxkOiBURmllbGRBcGlDYWxsID0gZ2V0Rm9ybUZpZWxkQnlLZXkoXG4gICAgICAgIHRoaXMuZm9ybUZpZWxkcyxcbiAgICAgICAgdGhpcy5hcGlDYWxsUmVzcG9uc2Uua2V5XG4gICAgICApO1xuXG4gICAgICBjb25zdCBhcGlzID0gbmV3IEFwaXMoXG4gICAgICAgIHtcbiAgICAgICAgICBGSUVMRF9DT05GSUc6IGZpZWxkLFxuICAgICAgICAgIEZPUk1fRklFTERTOiB0aGlzLmZvcm1GaWVsZHMsXG4gICAgICAgICAgRk9STV9EQVRBOiB0aGlzLmZvcm1EYXRhLFxuICAgICAgICAgIFBSRVZJT1VTX0ZPUk1fREFUQTogdGhpcy5wcmV2aW91c0Zvcm1EYXRhLFxuICAgICAgICAgIEFMTF9GT1JNU19EQVRBOiB0aGlzLmFsbEZvcm1zRGF0YVxuICAgICAgICB9LFxuICAgICAgICB0aGlzLnRha2VBY3Rpb24uYmluZCh0aGlzKVxuICAgICAgKTtcblxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgZmllbGQgPSBhd2FpdCBhcGlzLnZhbGlkYXRlUmVzcG9uc2UoKTtcbiAgICAgIH0pKCk7XG4gICAgfVxuICAgIGlmICh2ZXJpZnlDaGFuZ2UoXCJpc01vYmlsZVZpZXdcIikpIHtcbiAgICAgIHRoaXMuaXNNb2JpbGVWaWV3ID0gY2hhbmdlcy5pc01vYmlsZVZpZXcuY3VycmVudFZhbHVlO1xuICAgIH1cbiAgICBpZiAodmVyaWZ5Q2hhbmdlKFwiYWxsRm9ybXNEYXRhXCIpKSB7XG4gICAgICB0aGlzLmFsbEZvcm1zRGF0YSA9IGNoYW5nZXMuYWxsRm9ybXNEYXRhLmN1cnJlbnRWYWx1ZTtcbiAgICB9XG4gICAgaWYgKHZlcmlmeUNoYW5nZShcImZvcm1zTGlzdFwiKSkge1xuICAgICAgdGhpcy5mb3Jtc0xpc3QgPSBjaGFuZ2VzLmZvcm1zTGlzdC5jdXJyZW50VmFsdWU7XG4gICAgfVxuICAgIGlmICh2ZXJpZnlDaGFuZ2UoXCJmb3JtQ29uZmlnXCIpKSB7XG4gICAgICB0aGlzLmZvcm1Db25maWcgPSBjaGFuZ2VzLmZvcm1Db25maWcuY3VycmVudFZhbHVlO1xuXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCB0aGlzLmluaXRGb3JtQ29uZmlnKHRoaXMuZm9ybUNvbmZpZyk7XG4gICAgICB9KSgpO1xuICAgIH1cbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgYXN5bmMgaW5pdEZvcm1Db25maWcoZm9ybUNvbmZpZzogYW55KSB7XG4gICAgdGhpcy5zZXRGb3JtRmllbGRzRnJvbUZvcm1Db25maWcoZm9ybUNvbmZpZyk7XG5cbiAgICB0aGlzLnNldEZvcm1GaWVsZEdyb3Vwc0Zyb21Gb3JtQ29uZmlnKGZvcm1Db25maWcpO1xuXG4gICAgdGhpcy5zZXRGb3JtRGF0YUZyb21BbGxGb3Jtc0RhdGEoKTtcblxuICAgIHRoaXMuZm9ybUdyb3VwID0gYXdhaXQgdGhpcy5mb3JtVmlld1NlcnZpY2UuY3JlYXRlRm9ybUdyb3VwKFxuICAgICAgdGhpcy5mb3JtRmllbGRzLFxuICAgICAgdGhpcy5mb3JtRGF0YSxcbiAgICAgIHRoaXMucHJldmlvdXNGb3JtRGF0YSxcbiAgICAgIHRoaXMuYWxsRm9ybXNEYXRhLFxuICAgICAgdGhpcy50YWtlQWN0aW9uLmJpbmQodGhpcylcbiAgICApO1xuXG4gICAgZm9yIChsZXQgZmllbGQgb2YgdGhpcy5mb3JtRmllbGRzKSB7XG4gICAgICBpZiAoZmllbGQuaXNGb3JtRWxlbWVudCkge1xuICAgICAgICB0aGlzLnByZXZpb3VzRm9ybURhdGEgPSB7XG4gICAgICAgICAgLi4udGhpcy5wcmV2aW91c0Zvcm1EYXRhLFxuICAgICAgICAgIFtmaWVsZC5rZXldOiB0aGlzLmZvcm1Hcm91cC5jb250cm9sc1tmaWVsZC5rZXldLnZhbHVlXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHNbZmllbGQua2V5XS52YWx1ZUNoYW5nZXNcbiAgICAgICAgICAucGlwZShwYWlyd2lzZSgpKVxuICAgICAgICAgIC5zdWJzY3JpYmUoKFtwcmV2aW91c1ZhbHVlLCBjdXJyZW50VmFsdWVdKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnByZXZpb3VzRm9ybURhdGEgPSB7XG4gICAgICAgICAgICAgIC4uLnRoaXMucHJldmlvdXNGb3JtRGF0YSxcbiAgICAgICAgICAgICAgW2ZpZWxkLmtleV06IGNvbnZlcnRGb3JtRmllbGRWYWx1ZVRvU3RhbmRhcmRGb3JtYXQoXG4gICAgICAgICAgICAgICAgZmllbGQsXG4gICAgICAgICAgICAgICAgcHJldmlvdXNWYWx1ZVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICB0aGlzLmZvcm1EYXRhID0ge1xuICAgICAgICAgICAgICAuLi50aGlzLmZvcm1EYXRhLFxuICAgICAgICAgICAgICBbZmllbGQua2V5XTogY29udmVydEZvcm1GaWVsZFZhbHVlVG9TdGFuZGFyZEZvcm1hdChcbiAgICAgICAgICAgICAgICBmaWVsZCxcbiAgICAgICAgICAgICAgICBjdXJyZW50VmFsdWVcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGxldCBmaWVsZCBvZiB0aGlzLmZvcm1GaWVsZHMpIHtcbiAgICAgIGlmIChmaWVsZC5pc0Zvcm1FbGVtZW50KSB7XG4gICAgICAgIGlmIChmaWVsZC52YWxpZGF0aW9uLnRyaWdnZXJzLmluY2x1ZGVzKFwiT05fSU5JVFwiKSkge1xuICAgICAgICAgIGNvbnN0IHZhbGlkYXRpb25zID0gbmV3IFZhbGlkYXRpb24oXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIEZJRUxEX0NPTkZJRzogZmllbGQsXG4gICAgICAgICAgICAgIEZPUk1fRklFTERTOiB0aGlzLmZvcm1GaWVsZHMsXG4gICAgICAgICAgICAgIEZPUk1fREFUQTogdGhpcy5mb3JtRGF0YSxcbiAgICAgICAgICAgICAgUFJFVklPVVNfRk9STV9EQVRBOiB0aGlzLnByZXZpb3VzRm9ybURhdGEsXG4gICAgICAgICAgICAgIEFMTF9GT1JNU19EQVRBOiB0aGlzLmFsbEZvcm1zRGF0YVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRoaXMudGFrZUFjdGlvbi5iaW5kKHRoaXMpXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBhd2FpdCB2YWxpZGF0aW9ucy52YWxpZGF0ZShmaWVsZC52YWxpZGF0aW9uKTtcbiAgICAgICAgICB9KSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGVja09iamVjdEtleUV4aXN0cyhmaWVsZCwgXCJjb25uZWN0ZWRFbGVtZW50c1wiKSkge1xuICAgICAgICAgIHRoaXMuaGFuZGxlQ29ubmVjdGVkRWxlbWVudHMoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGtleTogZmllbGQua2V5LFxuICAgICAgICAgICAgICB2YWx1ZTogdGhpcy5mb3JtR3JvdXAuY29udHJvbHNbZmllbGQua2V5XS52YWx1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiT05fSU5JVFwiXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgc2V0Rm9ybUZpZWxkc0Zyb21Gb3JtQ29uZmlnKGZvcm1Db25maWc6IGFueSkge1xuICAgIGlmIChjaGVja09iamVjdEtleUV4aXN0cyhmb3JtQ29uZmlnLCBcImZpZWxkc1wiKSkge1xuICAgICAgdGhpcy5mb3JtRmllbGRzID0gZm9ybUNvbmZpZy5maWVsZHM7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIGNoZWNrT2JqZWN0S2V5RXhpc3RzKGZvcm1Db25maWcsIFwibXVsdGlGb3JtXCIpICYmXG4gICAgICBjaGVja09iamVjdEtleUV4aXN0cyhmb3JtQ29uZmlnLm11bHRpRm9ybSwgXCJmaWVsZHNcIilcbiAgICApIHtcbiAgICAgIHRoaXMuZm9ybUZpZWxkcyA9IGZvcm1Db25maWcubXVsdGlGb3JtLmZpZWxkcztcbiAgICB9XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIHNldEZvcm1GaWVsZEdyb3Vwc0Zyb21Gb3JtQ29uZmlnKGZvcm1Db25maWc6IGFueSkge1xuICAgIHRoaXMuZmllbGRHcm91cHMgPSBmb3JtQ29uZmlnLmZpZWxkR3JvdXBzO1xuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBzZXRGb3JtRGF0YUZyb21BbGxGb3Jtc0RhdGEoKSB7XG4gICAgaWYgKGNoZWNrT2JqZWN0S2V5RXhpc3RzKHRoaXMuYWxsRm9ybXNEYXRhLCB0aGlzLmZvcm1Db25maWcua2V5KSkge1xuICAgICAgdGhpcy5mb3JtRGF0YSA9IHRoaXMuYWxsRm9ybXNEYXRhW3RoaXMuZm9ybUNvbmZpZy5rZXldO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmZvcm1EYXRhID0ge307XG4gICAgfVxuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBhc3luYyBoYW5kbGVDb25uZWN0ZWRFbGVtZW50RmllbGRHcm91cEFjdGlvbnMoXG4gICAgY2hpbGRGaWVsZEdyb3VwQ29uZmlnOiBhbnksXG4gICAgcGFyZW50RmllbGQ6IGFueVxuICApIHtcbiAgICBpZiAoY2hlY2tPYmplY3RLZXlFeGlzdHMoY2hpbGRGaWVsZEdyb3VwQ29uZmlnLCBcInJ1bGVzXCIpKSB7XG4gICAgICBjb25zdCBydWxlc01hcHBpbmcgPSBuZXcgUnVsZShjaGlsZEZpZWxkR3JvdXBDb25maWcucnVsZXMsIHtcbiAgICAgICAgRklFTERfQ09ORklHOiBwYXJlbnRGaWVsZCxcbiAgICAgICAgRk9STV9EQVRBOiB0aGlzLmZvcm1EYXRhLFxuICAgICAgICBQUkVWSU9VU19GT1JNX0RBVEE6IHRoaXMucHJldmlvdXNGb3JtRGF0YSxcbiAgICAgICAgQUxMX0ZPUk1TX0RBVEE6IHRoaXMuYWxsRm9ybXNEYXRhXG4gICAgICB9KS5tYXBwaW5nKCk7XG5cbiAgICAgIGZvciAobGV0IGFjdGlvbiBvZiBjaGlsZEZpZWxkR3JvdXBDb25maWcuYWN0aW9ucykge1xuICAgICAgICBjb25zdCBjb25kaXRpb25TdWNjZXNzID0gbmV3IENvbmRpdGlvbihcbiAgICAgICAgICBhY3Rpb24uY29uZGl0aW9uLFxuICAgICAgICAgIHJ1bGVzTWFwcGluZ1xuICAgICAgICApLmV2YWx1YXRlKCk7XG5cbiAgICAgICAgaWYgKGNvbmRpdGlvblN1Y2Nlc3MpIHtcbiAgICAgICAgICBjb25zdCBhY3Rpb25zID0gbmV3IEFjdGlvbihcbiAgICAgICAgICAgIGFjdGlvbixcbiAgICAgICAgICAgIHJ1bGVzTWFwcGluZyxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgRklFTERfQ09ORklHOiBwYXJlbnRGaWVsZCxcbiAgICAgICAgICAgICAgRk9STV9GSUVMRFM6IHRoaXMuZm9ybUZpZWxkcyxcbiAgICAgICAgICAgICAgRk9STV9EQVRBOiB0aGlzLmZvcm1EYXRhLFxuICAgICAgICAgICAgICBQUkVWSU9VU19GT1JNX0RBVEE6IHRoaXMucHJldmlvdXNGb3JtRGF0YSxcbiAgICAgICAgICAgICAgQUxMX0ZPUk1TX0RBVEE6IHRoaXMuYWxsRm9ybXNEYXRhXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdGhpcy50YWtlQWN0aW9uT25GaWVsZEdyb3VwLmJpbmQodGhpcylcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgYXdhaXQgYWN0aW9ucy5leGVjdXRlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIGFzeW5jIGhhbmRsZUNvbm5lY3RlZEVsZW1lbnRGaWVsZEdyb3VwKFxuICAgIGN1cnJlbnRGaWVsZDogYW55LFxuICAgIGNvbm5lY3RlZEZpZWxkR3JvdXBDb25maWc6IGFueSxcbiAgICBldmVudFR5cGU6IHN0cmluZ1xuICApIHtcbiAgICBpZiAoY2hlY2tPYmplY3RLZXlFeGlzdHMoY29ubmVjdGVkRmllbGRHcm91cENvbmZpZywgXCJ0cmlnZ2Vyc1wiKSkge1xuICAgICAgaWYgKGNvbm5lY3RlZEZpZWxkR3JvdXBDb25maWcudHJpZ2dlcnMuaW5jbHVkZXMoZXZlbnRUeXBlKSkge1xuICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUNvbm5lY3RlZEVsZW1lbnRGaWVsZEdyb3VwQWN0aW9ucyhcbiAgICAgICAgICBjb25uZWN0ZWRGaWVsZEdyb3VwQ29uZmlnLFxuICAgICAgICAgIGN1cnJlbnRGaWVsZFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgYXN5bmMgaGFuZGxlQ29ubmVjdGVkRWxlbWVudEZpZWxkQWN0aW9ucyhcbiAgICBjb25uZWN0ZWRGaWVsZENvbmZpZzogYW55LFxuICAgIGNvbm5lY3RlZEZpZWxkOiBhbnlcbiAgKSB7XG4gICAgaWYgKGNoZWNrT2JqZWN0S2V5RXhpc3RzKGNvbm5lY3RlZEZpZWxkQ29uZmlnLCBcInJ1bGVzXCIpKSB7XG4gICAgICBjb25zdCBydWxlc01hcHBpbmcgPSBuZXcgUnVsZShjb25uZWN0ZWRGaWVsZENvbmZpZy5ydWxlcywge1xuICAgICAgICBGSUVMRF9DT05GSUc6IGNvbm5lY3RlZEZpZWxkLFxuICAgICAgICBGT1JNX0RBVEE6IHRoaXMuZm9ybURhdGEsXG4gICAgICAgIFBSRVZJT1VTX0ZPUk1fREFUQTogdGhpcy5wcmV2aW91c0Zvcm1EYXRhLFxuICAgICAgICBBTExfRk9STVNfREFUQTogdGhpcy5hbGxGb3Jtc0RhdGFcbiAgICAgIH0pLm1hcHBpbmcoKTtcblxuICAgICAgZm9yIChsZXQgYWN0aW9uIG9mIGNvbm5lY3RlZEZpZWxkQ29uZmlnLmFjdGlvbnMpIHtcbiAgICAgICAgY29uc3QgY29uZGl0aW9uU3VjY2VzcyA9IG5ldyBDb25kaXRpb24oXG4gICAgICAgICAgYWN0aW9uLmNvbmRpdGlvbixcbiAgICAgICAgICBydWxlc01hcHBpbmdcbiAgICAgICAgKS5ldmFsdWF0ZSgpO1xuXG4gICAgICAgIGlmIChjb25kaXRpb25TdWNjZXNzKSB7XG4gICAgICAgICAgY29uc3QgYWN0aW9ucyA9IG5ldyBBY3Rpb24oXG4gICAgICAgICAgICBhY3Rpb24sXG4gICAgICAgICAgICBydWxlc01hcHBpbmcsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIEZPUk1fRklFTERTOiB0aGlzLmZvcm1GaWVsZHMsXG4gICAgICAgICAgICAgIEZJRUxEX0NPTkZJRzogY29ubmVjdGVkRmllbGQsXG4gICAgICAgICAgICAgIEZPUk1fREFUQTogdGhpcy5mb3JtRGF0YSxcbiAgICAgICAgICAgICAgUFJFVklPVVNfRk9STV9EQVRBOiB0aGlzLnByZXZpb3VzRm9ybURhdGEsXG4gICAgICAgICAgICAgIEFMTF9GT1JNU19EQVRBOiB0aGlzLmFsbEZvcm1zRGF0YVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRoaXMudGFrZUFjdGlvbi5iaW5kKHRoaXMpXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGF3YWl0IGFjdGlvbnMuZXhlY3V0ZSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbm5lY3RlZEZpZWxkO1xuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBhc3luYyBoYW5kbGVDb25uZWN0ZWRFbGVtZW50RmllbGRzKFxuICAgIGN1cnJlbnRGaWVsZDogYW55LFxuICAgIGNvbm5lY3RlZEZpZWxkQ29uZmlnOiBhbnksXG4gICAgZXZlbnRUeXBlOiBzdHJpbmcsXG4gICAgbmVzdGVkOiBzdHJpbmdcbiAgKSB7XG4gICAgbGV0IGNvbm5lY3RlZEZpZWxkID0gZ2V0Rm9ybUZpZWxkQnlLZXkoXG4gICAgICB0aGlzLmZvcm1GaWVsZHMsXG4gICAgICBjb25uZWN0ZWRGaWVsZENvbmZpZ1tcImtleVwiXVxuICAgICk7XG5cbiAgICBpZiAoY2hlY2tPYmplY3RLZXlFeGlzdHMoY29ubmVjdGVkRmllbGRDb25maWcsIFwidHJpZ2dlcnNcIikpIHtcbiAgICAgIGlmIChjb25uZWN0ZWRGaWVsZENvbmZpZy50cmlnZ2Vycy5pbmNsdWRlcyhldmVudFR5cGUpKSB7XG4gICAgICAgIGNvbm5lY3RlZEZpZWxkID0gYXdhaXQgdGhpcy5oYW5kbGVDb25uZWN0ZWRFbGVtZW50RmllbGRBY3Rpb25zKFxuICAgICAgICAgIGNvbm5lY3RlZEZpZWxkQ29uZmlnLFxuICAgICAgICAgIGNvbm5lY3RlZEZpZWxkXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjaGVja09iamVjdEtleUV4aXN0cyhjb25uZWN0ZWRGaWVsZENvbmZpZywgXCJoYW5kbGVOZXN0ZWRGaWVsZHNcIikpIHtcbiAgICAgIGlmIChjb25uZWN0ZWRGaWVsZENvbmZpZy5oYW5kbGVOZXN0ZWRGaWVsZHMpIHtcbiAgICAgICAgdGhpcy5oYW5kbGVDb25uZWN0ZWRFbGVtZW50cyhcbiAgICAgICAgICB7IGtleTogY29ubmVjdGVkRmllbGRDb25maWcua2V5IH0sXG4gICAgICAgICAgZXZlbnRUeXBlXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjdXJyZW50RmllbGQ7XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIGFzeW5jIGhhbmRsZUNvbm5lY3RlZEVsZW1lbnRzKGU6IGFueSwgZXZlbnRUeXBlOiBzdHJpbmcpIHtcbiAgICBsZXQgY3VycmVudEZpZWxkID0gZ2V0Rm9ybUZpZWxkQnlLZXkodGhpcy5mb3JtRmllbGRzLCBlLmtleSk7XG5cbiAgICBpZiAoY3VycmVudEZpZWxkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChjaGVja09iamVjdEtleUV4aXN0cyhjdXJyZW50RmllbGQsIFwiY29ubmVjdGVkRWxlbWVudHNcIikpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGNoZWNrT2JqZWN0S2V5RXhpc3RzKFxuICAgICAgICAgICAgY3VycmVudEZpZWxkLmNvbm5lY3RlZEVsZW1lbnRzLFxuICAgICAgICAgICAgXCJjb25uZWN0ZWRGaWVsZEdyb3Vwc1wiXG4gICAgICAgICAgKVxuICAgICAgICApIHtcbiAgICAgICAgICBsZXQgY29ubmVjdGVkRmllbGRHcm91cHMgPVxuICAgICAgICAgICAgY3VycmVudEZpZWxkLmNvbm5lY3RlZEVsZW1lbnRzLmNvbm5lY3RlZEZpZWxkR3JvdXBzO1xuICAgICAgICAgIGZvciAobGV0IGNvbm5lY3RlZEZpZWxkR3JvdXBDb25maWcgb2YgY29ubmVjdGVkRmllbGRHcm91cHMpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlQ29ubmVjdGVkRWxlbWVudEZpZWxkR3JvdXAoXG4gICAgICAgICAgICAgIGN1cnJlbnRGaWVsZCxcbiAgICAgICAgICAgICAgY29ubmVjdGVkRmllbGRHcm91cENvbmZpZyxcbiAgICAgICAgICAgICAgZXZlbnRUeXBlXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoXG4gICAgICAgICAgY2hlY2tPYmplY3RLZXlFeGlzdHMoXG4gICAgICAgICAgICBjdXJyZW50RmllbGQuY29ubmVjdGVkRWxlbWVudHMsXG4gICAgICAgICAgICBcImNvbm5lY3RlZEZpZWxkc1wiXG4gICAgICAgICAgKVxuICAgICAgICApIHtcbiAgICAgICAgICBsZXQgY29ubmVjdGVkRmllbGRzID0gY3VycmVudEZpZWxkLmNvbm5lY3RlZEVsZW1lbnRzLmNvbm5lY3RlZEZpZWxkcztcbiAgICAgICAgICBmb3IgKGxldCBjb25uZWN0ZWRGaWVsZENvbmZpZyBvZiBjb25uZWN0ZWRGaWVsZHMpIHtcbiAgICAgICAgICAgIGN1cnJlbnRGaWVsZCA9IGF3YWl0IHRoaXMuaGFuZGxlQ29ubmVjdGVkRWxlbWVudEZpZWxkcyhcbiAgICAgICAgICAgICAgY3VycmVudEZpZWxkLFxuICAgICAgICAgICAgICBjb25uZWN0ZWRGaWVsZENvbmZpZyxcbiAgICAgICAgICAgICAgZXZlbnRUeXBlLFxuICAgICAgICAgICAgICBldmVudFR5cGVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEZpZWxkIGZvciB0aGUgZ2l2ZW4ga2V5IFsnJHtlLmtleX0nXSBpcyBub3QgZm91bmQgd2l0aCBldmVudFR5cGU6ICcke2V2ZW50VHlwZX0nLmBcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLy8gRE9NIEV2ZW50IEhhbmRsZXJzXG4gIEBsb2dNZXRob2RcbiAgaGFuZGxlR2V0S2V5VmFsdWUoZTogYW55KSB7XG4gICAgdGhpcy5mb3JtR3JvdXAucGF0Y2hWYWx1ZShcbiAgICAgIHtcbiAgICAgICAgW2Uua2V5XTogZS52YWx1ZVxuICAgICAgfSxcbiAgICAgIHsgZW1pdEV2ZW50OiBmYWxzZSB9XG4gICAgKTtcblxuICAgIGNvbnN0IGZpZWxkID0gZ2V0Rm9ybUZpZWxkQnlLZXkodGhpcy5mb3JtRmllbGRzLCBlLmtleSk7XG4gICAgdGhpcy5mb3JtRGF0YVtlLmtleV0gPSBjb252ZXJ0Rm9ybUZpZWxkVmFsdWVUb1N0YW5kYXJkRm9ybWF0KFxuICAgICAgZmllbGQsXG4gICAgICBlLnZhbHVlXG4gICAgKTtcblxuICAgIGlmIChcbiAgICAgIGZpZWxkLmlzRm9ybUVsZW1lbnQgJiZcbiAgICAgIGZpZWxkLnZhbGlkYXRpb24udHJpZ2dlcnMuaW5jbHVkZXMoXCJPTl9DSEFOR0VcIilcbiAgICApIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25zID0gbmV3IFZhbGlkYXRpb24oXG4gICAgICAgIHtcbiAgICAgICAgICBGSUVMRF9DT05GSUc6IGZpZWxkLFxuICAgICAgICAgIEZPUk1fRklFTERTOiB0aGlzLmZvcm1GaWVsZHMsXG4gICAgICAgICAgRk9STV9EQVRBOiB0aGlzLmZvcm1EYXRhLFxuICAgICAgICAgIFBSRVZJT1VTX0ZPUk1fREFUQTogdGhpcy5wcmV2aW91c0Zvcm1EYXRhLFxuICAgICAgICAgIEFMTF9GT1JNU19EQVRBOiB0aGlzLmFsbEZvcm1zRGF0YVxuICAgICAgICB9LFxuICAgICAgICB0aGlzLnRha2VBY3Rpb24uYmluZCh0aGlzKVxuICAgICAgKTtcblxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgdmFsaWRhdGlvbnMudmFsaWRhdGUoZmllbGQudmFsaWRhdGlvbik7XG4gICAgICB9KSgpO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIGZpZWxkLmlzRm9ybUVsZW1lbnQgJiZcbiAgICAgIGNoZWNrT2JqZWN0S2V5RXhpc3RzKGZpZWxkLCBcImNvbm5lY3RlZEVsZW1lbnRzXCIpXG4gICAgKSB7XG4gICAgICB0aGlzLmhhbmRsZUNvbm5lY3RlZEVsZW1lbnRzKFxuICAgICAgICB7XG4gICAgICAgICAga2V5OiBmaWVsZC5rZXksXG4gICAgICAgICAgdmFsdWU6IHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzW2ZpZWxkLmtleV0udmFsdWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJPTl9DSEFOR0VcIlxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIGFzeW5jIGhhbmRsZU9uQ2xpY2tSZXNldEZvcm1GaWVsZHMoZTogYW55LCBmaWVsZDogVEZpZWxkVGl0bGUpIHtcbiAgICBmb3IgKGxldCBmIG9mIGZpZWxkLnJlc2V0LmZpZWxkcykge1xuICAgICAgZm9yIChsZXQgYWN0aW9uIG9mIGYuYWN0aW9ucykge1xuICAgICAgICBjb25zdCByZXNldEZpZWxkID0gZ2V0Rm9ybUZpZWxkQnlLZXkoXG4gICAgICAgICAgdGhpcy5mb3JtRmllbGRzLFxuICAgICAgICAgIGFjdGlvbi5wcm9wcy5maWVsZEtleVxuICAgICAgICApO1xuICAgICAgICBjb25zdCBhY3Rpb25zID0gbmV3IEFjdGlvbihcbiAgICAgICAgICBhY3Rpb24sXG4gICAgICAgICAge30sXG4gICAgICAgICAge1xuICAgICAgICAgICAgRklFTERfQ09ORklHOiByZXNldEZpZWxkLFxuICAgICAgICAgICAgRk9STV9GSUVMRFM6IHRoaXMuZm9ybUZpZWxkcyxcbiAgICAgICAgICAgIEZPUk1fREFUQTogdGhpcy5mb3JtRGF0YSxcbiAgICAgICAgICAgIFBSRVZJT1VTX0ZPUk1fREFUQTogdGhpcy5wcmV2aW91c0Zvcm1EYXRhLFxuICAgICAgICAgICAgQUxMX0ZPUk1TX0RBVEE6IHRoaXMuYWxsRm9ybXNEYXRhXG4gICAgICAgICAgfSxcbiAgICAgICAgICB0aGlzLnRha2VBY3Rpb24uYmluZCh0aGlzKVxuICAgICAgICApO1xuICAgICAgICBhd2FpdCBhY3Rpb25zLmV4ZWN1dGUoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIGFzeW5jIGhhbmRsZU9uQ2xpY2tBcGlDYWxsKGU6IGFueSkge1xuICAgIGxldCBmaWVsZDogVEZpZWxkQXBpQ2FsbCA9IGdldEZvcm1GaWVsZEJ5S2V5KHRoaXMuZm9ybUZpZWxkcywgZS5rZXkpO1xuXG4gICAgaWYgKGZpZWxkLnR5cGUgPT09IFwiYXBpLWNhbGxcIikge1xuICAgICAgLy8gc2V0IGJ1dHRvbiBzdGF0dXMgdG8gbG9hZGluZ1xuICAgICAgZmllbGRbXCJhcGlcIl1bXCJzdGF0dXNcIl1bXCJ2YWx1ZVwiXSA9IEVBcGlTdGF0dXNUeXBlLkxPQURJTkc7XG4gICAgICBmaWVsZFtcInNob3dMb2FkZXJcIl0gPSB0cnVlO1xuICAgICAgdGhpcy52aWV3Rm9ybXNCdXR0b25bXCJkaXNhYmxlZFwiXSA9IHRydWU7XG4gICAgICB0aGlzLnZpZXdGb3Jtc0J1dHRvbltcInNob3dMb2FkZXJcIl0gPSB0cnVlO1xuICAgICAgdGhpcy5zYXZlRm9ybUJ1dHRvbltcImRpc2FibGVkXCJdID0gdHJ1ZTtcbiAgICAgIHRoaXMuc2F2ZUZvcm1CdXR0b25bXCJzaG93TG9hZGVyXCJdID0gdHJ1ZTtcblxuICAgICAgY29uc3QgYXBpcyA9IG5ldyBBcGlzKFxuICAgICAgICB7XG4gICAgICAgICAgRklFTERfQ09ORklHOiBmaWVsZCxcbiAgICAgICAgICBGT1JNX0ZJRUxEUzogdGhpcy5mb3JtRmllbGRzLFxuICAgICAgICAgIEZPUk1fREFUQTogdGhpcy5mb3JtRGF0YSxcbiAgICAgICAgICBQUkVWSU9VU19GT1JNX0RBVEE6IHRoaXMucHJldmlvdXNGb3JtRGF0YSxcbiAgICAgICAgICBBTExfRk9STVNfREFUQTogdGhpcy5hbGxGb3Jtc0RhdGFcbiAgICAgICAgfSxcbiAgICAgICAgdGhpcy50YWtlQWN0aW9uLmJpbmQodGhpcylcbiAgICAgICk7XG5cbiAgICAgIGZpZWxkID0gYXdhaXQgYXBpcy5zZXRSZXF1ZXN0Qm9keSgpO1xuXG4gICAgICBmaWVsZCA9IGF3YWl0IGFwaXMudmFsaWRhdGVSZXF1ZXN0Qm9keSgpO1xuXG4gICAgICBpZiAoXG4gICAgICAgIChcbiAgICAgICAgICBmaWVsZC5hcGkucmVxdWVzdC5ib2R5LnZhbGlkYXRpb24gYXMgVFZhbGlkYXRpb24gJiB7XG4gICAgICAgICAgICBpc192YWxpZDogYm9vbGVhbjtcbiAgICAgICAgICB9XG4gICAgICAgICkuaXNfdmFsaWRcbiAgICAgICkge1xuICAgICAgICAvLyBDYWxsIEFQSSBIZXJlXG4gICAgICAgIHRoaXMub25DbGlja0FwaUNhbGwuZW1pdCh7XG4gICAgICAgICAga2V5OiBlLmtleSxcbiAgICAgICAgICByZXF1ZXN0OiB7XG4gICAgICAgICAgICBtb2RlOiBcIlBPU1RcIixcbiAgICAgICAgICAgIGJvZHk6IGZpZWxkLmFwaS5yZXF1ZXN0LmJvZHkudmFsdWUsXG4gICAgICAgICAgICBoZWFkZXJzOiB7fSxcbiAgICAgICAgICAgIHVybDogZmllbGQuYXBpLnJlcXVlc3QudXJsXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFJlcXVlc3QgQm9keSBWYWxpZGF0aW9uIEZhaWxlZFxuICAgICAgICAvLyBIaWdobGlnaHQgRXJyb3IgaW4gVUkgdG8gVXNlciB0byBSZXRyeSBBZnRlciBTb21ldGltZS5cbiAgICAgICAgLy8gVGFrZSBBY3Rpb24gYmFzZWQgb24gVmFsaWRhdGlvblxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBmaWVsZFtcImFwaVwiXVtcInN0YXR1c1wiXVtcInZhbHVlXCJdID0gRUFwaVN0YXR1c1R5cGUuRkFJTEVEO1xuICAgICAgICAgIGZpZWxkW1wic2hvd0xvYWRlclwiXSA9IGZhbHNlO1xuICAgICAgICB9LCA1MDApO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnZpZXdGb3Jtc0J1dHRvbltcImRpc2FibGVkXCJdID0gZmFsc2U7XG4gICAgICB0aGlzLnZpZXdGb3Jtc0J1dHRvbltcInNob3dMb2FkZXJcIl0gPSBmYWxzZTtcbiAgICAgIHRoaXMuc2F2ZUZvcm1CdXR0b25bXCJkaXNhYmxlZFwiXSA9IGZhbHNlO1xuICAgICAgdGhpcy5zYXZlRm9ybUJ1dHRvbltcInNob3dMb2FkZXJcIl0gPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIGhhbmRsZU9uQ2xpY2tWaWV3Rm9ybXMoZTogYW55KSB7XG4gICAgdGhpcy5vbkNsaWNrVmlld0Zvcm1zLmVtaXQoe1xuICAgICAgY2xpY2tlZDogdHJ1ZVxuICAgIH0pO1xuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBoYW5kbGVPbkNsaWNrU2F2ZUZvcm0oZTogYW55KSB7XG4gICAgbGV0IGZvcm1EYXRhID0gdGhpcy5mb3JtR3JvdXAuZ2V0UmF3VmFsdWUoKTtcblxuICAgIGZvciAobGV0IGZpZWxkIG9mIHRoaXMuZm9ybUZpZWxkcykge1xuICAgICAgaWYgKGZpZWxkLmlzRm9ybUVsZW1lbnQpIHtcbiAgICAgICAgaWYgKGZpZWxkLmhpZGRlbikge1xuICAgICAgICAgIGRlbGV0ZSBmb3JtRGF0YVtmaWVsZC5rZXldO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZvcm1EYXRhW2ZpZWxkLmtleV0gPSBjb252ZXJ0Rm9ybUZpZWxkVmFsdWVUb1N0YW5kYXJkRm9ybWF0KFxuICAgICAgICAgICAgZmllbGQsXG4gICAgICAgICAgICBmb3JtRGF0YVtmaWVsZC5rZXldXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAobGV0IGZpZWxkIG9mIHRoaXMuZm9ybUZpZWxkcykge1xuICAgICAgaWYgKFxuICAgICAgICBmaWVsZC5pc0Zvcm1FbGVtZW50ICYmXG4gICAgICAgIGZpZWxkLnZhbGlkYXRpb24udHJpZ2dlcnMuaW5jbHVkZXMoXCJPTl9TQVZFXCIpXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgdmFsaWRhdGlvbnMgPSBuZXcgVmFsaWRhdGlvbihcbiAgICAgICAgICB7XG4gICAgICAgICAgICBGSUVMRF9DT05GSUc6IGZpZWxkLFxuICAgICAgICAgICAgRk9STV9GSUVMRFM6IHRoaXMuZm9ybUZpZWxkcyxcbiAgICAgICAgICAgIEZPUk1fREFUQTogdGhpcy5mb3JtRGF0YSxcbiAgICAgICAgICAgIFBSRVZJT1VTX0ZPUk1fREFUQTogdGhpcy5wcmV2aW91c0Zvcm1EYXRhLFxuICAgICAgICAgICAgQUxMX0ZPUk1TX0RBVEE6IHRoaXMuYWxsRm9ybXNEYXRhXG4gICAgICAgICAgfSxcbiAgICAgICAgICB0aGlzLnRha2VBY3Rpb24uYmluZCh0aGlzKVxuICAgICAgICApO1xuXG4gICAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgYXdhaXQgdmFsaWRhdGlvbnMudmFsaWRhdGUoZmllbGQudmFsaWRhdGlvbik7XG4gICAgICAgIH0pKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZm9ybUdyb3VwLmludmFsaWQpIHtcbiAgICAgIGNvbnN0IGNvbnRyb2xzID0gbmV3IEZvcm1WYWxpZGF0aW9uKCkuZ2V0Rm9ybUZpZWxkc0ludmFsaWRDb250cm9scyhcbiAgICAgICAgdGhpcy5mb3JtR3JvdXBcbiAgICAgICk7XG5cbiAgICAgIGxldCBmaXJzdEZpZWxkV2l0aEVycm9yOiBzdHJpbmcgPSBcIlwiO1xuXG4gICAgICBmb3IgKGxldCBjb250cm9sIG9mIGNvbnRyb2xzKSB7XG4gICAgICAgIGlmIChjb250cm9sLmludmFsaWQgJiYgaXNFbXB0eVZhbHVlKGZpcnN0RmllbGRXaXRoRXJyb3IpKSB7XG4gICAgICAgICAgZmlyc3RGaWVsZFdpdGhFcnJvciA9IGNvbnRyb2wua2V5O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZm9ybUZpZWxkcyA9IHNob3dGb3JtRmllbGRFcnJvcihcbiAgICAgICAgICB0aGlzLmZvcm1GaWVsZHMsXG4gICAgICAgICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHNbY29udHJvbC5rZXldLmVycm9ycyxcbiAgICAgICAgICBjb250cm9sLmtleSxcbiAgICAgICAgICBjb250cm9sLmludmFsaWRcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy50b2dnbGVFcnJvck5vdGlmaWNhdGlvbih0cnVlKTtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLnRvZ2dsZUVycm9yTm90aWZpY2F0aW9uKGZhbHNlKTtcbiAgICAgIH0sIDMwMDApO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgT2JqZWN0LmtleXMoZm9ybURhdGEpLm1hcCgoa2V5KSA9PiB7XG4gICAgICBpZiAoaXNFbXB0eVZhbHVlKGZvcm1EYXRhW2tleV0pKSB7XG4gICAgICAgIGZvcm1EYXRhW2tleV0gPSBcIlwiO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5vbkNsaWNrU2F2ZUZvcm0uZW1pdCh7IGZvcm1Db25maWc6IHRoaXMuZm9ybUNvbmZpZywgZGF0YTogZm9ybURhdGEgfSk7XG4gIH1cblxuICBzaG93RXJyb3JOb3RpZmljYXRpb246IGJvb2xlYW4gPSBmYWxzZTtcbiAgQGxvZ01ldGhvZFxuICB0b2dnbGVFcnJvck5vdGlmaWNhdGlvbihzaG93KSB7XG4gICAgdGhpcy5zaG93RXJyb3JOb3RpZmljYXRpb24gPSBzaG93O1xuICB9XG5cbiAgLy8gQ29tcG9uZW50IEhlbHBlcnNcbiAgQGxvZ01ldGhvZFxuICBmaWVsZEhpZGUoZmllbGRLZXk6IHN0cmluZykge1xuICAgIGxldCBmaWVsZCA9IGdldEZvcm1GaWVsZEJ5S2V5KHRoaXMuZm9ybUZpZWxkcywgZmllbGRLZXkpO1xuICAgIGxldCBmaWVsZEluZGV4ID0gdGhpcy5mb3JtRmllbGRzLmZpbmRJbmRleCgoXzogYW55KSA9PiB7XG4gICAgICByZXR1cm4gZmllbGQua2V5ID09PSBfLmtleTtcbiAgICB9KTtcblxuICAgIHRoaXMuZm9ybUZpZWxkc1tmaWVsZEluZGV4XVtcImhpZGRlblwiXSA9IHRydWU7XG4gICAgdGhpcy5mb3JtR3JvdXAudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBmaWVsZEdyb3VwSGlkZShmaWVsZEdyb3VwOiBzdHJpbmcpIHtcbiAgICBmb3IgKGxldCBmaWVsZEtleSBvZiB0aGlzLmZpZWxkR3JvdXBzW2ZpZWxkR3JvdXBdKSB7XG4gICAgICB0aGlzLmZpZWxkSGlkZShmaWVsZEtleSk7XG4gICAgfVxuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBmaWVsZFNob3coZmllbGRLZXk6IHN0cmluZykge1xuICAgIGxldCBmaWVsZCA9IGdldEZvcm1GaWVsZEJ5S2V5KHRoaXMuZm9ybUZpZWxkcywgZmllbGRLZXkpO1xuICAgIGxldCBmaWVsZEluZGV4ID0gdGhpcy5mb3JtRmllbGRzLmZpbmRJbmRleCgoXzogYW55KSA9PiB7XG4gICAgICByZXR1cm4gZmllbGQua2V5ID09PSBfLmtleTtcbiAgICB9KTtcblxuICAgIHRoaXMuZm9ybUZpZWxkc1tmaWVsZEluZGV4XVtcImhpZGRlblwiXSA9IGZhbHNlO1xuICAgIHRoaXMuZm9ybUdyb3VwLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgZmllbGRHcm91cFNob3coZmllbGRHcm91cDogc3RyaW5nKSB7XG4gICAgZm9yIChsZXQgZmllbGRLZXkgb2YgdGhpcy5maWVsZEdyb3Vwc1tmaWVsZEdyb3VwXSkge1xuICAgICAgdGhpcy5maWVsZFNob3coZmllbGRLZXkpO1xuICAgIH1cbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgZmllbGREaXNhYmxlKGZpZWxkS2V5OiBzdHJpbmcpIHtcbiAgICBsZXQgZmllbGQgPSBnZXRGb3JtRmllbGRCeUtleSh0aGlzLmZvcm1GaWVsZHMsIGZpZWxkS2V5KTtcbiAgICBsZXQgZmllbGRJbmRleCA9IHRoaXMuZm9ybUZpZWxkcy5maW5kSW5kZXgoKF86IGFueSkgPT4ge1xuICAgICAgcmV0dXJuIGZpZWxkLmtleSA9PT0gXy5rZXk7XG4gICAgfSk7XG5cbiAgICBpZiAoZmllbGQuaXNGb3JtRWxlbWVudCkge1xuICAgICAgdGhpcy5mb3JtRmllbGRzW2ZpZWxkSW5kZXhdW1wiZGlzYWJsZWRcIl0gPSB0cnVlO1xuXG4gICAgICBpZiAoaXNOb3RFbXB0eVZhbHVlKHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzKSkge1xuICAgICAgICB0aGlzLmZvcm1Hcm91cC5jb250cm9sc1tmaWVsZC5rZXldLmRpc2FibGUoe1xuICAgICAgICAgIGVtaXRFdmVudDogZmFsc2VcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICB0aGlzLmZvcm1Hcm91cC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgfVxuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBmaWVsZEdyb3VwRGlzYWJsZShmaWVsZEdyb3VwOiBzdHJpbmcpIHtcbiAgICBmb3IgKGxldCBmaWVsZEtleSBvZiB0aGlzLmZpZWxkR3JvdXBzW2ZpZWxkR3JvdXBdKSB7XG4gICAgICB0aGlzLmZpZWxkRGlzYWJsZShmaWVsZEtleSk7XG4gICAgfVxuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBmaWVsZEVuYWJsZShmaWVsZEtleTogc3RyaW5nKSB7XG4gICAgbGV0IGZpZWxkID0gZ2V0Rm9ybUZpZWxkQnlLZXkodGhpcy5mb3JtRmllbGRzLCBmaWVsZEtleSk7XG4gICAgbGV0IGZpZWxkSW5kZXggPSB0aGlzLmZvcm1GaWVsZHMuZmluZEluZGV4KChfOiBhbnkpID0+IHtcbiAgICAgIHJldHVybiBmaWVsZC5rZXkgPT09IF8ua2V5O1xuICAgIH0pO1xuXG4gICAgaWYgKGZpZWxkLmlzRm9ybUVsZW1lbnQpIHtcbiAgICAgIHRoaXMuZm9ybUZpZWxkc1tmaWVsZEluZGV4XVtcImRpc2FibGVkXCJdID0gZmFsc2U7XG5cbiAgICAgIGlmIChpc05vdEVtcHR5VmFsdWUodGhpcy5mb3JtR3JvdXAuY29udHJvbHMpKSB7XG4gICAgICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzW2ZpZWxkLmtleV0uZW5hYmxlKHtcbiAgICAgICAgICBlbWl0RXZlbnQ6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgdGhpcy5mb3JtR3JvdXAudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgIH1cbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgZmllbGRHcm91cEVuYWJsZShmaWVsZEdyb3VwOiBzdHJpbmcpIHtcbiAgICBmb3IgKGxldCBmaWVsZEtleSBvZiB0aGlzLmZpZWxkR3JvdXBzW2ZpZWxkR3JvdXBdKSB7XG4gICAgICB0aGlzLmZpZWxkRW5hYmxlKGZpZWxkS2V5KTtcbiAgICB9XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIGZpZWxkUmVzZXQoZmllbGRLZXk6IHN0cmluZykge1xuICAgIC8vIEZpbmQgdGhlIGZpZWxkIGFuZCBpdHMgaW5kZXggaW4gdGhlIGZvcm1GaWVsZHMgYXJyYXlcbiAgICBsZXQgZmllbGQgPSBnZXRGb3JtRmllbGRCeUtleSh0aGlzLmZvcm1GaWVsZHMsIGZpZWxkS2V5KTtcbiAgICBsZXQgZmllbGRJbmRleCA9IGdldEZvcm1GaWVsZEluZGV4QnlLZXkodGhpcy5mb3JtRmllbGRzLCBmaWVsZEtleSk7XG5cbiAgICAvLyBEZWxldGUgdGhlIGZpZWxkIGZyb20gdGhlIGZvcm1EYXRhIG9iamVjdFxuICAgIGRlbGV0ZSB0aGlzLmZvcm1EYXRhW2ZpZWxkS2V5XTtcblxuICAgIC8vIFJlc2V0IHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQgaW4gdGhlIGZvcm1Hcm91cFxuICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzW2ZpZWxkLmtleV0ucmVzZXQoXG4gICAgICBjb252ZXJ0Rm9ybUZpZWxkRW1wdHlWYWx1ZVRvS3dpa1VJRm9ybWF0KGZpZWxkKSxcbiAgICAgIHtcbiAgICAgICAgZW1pdEV2ZW50OiBmYWxzZVxuICAgICAgfVxuICAgICk7XG5cbiAgICAvLyBSZXNldCB0aGUgbWVzc2FnZXMgYW5kIGVycm9ycyBmb3IgdGhlIGZpZWxkXG4gICAgZmllbGQgPSByZW1vdmVGb3JtRmllbGRNZXNzYWdlKGZpZWxkLCB7XG4gICAgICB0eXBlOiBFTWVzc2FnZVR5cGUuV0FSTklORyxcbiAgICAgIG1lc3NhZ2U6IFwiXCJcbiAgICB9KTtcbiAgICBmaWVsZCA9IHJlbW92ZUZvcm1GaWVsZE1lc3NhZ2UoZmllbGQsIHtcbiAgICAgIHR5cGU6IEVNZXNzYWdlVHlwZS5TVUNDRVNTLFxuICAgICAgbWVzc2FnZTogXCJcIlxuICAgIH0pO1xuICAgIHRoaXMuZmllbGRFcnJvckhpZGUoZmllbGRLZXksIHtcbiAgICAgIHR5cGU6IEVNZXNzYWdlVHlwZS5FUlJPUixcbiAgICAgIG1lc3NhZ2U6IFwiXCJcbiAgICB9KTtcblxuICAgIC8vIFJlc2V0IHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQgaW4gdGhlIGZvcm1GaWVsZHMgYXJyYXlcbiAgICBzd2l0Y2ggKGZpZWxkLnR5cGUpIHtcbiAgICAgIGNhc2UgXCJhcGktY2FsbFwiOlxuICAgICAgICBjb25zdCBmaWVsZEFwaUNhbGwgPSBmaWVsZCBhcyBURmllbGRBcGlDYWxsO1xuICAgICAgICBmaWVsZEFwaUNhbGwuYXBpLnN0YXR1cy52YWx1ZSA9IEVBcGlTdGF0dXNUeXBlLkRFRkFVTFQ7XG4gICAgICAgIHRoaXMuZm9ybUZpZWxkc1tmaWVsZEluZGV4XSA9IGZpZWxkQXBpQ2FsbDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBmaWVsZC5mb2N1cyA9IGZhbHNlO1xuICAgICAgICBmaWVsZC5pbnZhbGlkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZm9ybUZpZWxkc1tmaWVsZEluZGV4XSA9IGZpZWxkO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIGZpZWxkRXJyb3JTaG93KGZpZWxkS2V5OiBzdHJpbmcsIG1lc3NhZ2U6IFRNZXNzYWdlKSB7XG4gICAgbGV0IGZpZWxkID0gZ2V0Rm9ybUZpZWxkQnlLZXkodGhpcy5mb3JtRmllbGRzLCBmaWVsZEtleSk7XG4gICAgbGV0IGZpZWxkSW5kZXggPSB0aGlzLmZvcm1GaWVsZHMuZmluZEluZGV4KChfOiBhbnkpID0+IHtcbiAgICAgIHJldHVybiBmaWVsZC5rZXkgPT09IF8ua2V5O1xuICAgIH0pO1xuXG4gICAgZmllbGQgPSBoaWdobGlnaHRGb3JtRmllbGRFcnJvcihmaWVsZCwgdHJ1ZSk7XG4gICAgZmllbGQgPSBhcHBlbmRGb3JtRmllbGRNZXNzYWdlKGZpZWxkLCBtZXNzYWdlKTtcblxuICAgIHRoaXMuZm9ybUZpZWxkc1tmaWVsZEluZGV4XSA9IGZpZWxkO1xuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBmaWVsZEVycm9ySGlkZShmaWVsZEtleTogc3RyaW5nLCBtZXNzYWdlOiBUTWVzc2FnZSkge1xuICAgIGxldCBmaWVsZCA9IGdldEZvcm1GaWVsZEJ5S2V5KHRoaXMuZm9ybUZpZWxkcywgZmllbGRLZXkpO1xuICAgIGxldCBmaWVsZEluZGV4ID0gdGhpcy5mb3JtRmllbGRzLmZpbmRJbmRleCgoXzogYW55KSA9PiB7XG4gICAgICByZXR1cm4gZmllbGQua2V5ID09PSBfLmtleTtcbiAgICB9KTtcblxuICAgIGZpZWxkID0gaGlnaGxpZ2h0Rm9ybUZpZWxkRXJyb3IoZmllbGQsIGZhbHNlKTtcbiAgICBmaWVsZCA9IHJlbW92ZUZvcm1GaWVsZE1lc3NhZ2UoZmllbGQsIG1lc3NhZ2UpO1xuXG4gICAgdGhpcy5mb3JtRmllbGRzW2ZpZWxkSW5kZXhdID0gZmllbGQ7XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIGZpZWxkTWVzc2FnZVNob3coZmllbGRLZXk6IHN0cmluZywgbWVzc2FnZTogVE1lc3NhZ2UpIHtcbiAgICBsZXQgZmllbGQgPSBnZXRGb3JtRmllbGRCeUtleSh0aGlzLmZvcm1GaWVsZHMsIGZpZWxkS2V5KTtcbiAgICBsZXQgZmllbGRJbmRleCA9IHRoaXMuZm9ybUZpZWxkcy5maW5kSW5kZXgoKF86IGFueSkgPT4ge1xuICAgICAgcmV0dXJuIGZpZWxkLmtleSA9PT0gXy5rZXk7XG4gICAgfSk7XG5cbiAgICBmaWVsZCA9IGFwcGVuZEZvcm1GaWVsZE1lc3NhZ2UoZmllbGQsIG1lc3NhZ2UpO1xuXG4gICAgdGhpcy5mb3JtRmllbGRzW2ZpZWxkSW5kZXhdID0gZmllbGQ7XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIGZpZWxkTWVzc2FnZUhpZGUoZmllbGRLZXk6IHN0cmluZywgbWVzc2FnZTogVE1lc3NhZ2UpIHtcbiAgICBsZXQgZmllbGQgPSBnZXRGb3JtRmllbGRCeUtleSh0aGlzLmZvcm1GaWVsZHMsIGZpZWxkS2V5KTtcbiAgICBsZXQgZmllbGRJbmRleCA9IHRoaXMuZm9ybUZpZWxkcy5maW5kSW5kZXgoKF86IGFueSkgPT4ge1xuICAgICAgcmV0dXJuIGZpZWxkLmtleSA9PT0gXy5rZXk7XG4gICAgfSk7XG5cbiAgICBmaWVsZCA9IHJlbW92ZUZvcm1GaWVsZE1lc3NhZ2UoZmllbGQsIG1lc3NhZ2UpO1xuXG4gICAgdGhpcy5mb3JtRmllbGRzW2ZpZWxkSW5kZXhdID0gZmllbGQ7XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIHNldE9iamVjdFZhbHVlKGZpZWxkOiBhbnksIHBhdGg6IHN0cmluZywgdmFsdWU6IGFueSkge31cblxuICBAbG9nTWV0aG9kXG4gIHBhdGNoRmllbGRDb250cm9sVmFsdWUoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgICB0aGlzLmZvcm1Hcm91cC5wYXRjaFZhbHVlKFxuICAgICAge1xuICAgICAgICBba2V5XTogdmFsdWVcbiAgICAgIH0sXG4gICAgICB7IGVtaXRFdmVudDogZmFsc2UgfVxuICAgICk7XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIHBhdGNoRm9ybUdyb3VwKGZvcm1EYXRhOiBhbnkpIHtcbiAgICBpZiAoaXNVbmRlZmluZWQodGhpcy5mb3JtR3JvdXApIHx8IGlzVW5kZWZpbmVkKGZvcm1EYXRhKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBmb3JtR3JvdXAgb3IgZm9ybURhdGEgaXMgJ3VuZGVmaW5lZCcuYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZm9ybUdyb3VwLnBhdGNoVmFsdWUoZm9ybURhdGEsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB9XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIGlzRmllbGRWYWxpZChmaWVsZEtleTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzW2ZpZWxkS2V5XS52YWxpZDtcbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgaXNGaWVsZEVuYWJsZWQoZmllbGRLZXk6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmZvcm1Hcm91cC5jb250cm9sc1tmaWVsZEtleV0uZW5hYmxlZDtcbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgZ2V0Rm9ybUdyb3VwUmF3VmFsdWVzKCkge1xuICAgIHJldHVybiB0aGlzLmZvcm1Hcm91cC5nZXRSYXdWYWx1ZSgpO1xuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBhc3luYyB0YWtlQWN0aW9uT25GaWVsZEdyb3VwKGFjdGlvbjogVEFjdGlvbiwgb2JqZWN0OiBhbnkpIHtcbiAgICBzd2l0Y2ggKGFjdGlvbi5rZXkpIHtcbiAgICAgIGNhc2UgRUFjdGlvbktleS5GSUVMRF9HUk9VUF9ISURFOlxuICAgICAgICB0aGlzLmZpZWxkR3JvdXBIaWRlKGFjdGlvbi5wcm9wcy5ncm91cEtleSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBFQWN0aW9uS2V5LkZJRUxEX0dST1VQX1NIT1c6XG4gICAgICAgIHRoaXMuZmllbGRHcm91cFNob3coYWN0aW9uLnByb3BzLmdyb3VwS2V5KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEVBY3Rpb25LZXkuRklFTERfR1JPVVBfRU5BQkxFOlxuICAgICAgICB0aGlzLmZpZWxkR3JvdXBFbmFibGUoYWN0aW9uLnByb3BzLmdyb3VwS2V5KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEVBY3Rpb25LZXkuRklFTERfR1JPVVBfRElTQUJMRTpcbiAgICAgICAgdGhpcy5maWVsZEdyb3VwRGlzYWJsZShhY3Rpb24ucHJvcHMuZ3JvdXBLZXkpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgYXN5bmMgdGFrZUFjdGlvbihhY3Rpb246IFRBY3Rpb24sIG9iamVjdDogYW55KSB7XG4gICAgc3dpdGNoIChhY3Rpb24ua2V5KSB7XG4gICAgICBjYXNlIEVBY3Rpb25LZXkuRklFTERfSElERTpcbiAgICAgICAgdGhpcy5maWVsZEhpZGUoYWN0aW9uLnByb3BzLmZpZWxkS2V5KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEVBY3Rpb25LZXkuRklFTERfU0hPVzpcbiAgICAgICAgdGhpcy5maWVsZFNob3coYWN0aW9uLnByb3BzLmZpZWxkS2V5KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEVBY3Rpb25LZXkuRklFTERfRElTQUJMRTpcbiAgICAgICAgdGhpcy5maWVsZERpc2FibGUoYWN0aW9uLnByb3BzLmZpZWxkS2V5KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEVBY3Rpb25LZXkuRklFTERfRU5BQkxFOlxuICAgICAgICB0aGlzLmZpZWxkRW5hYmxlKGFjdGlvbi5wcm9wcy5maWVsZEtleSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBFQWN0aW9uS2V5LkZJRUxEX1JFU0VUOlxuICAgICAgICB0aGlzLmZpZWxkUmVzZXQoYWN0aW9uLnByb3BzLmZpZWxkS2V5KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEVBY3Rpb25LZXkuRklFTERfRVJST1JfU0hPVzpcbiAgICAgICAgdGhpcy5maWVsZEVycm9yU2hvdyhhY3Rpb24ucHJvcHMuZmllbGRLZXksIGFjdGlvbi5wcm9wcy5tZXNzYWdlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEVBY3Rpb25LZXkuRklFTERfRVJST1JfSElERTpcbiAgICAgICAgdGhpcy5maWVsZEVycm9ySGlkZShhY3Rpb24ucHJvcHMuZmllbGRLZXksIGFjdGlvbi5wcm9wcy5tZXNzYWdlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEVBY3Rpb25LZXkuRklFTERfTUVTU0FHRV9TSE9XOlxuICAgICAgICB0aGlzLmZpZWxkTWVzc2FnZVNob3coYWN0aW9uLnByb3BzLmZpZWxkS2V5LCBhY3Rpb24ucHJvcHMubWVzc2FnZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBFQWN0aW9uS2V5LkZJRUxEX01FU1NBR0VTX0hJREU6XG4gICAgICAgIHRoaXMuZmllbGRNZXNzYWdlSGlkZShhY3Rpb24ucHJvcHMuZmllbGRLZXksIGFjdGlvbi5wcm9wcy5tZXNzYWdlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEVBY3Rpb25LZXkuU0VUX1ZBTFVFOlxuICAgICAgICBjb25zdCBzZXRWYWx1ZV9Tb3VyY2VzID0gbmV3IFNvdXJjZShvYmplY3QpO1xuXG4gICAgICAgIGNvbnN0IHNvdXJjZVZhbHVlID0gYXdhaXQgc2V0VmFsdWVfU291cmNlcy5nZXRWYWx1ZUZyb21Tb3VyY2UoXG4gICAgICAgICAgYWN0aW9uLnByb3BzLnZhbHVlLnNvdXJjZVxuICAgICAgICApO1xuICAgICAgICBzZXRWYWx1ZV9Tb3VyY2VzLnNldFZhbHVlVG9Tb3VyY2UoXG4gICAgICAgICAgYWN0aW9uLnByb3BzLnZhbHVlLmRlc3RpbmF0aW9uLFxuICAgICAgICAgIHNvdXJjZVZhbHVlXG4gICAgICAgICk7XG5cbiAgICAgICAgb2JqZWN0LkZJRUxEX0NPTkZJRyA9IHNldFZhbHVlX1NvdXJjZXMub2JqZWN0LkZJRUxEX0NPTkZJRztcbiAgICAgICAgdGhpcy5mb3JtRGF0YSA9IHNldFZhbHVlX1NvdXJjZXMub2JqZWN0LkZPUk1fREFUQTtcbiAgICAgICAgdGhpcy5wYXRjaEZvcm1Hcm91cCh0aGlzLmZvcm1EYXRhKTtcbiAgICAgICAgdGhpcy5hbGxGb3Jtc0RhdGEgPSBzZXRWYWx1ZV9Tb3VyY2VzLm9iamVjdC5BTExfRk9STVNfREFUQTtcbiAgICAgICAgdGhpcy5wcmV2aW91c0Zvcm1EYXRhID0gc2V0VmFsdWVfU291cmNlcy5vYmplY3QuUFJFVklPVVNfRk9STV9EQVRBO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRUFjdGlvbktleS5TRVRfRFJPUERPV05fT1BUSU9OUzpcbiAgICAgICAgY29uc3Qgc2V0RHJvcGRvd25WYWx1ZV9Tb3VyY2VzID0gbmV3IFNvdXJjZShvYmplY3QpO1xuXG4gICAgICAgIGxldCBkcm9wZG93blZhbHVlID0gYXdhaXQgc2V0RHJvcGRvd25WYWx1ZV9Tb3VyY2VzLmdldFZhbHVlRnJvbVNvdXJjZShcbiAgICAgICAgICBhY3Rpb24ucHJvcHMudmFsdWUuc291cmNlXG4gICAgICAgICk7XG4gICAgICAgIGlmIChjaGVja09iamVjdEtleUV4aXN0cyhhY3Rpb24ucHJvcHMsIFwib3B0aW9uc1wiKSkge1xuICAgICAgICAgIGlmIChjaGVja09iamVjdEtleUV4aXN0cyhhY3Rpb24ucHJvcHMub3B0aW9ucywgXCJhcHBlbmRUb1BhdGhcIikpIHtcbiAgICAgICAgICAgIGxldCBhcHBlbmRUb1BhdGggPVxuICAgICAgICAgICAgICBhd2FpdCBzZXREcm9wZG93blZhbHVlX1NvdXJjZXMuZ2V0VmFsdWVGcm9tU291cmNlKFxuICAgICAgICAgICAgICAgIGFjdGlvbi5wcm9wcy5vcHRpb25zLmFwcGVuZFRvUGF0aC5zb3VyY2VcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChpc05vdEVtcHR5VmFsdWUoYXBwZW5kVG9QYXRoKSkge1xuICAgICAgICAgICAgICBjb25zdCBhcHBlbmRUb1BhdGhTdHIgPSByZXBsYWNlU3RyaW5nKFxuICAgICAgICAgICAgICAgIGFwcGVuZFRvUGF0aC5tYXRjaChcbiAgICAgICAgICAgICAgICAgIGAke2FjdGlvbi5wcm9wcy5vcHRpb25zLmFwcGVuZFRvUGF0aC5maWx0ZXJTb3VyY2VWYWx1ZX1gXG4gICAgICAgICAgICAgICAgKVswXSxcbiAgICAgICAgICAgICAgICBcIlteYS16QS1aMC05X11cIixcbiAgICAgICAgICAgICAgICBcIl9cIlxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgIGNvbnN0IG9wdGlvbnNQYXRoID0gYCR7YWN0aW9uLnByb3BzLm9wdGlvbnMucGF0aH0ke2FwcGVuZFRvUGF0aFN0cn1gO1xuICAgICAgICAgICAgICBkcm9wZG93blZhbHVlID0gZ2V0T2JqZWN0VmFsdWVGcm9tUGF0aChcbiAgICAgICAgICAgICAgICBkcm9wZG93blZhbHVlLFxuICAgICAgICAgICAgICAgIG9wdGlvbnNQYXRoXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRyb3Bkb3duVmFsdWUgPSBnZXRPYmplY3RWYWx1ZUZyb21QYXRoKFxuICAgICAgICAgICAgICBkcm9wZG93blZhbHVlLFxuICAgICAgICAgICAgICBhY3Rpb24ucHJvcHMub3B0aW9ucy5wYXRoXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHNldERyb3Bkb3duVmFsdWVfU291cmNlcy5zZXRWYWx1ZVRvU291cmNlKFxuICAgICAgICAgIGFjdGlvbi5wcm9wcy52YWx1ZS5kZXN0aW5hdGlvbixcbiAgICAgICAgICBkcm9wZG93blZhbHVlXG4gICAgICAgICk7XG5cbiAgICAgICAgb2JqZWN0LkZJRUxEX0NPTkZJRyA9IHNldERyb3Bkb3duVmFsdWVfU291cmNlcy5vYmplY3QuRklFTERfQ09ORklHO1xuICAgICAgICB0aGlzLmZvcm1EYXRhID0gc2V0RHJvcGRvd25WYWx1ZV9Tb3VyY2VzLm9iamVjdC5GT1JNX0RBVEE7XG4gICAgICAgIHRoaXMuYWxsRm9ybXNEYXRhID0gc2V0RHJvcGRvd25WYWx1ZV9Tb3VyY2VzLm9iamVjdC5BTExfRk9STVNfREFUQTtcbiAgICAgICAgdGhpcy5wcmV2aW91c0Zvcm1EYXRhID1cbiAgICAgICAgICBzZXREcm9wZG93blZhbHVlX1NvdXJjZXMub2JqZWN0LlBSRVZJT1VTX0ZPUk1fREFUQTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEVBY3Rpb25LZXkuSEFORExFX0NPTk5FQ1RFRF9FTEVNRU5UUzpcbiAgICAgICAgdGhpcy5oYW5kbGVDb25uZWN0ZWRFbGVtZW50cyhcbiAgICAgICAgICB7IGtleTogYWN0aW9uLnByb3BzLmZpZWxkS2V5IH0sXG4gICAgICAgICAgXCJPTl9BQ1RJT05cIlxuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRUFjdGlvbktleS5DVVNUT006XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG59XG4iLCI8ZGl2XG4gIGNsYXNzPVwia3dpa2lkLWZvcm0tY29udGFpbmVyXCJcbiAgKm5nSWY9XCIhdGhpcy5sb2FkaW5nXCJcbj5cbiAgPGRpdiBpZD1cInVmLWZvcm0tZmllbGRzLWhlYWRlci1jb250YWluZXJcIj5cbiAgICA8ZGl2IGlkPVwidWYtZm9ybS1maWVsZHMtdGl0bGVcIj5cbiAgICAgIHt7IHRoaXMuZm9ybUNvbmZpZy50aXRsZSB9fVxuICAgIDwvZGl2PlxuICAgIDxkaXYgaWQ9XCJ1Zi1mb3JtLWZpZWxkcy1zdGVwc1wiPlxuICAgICAgU3RlcCB7eyB0aGlzLmZvcm1Db25maWcuc2VxdWVuY2VObyB9fSBvZiB7eyB0aGlzLmZvcm1zTGlzdC5sZW5ndGggfX1cbiAgICA8L2Rpdj5cbiAgICA8aHIgLz5cbiAgPC9kaXY+XG4gIDxmb3JtXG4gICAgY2xhc3M9XCJrd2lraWQtZm9ybSBzaG93XCJcbiAgICBbZm9ybUdyb3VwXT1cInRoaXMuZm9ybUdyb3VwXCJcbiAgPlxuICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGZpZWxkIG9mIHRoaXMuZm9ybUZpZWxkczsgbGV0IGkgPSBpbmRleFwiPlxuICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwiZmllbGQudHlwZVwiPlxuICAgICAgICA8IS0tIEhUTUwgQ29udGVudCAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2h0bWwnXCI+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgW2hpZGRlbl09XCJmaWVsZD8uaGlkZGVuXCJcbiAgICAgICAgICAgIGlkPVwiZmllbGRfe3sgZmllbGQua2V5IH19XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8ZGl2IFtpbm5lckh0bWxdPVwiZmllbGQuaHRtbCB8IHNhZmVIdG1sXCI+PC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8IS0tIEZvcm0gVGl0bGUgLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIid0aXRsZSdcIj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cInRpdGxlXCJcbiAgICAgICAgICAgIFtjbGFzcy5oaWRkZW5dPVwiZmllbGQ/LmhpZGRlblwiXG4gICAgICAgICAgICBpZD1cImZpZWxkX3t7IGZpZWxkLmtleSB9fVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAge3sgZmllbGQubGFiZWwgfX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGt3aWt1aS1idXR0b25cbiAgICAgICAgICAgICAgKm5nSWY9XCJmaWVsZD8ucmVzZXRcIlxuICAgICAgICAgICAgICBhcHBlYXJhbmNlPVwid2hpdGVibG9ja1wiXG4gICAgICAgICAgICAgIHNpemU9XCJzXCJcbiAgICAgICAgICAgICAgbGFiZWw9XCJSZXNldFwiXG4gICAgICAgICAgICAgIChvbkNsaWNrKT1cInRoaXMuaGFuZGxlT25DbGlja1Jlc2V0Rm9ybUZpZWxkcygkZXZlbnQsIGZpZWxkKVwiXG4gICAgICAgICAgICA+PC9rd2lrdWktYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPCEtLSBJbnB1dCBUZXh0IC0tPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCIndGV4dCdcIj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBbaGlkZGVuXT1cImZpZWxkPy5oaWRkZW5cIlxuICAgICAgICAgICAgaWQ9XCJmaWVsZF97eyBmaWVsZC5rZXkgfX1cIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxrd2lrdWktaW5wdXRcbiAgICAgICAgICAgICAgW2Nhc2VdPVwiZmllbGQ/LnByb3BlcnRpZXM/LmNhc2VcIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZmllbGQ/LmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgW2ZvY3VzXT1cImZpZWxkPy5mb2N1c1wiXG4gICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJmb3JtR3JvdXAuY29udHJvbHNbZmllbGQua2V5XVwiXG4gICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiZmllbGQua2V5XCJcbiAgICAgICAgICAgICAgW2lkXT1cImZpZWxkLmtleVwiXG4gICAgICAgICAgICAgIFtpbnZhbGlkXT1cImZpZWxkPy5pbnZhbGlkXCJcbiAgICAgICAgICAgICAgW2xhYmVsXT1cImZpZWxkLmxhYmVsXCJcbiAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImZpZWxkPy5wcm9wZXJ0aWVzPy5wbGFjZWhvbGRlclwiXG4gICAgICAgICAgICAgIFt0eXBlXT1cIid0ZXh0J1wiXG4gICAgICAgICAgICAgIFt2YWxpZGF0b3JzXT1cImZpZWxkPy52YWxpZGF0b3JzXCJcbiAgICAgICAgICAgICAgKGdldEtleVZhbHVlKT1cImhhbmRsZUdldEtleVZhbHVlKCRldmVudClcIlxuICAgICAgICAgICAgPjwva3dpa3VpLWlucHV0PlxuICAgICAgICAgICAgPGt3aWt1aS1tZXNzYWdlc1xuICAgICAgICAgICAgICBbbWVzc2FnZXNdPVwiZmllbGQubWVzc2FnZXNcIlxuICAgICAgICAgICAgICBbaWRdPVwiZmllbGQua2V5XCJcbiAgICAgICAgICAgID48L2t3aWt1aS1tZXNzYWdlcz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwhLS0gQ2hlY2tib3ggLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidjaGVja2JveCdcIj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBbaGlkZGVuXT1cImZpZWxkPy5oaWRkZW5cIlxuICAgICAgICAgICAgaWQ9XCJmaWVsZF97eyBmaWVsZC5rZXkgfX1cIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxrd2lrdWktY2hlY2tib3gtYmxvY2tcbiAgICAgICAgICAgICAgW2NvbnRlbnRBbGlnbl09XCJmaWVsZD8ucHJvcGVydGllcz8uY29udGVudEFsaWduID8/ICdsZWZ0J1wiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJmaWVsZD8uZGlzYWJsZWRcIlxuICAgICAgICAgICAgICBbZm9jdXNdPVwiZmllbGQ/LmZvY3VzXCJcbiAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImZvcm1Hcm91cC5jb250cm9sc1tmaWVsZC5rZXldXCJcbiAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJmaWVsZC5rZXlcIlxuICAgICAgICAgICAgICBbaWRdPVwiZmllbGQua2V5XCJcbiAgICAgICAgICAgICAgW2ludmFsaWRdPVwiZmllbGQ/LmludmFsaWRcIlxuICAgICAgICAgICAgICBbbGFiZWxdPVwiZmllbGQ/LnByb3BlcnRpZXM/LnBsYWNlaG9sZGVyXCJcbiAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImZpZWxkPy5wcm9wZXJ0aWVzPy5wbGFjZWhvbGRlclwiXG4gICAgICAgICAgICAgIFtwcm9wZXJ0aWVzXT1cImZpZWxkPy5wcm9wZXJ0aWVzXCJcbiAgICAgICAgICAgICAgW3NpemVdPVwiZmllbGQ/LnByb3BlcnRpZXM/LnNpemUgPz8gJ2wnXCJcbiAgICAgICAgICAgICAgW3ZhbGlkYXRvcnNdPVwiZmllbGQ/LnZhbGlkYXRvcnNcIlxuICAgICAgICAgICAgICAoZ2V0S2V5VmFsdWUpPVwiaGFuZGxlR2V0S2V5VmFsdWUoJGV2ZW50KVwiXG4gICAgICAgICAgICA+PC9rd2lrdWktY2hlY2tib3gtYmxvY2tcbiAgICAgICAgICAgID48a3dpa3VpLW1lc3NhZ2VzXG4gICAgICAgICAgICAgIFttZXNzYWdlc109XCJmaWVsZC5tZXNzYWdlc1wiXG4gICAgICAgICAgICAgIFtpZF09XCJmaWVsZC5rZXlcIlxuICAgICAgICAgICAgPjwva3dpa3VpLW1lc3NhZ2VzPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPCEtLSBJbnB1dCBOdW1iZXIgLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidudW1iZXInXCI+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgW2hpZGRlbl09XCJmaWVsZD8uaGlkZGVuXCJcbiAgICAgICAgICAgIGlkPVwiZmllbGRfe3sgZmllbGQua2V5IH19XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8a3dpa3VpLWlucHV0LW51bWJlclxuICAgICAgICAgICAgICBbZGVjaW1hbF09XCJmaWVsZD8ucHJvcGVydGllcz8uZGVjaW1hbFwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJmaWVsZD8uZGlzYWJsZWRcIlxuICAgICAgICAgICAgICBbZm9jdXNdPVwiZmllbGQ/LmZvY3VzXCJcbiAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImZvcm1Hcm91cC5jb250cm9sc1tmaWVsZC5rZXldXCJcbiAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJmaWVsZC5rZXlcIlxuICAgICAgICAgICAgICBbaWRdPVwiZmllbGQua2V5XCJcbiAgICAgICAgICAgICAgW2ludmFsaWRdPVwiZmllbGQ/LmludmFsaWRcIlxuICAgICAgICAgICAgICBbbGFiZWxdPVwiZmllbGQ/LmxhYmVsXCJcbiAgICAgICAgICAgICAgW21heF09XCJmaWVsZD8ucHJvcGVydGllcz8ubWF4XCJcbiAgICAgICAgICAgICAgW21pbl09XCJmaWVsZD8ucHJvcGVydGllcz8ubWluXCJcbiAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImZpZWxkPy5wcm9wZXJ0aWVzPy5wbGFjZWhvbGRlclwiXG4gICAgICAgICAgICAgIFtwb3N0Zml4XT1cImZpZWxkPy5wcm9wZXJ0aWVzPy5wb3N0Zml4ID8/ICcnXCJcbiAgICAgICAgICAgICAgW3ByZWNpc2lvbl09XCJmaWVsZD8ucHJvcGVydGllcz8ucHJlY2lzaW9uXCJcbiAgICAgICAgICAgICAgW3ByZWZpeF09XCJmaWVsZD8ucHJvcGVydGllcz8ucHJlZml4ID8/ICcnXCJcbiAgICAgICAgICAgICAgW3Byb3BlcnRpZXNdPVwiZmllbGQ/LnByb3BlcnRpZXNcIlxuICAgICAgICAgICAgICBbdmFsaWRhdG9yc109XCJmaWVsZD8udmFsaWRhdG9yc1wiXG4gICAgICAgICAgICAgIChnZXRLZXlWYWx1ZSk9XCJoYW5kbGVHZXRLZXlWYWx1ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgID48L2t3aWt1aS1pbnB1dC1udW1iZXJcbiAgICAgICAgICAgID48a3dpa3VpLW1lc3NhZ2VzXG4gICAgICAgICAgICAgIFttZXNzYWdlc109XCJmaWVsZC5tZXNzYWdlc1wiXG4gICAgICAgICAgICAgIFtpZF09XCJmaWVsZC5rZXlcIlxuICAgICAgICAgICAgPjwva3dpa3VpLW1lc3NhZ2VzPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPCEtLSBJbnB1dCBEYXRlIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInZGF0ZSdcIj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBbaGlkZGVuXT1cImZpZWxkPy5oaWRkZW5cIlxuICAgICAgICAgICAgaWQ9XCJmaWVsZF97eyBmaWVsZC5rZXkgfX1cIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxrd2lrdWktaW5wdXQtZGF0ZVxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZmllbGQ/LmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgW2ZvY3VzXT1cImZpZWxkPy5mb2N1c1wiXG4gICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJmb3JtR3JvdXAuY29udHJvbHNbZmllbGQua2V5XVwiXG4gICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiZmllbGQua2V5XCJcbiAgICAgICAgICAgICAgW2lkXT1cImZpZWxkLmtleVwiXG4gICAgICAgICAgICAgIFtpbnZhbGlkXT1cImZpZWxkPy5pbnZhbGlkXCJcbiAgICAgICAgICAgICAgW2xhYmVsXT1cImZpZWxkLmxhYmVsXCJcbiAgICAgICAgICAgICAgW21heF09XCJmaWVsZD8ucHJvcGVydGllcz8ubWF4XCJcbiAgICAgICAgICAgICAgW21pbl09XCJmaWVsZD8ucHJvcGVydGllcz8ubWluXCJcbiAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImZpZWxkPy5wcm9wZXJ0aWVzPy5wbGFjZWhvbGRlclwiXG4gICAgICAgICAgICAgIFtwcm9wZXJ0aWVzXT1cImZpZWxkPy5wcm9wZXJ0aWVzXCJcbiAgICAgICAgICAgICAgW3ZhbGlkYXRvcnNdPVwiZmllbGQ/LnZhbGlkYXRvcnNcIlxuICAgICAgICAgICAgICAoZ2V0S2V5VmFsdWUpPVwiaGFuZGxlR2V0S2V5VmFsdWUoJGV2ZW50KVwiXG4gICAgICAgICAgICA+PC9rd2lrdWktaW5wdXQtZGF0ZT5cbiAgICAgICAgICAgIDxrd2lrdWktbWVzc2FnZXNcbiAgICAgICAgICAgICAgW21lc3NhZ2VzXT1cImZpZWxkLm1lc3NhZ2VzXCJcbiAgICAgICAgICAgICAgW2lkXT1cImZpZWxkLmtleVwiXG4gICAgICAgICAgICA+PC9rd2lrdWktbWVzc2FnZXM+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8IS0tIElucHV0IFBob25lIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCIncGhvbmUnXCI+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgW2hpZGRlbl09XCJmaWVsZD8uaGlkZGVuXCJcbiAgICAgICAgICAgIGlkPVwiZmllbGRfe3sgZmllbGQua2V5IH19XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8a3dpa3VpLWlucHV0LXBob25lXG4gICAgICAgICAgICAgIFtjb3VudHJ5Q29kZV09XCJmaWVsZD8ucHJvcGVydGllcz8uY291bnRyeUNvZGVcIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZmllbGQ/LmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgW2ZvY3VzXT1cImZpZWxkPy5mb2N1c1wiXG4gICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJmb3JtR3JvdXAuY29udHJvbHNbZmllbGQua2V5XVwiXG4gICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiZmllbGQua2V5XCJcbiAgICAgICAgICAgICAgW2lkXT1cImZpZWxkLmtleVwiXG4gICAgICAgICAgICAgIFtpbnZhbGlkXT1cImZpZWxkPy5pbnZhbGlkXCJcbiAgICAgICAgICAgICAgW2xhYmVsXT1cImZpZWxkPy5sYWJlbFwiXG4gICAgICAgICAgICAgIFtwaG9uZU1hc2tBZnRlckNvdW50cnlDb2RlXT1cIlxuICAgICAgICAgICAgICAgIGZpZWxkPy5wcm9wZXJ0aWVzPy5waG9uZU1hc2tBZnRlckNvdW50cnlDb2RlXG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJmaWVsZD8ucHJvcGVydGllcz8ucGxhY2Vob2xkZXJcIlxuICAgICAgICAgICAgICBbdmFsaWRhdG9yc109XCJmaWVsZD8udmFsaWRhdG9yc1wiXG4gICAgICAgICAgICAgIChnZXRLZXlWYWx1ZSk9XCJoYW5kbGVHZXRLZXlWYWx1ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgID48L2t3aWt1aS1pbnB1dC1waG9uZT5cbiAgICAgICAgICAgIDxrd2lrdWktbWVzc2FnZXNcbiAgICAgICAgICAgICAgW21lc3NhZ2VzXT1cImZpZWxkLm1lc3NhZ2VzXCJcbiAgICAgICAgICAgICAgW2lkXT1cImZpZWxkLmtleVwiXG4gICAgICAgICAgICA+PC9rd2lrdWktbWVzc2FnZXM+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8IS0tIElucHV0IFJhZGlvIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCIncmFkaW8nXCI+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgW2hpZGRlbl09XCJmaWVsZD8uaGlkZGVuXCJcbiAgICAgICAgICAgIGlkPVwiZmllbGRfe3sgZmllbGQua2V5IH19XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgICAgW3R1aUxhYmVsXT1cImxhYmVsVGVtcGxhdGVcIlxuICAgICAgICAgICAgICBzdHlsZT1cIm1pbi1oZWlnaHQ6IGF1dG9cIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8a3dpa3VpLXJhZGlvLWxpc3RcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZmllbGQ/LmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICBbZm9jdXNdPVwiZmllbGQ/LmZvY3VzXCJcbiAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwiZm9ybUdyb3VwLmNvbnRyb2xzW2ZpZWxkLmtleV1cIlxuICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiZmllbGQua2V5XCJcbiAgICAgICAgICAgICAgICBbaWRdPVwiZmllbGQua2V5XCJcbiAgICAgICAgICAgICAgICBbaW52YWxpZF09XCJmaWVsZD8uaW52YWxpZFwiXG4gICAgICAgICAgICAgICAgW2l0ZW1zXT1cImZpZWxkPy5vcHRpb25zXCJcbiAgICAgICAgICAgICAgICBbbGFiZWxdPVwiZmllbGQ/LmxhYmVsXCJcbiAgICAgICAgICAgICAgICBbb3JpZW50YXRpb25dPVwiZmllbGQ/LnByb3BlcnRpZXM/Lm9yaWVudGF0aW9uXCJcbiAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiZmllbGQ/LnByb3BlcnRpZXM/LnBsYWNlaG9sZGVyXCJcbiAgICAgICAgICAgICAgICBbcHJvcGVydGllc109XCJmaWVsZD8ucHJvcGVydGllc1wiXG4gICAgICAgICAgICAgICAgW3NpemVdPVwiZmllbGQ/LnByb3BlcnRpZXM/LnNpemVcIlxuICAgICAgICAgICAgICAgIFt2YWxpZGF0b3JzXT1cImZpZWxkPy52YWxpZGF0b3JzXCJcbiAgICAgICAgICAgICAgICAoZ2V0S2V5VmFsdWUpPVwiaGFuZGxlR2V0S2V5VmFsdWUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgID48L2t3aWt1aS1yYWRpby1saXN0PlxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbGFiZWxUZW1wbGF0ZT5cbiAgICAgICAgICAgICAgPHBcbiAgICAgICAgICAgICAgICBjbGFzcz1cInR1aS1zcGFjZV9ib3R0b20tMlwiXG4gICAgICAgICAgICAgICAgW2hpZGRlbl09XCJmaWVsZD8uaGlkZGVuXCJcbiAgICAgICAgICAgICAgICBpZD1cImZpZWxkX3t7IGZpZWxkLmtleSB9fVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8Yj5cbiAgICAgICAgICAgICAgICAgIHt7IGZpZWxkLmxhYmVsIH19XG4gICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImZpZWxkLnZhbGlkYXRvcnM/LnJlcXVpcmVkXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvYj5cbiAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDxrd2lrdWktbWVzc2FnZXNcbiAgICAgICAgICAgICAgW21lc3NhZ2VzXT1cImZpZWxkLm1lc3NhZ2VzXCJcbiAgICAgICAgICAgICAgW2lkXT1cImZpZWxkLmtleVwiXG4gICAgICAgICAgICA+PC9rd2lrdWktbWVzc2FnZXM+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8IS0tIERyb3Bkb3duIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInZHJvcGRvd24td2l0aC1zZWFyY2gnXCI+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgW2hpZGRlbl09XCJmaWVsZD8uaGlkZGVuXCJcbiAgICAgICAgICAgIGlkPVwiZmllbGRfe3sgZmllbGQua2V5IH19XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8a3dpa3VpLXNlbGVjdC1jb21ib2JveFxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZmllbGQ/LmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgW2ZvY3VzXT1cImZpZWxkPy5mb2N1c1wiXG4gICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJmb3JtR3JvdXAuY29udHJvbHNbZmllbGQua2V5XVwiXG4gICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiZmllbGQua2V5XCJcbiAgICAgICAgICAgICAgW2lkXT1cImZpZWxkLmtleVwiXG4gICAgICAgICAgICAgIFtpbnZhbGlkXT1cImZpZWxkPy5pbnZhbGlkXCJcbiAgICAgICAgICAgICAgW2xhYmVsXT1cImZpZWxkLmxhYmVsXCJcbiAgICAgICAgICAgICAgW29wdGlvbnNdPVwiZmllbGQub3B0aW9uc1wiXG4gICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJmaWVsZD8ucHJvcGVydGllcz8ucGxhY2Vob2xkZXJcIlxuICAgICAgICAgICAgICBbcHJvcGVydGllc109XCJmaWVsZD8ucHJvcGVydGllc1wiXG4gICAgICAgICAgICAgIFt2YWxpZGF0b3JzXT1cImZpZWxkPy52YWxpZGF0b3JzXCJcbiAgICAgICAgICAgICAgKGdldEtleVZhbHVlKT1cImhhbmRsZUdldEtleVZhbHVlKCRldmVudClcIlxuICAgICAgICAgICAgPjwva3dpa3VpLXNlbGVjdC1jb21ib2JveD5cbiAgICAgICAgICAgIDxrd2lrdWktbWVzc2FnZXNcbiAgICAgICAgICAgICAgW21lc3NhZ2VzXT1cImZpZWxkLm1lc3NhZ2VzXCJcbiAgICAgICAgICAgICAgW2lkXT1cImZpZWxkLmtleVwiXG4gICAgICAgICAgICA+PC9rd2lrdWktbWVzc2FnZXM+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8IS0tIEFQSSBDYWxsIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInYXBpLWNhbGwnXCI+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgW2hpZGRlbl09XCJmaWVsZD8uaGlkZGVuXCJcbiAgICAgICAgICAgIGlkPVwiZmllbGRfe3sgZmllbGQua2V5IH19XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8a3dpa3VpLWJ1dHRvbi1hcGktY2FsbFxuICAgICAgICAgICAgICBbYXBpU3RhdHVzXT1cImZpZWxkPy5hcGk/LnN0YXR1cz8udmFsdWVcIlxuICAgICAgICAgICAgICBbY2xhc3NdPVwiZmllbGQ/LmNsYXNzXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImZpZWxkPy5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgIFtpZF09XCJmaWVsZC5rZXlcIlxuICAgICAgICAgICAgICBbbGFiZWxdPVwiZmllbGQ/LmFwaT8uc3RhdHVzPy5sYWJlbHNbZmllbGQ/LmFwaT8uc3RhdHVzPy52YWx1ZV1cIlxuICAgICAgICAgICAgICBbc2hvd0xvYWRlcl09XCJmaWVsZD8uZGlzYWJsZWQgPT09ICdsb2FkaW5nJ1wiXG4gICAgICAgICAgICAgIHNoYXBlPVwibnVsbFwiXG4gICAgICAgICAgICAgIHNpemU9XCJtXCJcbiAgICAgICAgICAgICAgc3R5bGVzPVwid2lkdGg6IGZpdC1jb250ZW50XCJcbiAgICAgICAgICAgICAgKG9uQ2xpY2spPVwidGhpcy5oYW5kbGVPbkNsaWNrQXBpQ2FsbCgkZXZlbnQpXCJcbiAgICAgICAgICAgID48L2t3aWt1aS1idXR0b24tYXBpLWNhbGw+XG4gICAgICAgICAgICA8a3dpa3VpLW1lc3NhZ2VzXG4gICAgICAgICAgICAgIFttZXNzYWdlc109XCJmaWVsZC5tZXNzYWdlc1wiXG4gICAgICAgICAgICAgIFtpZF09XCJmaWVsZC5rZXlcIlxuICAgICAgICAgICAgPjwva3dpa3VpLW1lc3NhZ2VzPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPCEtLSBNb2JpbGUgT1RQIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInb3RwJ1wiPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIFtoaWRkZW5dPVwiZmllbGQ/LmhpZGRlblwiXG4gICAgICAgICAgICBpZD1cImZpZWxkX3t7IGZpZWxkLmtleSB9fVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGt3aWt1aS1pbnB1dC1vdHBcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImZpZWxkPy5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgIFtmb2N1c109XCJmaWVsZD8uZm9jdXNcIlxuICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwiZm9ybUdyb3VwLmNvbnRyb2xzW2ZpZWxkLmtleV1cIlxuICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cImZpZWxkLmtleVwiXG4gICAgICAgICAgICAgIFtpZF09XCJmaWVsZC5rZXlcIlxuICAgICAgICAgICAgICBbaW52YWxpZF09XCJmaWVsZD8uaW52YWxpZFwiXG4gICAgICAgICAgICAgIFtsYWJlbF09XCJmaWVsZD8ubGFiZWxcIlxuICAgICAgICAgICAgICBbbWFza109XCJmaWVsZD8ucHJvcGVydGllcz8ubWFza1wiXG4gICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJmaWVsZD8ucHJvcGVydGllcz8ucGxhY2Vob2xkZXJcIlxuICAgICAgICAgICAgICBbcHJvcGVydGllc109XCJmaWVsZD8ucHJvcGVydGllc1wiXG4gICAgICAgICAgICAgIFt2YWxpZGF0b3JzXT1cImZpZWxkPy52YWxpZGF0b3JzXCJcbiAgICAgICAgICAgICAgKGdldEtleVZhbHVlKT1cImhhbmRsZUdldEtleVZhbHVlKCRldmVudClcIlxuICAgICAgICAgICAgPjwva3dpa3VpLWlucHV0LW90cD5cbiAgICAgICAgICAgIDxrd2lrdWktbWVzc2FnZXNcbiAgICAgICAgICAgICAgW21lc3NhZ2VzXT1cImZpZWxkLm1lc3NhZ2VzXCJcbiAgICAgICAgICAgICAgW2lkXT1cImZpZWxkLmtleVwiXG4gICAgICAgICAgICA+PC9rd2lrdWktbWVzc2FnZXM+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8IS0tIEFhZGhhYXIgTnVtYmVyIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInYWFkaGFhci1udW1iZXInXCI+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgW2hpZGRlbl09XCJmaWVsZD8uaGlkZGVuXCJcbiAgICAgICAgICAgIGlkPVwiZmllbGRfe3sgZmllbGQua2V5IH19XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8a3dpa3VpLWlucHV0LWFhZGhhYXJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImZpZWxkPy5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgIFtmb2N1c109XCJmaWVsZD8uZm9jdXNcIlxuICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwiZm9ybUdyb3VwLmNvbnRyb2xzW2ZpZWxkLmtleV1cIlxuICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cImZpZWxkLmtleVwiXG4gICAgICAgICAgICAgIFtpZF09XCJmaWVsZC5rZXlcIlxuICAgICAgICAgICAgICBbaW52YWxpZF09XCJmaWVsZD8uaW52YWxpZFwiXG4gICAgICAgICAgICAgIFtsYWJlbF09XCJmaWVsZD8ubGFiZWxcIlxuICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiZmllbGQ/LnBsYWNlaG9sZGVyXCJcbiAgICAgICAgICAgICAgW3Byb3BlcnRpZXNdPVwiZmllbGQ/LnByb3BlcnRpZXNcIlxuICAgICAgICAgICAgICBbdmFsaWRhdG9yc109XCJmaWVsZD8udmFsaWRhdG9yc1wiXG4gICAgICAgICAgICAgIChnZXRLZXlWYWx1ZSk9XCJoYW5kbGVHZXRLZXlWYWx1ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgID48L2t3aWt1aS1pbnB1dC1hYWRoYWFyPlxuICAgICAgICAgICAgPGt3aWt1aS1tZXNzYWdlc1xuICAgICAgICAgICAgICBbbWVzc2FnZXNdPVwiZmllbGQubWVzc2FnZXNcIlxuICAgICAgICAgICAgICBbaWRdPVwiZmllbGQua2V5XCJcbiAgICAgICAgICAgID48L2t3aWt1aS1tZXNzYWdlcz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9mb3JtPlxuICA8ZGl2IGNsYXNzPVwia3dpa2lkLWZvcm0tYnV0dG9uc1wiPlxuICAgIDxrd2lrdWktYnV0dG9uXG4gICAgICAqbmdJZj1cInRoaXMuaXNNb2JpbGVWaWV3XCJcbiAgICAgIFtkaXNhYmxlZF09XCJ2aWV3Rm9ybXNCdXR0b24uZGlzYWJsZWRcIlxuICAgICAgaWQ9XCJcIlxuICAgICAgbGFiZWw9XCJWaWV3IEZvcm1zXCJcbiAgICAgIFtzaG93TG9hZGVyXT1cInZpZXdGb3Jtc0J1dHRvbi5zaG93TG9hZGVyXCJcbiAgICAgIHN0eWxlcz1cIlwiXG4gICAgICBjbGFzcz1cIlwiXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIGFwcGVhcmFuY2U9XCJzZWNvbmRhcnlcIlxuICAgICAgaWNvbj1cIlwiXG4gICAgICBpY29uUmlnaHQ9XCJcIlxuICAgICAgW3NoYXBlXT1cIm51bGxcIlxuICAgICAgc2l6ZT1cIm1cIlxuICAgICAgc3R5bGVzPVwid2lkdGg6IDEwMCVcIlxuICAgICAgKG9uQ2xpY2spPVwidGhpcy5oYW5kbGVPbkNsaWNrVmlld0Zvcm1zKCRldmVudClcIlxuICAgID48L2t3aWt1aS1idXR0b24+XG4gICAgPGt3aWt1aS1idXR0b25cbiAgICAgIFtkaXNhYmxlZF09XCJzYXZlRm9ybUJ1dHRvbi5kaXNhYmxlZFwiXG4gICAgICBpZD1cIlwiXG4gICAgICBsYWJlbD1cIlNhdmVcIlxuICAgICAgW3Nob3dMb2FkZXJdPVwic2F2ZUZvcm1CdXR0b24uc2hvd0xvYWRlclwiXG4gICAgICBzdHlsZXM9XCJcIlxuICAgICAgY2xhc3M9XCJcIlxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICBhcHBlYXJhbmNlPVwicHJpbWFyeVwiXG4gICAgICBpY29uPVwiXCJcbiAgICAgIGljb25SaWdodD1cIlwiXG4gICAgICBbc2hhcGVdPVwibnVsbFwiXG4gICAgICBzaXplPVwibVwiXG4gICAgICBzdHlsZXM9XCJ3aWR0aDogMTAwJVwiXG4gICAgICAob25DbGljayk9XCJ0aGlzLmhhbmRsZU9uQ2xpY2tTYXZlRm9ybSgkZXZlbnQpXCJcbiAgICA+PC9rd2lrdWktYnV0dG9uPlxuICA8L2Rpdj5cbjwvZGl2PlxuPGRpdlxuICBjbGFzcz1cImt3aWtpZC1mb3JtLWNvbnRhaW5lci1sb2FkaW5nXCJcbiAgKm5nSWY9XCJ0aGlzLmxvYWRpbmdcIlxuPlxuICA8ZGl2XG4gICAgY2xhc3M9XCJsYXJnZS13cmFwcGVyXCJcbiAgICBbY2xhc3MudHVpLXNrZWxldG9uXT1cInRoaXMubG9hZGluZ1wiXG4gICAgW2NsYXNzLnR1aS1za2VsZXRvbl9yb3VuZGVkXT1cInRoaXMubG9hZGluZ1wiXG4gID48L2Rpdj5cbiAgPGRpdlxuICAgIGNsYXNzPVwibGFyZ2Utd3JhcHBlclwiXG4gICAgW2NsYXNzLnR1aS1za2VsZXRvbl09XCJ0aGlzLmxvYWRpbmdcIlxuICAgIFtjbGFzcy50dWktc2tlbGV0b25fcm91bmRlZF09XCJ0aGlzLmxvYWRpbmdcIlxuICA+PC9kaXY+XG4gIDxkaXZcbiAgICBjbGFzcz1cImxhcmdlLXdyYXBwZXJcIlxuICAgIFtjbGFzcy50dWktc2tlbGV0b25dPVwidGhpcy5sb2FkaW5nXCJcbiAgICBbY2xhc3MudHVpLXNrZWxldG9uX3JvdW5kZWRdPVwidGhpcy5sb2FkaW5nXCJcbiAgPjwvZGl2PlxuICA8ZGl2XG4gICAgY2xhc3M9XCJsYXJnZS13cmFwcGVyXCJcbiAgICBbY2xhc3MudHVpLXNrZWxldG9uXT1cInRoaXMubG9hZGluZ1wiXG4gICAgW2NsYXNzLnR1aS1za2VsZXRvbl9yb3VuZGVkXT1cInRoaXMubG9hZGluZ1wiXG4gID48L2Rpdj5cbiAgPGRpdlxuICAgIGNsYXNzPVwibGFyZ2Utd3JhcHBlclwiXG4gICAgW2NsYXNzLnR1aS1za2VsZXRvbl09XCJ0aGlzLmxvYWRpbmdcIlxuICAgIFtjbGFzcy50dWktc2tlbGV0b25fcm91bmRlZF09XCJ0aGlzLmxvYWRpbmdcIlxuICA+PC9kaXY+XG4gIDxkaXZcbiAgICBjbGFzcz1cImxhcmdlLXdyYXBwZXJcIlxuICAgIFtjbGFzcy50dWktc2tlbGV0b25dPVwidGhpcy5sb2FkaW5nXCJcbiAgICBbY2xhc3MudHVpLXNrZWxldG9uX3JvdW5kZWRdPVwidGhpcy5sb2FkaW5nXCJcbiAgPjwvZGl2PlxuICA8ZGl2XG4gICAgY2xhc3M9XCJsYXJnZS13cmFwcGVyXCJcbiAgICBbY2xhc3MudHVpLXNrZWxldG9uXT1cInRoaXMubG9hZGluZ1wiXG4gICAgW2NsYXNzLnR1aS1za2VsZXRvbl9yb3VuZGVkXT1cInRoaXMubG9hZGluZ1wiXG4gID48L2Rpdj5cbjwvZGl2PlxuPHR1aS1wdXNoXG4gIGlkPVwiZmllbGQtZXJyb3Itbm90aWZpY2F0aW9uXCJcbiAgKnR1aVB1c2g9XCJzaG93RXJyb3JOb3RpZmljYXRpb25cIlxuICBoZWFkaW5nPVwiTWlzc2luZy9JbmNvcnJlY3QgRmllbGRzIVwiXG4gIHR5cGU9XCJFcnJvclwiXG4gIChjbG9zZSk9XCJ0b2dnbGVFcnJvck5vdGlmaWNhdGlvbihmYWxzZSlcIlxuPlxuICA8dHVpLXN2Z1xuICAgIHNyYz1cInR1aUljb25DYW5jZWxcIlxuICAgIHN0eWxlPVwiY29sb3I6ICNmZmYgIWltcG9ydGFudFwiXG4gID5cbiAgPC90dWktc3ZnPlxuPC90dWktcHVzaD5cbiJdfQ==