@deeksha2309/sunbird-collection-editor 8.0.7 → 8.0.8

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 (107) hide show
  1. package/deeksha2309-sunbird-collection-editor.d.ts.map +1 -0
  2. package/esm2022/deeksha2309-sunbird-collection-editor.mjs +5 -0
  3. package/esm2022/lib/collection-editor-library.module.mjs +30 -6
  4. package/esm2022/lib/components/answer/answer.component.mjs +6 -3
  5. package/esm2022/lib/components/app-loader/app-loader.component.mjs +30 -0
  6. package/esm2022/lib/components/asset-browser/asset-browser.component.mjs +30 -12
  7. package/esm2022/lib/components/assign-page-number/assign-page-number.component.mjs +1 -1
  8. package/esm2022/lib/components/bulk-upload/bulk-upload.component.mjs +447 -0
  9. package/esm2022/lib/components/ckeditor-tool/ckeditor-tool.component.mjs +30 -12
  10. package/esm2022/lib/components/collection-icon/collection-icon.component.mjs +3 -3
  11. package/esm2022/lib/components/csv-upload/csv-upload.component.mjs +2 -2
  12. package/esm2022/lib/components/editor/editor.component.mjs +143 -64
  13. package/esm2022/lib/components/fancy-tree/fancy-tree.component.mjs +91 -9
  14. package/esm2022/lib/components/header/header.component.mjs +27 -9
  15. package/esm2022/lib/components/library/library.component.mjs +4 -4
  16. package/esm2022/lib/components/library-list/library-list.component.mjs +4 -4
  17. package/esm2022/lib/components/library-player/library-player.component.mjs +4 -4
  18. package/esm2022/lib/components/meta-form/meta-form.component.mjs +10 -18
  19. package/esm2022/lib/components/options/options.component.mjs +40 -27
  20. package/esm2022/lib/components/progress-status/progress-status.component.mjs +1 -1
  21. package/esm2022/lib/components/publish-checklist/publish-checklist.component.mjs +6 -3
  22. package/esm2022/lib/components/question/question.component.mjs +185 -77
  23. package/esm2022/lib/components/question-option-sub-menu/question-option-sub-menu.component.mjs +36 -0
  24. package/esm2022/lib/components/quml-player/quml-player.component.mjs +2 -2
  25. package/esm2022/lib/components/qumlplayer-page/qumlplayer-page.component.mjs +3 -3
  26. package/esm2022/lib/components/relational-metadata/relational-metadata.component.mjs +80 -0
  27. package/esm2022/lib/components/resource-reorder/resource-reorder.component.mjs +3 -3
  28. package/esm2022/lib/components/slider/slider.component.mjs +46 -0
  29. package/esm2022/lib/components/template/template.component.mjs +3 -3
  30. package/esm2022/lib/components/translations/translations.component.mjs +132 -0
  31. package/esm2022/lib/directives/date-format/date-format.pipe.mjs +34 -0
  32. package/esm2022/lib/interfaces/CreationContext.mjs +2 -0
  33. package/esm2022/lib/interfaces/editor.mjs +1 -1
  34. package/esm2022/lib/interfaces/loader.mjs +2 -0
  35. package/esm2022/lib/pipes/interpolate.pipe.mjs +17 -0
  36. package/esm2022/lib/pipes/sanitize-html.pipe.mjs +6 -8
  37. package/esm2022/lib/services/bulk-job/bulk-job.service.mjs +67 -0
  38. package/esm2022/lib/services/config/category.config.json +1 -0
  39. package/esm2022/lib/services/config/editor.config.json +29 -2
  40. package/esm2022/lib/services/config/label.config.json +16 -3
  41. package/esm2022/lib/services/config/player.config.json +3 -0
  42. package/esm2022/lib/services/config/url.config.json +17 -1
  43. package/esm2022/lib/services/editor/editor.service.mjs +64 -26
  44. package/esm2022/lib/services/question/question.service.mjs +27 -35
  45. package/esm2022/lib/services/tree/tree.service.mjs +20 -5
  46. package/fesm2022/{project-sunbird-sunbird-collection-editor.mjs → deeksha2309-sunbird-collection-editor.mjs} +1779 -483
  47. package/fesm2022/deeksha2309-sunbird-collection-editor.mjs.map +1 -0
  48. package/index.d.ts +2 -2
  49. package/lib/collection-editor-library.module.d.ts +51 -43
  50. package/lib/collection-editor-library.module.d.ts.map +1 -1
  51. package/lib/components/answer/answer.component.d.ts +2 -1
  52. package/lib/components/answer/answer.component.d.ts.map +1 -1
  53. package/lib/components/app-loader/app-loader.component.d.ts +18 -0
  54. package/lib/components/app-loader/app-loader.component.d.ts.map +1 -0
  55. package/lib/components/asset-browser/asset-browser.component.d.ts.map +1 -1
  56. package/lib/components/bulk-upload/bulk-upload.component.d.ts +71 -0
  57. package/lib/components/bulk-upload/bulk-upload.component.d.ts.map +1 -0
  58. package/lib/components/ckeditor-tool/ckeditor-tool.component.d.ts +1 -1
  59. package/lib/components/ckeditor-tool/ckeditor-tool.component.d.ts.map +1 -1
  60. package/lib/components/editor/editor.component.d.ts +11 -7
  61. package/lib/components/editor/editor.component.d.ts.map +1 -1
  62. package/lib/components/fancy-tree/fancy-tree.component.d.ts +11 -3
  63. package/lib/components/fancy-tree/fancy-tree.component.d.ts.map +1 -1
  64. package/lib/components/header/header.component.d.ts +6 -2
  65. package/lib/components/header/header.component.d.ts.map +1 -1
  66. package/lib/components/library/library.component.d.ts +1 -1
  67. package/lib/components/library/library.component.d.ts.map +1 -1
  68. package/lib/components/meta-form/meta-form.component.d.ts +3 -4
  69. package/lib/components/meta-form/meta-form.component.d.ts.map +1 -1
  70. package/lib/components/options/options.component.d.ts +15 -7
  71. package/lib/components/options/options.component.d.ts.map +1 -1
  72. package/lib/components/publish-checklist/publish-checklist.component.d.ts +2 -1
  73. package/lib/components/publish-checklist/publish-checklist.component.d.ts.map +1 -1
  74. package/lib/components/question/question.component.d.ts +21 -28
  75. package/lib/components/question/question.component.d.ts.map +1 -1
  76. package/lib/components/question-option-sub-menu/question-option-sub-menu.component.d.ts +27 -0
  77. package/lib/components/question-option-sub-menu/question-option-sub-menu.component.d.ts.map +1 -0
  78. package/lib/components/relational-metadata/relational-metadata.component.d.ts +25 -0
  79. package/lib/components/relational-metadata/relational-metadata.component.d.ts.map +1 -0
  80. package/lib/components/slider/slider.component.d.ts +25 -0
  81. package/lib/components/slider/slider.component.d.ts.map +1 -0
  82. package/lib/components/translations/translations.component.d.ts +70 -0
  83. package/lib/components/translations/translations.component.d.ts.map +1 -0
  84. package/lib/directives/date-format/date-format.pipe.d.ts +20 -0
  85. package/lib/directives/date-format/date-format.pipe.d.ts.map +1 -0
  86. package/lib/interfaces/CreationContext.d.ts +11 -0
  87. package/lib/interfaces/CreationContext.d.ts.map +1 -0
  88. package/lib/interfaces/editor.d.ts +10 -5
  89. package/lib/interfaces/editor.d.ts.map +1 -1
  90. package/lib/interfaces/loader.d.ts +11 -0
  91. package/lib/interfaces/loader.d.ts.map +1 -0
  92. package/lib/pipes/interpolate.pipe.d.ts +8 -0
  93. package/lib/pipes/interpolate.pipe.d.ts.map +1 -0
  94. package/lib/pipes/sanitize-html.pipe.d.ts +4 -4
  95. package/lib/pipes/sanitize-html.pipe.d.ts.map +1 -1
  96. package/lib/services/bulk-job/bulk-job.service.d.ts +17 -0
  97. package/lib/services/bulk-job/bulk-job.service.d.ts.map +1 -0
  98. package/lib/services/editor/editor.service.d.ts +7 -4
  99. package/lib/services/editor/editor.service.d.ts.map +1 -1
  100. package/lib/services/question/question.service.d.ts +2 -2
  101. package/lib/services/question/question.service.d.ts.map +1 -1
  102. package/lib/services/tree/tree.service.d.ts +3 -1
  103. package/lib/services/tree/tree.service.d.ts.map +1 -1
  104. package/package.json +5 -5
  105. package/esm2022/project-sunbird-sunbird-collection-editor.mjs +0 -5
  106. package/fesm2022/project-sunbird-sunbird-collection-editor.mjs.map +0 -1
  107. package/project-sunbird-sunbird-collection-editor.d.ts.map +0 -1
@@ -25,8 +25,12 @@ import * as i17 from "../answer/answer.component";
25
25
  import * as i18 from "../ckeditor-tool/ckeditor-tool.component";
26
26
  import * as i19 from "../../directives/telemetry-interact/telemetry-interact.directive";
27
27
  import * as i20 from "../quml-player/quml-player.component";
28
- import * as i21 from "../term-and-condition/term-and-condition.component";
29
- import * as i22 from "../quality-params-modal/quality-params-modal.component";
28
+ import * as i21 from "../question-option-sub-menu/question-option-sub-menu.component";
29
+ import * as i22 from "../slider/slider.component";
30
+ import * as i23 from "../app-loader/app-loader.component";
31
+ import * as i24 from "../term-and-condition/term-and-condition.component";
32
+ import * as i25 from "../quality-params-modal/quality-params-modal.component";
33
+ import * as i26 from "../../pipes/sanitize-html.pipe";
30
34
  const evidenceMimeType = '';
31
35
  const evidenceSizeLimit = '20480';
32
36
  export class QuestionComponent {
@@ -45,6 +49,7 @@ export class QuestionComponent {
45
49
  this.questionEmitter = new EventEmitter();
46
50
  this.onComponentDestroy$ = new Subject();
47
51
  this.toolbarConfig = {};
52
+ this.terms = false;
48
53
  this.editorState = {};
49
54
  this.showPreview = false;
50
55
  this.mediaArr = [];
@@ -62,7 +67,10 @@ export class QuestionComponent {
62
67
  }];
63
68
  this.setCharacterLimit = 160;
64
69
  this.showLoader = true;
70
+ this.isReadOnlyMode = false;
71
+ this.showReviewModal = false;
65
72
  this.showConfirmPopup = false;
73
+ this.showSubmitConfirmPopup = false;
66
74
  this.validQuestionData = false;
67
75
  this.pageId = 'question';
68
76
  this.frameworkDetails = {};
@@ -81,19 +89,25 @@ export class QuestionComponent {
81
89
  this.isChildQuestion = false;
82
90
  this.maxScore = 1;
83
91
  this.showQualityParameterPopup = false;
84
- this.isReadOnlyMode = false;
85
- this.showSubmitConfirmPopup = false;
86
- this.showReviewModal = false;
87
- this.contentComment = '';
88
- const { primaryCategory } = this.editorService.selectedChildren;
92
+ const { primaryCategory, label } = this.editorService.selectedChildren;
89
93
  this.questionPrimaryCategory = primaryCategory;
90
94
  this.pageStartTime = Date.now();
95
+ this.categoryLabel = [];
96
+ this.getOptions();
97
+ if (!_.isUndefined(label)) {
98
+ this.categoryLabel[primaryCategory] = label;
99
+ }
91
100
  }
92
101
  ngOnInit() {
93
102
  const { questionSetId, questionId, type, category, creationContext, creationMode } = this.questionInput;
94
103
  this.questionInteractionType = type;
104
+ this.questionCategory = category;
95
105
  this.questionId = questionId;
96
106
  this.questionSetId = questionSetId;
107
+ this.creationContext = creationContext;
108
+ this.creationMode = creationMode;
109
+ this.unitId = this.creationContext?.unitIdentifier;
110
+ this.isReadOnlyMode = this.creationContext?.isReadOnlyMode;
97
111
  this.toolbarConfig = this.editorService.getToolbarConfig();
98
112
  this.toolbarConfig.showPreview = this.editorService.editorMode !== 'edit';
99
113
  this.toolbarConfig.add_translation = true;
@@ -127,6 +141,7 @@ export class QuestionComponent {
127
141
  }
128
142
  });
129
143
  });
144
+ this.questionFormConfig = _.cloneDeep(this.leafFormConfig);
130
145
  }
131
146
  ngAfterViewInit() {
132
147
  this.telemetryService.impression({
@@ -165,8 +180,27 @@ export class QuestionComponent {
165
180
  this.editorState = this.questionMetaData.editorState;
166
181
  }
167
182
  }
183
+ if (this.questionInteractionType === 'slider') {
184
+ if (this.questionMetaData.editorState) {
185
+ this.editorState = this.questionMetaData.editorState;
186
+ this.sliderOptions = this.questionMetaData.interactions.response1;
187
+ this.sliderDatas = this.questionMetaData.interactions.response1;
188
+ this.hints = this.questionMetaData.hints;
189
+ }
190
+ }
191
+ if (this.questionInteractionType === 'text') {
192
+ if (this.questionMetaData.editorState) {
193
+ this.editorState = this.questionMetaData.editorState;
194
+ }
195
+ }
196
+ if (this.questionInteractionType === 'date') {
197
+ if (this.questionMetaData.editorState) {
198
+ this.editorState = this.questionMetaData.editorState;
199
+ }
200
+ }
168
201
  if (this.questionInteractionType === 'choice') {
169
202
  const responseDeclaration = this.questionMetaData.responseDeclaration;
203
+ this.scoreMapping = _.get(responseDeclaration, 'response1.mapping');
170
204
  const templateId = this.questionMetaData.templateId;
171
205
  const numberOfOptions = this.questionMetaData?.editorState?.options?.length || 0;
172
206
  const maximumOptions = _.get(this.questionInput, 'config.maximumOptions');
@@ -227,17 +261,15 @@ export class QuestionComponent {
227
261
  this.tempQuestionId = uuidv4();
228
262
  this.populateFormData();
229
263
  this.setQuestionTitle();
264
+ let editorState = {};
230
265
  if (this.questionInteractionType === 'default') {
231
- let editorState;
232
266
  if (this.questionCategory) {
233
267
  editorState = _.get(this.configService, `editorConfig.defaultStates.nonInteractiveQuestions.${this.questionCategory}`);
234
268
  }
235
269
  else {
236
270
  this.editorState = { question: '', answer: '', solutions: '' };
237
271
  }
238
- if (editorState) {
239
- this.editorState = { ...editorState };
240
- }
272
+ this.editorState = { ...editorState };
241
273
  }
242
274
  else if (this.questionInteractionType === 'choice') {
243
275
  this.editorState = new McqForm({ question: '', options: [] }, { numberOfOptions: _.get(this.questionInput, 'config.numberOfOptions'), maximumOptions: _.get(this.questionInput, 'config.maximumOptions') });
@@ -259,13 +291,36 @@ export class QuestionComponent {
259
291
  return this.editorService.contentPolicyUrl;
260
292
  }
261
293
  toolbarEventListener(event) {
294
+ this.actionType = event.button;
262
295
  switch (event.button) {
263
296
  case 'saveContent':
297
+ this.showAddSecondaryQuestionCat = false;
264
298
  this.saveContent();
265
299
  break;
300
+ case 'showTranslation':
301
+ this.showTranslation = true;
302
+ break;
303
+ case 'submitQuestion':
304
+ this.submitHandler();
305
+ break;
266
306
  case 'cancelContent':
267
307
  this.handleRedirectToQuestionset();
268
308
  break;
309
+ case 'rejectQuestion':
310
+ this.rejectQuestion(event.comment);
311
+ break;
312
+ case 'publishQuestion':
313
+ this.publishQuestion(event);
314
+ break;
315
+ case 'sourcingApproveQuestion':
316
+ this.sourcingUpdate(event);
317
+ break;
318
+ case 'sourcingRejectQuestion':
319
+ this.sourcingUpdate(event);
320
+ break;
321
+ case 'sendForCorrectionsQuestion':
322
+ this.sendBackQuestion(event);
323
+ break;
269
324
  case 'backContent':
270
325
  this.handleRedirectToQuestionset();
271
326
  break;
@@ -289,7 +344,7 @@ export class QuestionComponent {
289
344
  }
290
345
  }
291
346
  handleRedirectToQuestionset() {
292
- if (_.isUndefined(this.questionId)) {
347
+ if (_.isUndefined(this.questionId) || this.creationMode === 'edit') {
293
348
  this.showConfirmPopup = true;
294
349
  }
295
350
  else {
@@ -459,6 +514,9 @@ export class QuestionComponent {
459
514
  this.showFormError = true;
460
515
  return;
461
516
  }
517
+ else {
518
+ this.showFormError = false;
519
+ }
462
520
  // to handle when question type is subjective
463
521
  if (this.questionInteractionType === 'default') {
464
522
  if (this.editorState.answer !== '') {
@@ -507,6 +565,7 @@ export class QuestionComponent {
507
565
  }
508
566
  redirectToQuestionset() {
509
567
  this.showConfirmPopup = false;
568
+ this.treeService.clearTreeCache();
510
569
  setTimeout(() => {
511
570
  if (this.showAddSecondaryQuestionCat) {
512
571
  this.questionEmitter.emit({
@@ -521,29 +580,11 @@ export class QuestionComponent {
521
580
  this.questionEmitter.emit({ status: false });
522
581
  }, 100);
523
582
  }
524
- addResourceToQuestionset(publishCallback) {
525
- const questionSetId = _.get(this.editorService.editorConfig, 'context.identifier');
526
- const unitId = this.selectedSectionId || _.get(this.questionInput, 'config.parent');
527
- this.editorService.addResourceToQuestionset(questionSetId, unitId, this.questionId).subscribe(() => {
528
- this.toasterService.success(_.get(this.configService, 'labelConfig.messages.success.009'));
529
- if (publishCallback) {
530
- publishCallback();
531
- }
532
- else {
533
- this.redirectToQuestionset();
534
- }
535
- }, (err) => {
536
- const errInfo = {
537
- errorMsg: 'Failed to add question to questionset. Please try again...',
538
- };
539
- this.editorService.apiErrorHandling(err, errInfo);
540
- });
541
- }
542
583
  redirectToChapterList() {
543
- this.questionEmitter.emit({ status: false });
544
- }
545
- setQuestionId(questionId) {
546
- this.questionId = questionId;
584
+ this.showConfirmPopup = false;
585
+ setTimeout(() => {
586
+ this.questionEmitter.emit({ type: 'close', actionType: this.actionType, identifier: this.questionId });
587
+ }, 100);
547
588
  }
548
589
  editorDataHandler(event, type) {
549
590
  if (type === 'question') {
@@ -570,6 +611,21 @@ export class QuestionComponent {
570
611
  }
571
612
  }
572
613
  }
614
+ addResourceToQuestionset(callback = null) {
615
+ this.editorService.addResourceToQuestionset(this.questionSetId, this.unitId, this.questionId).subscribe(res => {
616
+ if (callback) {
617
+ callback();
618
+ }
619
+ else {
620
+ this.redirectToChapterList();
621
+ }
622
+ }, err => {
623
+ const errInfo = {
624
+ errorMsg: 'Adding question to questionset failed. Please try again.',
625
+ };
626
+ return throwError(this.editorService.apiErrorHandling(err, errInfo));
627
+ });
628
+ }
573
629
  saveQuestion() {
574
630
  if (_.get(this.creationContext, 'objectType') === 'question') {
575
631
  if (this.creationMode === 'edit') {
@@ -669,6 +725,8 @@ export class QuestionComponent {
669
725
  media: this.mediaArr,
670
726
  editorState: {}
671
727
  };
728
+ console.log('getQuestionMetadata');
729
+ console.log(this.editorState);
672
730
  metadata = _.assign(metadata, this.editorState);
673
731
  metadata.editorState.question = metadata.question;
674
732
  metadata.body = metadata.question;
@@ -679,6 +737,9 @@ export class QuestionComponent {
679
737
  if (this.questionInteractionType === 'choice') {
680
738
  metadata.body = this.getMcqQuestionHtmlBody(this.editorState.question, this.editorState.templateId);
681
739
  }
740
+ else {
741
+ metadata.responseDeclaration = this.getResponseDeclaration(this.questionInteractionType);
742
+ }
682
743
  if (!_.isUndefined(this.selectedSolutionType) && !_.isEmpty(this.selectedSolutionType)) {
683
744
  const solutionObj = this.getSolutionObj(this.solutionUUID, this.selectedSolutionType, this.editorState.solutions);
684
745
  metadata.editorState.solutions = [solutionObj];
@@ -718,7 +779,7 @@ export class QuestionComponent {
718
779
  getMcqQuestionHtmlBody(question, templateId) {
719
780
  const mcqTemplateConfig = {
720
781
  // tslint:disable-next-line:max-line-length
721
- mcqBody: '<div class=\'question-body\'><div class=\'mcq-title\'>{question}</div><div data-choice-interaction=\'response1\' class=\'{templateClass}\'></div></div>'
782
+ mcqBody: '<div class=\'question-body\' tabindex=\'-1\'><div class=\'mcq-title\' tabindex=\'0\'>{question}</div><div data-choice-interaction=\'response1\' class=\'{templateClass}\'></div></div>'
722
783
  };
723
784
  const { mcqBody } = mcqTemplateConfig;
724
785
  const questionBody = mcqBody.replace('{templateClass}', templateId)
@@ -727,7 +788,7 @@ export class QuestionComponent {
727
788
  }
728
789
  getDefaultSessionContext() {
729
790
  return _.omitBy(_.merge({
730
- author: _.get(this.editorService.editorConfig, 'context.user.fullName'),
791
+ creator: _.get(this.editorService.editorConfig, 'context.user.fullName'),
731
792
  createdBy: _.get(this.editorService.editorConfig, 'context.user.id'),
732
793
  ..._.pick(_.get(this.editorService.editorConfig, 'context'), ['board', 'medium', 'gradeLevel', 'subject', 'topic'])
733
794
  }, {
@@ -823,10 +884,13 @@ export class QuestionComponent {
823
884
  const activeNode = this.treeService.getActiveNode();
824
885
  const selectedUnitId = _.get(activeNode, 'data.id');
825
886
  this.editorService.data = {};
887
+ this.editorService.selectedSection = selectedUnitId;
888
+ const metaData = this.getQuestionMetadata();
889
+ this.setQuestionTypeValues(metaData);
826
890
  return {
827
891
  nodesModified: {
828
892
  [questionId]: {
829
- metadata: this.getQuestionMetadata(),
893
+ metadata: _.omit(metaData, ['creator']),
830
894
  objectType: 'Question',
831
895
  root: false,
832
896
  isNew: !this.questionId
@@ -884,12 +948,29 @@ export class QuestionComponent {
884
948
  });
885
949
  }
886
950
  createQuestion() {
887
- const requestBody = this.prepareRequestBody();
951
+ if (this.showOptions) {
952
+ this.buildCondition('create');
953
+ }
954
+ else {
955
+ const requestBody = this.prepareRequestBody();
956
+ this.saveQuestions(requestBody, 'create');
957
+ }
958
+ }
959
+ saveQuestions(requestBody, type) {
888
960
  this.showHideSpinnerLoader(true);
889
961
  this.questionService.updateHierarchyQuestionCreate(requestBody).pipe(finalize(() => {
890
962
  this.showHideSpinnerLoader(false);
891
963
  })).subscribe((response) => {
892
- this.toasterService.success(_.get(this.configService, 'labelConfig.messages.success.007'));
964
+ if (this.showAddSecondaryQuestionCat) {
965
+ const result = _.get(response.result.identifiers, this.newQuestionID);
966
+ this.editorService.parentIdentifier = result;
967
+ }
968
+ if (type === 'create') {
969
+ this.toasterService.success(_.get(this.configService, 'labelConfig.messages.success.007'));
970
+ }
971
+ else {
972
+ this.toasterService.success(_.get(this.configService, 'labelConfig.messages.success.008'));
973
+ }
893
974
  this.redirectToQuestionset();
894
975
  }, (err) => {
895
976
  const errInfo = {
@@ -899,11 +980,23 @@ export class QuestionComponent {
899
980
  });
900
981
  }
901
982
  updateQuestion() {
983
+ if (this.isChildQuestion) {
984
+ this.buildCondition('update');
985
+ }
986
+ else {
987
+ this.saveUpdateQuestions();
988
+ }
989
+ }
990
+ saveUpdateQuestions() {
902
991
  const requestBody = this.prepareRequestBody();
903
992
  this.showHideSpinnerLoader(true);
904
993
  this.questionService.updateHierarchyQuestionUpdate(requestBody).pipe(finalize(() => {
905
994
  this.showHideSpinnerLoader(false);
906
995
  })).subscribe((response) => {
996
+ if (this.showAddSecondaryQuestionCat) {
997
+ const result = _.get(response.result.identifiers, this.questionId);
998
+ this.editorService.parentIdentifier = result;
999
+ }
907
1000
  this.toasterService.success(_.get(this.configService, 'labelConfig.messages.success.008'));
908
1001
  this.redirectToQuestionset();
909
1002
  }, (err) => {
@@ -913,28 +1006,11 @@ export class QuestionComponent {
913
1006
  this.editorService.apiErrorHandling(err, errInfo);
914
1007
  });
915
1008
  }
916
- saveQuestions(requestBody, type) {
917
- this.showHideSpinnerLoader(true);
918
- const serviceMethod = type === 'create' ?
919
- this.questionService.updateHierarchyQuestionCreate(requestBody) :
920
- this.questionService.updateHierarchyQuestionUpdate(requestBody);
921
- serviceMethod.pipe(finalize(() => {
922
- this.showHideSpinnerLoader(false);
923
- })).subscribe((response) => {
924
- const successMsg = type === 'create' ?
925
- _.get(this.configService, 'labelConfig.messages.success.007') :
926
- _.get(this.configService, 'labelConfig.messages.success.008');
927
- this.toasterService.success(successMsg);
928
- this.redirectToQuestionset();
929
- }, (err) => {
930
- const errInfo = {
931
- errorMsg: `Question ${type === 'create' ? 'creating' : 'updating'} failed. Please try again...`,
932
- };
933
- this.editorService.apiErrorHandling(err, errInfo);
934
- });
935
- }
936
- showHideSpinnerLoader(status) {
1009
+ showHideSpinnerLoader(status, type) {
937
1010
  this.buttonLoaders.saveButtonLoader = status;
1011
+ if (type) {
1012
+ this.buttonLoaders[type] = status;
1013
+ }
938
1014
  }
939
1015
  previewContent() {
940
1016
  this.validateQuestionData();
@@ -992,22 +1068,43 @@ export class QuestionComponent {
992
1068
  getTelemetryEvents(event) {
993
1069
  console.log('event is for telemetry', JSON.stringify(event));
994
1070
  }
1071
+ setQuestionId(questionId) {
1072
+ this.questionId = questionId;
1073
+ }
995
1074
  setQuestionTitle(questionId) {
996
1075
  let index;
997
1076
  let questionTitle = '';
998
- let hierarchyChildren = this.treeService.getChildren();
999
- if (!_.isUndefined(questionId)) {
1000
- const parentNode = this.treeService.getActiveNode().getParent();
1001
- hierarchyChildren = parentNode.getChildren();
1002
- index = _.findIndex(hierarchyChildren, (node) => node.data.id === questionId);
1003
- const question = hierarchyChildren[index];
1004
- questionTitle = `Q${(index + 1).toString()} | ` + question.data.primaryCategory;
1077
+ if (_.get(this.creationContext, 'objectType') === 'question') {
1078
+ if (!_.isUndefined(this.questionPrimaryCategory)) {
1079
+ questionTitle = this.questionPrimaryCategory;
1080
+ }
1005
1081
  }
1006
1082
  else {
1007
- index = hierarchyChildren.length;
1008
- questionTitle = `Q${(index + 1).toString()} | `;
1009
- if (!_.isUndefined(this.questionPrimaryCategory)) {
1010
- questionTitle = questionTitle + this.questionPrimaryCategory;
1083
+ let hierarchyChildren = this.treeService.getChildren();
1084
+ if (!_.isUndefined(questionId)) {
1085
+ const parentNode = this.treeService.getActiveNode().getParent();
1086
+ hierarchyChildren = parentNode.getChildren();
1087
+ _.forEach(hierarchyChildren, (child) => {
1088
+ if (child.children) {
1089
+ index = _.findIndex(child.children, { identifier: questionId });
1090
+ const question = child.children[index];
1091
+ // tslint:disable-next-line:max-line-length
1092
+ questionTitle = `Q${(index + 1).toString()} | ` + (_.get(this.categoryLabel, `${question.primaryCategory}`) || question.primaryCategory);
1093
+ }
1094
+ else {
1095
+ index = _.findIndex(hierarchyChildren, (node) => node.data.id === questionId);
1096
+ const question = hierarchyChildren[index];
1097
+ // tslint:disable-next-line:max-line-length
1098
+ questionTitle = `Q${(index + 1).toString()} | ` + (_.get(this.categoryLabel, `${_.get(question, 'data.primaryCategory')}`) || _.get(question, 'data.primaryCategory'));
1099
+ }
1100
+ });
1101
+ }
1102
+ else {
1103
+ index = hierarchyChildren.length;
1104
+ questionTitle = `Q${(index + 1).toString()} | `;
1105
+ if (!_.isUndefined(this.questionPrimaryCategory)) {
1106
+ questionTitle = questionTitle + (_.get(this.categoryLabel, `${this.questionPrimaryCategory}`) || this.questionPrimaryCategory);
1107
+ }
1011
1108
  }
1012
1109
  }
1013
1110
  this.toolbarConfig.title = questionTitle;
@@ -1028,7 +1125,7 @@ export class QuestionComponent {
1028
1125
  this.childFormData = event;
1029
1126
  }
1030
1127
  validateFormFields() {
1031
- _.forEach(this.leafFormConfig, (formFieldCategory) => {
1128
+ _.forEach(this.questionFormConfig, (formFieldCategory) => {
1032
1129
  if (formFieldCategory.required && !this.childFormData[formFieldCategory.code]) {
1033
1130
  this.showFormError = true;
1034
1131
  this.toasterService.error(_.get(this.configService, 'labelConfig.messages.error.008'));
@@ -1046,7 +1143,16 @@ export class QuestionComponent {
1046
1143
  formFieldCategory.default = this.childFormData[formFieldCategory.code];
1047
1144
  }
1048
1145
  });
1049
- this.leafFormConfig = formConfig;
1146
+ this.questionFormConfig = formConfig;
1147
+ }
1148
+ isEditable(fieldCode) {
1149
+ if (this.creationMode === 'edit') {
1150
+ return true;
1151
+ }
1152
+ if (!this.questionId) {
1153
+ return true;
1154
+ }
1155
+ return false;
1050
1156
  }
1051
1157
  populateFormData() {
1052
1158
  this.childFormData = {};
@@ -1088,7 +1194,7 @@ export class QuestionComponent {
1088
1194
  else {
1089
1195
  // tslint:disable-next-line:max-line-length
1090
1196
  const questionSetDefaultValue = _.get(this.questionSetHierarchy, formFieldCategory.code) ? _.get(this.questionSetHierarchy, formFieldCategory.code) : '';
1091
- const defaultEditStatus = _.find(this.initialLeafFormConfig, { code: formFieldCategory.code }).editable === true ? true : false;
1197
+ const defaultEditStatus = _.find(this.initialLeafFormConfig, { code: formFieldCategory.code }).editable === true;
1092
1198
  formFieldCategory.default = defaultEditStatus ? '' : questionSetDefaultValue;
1093
1199
  this.childFormData[formFieldCategory.code] = formFieldCategory.default;
1094
1200
  if (formFieldCategory.code === 'maxScore' && this.questionInteractionType === 'choice') {
@@ -1345,16 +1451,18 @@ export class QuestionComponent {
1345
1451
  }
1346
1452
  }
1347
1453
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: QuestionComponent, deps: [{ token: i1.QuestionService }, { token: i2.EditorService }, { token: i3.EditorTelemetryService }, { token: i4.PlayerService }, { token: i5.ToasterService }, { token: i6.TreeService }, { token: i7.FrameworkService }, { token: i8.Router }, { token: i9.ConfigService }, { token: i10.EditorCursor }], target: i0.ɵɵFactoryTarget.Component }); }
1348
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: QuestionComponent, selector: "lib-question", inputs: { questionInput: "questionInput", leafFormConfig: "leafFormConfig" }, outputs: { questionEmitter: "questionEmitter" }, ngImport: i0, template: "<div class=\"sb-editor-container mb-0\" *ngIf=\"!showLoader\">\n <lib-header [labelConfigData]=\"toolbarConfig\" [buttonLoaders]=\"buttonLoaders\" [pageId]=\"pageId\" [requestChange] = \"requestChangesPopupAction\" (toolbarEmitter)=\"toolbarEventListener($event)\">\n </lib-header>\n\n <div class=\"sb-bg-white py-20\">\n <div class=\"ui container sb-container\">\n <div class=\"ui twelve column wide h-100\">\n <div class=\"px-16\">\n <div *ngIf=\"showPreview\" class=\"br-2 b-1-100\">\n <lib-quml-player [questionSetHierarchy]=\"questionSetHierarchy\" [isSingleQuestionPreview]=\"true\" ></lib-quml-player>\n </div>\n <div style=\"display: flex;align-items: flex-end;justify-content: flex-end;\"\n *ngIf=\"showOptions || isChildQuestion \">\n <div class=\"options\">\n <sui-select [(ngModel)]=\"condition\" valueField=\"value\" class=\"selection multiselect\"\n labelField=\"label\" [placeholder]=\"'Select Condition'\" #select [isDisabled]=\"isReadOnlyMode\">\n <sui-select-option [value]=\"{label:'Equal to',value:'eq'}\"></sui-select-option>\n <sui-select-option [value]=\"{label:'Not equal',value:'ne'}\"></sui-select-option>\n </sui-select>\n\n <sui-multi-select class=\"selection multiselect\" [(ngModel)]=\"selectedOptions\" valueField=\"value\"\n labelField=\"label\" [isSearchable]=\"false\" #multiSelect [placeholder]=\"'Select options'\" [isDisabled]=\"isReadOnlyMode\" >\n <sui-select-option *ngFor=\"let option of options\" [value]=\"option\">\n </sui-select-option>\n </sui-multi-select>\n </div>\n </div>\n <div class=\"py-20 px-32 br-4 b-1-100\" *ngIf=\"!showPreview\" [ngClass]=\"{'sb-bg-color-primary-0': !isReadOnlyMode}\">\n <div class=\"sb-field-group\">\n <label class=\"fs-0-92 font-weight-bold\">{{configService.labelConfig?.lbl?.question}}<span class=\"sb-required\">*</span></label>\n <div class=\"sb-field\">\n <div class=\"ckeditor-tool__question mb-5\">\n <lib-ckeditor-tool\n (editorDataOutput)=\"editorDataHandler($event, 'question')\"\n [editorDataInput]=\"editorState.question\"\n (videoDataOutput)=\"videoDataOutput($event)\" [videoShow]=\"videoShow\"></lib-ckeditor-tool>\n </div>\n <label *ngIf=\"\n showFormError &&\n [undefined, ''].includes(editorState.question)\n \" class=\"sb-color-error fs-0-785\">{{configService.labelConfig?.lbl?.questionRequired}}</label>\n </div>\n\n <lib-answer *ngIf=\"questionInteractionType === 'default'\"\n [editorState]=\"editorState\" [showFormError]=\"showFormError\"\n (editorDataOutput)=\"editorDataHandler($event)\"></lib-answer>\n\n <lib-options *ngIf=\"questionInteractionType === 'choice'\"\n [editorState]=\"editorState\" [showFormError]=\"showFormError\"\n (editorDataOutput)=\"editorDataHandler($event)\"></lib-options>\n\n <div class=\"d-flex flex-ai-center ckeditor-tool__solution py-10 px-16 mt-15 sb-bg-color-white\">\n <label class=\"fs-0-92 mb-0 ckeditor-tool__label pb-4\">\n <span class=\"sb-color-primary fs-0-785 mr-4\">{{configService.labelConfig?.lbl?.solution}}</span>\n <span class=\"sb-color-gray-200 fxsmall font-weight-normal\">{{configService.labelConfig?.lbl?.optional}}</span>\n </label>\n <div\n class=\"ui dropdown sb-btn sb-btn-outline-primary sb-btn-normal sb-right-icon-btn sb-btn-radius ml-auto\"\n suiDropdown autoClose=\"itemClick\" *ngIf=\"showSolutionDropDown\" libTelemetryInteract\n [telemetryInteractEdata]=\"telemetryService.getTelemetryInteractEdata('choose_type','click','single_select', telemetryService.telemetryPageId)\">\n <div class=\"text gray-200\">{{configService.labelConfig?.lbl?.chooseType}}</div>\n <i class=\"dropdown icon mx-8\"></i>\n <div class=\"menu\" suiDropdownMenu>\n <div class=\"item\" (click)=\"selectSolutionType('Text+Image')\" libTelemetryInteract\n [telemetryInteractEdata]=\"telemetryService.getTelemetryInteractEdata('solution_type','select','single_select', telemetryService.telemetryPageId, {solution_type:'Text+Image'})\">\n {{configService.labelConfig?.lbl?.textImage}}\n </div>\n <div class=\"item\" (click)=\"selectSolutionType('video')\" libTelemetryInteract\n [telemetryInteractEdata]=\"telemetryService.getTelemetryInteractEdata('solution_type','select','single_select', telemetryService.telemetryPageId, {solution_type:'video'})\">\n {{configService.labelConfig?.lbl?.video}}\n </div>\n </div>\n </div>\n </div>\n <div class=\"solution_html\" *ngIf=\"selectedSolutionType == 'html'\">\n <div class=\"ckeditor-tool-container\">\n <div class=\"sb-ckeditor relative mb-8\">\n <button (click)=\"deleteSolution()\" class=\"sb-btn sb-ckeditor-close absolute\" libTelemetryInteract\n [telemetryInteractEdata]=\"telemetryService.getTelemetryInteractEdata('delete_solution','click','cancel', telemetryService.telemetryPageId, {solution_type:'Text+Image'})\">\n <i class=\"icon close\"></i>\n </button>\n <lib-ckeditor-tool (editorDataOutput)=\"\n editorDataHandler($event, 'solution')\n \"[editorDataInput]=\"editorState.solutions\"\n class=\"ckeditor-tool__option\"></lib-ckeditor-tool>\n </div>\n </div>\n </div>\n <div class=\"solution_video\" *ngIf=\"selectedSolutionType == 'video' && showSolution\">\n <div class=\"ckeditor-tool__solution sb-bg-color-white sb-ckeditor relative\">\n <div class=\"solution-media p-16 d-flex flex-ai-center ckeditor-tool__option p-16\">\n <div class=\"mcq-checkbox-answer\">\n <button class=\"sb-btn sb-ckeditor-close absolute\" (click)=\"deleteSolution()\"\n libTelemetryInteract\n [telemetryInteractEdata]=\"telemetryService.getTelemetryInteractEdata('delete_solution','click','cancel', this.telemetryService.telemetryPageId, {solution_type:'video'})\">\n <i class=\"icon close\"></i>\n </button>\n </div>\n <div class=\"solution-media__video relative position\">\n <div class=\"overlay-image\" [ngStyle]=\"\n videoThumbnail\n ? { background: 'url(' + videoThumbnail + ')' }\n : { background: 'rgba(0,0,0,0.3)' }\n \">\n <i class=\"play circle icon\"></i>\n </div>\n </div>\n <div class=\"solution-media__desc ml-16 sb-color-primary\">\n {{ videoSolutionName\n }}\n <!-- <i class=\"icon ellipsis vertical sb-color-black\"></i> -->\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <!-- <lib-translations *ngIf=\"showTranslation\"></lib-translations> -->\n <!-- child question section -->\n <div class=\"b-1-100 br-4 my-15 px-32 py-10 sb-bg-color-primary-0\"\n *ngFor=\"let question of dependentQuestions;let childindex=index\">\n {{ questionSetHierarchy.children ? 'Q'+ (questionSetHierarchy.children.length+1):''}} {{'. '+\n (childindex+1)}}\n <button\n class=\"sb-btn sb-btn-outline-primary sb-btn-xs sb-left-icon-btn text-inherit b-0 bg-none no-hover pl-0\">\n <span class=\"sb-line-height-24\">edit question</span>\n </button>\n </div>\n <hr>\n <div *ngIf=\"questionFormConfig\">\n <div class=\"pl-5 py-10 font-weight-bold fs-0-92\">\n {{configService.labelConfig?.lbl?.Questiondetails}}\n </div>\n <div class=\"form-container px-30\">\n <sb-dynamic-form [config]=\"leafFormConfig\" (initialize)=\"output($event)\"\n (statusChanges)=\"onStatusChanges($event)\" (valueChanges)=\"valueChanges($event)\"></sb-dynamic-form>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n\n<sui-modal *ngIf=\"showConfirmPopup\" [mustScroll]=\"true\" [isClosable]=\"true\" [transitionDuration]=\"0\" [size]=\"'small'\"\n class=\"sb-modal bx-none overflow-modal\" appBodyScroll (dismissed)=\"showConfirmPopup = !showConfirmPopup\" #modal>\n <div class=\"sb-modal-header\"></div>\n <div class=\"sb-modal-content\">\n {{configService.labelConfig?.lbl?.confirmQuestionNotSaved}}\n </div>\n <div class=\"sb-modal-actions\">\n <button class=\"sb-btn sb-btn-normal sb-btn-primary\" (click)=\"redirectToQuestionset()\">\n {{configService.labelConfig?.button_labels?.yes_btn_label}}\n </button>\n <button class=\"sb-btn sb-btn-normal sb-btn-outline-primary\" (click)=\"showConfirmPopup = !showConfirmPopup\">\n {{configService.labelConfig?.button_labels?.no_btn_label}}\n </button>\n </div>\n</sui-modal>\n\n<lib-term-and-condition\n [showEditingConsent]=\"editorService.isReviewerEditEnable\"\n [showSubmitConfirmPopup]=\"showSubmitConfirmPopup\" (sendForReviewOutput)=\"onConsentSubmit($event)\">\n</lib-term-and-condition>\n\n<sui-modal *ngIf=\"showReviewModal\" [mustScroll]=\"true\" [isClosable]=\"false\" [transitionDuration]=\"0\"\n [size]=\"'normal'\" class=\"sb-modal bx-none overflow-modal\" appBodyScroll #modal (dismissed)=\"showReviewModal = false;\">\n <div class=\"sb-modal-header\">\n {{configService.labelConfig?.lbl?.reviewComments}}\n </div>\n <div class=\"sb-modal-content\">\n <div class=\"sb-field\">\n <label>{{configService.labelConfig?.lbl?.comments}}</label>\n <textarea disabled=\"disabled\" type=\"text\" class=\"wmd-input width-100 sb-form-control p-10 sb-disabled-textarea\" id=\"wmd-input\" [(ngModel)]=\"contentComment\" name=\"rejectedComment\"></textarea>\n </div>\n </div>\n <div class=\"sb-modal-actions\">\n <button class=\"sb-btn sb-btn-normal sb-btn-outline-primary\" (click)=\"modal.deny('denied')\"\n libTelemetryInteract [telemetryInteractEdata]=\"telemetryService.getTelemetryInteractEdata('close','click','cancel', telemetryService.telemetryPageId, {key: 'dialog_id', value: 'review_comments'})\">{{configService.labelConfig?.button_labels?.close_btn_label}}</button>\n </div>\n</sui-modal>\n\n<lib-quality-params-modal\n [labelConfigData]=\"toolbarConfig\"\n [showQualityParameterPopup]=\"showQualityParameterPopup\"\n [qualityFormConfig]=\"qualityFormConfig\"\n (qualityParamChanged)=\"onQualityFormSubmit($event)\">\n</lib-quality-params-modal>\n", styles: [".sb-w-85{width:85%}sui-select{width:100%;border:1px solid rgba(34,36,38,.15);font-size:.8rem;padding:.4rem .2rem;background:#fff}.dropdown.icon{float:right!important}.menu{width:100%}.solution-media__video{width:166px;height:96px}.solution-media__video .overlay-image{width:100%;height:100%;background:#0000004d;position:absolute;left:0;right:0;cursor:pointer;z-index:1}.solution-media__video .overlay-image .play.icon{position:absolute;transform:translate(-50%,-50%);top:50%;left:50%;color:#fff9;font-size:32px;cursor:pointer;height:auto}.solution-media__desc{font-size:12px;font-weight:700;color:#333;max-width:180px;height:96px;display:flex;align-items:flex-end;line-height:normal;line-height:13px}.ckeditor-tool__option,.ckeditor-tool__question{border:1px solid #c4c4c4;border-radius:4px;border-top:0;position:relative;display:flow-root}.ckeditor-tool__solution{border:1px solid #c4c4c4;border-radius:4px;margin-bottom:-4px}.ckeditor-tool__solution .menu .item{font-size:.785rem!important}.solution_video .ckeditor-tool__option{border:0}.ck-rounded-corners .ck.ck-editor__top .ck-sticky-panel .ck-toolbar{border-radius:4px!important}.solution_html .sb-ckeditor .sb-ckeditor-close,.solution_video .sb-ckeditor .sb-ckeditor-close{right:5px;top:-30px;border:0;background:none;min-width:auto;padding:0;color:#999}.sb-ckeditor .sb-ckeditor-close{right:-5px;top:-22px;border:0;background:none;min-width:auto;padding:0;color:#999}.sb-mcq-form .sb-mcq-item:nth-child(4) .sb-ckeditor .ckeditor-tool__option{margin-bottom:0!important}.two-column-grid{display:grid;grid-template-columns:repeat(2,1fr);column-gap:.5rem;border-bottom:solid 1px var(--gray-100)}.two-column-grid:last-child{border-bottom:none}.dynamic-form .sb-search-input::-webkit-input-placeholder{padding-left:1.4rem!important}.dynamic-form .required label:after,.sb-editor-container .dynamic-form .required .multi-select-container .list-border ul:after,.sb-editor-container .dynamic-form .multi-select-container .list-border .required ul:after{content:\"*\";margin:-.2em 0 0 .2em;color:#db2828}.list-border{height:inherit!important}.list-border ul{padding:0!important}.list-border ul span{font-weight:500!important;font-size:.785rem}.sb-editor-container{position:relative;z-index:999!important}.sb-editor-container .sb-input:first-child{margin:1rem 0!important}.sb-editor-container .sb-container{width:95%!important}.sb-editor-container .dynamic-form .sb-dropdown-select{padding:11px 8px!important}.sb-editor-container .dynamic-form label,.sb-editor-container .dynamic-form .multi-select-container .list-border ul{font-size:12px!important;margin-bottom:.5rem!important;color:#121213e0;font-weight:600}.sb-editor-container .dynamic-form .sb-textbox,.sb-editor-container .dynamic-form .topic-picker-selector,.sb-editor-container .dynamic-form select,.sb-editor-container .dynamic-form .sb-textarea,.sb-editor-container .dynamic-form .list-border{border:1px solid rgba(34,36,38,.15)!important;padding:12px 8px!important;border-radius:.28571429rem;font-size:.785rem!important;font-weight:500}.sb-editor-container .dynamic-form .multi-select-container .list-border ul{color:#333;padding:0;margin:0!important;opacity:1!important;font-weight:500!important}.sb-editor-container .dynamic-form .sb-modal-dropdown-web ul{color:#333;padding:0;margin:0!important;opacity:1!important;font-size:12px!important;font-weight:500;border:2px solid #eeeeef}.sb-editor-container .dynamic-form .sb-keywordbox{border:1px solid rgba(34,36,38,.15)!important;padding:.45rem .5rem!important;border-radius:.28571429rem;font-size:.785rem!important;font-weight:500;padding:0!important}.sb-editor-container .dynamic-form .sb-keywordbox .ng2-tag-input{padding:0}.sb-editor-container .dynamic-form .sb-keywordbox .ng2-tag-input tag{margin-left:.5rem}.sb-editor-container .dynamic-form .sb-keywordbox .ng2-tags-container{margin-top:.2rem}.sb-editor-container .dynamic-form .sb-keywordbox .tag-wrapper,.sb-editor-container .dynamic-form .sb-keywordbox delete-icon svg{height:24px;line-height:24px}.sb-editor-container .dynamic-form .sb-dropdown label,.sb-editor-container .dynamic-form .sb-dropdown .multi-select-container .list-border ul,.sb-editor-container .dynamic-form .multi-select-container .list-border .sb-dropdown ul{padding:0}.sb-editor-container .dynamic-form .sb-textarea-container .sb-textarea{height:2.9rem;padding-top:.5rem!important}.sb-editor-container .dynamic-form .sb-textarea-container label,.sb-editor-container .dynamic-form .sb-textarea-container .multi-select-container .list-border ul,.sb-editor-container .dynamic-form .multi-select-container .list-border .sb-textarea-container ul{padding:0}.sb-editor-container .dynamic-form .sb-checkbox{padding:0;margin-top:0}.sb-editor-container .dynamic-form sb-icon-dropdown{top:10px!important;right:6px!important}.sb-editor-container .sb-textarea-container,.sb-editor-container .sb-dropdown{margin:1rem 0!important}lib-chat-window,.chat_bot{display:none!important}.h-100{height:100%!important}.sb-required{color:#ff4558;padding-left:2px;position:relative;top:-5px}select[disabled]{opacity:.8!important;font-weight:500!important}.multiselect{position:relative;top:-7px;height:48px;left:7px;font-size:14px;font-weight:400}.treepicker-parent .list-border{height:38px!important;padding:1rem!important;margin-top:15px!important}.options{justify-content:flex-end;margin-right:10px;display:flex;gap:10px}\n"], dependencies: [{ kind: "directive", type: i11.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i11.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i11.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i11.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i12.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i12.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i12.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i13.SuiDropdown, selector: "[suiDropdown]", inputs: ["isOpen", "isDisabled", "tabindex", "autoClose"], outputs: ["isOpenChange"] }, { kind: "directive", type: i13.SuiDropdownMenu, selector: "[suiDropdownMenu]", inputs: ["menuTransition", "menuTransitionDuration", "menuAutoSelectFirst", "menuSelectedItemClass"] }, { kind: "directive", type: i13.SuiDropdownMenuItem, selector: ".item" }, { kind: "component", type: i13.SuiModal, selector: "sui-modal", inputs: ["isClosable", "closeResult", "size", "isCentered", "isFullScreen", "isBasic", "mustScroll", "isInverted", "transition", "transitionDuration"], outputs: ["approved", "denied", "dismissed"] }, { kind: "component", type: i13.SuiSelect, selector: "sui-select", inputs: ["placeholder"], outputs: ["selectedOptionChange"] }, { kind: "component", type: i13.SuiSelectOption, selector: "sui-select-option", inputs: ["value"], outputs: ["onSelected"] }, { kind: "directive", type: i13.SuiSelectValueAccessor, selector: "sui-select" }, { kind: "component", type: i13.SuiMultiSelect, selector: "sui-multi-select", inputs: ["hasLabels", "placeholder", "maxSelected", "zeroSelectionText", "defaultSelectionText"], outputs: ["selectedOptionsChange"] }, { kind: "directive", type: i13.SuiMultiSelectValueAccessor, selector: "sui-multi-select" }, { kind: "component", type: i14.DynamicFormComponent, selector: "sb-dynamic-form", inputs: ["config", "dataLoadStatusDelegate"], outputs: ["initialize", "finalize", "valueChanges", "statusChanges"] }, { kind: "component", type: i15.HeaderComponent, selector: "lib-header", inputs: ["pageId", "labelConfigData", "buttonLoaders", "showComment", "publishchecklist", "requestChange"], outputs: ["toolbarEmitter", "qualityParamEmitter"] }, { kind: "component", type: i16.OptionsComponent, selector: "lib-options", inputs: ["editorState", "showFormError", "sourcingSettings", "isReadOnlyMode", "showSubMenu", "parentMeta"], outputs: ["editorDataOutput"] }, { kind: "component", type: i17.AnswerComponent, selector: "lib-answer", inputs: ["editorState", "showFormError"], outputs: ["editorDataOutput"] }, { kind: "component", type: i18.CkeditorToolComponent, selector: "lib-ckeditor-tool", inputs: ["editorDataInput", "videoShow", "setCharacterLimit", "setImageLimit"], outputs: ["editorDataOutput", "hasError", "videoDataOutput"] }, { kind: "directive", type: i19.TelemetryInteractDirective, selector: "[libTelemetryInteract]", inputs: ["telemetryInteractEdata"] }, { kind: "component", type: i20.QumlPlayerComponent, selector: "lib-quml-player", inputs: ["questionSetHierarchy", "isSingleQuestionPreview"], outputs: ["toolbarEmitter"] }, { kind: "component", type: i21.TermAndConditionComponent, selector: "lib-term-and-condition", inputs: ["showEditingConsent", "showSubmitConfirmPopup"], outputs: ["sendForReviewOutput"] }, { kind: "component", type: i22.QualityParamsModalComponent, selector: "lib-quality-params-modal", inputs: ["qualityFormConfig", "showQualityParameterPopup", "labelConfigData"], outputs: ["qualityParamChanged"] }], encapsulation: i0.ViewEncapsulation.None }); }
1454
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: QuestionComponent, selector: "lib-question", inputs: { questionInput: "questionInput", leafFormConfig: "leafFormConfig", sourcingSettings: "sourcingSettings" }, outputs: { questionEmitter: "questionEmitter" }, ngImport: i0, template: "<div *ngIf='showLoader' class=\"ui container\">\n <app-loader></app-loader>\n</div>\n<div class=\"sb-editor-container mb-0\" *ngIf=\"!showLoader\">\n <lib-header [labelConfigData]=\"toolbarConfig\" [buttonLoaders]=\"buttonLoaders\" [pageId]=\"pageId\" [requestChange] = \"requestChangesPopupAction\" (toolbarEmitter)=\"toolbarEventListener($event)\">\n </lib-header>\n\n <div class=\"sb-bg-white py-20\">\n <div class=\"ui container sb-container\">\n <div class=\"ui twelve column wide h-100\">\n <div class=\"px-16\">\n <div *ngIf=\"showPreview\" class=\"br-2 b-1-100\">\n <lib-quml-player [questionSetHierarchy]=\"questionSetHierarchy\" [isSingleQuestionPreview]=\"true\"></lib-quml-player>\n </div>\n <div style=\"display: flex;align-items: flex-end;justify-content: flex-end;\"\n *ngIf=\"showOptions || isChildQuestion \">\n <div class=\"options\">\n <sui-select [(ngModel)]=\"condition\" valueField=\"value\" class=\"selection multiselect\"\n labelField=\"label\" [placeholder]=\"'Select Condition'\" #select [isDisabled]=\"isReadOnlyMode\">\n <sui-select-option [value]=\"{label:'Equal to',value:'eq'}\"></sui-select-option>\n <sui-select-option [value]=\"{label:'Not equal',value:'ne'}\"></sui-select-option>\n </sui-select>\n\n <sui-multi-select class=\"selection multiselect\" [(ngModel)]=\"selectedOptions\" valueField=\"value\"\n labelField=\"label\" [isSearchable]=\"false\" #multiSelect [placeholder]=\"'Select options'\" [isDisabled]=\"isReadOnlyMode\" >\n <sui-select-option *ngFor=\"let option of options\" [value]=\"option\">\n </sui-select-option>\n </sui-multi-select>\n </div>\n </div>\n <div class=\"py-20 px-32 br-4 b-1-100\" *ngIf=\"!showPreview\" [ngClass]=\"{'sb-bg-color-primary-0': !isReadOnlyMode}\">\n <div class=\"sb-field-group\">\n <label *ngIf=\"!isReadOnlyMode\" class=\"fs-0-92 font-weight-bold\">{{configService.labelConfig?.lbl?.question}}<span class=\"sb-required\">*</span></label>\n <div class=\"sb-field\">\n <div [ngClass]=\"{'ckeditor-tool__question': !isReadOnlyMode, 'ckeditor-tool__question-readonly': isReadOnlyMode, 'mb-5': true}\">\n <lib-ckeditor-tool\n *ngIf=\"!isReadOnlyMode\"\n (editorDataOutput)=\"editorDataHandler($event, 'question')\"\n [editorDataInput]=\"editorState.question\"\n (videoDataOutput)=\"videoDataOutput($event)\" [videoShow]=\"videoShow\"></lib-ckeditor-tool>\n <ng-container *ngIf=\"isReadOnlyMode\">\n <label class=\"px-16 py-8 fs-0-92 mb-0 ckeditor-tool__label width-100\">{{configService.labelConfig?.lbl?.question}}</label>\n <div class=\"ckeditor-tool__solution__body\">\n <p class=\"fs-0-785 p-16\" [innerHTML]=\"editorState.question | sanitizeHtml\"></p>\n </div>\n </ng-container>\n </div>\n <label *ngIf=\"\n showFormError &&\n [undefined, ''].includes(editorState.question)\n \" class=\"sb-color-error fs-0-785\">{{configService.labelConfig?.lbl?.questionRequired}}</label>\n </div>\n <lib-question-option-sub-menu *ngIf=\"subMenus?.length\" [subMenus]=\"subMenus\"\n (onChange)=\"subMenuChange($event)\"></lib-question-option-sub-menu>\n\n <lib-answer *ngIf=\"questionInteractionType === 'default'\"\n [editorState]=\"editorState\" [showFormError]=\"showFormError\"\n (editorDataOutput)=\"editorDataHandler($event)\" [isReadOnlyMode]=\"isReadOnlyMode\"></lib-answer>\n\n <lib-options *ngIf=\"questionInteractionType === 'choice'\"\n [questionPrimaryCategory]=\"questionPrimaryCategory\"\n [editorState]=\"editorState\" [showFormError]=\"showFormError\"\n (editorDataOutput)=\"editorDataHandler($event)\"\n [sourcingSettings]=\"sourcingSettings\" [mapping]=\"scoreMapping\"\n [isReadOnlyMode]=\"isReadOnlyMode\"></lib-options>\n\n <lib-slider *ngIf=\"questionInteractionType === 'slider'\" [editorDataInput]=\"sliderOptions\"\n (onChange)=\"sliderData($event)\"></lib-slider>\n\n <ng-container *ngIf=\"!isReadOnlyMode; else readOnlySolutionsContainer\">\n <div *ngIf=\"sourcingSettings?.showSolution !== false\" class=\"d-flex flex-ai-center ckeditor-tool__solution py-10 px-16 mt-15 sb-bg-color-white\">\n <label class=\"fs-0-92 mb-0 ckeditor-tool__label pb-4\">\n <span class=\"sb-color-primary fs-0-785 mr-4\">{{configService.labelConfig?.lbl?.solution}}</span>\n <span class=\"sb-color-gray-200 fxsmall font-weight-normal\">{{configService.labelConfig?.lbl?.optional}}</span>\n </label>\n <div\n class=\"ui dropdown sb-btn sb-btn-outline-primary sb-btn-normal sb-right-icon-btn sb-btn-radius ml-auto\"\n suiDropdown autoClose=\"itemClick\" *ngIf=\"showSolutionDropDown\" libTelemetryInteract\n [telemetryInteractEdata]=\"telemetryService.getTelemetryInteractEdata('choose_type','click','single_select', telemetryService.telemetryPageId)\">\n <div class=\"text gray-200\">{{configService.labelConfig?.lbl?.chooseType}}</div>\n <i class=\"dropdown icon mx-8\"></i>\n <div class=\"menu\" suiDropdownMenu>\n <div class=\"item\" (click)=\"selectSolutionType('Text+Image')\" (keydown.enter)=\"selectSolutionType('Text+Image')\" tabindex=\"0\" libTelemetryInteract\n [telemetryInteractEdata]=\"telemetryService.getTelemetryInteractEdata('solution_type','select','single_select', telemetryService.telemetryPageId, {solution_type:'Text+Image'})\">\n {{configService.labelConfig?.lbl?.textImage}}\n </div>\n <div class=\"item\" (click)=\"selectSolutionType('video')\" (keydown.enter)=\"selectSolutionType('video')\" tabindex=\"0\" libTelemetryInteract\n [telemetryInteractEdata]=\"telemetryService.getTelemetryInteractEdata('solution_type','select','single_select', telemetryService.telemetryPageId, {solution_type:'video'})\">\n {{configService.labelConfig?.lbl?.video}}\n </div>\n </div>\n </div>\n </div>\n <div class=\"solution_html\" *ngIf=\"selectedSolutionType == 'html'\">\n <div class=\"ckeditor-tool-container\">\n <div class=\"sb-ckeditor relative mb-8\">\n <button (click)=\"deleteSolution()\" class=\"sb-btn sb-ckeditor-close absolute\" libTelemetryInteract\n [telemetryInteractEdata]=\"telemetryService.getTelemetryInteractEdata('delete_solution','click','cancel', telemetryService.telemetryPageId, {solution_type:'Text+Image'})\">\n <i class=\"icon close\"></i>\n </button>\n <lib-ckeditor-tool (editorDataOutput)=\"\n editorDataHandler($event, 'solution')\n \"[editorDataInput]=\"editorState.solutions\"\n class=\"ckeditor-tool__option\"></lib-ckeditor-tool>\n </div>\n </div>\n </div>\n <div class=\"solution_video\" *ngIf=\"selectedSolutionType == 'video' && showSolution\">\n <div class=\"ckeditor-tool__solution sb-bg-color-white sb-ckeditor relative\">\n <div class=\"solution-media p-16 d-flex flex-ai-center ckeditor-tool__option p-16\">\n <div class=\"mcq-checkbox-answer\">\n <button class=\"sb-btn sb-ckeditor-close absolute\" (click)=\"deleteSolution()\"\n libTelemetryInteract\n [telemetryInteractEdata]=\"telemetryService.getTelemetryInteractEdata('delete_solution','click','cancel', this.telemetryService.telemetryPageId, {solution_type:'video'})\">\n <i class=\"icon close\"></i>\n </button>\n </div>\n <div class=\"solution-media__video relative position\">\n <div class=\"overlay-image\" [ngStyle]=\"\n videoThumbnail\n ? { background: 'url(' + videoThumbnail + ')' }\n : { background: 'rgba(0,0,0,0.3)' }\n \">\n <i class=\"play circle icon\"></i>\n </div>\n </div>\n <div class=\"solution-media__desc ml-16 sb-color-primary\">\n {{ videoSolutionName\n }}\n <!-- <i class=\"icon ellipsis vertical sb-color-black\"></i> -->\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n <ng-template #readOnlySolutionsContainer>\n <div class=\"row\" *ngIf=\"editorState.solutions\">\n <div class=\"twelve wide column p-0\">\n <div class=\"ckeditor-tool width-100\">\n <div class=\"ckeditor-tool__question-readonly mb-24\">\n <label class=\"px-16 py-8 fs-0-92 mb-0 ckeditor-tool__label width-100\">Solution</label>\n <div class=\"ckeditor-tool__solution__body\" *ngIf=\"selectedSolutionType == 'html'\">\n <p class=\"fs-0-785 p-16\" [innerHTML]=\"editorState.solutions | sanitizeHtml\"></p>\n </div>\n <div class=\"ckeditor-tool__solution__body\" *ngIf=\"selectedSolutionType == 'video' && showSolution\">\n <div class=\"solution-media p-16 d-flex flex-ai-center\">\n <div class=\"solution-media__video relative position\">\n <div class=\"overlay-image\" [ngStyle]=\"videoThumbnail ? {'background' : 'url(' + videoThumbnail + ')' } : {'background': 'rgba(0,0,0,0.3)'}\"><i class=\"play circle icon\"></i></div>\n </div>\n <div class=\"solution-media__desc ml-16\">\n {{videoSolutionName}}\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </ng-template>\n </div>\n </div>\n <!-- <lib-translations *ngIf=\"showTranslation\"></lib-translations> -->\n <!-- child question section -->\n <div class=\"b-1-100 br-4 my-15 px-32 py-10 sb-bg-color-primary-0\"\n *ngFor=\"let question of dependentQuestions;let childindex=index\">\n {{ questionSetHierarchy.children ? 'Q'+ (questionSetHierarchy.children.length+1):''}} {{'. '+\n (childindex+1)}}\n <button\n class=\"sb-btn sb-btn-outline-primary sb-btn-xs sb-left-icon-btn text-inherit b-0 bg-none no-hover pl-0\">\n <span class=\"sb-line-height-24\">edit question</span>\n </button>\n </div>\n <hr>\n <div *ngIf=\"questionFormConfig\">\n <div class=\"pl-5 py-10 font-weight-bold fs-0-92\">\n {{configService.labelConfig?.lbl?.Questiondetails}}\n </div>\n <div class=\"form-container px-30\">\n <sb-dynamic-form [config]=\"questionFormConfig\" (initialize)=\"output($event)\"\n (statusChanges)=\"onStatusChanges($event)\" (valueChanges)=\"valueChanges($event)\"></sb-dynamic-form>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n\n<sui-modal *ngIf=\"showConfirmPopup\" [mustScroll]=\"true\" [isClosable]=\"true\" [transitionDuration]=\"0\" [size]=\"'small'\"\n class=\"sb-modal bx-none overflow-modal\" appBodyScroll (dismissed)=\"showConfirmPopup = !showConfirmPopup\" #modal>\n <div class=\"sb-modal-header\"></div>\n <div class=\"sb-modal-content\">\n {{configService.labelConfig?.lbl?.confirmQuestionNotSaved}}\n </div>\n <div class=\"sb-modal-actions\">\n <button class=\"sb-btn sb-btn-normal sb-btn-primary\" (click)=\"redirectToQuestionset()\">\n {{configService.labelConfig?.button_labels?.yes_btn_label}}\n </button>\n <button class=\"sb-btn sb-btn-normal sb-btn-outline-primary\" (click)=\"showConfirmPopup = !showConfirmPopup\">\n {{configService.labelConfig?.button_labels?.no_btn_label}}\n </button>\n </div>\n</sui-modal>\n\n<lib-term-and-condition\n [showEditingConsent]=\"editorService.isReviewerEditEnable\"\n [showSubmitConfirmPopup]=\"showSubmitConfirmPopup\" (sendForReviewOutput)=\"onConsentSubmit($event)\">\n</lib-term-and-condition>\n\n<sui-modal *ngIf=\"showReviewModal\" [mustScroll]=\"true\" [isClosable]=\"false\" [transitionDuration]=\"0\"\n [size]=\"'normal'\" class=\"sb-modal bx-none overflow-modal\" appBodyScroll #modal (dismissed)=\"showReviewModal = false;\">\n <div class=\"sb-modal-header\">\n {{configService.labelConfig?.lbl?.reviewComments}}\n </div>\n <div class=\"sb-modal-content\">\n <div class=\"sb-field\">\n <label>{{configService.labelConfig?.lbl?.comments}}</label>\n <textarea disabled=\"disabled\" type=\"text\" class=\"wmd-input width-100 sb-form-control p-10 sb-disabled-textarea\" id=\"wmd-input\" [(ngModel)]=\"contentComment\" name=\"rejectedComment\"></textarea>\n </div>\n </div>\n <div class=\"sb-modal-actions\">\n <button class=\"sb-btn sb-btn-normal sb-btn-outline-primary\" (click)=\"modal.deny('denied')\"\n libTelemetryInteract [telemetryInteractEdata]=\"telemetryService.getTelemetryInteractEdata('close','click','cancel', telemetryService.telemetryPageId, {key: 'dialog_id', value: 'review_comments'})\">{{configService.labelConfig?.button_labels?.close_btn_label}}</button>\n </div>\n</sui-modal>\n\n<lib-quality-params-modal\n [labelConfigData]=\"toolbarConfig\"\n [showQualityParameterPopup]=\"showQualityParameterPopup\"\n [qualityFormConfig]=\"qualityFormConfig\"\n (qualityParamChanged)=\"onQualityFormSubmit($event)\">\n</lib-quality-params-modal>\n", styles: [".sb-w-85{width:85%}sui-select{width:100%;border:1px solid rgba(34,36,38,.15);font-size:.8rem;padding:.4rem .2rem;background:#fff}.dropdown.icon{float:right!important}.menu{width:100%}.solution-media__video{width:166px;height:96px}.solution-media__video .overlay-image{width:100%;height:100%;background:#0000004d;position:absolute;left:0;right:0;cursor:pointer;z-index:1}.solution-media__video .overlay-image .play.icon{position:absolute;transform:translate(-50%,-50%);top:50%;left:50%;color:#fff9;font-size:32px;cursor:pointer;height:auto}.solution-media__desc{font-size:12px;font-weight:700;color:#333;max-width:180px;height:96px;display:flex;align-items:flex-end;line-height:normal;line-height:13px}.ckeditor-tool__option,.ckeditor-tool__question{border:1px solid #c4c4c4;border-radius:4px;border-top:0;position:relative;display:flow-root}.ckeditor-tool__solution,.ckeditor-tool__question-readonly,.ckeditor-tool__option-readonly{border:1px solid #c4c4c4;border-radius:4px;margin-bottom:-4px}.ckeditor-tool__label{background-color:#f3f8ff;color:var(--primary-color)!important;font-weight:600;border-top-left-radius:4px;border-top-right-radius:4px}.mcq-checkbox-answer{background:#f2f2f2;padding:8px;display:flex;justify-content:center;align-items:center;border-bottom-left-radius:4px;border-bottom-right-radius:4px}.ckeditor-tool__solution .menu .item{font-size:.785rem!important}.solution_video .ckeditor-tool__option{border:0}.ck-rounded-corners .ck.ck-editor__top .ck-sticky-panel .ck-toolbar{border-radius:4px!important}.solution_html .sb-ckeditor .sb-ckeditor-close,.solution_video .sb-ckeditor .sb-ckeditor-close{right:5px;top:-30px;border:0;background:none;min-width:auto;padding:0;color:#999}.sb-ckeditor .sb-ckeditor-close{right:-5px;top:-22px;border:0;background:none;min-width:auto;padding:0;color:#999}.sb-mcq-form .sb-mcq-item:nth-child(4) .sb-ckeditor .ckeditor-tool__option{margin-bottom:0!important}.two-column-grid{display:grid;grid-template-columns:repeat(2,1fr);column-gap:.5rem;border-bottom:solid 1px var(--gray-100)}.two-column-grid:last-child{border-bottom:none}.dynamic-form .sb-search-input::-webkit-input-placeholder{padding-left:1.4rem!important}.dynamic-form .required label:after,.sb-editor-container .dynamic-form .required .multi-select-container .list-border ul:after,.sb-editor-container .dynamic-form .multi-select-container .list-border .required ul:after{content:\"*\";margin:-.2em 0 0 .2em;color:#db2828}.list-border{height:inherit!important}.list-border ul{padding:0!important}.list-border ul span{font-weight:500!important;font-size:.785rem}.sb-editor-container{position:relative;z-index:998!important}.sb-editor-container .sb-input:first-child{margin:1rem 0!important}.sb-editor-container .sb-container{width:95%!important}.sb-editor-container .dynamic-form .sb-dropdown-select{padding:11px 8px!important}.sb-editor-container .dynamic-form label,.sb-editor-container .dynamic-form .multi-select-container .list-border ul{font-size:12px!important;margin-bottom:.5rem!important;color:#121213e0;font-weight:600}.sb-editor-container .dynamic-form .sb-textbox,.sb-editor-container .dynamic-form .topic-picker-selector,.sb-editor-container .dynamic-form select,.sb-editor-container .dynamic-form .sb-textarea,.sb-editor-container .dynamic-form .list-border{border:1px solid rgba(34,36,38,.15)!important;padding:12px 8px!important;border-radius:.28571429rem;font-size:.785rem!important;font-weight:500}.sb-editor-container .dynamic-form .multi-select-container .list-border ul{color:#333;padding:0;margin:0!important;opacity:1!important;font-weight:500!important}.sb-editor-container .dynamic-form .sb-modal-dropdown-web ul{color:#333;padding:0;margin:0!important;opacity:1!important;font-size:12px!important;font-weight:500;border:2px solid #eeeeef}.sb-editor-container .dynamic-form .sb-keywordbox{border:1px solid rgba(34,36,38,.15)!important;padding:.45rem .5rem!important;border-radius:.28571429rem;font-size:.785rem!important;font-weight:500;padding:0!important}.sb-editor-container .dynamic-form .sb-keywordbox .ng2-tag-input{padding:0}.sb-editor-container .dynamic-form .sb-keywordbox .ng2-tag-input tag{margin-left:.5rem}.sb-editor-container .dynamic-form .sb-keywordbox .ng2-tags-container{margin-top:.2rem}.sb-editor-container .dynamic-form .sb-keywordbox .tag-wrapper,.sb-editor-container .dynamic-form .sb-keywordbox delete-icon svg{height:24px;line-height:24px}.sb-editor-container .dynamic-form .sb-dropdown label,.sb-editor-container .dynamic-form .sb-dropdown .multi-select-container .list-border ul,.sb-editor-container .dynamic-form .multi-select-container .list-border .sb-dropdown ul{padding:0}.sb-editor-container .dynamic-form .sb-textarea-container .sb-textarea{height:2.9rem;padding-top:.5rem!important}.sb-editor-container .dynamic-form .sb-textarea-container label,.sb-editor-container .dynamic-form .sb-textarea-container .multi-select-container .list-border ul,.sb-editor-container .dynamic-form .multi-select-container .list-border .sb-textarea-container ul{padding:0}.sb-editor-container .dynamic-form .sb-checkbox{padding:0;margin-top:0}.sb-editor-container .dynamic-form sb-icon-dropdown{top:10px!important;right:6px!important}.sb-editor-container .sb-textarea-container,.sb-editor-container .sb-dropdown{margin:1rem 0!important}lib-chat-window,.chat_bot{display:none!important}.h-100{height:100%!important}.sb-required{color:#ff4558;padding-left:2px;position:relative;top:-5px}select[disabled]{opacity:.8!important;font-weight:500!important}.multiselect{position:relative;top:-7px;height:48px;left:7px;font-size:14px;font-weight:400}.treepicker-parent .list-border{height:38px!important;padding:1rem!important;margin-top:15px!important}.options{justify-content:flex-end;margin-right:10px;display:flex;gap:10px}\n"], dependencies: [{ kind: "directive", type: i11.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i11.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i11.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i11.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i12.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i12.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i12.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i13.SuiDropdown, selector: "[suiDropdown]", inputs: ["isOpen", "isDisabled", "tabindex", "autoClose"], outputs: ["isOpenChange"] }, { kind: "directive", type: i13.SuiDropdownMenu, selector: "[suiDropdownMenu]", inputs: ["menuTransition", "menuTransitionDuration", "menuAutoSelectFirst", "menuSelectedItemClass"] }, { kind: "directive", type: i13.SuiDropdownMenuItem, selector: ".item" }, { kind: "component", type: i13.SuiModal, selector: "sui-modal", inputs: ["isClosable", "closeResult", "size", "isCentered", "isFullScreen", "isBasic", "mustScroll", "isInverted", "transition", "transitionDuration"], outputs: ["approved", "denied", "dismissed"] }, { kind: "component", type: i13.SuiSelect, selector: "sui-select", inputs: ["placeholder"], outputs: ["selectedOptionChange"] }, { kind: "component", type: i13.SuiSelectOption, selector: "sui-select-option", inputs: ["value"], outputs: ["onSelected"] }, { kind: "directive", type: i13.SuiSelectValueAccessor, selector: "sui-select" }, { kind: "component", type: i13.SuiMultiSelect, selector: "sui-multi-select", inputs: ["hasLabels", "placeholder", "maxSelected", "zeroSelectionText", "defaultSelectionText"], outputs: ["selectedOptionsChange"] }, { kind: "directive", type: i13.SuiMultiSelectValueAccessor, selector: "sui-multi-select" }, { kind: "component", type: i14.DynamicFormComponent, selector: "sb-dynamic-form", inputs: ["config", "dataLoadStatusDelegate"], outputs: ["initialize", "finalize", "valueChanges", "statusChanges"] }, { kind: "component", type: i15.HeaderComponent, selector: "lib-header", inputs: ["pageId", "labelConfigData", "buttonLoaders", "showComment", "publishchecklist", "requestChange"], outputs: ["toolbarEmitter", "bulkUploadEmitter", "qualityParamEmitter"] }, { kind: "component", type: i16.OptionsComponent, selector: "lib-options", inputs: ["editorState", "showFormError", "sourcingSettings", "questionPrimaryCategory", "mapping", "isReadOnlyMode"], outputs: ["editorDataOutput"] }, { kind: "component", type: i17.AnswerComponent, selector: "lib-answer", inputs: ["editorState", "showFormError", "isReadOnlyMode"], outputs: ["editorDataOutput"] }, { kind: "component", type: i18.CkeditorToolComponent, selector: "lib-ckeditor-tool", inputs: ["editorDataInput", "videoShow", "setCharacterLimit", "setImageLimit"], outputs: ["editorDataOutput", "hasError", "videoDataOutput"] }, { kind: "directive", type: i19.TelemetryInteractDirective, selector: "[libTelemetryInteract]", inputs: ["telemetryInteractEdata"] }, { kind: "component", type: i20.QumlPlayerComponent, selector: "lib-quml-player", inputs: ["questionSetHierarchy", "isSingleQuestionPreview"], outputs: ["toolbarEmitter"] }, { kind: "component", type: i21.QuestionOptionSubMenuComponent, selector: "lib-question-option-sub-menu", inputs: ["subMenus"], outputs: ["onChange"] }, { kind: "component", type: i22.SliderComponent, selector: "lib-slider", inputs: ["editorDataInput"], outputs: ["onChange"] }, { kind: "component", type: i23.AppLoaderComponent, selector: "app-loader", inputs: ["data"] }, { kind: "component", type: i24.TermAndConditionComponent, selector: "lib-term-and-condition", inputs: ["showEditingConsent", "showSubmitConfirmPopup"], outputs: ["sendForReviewOutput"] }, { kind: "component", type: i25.QualityParamsModalComponent, selector: "lib-quality-params-modal", inputs: ["qualityFormConfig", "showQualityParameterPopup", "labelConfigData"], outputs: ["qualityParamChanged"] }, { kind: "pipe", type: i26.SanitizeHtmlPipe, name: "sanitizeHtml" }], encapsulation: i0.ViewEncapsulation.None }); }
1349
1455
  }
1350
1456
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: QuestionComponent, decorators: [{
1351
1457
  type: Component,
1352
- args: [{ selector: 'lib-question', encapsulation: ViewEncapsulation.None, template: "<div class=\"sb-editor-container mb-0\" *ngIf=\"!showLoader\">\n <lib-header [labelConfigData]=\"toolbarConfig\" [buttonLoaders]=\"buttonLoaders\" [pageId]=\"pageId\" [requestChange] = \"requestChangesPopupAction\" (toolbarEmitter)=\"toolbarEventListener($event)\">\n </lib-header>\n\n <div class=\"sb-bg-white py-20\">\n <div class=\"ui container sb-container\">\n <div class=\"ui twelve column wide h-100\">\n <div class=\"px-16\">\n <div *ngIf=\"showPreview\" class=\"br-2 b-1-100\">\n <lib-quml-player [questionSetHierarchy]=\"questionSetHierarchy\" [isSingleQuestionPreview]=\"true\" ></lib-quml-player>\n </div>\n <div style=\"display: flex;align-items: flex-end;justify-content: flex-end;\"\n *ngIf=\"showOptions || isChildQuestion \">\n <div class=\"options\">\n <sui-select [(ngModel)]=\"condition\" valueField=\"value\" class=\"selection multiselect\"\n labelField=\"label\" [placeholder]=\"'Select Condition'\" #select [isDisabled]=\"isReadOnlyMode\">\n <sui-select-option [value]=\"{label:'Equal to',value:'eq'}\"></sui-select-option>\n <sui-select-option [value]=\"{label:'Not equal',value:'ne'}\"></sui-select-option>\n </sui-select>\n\n <sui-multi-select class=\"selection multiselect\" [(ngModel)]=\"selectedOptions\" valueField=\"value\"\n labelField=\"label\" [isSearchable]=\"false\" #multiSelect [placeholder]=\"'Select options'\" [isDisabled]=\"isReadOnlyMode\" >\n <sui-select-option *ngFor=\"let option of options\" [value]=\"option\">\n </sui-select-option>\n </sui-multi-select>\n </div>\n </div>\n <div class=\"py-20 px-32 br-4 b-1-100\" *ngIf=\"!showPreview\" [ngClass]=\"{'sb-bg-color-primary-0': !isReadOnlyMode}\">\n <div class=\"sb-field-group\">\n <label class=\"fs-0-92 font-weight-bold\">{{configService.labelConfig?.lbl?.question}}<span class=\"sb-required\">*</span></label>\n <div class=\"sb-field\">\n <div class=\"ckeditor-tool__question mb-5\">\n <lib-ckeditor-tool\n (editorDataOutput)=\"editorDataHandler($event, 'question')\"\n [editorDataInput]=\"editorState.question\"\n (videoDataOutput)=\"videoDataOutput($event)\" [videoShow]=\"videoShow\"></lib-ckeditor-tool>\n </div>\n <label *ngIf=\"\n showFormError &&\n [undefined, ''].includes(editorState.question)\n \" class=\"sb-color-error fs-0-785\">{{configService.labelConfig?.lbl?.questionRequired}}</label>\n </div>\n\n <lib-answer *ngIf=\"questionInteractionType === 'default'\"\n [editorState]=\"editorState\" [showFormError]=\"showFormError\"\n (editorDataOutput)=\"editorDataHandler($event)\"></lib-answer>\n\n <lib-options *ngIf=\"questionInteractionType === 'choice'\"\n [editorState]=\"editorState\" [showFormError]=\"showFormError\"\n (editorDataOutput)=\"editorDataHandler($event)\"></lib-options>\n\n <div class=\"d-flex flex-ai-center ckeditor-tool__solution py-10 px-16 mt-15 sb-bg-color-white\">\n <label class=\"fs-0-92 mb-0 ckeditor-tool__label pb-4\">\n <span class=\"sb-color-primary fs-0-785 mr-4\">{{configService.labelConfig?.lbl?.solution}}</span>\n <span class=\"sb-color-gray-200 fxsmall font-weight-normal\">{{configService.labelConfig?.lbl?.optional}}</span>\n </label>\n <div\n class=\"ui dropdown sb-btn sb-btn-outline-primary sb-btn-normal sb-right-icon-btn sb-btn-radius ml-auto\"\n suiDropdown autoClose=\"itemClick\" *ngIf=\"showSolutionDropDown\" libTelemetryInteract\n [telemetryInteractEdata]=\"telemetryService.getTelemetryInteractEdata('choose_type','click','single_select', telemetryService.telemetryPageId)\">\n <div class=\"text gray-200\">{{configService.labelConfig?.lbl?.chooseType}}</div>\n <i class=\"dropdown icon mx-8\"></i>\n <div class=\"menu\" suiDropdownMenu>\n <div class=\"item\" (click)=\"selectSolutionType('Text+Image')\" libTelemetryInteract\n [telemetryInteractEdata]=\"telemetryService.getTelemetryInteractEdata('solution_type','select','single_select', telemetryService.telemetryPageId, {solution_type:'Text+Image'})\">\n {{configService.labelConfig?.lbl?.textImage}}\n </div>\n <div class=\"item\" (click)=\"selectSolutionType('video')\" libTelemetryInteract\n [telemetryInteractEdata]=\"telemetryService.getTelemetryInteractEdata('solution_type','select','single_select', telemetryService.telemetryPageId, {solution_type:'video'})\">\n {{configService.labelConfig?.lbl?.video}}\n </div>\n </div>\n </div>\n </div>\n <div class=\"solution_html\" *ngIf=\"selectedSolutionType == 'html'\">\n <div class=\"ckeditor-tool-container\">\n <div class=\"sb-ckeditor relative mb-8\">\n <button (click)=\"deleteSolution()\" class=\"sb-btn sb-ckeditor-close absolute\" libTelemetryInteract\n [telemetryInteractEdata]=\"telemetryService.getTelemetryInteractEdata('delete_solution','click','cancel', telemetryService.telemetryPageId, {solution_type:'Text+Image'})\">\n <i class=\"icon close\"></i>\n </button>\n <lib-ckeditor-tool (editorDataOutput)=\"\n editorDataHandler($event, 'solution')\n \"[editorDataInput]=\"editorState.solutions\"\n class=\"ckeditor-tool__option\"></lib-ckeditor-tool>\n </div>\n </div>\n </div>\n <div class=\"solution_video\" *ngIf=\"selectedSolutionType == 'video' && showSolution\">\n <div class=\"ckeditor-tool__solution sb-bg-color-white sb-ckeditor relative\">\n <div class=\"solution-media p-16 d-flex flex-ai-center ckeditor-tool__option p-16\">\n <div class=\"mcq-checkbox-answer\">\n <button class=\"sb-btn sb-ckeditor-close absolute\" (click)=\"deleteSolution()\"\n libTelemetryInteract\n [telemetryInteractEdata]=\"telemetryService.getTelemetryInteractEdata('delete_solution','click','cancel', this.telemetryService.telemetryPageId, {solution_type:'video'})\">\n <i class=\"icon close\"></i>\n </button>\n </div>\n <div class=\"solution-media__video relative position\">\n <div class=\"overlay-image\" [ngStyle]=\"\n videoThumbnail\n ? { background: 'url(' + videoThumbnail + ')' }\n : { background: 'rgba(0,0,0,0.3)' }\n \">\n <i class=\"play circle icon\"></i>\n </div>\n </div>\n <div class=\"solution-media__desc ml-16 sb-color-primary\">\n {{ videoSolutionName\n }}\n <!-- <i class=\"icon ellipsis vertical sb-color-black\"></i> -->\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <!-- <lib-translations *ngIf=\"showTranslation\"></lib-translations> -->\n <!-- child question section -->\n <div class=\"b-1-100 br-4 my-15 px-32 py-10 sb-bg-color-primary-0\"\n *ngFor=\"let question of dependentQuestions;let childindex=index\">\n {{ questionSetHierarchy.children ? 'Q'+ (questionSetHierarchy.children.length+1):''}} {{'. '+\n (childindex+1)}}\n <button\n class=\"sb-btn sb-btn-outline-primary sb-btn-xs sb-left-icon-btn text-inherit b-0 bg-none no-hover pl-0\">\n <span class=\"sb-line-height-24\">edit question</span>\n </button>\n </div>\n <hr>\n <div *ngIf=\"questionFormConfig\">\n <div class=\"pl-5 py-10 font-weight-bold fs-0-92\">\n {{configService.labelConfig?.lbl?.Questiondetails}}\n </div>\n <div class=\"form-container px-30\">\n <sb-dynamic-form [config]=\"leafFormConfig\" (initialize)=\"output($event)\"\n (statusChanges)=\"onStatusChanges($event)\" (valueChanges)=\"valueChanges($event)\"></sb-dynamic-form>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n\n<sui-modal *ngIf=\"showConfirmPopup\" [mustScroll]=\"true\" [isClosable]=\"true\" [transitionDuration]=\"0\" [size]=\"'small'\"\n class=\"sb-modal bx-none overflow-modal\" appBodyScroll (dismissed)=\"showConfirmPopup = !showConfirmPopup\" #modal>\n <div class=\"sb-modal-header\"></div>\n <div class=\"sb-modal-content\">\n {{configService.labelConfig?.lbl?.confirmQuestionNotSaved}}\n </div>\n <div class=\"sb-modal-actions\">\n <button class=\"sb-btn sb-btn-normal sb-btn-primary\" (click)=\"redirectToQuestionset()\">\n {{configService.labelConfig?.button_labels?.yes_btn_label}}\n </button>\n <button class=\"sb-btn sb-btn-normal sb-btn-outline-primary\" (click)=\"showConfirmPopup = !showConfirmPopup\">\n {{configService.labelConfig?.button_labels?.no_btn_label}}\n </button>\n </div>\n</sui-modal>\n\n<lib-term-and-condition\n [showEditingConsent]=\"editorService.isReviewerEditEnable\"\n [showSubmitConfirmPopup]=\"showSubmitConfirmPopup\" (sendForReviewOutput)=\"onConsentSubmit($event)\">\n</lib-term-and-condition>\n\n<sui-modal *ngIf=\"showReviewModal\" [mustScroll]=\"true\" [isClosable]=\"false\" [transitionDuration]=\"0\"\n [size]=\"'normal'\" class=\"sb-modal bx-none overflow-modal\" appBodyScroll #modal (dismissed)=\"showReviewModal = false;\">\n <div class=\"sb-modal-header\">\n {{configService.labelConfig?.lbl?.reviewComments}}\n </div>\n <div class=\"sb-modal-content\">\n <div class=\"sb-field\">\n <label>{{configService.labelConfig?.lbl?.comments}}</label>\n <textarea disabled=\"disabled\" type=\"text\" class=\"wmd-input width-100 sb-form-control p-10 sb-disabled-textarea\" id=\"wmd-input\" [(ngModel)]=\"contentComment\" name=\"rejectedComment\"></textarea>\n </div>\n </div>\n <div class=\"sb-modal-actions\">\n <button class=\"sb-btn sb-btn-normal sb-btn-outline-primary\" (click)=\"modal.deny('denied')\"\n libTelemetryInteract [telemetryInteractEdata]=\"telemetryService.getTelemetryInteractEdata('close','click','cancel', telemetryService.telemetryPageId, {key: 'dialog_id', value: 'review_comments'})\">{{configService.labelConfig?.button_labels?.close_btn_label}}</button>\n </div>\n</sui-modal>\n\n<lib-quality-params-modal\n [labelConfigData]=\"toolbarConfig\"\n [showQualityParameterPopup]=\"showQualityParameterPopup\"\n [qualityFormConfig]=\"qualityFormConfig\"\n (qualityParamChanged)=\"onQualityFormSubmit($event)\">\n</lib-quality-params-modal>\n", styles: [".sb-w-85{width:85%}sui-select{width:100%;border:1px solid rgba(34,36,38,.15);font-size:.8rem;padding:.4rem .2rem;background:#fff}.dropdown.icon{float:right!important}.menu{width:100%}.solution-media__video{width:166px;height:96px}.solution-media__video .overlay-image{width:100%;height:100%;background:#0000004d;position:absolute;left:0;right:0;cursor:pointer;z-index:1}.solution-media__video .overlay-image .play.icon{position:absolute;transform:translate(-50%,-50%);top:50%;left:50%;color:#fff9;font-size:32px;cursor:pointer;height:auto}.solution-media__desc{font-size:12px;font-weight:700;color:#333;max-width:180px;height:96px;display:flex;align-items:flex-end;line-height:normal;line-height:13px}.ckeditor-tool__option,.ckeditor-tool__question{border:1px solid #c4c4c4;border-radius:4px;border-top:0;position:relative;display:flow-root}.ckeditor-tool__solution{border:1px solid #c4c4c4;border-radius:4px;margin-bottom:-4px}.ckeditor-tool__solution .menu .item{font-size:.785rem!important}.solution_video .ckeditor-tool__option{border:0}.ck-rounded-corners .ck.ck-editor__top .ck-sticky-panel .ck-toolbar{border-radius:4px!important}.solution_html .sb-ckeditor .sb-ckeditor-close,.solution_video .sb-ckeditor .sb-ckeditor-close{right:5px;top:-30px;border:0;background:none;min-width:auto;padding:0;color:#999}.sb-ckeditor .sb-ckeditor-close{right:-5px;top:-22px;border:0;background:none;min-width:auto;padding:0;color:#999}.sb-mcq-form .sb-mcq-item:nth-child(4) .sb-ckeditor .ckeditor-tool__option{margin-bottom:0!important}.two-column-grid{display:grid;grid-template-columns:repeat(2,1fr);column-gap:.5rem;border-bottom:solid 1px var(--gray-100)}.two-column-grid:last-child{border-bottom:none}.dynamic-form .sb-search-input::-webkit-input-placeholder{padding-left:1.4rem!important}.dynamic-form .required label:after,.sb-editor-container .dynamic-form .required .multi-select-container .list-border ul:after,.sb-editor-container .dynamic-form .multi-select-container .list-border .required ul:after{content:\"*\";margin:-.2em 0 0 .2em;color:#db2828}.list-border{height:inherit!important}.list-border ul{padding:0!important}.list-border ul span{font-weight:500!important;font-size:.785rem}.sb-editor-container{position:relative;z-index:999!important}.sb-editor-container .sb-input:first-child{margin:1rem 0!important}.sb-editor-container .sb-container{width:95%!important}.sb-editor-container .dynamic-form .sb-dropdown-select{padding:11px 8px!important}.sb-editor-container .dynamic-form label,.sb-editor-container .dynamic-form .multi-select-container .list-border ul{font-size:12px!important;margin-bottom:.5rem!important;color:#121213e0;font-weight:600}.sb-editor-container .dynamic-form .sb-textbox,.sb-editor-container .dynamic-form .topic-picker-selector,.sb-editor-container .dynamic-form select,.sb-editor-container .dynamic-form .sb-textarea,.sb-editor-container .dynamic-form .list-border{border:1px solid rgba(34,36,38,.15)!important;padding:12px 8px!important;border-radius:.28571429rem;font-size:.785rem!important;font-weight:500}.sb-editor-container .dynamic-form .multi-select-container .list-border ul{color:#333;padding:0;margin:0!important;opacity:1!important;font-weight:500!important}.sb-editor-container .dynamic-form .sb-modal-dropdown-web ul{color:#333;padding:0;margin:0!important;opacity:1!important;font-size:12px!important;font-weight:500;border:2px solid #eeeeef}.sb-editor-container .dynamic-form .sb-keywordbox{border:1px solid rgba(34,36,38,.15)!important;padding:.45rem .5rem!important;border-radius:.28571429rem;font-size:.785rem!important;font-weight:500;padding:0!important}.sb-editor-container .dynamic-form .sb-keywordbox .ng2-tag-input{padding:0}.sb-editor-container .dynamic-form .sb-keywordbox .ng2-tag-input tag{margin-left:.5rem}.sb-editor-container .dynamic-form .sb-keywordbox .ng2-tags-container{margin-top:.2rem}.sb-editor-container .dynamic-form .sb-keywordbox .tag-wrapper,.sb-editor-container .dynamic-form .sb-keywordbox delete-icon svg{height:24px;line-height:24px}.sb-editor-container .dynamic-form .sb-dropdown label,.sb-editor-container .dynamic-form .sb-dropdown .multi-select-container .list-border ul,.sb-editor-container .dynamic-form .multi-select-container .list-border .sb-dropdown ul{padding:0}.sb-editor-container .dynamic-form .sb-textarea-container .sb-textarea{height:2.9rem;padding-top:.5rem!important}.sb-editor-container .dynamic-form .sb-textarea-container label,.sb-editor-container .dynamic-form .sb-textarea-container .multi-select-container .list-border ul,.sb-editor-container .dynamic-form .multi-select-container .list-border .sb-textarea-container ul{padding:0}.sb-editor-container .dynamic-form .sb-checkbox{padding:0;margin-top:0}.sb-editor-container .dynamic-form sb-icon-dropdown{top:10px!important;right:6px!important}.sb-editor-container .sb-textarea-container,.sb-editor-container .sb-dropdown{margin:1rem 0!important}lib-chat-window,.chat_bot{display:none!important}.h-100{height:100%!important}.sb-required{color:#ff4558;padding-left:2px;position:relative;top:-5px}select[disabled]{opacity:.8!important;font-weight:500!important}.multiselect{position:relative;top:-7px;height:48px;left:7px;font-size:14px;font-weight:400}.treepicker-parent .list-border{height:38px!important;padding:1rem!important;margin-top:15px!important}.options{justify-content:flex-end;margin-right:10px;display:flex;gap:10px}\n"] }]
1458
+ args: [{ selector: 'lib-question', encapsulation: ViewEncapsulation.None, template: "<div *ngIf='showLoader' class=\"ui container\">\n <app-loader></app-loader>\n</div>\n<div class=\"sb-editor-container mb-0\" *ngIf=\"!showLoader\">\n <lib-header [labelConfigData]=\"toolbarConfig\" [buttonLoaders]=\"buttonLoaders\" [pageId]=\"pageId\" [requestChange] = \"requestChangesPopupAction\" (toolbarEmitter)=\"toolbarEventListener($event)\">\n </lib-header>\n\n <div class=\"sb-bg-white py-20\">\n <div class=\"ui container sb-container\">\n <div class=\"ui twelve column wide h-100\">\n <div class=\"px-16\">\n <div *ngIf=\"showPreview\" class=\"br-2 b-1-100\">\n <lib-quml-player [questionSetHierarchy]=\"questionSetHierarchy\" [isSingleQuestionPreview]=\"true\"></lib-quml-player>\n </div>\n <div style=\"display: flex;align-items: flex-end;justify-content: flex-end;\"\n *ngIf=\"showOptions || isChildQuestion \">\n <div class=\"options\">\n <sui-select [(ngModel)]=\"condition\" valueField=\"value\" class=\"selection multiselect\"\n labelField=\"label\" [placeholder]=\"'Select Condition'\" #select [isDisabled]=\"isReadOnlyMode\">\n <sui-select-option [value]=\"{label:'Equal to',value:'eq'}\"></sui-select-option>\n <sui-select-option [value]=\"{label:'Not equal',value:'ne'}\"></sui-select-option>\n </sui-select>\n\n <sui-multi-select class=\"selection multiselect\" [(ngModel)]=\"selectedOptions\" valueField=\"value\"\n labelField=\"label\" [isSearchable]=\"false\" #multiSelect [placeholder]=\"'Select options'\" [isDisabled]=\"isReadOnlyMode\" >\n <sui-select-option *ngFor=\"let option of options\" [value]=\"option\">\n </sui-select-option>\n </sui-multi-select>\n </div>\n </div>\n <div class=\"py-20 px-32 br-4 b-1-100\" *ngIf=\"!showPreview\" [ngClass]=\"{'sb-bg-color-primary-0': !isReadOnlyMode}\">\n <div class=\"sb-field-group\">\n <label *ngIf=\"!isReadOnlyMode\" class=\"fs-0-92 font-weight-bold\">{{configService.labelConfig?.lbl?.question}}<span class=\"sb-required\">*</span></label>\n <div class=\"sb-field\">\n <div [ngClass]=\"{'ckeditor-tool__question': !isReadOnlyMode, 'ckeditor-tool__question-readonly': isReadOnlyMode, 'mb-5': true}\">\n <lib-ckeditor-tool\n *ngIf=\"!isReadOnlyMode\"\n (editorDataOutput)=\"editorDataHandler($event, 'question')\"\n [editorDataInput]=\"editorState.question\"\n (videoDataOutput)=\"videoDataOutput($event)\" [videoShow]=\"videoShow\"></lib-ckeditor-tool>\n <ng-container *ngIf=\"isReadOnlyMode\">\n <label class=\"px-16 py-8 fs-0-92 mb-0 ckeditor-tool__label width-100\">{{configService.labelConfig?.lbl?.question}}</label>\n <div class=\"ckeditor-tool__solution__body\">\n <p class=\"fs-0-785 p-16\" [innerHTML]=\"editorState.question | sanitizeHtml\"></p>\n </div>\n </ng-container>\n </div>\n <label *ngIf=\"\n showFormError &&\n [undefined, ''].includes(editorState.question)\n \" class=\"sb-color-error fs-0-785\">{{configService.labelConfig?.lbl?.questionRequired}}</label>\n </div>\n <lib-question-option-sub-menu *ngIf=\"subMenus?.length\" [subMenus]=\"subMenus\"\n (onChange)=\"subMenuChange($event)\"></lib-question-option-sub-menu>\n\n <lib-answer *ngIf=\"questionInteractionType === 'default'\"\n [editorState]=\"editorState\" [showFormError]=\"showFormError\"\n (editorDataOutput)=\"editorDataHandler($event)\" [isReadOnlyMode]=\"isReadOnlyMode\"></lib-answer>\n\n <lib-options *ngIf=\"questionInteractionType === 'choice'\"\n [questionPrimaryCategory]=\"questionPrimaryCategory\"\n [editorState]=\"editorState\" [showFormError]=\"showFormError\"\n (editorDataOutput)=\"editorDataHandler($event)\"\n [sourcingSettings]=\"sourcingSettings\" [mapping]=\"scoreMapping\"\n [isReadOnlyMode]=\"isReadOnlyMode\"></lib-options>\n\n <lib-slider *ngIf=\"questionInteractionType === 'slider'\" [editorDataInput]=\"sliderOptions\"\n (onChange)=\"sliderData($event)\"></lib-slider>\n\n <ng-container *ngIf=\"!isReadOnlyMode; else readOnlySolutionsContainer\">\n <div *ngIf=\"sourcingSettings?.showSolution !== false\" class=\"d-flex flex-ai-center ckeditor-tool__solution py-10 px-16 mt-15 sb-bg-color-white\">\n <label class=\"fs-0-92 mb-0 ckeditor-tool__label pb-4\">\n <span class=\"sb-color-primary fs-0-785 mr-4\">{{configService.labelConfig?.lbl?.solution}}</span>\n <span class=\"sb-color-gray-200 fxsmall font-weight-normal\">{{configService.labelConfig?.lbl?.optional}}</span>\n </label>\n <div\n class=\"ui dropdown sb-btn sb-btn-outline-primary sb-btn-normal sb-right-icon-btn sb-btn-radius ml-auto\"\n suiDropdown autoClose=\"itemClick\" *ngIf=\"showSolutionDropDown\" libTelemetryInteract\n [telemetryInteractEdata]=\"telemetryService.getTelemetryInteractEdata('choose_type','click','single_select', telemetryService.telemetryPageId)\">\n <div class=\"text gray-200\">{{configService.labelConfig?.lbl?.chooseType}}</div>\n <i class=\"dropdown icon mx-8\"></i>\n <div class=\"menu\" suiDropdownMenu>\n <div class=\"item\" (click)=\"selectSolutionType('Text+Image')\" (keydown.enter)=\"selectSolutionType('Text+Image')\" tabindex=\"0\" libTelemetryInteract\n [telemetryInteractEdata]=\"telemetryService.getTelemetryInteractEdata('solution_type','select','single_select', telemetryService.telemetryPageId, {solution_type:'Text+Image'})\">\n {{configService.labelConfig?.lbl?.textImage}}\n </div>\n <div class=\"item\" (click)=\"selectSolutionType('video')\" (keydown.enter)=\"selectSolutionType('video')\" tabindex=\"0\" libTelemetryInteract\n [telemetryInteractEdata]=\"telemetryService.getTelemetryInteractEdata('solution_type','select','single_select', telemetryService.telemetryPageId, {solution_type:'video'})\">\n {{configService.labelConfig?.lbl?.video}}\n </div>\n </div>\n </div>\n </div>\n <div class=\"solution_html\" *ngIf=\"selectedSolutionType == 'html'\">\n <div class=\"ckeditor-tool-container\">\n <div class=\"sb-ckeditor relative mb-8\">\n <button (click)=\"deleteSolution()\" class=\"sb-btn sb-ckeditor-close absolute\" libTelemetryInteract\n [telemetryInteractEdata]=\"telemetryService.getTelemetryInteractEdata('delete_solution','click','cancel', telemetryService.telemetryPageId, {solution_type:'Text+Image'})\">\n <i class=\"icon close\"></i>\n </button>\n <lib-ckeditor-tool (editorDataOutput)=\"\n editorDataHandler($event, 'solution')\n \"[editorDataInput]=\"editorState.solutions\"\n class=\"ckeditor-tool__option\"></lib-ckeditor-tool>\n </div>\n </div>\n </div>\n <div class=\"solution_video\" *ngIf=\"selectedSolutionType == 'video' && showSolution\">\n <div class=\"ckeditor-tool__solution sb-bg-color-white sb-ckeditor relative\">\n <div class=\"solution-media p-16 d-flex flex-ai-center ckeditor-tool__option p-16\">\n <div class=\"mcq-checkbox-answer\">\n <button class=\"sb-btn sb-ckeditor-close absolute\" (click)=\"deleteSolution()\"\n libTelemetryInteract\n [telemetryInteractEdata]=\"telemetryService.getTelemetryInteractEdata('delete_solution','click','cancel', this.telemetryService.telemetryPageId, {solution_type:'video'})\">\n <i class=\"icon close\"></i>\n </button>\n </div>\n <div class=\"solution-media__video relative position\">\n <div class=\"overlay-image\" [ngStyle]=\"\n videoThumbnail\n ? { background: 'url(' + videoThumbnail + ')' }\n : { background: 'rgba(0,0,0,0.3)' }\n \">\n <i class=\"play circle icon\"></i>\n </div>\n </div>\n <div class=\"solution-media__desc ml-16 sb-color-primary\">\n {{ videoSolutionName\n }}\n <!-- <i class=\"icon ellipsis vertical sb-color-black\"></i> -->\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n <ng-template #readOnlySolutionsContainer>\n <div class=\"row\" *ngIf=\"editorState.solutions\">\n <div class=\"twelve wide column p-0\">\n <div class=\"ckeditor-tool width-100\">\n <div class=\"ckeditor-tool__question-readonly mb-24\">\n <label class=\"px-16 py-8 fs-0-92 mb-0 ckeditor-tool__label width-100\">Solution</label>\n <div class=\"ckeditor-tool__solution__body\" *ngIf=\"selectedSolutionType == 'html'\">\n <p class=\"fs-0-785 p-16\" [innerHTML]=\"editorState.solutions | sanitizeHtml\"></p>\n </div>\n <div class=\"ckeditor-tool__solution__body\" *ngIf=\"selectedSolutionType == 'video' && showSolution\">\n <div class=\"solution-media p-16 d-flex flex-ai-center\">\n <div class=\"solution-media__video relative position\">\n <div class=\"overlay-image\" [ngStyle]=\"videoThumbnail ? {'background' : 'url(' + videoThumbnail + ')' } : {'background': 'rgba(0,0,0,0.3)'}\"><i class=\"play circle icon\"></i></div>\n </div>\n <div class=\"solution-media__desc ml-16\">\n {{videoSolutionName}}\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </ng-template>\n </div>\n </div>\n <!-- <lib-translations *ngIf=\"showTranslation\"></lib-translations> -->\n <!-- child question section -->\n <div class=\"b-1-100 br-4 my-15 px-32 py-10 sb-bg-color-primary-0\"\n *ngFor=\"let question of dependentQuestions;let childindex=index\">\n {{ questionSetHierarchy.children ? 'Q'+ (questionSetHierarchy.children.length+1):''}} {{'. '+\n (childindex+1)}}\n <button\n class=\"sb-btn sb-btn-outline-primary sb-btn-xs sb-left-icon-btn text-inherit b-0 bg-none no-hover pl-0\">\n <span class=\"sb-line-height-24\">edit question</span>\n </button>\n </div>\n <hr>\n <div *ngIf=\"questionFormConfig\">\n <div class=\"pl-5 py-10 font-weight-bold fs-0-92\">\n {{configService.labelConfig?.lbl?.Questiondetails}}\n </div>\n <div class=\"form-container px-30\">\n <sb-dynamic-form [config]=\"questionFormConfig\" (initialize)=\"output($event)\"\n (statusChanges)=\"onStatusChanges($event)\" (valueChanges)=\"valueChanges($event)\"></sb-dynamic-form>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n\n<sui-modal *ngIf=\"showConfirmPopup\" [mustScroll]=\"true\" [isClosable]=\"true\" [transitionDuration]=\"0\" [size]=\"'small'\"\n class=\"sb-modal bx-none overflow-modal\" appBodyScroll (dismissed)=\"showConfirmPopup = !showConfirmPopup\" #modal>\n <div class=\"sb-modal-header\"></div>\n <div class=\"sb-modal-content\">\n {{configService.labelConfig?.lbl?.confirmQuestionNotSaved}}\n </div>\n <div class=\"sb-modal-actions\">\n <button class=\"sb-btn sb-btn-normal sb-btn-primary\" (click)=\"redirectToQuestionset()\">\n {{configService.labelConfig?.button_labels?.yes_btn_label}}\n </button>\n <button class=\"sb-btn sb-btn-normal sb-btn-outline-primary\" (click)=\"showConfirmPopup = !showConfirmPopup\">\n {{configService.labelConfig?.button_labels?.no_btn_label}}\n </button>\n </div>\n</sui-modal>\n\n<lib-term-and-condition\n [showEditingConsent]=\"editorService.isReviewerEditEnable\"\n [showSubmitConfirmPopup]=\"showSubmitConfirmPopup\" (sendForReviewOutput)=\"onConsentSubmit($event)\">\n</lib-term-and-condition>\n\n<sui-modal *ngIf=\"showReviewModal\" [mustScroll]=\"true\" [isClosable]=\"false\" [transitionDuration]=\"0\"\n [size]=\"'normal'\" class=\"sb-modal bx-none overflow-modal\" appBodyScroll #modal (dismissed)=\"showReviewModal = false;\">\n <div class=\"sb-modal-header\">\n {{configService.labelConfig?.lbl?.reviewComments}}\n </div>\n <div class=\"sb-modal-content\">\n <div class=\"sb-field\">\n <label>{{configService.labelConfig?.lbl?.comments}}</label>\n <textarea disabled=\"disabled\" type=\"text\" class=\"wmd-input width-100 sb-form-control p-10 sb-disabled-textarea\" id=\"wmd-input\" [(ngModel)]=\"contentComment\" name=\"rejectedComment\"></textarea>\n </div>\n </div>\n <div class=\"sb-modal-actions\">\n <button class=\"sb-btn sb-btn-normal sb-btn-outline-primary\" (click)=\"modal.deny('denied')\"\n libTelemetryInteract [telemetryInteractEdata]=\"telemetryService.getTelemetryInteractEdata('close','click','cancel', telemetryService.telemetryPageId, {key: 'dialog_id', value: 'review_comments'})\">{{configService.labelConfig?.button_labels?.close_btn_label}}</button>\n </div>\n</sui-modal>\n\n<lib-quality-params-modal\n [labelConfigData]=\"toolbarConfig\"\n [showQualityParameterPopup]=\"showQualityParameterPopup\"\n [qualityFormConfig]=\"qualityFormConfig\"\n (qualityParamChanged)=\"onQualityFormSubmit($event)\">\n</lib-quality-params-modal>\n", styles: [".sb-w-85{width:85%}sui-select{width:100%;border:1px solid rgba(34,36,38,.15);font-size:.8rem;padding:.4rem .2rem;background:#fff}.dropdown.icon{float:right!important}.menu{width:100%}.solution-media__video{width:166px;height:96px}.solution-media__video .overlay-image{width:100%;height:100%;background:#0000004d;position:absolute;left:0;right:0;cursor:pointer;z-index:1}.solution-media__video .overlay-image .play.icon{position:absolute;transform:translate(-50%,-50%);top:50%;left:50%;color:#fff9;font-size:32px;cursor:pointer;height:auto}.solution-media__desc{font-size:12px;font-weight:700;color:#333;max-width:180px;height:96px;display:flex;align-items:flex-end;line-height:normal;line-height:13px}.ckeditor-tool__option,.ckeditor-tool__question{border:1px solid #c4c4c4;border-radius:4px;border-top:0;position:relative;display:flow-root}.ckeditor-tool__solution,.ckeditor-tool__question-readonly,.ckeditor-tool__option-readonly{border:1px solid #c4c4c4;border-radius:4px;margin-bottom:-4px}.ckeditor-tool__label{background-color:#f3f8ff;color:var(--primary-color)!important;font-weight:600;border-top-left-radius:4px;border-top-right-radius:4px}.mcq-checkbox-answer{background:#f2f2f2;padding:8px;display:flex;justify-content:center;align-items:center;border-bottom-left-radius:4px;border-bottom-right-radius:4px}.ckeditor-tool__solution .menu .item{font-size:.785rem!important}.solution_video .ckeditor-tool__option{border:0}.ck-rounded-corners .ck.ck-editor__top .ck-sticky-panel .ck-toolbar{border-radius:4px!important}.solution_html .sb-ckeditor .sb-ckeditor-close,.solution_video .sb-ckeditor .sb-ckeditor-close{right:5px;top:-30px;border:0;background:none;min-width:auto;padding:0;color:#999}.sb-ckeditor .sb-ckeditor-close{right:-5px;top:-22px;border:0;background:none;min-width:auto;padding:0;color:#999}.sb-mcq-form .sb-mcq-item:nth-child(4) .sb-ckeditor .ckeditor-tool__option{margin-bottom:0!important}.two-column-grid{display:grid;grid-template-columns:repeat(2,1fr);column-gap:.5rem;border-bottom:solid 1px var(--gray-100)}.two-column-grid:last-child{border-bottom:none}.dynamic-form .sb-search-input::-webkit-input-placeholder{padding-left:1.4rem!important}.dynamic-form .required label:after,.sb-editor-container .dynamic-form .required .multi-select-container .list-border ul:after,.sb-editor-container .dynamic-form .multi-select-container .list-border .required ul:after{content:\"*\";margin:-.2em 0 0 .2em;color:#db2828}.list-border{height:inherit!important}.list-border ul{padding:0!important}.list-border ul span{font-weight:500!important;font-size:.785rem}.sb-editor-container{position:relative;z-index:998!important}.sb-editor-container .sb-input:first-child{margin:1rem 0!important}.sb-editor-container .sb-container{width:95%!important}.sb-editor-container .dynamic-form .sb-dropdown-select{padding:11px 8px!important}.sb-editor-container .dynamic-form label,.sb-editor-container .dynamic-form .multi-select-container .list-border ul{font-size:12px!important;margin-bottom:.5rem!important;color:#121213e0;font-weight:600}.sb-editor-container .dynamic-form .sb-textbox,.sb-editor-container .dynamic-form .topic-picker-selector,.sb-editor-container .dynamic-form select,.sb-editor-container .dynamic-form .sb-textarea,.sb-editor-container .dynamic-form .list-border{border:1px solid rgba(34,36,38,.15)!important;padding:12px 8px!important;border-radius:.28571429rem;font-size:.785rem!important;font-weight:500}.sb-editor-container .dynamic-form .multi-select-container .list-border ul{color:#333;padding:0;margin:0!important;opacity:1!important;font-weight:500!important}.sb-editor-container .dynamic-form .sb-modal-dropdown-web ul{color:#333;padding:0;margin:0!important;opacity:1!important;font-size:12px!important;font-weight:500;border:2px solid #eeeeef}.sb-editor-container .dynamic-form .sb-keywordbox{border:1px solid rgba(34,36,38,.15)!important;padding:.45rem .5rem!important;border-radius:.28571429rem;font-size:.785rem!important;font-weight:500;padding:0!important}.sb-editor-container .dynamic-form .sb-keywordbox .ng2-tag-input{padding:0}.sb-editor-container .dynamic-form .sb-keywordbox .ng2-tag-input tag{margin-left:.5rem}.sb-editor-container .dynamic-form .sb-keywordbox .ng2-tags-container{margin-top:.2rem}.sb-editor-container .dynamic-form .sb-keywordbox .tag-wrapper,.sb-editor-container .dynamic-form .sb-keywordbox delete-icon svg{height:24px;line-height:24px}.sb-editor-container .dynamic-form .sb-dropdown label,.sb-editor-container .dynamic-form .sb-dropdown .multi-select-container .list-border ul,.sb-editor-container .dynamic-form .multi-select-container .list-border .sb-dropdown ul{padding:0}.sb-editor-container .dynamic-form .sb-textarea-container .sb-textarea{height:2.9rem;padding-top:.5rem!important}.sb-editor-container .dynamic-form .sb-textarea-container label,.sb-editor-container .dynamic-form .sb-textarea-container .multi-select-container .list-border ul,.sb-editor-container .dynamic-form .multi-select-container .list-border .sb-textarea-container ul{padding:0}.sb-editor-container .dynamic-form .sb-checkbox{padding:0;margin-top:0}.sb-editor-container .dynamic-form sb-icon-dropdown{top:10px!important;right:6px!important}.sb-editor-container .sb-textarea-container,.sb-editor-container .sb-dropdown{margin:1rem 0!important}lib-chat-window,.chat_bot{display:none!important}.h-100{height:100%!important}.sb-required{color:#ff4558;padding-left:2px;position:relative;top:-5px}select[disabled]{opacity:.8!important;font-weight:500!important}.multiselect{position:relative;top:-7px;height:48px;left:7px;font-size:14px;font-weight:400}.treepicker-parent .list-border{height:38px!important;padding:1rem!important;margin-top:15px!important}.options{justify-content:flex-end;margin-right:10px;display:flex;gap:10px}\n"] }]
1353
1459
  }], ctorParameters: function () { return [{ type: i1.QuestionService }, { type: i2.EditorService }, { type: i3.EditorTelemetryService }, { type: i4.PlayerService }, { type: i5.ToasterService }, { type: i6.TreeService }, { type: i7.FrameworkService }, { type: i8.Router }, { type: i9.ConfigService }, { type: i10.EditorCursor }]; }, propDecorators: { questionInput: [{
1354
1460
  type: Input
1355
1461
  }], leafFormConfig: [{
1356
1462
  type: Input
1463
+ }], sourcingSettings: [{
1464
+ type: Input
1357
1465
  }], questionEmitter: [{
1358
1466
  type: Output
1359
1467
  }] } });
1360
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlc3Rpb24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29sbGVjdGlvbi1lZGl0b3ItbGlicmFyeS9zcmMvbGliL2NvbXBvbmVudHMvcXVlc3Rpb24vcXVlc3Rpb24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29sbGVjdGlvbi1lZGl0b3ItbGlicmFyeS9zcmMvbGliL2NvbXBvbmVudHMvcXVlc3Rpb24vcXVlc3Rpb24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBaUIsaUJBQWlCLEVBQWEsTUFBTSxlQUFlLENBQUM7QUFDNUgsT0FBTyxLQUFLLENBQUMsTUFBTSxXQUFXLENBQUM7QUFDL0IsT0FBTyxFQUFFLEVBQUUsSUFBSSxNQUFNLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDcEMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBT25ELE9BQU8sRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBTTNDLE9BQU8sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBaUJuRSxNQUFNLGdCQUFnQixHQUFHLEVBQUUsQ0FBQztBQUM1QixNQUFNLGlCQUFpQixHQUFHLE9BQU8sQ0FBQztBQVFsQyxNQUFNLE9BQU8saUJBQWlCO0lBcUY1QixZQUNVLGVBQWdDLEVBQVMsYUFBNEIsRUFBUyxnQkFBd0MsRUFDdkgsYUFBNEIsRUFBVSxjQUE4QixFQUFVLFdBQXdCLEVBQ3JHLGdCQUFrQyxFQUFVLE1BQWMsRUFBUyxhQUE0QixFQUMvRixZQUEwQjtRQUgxQixvQkFBZSxHQUFmLGVBQWUs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QUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUM7YUFDdkU7U0FDRjtJQUNILENBQUM7K0dBbDRDVSxpQkFBaUI7bUdBQWpCLGlCQUFpQixtTEMxQzlCLDgwV0E0TEE7OzRGRGxKYSxpQkFBaUI7a0JBTjdCLFNBQVM7K0JBQ0UsY0FBYyxpQkFHVCxpQkFBaUIsQ0FBQyxJQUFJO3NXQUk1QixhQUFhO3NCQUFyQixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBR0ksZUFBZTtzQkFBeEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQsIEFmdGVyVmlld0luaXQsIFZpZXdFbmNhcHN1bGF0aW9uLCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoLWVzJztcbmltcG9ydCB7IHY0IGFzIHV1aWR2NCB9IGZyb20gJ3V1aWQnO1xuaW1wb3J0IHsgTWNxRm9ybSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvTWNxRm9ybSc7XG5pbXBvcnQgeyBTZXJ2ZXJSZXNwb25zZSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvc2VydmVyUmVzcG9uc2UnO1xuaW1wb3J0IHsgUXVlc3Rpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvcXVlc3Rpb24vcXVlc3Rpb24uc2VydmljZSc7XG5pbXBvcnQgeyBQbGF5ZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvcGxheWVyL3BsYXllci5zZXJ2aWNlJztcbmltcG9ydCB7IEVkaXRvclRlbGVtZXRyeVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy90ZWxlbWV0cnkvdGVsZW1ldHJ5LnNlcnZpY2UnO1xuaW1wb3J0IHsgRWRpdG9yU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2VkaXRvci9lZGl0b3Iuc2VydmljZSc7XG5pbXBvcnQgeyBUb2FzdGVyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3RvYXN0ZXIvdG9hc3Rlci5zZXJ2aWNlJztcbmltcG9ydCB7IHRocm93RXJyb3IsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBDb25maWdTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvY29uZmlnL2NvbmZpZy5zZXJ2aWNlJztcbmltcG9ydCB7IEZyYW1ld29ya1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9mcmFtZXdvcmsvZnJhbWV3b3JrLnNlcnZpY2UnO1xuaW1wb3J0IHsgVHJlZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy90cmVlL3RyZWUuc2VydmljZSc7XG5pbXBvcnQgeyBFZGl0b3JDdXJzb3IgfSBmcm9tICcuLi8uLi9jb2xsZWN0aW9uLWVkaXRvci1jdXJzb3Iuc2VydmljZSc7XG5pbXBvcnQgeyBmaWx0ZXIsIGZpbmFsaXplLCB0YWtlLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3ViTWVudSB7XG4gIGlkOiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgdmFsdWU6IGFueTtcbiAgbGFiZWw6IHN0cmluZztcbiAgZW5hYmxlZDogYm9vbGVhbjtcbiAgdHlwZTogc3RyaW5nO1xuICBzaG93OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElDcmVhdGlvbkNvbnRleHQge1xuICBvYmplY3RUeXBlPzogc3RyaW5nO1xuICBjb2xsZWN0aW9uT2JqZWN0VHlwZT86IHN0cmluZztcbn1cblxuY29uc3QgZXZpZGVuY2VNaW1lVHlwZSA9ICcnO1xuY29uc3QgZXZpZGVuY2VTaXplTGltaXQgPSAnMjA0ODAnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsaWItcXVlc3Rpb24nLFxuICB0ZW1wbGF0ZVVybDogJy4vcXVlc3Rpb24uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9xdWVzdGlvbi5jb21wb25lbnQuc2NzcyddLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxufSlcbmV4cG9ydCBjbGFzcyBRdWVzdGlvbkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcbiAgUXVtbFBsYXllckNvbmZpZzogYW55ID0ge307XG4gIEBJbnB1dCgpIHF1ZXN0aW9uSW5wdXQ6IGFueTtcbiAgQElucHV0KCkgbGVhZkZvcm1Db25maWc6IGFueTtcbiAgcHVibGljIGluaXRpYWxMZWFmRm9ybUNvbmZpZzogYW55O1xuICBwdWJsaWMgY2hpbGRGb3JtRGF0YTogYW55O1xuICBAT3V0cHV0KCkgcXVlc3Rpb25FbWl0dGVyID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIHByaXZhdGUgb25Db21wb25lbnREZXN0cm95JCA9IG5ldyBTdWJqZWN0PGFueT4oKTtcbiAgdG9vbGJhckNvbmZpZzogYW55ID0ge307XG4gIHB1YmxpYyBlZGl0b3JTdGF0ZTogYW55ID0ge307XG4gIHB1YmxpYyBzaG93UHJldmlldyA9IGZhbHNlO1xuICBwdWJsaWMgbWVkaWFBcnI6IGFueSA9IFtdO1xuICBwdWJsaWMgdmlkZW9TaG93ID0gZmFsc2U7XG4gIHB1YmxpYyBzaG93Rm9ybUVycm9yID0gZmFsc2U7XG4gIHNlbGVjdGVkU29sdXRpb25UeXBlOiBzdHJpbmc7XG4gIHNlbGVjdGVkU29sdXRpb25UeXBlSW5kZXg6IHN0cmluZztcbiAgc2hvd1NvbHV0aW9uRHJvcERvd24gPSB0cnVlO1xuICBzaG93U29sdXRpb24gPSBmYWxzZTtcbiAgdmlkZW9Tb2x1dGlvbk5hbWU6IHN0cmluZztcbiAgdmlkZW9Tb2x1dGlvbkRhdGE6IGFueTtcbiAgdmlkZW9UaHVtYm5haWw6IHN0cmluZztcbiAgc29sdXRpb25VVUlEOiBzdHJpbmc7XG4gIHNvbHV0aW9uVmFsdWU6IHN0cmluZztcbiAgc29sdXRpb25UeXBlczogYW55ID0gW3tcbiAgICB0eXBlOiAnaHRtbCcsXG4gICAgdmFsdWU6ICdUZXh0K0ltYWdlJ1xuICB9LFxuICB7XG4gICAgdHlwZTogJ3ZpZGVvJyxcbiAgICB2YWx1ZTogJ3ZpZGVvJ1xuICB9XTtcbiAgcXVlc3Rpb25NZXRhRGF0YTogYW55O1xuICBxdWVzdGlvbkludGVyYWN0aW9uVHlwZTtcbiAgcXVlc3Rpb25JZDtcbiAgdGVtcFF1ZXN0aW9uSWQ7XG4gIHF1ZXN0aW9uU2V0SWQ7XG4gIHB1YmxpYyBzZXRDaGFyYWN0ZXJMaW1pdCA9IDE2MDtcbiAgcHVibGljIHNob3dMb2FkZXIgPSB0cnVlO1xuICBxdWVzdGlvblNldEhpZXJhcmNoeTogYW55O1xuICBzaG93Q29uZmlybVBvcHVwID0gZmFsc2U7XG4gIHZhbGlkUXVlc3Rpb25EYXRhID0gZmFsc2U7XG4gIHF1ZXN0aW9uUHJpbWFyeUNhdGVnb3J5OiBzdHJpbmc7XG4gIHBhZ2VJZCA9ICdxdWVzdGlvbic7XG4gIHBhZ2VTdGFydFRpbWU6IGFueTtcbiAgcHVibGljIGZyYW1ld29yaztcbiAgcHVibGljIGZyYW1ld29ya0RldGFpbHM6IGFueSA9IHt9O1xuICBwdWJsaWMgcXVlc3Rpb25NZXRhZGF0YUZvcm1TdGF0dXMgPSB0cnVlO1xuICBwdWJsaWMgYnV0dG9uTG9hZGVycyA9IHtcbiAgICBzYXZlQnV0dG9uTG9hZGVyOiBmYWxzZSxcbiAgICByZXZpZXc6IGZhbHNlXG4gIH07XG4gIHB1YmxpYyBzaG93VHJhbnNsYXRpb24gPSBmYWxzZTtcbiAgc3ViTWVudXM6IFN1Yk1lbnVbXTtcbiAgc2hvd0FkZFNlY29uZGFyeVF1ZXN0aW9uQ2F0OiBib29sZWFuO1xuICBzbGlkZXJEYXRhczogYW55ID0ge307XG4gIHNsaWRlck9wdGlvbnM6IGFueSA9IHt9O1xuICBoaW50czogYW55O1xuICBjYXRlZ29yeUxhYmVsOiBhbnkgPSB7fTtcbiAgc2NvcmVNYXBwaW5nOiBhbnk7XG4gIGNvbmRpdGlvbiA9ICdkZWZhdWx0JztcbiAgdGFyZ2V0T3B0aW9uOiBhbnk7XG4gIHJlc3BvbnNlVmFyaWFibGUgPSAncmVzcG9uc2UxJztcbiAgbmV3UXVlc3Rpb25JRDogYW55O1xuICBzaG93T3B0aW9uczogYm9vbGVhbjtcbiAgc2VsZWN0ZWRPcHRpb25zOiBhbnk7XG4gIG9wdGlvbnMgPSBbXTtcbiAgaXNDaGlsZFF1ZXN0aW9uID0gZmFsc2U7XG4gIGJyYW5jaGluZ0xvZ2ljOiBhbnk7XG4gIHNlbGVjdGVkU2VjdGlvbklkOiBhbnk7XG4gIHNlY3Rpb25QcmltYXJ5Q2F0ZWdvcnk6IGFueTtcbiAgbWF4U2NvcmUgPSAxO1xuICBwdWJsaWMgcXVlc3Rpb25Gb3JtQ29uZmlnOiBhbnk7XG4gIHRyZWVOb2RlRGF0YTogYW55O1xuICBzaG93UXVhbGl0eVBhcmFtZXRlclBvcHVwOiBib29sZWFuID0gZmFsc2U7XG4gIHB1YmxpYyBxdWFsaXR5Rm9ybUNvbmZpZzogYW55O1xuICByZXF1ZXN0Q2hhbmdlc1BvcHVwQWN0aW9uOiBzdHJpbmc7XG4gIGlzUmVhZE9ubHlNb2RlOiBib29sZWFuID0gZmFsc2U7XG4gIHNob3dTdWJtaXRDb25maXJtUG9wdXA6IGJvb2xlYW4gPSBmYWxzZTtcbiAgc2hvd1Jldmlld01vZGFsOiBib29sZWFuID0gZmFsc2U7XG4gIGNvbnRlbnRDb21tZW50OiBzdHJpbmcgPSAnJztcbiAgY3JlYXRpb25Nb2RlOiBzdHJpbmc7XG4gIGFjdGlvblR5cGU6IHN0cmluZztcbiAgY3JlYXRpb25Db250ZXh0OiBJQ3JlYXRpb25Db250ZXh0O1xuICBzb3VyY2luZ1NldHRpbmdzOiBhbnk7XG4gIHF1ZXN0aW9uQ2F0ZWdvcnk6IHN0cmluZztcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBxdWVzdGlvblNlcnZpY2U6IFF1ZXN0aW9uU2VydmljZSwgcHVibGljIGVkaXRvclNlcnZpY2U6IEVkaXRvclNlcnZpY2UsIHB1YmxpYyB0ZWxlbWV0cnlTZXJ2aWNlOiBFZGl0b3JUZWxlbWV0cnlTZXJ2aWNlLFxuICAgIHB1YmxpYyBwbGF5ZXJTZXJ2aWNlOiBQbGF5ZXJTZXJ2aWNlLCBwcml2YXRlIHRvYXN0ZXJTZXJ2aWNlOiBUb2FzdGVyU2VydmljZSwgcHJpdmF0ZSB0cmVlU2VydmljZTogVHJlZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBmcmFtZXdvcmtTZXJ2aWNlOiBGcmFtZXdvcmtTZXJ2aWNlLCBwcml2YXRlIHJvdXRlcjogUm91dGVyLCBwdWJsaWMgY29uZmlnU2VydmljZTogQ29uZmlnU2VydmljZSxcbiAgICBwcml2YXRlIGVkaXRvckN1cnNvcjogRWRpdG9yQ3Vyc29yKSB7XG4gICAgY29uc3QgeyBwcmltYXJ5Q2F0ZWdvcnkgfSA9IHRoaXMuZWRpdG9yU2VydmljZS5zZWxlY3RlZENoaWxkcmVuO1xuICAgIHRoaXMucXVlc3Rpb25QcmltYXJ5Q2F0ZWdvcnkgPSBwcmltYXJ5Q2F0ZWdvcnk7XG4gICAgdGhpcy5wYWdlU3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIGNvbnN0IHsgcXVlc3Rpb25TZXRJZCwgcXVlc3Rpb25JZCwgdHlwZSwgY2F0ZWdvcnksIGNyZWF0aW9uQ29udGV4dCwgY3JlYXRpb25Nb2RlIH0gPSB0aGlzLnF1ZXN0aW9uSW5wdXQ7XG4gICAgdGhpcy5xdWVzdGlvbkludGVyYWN0aW9uVHlwZSA9IHR5cGU7XG4gICAgdGhpcy5xdWVzdGlvbklkID0gcXVlc3Rpb25JZDtcbiAgICB0aGlzLnF1ZXN0aW9uU2V0SWQgPSBxdWVzdGlvblNldElkO1xuICAgIHRoaXMudG9vbGJhckNvbmZpZyA9IHRoaXMuZWRpdG9yU2VydmljZS5nZXRUb29sYmFyQ29uZmlnKCk7XG4gICAgdGhpcy50b29sYmFyQ29uZmlnLnNob3dQcmV2aWV3ID0gdGhpcy5lZGl0b3JTZXJ2aWNlLmVkaXRvck1vZGUgIT09ICdlZGl0JztcbiAgICB0aGlzLnRvb2xiYXJDb25maWcuYWRkX3RyYW5zbGF0aW9uID0gdHJ1ZTtcbiAgICB0aGlzLnRyZWVOb2RlRGF0YSA9IHRoaXMudHJlZVNlcnZpY2UuZ2V0Rmlyc3RDaGlsZCgpO1xuICAgIGlmIChfLmdldCh0aGlzLmNyZWF0aW9uQ29udGV4dCwgJ29iamVjdFR5cGUnKSA9PT0gJ3F1ZXN0aW9uJykgeyB0aGlzLnRvb2xiYXJDb25maWcucXVlc3Rpb25Db250cmlidXRpb24gPSB0cnVlOyB9XG4gICAgdGhpcy5zb2x1dGlvblVVSUQgPSB1dWlkdjQoKTtcbiAgICB0aGlzLnRlbGVtZXRyeVNlcnZpY2UudGVsZW1ldHJ5UGFnZUlkID0gdGhpcy5wYWdlSWQ7XG4gICAgdGhpcy5pbml0aWFsTGVhZkZvcm1Db25maWcgPSBfLmNsb25lRGVlcCh0aGlzLmxlYWZGb3JtQ29uZmlnKTtcbiAgICB0aGlzLmluaXRpYWxpemUoKTtcbiAgICB0aGlzLmZyYW1ld29yayA9IF8uZ2V0KHRoaXMuZWRpdG9yU2VydmljZS5lZGl0b3JDb25maWcsICdjb250ZXh0LmZyYW1ld29yaycpO1xuICAgIHRoaXMucXVhbGl0eUZvcm1Db25maWcgPSB0aGlzLmVkaXRvclNlcnZpY2UucXVhbGl0eUZvcm1Db25maWc7XG4gIH1cblxuICBmZXRjaEZyYW1lV29ya0RldGFpbHMoKSB7XG4gICAgdGhpcy5mcmFtZXdvcmtTZXJ2aWNlLmZyYW1ld29ya0RhdGEkLnBpcGUodGFrZVVudGlsKHRoaXMub25Db21wb25lbnREZXN0cm95JCksXG4gICAgICBmaWx0ZXIoZGF0YSA9PiBfLmdldChkYXRhLCBgZnJhbWV3b3JrZGF0YS4ke3RoaXMuZnJhbWV3b3JrfWApKSwgdGFrZSgxKSkuc3Vic2NyaWJlKChmcmFtZXdvcmtEZXRhaWxzOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKGZyYW1ld29ya0RldGFpbHMgJiYgIWZyYW1ld29ya0RldGFpbHMuZXJyKSB7XG4gICAgICAgICAgY29uc3QgZnJhbWV3b3JrRGF0YSA9IGZyYW1ld29ya0RldGFpbHMuZnJhbWV3b3JrZGF0YVt0aGlzLmZyYW1ld29ya10uY2F0ZWdvcmllcztcbiAgICAgICAgICB0aGlzLmZyYW1ld29ya0RldGFpbHMuZnJhbWV3b3JrRGF0YSA9IGZyYW1ld29ya0RhdGE7XG4gICAgICAgICAgdGhpcy5mcmFtZXdvcmtEZXRhaWxzLnRvcGljTGlzdCA9IF8uZ2V0KF8uZmluZChmcmFtZXdvcmtEYXRhLCB7IGNvZGU6ICd0b3BpYycgfSksICd0ZXJtcycpO1xuICAgICAgICAgIHRoaXMucG9wdWxhdGVGcmFtZXdvcmtEYXRhKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG4gIHBvcHVsYXRlRnJhbWV3b3JrRGF0YSgpIHtcbiAgICBjb25zdCBjYXRlZ29yeU1hc3Rlckxpc3QgPSB0aGlzLmZyYW1ld29ya0RldGFpbHMuZnJhbWV3b3JrRGF0YTtcbiAgICBfLmZvckVhY2goY2F0ZWdvcnlNYXN0ZXJMaXN0LCAoY2F0ZWdvcnkpID0+IHtcbiAgICAgIF8uZm9yRWFjaCh0aGlzLmxlYWZGb3JtQ29uZmlnLCAoZm9ybUZpZWxkQ2F0ZWdvcnkpID0+IHtcbiAgICAgICAgaWYgKGNhdGVnb3J5LmNvZGUgPT09IGZvcm1GaWVsZENhdGVnb3J5LmNvZGUpIHtcbiAgICAgICAgICBmb3JtRmllbGRDYXRlZ29yeS50ZXJtcyA9IGNhdGVnb3J5LnRlcm1zO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgdGhpcy50ZWxlbWV0cnlTZXJ2aWNlLmltcHJlc3Npb24oe1xuICAgICAgdHlwZTogJ2VkaXQnLCBwYWdlaWQ6IHRoaXMudGVsZW1ldHJ5U2VydmljZS50ZWxlbWV0cnlQYWdlSWQsIHVyaTogdGhpcy5yb3V0ZXIudXJsLFxuICAgICAgZHVyYXRpb246IChEYXRlLm5vdygpIC0gdGhpcy5wYWdlU3RhcnRUaW1lKSAvIDEwMDBcbiAgICB9KTtcbiAgfVxuXG4gIGluaXRpYWxpemUoKSB7XG4gICAgdGhpcy5lZGl0b3JTZXJ2aWNlLmZldGNoQ29sbGVjdGlvbkhpZXJhcmNoeSh0aGlzLnF1ZXN0aW9uU2V0SWQpLnN1YnNjcmliZSgocmVzcG9uc2UpID0+IHtcbiAgICAgIHRoaXMucXVlc3Rpb25TZXRIaWVyYXJjaHkgPSBfLmdldChyZXNwb25zZSwgJ3Jlc3VsdC5xdWVzdGlvblNldCcpO1xuICAgICAgY29uc3QgcGFyZW50SWQgPSB0aGlzLmVkaXRvclNlcnZpY2UucGFyZW50SWRlbnRpZmllciA/IHRoaXMuZWRpdG9yU2VydmljZS5wYXJlbnRJZGVudGlmaWVyIDogdGhpcy5xdWVzdGlvbklkO1xuICAgICAgLy9vbmx5IGZvciBvYnNlcnZhdGlvbixzdXJ2ZXksb2JzZXJ2YXRpb24gd2l0aCBydWJyaWNzXG4gICAgICBpZiAoIV8uaXNVbmRlZmluZWQocGFyZW50SWQpICYmICFfLmlzVW5kZWZpbmVkKHRoaXMuZWRpdG9yU2VydmljZS5lZGl0b3JDb25maWcuY29uZmlnLnJlbmRlclRheG9ub215KSkge1xuICAgICAgICB0aGlzLmdldFBhcmVudFF1ZXN0aW9uT3B0aW9ucyhwYXJlbnRJZCk7XG4gICAgICAgIGNvbnN0IHNlY3Rpb25EYXRhID0gdGhpcy50cmVlU2VydmljZS5nZXROb2RlQnlJZChwYXJlbnRJZCk7XG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gXy5nZXQocmVzcG9uc2UsICdyZXN1bHQucXVlc3Rpb25TZXQuY2hpbGRyZW4nKTtcbiAgICAgICAgdGhpcy5zZWN0aW9uUHJpbWFyeUNhdGVnb3J5ID0gXy5nZXQocmVzcG9uc2UsICdyZXN1bHQucXVlc3Rpb25TZXQucHJpbWFyeUNhdGVnb3J5Jyk7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRTZWN0aW9uSWQgPSBfLmdldChzZWN0aW9uRGF0YSwgJ2RhdGEubWV0YWRhdGEucGFyZW50Jyk7XG4gICAgICAgIHRoaXMuZ2V0QnJhbmNoaW5nTG9naWMoY2hpbGRyZW4pO1xuICAgICAgfVxuICAgICAgdGhpcy5xdWVzdGlvbkZvcm1Db25maWcgPSBfLmNsb25lRGVlcCh0aGlzLmxlYWZGb3JtQ29uZmlnKTtcbiAgICAgIGxldCBsZWFmRm9ybUNvbmZpZ0ZpZWxkcyA9IF8uam9pbihfLm1hcCh0aGlzLmxlYWZGb3JtQ29uZmlnLCB2YWx1ZSA9PiAodmFsdWUuY29kZSkpLCAnLCcpO1xuICAgICAgbGVhZkZvcm1Db25maWdGaWVsZHMgKz0gJyxpc1Jldmlld01vZGlmaWNhdGlvbkFsbG93ZWQnO1xuICAgICAgaWYgKCFfLmlzVW5kZWZpbmVkKHRoaXMucXVlc3Rpb25JZCkpIHtcbiAgICAgICAgdGhpcy5xdWVzdGlvblNlcnZpY2UucmVhZFF1ZXN0aW9uKHRoaXMucXVlc3Rpb25JZCwgbGVhZkZvcm1Db25maWdGaWVsZHMpXG4gICAgICAgICAgLnN1YnNjcmliZSgocmVzKSA9PiB7XG4gICAgICAgICAgICBpZiAoXy5nZXQocmVzLCAncmVzdWx0JykpIHtcbiAgICAgICAgICAgICAgdGhpcy5xdWVzdGlvbk1ldGFEYXRhID0gXy5nZXQocmVzLCAncmVzdWx0LnF1ZXN0aW9uJyk7XG4gICAgICAgICAgICAgIHRoaXMucXVlc3Rpb25QcmltYXJ5Q2F0ZWdvcnkgPSBfLmdldCh0aGlzLnF1ZXN0aW9uTWV0YURhdGEsICdwcmltYXJ5Q2F0ZWdvcnknKTtcbiAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm1heC1saW5lLWxlbmd0aFxuICAgICAgICAgICAgICB0aGlzLnF1ZXN0aW9uSW50ZXJhY3Rpb25UeXBlID0gXy5nZXQodGhpcy5xdWVzdGlvbk1ldGFEYXRhLCAnaW50ZXJhY3Rpb25UeXBlcycpID8gXy5nZXQodGhpcy5xdWVzdGlvbk1ldGFEYXRhLCAnaW50ZXJhY3Rpb25UeXBlc1swXScpIDogJ2RlZmF1bHQnO1xuICAgICAgICAgICAgICB0aGlzLmVkaXRvclNlcnZpY2Uuc2V0SXNSZXZpZXdNb2RpZmljYXRpb25BbGxvd2VkKF8uZ2V0KHRoaXMucXVlc3Rpb25NZXRhRGF0YSwgJ2lzUmV2aWV3TW9kaWZpY2F0aW9uQWxsb3dlZCcsIGZhbHNlKSk7XG4gICAgICAgICAgICAgIHRoaXMucG9wdWxhdGVGb3JtRGF0YSgpO1xuICAgICAgICAgICAgICBpZiAodGhpcy5xdWVzdGlvbkludGVyYWN0aW9uVHlwZSA9PT0gJ2RlZmF1bHQnKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucXVlc3Rpb25NZXRhRGF0YS5lZGl0b3JTdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgdGhpcy5lZGl0b3JTdGF0ZSA9IHRoaXMucXVlc3Rpb25NZXRhRGF0YS5lZGl0b3JTdGF0ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBpZiAodGhpcy5xdWVzdGlvbkludGVyYWN0aW9uVHlwZSA9PT0gJ2Nob2ljZScpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZURlY2xhcmF0aW9uID0gdGhpcy5xdWVzdGlvbk1ldGFEYXRhLnJlc3BvbnNlRGVjbGFyYXRpb247XG4gICAgICAgICAgICAgICAgY29uc3QgdGVtcGxhdGVJZCA9IHRoaXMucXVlc3Rpb25NZXRhRGF0YS50ZW1wbGF0ZUlkO1xuICAgICAgICAgICAgICAgIGNvbnN0IG51bWJlck9mT3B0aW9ucyA9IHRoaXMucXVlc3Rpb25NZXRhRGF0YT8uZWRpdG9yU3RhdGU/Lm9wdGlvbnM/Lmxlbmd0aCB8fCAwO1xuICAgICAgICAgICAgICAgIGNvbnN0IG1heGltdW1PcHRpb25zID0gXy5nZXQodGhpcy5xdWVzdGlvbklucHV0LCAnY29uZmlnLm1heGltdW1PcHRpb25zJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5lZGl0b3JTZXJ2aWNlLm9wdGlvbnNMZW5ndGggPSBudW1iZXJPZk9wdGlvbnM7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IF8ubWFwKHRoaXMucXVlc3Rpb25NZXRhRGF0YT8uZWRpdG9yU3RhdGU/Lm9wdGlvbnMsIG9wdGlvbiA9PiAoeyBib2R5OiBvcHRpb24udmFsdWUuYm9keSB9KSk7XG4gICAgICAgICAgICAgICAgY29uc3QgcXVlc3Rpb24gPSB0aGlzLnF1ZXN0aW9uTWV0YURhdGE/LmVkaXRvclN0YXRlPy5xdWVzdGlvbjtcbiAgICAgICAgICAgICAgICBjb25zdCBpbnRlcmFjdGlvbnMgPSB0aGlzLnF1ZXN0aW9uTWV0YURhdGE/LmludGVyYWN0aW9ucztcbiAgICAgICAgICAgICAgICB0aGlzLmVkaXRvclN0YXRlID0gbmV3IE1jcUZvcm0oe1xuICAgICAgICAgICAgICAgICAgcXVlc3Rpb24sIG9wdGlvbnMsIGFuc3dlcjogXy5nZXQocmVzcG9uc2VEZWNsYXJhdGlvbiwgJ3Jlc3BvbnNlMS5jb3JyZWN0UmVzcG9uc2UudmFsdWUnKVxuICAgICAgICAgICAgICAgIH0sIHsgdGVtcGxhdGVJZCwgbnVtYmVyT2ZPcHRpb25zLCBtYXhpbXVtT3B0aW9ucyB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLmVkaXRvclN0YXRlLnNvbHV0aW9ucyA9IHRoaXMucXVlc3Rpb25NZXRhRGF0YT8uZWRpdG9yU3RhdGU/LnNvbHV0aW9ucztcbiAgICAgICAgICAgICAgICB0aGlzLmVkaXRvclN0YXRlLmludGVyYWN0aW9ucyA9IGludGVyYWN0aW9ucztcbiAgICAgICAgICAgICAgICBpZiAoXy5oYXModGhpcy5xdWVzdGlvbk1ldGFEYXRhLCAncmVzcG9uc2VEZWNsYXJhdGlvbicpKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLmVkaXRvclN0YXRlLnJlc3BvbnNlRGVjbGFyYXRpb24gPSBfLmdldCh0aGlzLnF1ZXN0aW9uTWV0YURhdGEsICdyZXNwb25zZURlY2xhcmF0aW9uJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChfLmhhcyh0aGlzLnF1ZXN0aW9uTWV0YURhdGEsICdwcmltYXJ5Q2F0ZWdvcnknKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZWRpdG9yU3RhdGUucHJpbWFyeUNhdGVnb3J5ID0gXy5nZXQodGhpcy5xdWVzdGlvbk1ldGFEYXRhLCAncHJpbWFyeUNhdGVnb3J5Jyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdGhpcy5zZXRRdWVzdGlvblRpdGxlKHRoaXMucXVlc3Rpb25JZCk7XG4gICAgICAgICAgICAgIGlmICghXy5pc0VtcHR5KHRoaXMuZWRpdG9yU3RhdGUuc29sdXRpb25zKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRTb2x1dGlvblR5cGUgPSB0aGlzLmVkaXRvclN0YXRlLnNvbHV0aW9uc1swXS50eXBlO1xuICAgICAgICAgICAgICAgIHRoaXMuc29sdXRpb25VVUlEID0gdGhpcy5lZGl0b3JTdGF0ZS5zb2x1dGlvbnNbMF0uaWQ7XG4gICAgICAgICAgICAgICAgdGhpcy5zaG93U29sdXRpb25Ecm9wRG93biA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuc2hvd1NvbHV0aW9uID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zZWxlY3RlZFNvbHV0aW9uVHlwZSA9PT0gJ3ZpZGVvJykge1xuICAgICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBfLmZpbmRJbmRleCh0aGlzLnF1ZXN0aW9uTWV0YURhdGEubWVkaWEsIChvKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBvLnR5cGUgPT09ICd2aWRlbycgJiYgby5pZCA9PT0gdGhpcy5lZGl0b3JTdGF0ZS5zb2x1dGlvbnNbMF0udmFsdWU7XG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgIHRoaXMudmlkZW9Tb2x1dGlvbk5hbWUgPSB0aGlzLnF1ZXN0aW9uTWV0YURhdGEubWVkaWFbaW5kZXhdLm5hbWU7XG4gICAgICAgICAgICAgICAgICB0aGlzLnZpZGVvVGh1bWJuYWlsID0gdGhpcy5xdWVzdGlvbk1ldGFEYXRhLm1lZGlhW2luZGV4XS50aHVtYm5haWw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGVkU29sdXRpb25UeXBlID09PSAnaHRtbCcpIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuZWRpdG9yU3RhdGUuc29sdXRpb25zID0gdGhpcy5lZGl0b3JTdGF0ZS5zb2x1dGlvbnNbMF0udmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmICh0aGlzLnF1ZXN0aW9uTWV0YURhdGEubWVkaWEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1lZGlhQXJyID0gdGhpcy5xdWVzdGlvbk1ldGFEYXRhLm1lZGlhO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8qKiBmb3Igb2JzZXJ2YXRpb24gYW5kIHN1cnZleSB0byBzaG93IGhpbnQsdGlwLGRlcGVuZGVudCBxdWVzdGlvbiBvcHRpb24uICovXG4gICAgICAgICAgICAgIGlmICghXy5pc1VuZGVmaW5lZCh0aGlzLmVkaXRvclNlcnZpY2U/LmVkaXRvckNvbmZpZz8uY29uZmlnPy5yZW5kZXJUYXhvbm9teSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN1Yk1lbnVDb25maWcoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB0aGlzLmNvbnRlbnRDb21tZW50ID0gXy5nZXQodGhpcy5jcmVhdGlvbkNvbnRleHQsICdjb3JyZWN0aW9uQ29tbWVudHMnKTtcbiAgICAgICAgICAgICAgaWYgKHRoaXMuc2hvd1ByZXZpZXcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnByZXZpZXdDb250ZW50KCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdGhpcy5zaG93TG9hZGVyID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSwgKGVycjogU2VydmVyUmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVyckluZm8gPSB7XG4gICAgICAgICAgICAgIGVycm9yTXNnOiAnRmV0Y2hpbmcgcXVlc3Rpb24gZGV0YWlscyBmYWlsZWQuIFBsZWFzZSB0cnkgYWdhaW4uLi4nLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKHRoaXMuZWRpdG9yU2VydmljZS5hcGlFcnJvckhhbmRsaW5nKGVyciwgZXJySW5mbykpO1xuICAgICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKF8uaXNVbmRlZmluZWQodGhpcy5xdWVzdGlvbklkKSkge1xuICAgICAgICB0aGlzLnRlbXBRdWVzdGlvbklkID0gdXVpZHY0KCk7XG4gICAgICAgIHRoaXMucG9wdWxhdGVGb3JtRGF0YSgpO1xuICAgICAgICB0aGlzLnNldFF1ZXN0aW9uVGl0bGUoKTtcbiAgICAgICAgaWYgKHRoaXMucXVlc3Rpb25JbnRlcmFjdGlvblR5cGUgPT09ICdkZWZhdWx0Jykge1xuICAgICAgICAgIGxldCBlZGl0b3JTdGF0ZTogYW55O1xuICAgICAgICAgIGlmICh0aGlzLnF1ZXN0aW9uQ2F0ZWdvcnkpIHtcbiAgICAgICAgICAgIGVkaXRvclN0YXRlID0gXy5nZXQodGhpcy5jb25maWdTZXJ2aWNlLCBgZWRpdG9yQ29uZmlnLmRlZmF1bHRTdGF0ZXMubm9uSW50ZXJhY3RpdmVRdWVzdGlvbnMuJHt0aGlzLnF1ZXN0aW9uQ2F0ZWdvcnl9YCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZWRpdG9yU3RhdGUgPSB7IHF1ZXN0aW9uOiAnJywgYW5zd2VyOiAnJywgc29sdXRpb25zOiAnJyB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZWRpdG9yU3RhdGUpIHtcbiAgICAgICAgICAgIHRoaXMuZWRpdG9yU3RhdGUgPSB7IC4uLmVkaXRvclN0YXRlIH07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMucXVlc3Rpb25JbnRlcmFjdGlvblR5cGUgPT09ICdjaG9pY2UnKSB7XG4gICAgICAgICAgdGhpcy5lZGl0b3JTdGF0ZSA9IG5ldyBNY3FGb3JtKHsgcXVlc3Rpb246ICcnLCBvcHRpb25zOiBbXSB9LCB7IG51bWJlck9mT3B0aW9uczogXy5nZXQodGhpcy5xdWVzdGlvbklucHV0LCAnY29uZmlnLm51bWJlck9mT3B0aW9ucycpLCBtYXhpbXVtT3B0aW9uczogXy5nZXQodGhpcy5xdWVzdGlvbklucHV0LCAnY29uZmlnLm1heGltdW1PcHRpb25zJykgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqIGZvciBvYnNlcnZhdGlvbiBhbmQgc3VydmV5IHRvIHNob3cgaGludCx0aXAsZGVwZW5kZW50IHF1ZXN0aW9uIG9wdGlvbi4gKi9cbiAgICAgICAgaWYgKCFfLmlzVW5kZWZpbmVkKHRoaXMuZWRpdG9yU2VydmljZT8uZWRpdG9yQ29uZmlnPy5jb25maWc/LnJlbmRlclRheG9ub215KSkge1xuICAgICAgICAgIHRoaXMuc3ViTWVudUNvbmZpZygpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2hvd0xvYWRlciA9IGZhbHNlO1xuICAgICAgfVxuICAgIH0sIChlcnI6IFNlcnZlclJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCBlcnJJbmZvID0ge1xuICAgICAgICBlcnJvck1zZzogJ0ZldGNoaW5nIHF1ZXN0aW9uIHNldCBkZXRhaWxzIGZhaWxlZC4gUGxlYXNlIHRyeSBhZ2Fpbi4uLicsXG4gICAgICB9O1xuICAgICAgdGhpcy5lZGl0b3JTZXJ2aWNlLmFwaUVycm9ySGFuZGxpbmcoZXJyLCBlcnJJbmZvKTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldCBjb250ZW50UG9saWN5VXJsKCkge1xuICAgIHJldHVybiB0aGlzLmVkaXRvclNlcnZpY2UuY29udGVudFBvbGljeVVybDtcbiAgfVxuXG4gIHRvb2xiYXJFdmVudExpc3RlbmVyKGV2ZW50KSB7XG4gICAgc3dpdGNoIChldmVudC5idXR0b24pIHtcbiAgICAgIGNhc2UgJ3NhdmVDb250ZW50JzpcbiAgICAgICAgdGhpcy5zYXZlQ29udGVudCgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2NhbmNlbENvbnRlbnQnOlxuICAgICAgICB0aGlzLmhhbmRsZVJlZGlyZWN0VG9RdWVzdGlvbnNldCgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2JhY2tDb250ZW50JzpcbiAgICAgICAgdGhpcy5oYW5kbGVSZWRpcmVjdFRvUXVlc3Rpb25zZXQoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdwcmV2aWV3Q29udGVudCc6XG4gICAgICAgIHRoaXMucHJldmlld0NvbnRlbnQoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdlZGl0Q29udGVudCc6XG4gICAgICAgIHRoaXMuaXNSZWFkT25seU1vZGUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zaG93UHJldmlldyA9IGZhbHNlO1xuICAgICAgICB0aGlzLnRvb2xiYXJDb25maWcuc2hvd1ByZXZpZXcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5wcmV2aWV3Rm9ybURhdGEoIXRoaXMudG9vbGJhckNvbmZpZy5zaG93UHJldmlldyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnc2hvd1Jldmlld2NvbW1lbnRzJzpcbiAgICAgICAgdGhpcy5zaG93UmV2aWV3TW9kYWwgPSAhdGhpcy5zaG93UmV2aWV3TW9kYWw7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnc2F2ZVF1YWxpdHlQYXJhbWV0ZXJzJzpcbiAgICAgICAgdGhpcy5zaG93UXVhbGl0eVBhcmFtZXRlclBvcHVwID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBoYW5kbGVSZWRpcmVjdFRvUXVlc3Rpb25zZXQoKSB7XG4gICAgaWYgKF8uaXNVbmRlZmluZWQodGhpcy5xdWVzdGlvbklkKSkge1xuICAgICAgdGhpcy5zaG93Q29uZmlybVBvcHVwID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yZWRpcmVjdFRvUXVlc3Rpb25zZXQoKTtcbiAgICB9XG4gIH1cblxuXG4gIHN1Ym1pdEhhbmRsZXIoKSB7XG4gICAgdGhpcy52YWxpZGF0ZVF1ZXN0aW9uRGF0YSgpO1xuICAgIHRoaXMudmFsaWRhdGVGb3JtRmllbGRzKCk7XG4gICAgaWYgKHRoaXMuc2hvd0Zvcm1FcnJvciA9PT0gZmFsc2UpIHtcbiAgICAgIHRoaXMuc2hvd1N1Ym1pdENvbmZpcm1Qb3B1cCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgc2F2ZUNvbnRlbnQoKSB7XG4gICAgdGhpcy52YWxpZGF0ZVF1ZXN0aW9uRGF0YSgpO1xuICAgIGlmICh0aGlzLnNob3dGb3JtRXJyb3IgPT09IGZhbHNlICYmIHRoaXMucXVlc3Rpb25NZXRhZGF0YUZvcm1TdGF0dXMgPT09IHRydWUpIHtcbiAgICAgIHRoaXMuc2F2ZVF1ZXN0aW9uKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudG9hc3RlclNlcnZpY2UuZXJyb3IoXy5nZXQodGhpcy5jb25maWdTZXJ2aWNlLCAnbGFiZWxDb25maWcubWVzc2FnZXMuZXJyb3IuMDQ0JykpO1xuICAgIH1cbiAgfVxuXG4gIG9uQ29uc2VudFN1Ym1pdChldmVudCkge1xuICAgIHRoaXMuc2hvd1N1Ym1pdENvbmZpcm1Qb3B1cCA9IGZhbHNlO1xuICAgIGlmIChldmVudCkge1xuICAgICAgdGhpcy5xdWVzdGlvbk1ldGFEYXRhID0gXy5hc3NpZ24odGhpcy5xdWVzdGlvbk1ldGFEYXRhLCB7IGlzUmV2aWV3TW9kaWZpY2F0aW9uQWxsb3dlZDogZXZlbnQuZWRpdGluZ0NvbnNlbnQgfSk7XG4gICAgICB0aGlzLnNlbmRGb3JSZXZpZXcoKTtcbiAgICB9XG4gIH1cblxuICBzZW5kRm9yUmV2aWV3KCkge1xuICAgIGlmICghXy5nZXQodGhpcy5lZGl0b3JTZXJ2aWNlLmVkaXRvckNvbmZpZywgJ2NvbmZpZy5za2lwVHdvTGV2ZWxSZXZpZXcnKSkge1xuICAgICAgbGV0IGNhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmVkaXRvclNlcnZpY2UucmV2aWV3Q29udGVudCh0aGlzLnF1ZXN0aW9uSWQpLnN1YnNjcmliZShkYXRhID0+IHtcbiAgICAgICAgICB0aGlzLnRvYXN0ZXJTZXJ2aWNlLnN1Y2Nlc3MoXy5nZXQodGhpcy5jb25maWdTZXJ2aWNlLCAnbGFiZWxDb25maWcubWVzc2FnZXMuc3VjY2Vzcy4wMDInKSk7XG4gICAgICAgICAgdGhpcy5yZWRpcmVjdFRvQ2hhcHRlckxpc3QoKTtcbiAgICAgICAgfSwgZXJyID0+IHtcbiAgICAgICAgICB0aGlzLnRvYXN0ZXJTZXJ2aWNlLmVycm9yKF8uZ2V0KHRoaXMuY29uZmlnU2VydmljZSwgJ2xhYmVsQ29uZmlnLm1lc3NhZ2VzLmVycm9yLjAwMicpKTtcbiAgICAgICAgfSk7XG4gICAgICB9O1xuICAgICAgaWYgKCF0aGlzLnF1ZXN0aW9uSWQpIHtcbiAgICAgICAgY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdGhpcy5lZGl0b3JTZXJ2aWNlLnJldmlld0NvbnRlbnQodGhpcy5xdWVzdGlvbklkKS5zdWJzY3JpYmUoZGF0YSA9PiB7XG4gICAgICAgICAgICB0aGlzLnRvYXN0ZXJTZXJ2aWNlLnN1Y2Nlc3MoXy5nZXQodGhpcy5jb25maWdTZXJ2aWNlLCAnbGFiZWxDb25maWcubWVzc2FnZXMuc3VjY2Vzcy4wMDInKSk7XG4gICAgICAgICAgICB0aGlzLmFkZFJlc291cmNlVG9RdWVzdGlvbnNldCgpO1xuICAgICAgICAgIH0sIGVyciA9PiB7XG4gICAgICAgICAgICB0aGlzLnRvYXN0ZXJTZXJ2aWNlLmVycm9yKF8uZ2V0KHRoaXMuY29uZmlnU2VydmljZSwgJ2xhYmVsQ29uZmlnLm1lc3NhZ2VzLmVycm9yLjAwMicpKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2suYmluZCh0aGlzKTtcbiAgICAgIHRoaXMudXBzZXJ0UXVlc3Rpb24oY2FsbGJhY2spO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBwdWJsaXNoQ2FsbGJhY2sgPSB0aGlzLnNlbmRRdWVzdGlvbkZvclB1Ymxpc2guYmluZCh0aGlzKTtcbiAgICAgIGNvbnN0IGNhbGxiYWNrID0gdGhpcy5hZGRSZXNvdXJjZVRvUXVlc3Rpb25zZXQuYmluZCh0aGlzLCBwdWJsaXNoQ2FsbGJhY2spO1xuICAgICAgdGhpcy51cHNlcnRRdWVzdGlvbihjYWxsYmFjayk7XG4gICAgfVxuICB9XG5cbiAgcmVxdWVzdEZvckNoYW5nZXMoY29tbWVudCkge1xuICAgIHRoaXMuZWRpdG9yU2VydmljZS5zdWJtaXRSZXF1ZXN0Q2hhbmdlcyh0aGlzLnF1ZXN0aW9uSWQsIGNvbW1lbnQpLnN1YnNjcmliZShyZXMgPT4ge1xuICAgICAgdGhpcy50b2FzdGVyU2VydmljZS5zdWNjZXNzKF8uZ2V0KHRoaXMuY29uZmlnU2VydmljZSwgJ2xhYmVsQ29uZmlnLm1lc3NhZ2VzLnN1Y2Nlc3MuMDAzJykpO1xuICAgICAgdGhpcy5yZWRpcmVjdFRvQ2hhcHRlckxpc3QoKTtcbiAgICB9LCBlcnIgPT4ge1xuICAgICAgdGhpcy50b2FzdGVyU2VydmljZS5lcnJvcihfLmdldCh0aGlzLmNvbmZpZ1NlcnZpY2UsICdsYWJlbENvbmZpZy5tZXNzYWdlcy5lcnJvci4wMDMnKSk7XG4gICAgfSk7XG4gIH1cblxuICBzZW5kUXVlc3Rpb25Gb3JQdWJsaXNoKGV2ZW50KSB7XG4gICAgdGhpcy5lZGl0b3JTZXJ2aWNlLnB1Ymxpc2hDb250ZW50KHRoaXMucXVlc3Rpb25JZCwgZXZlbnQpLnN1YnNjcmliZShyZXMgPT4ge1xuICAgICAgaWYgKCEodGhpcy5jcmVhdGlvbk1vZGUgPT09ICdzb3VyY2luZ1JldmlldycgJiYgdGhpcy5lZGl0b3JTZXJ2aWNlLmlzUmV2aWV3TW9kaWZpY2F0aW9uQWxsb3dlZCkpIHtcbiAgICAgICAgdGhpcy50b2FzdGVyU2VydmljZS5zdWNjZXNzKF8uZ2V0KHRoaXMuY29uZmlnU2VydmljZSwgJ2xhYmVsQ29uZmlnLm1lc3NhZ2VzLnN1Y2Nlc3MuMDM3JykpO1xuICAgICAgfVxuICAgICAgdGhpcy5yZWRpcmVjdFRvQ2hhcHRlckxpc3QoKTtcbiAgICB9LCBlcnIgPT4ge1xuICAgICAgdGhpcy50b2FzdGVyU2VydmljZS5lcnJvcihfLmdldCh0aGlzLmNvbmZpZ1NlcnZpY2UsICdsYWJlbENvbmZpZy5tZXNzYWdlcy5lcnJvci4wMzgnKSk7XG4gICAgfSk7XG4gIH1cblxuICByZWplY3RRdWVzdGlvbihjb21tZW50KSB7XG4gICAgY29uc3QgZWRpdGFibGVGaWVsZHMgPSBfLmdldCh0aGlzLmNyZWF0aW9uQ29udGV4dCwgJ2VkaXRhYmxlRmllbGRzJyk7XG4gICAgaWYgKHRoaXMuY3JlYXRpb25Nb2RlID09PSAnb3JncmV2aWV3JyAmJiBlZGl0YWJsZUZpZWxkcyAmJiAhXy5pc0VtcHR5KGVkaXRhYmxlRmllbGRzW3RoaXMuY3JlYXRpb25Nb2RlXSkpIHtcbiAgICAgIHRoaXMudmFsaWRhdGVGb3JtRmllbGRzKCk7XG4gICAgICBpZiAodGhpcy5zaG93Rm9ybUVycm9yID09PSB0cnVlKSB7XG4gICAgICAgIHRoaXMudG9hc3RlclNlcnZpY2UuZXJyb3IoXy5nZXQodGhpcy5jb25maWdTZXJ2aWNlLCAnbGFiZWxDb25maWcubWVzc2FnZXMuZXJyb3IuMDI5JykpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBsZXQgY2FsbGJhY2sgPSB0aGlzLnJlcXVlc3RGb3JDaGFuZ2VzLmJpbmQodGhpcywgW2NvbW1lbnRdKTtcbiAgICAgIHRoaXMudXBzZXJ0UXVlc3Rpb24oY2FsbGJhY2spO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlcXVlc3RGb3JDaGFuZ2VzKGNvbW1lbnQpO1xuICAgIH1cbiAgfVxuXG4gIHB1Ymxpc2hRdWVzdGlvbihldmVudCkge1xuICAgIGNvbnN0IGVkaXRhYmxlRmllbGRzID0gXy5nZXQodGhpcy5jcmVhdGlvbkNvbnRleHQsICdlZGl0YWJsZUZpZWxkcycpO1xuICAgIGlmICh0aGlzLmNyZWF0aW9uTW9kZSA9PT0gJ29yZ3JldmlldycgJiYgZWRpdGFibGVGaWVsZHMgJiYgIV8uaXNFbXB0eShlZGl0YWJsZUZpZWxkc1t0aGlzLmNyZWF0aW9uTW9kZV0pKSB7XG4gICAgICB0aGlzLnZhbGlkYXRlRm9ybUZpZWxkcygpO1xuICAgICAgaWYgKHRoaXMuc2hvd0Zvcm1FcnJvciA9PT0gdHJ1ZSkge1xuICAgICAgICB0aGlzLnRvYXN0ZXJTZXJ2aWNlLmVycm9yKF8uZ2V0KHRoaXMuY29uZmlnU2VydmljZSwgJ2xhYmVsQ29uZmlnLm1lc3NhZ2VzLmVycm9yLjAyOScpKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgbGV0IGNhbGxiYWNrID0gdGhpcy5zZW5kUXVlc3Rpb25Gb3JQdWJsaXNoLmJpbmQodGhpcywgW2V2ZW50XSk7XG4gICAgICB0aGlzLnVwc2VydFF1ZXN0aW9uKGNhbGxiYWNrKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZW5kUXVlc3Rpb25Gb3JQdWJsaXNoKGV2ZW50KTtcbiAgICB9XG4gIH1cblxuICBzb3VyY2luZ1VwZGF0ZShldmVudCkge1xuICAgIGNvbnN0IGVkaXRhYmxlRmllbGRzID0gXy5nZXQodGhpcy5jcmVhdGlvbkNvbnRleHQsICdlZGl0YWJsZUZpZWxkcycpO1xuICAgIGlmICh0aGlzLmNyZWF0aW9uTW9kZSA9PT0gJ3NvdXJjaW5ncmV2aWV3JyAmJiBlZGl0YWJsZUZpZWxkcyAmJiAhXy5pc0VtcHR5KGVkaXRhYmxlRmllbGRzW3RoaXMuY3JlYXRpb25Nb2RlXSkpIHtcbiAgICAgIHRoaXMudmFsaWRhdGVGb3JtRmllbGRzKCk7XG4gICAgICBpZiAodGhpcy5zaG93Rm9ybUVycm9yID09PSB0cnVlKSB7XG4gICAgICAgIHRoaXMudG9hc3RlclNlcnZpY2UuZXJyb3IoXy5nZXQodGhpcy5jb25maWdTZXJ2aWNlLCAnbGFiZWxDb25maWcubWVzc2FnZXMuZXJyb3IuMDI5JykpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIGxldCBxdWVzdGlvbklkcyA9IFtdO1xuICAgIC8vbGV0IGNvbW1lbnRzID0ge307XG4gICAgbGV0IGNvbW1lbnRzID0gZXZlbnQuY29tbWVudFxuICAgIGxldCBzdWNjZXNzTWVzc2FnZSA9ICcnO1xuICAgIHRoaXMuZWRpdG9yU2VydmljZS5mZXRjaENvbGxlY3Rpb25IaWVyYXJjaHkodGhpcy5xdWVzdGlvblNldElkKS5zdWJzY3JpYmUocmVzID0+IHtcbiAgICAgIGNvbnN0IHF1ZXN0aW9uU2V0ID0gcmVzLnJlc3VsdFsncXVlc3Rpb25TZXQnXTtcbiAgICAgIHN3aXRjaCAoZXZlbnQuYnV0dG9uKSB7XG4gICAgICAgIGNhc2UgJ3NvdXJjaW5nQXBwcm92ZVF1ZXN0aW9uJzpcbiAgICAgICAgICBxdWVzdGlvbklkcyA9IHF1ZXN0aW9uU2V0LmFjY2VwdGVkQ29udHJpYnV0aW9ucyB8fCBbXTtcbiAgICAgICAgICBzdWNjZXNzTWVzc2FnZSA9IF8uZ2V0KHRoaXMuY29uZmlnU2VydmljZSwgJ2xhYmVsQ29uZmlnLm1lc3NhZ2VzLnN1Y2Nlc3MuMDM4JylcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnc291cmNpbmdSZWplY3RRdWVzdGlvbic6XG4gICAgICAgICAgcXVlc3Rpb25JZHMgPSBxdWVzdGlvblNldC5yZWplY3RlZENvbnRyaWJ1dGlvbnMgfHwgW107XG4gICAgICAgICAgY29tbWVudHMgPSBxdWVzdGlvblNldC5yZWplY3RlZENvbnRyaWJ1dGlvbkNvbW1lbnRzIHx8IHt9O1xuICAgICAgICAgIGNvbW1lbnRzW3RoaXMucXVlc3Rpb25JZF0gPSBldmVudC5jb21tZW50O1xuICAgICAgICAgIHN1Y2Nlc3NNZXNzYWdlID0gXy5nZXQodGhpcy5jb25maWdTZXJ2aWNlLCAnbGFiZWxDb25maWcubWVzc2FnZXMuc3VjY2Vzcy4wMzknKVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgcXVlc3Rpb25JZHMucHVzaCh0aGlzLnF1ZXN0aW9uSWQpO1xuICAgICAgZXZlbnRbJ3JlcXVlc3RCb2R5J10gPSB0aGlzLnByZXBhcmVTb3VyY2luZ1VwZGF0ZUJvZHkocXVlc3Rpb25JZHMsIGNvbW1lbnRzKTtcbiAgICAgIHRoaXMuZWRpdG9yU2VydmljZS51cGRhdGVDb2xsZWN0aW9uKHRoaXMucXVlc3Rpb25TZXRJZCwgZXZlbnQpLnN1YnNjcmliZShyZXMgPT4ge1xuICAgICAgICB0aGlzLnRvYXN0ZXJTZXJ2aWNlLnN1Y2Nlc3Moc3VjY2Vzc01lc3NhZ2UpO1xuICAgICAgICB0aGlzLnJlZGlyZWN0VG9DaGFwdGVyTGlzdCgpO1xuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgc2VuZEJhY2tRdWVzdGlvbihldmVudCkge1xuICAgIHRoaXMucXVlc3Rpb25TZXJ2aWNlLnJlYWRRdWVzdGlvbih0aGlzLnF1ZXN0aW9uSWQsICdzdGF0dXMnKVxuICAgICAgLnN1YnNjcmliZSgocmVzKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3RPYmogPSB7XG4gICAgICAgICAgcXVlc3Rpb246IHtcbiAgICAgICAgICAgIHByZXZTdGF0dXM6IF8uZ2V0KHJlcy5yZXN1bHQsIGBxdWVzdGlvbi5zdGF0dXNgKSxcbiAgICAgICAgICAgIHN0YXR1czogJ0RyYWZ0JyxcbiAgICAgICAgICAgIHJlcXVlc3RDaGFuZ2VzOiBldmVudC5jb21tZW50XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLnF1ZXN0aW9uU2VydmljZS51cGRhdGVRdWVzdGlvbih0aGlzLnF1ZXN0aW9uSWQsIHJlcXVlc3RPYmopLnN1YnNjcmliZShyZXMgPT4ge1xuICAgICAgICAgIHRoaXMudG9hc3RlclNlcnZpY2Uuc3VjY2VzcyhfLmdldCh0aGlzLmNvbmZpZ1NlcnZpY2UsICdsYWJlbENvbmZpZy5tZXNzYWdlcy5zdWNjZXNzLjA0MCcpKTtcbiAgICAgICAgICB0aGlzLnJlZGlyZWN0VG9DaGFwdGVyTGlzdCgpO1xuICAgICAgICB9KTtcbiAgICAgIH0sIChlcnI6IFNlcnZlclJlc3BvbnNlKSA9PiB7XG4gICAgICAgIGNvbnN0IGVyckluZm8gPSB7XG4gICAgICAgICAgZXJyb3JNc2c6ICdDYW5ub3QgdXBkYXRlIHF1ZXN0aW9uIHN0YXR1cy4gUGxlYXNlIHRyeSBhZ2Fpbi4uLicsXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuZWRpdG9yU2VydmljZS5hcGlFcnJvckhhbmRsaW5nKGVyciwgZXJySW5mbyk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHZhbGlkYXRlUXVlc3Rpb25EYXRhKCkge1xuXG4gICAgaWYgKFt1bmRlZmluZWQsICcnXS5pbmNsdWRlcyh0aGlzLmVkaXRvclN0YXRlLnF1ZXN0aW9uKSkge1xuICAgICAgdGhpcy5zaG93Rm9ybUVycm9yID0gdHJ1ZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyB0byBoYW5kbGUgd2hlbiBxdWVzdGlvbiB0eXBlIGlzIHN1YmplY3RpdmVcbiAgICBpZiAodGhpcy5xdWVzdGlvbkludGVyYWN0aW9uVHlwZSA9PT0gJ2RlZmF1bHQnKSB7XG4gICAgICBpZiAodGhpcy5lZGl0b3JTdGF0ZS5hbnN3ZXIgIT09ICcnKSB7XG4gICAgICAgIHRoaXMuc2hvd0Zvcm1FcnJvciA9IGZhbHNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zaG93Rm9ybUVycm9yID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIHRvIGhhbmRsZSB3aGVuIHF1ZXN0aW9uIHR5cGUgaXMgbWNxXG4gICAgaWYgKHRoaXMucXVlc3Rpb25JbnRlcmFjdGlvblR5cGUgPT09ICdjaG9pY2UnKSB7XG4gICAgICBjb25zdCBkYXRhID0gXy5nZXQodGhpcy50cmVlTm9kZURhdGEsICdkYXRhLm1ldGFkYXRhJyk7XG4gICAgICBpZiAoXy5nZXQodGhpcy5lZGl0b3JTdGF0ZSwgJ2ludGVyYWN0aW9uVHlwZXNbMF0nKSA9PT0gJ2Nob2ljZScgJiZcbiAgICAgICAgXy5pc0VtcHR5KHRoaXMuZWRpdG9yU3RhdGU/LnJlc3BvbnNlRGVjbGFyYXRpb24/LnJlc3BvbnNlMT8ubWFwcGluZykgJiZcbiAgICAgICAgIV8uaXNVbmRlZmluZWQodGhpcy5lZGl0b3JTZXJ2aWNlPy5lZGl0b3JDb25maWc/LmNvbmZpZz8ucmVuZGVyVGF4b25vbXkpICYmXG4gICAgICAgIF8uZ2V0KGRhdGEsICdhbGxvd1Njb3JpbmcnKSA9PT0gJ1llcycpIHtcbiAgICAgICAgdGhpcy50b2FzdGVyU2VydmljZS5lcnJvcihfLmdldCh0aGlzLmNvbmZpZ1NlcnZpY2UsICdsYWJlbENvbmZpZy5tZXNzYWdlcy5lcnJvci4wMDUnKSk7XG4gICAgICAgIHRoaXMuc2hvd0Zvcm1FcnJvciA9IHRydWU7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2hvd0Zvcm1FcnJvciA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgY29uc3Qgb3B0aW9uVmFsaWQgPSBfLmZpbmQodGhpcy5lZGl0b3JTdGF0ZS5vcHRpb25zLCBvcHRpb24gPT5cbiAgICAgICAgKG9wdGlvbi5ib2R5ID09PSB1bmRlZmluZWQgfHwgb3B0aW9uLmJvZHkgPT09ICcnIHx8IG9wdGlvbi5sZW5ndGggPiB0aGlzLnNldENoYXJhY3RlckxpbWl0KSk7XG4gICAgICBpZiAob3B0aW9uVmFsaWQgfHwgKCF0aGlzLmVkaXRvclN0YXRlLmFuc3dlciAmJiB0aGlzLnNvdXJjaW5nU2V0dGluZ3M/LmVuZm9yY2VDb3JyZWN0QW5zd2VyKSkge1xuICAgICAgICB0aGlzLnNob3dGb3JtRXJyb3IgPSB0cnVlO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNob3dGb3JtRXJyb3IgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5xdWVzdGlvbkludGVyYWN0aW9uVHlwZSA9PT0gJ3NsaWRlcicpIHtcbiAgICAgIGNvbnN0IG1pbiA9IF8uZ2V0KHRoaXMuc2xpZGVyRGF0YXMsICd2YWxpZGF0aW9uLnJhbmdlLm1pbicpO1xuICAgICAgY29uc3QgbWF4ID0gXy5nZXQodGhpcy5zbGlkZXJEYXRhcywgJ3ZhbGlkYXRpb24ucmFuZ2UubWF4Jyk7XG4gICAgICBjb25zdCBzdGVwID0gXy5nZXQodGhpcy5zbGlkZXJEYXRhcywgJ3N0ZXAnKTtcbiAgICAgIGlmIChfLmlzRW1wdHkodGhpcy5zbGlkZXJEYXRhcykgfHwgXy5pc0VtcHR5KG1pbikgfHwgXy5pc0VtcHR5KG1heCkgfHwgXy5pc0VtcHR5KHN0ZXApKSB7XG4gICAgICAgIHRoaXMudG9hc3RlclNlcnZpY2UuZXJyb3IoXy5nZXQodGhpcy5jb25maWdTZXJ2aWNlLCAnbGFiZWxDb25maWcubWVzc2FnZXMuZXJyb3IuMDA1JykpO1xuICAgICAgICB0aGlzLnNob3dGb3JtRXJyb3IgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zaG93Rm9ybUVycm9yID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gIH1cblxuICByZWRpcmVjdFRvUXVlc3Rpb25zZXQoKSB7XG4gICAgdGhpcy5zaG93Q29uZmlybVBvcHVwID0gZmFsc2U7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5zaG93QWRkU2Vjb25kYXJ5UXVlc3Rpb25DYXQpIHtcbiAgICAgICAgdGhpcy5xdWVzdGlvbkVtaXR0ZXIuZW1pdCh7XG4gICAgICAgICAgdHlwZTogXCJjcmVhdGVOZXdDb250ZW50XCIsXG4gICAgICAgICAgaXNDaGlsZFF1ZXN0aW9uOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZWRpdG9yU2VydmljZS5wYXJlbnRJZGVudGlmaWVyID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgdGhpcy5zaG93QWRkU2Vjb25kYXJ5UXVlc3Rpb25DYXQgPSBmYWxzZTtcbiAgICAgIHRoaXMucXVlc3Rpb25FbWl0dGVyLmVtaXQoeyBzdGF0dXM6IGZhbHNlIH0pO1xuICAgIH0sIDEwMCk7XG4gIH1cblxuICBhZGRSZXNvdXJjZVRvUXVlc3Rpb25zZXQocHVibGlzaENhbGxiYWNrPykge1xuICAgIGNvbnN0IHF1ZXN0aW9uU2V0SWQgPSBfLmdldCh0aGlzLmVkaXRvclNlcnZpY2UuZWRpdG9yQ29uZmlnLCAnY29udGV4dC5pZGVudGlmaWVyJyk7XG4gICAgY29uc3QgdW5pdElkID0gdGhpcy5zZWxlY3RlZFNlY3Rpb25JZCB8fCBfLmdldCh0aGlzLnF1ZXN0aW9uSW5wdXQsICdjb25maWcucGFyZW50Jyk7XG4gICAgdGhpcy5lZGl0b3JTZXJ2aWNlLmFkZFJlc291cmNlVG9RdWVzdGlvbnNldChxdWVzdGlvblNldElkLCB1bml0SWQsIHRoaXMucXVlc3Rpb25JZCkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMudG9hc3RlclNlcnZpY2Uuc3VjY2VzcyhfLmdldCh0aGlzLmNvbmZpZ1NlcnZpY2UsICdsYWJlbENvbmZpZy5tZXNzYWdlcy5zdWNjZXNzLjAwOScpKTtcbiAgICAgIGlmIChwdWJsaXNoQ2FsbGJhY2spIHtcbiAgICAgICAgcHVibGlzaENhbGxiYWNrKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnJlZGlyZWN0VG9RdWVzdGlvbnNldCgpO1xuICAgICAgfVxuICAgIH0sIChlcnIpID0+IHtcbiAgICAgIGNvbnN0IGVyckluZm8gPSB7XG4gICAgICAgIGVycm9yTXNnOiAnRmFpbGVkIHRvIGFkZCBxdWVzdGlvbiB0byBxdWVzdGlvbnNldC4gUGxlYXNlIHRyeSBhZ2Fpbi4uLicsXG4gICAgICB9O1xuICAgICAgdGhpcy5lZGl0b3JTZXJ2aWNlLmFwaUVycm9ySGFuZGxpbmcoZXJyLCBlcnJJbmZvKTtcbiAgICB9KTtcbiAgfVxuXG4gIHJlZGlyZWN0VG9DaGFwdGVyTGlzdCgpIHtcbiAgICB0aGlzLnF1ZXN0aW9uRW1pdHRlci5lbWl0KHsgc3RhdHVzOiBmYWxzZSB9KTtcbiAgfVxuXG4gIHNldFF1ZXN0aW9uSWQocXVlc3Rpb25JZDogc3RyaW5nKSB7XG4gICAgdGhpcy5xdWVzdGlvbklkID0gcXVlc3Rpb25JZDtcbiAgfVxuXG4gIGVkaXRvckRhdGFIYW5kbGVyKGV2ZW50LCB0eXBlPykge1xuICAgIGlmICh0eXBlID09PSAncXVlc3Rpb24nKSB7XG4gICAgICB0aGlzLmVkaXRvclN0YXRlLnF1ZXN0aW9uID0gZXZlbnQuYm9keTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdzb2x1dGlvbicpIHtcbiAgICAgIHRoaXMuZWRpdG9yU3RhdGUuc29sdXRpb25zID0gZXZlbnQuYm9keTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5lZGl0b3JTdGF0ZSA9IF8uYXNzaWduKHRoaXMuZWRpdG9yU3RhdGUsIGV2ZW50LmJvZHkpO1xuICAgIH1cblxuICAgIGlmIChldmVudC5tZWRpYW9iaikge1xuICAgICAgY29uc3QgbWVkaWEgPSBldmVudC5tZWRpYW9iajtcbiAgICAgIHRoaXMuc2V0TWVkaWEobWVkaWEpO1xuICAgIH1cbiAgfVxuXG4gIHNldE1lZGlhKG1lZGlhKSB7XG4gICAgaWYgKG1lZGlhKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IF8uZmluZCh0aGlzLm1lZGlhQXJyLCBvYiA9PiB7XG4gICAgICAgIHJldHVybiBvYi5pZCA9PT0gbWVkaWEuaWQ7XG4gICAgICB9KTtcbiAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMubWVkaWFBcnIucHVzaChtZWRpYSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc2F2ZVF1ZXN0aW9uKCkge1xuICAgIGlmIChfLmdldCh0aGlzLmNyZWF0aW9uQ29udGV4dCwgJ29iamVjdFR5cGUnKSA9PT0gJ3F1ZXN0aW9uJykge1xuICAgICAgaWYgKHRoaXMuY3JlYXRpb25Nb2RlID09PSAnZWRpdCcpIHtcbiAgICAgICAgY29uc3QgY2FsbGJhY2sgPSB0aGlzLmFkZFJlc291cmNlVG9RdWVzdGlvbnNldC5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLnVwc2VydFF1ZXN0aW9uKGNhbGxiYWNrKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5jcmVhdGlvbk1vZGUgPT09ICdzb3VyY2luZ1JldmlldycpIHtcbiAgICAgICAgY29uc3QgY2FsbGJhY2sgPSB0aGlzLnNlbmRRdWVzdGlvbkZvclB1Ymxpc2guYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy51cHNlcnRRdWVzdGlvbihjYWxsYmFjayk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnVwc2VydFF1ZXN0aW9uKHVuZGVmaW5lZCk7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgaWYgKF8uaXNVbmRlZmluZWQodGhpcy5xdWVzdGlvbklkKSkge1xuICAgICAgICB0aGlzLmNyZWF0ZVF1ZXN0aW9uKCk7XG4gICAgICB9XG4gICAgICBpZiAoIV8uaXNVbmRlZmluZWQodGhpcy5xdWVzdGlvbklkKSkge1xuICAgICAgICB0aGlzLnVwZGF0ZVF1ZXN0aW9uKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmlkZW9EYXRhT3V0cHV0KGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50KSB7XG4gICAgICB0aGlzLnZpZGVvU29sdXRpb25EYXRhID0gZXZlbnQ7XG4gICAgICB0aGlzLnZpZGVvU29sdXRpb25OYW1lID0gZXZlbnQubmFtZTtcbiAgICAgIHRoaXMuZWRpdG9yU3RhdGUuc29sdXRpb25zID0gZXZlbnQuaWRlbnRpZmllcjtcbiAgICAgIHRoaXMudmlkZW9UaHVtYm5haWwgPSBldmVudC50aHVtYm5haWw7XG4gICAgICBjb25zdCB2aWRlb01lZGlhOiBhbnkgPSB7fTtcbiAgICAgIHZpZGVvTWVkaWEuaWQgPSBldmVudC5pZGVudGlmaWVyO1xuICAgICAgdmlkZW9NZWRpYS5zcmMgPSBldmVudC5zcmM7XG4gICAgICB2aWRlb01lZGlhLnR5cGUgPSAndmlkZW8nO1xuICAgICAgdmlkZW9NZWRpYS5hc3NldElkID0gZXZlbnQuaWRlbnRpZmllcjtcbiAgICAgIHZpZGVvTWVkaWEubmFtZSA9IGV2ZW50Lm5hbWU7XG4gICAgICB2aWRlb01lZGlhLnRodW1ibmFpbCA9IHRoaXMudmlkZW9UaHVtYm5haWw7XG4gICAgICB2aWRlb01lZGlhLmJhc2VVcmwgPSBfLmdldCh0aGlzLmVkaXRvclNlcnZpY2UuZWRpdG9yQ29uZmlnLCAnY29udGV4dC5ob3N0JykgfHwgZG9jdW1lbnQubG9jYXRpb24ub3JpZ2luO1xuICAgICAgaWYgKHZpZGVvTWVkaWEudGh1bWJuYWlsKSB7XG4gICAgICAgIGNvbnN0IHRodW1ibmFpbE1lZGlhOiBhbnkgPSB7fTtcbiAgICAgICAgdGh1bWJuYWlsTWVkaWEuc3JjID0gdGhpcy52aWRlb1RodW1ibmFpbDtcbiAgICAgICAgdGh1bWJuYWlsTWVkaWEudHlwZSA9ICdpbWFnZSc7XG4gICAgICAgIHRodW1ibmFpbE1lZGlhLmlkID0gYHZpZGVvXyR7ZXZlbnQuaWRlbnRpZmllcn1gO1xuICAgICAgICB0aHVtYm5haWxNZWRpYS5iYXNlVXJsID0gXy5nZXQodGhpcy5lZGl0b3JTZXJ2aWNlLmVkaXRvckNvbmZpZywgJ2NvbnRleHQuaG9zdCcpIHx8IGRvY3VtZW50LmxvY2F0aW9uLm9yaWdpbjtcbiAgICAgICAgdGhpcy5tZWRpYUFyci5wdXNoKHRodW1ibmFpbE1lZGlhKTtcbiAgICAgIH1cbiAgICAgIHRoaXMubWVkaWFBcnIucHVzaCh2aWRlb01lZGlhKTtcbiAgICAgIHRoaXMuc2hvd1NvbHV0aW9uRHJvcERvd24gPSBmYWxzZTtcbiAgICAgIHRoaXMuc2hvd1NvbHV0aW9uID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kZWxldGVTb2x1dGlvbigpO1xuICAgIH1cbiAgICB0aGlzLnZpZGVvU2hvdyA9IGZhbHNlO1xuICB9XG5cbiAgc2VsZWN0U29sdXRpb25UeXBlKGRhdGE6IGFueSkge1xuICAgIGNvbnN0IGluZGV4ID0gXy5maW5kSW5kZXgodGhpcy5zb2x1dGlvblR5cGVzLCAoc29sOiBhbnkpID0+IHtcbiAgICAgIHJldHVybiBzb2wudmFsdWUgPT09IGRhdGE7XG4gICAgfSk7XG4gICAgdGhpcy5zZWxlY3RlZFNvbHV0aW9uVHlwZSA9IHRoaXMuc29sdXRpb25UeXBlc1tpbmRleF0udHlwZTtcbiAgICBpZiAodGhpcy5zZWxlY3RlZFNvbHV0aW9uVHlwZSA9PT0gJ3ZpZGVvJykge1xuICAgICAgY29uc3Qgc2hvd1ZpZGVvID0gdHJ1ZTtcbiAgICAgIHRoaXMudmlkZW9TaG93ID0gc2hvd1ZpZGVvO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNob3dTb2x1dGlvbkRyb3BEb3duID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgZGVsZXRlU29sdXRpb24oKSB7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRTb2x1dGlvblR5cGUgPT09ICd2aWRlbycpIHtcbiAgICAgIHRoaXMubWVkaWFBcnIgPSBfLmZpbHRlcih0aGlzLm1lZGlhQXJyLCAoaXRlbTogYW55KSA9PiBpdGVtLmlkICE9PSB0aGlzLmVkaXRvclN0YXRlLnNvbHV0aW9ucyk7XG4gICAgfVxuICAgIHRoaXMuc2hvd1NvbHV0aW9uRHJvcERvd24gPSB0cnVlO1xuICAgIHRoaXMuc2VsZWN0ZWRTb2x1dGlvblR5cGUgPSAnJztcbiAgICB0aGlzLnZpZGVvU29sdXRpb25OYW1lID0gJyc7XG4gICAgdGhpcy5lZGl0b3JTdGF0ZS5zb2x1dGlvbnMgPSAnJztcbiAgICB0aGlzLnZpZGVvVGh1bWJuYWlsID0gJyc7XG4gICAgdGhpcy5zaG93U29sdXRpb24gPSBmYWxzZTtcbiAgfVxuXG4gIGdldFNvbHV0aW9uT2JqKHNvbHV0aW9uVVVJRCwgc2VsZWN0ZWRTb2x1dGlvblR5cGUsIGVkaXRvclN0YXRlU29sdXRpb25zOiBhbnkpIHtcbiAgICBsZXQgc29sdXRpb25PYmo6IGFueTtcbiAgICBzb2x1dGlvbk9iaiA9IHt9O1xuICAgIHNvbHV0aW9uT2JqLmlkID0gc29sdXRpb25VVUlEO1xuICAgIHNvbHV0aW9uT2JqLnR5cGUgPSBzZWxlY3RlZFNvbHV0aW9uVHlwZTtcbiAgICBpZiAoXy5pc1N0cmluZyhlZGl0b3JTdGF0ZVNvbHV0aW9ucykpIHtcbiAgICAgIHNvbHV0aW9uT2JqLnZhbHVlID0gZWRpdG9yU3RhdGVTb2x1dGlvbnM7XG4gICAgfVxuICAgIGlmIChfLmlzQXJyYXkoZWRpdG9yU3RhdGVTb2x1dGlvbnMpKSB7XG4gICAgICBpZiAoXy5oYXMoZWRpdG9yU3RhdGVTb2x1dGlvbnNbMF0sICd2YWx1ZScpKSB7XG4gICAgICAgIHNvbHV0aW9uT2JqLnZhbHVlID0gZWRpdG9yU3RhdGVTb2x1dGlvbnNbMF0udmFsdWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzb2x1dGlvbk9iajtcbiAgfVxuXG4gIGdldFF1ZXN0aW9uTWV0YWRhdGEoKSB7XG4gICAgbGV0IG1ldGFkYXRhOiBhbnkgPSB7XG4gICAgICBtaW1lVHlwZTogJ2FwcGxpY2F0aW9uL3ZuZC5zdW5iaXJkLnF1ZXN0aW9uJyxcbiAgICAgIG1lZGlhOiB0aGlzLm1lZGlhQXJyLFxuICAgICAgZWRpdG9yU3RhdGU6IHt9XG4gICAgfTtcbiAgICBtZXRhZGF0YSA9IF8uYXNzaWduKG1ldGFkYXRhLCB0aGlzLmVkaXRvclN0YXRlKTtcbiAgICBtZXRhZGF0YS5lZGl0b3JTdGF0ZS5xdWVzdGlvbiA9IG1ldGFkYXRhLnF1ZXN0aW9uO1xuICAgIG1ldGFkYXRhLmJvZHkgPSBtZXRhZGF0YS5xdWVzdGlvbjtcbiAgICBjb25zdCB0cmVlTm9kZURhdGEgPSBfLmdldCh0aGlzLnRyZWVOb2RlRGF0YSwgJ2RhdGEubWV0YWRhdGEnKTtcblxuICAgIGlmICghKF8uZ2V0KHRyZWVOb2RlRGF0YSwgXCJhbGxvd1Njb3JpbmdcIikgPT09IFwiWWVzXCIpKSB7XG4gICAgICBfLnNldChtZXRhZGF0YSwgXCJyZXNwb25zZURlY2xhcmF0aW9uLnJlc3BvbnNlMS5tYXBwaW5nXCIsIFtdKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5xdWVzdGlvbkludGVyYWN0aW9uVHlwZSA9PT0gJ2Nob2ljZScpIHtcbiAgICAgIG1ldGFkYXRhLmJvZHkgPSB0aGlzLmdldE1jcVF1ZXN0aW9uSHRtbEJvZHkodGhpcy5lZGl0b3JTdGF0ZS5xdWVzdGlvbiwgdGhpcy5lZGl0b3JTdGF0ZS50ZW1wbGF0ZUlkKTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQodGhpcy5zZWxlY3RlZFNvbHV0aW9uVHlwZSkgJiYgIV8uaXNFbXB0eSh0aGlzLnNlbGVjdGVkU29sdXRpb25UeXBlKSkge1xuICAgICAgY29uc3Qgc29sdXRpb25PYmogPSB0aGlzLmdldFNvbHV0aW9uT2JqKHRoaXMuc29sdXRpb25VVUlELCB0aGlzLnNlbGVjdGVkU29sdXRpb25UeXBlLCB0aGlzLmVkaXRvclN0YXRlLnNvbHV0aW9ucyk7XG4gICAgICBtZXRhZGF0YS5lZGl0b3JTdGF0ZS5zb2x1dGlvbnMgPSBbc29sdXRpb25PYmpdO1xuICAgICAgbWV0YWRhdGEuc29sdXRpb25zID0gW3NvbHV0aW9uT2JqXTtcbiAgICB9XG4gICAgaWYgKF8uaXNFbXB0eSh0aGlzLmVkaXRvclN0YXRlLnNvbHV0aW9ucykpIHtcbiAgICAgIG1ldGFkYXRhLnNvbHV0aW9ucyA9IFtdO1xuICAgIH1cbiAgICBtZXRhZGF0YSA9IF8ubWVyZ2UobWV0YWRhdGEsIHRoaXMuZ2V0RGVmYXVsdFNlc3Npb25Db250ZXh0KCkpO1xuICAgIGlmIChfLmdldCh0aGlzLmNyZWF0aW9uQ29udGV4dCwgJ29iamVjdFR5cGUnKSA9PT0gJ3F1ZXN0aW9uJykge1xuICAgICAgbWV0YWRhdGEucHJvZ3JhbUlkID0gXy5nZXQodGhpcy5lZGl0b3JTZXJ2aWNlLCAnZWRpdG9yQ29uZmlnLmNvbnRleHQucHJvZ3JhbUlkJyk7XG4gICAgICBtZXRhZGF0YS5jb2xsZWN0aW9uSWQgPSBfLmdldCh0aGlzLmVkaXRvclNlcnZpY2UsICdlZGl0b3JDb25maWcuY29udGV4dC5jb2xsZWN0aW9uSWRlbnRpZmllcicpO1xuICAgICAgbWV0YWRhdGEub3JnYW5pc2F0aW9uSWQgPSBfLmdldCh0aGlzLmVkaXRvclNlcnZpY2UsICdlZGl0b3JDb25maWcuY29udGV4dC5jb250cmlidXRpb25PcmdJZCcpO1xuICAgIH1cbiAgICBpZiAodGhpcy5xdWVzdGlvbkludGVyYWN0aW9uVHlwZSA9PT0gJ2Nob2ljZScpIHtcbiAgICAgIG1ldGFkYXRhLnJlc3BvbnNlRGVjbGFyYXRpb24ucmVzcG9uc2UxLm1heFNjb3JlID0gdGhpcy5tYXhTY29yZTtcbiAgICAgIG1ldGFkYXRhLnJlc3BvbnNlRGVjbGFyYXRpb24ucmVzcG9uc2UxLmNvcnJlY3RSZXNwb25zZS5vdXRjb21lcy5TQ09SRSA9IHRoaXMubWF4U2NvcmU7XG4gICAgfVxuICAgIG1ldGFkYXRhID0gXy5tZXJnZShtZXRhZGF0YSwgXy5waWNrQnkodGhpcy5jaGlsZEZvcm1EYXRhLCBfLmlkZW50aXR5KSk7XG4gICAgaWYgKF8uZ2V0KHRoaXMuY3JlYXRpb25Db250ZXh0LCAnb2JqZWN0VHlwZScpID09PSAncXVlc3Rpb24nKSB7XG4gICAgICBtZXRhZGF0YS5pc1Jldmlld01vZGlmaWNhdGlvbkFsbG93ZWQgPSAhIV8uZ2V0KHRoaXMucXVlc3Rpb25NZXRhRGF0YSwgJ2lzUmV2aWV3TW9kaWZpY2F0aW9uQWxsb3dlZCcpO1xuICAgIH1cbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXG4gICAgcmV0dXJuIF8ub21pdChtZXRhZGF0YSwgWydxdWVzdGlvbicsICdudW1iZXJPZk9wdGlvbnMnLCAnb3B0aW9ucycsICdhbGxvd011bHRpU2VsZWN0JywgJ3Nob3dFdmlkZW5jZScsICdldmlkZW5jZU1pbWVUeXBlJywgJ3Nob3dSZW1hcmtzJywgJ21hcmtBc05vdE1hbmRhdG9yeScsICdsZWZ0QW5jaG9yJywgJ3JpZ2h0QW5jaG9yJywgJ3N0ZXAnLCAnbnVtYmVyT25seScsICdjaGFyYWN0ZXJMaW1pdCcsICdkYXRlRm9ybWF0JywgJ2F1dG9DYXB0dXJlJywgJ3JlbWFya3NMaW1pdCcsICdtYXhpbXVtT3B0aW9ucyddKTtcbiAgfVxuXG4gIGdldFJlc3BvbnNlRGVjbGFyYXRpb24odHlwZSkge1xuICAgIGNvbnN0IHJlc3BvbnNlRGVjbGFyYXRpb24gPSB7XG4gICAgICByZXNwb25zZTE6IHtcbiAgICAgICAgdHlwZTogdHlwZSA9PT0gJ3NsaWRlcicgPyAnaW50ZWdlcicgOiAnc3RyaW5nJ1xuICAgICAgfVxuICAgIH07XG4gICAgaWYgKHR5cGUgPT09ICd0ZXh0JyB8fCB0eXBlID09PSAnc2xpZGVyJykge1xuICAgICAgcmVzcG9uc2VEZWNsYXJhdGlvbi5yZXNwb25zZTFbJ21heFNjb3JlJ10gPSB0aGlzLm1heFNjb3JlO1xuICAgIH1cbiAgICByZXR1cm4gcmVzcG9uc2VEZWNsYXJhdGlvbjtcbiAgfVxuXG5cblxuICBnZXRNY3FRdWVzdGlvbkh0bWxCb2R5KHF1ZXN0aW9uLCB0ZW1wbGF0ZUlkKSB7XG4gICAgY29uc3QgbWNxVGVtcGxhdGVDb25maWcgPSB7XG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXG4gICAgICBtY3FCb2R5OiAnPGRpdiBjbGFzcz1cXCdxdWVzdGlvbi1ib2R5XFwnPjxkaXYgY2xhc3M9XFwnbWNxLXRpdGxlXFwnPntxdWVzdGlvbn08L2Rpdj48ZGl2IGRhdGEtY2hvaWNlLWludGVyYWN0aW9uPVxcJ3Jlc3BvbnNlMVxcJyBjbGFzcz1cXCd7dGVtcGxhdGVDbGFzc31cXCc+PC9kaXY+PC9kaXY+J1xuICAgIH07XG4gICAgY29uc3QgeyBtY3FCb2R5IH0gPSBtY3FUZW1wbGF0ZUNvbmZpZztcbiAgICBjb25zdCBxdWVzdGlvbkJvZHkgPSBtY3FCb2R5LnJlcGxhY2UoJ3t0ZW1wbGF0ZUNsYXNzfScsIHRlbXBsYXRlSWQpXG4gICAgICAucmVwbGFjZSgne3F1ZXN0aW9ufScsIHF1ZXN0aW9uKTtcbiAgICByZXR1cm4gcXVlc3Rpb25Cb2R5O1xuICB9XG5cbiAgZ2V0RGVmYXVsdFNlc3Npb25Db250ZXh0KCkge1xuICAgIHJldHVybiBfLm9taXRCeShfLm1lcmdlKFxuICAgICAge1xuICAgICAgICBhdXRob3I6IF8uZ2V0KHRoaXMuZWRpdG9yU2VydmljZS5lZGl0b3JDb25maWcsICdjb250ZXh0LnVzZXIuZnVsbE5hbWUnKSxcbiAgICAgICAgY3JlYXRlZEJ5OiBfLmdldCh0aGlzLmVkaXRvclNlcnZpY2UuZWRpdG9yQ29uZmlnLCAnY29udGV4dC51c2VyLmlkJyksXG4gICAgICAgIC4uLl8ucGljayhfLmdldCh0aGlzLmVkaXRvclNlcnZpY2UuZWRpdG9yQ29uZmlnLCAnY29udGV4dCcpLCBbJ2JvYXJkJywgJ21lZGl1bScsICdncmFkZUxldmVsJywgJ3N1YmplY3QnLCAndG9waWMnXSlcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIC4uLl8ucGljayh0aGlzLnF1ZXN0aW9uU2V0SGllcmFyY2h5LCB0aGlzLmNvbmZpZ1NlcnZpY2Uuc2Vzc2lvbkNvbnRleHQpXG4gICAgICB9XG4gICAgKSwga2V5ID0+IF8uaXNFbXB0eShrZXkpKTtcbiAgfVxuXG4gIHNldFF1ZXN0aW9uVHlwZVZhbHVlcyhtZXRhRGF0YSkge1xuICAgIG1ldGFEYXRhLnNob3dFdmlkZW5jZSA9IHRoaXMuY2hpbGRGb3JtRGF0YS5zaG93RXZpZGVuY2U7XG4gICAgaWYgKG1ldGFEYXRhLnNob3dFdmlkZW5jZSA9PT0gJ1llcycpIHtcbiAgICAgIG1ldGFEYXRhLmV2aWRlbmNlID0ge1xuICAgICAgICByZXF1aXJlZDogJ05vJyxcbiAgICAgICAgbWltZVR5cGU6IHRoaXMuY2hpbGRGb3JtRGF0YS5ldmlkZW5jZU1pbWVUeXBlLFxuICAgICAgICBtaW5Db3VudDogMSxcbiAgICAgICAgbWF4Q291bnQ6IDEsXG4gICAgICAgIHNpemVMaW1pdDogZXZpZGVuY2VTaXplTGltaXQsXG4gICAgICB9O1xuICAgIH1cbiAgICBtZXRhRGF0YS5zaG93UmVtYXJrcyA9IHRoaXMuY2hpbGRGb3JtRGF0YS5zaG93UmVtYXJrcztcbiAgICBpZiAobWV0YURhdGEuc2hvd1JlbWFya3MgPT09ICdZZXMnKSB7XG4gICAgICBtZXRhRGF0YS5yZW1hcmtzID0ge1xuICAgICAgICBtYXhMZW5ndGg6IHRoaXMuY2hpbGRGb3JtRGF0YS5yZW1hcmtzTGltaXQsXG4gICAgICAgIHJlcXVpcmVkOiAnTm8nXG4gICAgICB9O1xuICAgIH1cbiAgICBtZXRhRGF0YS5pbnRlcmFjdGlvbnMgPSBtZXRhRGF0YS5pbnRlcmFjdGlvbnMgfHwge307XG5cbiAgICBtZXRhRGF0YS5pbnRlcmFjdGlvbnMudmFsaWRhdGlvbiA9IHsgcmVxdWlyZWQ6IHRoaXMuY2hpbGRGb3JtRGF0YS5tYXJrQXNOb3RNYW5kYXRvcnkgPT09ICdZZXMnID8gJ05vJyA6ICdZZXMnIH07XG4gICAgaWYgKHRoaXMuY2hpbGRGb3JtRGF0YS5hbGxvd011bHRpU2VsZWN0ID09PSAnWWVzJykge1xuICAgICAgbWV0YURhdGEucmVzcG9uc2VEZWNsYXJhdGlvbi5yZXNwb25zZTEuY2FyZGluYWxpdHkgPSAnbXVsdGlwbGUnO1xuICAgIH0gZWxzZSB7XG4gICAgICBtZXRhRGF0YS5yZXNwb25zZURlY2xhcmF0aW9uLnJlc3BvbnNlMS5jYXJkaW5hbGl0eSA9ICdzaW5nbGUnO1xuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZCh0aGlzLmVkaXRvclNlcnZpY2U/LmVkaXRvckNvbmZpZz8uY29uZmlnPy5yZW5kZXJUYXhvbm9teSkpIHtcbiAgICAgIHRoaXMuY2FsY3VsYXRlTWluTWF4U2NvcmUobWV0YURhdGEpO1xuICAgIH1cblxuICAgIF8uZm9yRWFjaCh0aGlzLnN1Yk1lbnVzLCAoZWw6IGFueSkgPT4ge1xuICAgICAgaWYgKGVsLmlkID09PSAnYWRkSGludCcpIHtcbiAgICAgICAgbWV0YURhdGEuaGludHMgPSB7XG4gICAgICAgICAgZW46IFtlbC52YWx1ZV1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmIChlbC5pZCA9PT0gJ2FkZFRpcCcpIHtcbiAgICAgICAgbWV0YURhdGEuaW5zdHJ1Y3Rpb25zID0ge1xuICAgICAgICAgIGVuOiBbZWwudmFsdWVdXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAoIV8uaXNFbXB0eSh0aGlzLnNsaWRlckRhdGFzKSAmJiB0aGlzLnF1ZXN0aW9uSW50ZXJhY3Rpb25UeXBlID09PSAnc2xpZGVyJykge1xuICAgICAgbWV0YURhdGEuaW50ZXJhY3Rpb25UeXBlcyA9IFt0aGlzLnF1ZXN0aW9uSW50ZXJhY3Rpb25UeXBlXTtcbiAgICAgIG1ldGFEYXRhLnByaW1hcnlDYXRlZ29yeSA9IHRoaXMucXVlc3Rpb25QcmltYXJ5Q2F0ZWdvcnk7XG4gICAgICBtZXRhRGF0YS5pbnRlcmFjdGlvbnMgPSB7XG4gICAgICAgIC4uLm1ldGFEYXRhLmludGVyYWN0aW9ucyxcbiAgICAgICAgcmVzcG9uc2UxOiB7XG4gICAgICAgICAgdmFsaWRhdGlvbjogdGhpcy5zbGlkZXJEYXRhcy52YWxpZGF0aW9uLFxuICAgICAgICAgIHN0ZXA6IHRoaXMuc2xpZGVyRGF0YXMuc3RlcFxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmICh0aGlzLnF1ZXN0aW9uSW50ZXJhY3Rpb25UeXBlID09PSAnZGF0ZScpIHtcbiAgICAgIG1ldGFEYXRhLmludGVyYWN0aW9uVHlwZXMgPSBbdGhpcy5xdWVzdGlvbkludGVyYWN0aW9uVHlwZV07XG4gICAgICBtZXRhRGF0YS5wcmltYXJ5Q2F0ZWdvcnkgPSB0aGlzLnF1ZXN0aW9uUHJpbWFyeUNhdGVnb3J5O1xuICAgICAgbWV0YURhdGEuaW50ZXJhY3Rpb25zID0ge1xuICAgICAgICAuLi5tZXRhRGF0YS5pbnRlcmFjdGlvbnMsXG4gICAgICAgIHJlc3BvbnNlMToge1xuICAgICAgICAgIHZhbGlkYXRpb246IHsgcGF0dGVybjogdGhpcy5jaGlsZEZvcm1EYXRhLmRhdGVGb3JtYXQgfSxcbiAgICAgICAgICBhdXRvQ2FwdHVyZTogdGhpcy5jaGlsZEZvcm1EYXRhLmF1dG9DYXB0dXJlXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucXVlc3Rpb25JbnRlcmFjdGlvblR5cGUgPT09ICd0ZXh0Jykge1xuICAgICAgbWV0YURhdGEuaW50ZXJhY3Rpb25UeXBlcyA9IFt0aGlzLnF1ZXN0aW9uSW50ZXJhY3Rpb25UeXBlXTtcbiAgICAgIG1ldGFEYXRhLnByaW1hcnlDYXRlZ29yeSA9IHRoaXMucXVlc3Rpb25QcmltYXJ5Q2F0ZWdvcnk7XG4gICAgICBtZXRhRGF0YS5pbnRlcmFjdGlvbnMgPSB7XG4gICAgICAgIC4uLm1ldGFEYXRhLmludGVyYWN0aW9ucyxcbiAgICAgICAgcmVzcG9uc2UxOiB7XG4gICAgICAgICAgdmFsaWRhdGlvbjoge1xuICAgICAgICAgICAgbGltaXQ6IHtcbiAgICAgICAgICAgICAgbWF4TGVuZ3RoOiB0aGlzLmNoaWxkRm9ybURhdGEuY2hhcmFjdGVyTGltaXQsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBudW1iZXI6IHRoaXMuY2hpbGRGb3JtRGF0YS5udW1iZXJPbmx5XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgICAvLyAgcmV0dXJuIG1ldGFEYXRhO1xuICB9XG5cbiAgcHJlcGFyZVJlcXVlc3RCb2R5KCkge1xuICAgIGNvbnN0IHF1ZXN0aW9uSWQgPSB0aGlzLnF1ZXN0aW9uSWQgPyB0aGlzLnF1ZXN0aW9uSWQgOiB1dWlkdjQoKTtcbiAgICB0aGlzLm5ld1F1ZXN0aW9uSUQgPSBxdWVzdGlvbklkO1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLnRyZWVOb2RlRGF0YTtcbiAgICBjb25zdCBhY3RpdmVOb2RlID0gdGhpcy50cmVlU2VydmljZS5nZXRBY3RpdmVOb2RlKCk7XG4gICAgY29uc3Qgc2VsZWN0ZWRVbml0SWQgPSBfLmdldChhY3RpdmVOb2RlLCAnZGF0YS5pZCcpO1xuICAgIHRoaXMuZWRpdG9yU2VydmljZS5kYXRhID0ge307XG4gICAgcmV0dXJuIHtcbiAgICAgIG5vZGVzTW9kaWZpZWQ6IHtcbiAgICAgICAgW3F1ZXN0aW9uSWRdOiB7XG4gICAgICAgICAgbWV0YWRhdGE6IHRoaXMuZ2V0UXVlc3Rpb25NZXRhZGF0YSgpLFxuICAgICAgICAgIG9iamVjdFR5cGU6ICdRdWVzdGlvbicsXG4gICAgICAgICAgcm9vdDogZmFsc2UsXG4gICAgICAgICAgaXNOZXc6ICF0aGlzLnF1ZXN0aW9uSWRcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGhpZXJhcmNoeTogdGhpcy5lZGl0b3JTZXJ2aWNlLmdldEhpZXJhcmNoeU9iaihkYXRhLCBxdWVzdGlvbklkLCBzZWxlY3RlZFVuaXRJZClcbiAgICB9O1xuICB9XG5cbiAgcHJlcGFyZVF1ZXN0aW9uQm9keSgpIHtcbiAgICByZXR1cm4gdGhpcy5xdWVzdGlvbklkID9cbiAgICAgIHtcbiAgICAgICAgcXVlc3Rpb246IF8ub21pdCh0aGlzLmdldFF1ZXN0aW9uTWV0YWRhdGEoKSwgWydtaW1lVHlwZScsICdjcmVhdG9yJywgJ2NyZWF0ZWRCeScsICdvcmdhbmlzYXRpb25JZCddKVxuICAgICAgfSA6XG4gICAgICB7XG4gICAgICAgIHF1ZXN0aW9uOiB7XG4gICAgICAgICAgY29kZTogdXVpZHY0KCksXG4gICAgICAgICAgLi4udGhpcy5nZXRRdWVzdGlvbk1ldGFkYXRhKClcbiAgICAgICAgfVxuICAgICAgfTtcbiAgfVxuXG4gIHByZXBhcmVTb3VyY2luZ1VwZGF0ZUJvZHkocXVlc3Rpb25JZHMsIGNvbW1lbnRzPykge1xuICAgIGNvbnN0IHNvdXJjaW5nVXBkYXRlQXR0cmlidXRlID0gdGhpcy5hY3Rpb25UeXBlID09PSAnc291cmNpbmdBcHByb3ZlUXVlc3Rpb24nID8gJ2FjY2VwdGVkQ29udHJpYnV0aW9ucydcbiAgICAgIDogJ3JlamVjdGVkQ29udHJpYnV0aW9ucyc7XG4gICAgY29uc3QgY29sbGVjdGlvbk9iamVjdFR5cGUgPSBfLnJlcGxhY2UoXy5sb3dlckNhc2UodGhpcy5jcmVhdGlvbkNvbnRleHRbJ2NvbGxlY3Rpb25PYmplY3RUeXBlJ10pLCAnICcsICcnKTtcbiAgICBjb25zdCByZXF1ZXN0Qm9keSA9IHtcbiAgICAgIHJlcXVlc3Q6IHtcbiAgICAgICAgW2NvbGxlY3Rpb25PYmplY3RUeXBlXToge1xuICAgICAgICAgIFtzb3VyY2luZ1VwZGF0ZUF0dHJpYnV0ZV06IHF1ZXN0aW9uSWRzXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICAgIGlmICh0aGlzLmFjdGlvblR5cGUgPT09ICdzb3VyY2luZ1JlamVjdFF1ZXN0aW9uJykge1xuICAgICAgcmVxdWVzdEJvZHkucmVxdWVzdFtjb2xsZWN0aW9uT2JqZWN0VHlwZV1bJ3JlamVjdGVkQ29udHJpYnV0aW9uQ29tbWVudHMnXSA9IGNvbW1lbnRzO1xuICAgICAgLy8gcmVxdWVzdEJvZHkucmVxdWVzdFtjb2xsZWN0aW9uT2JqZWN0VHlwZV1bJ3JlamVjdENvbW1lbnQnXSA9IGNvbW1lbnRzO1xuICAgIH1cbiAgICByZXR1cm4gcmVxdWVzdEJvZHk7XG4gIH1cblxuICB1cHNlcnRRdWVzdGlvbihjYWxsYmFjaykge1xuICAgIGNvbnN0IHJlcXVlc3RCb2R5ID0gdGhpcy5wcmVwYXJlUXVlc3Rpb25Cb2R5KCk7XG4gICAgdGhpcy5zaG93SGlkZVNwaW5uZXJMb2FkZXIodHJ1ZSk7XG4gICAgdGhpcy5xdWVzdGlvblNlcnZpY2UudXBzZXJ0UXVlc3Rpb24odGhpcy5xdWVzdGlvbklkLCByZXF1ZXN0Qm9keSkucGlwZShcbiAgICAgIGZpbmFsaXplKCgpID0+IHtcbiAgICAgICAgdGhpcy5zaG93SGlkZVNwaW5uZXJMb2FkZXIoZmFsc2UpO1xuICAgICAgfSkpLnN1YnNjcmliZSgocmVzcG9uc2U6IFNlcnZlclJlc3BvbnNlKSA9PiB7XG4gICAgICAgIGlmICghXy5pbmNsdWRlcyhbJ3N1Ym1pdFF1ZXN0aW9uJ10sIHRoaXMuYWN0aW9uVHlwZSkpIHtcbiAgICAgICAgICB0aGlzLnRvYXN0ZXJTZXJ2aWNlLnN1Y2Nlc3MoXy5nZXQodGhpcy5jb25maWdTZXJ2aWNlLCAnbGFiZWxDb25maWcubWVzc2FnZXMuc3VjY2Vzcy4wMTMnKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXRRdWVzdGlvbklkKF8uZ2V0KHJlc3BvbnNlLCAncmVzdWx0LmlkZW50aWZpZXInKSk7XG4gICAgICAgIGlmIChjYWxsYmFjaykgY2FsbGJhY2soKTtcbiAgICAgIH0sIChlcnI6IFNlcnZlclJlc3BvbnNlKSA9PiB7XG4gICAgICAgIGNvbnN0IGVyckluZm8gPSB7XG4gICAgICAgICAgZXJyb3JNc2c6ICdGYWlsZWQgdG8gc2F2ZSBxdWVzdGlvbi4gUGxlYXNlIHRyeSBhZ2Fpbi4uLicsXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuZWRpdG9yU2VydmljZS5hcGlFcnJvckhhbmRsaW5nKGVyciwgZXJySW5mbyk7XG4gICAgICB9KTtcbiAgfVxuXG4gIGNyZWF0ZVF1ZXN0aW9uKCkge1xuICAgIGNvbnN0IHJlcXVlc3RCb2R5ID0gdGhpcy5wcmVwYXJlUmVxdWVzdEJvZHkoKTtcbiAgICB0aGlzLnNob3dIaWRlU3Bpbm5lckxvYWRlcih0cnVlKTtcbiAgICB0aGlzLnF1ZXN0aW9uU2VydmljZS51cGRhdGVIaWVyYXJjaHlRdWVzdGlvbkNyZWF0ZShyZXF1ZXN0Qm9keSkucGlwZShcbiAgICAgIGZpbmFsaXplKCgpID0+IHtcbiAgICAgICAgdGhpcy5zaG93SGlkZVNwaW5uZXJMb2FkZXIoZmFsc2UpO1xuICAgICAgfSkpLnN1YnNjcmliZSgocmVzcG9uc2U6IFNlcnZlclJlc3BvbnNlKSA9PiB7XG4gICAgICAgIHRoaXMudG9hc3RlclNlcnZpY2Uuc3VjY2VzcyhfLmdldCh0aGlzLmNvbmZpZ1NlcnZpY2UsICdsYWJlbENvbmZpZy5tZXNzYWdlcy5zdWNjZXNzLjAwNycpKTtcbiAgICAgICAgdGhpcy5yZWRpcmVjdFRvUXVlc3Rpb25zZXQoKTtcbiAgICAgIH0sIChlcnI6IFNlcnZlclJlc3BvbnNlKSA9PiB7XG4gICAgICAgIGNvbnN0IGVyckluZm8gPSB7XG4gICAgICAgICAgZXJyb3JNc2c6ICdRdWVzdGlvbiBjcmVhdGluZyBmYWlsZWQuIFBsZWFzZSB0cnkgYWdhaW4uLi4nLFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmVkaXRvclNlcnZpY2UuYXBpRXJyb3JIYW5kbGluZyhlcnIsIGVyckluZm8pO1xuICAgICAgfSk7XG4gIH1cblxuICB1cGRhdGVRdWVzdGlvbigpIHtcbiAgICBjb25zdCByZXF1ZXN0Qm9keSA9IHRoaXMucHJlcGFyZVJlcXVlc3RCb2R5KCk7XG4gICAgdGhpcy5zaG93SGlkZVNwaW5uZXJMb2FkZXIodHJ1ZSk7XG4gICAgdGhpcy5xdWVzdGlvblNlcnZpY2UudXBkYXRlSGllcmFyY2h5UXVlc3Rpb25VcGRhdGUocmVxdWVzdEJvZHkpLnBpcGUoXG4gICAgICBmaW5hbGl6ZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuc2hvd0hpZGVTcGlubmVyTG9hZGVyKGZhbHNlKTtcbiAgICAgIH0pKS5zdWJzY3JpYmUoKHJlc3BvbnNlOiBTZXJ2ZXJSZXNwb25zZSkgPT4ge1xuICAgICAgICB0aGlzLnRvYXN0ZXJTZXJ2aWNlLnN1Y2Nlc3MoXy5nZXQodGhpcy5jb25maWdTZXJ2aWNlLCAnbGFiZWxDb25maWcubWVzc2FnZXMuc3VjY2Vzcy4wMDgnKSk7XG4gICAgICAgIHRoaXMucmVkaXJlY3RUb1F1ZXN0aW9uc2V0KCk7XG4gICAgICB9LCAoZXJyOiBTZXJ2ZXJSZXNwb25zZSkgPT4ge1xuICAgICAgICBjb25zdCBlcnJJbmZvID0ge1xuICAgICAgICAgIGVycm9yTXNnOiAnUXVlc3Rpb24gdXBkYXRpbmcgZmFpbGVkLiBQbGVhc2UgdHJ5IGFnYWluLi4uJyxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5lZGl0b3JTZXJ2aWNlLmFwaUVycm9ySGFuZGxpbmcoZXJyLCBlcnJJbmZvKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgc2F2ZVF1ZXN0aW9ucyhyZXF1ZXN0Qm9keSwgdHlwZSkge1xuICAgIHRoaXMuc2hvd0hpZGVTcGlubmVyTG9hZGVyKHRydWUpO1xuICAgIGNvbnN0IHNlcnZpY2VNZXRob2QgPSB0eXBlID09PSAnY3JlYXRlJyA/XG4gICAgICB0aGlzLnF1ZXN0aW9uU2VydmljZS51cGRhdGVIaWVyYXJjaHlRdWVzdGlvbkNyZWF0ZShyZXF1ZXN0Qm9keSkgOlxuICAgICAgdGhpcy5xdWVzdGlvblNlcnZpY2UudXBkYXRlSGllcmFyY2h5UXVlc3Rpb25VcGRhdGUocmVxdWVzdEJvZHkpO1xuXG4gICAgc2VydmljZU1ldGhvZC5waXBlKFxuICAgICAgZmluYWxpemUoKCkgPT4ge1xuICAgICAgICB0aGlzLnNob3dIaWRlU3Bpbm5lckxvYWRlcihmYWxzZSk7XG4gICAgICB9KSkuc3Vic2NyaWJlKChyZXNwb25zZTogU2VydmVyUmVzcG9uc2UpID0+IHtcbiAgICAgICAgY29uc3Qgc3VjY2Vzc01zZyA9IHR5cGUgPT09ICdjcmVhdGUnID9cbiAgICAgICAgICBfLmdldCh0aGlzLmNvbmZpZ1NlcnZpY2UsICdsYWJlbENvbmZpZy5tZXNzYWdlcy5zdWNjZXNzLjAwNycpIDpcbiAgICAgICAgICBfLmdldCh0aGlzLmNvbmZpZ1NlcnZpY2UsICdsYWJlbENvbmZpZy5tZXNzYWdlcy5zdWNjZXNzLjAwOCcpO1xuICAgICAgICB0aGlzLnRvYXN0ZXJTZXJ2aWNlLnN1Y2Nlc3Moc3VjY2Vzc01zZyk7XG4gICAgICAgIHRoaXMucmVkaXJlY3RUb1F1ZXN0aW9uc2V0KCk7XG4gICAgICB9LCAoZXJyOiBTZXJ2ZXJSZXNwb25zZSkgPT4ge1xuICAgICAgICBjb25zdCBlcnJJbmZvID0ge1xuICAgICAgICAgIGVycm9yTXNnOiBgUXVlc3Rpb24gJHt0eXBlID09PSAnY3JlYXRlJyA/ICdjcmVhdGluZycgOiAndXBkYXRpbmcnfSBmYWlsZWQuIFBsZWFzZSB0cnkgYWdhaW4uLi5gLFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmVkaXRvclNlcnZpY2UuYXBpRXJyb3JIYW5kbGluZyhlcnIsIGVyckluZm8pO1xuICAgICAgfSk7XG4gIH1cblxuICBzaG93SGlkZVNwaW5uZXJMb2FkZXIoc3RhdHVzOiBib29sZWFuKSB7XG4gICAgdGhpcy5idXR0b25Mb2FkZXJzLnNhdmVCdXR0b25Mb2FkZXIgPSBzdGF0dXM7XG4gIH1cblxuICBwcmV2aWV3Q29udGVudCgpIHtcbiAgICB0aGlzLnZhbGlkYXRlUXVlc3Rpb25EYXRhKCk7XG4gICAgaWYgKHRoaXMuc2hvd0Zvcm1FcnJvciA9PT0gZmFsc2UgJiYgdGhpcy5xdWVzdGlvbk1ldGFkYXRhRm9ybVN0YXR1cyA9PT0gdHJ1ZSkge1xuICAgICAgdGhpcy5wcmV2aWV3Rm9ybURhdGEoZmFsc2UpO1xuICAgICAgY29uc3QgYWN0aXZlTm9kZSA9IHRoaXMudHJlZVNlcnZpY2UuZ2V0QWN0aXZlTm9kZSgpO1xuICAgICAgbGV0IHF1ZXN0aW9uSWQgPSAnJztcbiAgICAgIGlmIChfLmlzVW5kZWZpbmVkKHRoaXMucXVlc3Rpb25JZCkpIHtcbiAgICAgICAgcXVlc3Rpb25JZCA9IHRoaXMudGVtcFF1ZXN0aW9uSWQ7XG4gICAgICAgIHRoaXMuc2V0UGFyZW50Q29uZmlnKGFjdGl2ZU5vZGU/LmRhdGE/Lm1ldGFkYXRhKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHF1ZXN0aW9uSWQgPSB0aGlzLnF1ZXN0aW9uSWQ7XG4gICAgICAgIHRoaXMuc2V0UGFyZW50Q29uZmlnKGFjdGl2ZU5vZGU/LnBhcmVudD8uZGF0YT8ubWV0YWRhdGEpO1xuICAgICAgfVxuICAgICAgdGhpcy5xdWVzdGlvblNldEhpZXJhcmNoeS5jaGlsZE5vZGVzID0gW3F1ZXN0aW9uSWRdO1xuICAgICAgdGhpcy5zZXRRdW1sUGxheWVyRGF0YShxdWVzdGlvbklkKTtcbiAgICAgIHRoaXMuc2hvd1ByZXZpZXcgPSB0cnVlO1xuICAgICAgdGhpcy50b29sYmFyQ29uZmlnLnNob3dQcmV2aWV3ID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50b2FzdGVyU2VydmljZS5lcnJvcihfLmdldCh0aGlzLmNvbmZpZ1NlcnZpY2UsICdsYWJlbENvbmZpZy5tZXNzYWdlcy5lcnJvci4wNDQnKSk7XG4gICAgfVxuICB9XG5cbiAgc2V0UGFyZW50Q29uZmlnKHBhcmVudENvbmZpZykge1xuICAgIHRoaXMucXVlc3Rpb25TZXRIaWVyYXJjaHkuc2hvd1NvbHV0aW9ucyA9ICFfLmlzVW5kZWZpbmVkKHBhcmVudENvbmZpZz8uc2hvd1NvbHV0aW9ucykgP1xuICAgICAgcGFyZW50Q29uZmlnLnNob3dTb2x1dGlvbnMgOiAnTm8nO1xuICAgIHRoaXMucXVlc3Rpb25TZXRIaWVyYXJjaHkuc2h1ZmZsZSA9ICFfLmlzVW5kZWZpbmVkKHBhcmVudENvbmZpZz8uc2h1ZmZsZSkgP1xuICAgICAgcGFyZW50Q29uZmlnLnNodWZmbGUgOiB0cnVlO1xuICAgIHRoaXMucXVlc3Rpb25TZXRIaWVyYXJjaHkuc2hvd0ZlZWRiYWNrID0gIV8uaXNVbmRlZmluZWQocGFyZW50Q29uZmlnPy5zaG93RmVlZGJhY2spID9cbiAgICAgIHBhcmVudENvbmZpZy5zaG93RmVlZGJhY2sgOiAnTm8nO1xuICB9XG5cbiAgc2V0UXVtbFBsYXllckRhdGEocXVlc3Rpb25JZDogc3RyaW5nKSB7XG4gICAgY29uc3QgcXVlc3Rpb25NZXRhZGF0YTogYW55ID0gXy5jbG9uZURlZXAodGhpcy5nZXRRdWVzdGlvbk1ldGFkYXRhKCkpO1xuICAgIHF1ZXN0aW9uTWV0YWRhdGEuaWRlbnRpZmllciA9IHF1ZXN0aW9uSWQ7XG4gICAgdGhpcy5xdWVzdGlvblNldEhpZXJhcmNoeS5jaGlsZHJlbiA9IFtxdWVzdGlvbk1ldGFkYXRhXTtcbiAgICBpZiAodGhpcy5xdWVzdGlvblNldEhpZXJhcmNoeS5zaHVmZmxlID09PSB0cnVlKSB7XG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tc3RyaW5nLWxpdGVyYWxcbiAgICAgIHRoaXMucXVlc3Rpb25TZXRIaWVyYXJjaHlbJ21heFNjb3JlJ10gPSAxO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAocXVlc3Rpb25NZXRhZGF0YS5xVHlwZSA9PT0gJ1NBJykge1xuICAgICAgICB0aGlzLnF1ZXN0aW9uU2V0SGllcmFyY2h5ID0gXy5vbWl0KHRoaXMucXVlc3Rpb25TZXRIaWVyYXJjaHksICdtYXhTY29yZScpO1xuICAgICAgfSBlbHNlIGlmIChxdWVzdGlvbk1ldGFkYXRhLm1heFNjb3JlKSB7XG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1zdHJpbmctbGl0ZXJhbFxuICAgICAgICB0aGlzLnF1ZXN0aW9uU2V0SGllcmFyY2h5WydtYXhTY29yZSddID0gdGhpcy5tYXhTY29yZTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5lZGl0b3JDdXJzb3Iuc2V0UXVlc3Rpb25NYXAocXVlc3Rpb25JZCwgcXVlc3Rpb25NZXRhZGF0YSk7XG4gIH1cblxuICBnZXRQbGF5ZXJFdmVudHMoZXZlbnQpIHtcbiAgICBjb25zb2xlLmxvZygnZ2V0IHBsYXllciBldmVudHMnLCBKU09OLnN0cmluZ2lmeShldmVudCkpO1xuICB9XG5cbiAgZ2V0VGVsZW1ldHJ5RXZlbnRzKGV2ZW50KSB7XG4gICAgY29uc29sZS5sb2coJ2V2ZW50IGlzIGZvciB0ZWxlbWV0cnknLCBKU09OLnN0cmluZ2lmeShldmVudCkpO1xuICB9XG5cbiAgc2V0UXVlc3Rpb25UaXRsZShxdWVzdGlvbklkPykge1xuICAgIGxldCBpbmRleDtcbiAgICBsZXQgcXVlc3Rpb25UaXRsZSA9ICcnO1xuICAgIGxldCBoaWVyYXJjaHlDaGlsZHJlbiA9IHRoaXMudHJlZVNlcnZpY2UuZ2V0Q2hpbGRyZW4oKTtcbiAgICBpZiAoIV8uaXNVbmRlZmluZWQocXVlc3Rpb25JZCkpIHtcbiAgICAgIGNvbnN0IHBhcmVudE5vZGUgPSB0aGlzLnRyZWVTZXJ2aWNlLmdldEFjdGl2ZU5vZGUoKS5nZXRQYXJlbnQoKTtcbiAgICAgIGhpZXJhcmNoeUNoaWxkcmVuID0gcGFyZW50Tm9kZS5nZXRDaGlsZHJlbigpO1xuICAgICAgaW5kZXggPSBfLmZpbmRJbmRleChoaWVyYXJjaHlDaGlsZHJlbiwgKG5vZGUpID0+IG5vZGUuZGF0YS5pZCA9PT0gcXVlc3Rpb25JZCk7XG4gICAgICBjb25zdCBxdWVzdGlvbiA9IGhpZXJhcmNoeUNoaWxkcmVuW2luZGV4XTtcbiAgICAgIHF1ZXN0aW9uVGl0bGUgPSBgUSR7KGluZGV4ICsgMSkudG9TdHJpbmcoKX0gfCBgICsgcXVlc3Rpb24uZGF0YS5wcmltYXJ5Q2F0ZWdvcnk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGluZGV4ID0gaGllcmFyY2h5Q2hpbGRyZW4ubGVuZ3RoO1xuICAgICAgcXVlc3Rpb25UaXRsZSA9IGBRJHsoaW5kZXggKyAxKS50b1N0cmluZygpfSB8IGA7XG4gICAgICBpZiAoIV8uaXNVbmRlZmluZWQodGhpcy5xdWVzdGlvblByaW1hcnlDYXRlZ29yeSkpIHtcbiAgICAgICAgcXVlc3Rpb25UaXRsZSA9IHF1ZXN0aW9uVGl0bGUgKyB0aGlzLnF1ZXN0aW9uUHJpbWFyeUNhdGVnb3J5O1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnRvb2xiYXJDb25maWcudGl0bGUgPSBxdWVzdGlvblRpdGxlO1xuICB9XG4gIG91dHB1dChldmVudCkgeyB9XG5cbiAgb25TdGF0dXNDaGFuZ2VzKGV2ZW50KSB7XG4gICAgY29uc29sZS5sb2coZXZlbnQpO1xuICAgIGlmIChfLmhhcyhldmVudCwgJ2lzVmFsaWQnKSkge1xuICAgICAgdGhpcy5xdWVzdGlvbk1ldGFkYXRhRm9ybVN0YXR1cyA9IGV2ZW50LmlzVmFsaWQ7XG4gICAgfVxuICB9XG5cbiAgdmFsdWVDaGFuZ2VzKGV2ZW50KSB7XG4gICAgaWYgKF8uaGFzKGV2ZW50LCAnbWF4U2NvcmUnKSkge1xuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnJhZGl4XG4gICAgICBldmVudC5tYXhTY29yZSA9ICFfLmlzTnVsbChldmVudC5tYXhTY29yZSkgPyBwYXJzZUludChldmVudC5tYXhTY29yZSkgOiB0aGlzLm1heFNjb3JlO1xuICAgICAgdGhpcy5tYXhTY29yZSA9IGV2ZW50Lm1heFNjb3JlO1xuICAgIH1cbiAgICB0aGlzLmNoaWxkRm9ybURhdGEgPSBldmVudDtcbiAgfVxuICB2YWxpZGF0ZUZvcm1GaWVsZHMoKSB7XG4gICAgXy5mb3JFYWNoKHRoaXMubGVhZkZvcm1Db25maWcsIChmb3JtRmllbGRDYXRlZ29yeSkgPT4ge1xuICAgICAgaWYgKGZvcm1GaWVsZENhdGVnb3J5LnJlcXVpcmVkICYmICF0aGlzLmNoaWxkRm9ybURhdGFbZm9ybUZpZWxkQ2F0ZWdvcnkuY29kZV0pIHtcbiAgICAgICAgdGhpcy5zaG93Rm9ybUVycm9yID0gdHJ1ZTtcbiAgICAgICAgdGhpcy50b2FzdGVyU2VydmljZS5lcnJvcihfLmdldCh0aGlzLmNvbmZpZ1NlcnZpY2UsICdsYWJlbENvbmZpZy5tZXNzYWdlcy5lcnJvci4wMDgnKSk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBwcmV2aWV3Rm9ybURhdGEoc3RhdHVzKSB7XG4gICAgY29uc3QgZm9ybUNvbmZpZyA9IF8uY2xvbmVEZWVwKHRoaXMubGVhZkZvcm1Db25maWcpO1xuICAgIHRoaXMucXVlc3Rpb25Gb3JtQ29uZmlnID0gbnVsbDtcbiAgICBfLmZvckVhY2goZm9ybUNvbmZpZywgKGZvcm1GaWVsZENhdGVnb3J5KSA9PiB7XG4gICAgICBpZiAoXy5oYXMoZm9ybUZpZWxkQ2F0ZWdvcnksICdlZGl0YWJsZScpICYmICFfLmlzVW5kZWZpbmVkKGZvcm1GaWVsZENhdGVnb3J5LmVkaXRhYmxlKSkge1xuICAgICAgICBmb3JtRmllbGRDYXRlZ29yeS5lZGl0YWJsZSA9IHN0YXR1cyA/IF8uZmluZCh0aGlzLmxlYWZGb3JtQ29uZmlnLCB7IGNvZGU6IGZvcm1GaWVsZENhdGVnb3J5LmNvZGUgfSkuZWRpdGFibGUgOiBzdGF0dXM7XG4gICAgICAgIGZvcm1GaWVsZENhdGVnb3J5LmRlZmF1bHQgPSB0aGlzLmNoaWxkRm9ybURhdGFbZm9ybUZpZWxkQ2F0ZWdvcnkuY29kZV07XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5sZWFmRm9ybUNvbmZpZyA9IGZvcm1Db25maWc7XG4gIH1cbiAgcG9wdWxhdGVGb3JtRGF0YSgpIHtcbiAgICB0aGlzLmNoaWxkRm9ybURhdGEgPSB7fTtcbiAgICBfLmZvckVhY2godGhpcy5sZWFmRm9ybUNvbmZpZywgKGZvcm1GaWVsZENhdGVnb3J5KSA9PiB7XG4gICAgICBpZiAoIV8uaXNVbmRlZmluZWQodGhpcy5xdWVzdGlvbklkKSkge1xuICAgICAgICBpZiAoZm9ybUZpZWxkQ2F0ZWdvcnkuY29kZSA9PT0gJ21heFNjb3JlJyAmJiB0aGlzLnF1ZXN0aW9uSW50ZXJhY3Rpb25UeXBlID09PSAnY2hvaWNlJykge1xuICAgICAgICAgIHRoaXMuY2hpbGRGb3JtRGF0YVtmb3JtRmllbGRDYXRlZ29yeS5jb2RlXSA9IF8uaGFzKHRoaXMucXVlc3Rpb25NZXRhRGF0YSwgJ3Jlc3BvbnNlRGVjbGFyYXRpb24ucmVzcG9uc2UxLm1heFNjb3JlJykgP1xuICAgICAgICAgICAgXy5nZXQodGhpcy5xdWVzdGlvbk1ldGFEYXRhLCAncmVzcG9uc2VEZWNsYXJhdGlvbi5yZXNwb25zZTEubWF4U2NvcmUnKSA6IHRoaXMubWF4U2NvcmU7XG4gICAgICAgIH0gZWxzZSBpZiAoZm9ybUZpZWxkQ2F0ZWdvcnkuY29kZSA9PT0gJ2FsbG93TXVsdGlTZWxlY3QnICYmIHRoaXMucXVlc3Rpb25JbnRlcmFjdGlvblR5cGUgPT09ICdjaG9pY2UnKSB7XG4gICAgICAgICAgdGhpcy5jaGlsZEZvcm1EYXRhW2Zvcm1GaWVsZENhdGVnb3J5LmNvZGVdID0gXy5nZXQodGhpcy5xdWVzdGlvbk1ldGFEYXRhLCAncmVzcG9uc2VEZWNsYXJhdGlvbi5yZXNwb25zZTEuY2FyZGluYWxpdHknKSA9PT0gJ211bHRpcGxlJyA/ICdZZXMnIDogJ05vJztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLnF1ZXN0aW9uTWV0YURhdGEgJiYgXy5oYXModGhpcy5xdWVzdGlvbk1ldGFEYXRhLCBmb3JtRmllbGRDYXRlZ29yeS5jb2RlKSkge1xuICAgICAgICAgIGZvcm1GaWVsZENhdGVnb3J5LmRlZmF1bHQgPSB0aGlzLnF1ZXN0aW9uTWV0YURhdGFbZm9ybUZpZWxkQ2F0ZWdvcnkuY29kZV07XG4gICAgICAgICAgdGhpcy5jaGlsZEZvcm1EYXRhW2Zvcm1GaWVsZENhdGVnb3J5LmNvZGVdID0gdGhpcy5xdWVzdGlvbk1ldGFEYXRhW2Zvcm1GaWVsZENhdGVnb3J5LmNvZGVdO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgYXZhaWxhYmxlQWxpYXMgPSB7XG4gICAgICAgICAgICBkYXRlRm9ybWF0OiAnaW50ZXJhY3Rpb25zLnJlc3BvbnNlMS52YWxpZGF0aW9uLnBhdHRlcm4nLFxuICAgICAgICAgICAgYXV0b0NhcHR1cmU6ICdpbnRlcmFjdGlvbnMucmVzcG9uc2UxLmF1dG9DYXB0dXJlJyxcbiAgICAgICAgICAgIG1hcmtBc05vdE1hbmRhdG9yeTogJ2ludGVyYWN0aW9ucy52YWxpZGF0aW9uLnJlcXVpcmVkJyxcbiAgICAgICAgICAgIG51bWJlck9ubHk6ICdpbnRlcmFjdGlvbnMucmVzcG9uc2UxLnR5cGUubnVtYmVyJyxcbiAgICAgICAgICAgIGNoYXJhY3RlckxpbWl0OiAnaW50ZXJhY3Rpb25zLnJlc3BvbnNlMS52YWxpZGF0aW9uLmxpbWl0Lm1heExlbmd0aCcsXG4gICAgICAgICAgICByZW1hcmtzTGltaXQ6ICdyZW1hcmtzLm1heExlbmd0aCcsXG4gICAgICAgICAgICBldmlkZW5jZU1pbWVUeXBlOiAnZXZpZGVuY2UubWltZVR5cGUnXG4gICAgICAgICAgfTtcbiAgICAgICAgICBpZiAodGhpcy5xdWVzdGlvbk1ldGFEYXRhICYmIF8uaGFzKGF2YWlsYWJsZUFsaWFzLCBmb3JtRmllbGRDYXRlZ29yeS5jb2RlKSkge1xuICAgICAgICAgICAgbGV0IGRlZmF1bHRWYWx1ZSA9IF8uZ2V0KHRoaXMucXVlc3Rpb25NZXRhRGF0YSwgYXZhaWxhYmxlQWxpYXNbZm9ybUZpZWxkQ2F0ZWdvcnkuY29kZV0pO1xuICAgICAgICAgICAgaWYgKGZvcm1GaWVsZENhdGVnb3J5LmNvZGUgPT09ICdtYXJrQXNOb3RNYW5kYXRvcnknKSB7XG4gICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IGRlZmF1bHRWYWx1ZSA9PT0gJ1llcycgPyAnTm8nIDogJ1llcyc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3JtRmllbGRDYXRlZ29yeS5kZWZhdWx0ID0gZGVmYXVsdFZhbHVlO1xuICAgICAgICAgICAgdGhpcy5jaGlsZEZvcm1EYXRhW2Zvcm1GaWVsZENhdGVnb3J5LmNvZGVdID0gZGVmYXVsdFZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcblxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXG4gICAgICAgIGNvbnN0IHF1ZXN0aW9uU2V0RGVmYXVsdFZhbHVlID0gXy5nZXQodGhpcy5xdWVzdGlvblNldEhpZXJhcmNoeSwgZm9ybUZpZWxkQ2F0ZWdvcnkuY29kZSkgPyBfLmdldCh0aGlzLnF1ZXN0aW9uU2V0SGllcmFyY2h5LCBmb3JtRmllbGRDYXRlZ29yeS5jb2RlKSA6ICcnO1xuICAgICAgICBjb25zdCBkZWZhdWx0RWRpdFN0YXR1cyA9IF8uZmluZCh0aGlzLmluaXRpYWxMZWFmRm9ybUNvbmZpZywgeyBjb2RlOiBmb3JtRmllbGRDYXRlZ29yeS5jb2RlIH0pLmVkaXRhYmxlID09PSB0cnVlID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICBmb3JtRmllbGRDYXRlZ29yeS5kZWZhdWx0ID0gZGVmYXVsdEVkaXRTdGF0dXMgPyAnJyA6IHF1ZXN0aW9uU2V0RGVmYXVsdFZhbHVlO1xuICAgICAgICB0aGlzLmNoaWxkRm9ybURhdGFbZm9ybUZpZWxkQ2F0ZWdvcnkuY29kZV0gPSBmb3JtRmllbGRDYXRlZ29yeS5kZWZhdWx0O1xuICAgICAgICBpZiAoZm9ybUZpZWxkQ2F0ZWdvcnkuY29kZSA9PT0gJ21heFNjb3JlJyAmJiB0aGlzLnF1ZXN0aW9uSW50ZXJhY3Rpb25UeXBlID09PSAnY2hvaWNlJykge1xuICAgICAgICAgIHRoaXMuY2hpbGRGb3JtRGF0YVtmb3JtRmllbGRDYXRlZ29yeS5jb2RlXSA9IHRoaXMubWF4U2NvcmU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLmZldGNoRnJhbWVXb3JrRGV0YWlscygpO1xuICAgICh0aGlzLmlzUmVhZE9ubHlNb2RlID09PSB0cnVlICYmICFfLmlzVW5kZWZpbmVkKHRoaXMuZWRpdG9yU2VydmljZT8uZWRpdG9yQ29uZmlnPy5jb25maWc/LnJlbmRlclRheG9ub215KSkgPyB0aGlzLnByZXZpZXdGb3JtRGF0YShmYWxzZSkgOiB0aGlzLnByZXZpZXdGb3JtRGF0YSh0cnVlKTtcbiAgfVxuXG4gIHN1Yk1lbnVDaGFuZ2UoeyBpbmRleCwgdmFsdWUgfSkge1xuICAgIGlmICh0aGlzLnN1Yk1lbnVzW2luZGV4XS5pZCA9PT0gJ2FkZERlcGVuZGFudFF1ZXN0aW9uJykge1xuICAgICAgdGhpcy5zaG93QWRkU2Vjb25kYXJ5UXVlc3Rpb25DYXQgPSB0cnVlO1xuICAgICAgdGhpcy5zYXZlQ29udGVudCgpO1xuICAgICAgaWYgKHRoaXMuc2hvd0Zvcm1FcnJvcikge1xuICAgICAgICB0aGlzLnNob3dBZGRTZWNvbmRhcnlRdWVzdGlvbkNhdCA9IGZhbHNlO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuc3ViTWVudXNbaW5kZXhdLnZhbHVlID0gdmFsdWU7XG4gIH1cblxuICBnZXQgZGVwZW5kZW50UXVlc3Rpb25zKCkge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gdGhpcy5zdWJNZW51cy5maWx0ZXIobWVudSA9PiBtZW51LmlkID09PSAnYWRkRGVwZW5kYW50UXVlc3Rpb24nKVswXS52YWx1ZTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG4gIHN1Yk1lbnVDb25maWcoKSB7XG4gICAgdGhpcy5zdWJNZW51cyA9IFtcbiAgICAgIHtcbiAgICAgICAgaWQ6ICdhZGRIaW50JyxcbiAgICAgICAgbmFtZTogJ0FkZCBIaW50JyxcbiAgICAgICAgdmFsdWU6IF8uZ2V0KHRoaXMucXVlc3Rpb25NZXRhRGF0YSwgJ2hpbnRzLmVuWzBdJyksXG4gICAgICAgIGxhYmVsOiAnSGludCcsXG4gICAgICAgIGVuYWJsZWQ6IF8uZ2V0KHRoaXMucXVlc3Rpb25NZXRhRGF0YSwgJ2hpbnRzLmVuWzBdJykgPyB0cnVlIDogZmFsc2UsXG4gICAgICAgIHR5cGU6ICdpbnB1dCcsXG4gICAgICAgIHNob3c6IF8uZ2V0KHRoaXMuc291cmNpbmdTZXR0aW5ncywgJ3Nob3dBZGRIaW50cycpXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBpZDogJ2FkZFRpcCcsXG4gICAgICAgIG5hbWU6ICdBZGQgVGlwJyxcbiAgICAgICAgdmFsdWU6IF8uZ2V0KHRoaXMucXVlc3Rpb25NZXRhRGF0YSwgJ2luc3RydWN0aW9ucy5lblswXScpLFxuICAgICAgICBsYWJlbDogJ1RpcCcsXG4gICAgICAgIGVuYWJsZWQ6IF8uZ2V0KHRoaXMucXVlc3Rpb25NZXRhRGF0YSwgJ2luc3RydWN0aW9ucy5lblswXScpID8gdHJ1ZSA6IGZhbHNlLFxuICAgICAgICB0eXBlOiAnaW5wdXQnLFxuICAgICAgICBzaG93OiBfLmdldCh0aGlzLnNvdXJjaW5nU2V0dGluZ3MsICdzaG93QWRkVGlwcycpXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBpZDogJ2FkZERlcGVuZGFudFF1ZXN0aW9uJyxcbiAgICAgICAgbmFtZTogJ0FkZCBEZXBlbmRhbnQgUXVlc3Rpb24nLFxuICAgICAgICBsYWJlbDogJycsXG4gICAgICAgIHZhbHVlOiBbXSxcbiAgICAgICAgZW5hYmxlZDogZmFsc2UsXG4gICAgICAgIHR5cGU6ICcnLFxuICAgICAgICBzaG93OiBfLmdldCh0aGlzLnNvdXJjaW5nU2V0dGluZ3MsICdzaG93QWRkU2Vjb25kYXJ5UXVlc3Rpb24nKSAmJiAhdGhpcy5xdWVzdGlvbklucHV0LnNldENoaWxkUXVlc3RvblxuICAgICAgfSxcbiAgICBdO1xuICAgIGlmICghXy5nZXQodGhpcy5zb3VyY2luZ1NldHRpbmdzLCAnc2hvd0FkZFNlY29uZGFyeVF1ZXN0aW9uJykgJiYgIXRoaXMucXVlc3Rpb25JbnB1dC5zZXRDaGlsZFF1ZXN0b24pIHtcbiAgICAgIHRoaXMuc2hvd09wdGlvbnMgPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zaG93T3B0aW9ucyA9ICh0aGlzLnF1ZXN0aW9uSW5wdXQuc2V0Q2hpbGRRdWVzdG9uID09PSB0cnVlKSA/IHRydWUgOiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5vbkNvbXBvbmVudERlc3Ryb3kkLm5leHQoKTtcbiAgICB0aGlzLm9uQ29tcG9uZW50RGVzdHJveSQuY29tcGxldGUoKTtcbiAgICB0aGlzLmVkaXRvckN1cnNvci5jbGVhclF1ZXN0aW9uTWFwKCk7XG4gIH1cblxuICBzbGlkZXJEYXRhKCRldmVudCkge1xuICAgIGNvbnN0IHZhbCA9ICRldmVudDtcbiAgICBjb25zdCBvYmogPSB7XG4gICAgICB2YWxpZGF0aW9uOiB7XG4gICAgICAgIHJhbmdlOiB7XG4gICAgICAgICAgbWluOiAnJyxcbiAgICAgICAgICBtYXg6ICcnXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBzdGVwOiAnJ1xuICAgIH07XG4gICAgaWYgKHZhbC5sZWZ0QW5jaG9yKSB7XG4gICAgICBvYmoudmFsaWRhdGlvbi5yYW5nZS5taW4gPSB2YWwubGVmdEFuY2hvcjtcbiAgICB9XG4gICAgaWYgKHZhbC5yaWdodEFuY2hvcikge1xuICAgICAgb2JqLnZhbGlkYXRpb24ucmFuZ2UubWF4ID0gdmFsLnJpZ2h0QW5jaG9yO1xuICAgIH1cbiAgICBpZiAodmFsLnN0ZXApIHtcbiAgICAgIG9iai5zdGVwID0gdmFsLnN0ZXA7XG4gICAgfVxuICAgIHRoaXMuc2xpZGVyRGF0YXMgPSBvYmo7XG4gIH1cblxuICBvcHRpb25IYW5kbGVyKGUpIHtcbiAgICB0aGlzLnRhcmdldE9wdGlvbiA9IGUudGFyZ2V0LnZhbHVlO1xuICB9XG5cblxuICBidWlsZENvbmRpdGlvbih0eXBlKSB7XG4gICAgaWYgKHRoaXMuY29uZGl0aW9uID09PSAnZGVmYXVsdCcgfHwgXy5pc0VtcHR5KHRoaXMuc2VsZWN0ZWRPcHRpb25zKSkge1xuICAgICAgdGhpcy50b2FzdGVyU2VydmljZS5lcnJvcihfLmdldCh0aGlzLmNvbmZpZ1NlcnZpY2UsICdsYWJlbENvbmZpZy5tZXNzYWdlcy5lcnJvci4wMzgnKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHF1ZXN0aW9uSWQgPSB0aGlzLnF1ZXN0aW9uSWQgPyB0aGlzLnF1ZXN0aW9uSWQgOiB1dWlkdjQoKTtcbiAgICBjb25zdCBkYXRhID0gdGhpcy50cmVlTm9kZURhdGE7XG4gICAgY29uc3QgaGllcmFyY2h5RGF0YSA9IHRoaXMuZWRpdG9yU2VydmljZS5nZXRIaWVyYXJjaHlPYmooZGF0YSwgJycsIHRoaXMuc2VsZWN0ZWRTZWN0aW9uSWQpO1xuICAgIGNvbnN0IHNlY3Rpb25EYXRhID0gXy5nZXQoaGllcmFyY2h5RGF0YSwgYCR7dGhpcy5zZWxlY3RlZFNlY3Rpb25JZH1gKTtcbiAgICBjb25zdCBzZWN0aW9uTmFtZSA9IHNlY3Rpb25EYXRhLm5hbWU7XG4gICAgY29uc3QgYnJhbmNoaW5nTG9naWMgPSB7XG4gICAgICAuLi50aGlzLmJyYW5jaGluZ0xvZ2ljLFxuICAgICAgW3RoaXMuZWRpdG9yU2VydmljZS5wYXJlbnRJZGVudGlmaWVyXToge1xuICAgICAgICB0YXJnZXQ6IHRoaXMudXBkYXRlVGFyZ2V0KHF1ZXN0aW9uSWQpLFxuICAgICAgICBwcmVDb25kaXRpb246IHt9LFxuICAgICAgICBzb3VyY2U6IFtdXG4gICAgICB9LFxuICAgICAgW3F1ZXN0aW9uSWRdOiB7XG4gICAgICAgIHRhcmdldDogW10sXG4gICAgICAgIHNvdXJjZTogW3RoaXMuZWRpdG9yU2VydmljZS5wYXJlbnRJZGVudGlmaWVyXSxcbiAgICAgICAgcHJlQ29uZGl0aW9uOiB7XG4gICAgICAgICAgYW5kOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIFt0aGlzLmNvbmRpdGlvbl06IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICB2YXI6IGAke3RoaXMuZWRpdG9yU2VydmljZS5wYXJlbnRJZGVudGlmaWVyfS4ke3RoaXMucmVzcG9uc2VWYXJpYWJsZX0udmFsdWVgLFxuICAgICAgICAgICAgICAgICAgdHlwZTogJ3Jlc3BvbnNlRGVjbGFyYXRpb24nLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZE9wdGlvbnMsXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH07XG4gICAgdGhpcy51cGRhdGVUcmVlQ2FjaGUoc2VjdGlvbk5hbWUsIGJyYW5jaGluZ0xvZ2ljLCB0aGlzLnNlbGVjdGVkU2VjdGlvbklkKTtcbiAgICBjb25zdCBtZXRhRGF0YSA9IHRoaXMuZ2V0UXVlc3Rpb25NZXRhZGF0YSgpO1xuICAgIHRoaXMuc2V0UXVlc3Rpb25UeXBlVmFsdWVzKG1ldGFEYXRhKTtcbiAgICBjb25zdCBmaW5hbFJlc3VsdCA9IHtcbiAgICAgIG5vZGVzTW9kaWZpZWQ6IHtcbiAgICAgICAgW3F1ZXN0aW9uSWRdOiB7XG4gICAgICAgICAgbWV0YWRhdGE6IG1ldGFEYXRhLFxuICAgICAgICAgIG9iamVjdFR5cGU6ICdRdWVzdGlvbicsXG4gICAgICAgICAgcm9vdDogZmFsc2UsXG4gICAgICAgICAgaXNOZXc6IHRoaXMucXVlc3Rpb25JZCA/IGZhbHNlIDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBbdGhpcy5zZWxlY3RlZFNlY3Rpb25JZF06IHtcbiAgICAgICAgICAuLi50aGlzLnRyZWVTZXJ2aWNlLnRyZWVDYWNoZS5ub2Rlc01vZGlmaWVkW3RoaXMuc2VsZWN0ZWRTZWN0aW9uSWRdXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBoaWVyYXJjaHk6IHRoaXMuZWRpdG9yU2VydmljZS5nZXRIaWVyYXJjaHlPYmooZGF0YSwgcXVlc3Rpb25JZCwgdGhpcy5zZWxlY3RlZFNlY3Rpb25JZCwgdGhpcy5lZGl0b3JTZXJ2aWNlLnBhcmVudElkZW50aWZpZXIpXG4gICAgfTtcbiAgICB0aGlzLnNhdmVRdWVzdGlvbnMoZmluYWxSZXN1bHQsIHR5cGUpO1xuICB9XG5cbiAgdXBkYXRlVGFyZ2V0KHF1ZXN0aW9uSWQpIHtcbiAgICBpZiAoIV8uaXNFbXB0eSh0aGlzLmJyYW5jaGluZ0xvZ2ljKSAmJiBfLmdldCh0aGlzLmJyYW5jaGluZ0xvZ2ljLCBgJHt0aGlzLmVkaXRvclNlcnZpY2UucGFyZW50SWRlbnRpZmllcn0udGFyZ2V0YCkpIHtcbiAgICAgIGlmICh0aGlzLmJyYW5jaGluZ0xvZ2ljW3RoaXMuZWRpdG9yU2VydmljZS5wYXJlbnRJZGVudGlmaWVyXS50YXJnZXQuaW5jbHVkZXMocXVlc3Rpb25JZCkpIHtcbiAgICAgICAgcmV0dXJuIFsuLi50aGlzLmJyYW5jaGluZ0xvZ2ljW3RoaXMuZWRpdG9yU2VydmljZS5wYXJlbnRJZGVudGlmaWVyXS50YXJnZXRdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFsuLi50aGlzLmJyYW5jaGluZ0xvZ2ljW3RoaXMuZWRpdG9yU2VydmljZS5wYXJlbnRJZGVudGlmaWVyXS50YXJnZXQsIGAke3F1ZXN0aW9uSWR9YF07XG4gICAgfVxuICAgIHJldHVybiBbYCR7cXVlc3Rpb25JZH1gXTtcbiAgfVxuXG4gIGdldE9wdGlvbnMoKSB7XG4gICAgaWYgKHRoaXMuZWRpdG9yU2VydmljZS5vcHRpb25zTGVuZ3RoKSB7XG4gICAgICB0aGlzLm9wdGlvbnMgPSBbXTtcbiAgICAgIEFycmF5LmZyb20oeyBsZW5ndGg6IHRoaXMuZWRpdG9yU2VydmljZS5vcHRpb25zTGVuZ3RoIH0sICh4LCBpKSA9PiB7XG4gICAgICAgIHRoaXMub3B0aW9ucy5wdXNoKHsgdmFsdWU6IGksIGxhYmVsOiBpIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0UGFyZW50UXVlc3Rpb25PcHRpb25zKHF1ZXN0aW9uSWQpIHtcbiAgICB0aGlzLmVkaXRvclNlcnZpY2UucGFyZW50SWRlbnRpZmllciA9IHF1ZXN0aW9uSWQ7XG4gICAgdGhpcy5xdWVzdGlvblNlcnZpY2UucmVhZFF1ZXN0aW9uKHF1ZXN0aW9uSWQpXG4gICAgICAuc3Vic2NyaWJlKChyZXMpID0+IHtcbiAgICAgICAgaWYgKHJlcy5yZXNwb25zZUNvZGUgPT09ICdPSycpIHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSByZXMucmVzdWx0LnF1ZXN0aW9uO1xuICAgICAgICAgIGlmIChyZXN1bHQuaW50ZXJhY3Rpb25UeXBlc1swXSA9PT0gJ2Nob2ljZScpIHtcbiAgICAgICAgICAgIGNvbnN0IG51bWJlck9mT3B0aW9ucyA9IHJlc3VsdC5lZGl0b3JTdGF0ZS5vcHRpb25zLmxlbmd0aDtcbiAgICAgICAgICAgIHRoaXMuZWRpdG9yU2VydmljZS5vcHRpb25zTGVuZ3RoID0gbnVtYmVyT2ZPcHRpb25zO1xuICAgICAgICAgICAgdGhpcy5nZXRPcHRpb25zKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIHVwZGF0ZVRyZWVDYWNoZShzZWN0aW9uTmFtZSwgYnJhbmNoaW5nTG9naWMsIHNlbGVjdGVkU2VjdGlvbikge1xuICAgIGNvbnN0IG1ldGFkYXRhID0ge1xuICAgICAgbmFtZTogc2VjdGlvbk5hbWUsXG4gICAgICBwcmltYXJ5Q2F0ZWdvcnk6IHRoaXMuc2VjdGlvblByaW1hcnlDYXRlZ29yeSxcbiAgICAgIGFsbG93QnJhbmNoaW5nOiAnWWVzJyxcbiAgICAgIGJyYW5jaGluZ0xvZ2ljXG4gICAgfTtcbiAgICB0aGlzLnRyZWVTZXJ2aWNlLnVwZGF0ZU5vZGUobWV0YWRhdGEsIHNlbGVjdGVkU2VjdGlvbiwgdGhpcy5zZWN0aW9uUHJpbWFyeUNhdGVnb3J5KTtcbiAgfVxuXG4gIHNldENvbmRpdGlvbihkYXRhKSB7XG4gICAgY29uc3QgQ29uZGl0aW9uID0gXy5nZXQoZGF0YT8uYnJhbmNoaW5nTG9naWMsIGAke3RoaXMucXVlc3Rpb25JZH0ucHJlQ29uZGl0aW9uLmFuZFswXWApO1xuICAgIGNvbnN0IGdldENvbmRpdGlvbiA9IE9iamVjdC5rZXlzKENvbmRpdGlvbik7XG4gICAgdGhpcy5jb25kaXRpb24gPSBnZXRDb25kaXRpb25bMF07XG4gICAgdGhpcy5zZWxlY3RlZE9wdGlvbnMgPSBDb25kaXRpb25bZ2V0Q29uZGl0aW9uXVsxXTtcbiAgfVxuXG4gIGdldEJyYW5jaGluZ0xvZ2ljKGNoaWxkcmVuKSB7XG4gICAgXy5mb3JFYWNoKGNoaWxkcmVuLCAoZGF0YSkgPT4ge1xuICAgICAgaWYgKGRhdGEuaWRlbnRpZmllciA9PT0gdGhpcy5zZWxlY3RlZFNlY3Rpb25JZCkge1xuICAgICAgICB0aGlzLmJyYW5jaGluZ0xvZ2ljID0gZGF0YT8uYnJhbmNoaW5nTG9naWMgPyBkYXRhPy5icmFuY2hpbmdMb2dpYyA6IHt9O1xuICAgICAgICBpZiAoXy5nZXQoZGF0YT8uYnJhbmNoaW5nTG9naWMsIGAke3RoaXMucXVlc3Rpb25JZH0uc291cmNlWzBdYCkpIHtcbiAgICAgICAgICB0aGlzLmlzQ2hpbGRRdWVzdGlvbiA9IHRydWU7XG4gICAgICAgICAgdGhpcy5nZXRQYXJlbnRRdWVzdGlvbk9wdGlvbnMoZGF0YS5icmFuY2hpbmdMb2dpY1t0aGlzLnF1ZXN0aW9uSWRdLnNvdXJjZVswXSk7XG4gICAgICAgICAgdGhpcy5zZXRDb25kaXRpb24oZGF0YSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChkYXRhPy5jaGlsZHJlbikge1xuICAgICAgICB0aGlzLmdldEJyYW5jaGluZ0xvZ2ljKGRhdGE/LmNoaWxkcmVuKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIG9uUXVhbGl0eUZvcm1TdWJtaXQoZXZlbnQpIHtcbiAgICBzd2l0Y2ggKGV2ZW50LmFjdGlvbikge1xuICAgICAgY2FzZSAnc3VibWl0JzpcbiAgICAgICAgdGhpcy5zYXZlUXVhbGl0eVBhcmFtZXRlcnMoZXZlbnQuZGF0YSwgdGhpcy5zZW5kUXVlc3Rpb25Gb3JQdWJsaXNoLmJpbmQodGhpcywge30pKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdyZXF1ZXN0Q2hhbmdlJzpcbiAgICAgICAgdGhpcy5yZXF1ZXN0Q2hhbmdlc1BvcHVwQWN0aW9uID0gbnVsbDtcbiAgICAgICAgdGhpcy5zYXZlUXVhbGl0eVBhcmFtZXRlcnMoZXZlbnQuZGF0YSwgdGhpcy5vcGVuUmVxdWVzdENoYW5nZXNQb3B1cC5iaW5kKHRoaXMsIHt9KSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhpcy5zaG93UXVhbGl0eVBhcmFtZXRlclBvcHVwID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgc2F2ZVF1YWxpdHlQYXJhbWV0ZXJzKHF1YWxpdHlQYXJhbWV0ZXJzLCBjYWxsYmFjaykge1xuICAgIGNvbnN0IHJlcXVlc3RPYmogPSB7XG4gICAgICBxdWVzdGlvbjoge1xuICAgICAgICByZXZpZXdlclF1YWxpdHlDaGVja3M6IHF1YWxpdHlQYXJhbWV0ZXJzXG4gICAgICB9XG4gICAgfTtcbiAgICB0aGlzLnF1ZXN0aW9uU2VydmljZS51cGRhdGVRdWVzdGlvbih0aGlzLnF1ZXN0aW9uSWQsIHJlcXVlc3RPYmopLnN1YnNjcmliZShyZXMgPT4ge1xuICAgICAgdGhpcy5zaG93UXVhbGl0eVBhcmFtZXRlclBvcHVwID0gZmFsc2U7XG4gICAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIG9wZW5SZXF1ZXN0Q2hhbmdlc1BvcHVwKCkge1xuICAgIHRoaXMucmVxdWVzdENoYW5nZXNQb3B1cEFjdGlvbiA9ICdyZWplY3RRdWVzdGlvbic7XG4gIH1cblxuICBjYWxjdWxhdGVNaW5NYXhTY29yZShtZXRhRGF0YSkge1xuICAgIGNvbnN0IHNjb3JlcyA9IFtdO1xuICAgIGlmICghXy5pc0VtcHR5KG1ldGFEYXRhLnJlc3BvbnNlRGVjbGFyYXRpb24ucmVzcG9uc2UxLm1hcHBpbmcpKSB7XG4gICAgICBtZXRhRGF0YS5yZXNwb25zZURlY2xhcmF0aW9uLnJlc3BvbnNlMS5tYXBwaW5nLmZvckVhY2goaXRlbSA9PiBzY29yZXMucHVzaChpdGVtLm91dGNvbWVzLnNjb3JlKSk7XG4gICAgICBtZXRhRGF0YS5yZXNwb25zZURlY2xhcmF0aW9uLnJlc3BvbnNlMS5taW5TY29yZSA9IE1hdGgubWluKC4uLnNjb3Jlcyk7XG4gICAgICBpZiAoXy5nZXQobWV0YURhdGEsICdyZXNwb25zZURlY2xhcmF0aW9uLnJlc3BvbnNlMS5jYXJkaW5hbGl0eScpID09PSAnbXVsdGlwbGUnKSB7XG4gICAgICAgIGxldCBzdW0gPSAwO1xuICAgICAgICBtZXRhRGF0YS5yZXNwb25zZURlY2xhcmF0aW9uLnJlc3BvbnNlMS5tYXBwaW5nLmZvckVhY2goaXRlbSA9PiBzdW0gKz0gKyhpdGVtLm91dGNvbWVzLnNjb3JlKSk7XG4gICAgICAgIG1ldGFEYXRhLnJlc3BvbnNlRGVjbGFyYXRpb24ucmVzcG9uc2UxLm1heFNjb3JlID0gc3VtO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbWV0YURhdGEucmVzcG9uc2VEZWNsYXJhdGlvbi5yZXNwb25zZTEubWF4U2NvcmUgPSBNYXRoLm1heCguLi5zY29yZXMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufSIsIjxkaXYgY2xhc3M9XCJzYi1lZGl0b3ItY29udGFpbmVyIG1iLTBcIiAqbmdJZj1cIiFzaG93TG9hZGVyXCI+XG4gIDxsaWItaGVhZGVyIFtsYWJlbENvbmZpZ0RhdGFdPVwidG9vbGJhckNvbmZpZ1wiIFtidXR0b25Mb2FkZXJzXT1cImJ1dHRvbkxvYWRlcnNcIiBbcGFnZUlkXT1cInBhZ2VJZFwiIFtyZXF1ZXN0Q2hhbmdlXSA9IFwicmVxdWVzdENoYW5nZXNQb3B1cEFjdGlvblwiICh0b29sYmFyRW1pdHRlcik9XCJ0b29sYmFyRXZlbnRMaXN0ZW5lcigkZXZlbnQpXCI+XG4gIDwvbGliLWhlYWRlcj5cblxuICA8ZGl2IGNsYXNzPVwic2ItYmctd2hpdGUgcHktMjBcIj5cbiAgICA8ZGl2IGNsYXNzPVwidWkgY29udGFpbmVyIHNiLWNvbnRhaW5lclwiPlxuICAgICAgPGRpdiBjbGFzcz1cInVpIHR3ZWx2ZSBjb2x1bW4gd2lkZSBoLTEwMFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMTZcIj5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwic2hvd1ByZXZpZXdcIiBjbGFzcz1cImJyLTIgYi0xLTEwMFwiPlxuICAgICAgICAgICAgPGxpYi1xdW1sLXBsYXllciBbcXVlc3Rpb25TZXRIaWVyYXJjaHldPVwicXVlc3Rpb25TZXRIaWVyYXJjaHlcIiBbaXNTaW5nbGVRdWVzdGlvblByZXZpZXddPVwidHJ1ZVwiID48L2xpYi1xdW1sLXBsYXllcj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDthbGlnbi1pdGVtczogZmxleC1lbmQ7anVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDtcIlxuICAgICAgICAgICAgKm5nSWY9XCJzaG93T3B0aW9ucyB8fCBpc0NoaWxkUXVlc3Rpb24gXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwib3B0aW9uc1wiPlxuICAgICAgICAgICAgICA8c3VpLXNlbGVjdCBbKG5nTW9kZWwpXT1cImNvbmRpdGlvblwiIHZhbHVlRmllbGQ9XCJ2YWx1ZVwiIGNsYXNzPVwic2VsZWN0aW9uIG11bHRpc2VsZWN0XCJcbiAgICAgICAgICAgICAgbGFiZWxGaWVsZD1cImxhYmVsXCIgW3BsYWNlaG9sZGVyXT1cIidTZWxlY3QgQ29uZGl0aW9uJ1wiICNzZWxlY3QgW2lzRGlzYWJsZWRdPVwiaXNSZWFkT25seU1vZGVcIj5cbiAgICAgICAgICAgICAgICA8c3VpLXNlbGVjdC1vcHRpb24gW3ZhbHVlXT1cIntsYWJlbDonRXF1YWwgdG8nLHZhbHVlOidlcSd9XCI+PC9zdWktc2VsZWN0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICA8c3VpLXNlbGVjdC1vcHRpb24gW3ZhbHVlXT1cIntsYWJlbDonTm90IGVxdWFsJyx2YWx1ZTonbmUnfVwiPjwvc3VpLXNlbGVjdC1vcHRpb24+XG4gICAgICAgICAgICAgIDwvc3VpLXNlbGVjdD5cblxuICAgICAgICAgICAgICA8c3VpLW11bHRpLXNlbGVjdCBjbGFzcz1cInNlbGVjdGlvbiBtdWx0aXNlbGVjdFwiIFsobmdNb2RlbCldPVwic2VsZWN0ZWRPcHRpb25zXCIgdmFsdWVGaWVsZD1cInZhbHVlXCJcbiAgICAgICAgICAgICAgICBsYWJlbEZpZWxkPVwibGFiZWxcIiBbaXNTZWFyY2hhYmxlXT1cImZhbHNlXCIgI211bHRpU2VsZWN0IFtwbGFjZWhvbGRlcl09XCInU2VsZWN0IG9wdGlvbnMnXCIgW2lzRGlzYWJsZWRdPVwiaXNSZWFkT25seU1vZGVcIiA+XG4gICAgICAgICAgICAgICAgPHN1aS1zZWxlY3Qtb3B0aW9uICpuZ0Zvcj1cImxldCBvcHRpb24gb2Ygb3B0aW9uc1wiIFt2YWx1ZV09XCJvcHRpb25cIj5cbiAgICAgICAgICAgICAgICA8L3N1aS1zZWxlY3Qtb3B0aW9uPlxuICAgICAgICAgICAgICA8L3N1aS1tdWx0aS1zZWxlY3Q+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicHktMjAgcHgtMzIgYnItNCBiLTEtMTAwXCIgKm5nSWY9XCIhc2hvd1ByZXZpZXdcIiBbbmdDbGFzc109XCJ7J3NiLWJnLWNvbG9yLXByaW1hcnktMCc6ICFpc1JlYWRPbmx5TW9kZX1cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYi1maWVsZC1ncm91cFwiPlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmcy0wLTkyIGZvbnQtd2VpZ2h0LWJvbGRcIj57e2NvbmZpZ1NlcnZpY2UubGFiZWxDb25maWc/LmxibD8ucXVlc3Rpb259fTxzcGFuIGNsYXNzPVwic2ItcmVxdWlyZWRcIj4qPC9zcGFuPjwvbGFiZWw+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYi1maWVsZFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJja2VkaXRvci10b29sX19xdWVzdGlvbiBtYi01XCI+XG4gICAgICAgICAgICAgICAgICA8bGliLWNrZWRpdG9yLXRvb2xcbiAgICAgICAgICAgICAgICAgICAgKGVkaXRvckRhdGFPdXRwdXQpPVwiZWRpdG9yRGF0YUhhbmRsZXIoJGV2ZW50LCAncXVlc3Rpb24nKVwiXG4gICAgICAgICAgICAgICAgICAgIFtlZGl0b3JEYXRhSW5wdXRdPVwiZWRpdG9yU3RhdGUucXVlc3Rpb25cIlxuICAgICAgICAgICAgICAgICAgICAodmlkZW9EYXRhT3V0cHV0KT1cInZpZGVvRGF0YU91dHB1dCgkZXZlbnQpXCIgW3ZpZGVvU2hvd109XCJ2aWRlb1Nob3dcIj48L2xpYi1ja2VkaXRvci10b29sPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxsYWJlbCAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICBzaG93Rm9ybUVycm9yICYmXG4gICAgICAgICAgICAgICAgICAgIFt1bmRlZmluZWQsICcnXS5pbmNsdWRlcyhlZGl0b3JTdGF0ZS5xdWVzdGlvbilcbiAgICAgICAgICAgICAgICAgIFwiIGNsYXNzPVwic2ItY29sb3ItZXJyb3IgZnMtMC03ODVcIj57e2NvbmZpZ1NlcnZpY2UubGFiZWxDb25maWc/LmxibD8ucXVlc3Rpb25SZXF1aXJlZH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgPGxpYi1hbnN3ZXIgKm5nSWY9XCJxdWVzdGlvbkludGVyYWN0aW9uVHlwZSA9PT0gJ2RlZmF1bHQnXCJcbiAgICAgICAgICAgICAgICBbZWRpdG9yU3RhdGVdPVwiZWRpdG9yU3RhdGVcIiBbc2hvd0Zvcm1FcnJvcl09XCJzaG93Rm9ybUVycm9yXCJcbiAgICAgICAgICAgICAgICAoZWRpdG9yRGF0YU91dHB1dCk9XCJlZGl0b3JEYXRhSGFuZGxlcigkZXZlbnQpXCI+PC9saWItYW5zd2VyPlxuXG4gICAgICAgICAgICAgIDxsaWItb3B0aW9ucyAqbmdJZj1cInF1ZXN0aW9uSW50ZXJhY3Rpb25UeXBlID09PSAnY2hvaWNlJ1wiXG4gICAgICAgICAgICAgICAgW2VkaXRvclN0YXRlXT1cImVkaXRvclN0YXRlXCIgW3Nob3dGb3JtRXJyb3JdPVwic2hvd0Zvcm1FcnJvclwiXG4gICAgICAgICAgICAgICAgKGVkaXRvckRhdGFPdXRwdXQpPVwiZWRpdG9yRGF0YUhhbmRsZXIoJGV2ZW50KVwiPjwvbGliLW9wdGlvbnM+XG5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBmbGV4LWFpLWNlbnRlciBja2VkaXRvci10b29sX19zb2x1dGlvbiBweS0xMCBweC0xNiBtdC0xNSBzYi1iZy1jb2xvci13aGl0ZVwiPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZzLTAtOTIgbWItMCBja2VkaXRvci10b29sX19sYWJlbCBwYi00XCI+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNiLWNvbG9yLXByaW1hcnkgZnMtMC03ODUgbXItNFwiPnt7Y29uZmlnU2VydmljZS5sYWJlbENvbmZpZz8ubGJsPy5zb2x1dGlvbn19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzYi1jb2xvci1ncmF5LTIwMCBmeHNtYWxsIGZvbnQtd2VpZ2h0LW5vcm1hbFwiPnt7Y29uZmlnU2VydmljZS5sYWJlbENvbmZpZz8ubGJsPy5vcHRpb25hbH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ1aSBkcm9wZG93biBzYi1idG4gc2ItYnRuLW91dGxpbmUtcHJpbWFyeSBzYi1idG4tbm9ybWFsIHNiLXJpZ2h0LWljb24tYnRuIHNiLWJ0bi1yYWRpdXMgbWwtYXV0b1wiXG4gICAgICAgICAgICAgICAgICBzdWlEcm9wZG93biBhdXRvQ2xvc2U9XCJpdGVtQ2xpY2tcIiAqbmdJZj1cInNob3dTb2x1dGlvbkRyb3BEb3duXCIgbGliVGVsZW1ldHJ5SW50ZXJhY3RcbiAgICAgICAgICAgICAgICAgIFt0ZWxlbWV0cnlJbnRlcmFjdEVkYXRhXT1cInRlbGVtZXRyeVNlcnZpY2UuZ2V0VGVsZW1ldHJ5SW50ZXJhY3RFZGF0YSgnY2hvb3NlX3R5cGUnLCdjbGljaycsJ3NpbmdsZV9zZWxlY3QnLCB0ZWxlbWV0cnlTZXJ2aWNlLnRlbGVtZXRyeVBhZ2VJZClcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0IGdyYXktMjAwXCI+e3tjb25maWdTZXJ2aWNlLmxhYmVsQ29uZmlnPy5sYmw/LmNob29zZVR5cGV9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJkcm9wZG93biBpY29uIG14LThcIj48L2k+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWVudVwiIHN1aURyb3Bkb3duTWVudT5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIml0ZW1cIiAoY2xpY2spPVwic2VsZWN0U29sdXRpb25UeXBlKCdUZXh0K0ltYWdlJylcIiBsaWJUZWxlbWV0cnlJbnRlcmFjdFxuICAgICAgICAgICAgICAgICAgICAgIFt0ZWxlbWV0cnlJbnRlcmFjdEVkYXRhXT1cInRlbGVtZXRyeVNlcnZpY2UuZ2V0VGVsZW1ldHJ5SW50ZXJhY3RFZGF0YSgnc29sdXRpb25fdHlwZScsJ3NlbGVjdCcsJ3NpbmdsZV9zZWxlY3QnLCB0ZWxlbWV0cnlTZXJ2aWNlLnRlbGVtZXRyeVBhZ2VJZCwge3NvbHV0aW9uX3R5cGU6J1RleHQrSW1hZ2UnfSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICB7e2NvbmZpZ1NlcnZpY2UubGFiZWxDb25maWc/LmxibD8udGV4dEltYWdlfX1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpdGVtXCIgKGNsaWNrKT1cInNlbGVjdFNvbHV0aW9uVHlwZSgndmlkZW8nKVwiIGxpYlRlbGVtZXRyeUludGVyYWN0XG4gICAgICAgICAgICAgICAgICAgICAgW3RlbGVtZXRyeUludGVyYWN0RWRhdGFdPVwidGVsZW1ldHJ5U2VydmljZS5nZXRUZWxlbWV0cnlJbnRlcmFjdEVkYXRhKCdzb2x1dGlvbl90eXBlJywnc2VsZWN0Jywnc2luZ2xlX3NlbGVjdCcsIHRlbGVtZXRyeVNlcnZpY2UudGVsZW1ldHJ5UGFnZUlkLCB7c29sdXRpb25fdHlwZTondmlkZW8nfSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICB7e2NvbmZpZ1NlcnZpY2UubGFiZWxDb25maWc/LmxibD8udmlkZW99fVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNvbHV0aW9uX2h0bWxcIiAqbmdJZj1cInNlbGVjdGVkU29sdXRpb25UeXBlID09ICdodG1sJ1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJja2VkaXRvci10b29sLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNiLWNrZWRpdG9yIHJlbGF0aXZlIG1iLThcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwiZGVsZXRlU29sdXRpb24oKVwiIGNsYXNzPVwic2ItYnRuIHNiLWNrZWRpdG9yLWNsb3NlIGFic29sdXRlXCIgbGliVGVsZW1ldHJ5SW50ZXJhY3RcbiAgICAgICAgICAgICAgICAgICAgICBbdGVsZW1ldHJ5SW50ZXJhY3RFZGF0YV09XCJ0ZWxlbWV0cnlTZXJ2aWNlLmdldFRlbGVtZXRyeUludGVyYWN0RWRhdGEoJ2RlbGV0ZV9zb2x1dGlvbicsJ2NsaWNrJywnY2FuY2VsJywgdGVsZW1ldHJ5U2VydmljZS50ZWxlbWV0cnlQYWdlSWQsIHtzb2x1dGlvbl90eXBlOidUZXh0K0ltYWdlJ30pXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJpY29uIGNsb3NlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPGxpYi1ja2VkaXRvci10b29sIChlZGl0b3JEYXRhT3V0cHV0KT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgZWRpdG9yRGF0YUhhbmRsZXIoJGV2ZW50LCAnc29sdXRpb24nKVxuICAgICAgICAgICAgICAgICAgICAgIFwiW2VkaXRvckRhdGFJbnB1dF09XCJlZGl0b3JTdGF0ZS5zb2x1dGlvbnNcIlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY2tlZGl0b3ItdG9vbF9fb3B0aW9uXCI+PC9saWItY2tlZGl0b3ItdG9vbD5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNvbHV0aW9uX3ZpZGVvXCIgKm5nSWY9XCJzZWxlY3RlZFNvbHV0aW9uVHlwZSA9PSAndmlkZW8nICYmIHNob3dTb2x1dGlvblwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJja2VkaXRvci10b29sX19zb2x1dGlvbiBzYi1iZy1jb2xvci13aGl0ZSBzYi1ja2VkaXRvciByZWxhdGl2ZVwiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNvbHV0aW9uLW1lZGlhIHAtMTYgZC1mbGV4IGZsZXgtYWktY2VudGVyIGNrZWRpdG9yLXRvb2xfX29wdGlvbiBwLTE2XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtY3EtY2hlY2tib3gtYW5zd2VyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNiLWJ0biBzYi1ja2VkaXRvci1jbG9zZSBhYnNvbHV0ZVwiIChjbGljayk9XCJkZWxldGVTb2x1dGlvbigpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpYlRlbGVtZXRyeUludGVyYWN0XG4gICAgICAgICAgICAgICAgICAgICAgICBbdGVsZW1ldHJ5SW50ZXJhY3RFZGF0YV09XCJ0ZWxlbWV0cnlTZXJ2aWNlLmdldFRlbGVtZXRyeUludGVyYWN0RWRhdGEoJ2RlbGV0ZV9zb2x1dGlvbicsJ2NsaWNrJywnY2FuY2VsJywgdGhpcy50ZWxlbWV0cnlTZXJ2aWNlLnRlbGVtZXRyeVBhZ2VJZCwge3NvbHV0aW9uX3R5cGU6J3ZpZGVvJ30pXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImljb24gY2xvc2VcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic29sdXRpb24tbWVkaWFfX3ZpZGVvIHJlbGF0aXZlIHBvc2l0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm92ZXJsYXktaW1hZ2VcIiBbbmdTdHlsZV09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9UaHVtYm5haWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHsgYmFja2dyb3VuZDogJ3VybCgnICsgdmlkZW9UaHVtYm5haWwgKyAnKScgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogeyBiYWNrZ3JvdW5kOiAncmdiYSgwLDAsMCwwLjMpJyB9XG4gICAgICAgICAgICAgICAgICAgICAgICBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwicGxheSBjaXJjbGUgaWNvblwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzb2x1dGlvbi1tZWRpYV9fZGVzYyBtbC0xNiBzYi1jb2xvci1wcmltYXJ5XCI+XG4gICAgICAgICAgICAgICAgICAgICAge3sgdmlkZW9Tb2x1dGlvbk5hbWVcbiAgICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPGkgY2xhc3M9XCJpY29uIGVsbGlwc2lzIHZlcnRpY2FsIHNiLWNvbG9yLWJsYWNrXCI+PC9pPiAtLT5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8IS0tIDxsaWItdHJhbnNsYXRpb25zICpuZ0lmPVwic2hvd1RyYW5zbGF0aW9uXCI+PC9saWItdHJhbnNsYXRpb25zPiAtLT5cbiAgICAgICAgICA8IS0tIGNoaWxkIHF1ZXN0aW9uIHNlY3Rpb24gLS0+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImItMS0xMDAgYnItNCBteS0xNSBweC0zMiBweS0xMCBzYi1iZy1jb2xvci1wcmltYXJ5LTBcIlxuICAgICAgICAgICAgKm5nRm9yPVwibGV0IHF1ZXN0aW9uIG9mIGRlcGVuZGVudFF1ZXN0aW9ucztsZXQgY2hpbGRpbmRleD1pbmRleFwiPlxuICAgICAgICAgICAge3sgcXVlc3Rpb25TZXRIaWVyYXJjaHkuY2hpbGRyZW4gPyAnUScrIChxdWVzdGlvblNldEhpZXJhcmNoeS5jaGlsZHJlbi5sZW5ndGgrMSk6Jyd9fSB7eycuICcrXG4gICAgICAgICAgICAoY2hpbGRpbmRleCsxKX19XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIGNsYXNzPVwic2ItYnRuIHNiLWJ0bi1vdXRsaW5lLXByaW1hcnkgc2ItYnRuLXhzIHNiLWxlZnQtaWNvbi1idG4gdGV4dC1pbmhlcml0IGItMCBiZy1ub25lIG5vLWhvdmVyIHBsLTBcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzYi1saW5lLWhlaWdodC0yNFwiPmVkaXQgcXVlc3Rpb248L3NwYW4+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8aHI+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cInF1ZXN0aW9uRm9ybUNvbmZpZ1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBsLTUgcHktMTAgZm9udC13ZWlnaHQtYm9sZCBmcy0wLTkyXCI+XG4gICAgICAgICAgICAgIHt7Y29uZmlnU2VydmljZS5sYWJlbENvbmZpZz8ubGJsPy5RdWVzdGlvbmRldGFpbHN9fVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jb250YWluZXIgICBweC0zMFwiPlxuICAgICAgICAgICAgICA8c2ItZHluYW1pYy1mb3JtIFtjb25maWddPVwibGVhZkZvcm1Db25maWdcIiAoaW5pdGlhbGl6ZSk9XCJvdXRwdXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKHN0YXR1c0NoYW5nZXMpPVwib25TdGF0dXNDaGFuZ2VzKCRldmVudClcIiAodmFsdWVDaGFuZ2VzKT1cInZhbHVlQ2hhbmdlcygkZXZlbnQpXCI+PC9zYi1keW5hbWljLWZvcm0+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cblxuPHN1aS1tb2RhbCAqbmdJZj1cInNob3dDb25maXJtUG9wdXBcIiBbbXVzdFNjcm9sbF09XCJ0cnVlXCIgW2lzQ2xvc2FibGVdPVwidHJ1ZVwiIFt0cmFuc2l0aW9uRHVyYXRpb25dPVwiMFwiIFtzaXplXT1cIidzbWFsbCdcIlxuICBjbGFzcz1cInNiLW1vZGFsIGJ4LW5vbmUgb3ZlcmZsb3ctbW9kYWxcIiBhcHBCb2R5U2Nyb2xsIChkaXNtaXNzZWQpPVwic2hvd0NvbmZpcm1Qb3B1cCA9ICFzaG93Q29uZmlybVBvcHVwXCIgI21vZGFsPlxuICA8ZGl2IGNsYXNzPVwic2ItbW9kYWwtaGVhZGVyXCI+PC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJzYi1tb2RhbC1jb250ZW50XCI+XG4gICAge3tjb25maWdTZXJ2aWNlLmxhYmVsQ29uZmlnPy5sYmw/LmNvbmZpcm1RdWVzdGlvbk5vdFNhdmVkfX1cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJzYi1tb2RhbC1hY3Rpb25zXCI+XG4gICAgPGJ1dHRvbiBjbGFzcz1cInNiLWJ0biBzYi1idG4tbm9ybWFsIHNiLWJ0bi1wcmltYXJ5XCIgKGNsaWNrKT1cInJlZGlyZWN0VG9RdWVzdGlvbnNldCgpXCI+XG4gICAgICB7e2NvbmZpZ1NlcnZpY2UubGFiZWxDb25maWc/LmJ1dHRvbl9sYWJlbHM/Lnllc19idG5fbGFiZWx9fVxuICAgIDwvYnV0dG9uPlxuICAgIDxidXR0b24gY2xhc3M9XCJzYi1idG4gc2ItYnRuLW5vcm1hbCBzYi1idG4tb3V0bGluZS1wcmltYXJ5XCIgKGNsaWNrKT1cInNob3dDb25maXJtUG9wdXAgPSAhc2hvd0NvbmZpcm1Qb3B1cFwiPlxuICAgICAge3tjb25maWdTZXJ2aWNlLmxhYmVsQ29uZmlnPy5idXR0b25fbGFiZWxzPy5ub19idG5fbGFiZWx9fVxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cbjwvc3VpLW1vZGFsPlxuXG48bGliLXRlcm0tYW5kLWNvbmRpdGlvblxuICAgICAgICBbc2hvd0VkaXRpbmdDb25zZW50XT1cImVkaXRvclNlcnZpY2UuaXNSZXZpZXdlckVkaXRFbmFibGVcIlxuICAgICAgICBbc2hvd1N1Ym1pdENvbmZpcm1Qb3B1cF09XCJzaG93U3VibWl0Q29uZmlybVBvcHVwXCIgKHNlbmRGb3JSZXZpZXdPdXRwdXQpPVwib25Db25zZW50U3VibWl0KCRldmVudClcIj5cbjwvbGliLXRlcm0tYW5kLWNvbmRpdGlvbj5cblxuPHN1aS1tb2RhbCAqbmdJZj1cInNob3dSZXZpZXdNb2RhbFwiIFttdXN0U2Nyb2xsXT1cInRydWVcIiBbaXNDbG9zYWJsZV09XCJmYWxzZVwiIFt0cmFuc2l0aW9uRHVyYXRpb25dPVwiMFwiXG4gIFtzaXplXT1cIidub3JtYWwnXCIgY2xhc3M9XCJzYi1tb2RhbCBieC1ub25lIG92ZXJmbG93LW1vZGFsXCIgYXBwQm9keVNjcm9sbCAjbW9kYWwgKGRpc21pc3NlZCk9XCJzaG93UmV2aWV3TW9kYWwgPSBmYWxzZTtcIj5cbiAgPGRpdiBjbGFzcz1cInNiLW1vZGFsLWhlYWRlclwiPlxuICAgIHt7Y29uZmlnU2VydmljZS5sYWJlbENvbmZpZz8ubGJsPy5yZXZpZXdDb21tZW50c319XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwic2ItbW9kYWwtY29udGVudFwiPlxuICAgICAgPGRpdiBjbGFzcz1cInNiLWZpZWxkXCI+XG4gICAgICAgICAgPGxhYmVsPnt7Y29uZmlnU2VydmljZS5sYWJlbENvbmZpZz8ubGJsPy5jb21tZW50c319PC9sYWJlbD5cbiAgICAgICAgICAgIDx0ZXh0YXJlYSBkaXNhYmxlZD1cImRpc2FibGVkXCIgdHlwZT1cInRleHRcIiBjbGFzcz1cIndtZC1pbnB1dCB3aWR0aC0xMDAgc2ItZm9ybS1jb250cm9sIHAtMTAgc2ItZGlzYWJsZWQtdGV4dGFyZWFcIiBpZD1cIndtZC1pbnB1dFwiIFsobmdNb2RlbCldPVwiY29udGVudENvbW1lbnRcIiBuYW1lPVwicmVqZWN0ZWRDb21tZW50XCI+PC90ZXh0YXJlYT5cbiAgICAgIDwvZGl2PlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cInNiLW1vZGFsLWFjdGlvbnNcIj5cbiAgICA8YnV0dG9uIGNsYXNzPVwic2ItYnRuIHNiLWJ0bi1ub3JtYWwgc2ItYnRuLW91dGxpbmUtcHJpbWFyeVwiIChjbGljayk9XCJtb2RhbC5kZW55KCdkZW5pZWQnKVwiXG4gICAgbGliVGVsZW1ldHJ5SW50ZXJhY3QgW3RlbGVtZXRyeUludGVyYWN0RWRhdGFdPVwidGVsZW1ldHJ5U2VydmljZS5nZXRUZWxlbWV0cnlJbnRlcmFjdEVkYXRhKCdjbG9zZScsJ2NsaWNrJywnY2FuY2VsJywgdGVsZW1ldHJ5U2VydmljZS50ZWxlbWV0cnlQYWdlSWQsICB7a2V5OiAnZGlhbG9nX2lkJywgdmFsdWU6ICdyZXZpZXdfY29tbWVudHMnfSlcIj57e2NvbmZpZ1NlcnZpY2UubGFiZWxDb25maWc/LmJ1dHRvbl9sYWJlbHM/LmNsb3NlX2J0bl9sYWJlbH19PC9idXR0b24+XG4gIDwvZGl2PlxuPC9zdWktbW9kYWw+XG5cbjxsaWItcXVhbGl0eS1wYXJhbXMtbW9kYWxcbiAgW2xhYmVsQ29uZmlnRGF0YV09XCJ0b29sYmFyQ29uZmlnXCJcbiAgW3Nob3dRdWFsaXR5UGFyYW1ldGVyUG9wdXBdPVwic2hvd1F1YWxpdHlQYXJhbWV0ZXJQb3B1cFwiXG4gIFtxdWFsaXR5Rm9ybUNvbmZpZ109XCJxdWFsaXR5Rm9ybUNvbmZpZ1wiXG4gIChxdWFsaXR5UGFyYW1DaGFuZ2VkKT1cIm9uUXVhbGl0eUZvcm1TdWJtaXQoJGV2ZW50KVwiPlxuPC9saWItcXVhbGl0eS1wYXJhbXMtbW9kYWw+XG4iXX0=
1468
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlc3Rpb24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29sbGVjdGlvbi1lZGl0b3ItbGlicmFyeS9zcmMvbGliL2NvbXBvbmVudHMvcXVlc3Rpb24vcXVlc3Rpb24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29sbGVjdGlvbi1lZGl0b3ItbGlicmFyeS9zcmMvbGliL2NvbXBvbmVudHMvcXVlc3Rpb24vcXVlc3Rpb24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBaUIsaUJBQWlCLEVBQWEsTUFBTSxlQUFlLENBQUM7QUFDNUgsT0FBTyxLQUFLLENBQUMsTUFBTSxXQUFXLENBQUM7QUFDL0IsT0FBTyxFQUFFLEVBQUUsSUFBSSxNQUFNLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDcEMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBT25ELE9BQU8sRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBTTFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUluRSxNQUFNLGdCQUFnQixHQUFDLEVBQUUsQ0FBQztBQUMxQixNQUFNLGlCQUFpQixHQUFDLE9BQU8sQ0FBQztBQVFoQyxNQUFNLE9BQU8saUJBQWlCO0lBdUY1QixZQUNVLGVBQWdDLEVBQVMsYUFBNEIsRUFBUyxnQkFBd0MsRUFDdkgsYUFBNEIsRUFBVSxjQUE4QixFQUFVLFdBQXdCLEVBQ3JHLGdCQUFrQyxFQUFVLE1BQWMsRUFBUyxhQUE0QixFQUMvRixZQUEwQjtRQUgxQixvQkFBZSxHQUFmLGVB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QUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUNqRyxRQUFRLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUM7WUFDdEUsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSwyQ0FBMkMsQ0FBQyxLQUFLLFVBQVUsRUFBQztnQkFDOUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDO2dCQUNaLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO2dCQUM5RixRQUFRLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDLFFBQVEsR0FBRyxHQUFHLENBQUM7YUFDdkQ7aUJBQUk7Z0JBQ0wsUUFBUSxDQUFDLG1CQUFtQixDQUFDLFNBQVMsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDO2FBQ3JFO1NBQ0Y7SUFDSCxDQUFDOytHQWwvQ1UsaUJBQWlCO21HQUFqQixpQkFBaUIseU5DN0I5Qiwwc2RBd09BOzs0RkQzTWEsaUJBQWlCO2tCQU43QixTQUFTOytCQUNFLGNBQWMsaUJBR1QsaUJBQWlCLENBQUMsSUFBSTtzV0FJNUIsYUFBYTtzQkFBckIsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFHSSxlQUFlO3NCQUF4QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCwgQWZ0ZXJWaWV3SW5pdCwgVmlld0VuY2Fwc3VsYXRpb24sIE9uRGVzdHJveSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gtZXMnO1xuaW1wb3J0IHsgdjQgYXMgdXVpZHY0IH0gZnJvbSAndXVpZCc7XG5pbXBvcnQgeyBNY3FGb3JtIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9NY3FGb3JtJztcbmltcG9ydCB7IFNlcnZlclJlc3BvbnNlIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9zZXJ2ZXJSZXNwb25zZSc7XG5pbXBvcnQgeyBRdWVzdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9xdWVzdGlvbi9xdWVzdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IFBsYXllclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9wbGF5ZXIvcGxheWVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgRWRpdG9yVGVsZW1ldHJ5U2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3RlbGVtZXRyeS90ZWxlbWV0cnkuc2VydmljZSc7XG5pbXBvcnQgeyBFZGl0b3JTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZWRpdG9yL2VkaXRvci5zZXJ2aWNlJztcbmltcG9ydCB7IFRvYXN0ZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvdG9hc3Rlci90b2FzdGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgdGhyb3dFcnJvciwgU3ViamVjdH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgQ29uZmlnU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2NvbmZpZy9jb25maWcuc2VydmljZSc7XG5pbXBvcnQgeyBGcmFtZXdvcmtTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZnJhbWV3b3JrL2ZyYW1ld29yay5zZXJ2aWNlJztcbmltcG9ydCB7IFRyZWVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvdHJlZS90cmVlLnNlcnZpY2UnO1xuaW1wb3J0IHsgRWRpdG9yQ3Vyc29yIH0gZnJvbSAnLi4vLi4vY29sbGVjdGlvbi1lZGl0b3ItY3Vyc29yLnNlcnZpY2UnO1xuaW1wb3J0IHsgZmlsdGVyLCBmaW5hbGl6ZSwgdGFrZSwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgU3ViTWVudSB9IGZyb20gJy4uL3F1ZXN0aW9uLW9wdGlvbi1zdWItbWVudS9xdWVzdGlvbi1vcHRpb24tc3ViLW1lbnUuY29tcG9uZW50JztcbmltcG9ydCB7IElDcmVhdGlvbkNvbnRleHQgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL0NyZWF0aW9uQ29udGV4dCc7XG5cbmNvbnN0IGV2aWRlbmNlTWltZVR5cGU9Jyc7XG5jb25zdCBldmlkZW5jZVNpemVMaW1pdD0nMjA0ODAnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsaWItcXVlc3Rpb24nLFxuICB0ZW1wbGF0ZVVybDogJy4vcXVlc3Rpb24uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9xdWVzdGlvbi5jb21wb25lbnQuc2NzcyddLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxufSlcbmV4cG9ydCBjbGFzcyBRdWVzdGlvbkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcbiAgUXVtbFBsYXllckNvbmZpZzogYW55ID0ge307XG4gIEBJbnB1dCgpIHF1ZXN0aW9uSW5wdXQ6IGFueTtcbiAgQElucHV0KCkgbGVhZkZvcm1Db25maWc6IGFueTtcbiAgQElucHV0KCkgc291cmNpbmdTZXR0aW5nczogYW55O1xuICBwdWJsaWMgaW5pdGlhbExlYWZGb3JtQ29uZmlnOiBhbnk7XG4gIHB1YmxpYyBjaGlsZEZvcm1EYXRhOiBhbnk7XG4gIEBPdXRwdXQoKSBxdWVzdGlvbkVtaXR0ZXIgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgcHJpdmF0ZSBvbkNvbXBvbmVudERlc3Ryb3kkID0gbmV3IFN1YmplY3Q8YW55PigpO1xuICB0b29sYmFyQ29uZmlnOiBhbnkgPSB7fTtcbiAgcHVibGljIHRlcm1zID0gZmFsc2U7XG4gIHB1YmxpYyBlZGl0b3JTdGF0ZTogYW55ID0ge307XG4gIHB1YmxpYyBzaG93UHJldmlldyA9IGZhbHNlO1xuICBwdWJsaWMgbWVkaWFBcnI6IGFueSA9IFtdO1xuICBwdWJsaWMgdmlkZW9TaG93ID0gZmFsc2U7XG4gIHB1YmxpYyBzaG93Rm9ybUVycm9yID0gZmFsc2U7XG4gIHB1YmxpYyBhY3Rpb25UeXBlOiBzdHJpbmc7XG4gIHNlbGVjdGVkU29sdXRpb25UeXBlOiBzdHJpbmc7XG4gIHNlbGVjdGVkU29sdXRpb25UeXBlSW5kZXg6IHN0cmluZztcbiAgc2hvd1NvbHV0aW9uRHJvcERvd24gPSB0cnVlO1xuICBzaG93U29sdXRpb24gPSBmYWxzZTtcbiAgdmlkZW9Tb2x1dGlvbk5hbWU6IHN0cmluZztcbiAgdmlkZW9Tb2x1dGlvbkRhdGE6IGFueTtcbiAgdmlkZW9UaHVtYm5haWw6IHN0cmluZztcbiAgc29sdXRpb25VVUlEOiBzdHJpbmc7XG4gIHNvbHV0aW9uVmFsdWU6IHN0cmluZztcbiAgc29sdXRpb25UeXBlczogYW55ID0gW3tcbiAgICB0eXBlOiAnaHRtbCcsXG4gICAgdmFsdWU6ICdUZXh0K0ltYWdlJ1xuICB9LFxuICB7XG4gICAgdHlwZTogJ3ZpZGVvJyxcbiAgICB2YWx1ZTogJ3ZpZGVvJ1xuICB9XTtcbiAgcXVlc3Rpb25NZXRhRGF0YTogYW55O1xuICBxdWVzdGlvbkludGVyYWN0aW9uVHlwZTtcbiAgcXVlc3Rpb25DYXRlZ29yeTtcbiAgcXVlc3Rpb25JZDtcbiAgY3JlYXRpb25Db250ZXh0OiBJQ3JlYXRpb25Db250ZXh0O1xuICBjcmVhdGlvbk1vZGU7XG4gIHRlbXBRdWVzdGlvbklkO1xuICBxdWVzdGlvblNldElkO1xuICB1bml0SWQ7XG4gIHB1YmxpYyBzZXRDaGFyYWN0ZXJMaW1pdCA9IDE2MDtcbiAgcHVibGljIHNob3dMb2FkZXIgPSB0cnVlO1xuICBwdWJsaWMgaXNSZWFkT25seU1vZGUgPSBmYWxzZTtcbiAgcHVibGljIGNvbnRlbnRDb21tZW50IDogc3RyaW5nO1xuICBwdWJsaWMgc2hvd1Jldmlld01vZGFsOiBib29sZWFuID0gZmFsc2U7XG4gIHF1ZXN0aW9uU2V0SGllcmFyY2h5OiBhbnk7XG4gIHNob3dDb25maXJtUG9wdXAgPSBmYWxzZTtcbiAgc2hvd1N1Ym1pdENvbmZpcm1Qb3B1cCA9IGZhbHNlO1xuICB2YWxpZFF1ZXN0aW9uRGF0YSA9IGZhbHNlO1xuICBxdWVzdGlvblByaW1hcnlDYXRlZ29yeTogc3RyaW5nO1xuICBwYWdlSWQgPSAncXVlc3Rpb24nO1xuICBwYWdlU3RhcnRUaW1lOiBhbnk7XG4gIHB1YmxpYyBmcmFtZXdvcms7XG4gIHB1YmxpYyBmcmFtZXdvcmtEZXRhaWxzOiBhbnkgPSB7fTtcbiAgcHVibGljIHF1ZXN0aW9uTWV0YWRhdGFGb3JtU3RhdHVzID0gdHJ1ZTtcbiAgcHVibGljIGJ1dHRvbkxvYWRlcnMgPSB7XG4gICAgc2F2ZUJ1dHRvbkxvYWRlcjogZmFsc2UsXG4gICAgcmV2aWV3OiBmYWxzZVxuICB9O1xuICBwdWJsaWMgc2hvd1RyYW5zbGF0aW9uID0gZmFsc2U7XG4gIHN1Yk1lbnVzOiBTdWJNZW51W107XG4gIHNob3dBZGRTZWNvbmRhcnlRdWVzdGlvbkNhdDogYm9vbGVhbjtcbiAgc2xpZGVyRGF0YXM6IGFueSA9IHt9O1xuICBzbGlkZXJPcHRpb25zOiBhbnkgPSB7fTtcbiAgaGludHM6IGFueTtcbiAgY2F0ZWdvcnlMYWJlbDogYW55ID0ge307XG4gIHNjb3JlTWFwcGluZzogYW55O1xuICBjb25kaXRpb24gPSAnZGVmYXVsdCc7XG4gIHRhcmdldE9wdGlvbjogYW55O1xuICByZXNwb25zZVZhcmlhYmxlID0gJ3Jlc3BvbnNlMSc7XG4gIG5ld1F1ZXN0aW9uSUQ6IGFueTtcbiAgc2hvd09wdGlvbnM6IGJvb2xlYW47XG4gIHNlbGVjdGVkT3B0aW9uczogYW55O1xuICBvcHRpb25zID0gW107XG4gIGlzQ2hpbGRRdWVzdGlvbiA9IGZhbHNlO1xuICBicmFuY2hpbmdMb2dpYzogYW55O1xuICBzZWxlY3RlZFNlY3Rpb25JZDogYW55O1xuICBzZWN0aW9uUHJpbWFyeUNhdGVnb3J5OiBhbnk7XG4gIG1heFNjb3JlID0gMTtcbiAgcHVibGljIHF1ZXN0aW9uRm9ybUNvbmZpZzogYW55O1xuICB0cmVlTm9kZURhdGE6YW55O1xuICBzaG93UXVhbGl0eVBhcmFtZXRlclBvcHVwOiBib29sZWFuID1mYWxzZTtcbiAgcHVibGljIHF1YWxpdHlGb3JtQ29uZmlnOiBhbnk7XG4gIHJlcXVlc3RDaGFuZ2VzUG9wdXBBY3Rpb246IHN0cmluZztcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBxdWVzdGlvblNlcnZpY2U6IFF1ZXN0aW9uU2VydmljZSwgcHVibGljIGVkaXRvclNlcnZpY2U6IEVkaXRvclNlcnZpY2UsIHB1YmxpYyB0ZWxlbWV0cnlTZXJ2aWNlOiBFZGl0b3JUZWxlbWV0cnlTZXJ2aWNlLFxuICAgIHB1YmxpYyBwbGF5ZXJTZXJ2aWNlOiBQbGF5ZXJTZXJ2aWNlLCBwcml2YXRlIHRvYXN0ZXJTZXJ2aWNlOiBUb2FzdGVyU2VydmljZSwgcHJpdmF0ZSB0cmVlU2VydmljZTogVHJlZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBmcmFtZXdvcmtTZXJ2aWNlOiBGcmFtZXdvcmtTZXJ2aWNlLCBwcml2YXRlIHJvdXRlcjogUm91dGVyLCBwdWJsaWMgY29uZmlnU2VydmljZTogQ29uZmlnU2VydmljZSxcbiAgICBwcml2YXRlIGVkaXRvckN1cnNvcjogRWRpdG9yQ3Vyc29yKSB7XG4gICAgY29uc3QgeyBwcmltYXJ5Q2F0ZWdvcnksIGxhYmVsIH0gPSB0aGlzLmVkaXRvclNlcnZpY2Uuc2VsZWN0ZWRDaGlsZHJlbjtcbiAgICB0aGlzLnF1ZXN0aW9uUHJpbWFyeUNhdGVnb3J5ID0gcHJpbWFyeUNhdGVnb3J5O1xuICAgIHRoaXMucGFnZVN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgdGhpcy5jYXRlZ29yeUxhYmVsID0gW107XG4gICAgdGhpcy5nZXRPcHRpb25zKCk7XG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKGxhYmVsKSkge1xuICAgICAgdGhpcy5jYXRlZ29yeUxhYmVsW3ByaW1hcnlDYXRlZ29yeV0gPSBsYWJlbDtcbiAgICB9XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICBjb25zdCB7IHF1ZXN0aW9uU2V0SWQsIHF1ZXN0aW9uSWQsIHR5cGUsIGNhdGVnb3J5LCBjcmVhdGlvbkNvbnRleHQsIGNyZWF0aW9uTW9kZSB9ID0gdGhpcy5xdWVzdGlvbklucHV0O1xuICAgIHRoaXMucXVlc3Rpb25JbnRlcmFjdGlvblR5cGUgPSB0eXBlO1xuICAgIHRoaXMucXVlc3Rpb25DYXRlZ29yeSA9IGNhdGVnb3J5O1xuICAgIHRoaXMucXVlc3Rpb25JZCA9IHF1ZXN0aW9uSWQ7XG4gICAgdGhpcy5xdWVzdGlvblNldElkID0gcXVlc3Rpb25TZXRJZDtcbiAgICB0aGlzLmNyZWF0aW9uQ29udGV4dCA9IGNyZWF0aW9uQ29udGV4dDtcbiAgICB0aGlzLmNyZWF0aW9uTW9kZSA9IGNyZWF0aW9uTW9kZTtcbiAgICB0aGlzLnVuaXRJZCA9IHRoaXMuY3JlYXRpb25Db250ZXh0Py51bml0SWRlbnRpZmllcjtcbiAgICB0aGlzLmlzUmVhZE9ubHlNb2RlID0gdGhpcy5jcmVhdGlvbkNvbnRleHQ/LmlzUmVhZE9ubHlNb2RlO1xuICAgIHRoaXMudG9vbGJhckNvbmZpZyA9IHRoaXMuZWRpdG9yU2VydmljZS5nZXRUb29sYmFyQ29uZmlnKCk7XG4gICAgdGhpcy50b29sYmFyQ29uZmlnLnNob3dQcmV2aWV3ID0gdGhpcy5lZGl0b3JTZXJ2aWNlLmVkaXRvck1vZGUgIT09ICdlZGl0JztcbiAgICB0aGlzLnRvb2xiYXJDb25maWcuYWRkX3RyYW5zbGF0aW9uID0gdHJ1ZTtcbiAgICB0aGlzLnRyZWVOb2RlRGF0YSA9IHRoaXMudHJlZVNlcnZpY2UuZ2V0Rmlyc3RDaGlsZCgpO1xuICAgIGlmIChfLmdldCh0aGlzLmNyZWF0aW9uQ29udGV4dCwgJ29iamVjdFR5cGUnKSA9PT0gJ3F1ZXN0aW9uJykgeyB0aGlzLnRvb2xiYXJDb25maWcucXVlc3Rpb25Db250cmlidXRpb24gPSB0cnVlOyB9XG4gICAgdGhpcy5zb2x1dGlvblVVSUQgPSB1dWlkdjQoKTtcbiAgICB0aGlzLnRlbGVtZXRyeVNlcnZpY2UudGVsZW1ldHJ5UGFnZUlkID0gdGhpcy5wYWdlSWQ7XG4gICAgdGhpcy5pbml0aWFsTGVhZkZvcm1Db25maWcgPSBfLmNsb25lRGVlcCh0aGlzLmxlYWZGb3JtQ29uZmlnKTtcbiAgICB0aGlzLmluaXRpYWxpemUoKTtcbiAgICB0aGlzLmZyYW1ld29yayA9IF8uZ2V0KHRoaXMuZWRpdG9yU2VydmljZS5lZGl0b3JDb25maWcsICdjb250ZXh0LmZyYW1ld29yaycpO1xuICAgIHRoaXMucXVhbGl0eUZvcm1Db25maWcgPSB0aGlzLmVkaXRvclNlcnZpY2UucXVhbGl0eUZvcm1Db25maWc7XG4gIH1cblxuICBmZXRjaEZyYW1lV29ya0RldGFpbHMoKSB7XG4gICAgdGhpcy5mcmFtZXdvcmtTZXJ2aWNlLmZyYW1ld29ya0RhdGEkLnBpcGUodGFrZVVudGlsKHRoaXMub25Db21wb25lbnREZXN0cm95JCksXG4gICAgICBmaWx0ZXIoZGF0YSA9PiBfLmdldChkYXRhLCBgZnJhbWV3b3JrZGF0YS4ke3RoaXMuZnJhbWV3b3JrfWApKSwgdGFrZSgxKSkuc3Vic2NyaWJlKChmcmFtZXdvcmtEZXRhaWxzOiBhbnkpID0+IHtcbiAgICAgIGlmIChmcmFtZXdvcmtEZXRhaWxzICYmICFmcmFtZXdvcmtEZXRhaWxzLmVycikge1xuICAgICAgICBjb25zdCBmcmFtZXdvcmtEYXRhID0gZnJhbWV3b3JrRGV0YWlscy5mcmFtZXdvcmtkYXRhW3RoaXMuZnJhbWV3b3JrXS5jYXRlZ29yaWVzO1xuICAgICAgICB0aGlzLmZyYW1ld29ya0RldGFpbHMuZnJhbWV3b3JrRGF0YSA9IGZyYW1ld29ya0RhdGE7XG4gICAgICAgIHRoaXMuZnJhbWV3b3JrRGV0YWlscy50b3BpY0xpc3QgPSBfLmdldChfLmZpbmQoZnJhbWV3b3JrRGF0YSwgeyBjb2RlOiAndG9waWMnIH0pLCAndGVybXMnKTtcbiAgICAgICAgdGhpcy5wb3B1bGF0ZUZyYW1ld29ya0RhdGEoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHBvcHVsYXRlRnJhbWV3b3JrRGF0YSgpIHtcbiAgICBjb25zdCBjYXRlZ29yeU1hc3Rlckxpc3QgPSB0aGlzLmZyYW1ld29ya0RldGFpbHMuZnJhbWV3b3JrRGF0YTtcbiAgICBfLmZvckVhY2goY2F0ZWdvcnlNYXN0ZXJMaXN0LCAoY2F0ZWdvcnkpID0+IHtcbiAgICAgIF8uZm9yRWFjaCh0aGlzLmxlYWZGb3JtQ29uZmlnLCAoZm9ybUZpZWxkQ2F0ZWdvcnkpID0+IHtcbiAgICAgICAgaWYgKGNhdGVnb3J5LmNvZGUgPT09IGZvcm1GaWVsZENhdGVnb3J5LmNvZGUpIHtcbiAgICAgICAgICBmb3JtRmllbGRDYXRlZ29yeS50ZXJtcyA9IGNhdGVnb3J5LnRlcm1zO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICB0aGlzLnF1ZXN0aW9uRm9ybUNvbmZpZyA9IF8uY2xvbmVEZWVwKHRoaXMubGVhZkZvcm1Db25maWcpO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHRoaXMudGVsZW1ldHJ5U2VydmljZS5pbXByZXNzaW9uKHtcbiAgICAgIHR5cGU6ICdlZGl0JywgcGFnZWlkOiB0aGlzLnRlbGVtZXRyeVNlcnZpY2UudGVsZW1ldHJ5UGFnZUlkLCB1cmk6IHRoaXMucm91dGVyLnVybCxcbiAgICAgIGR1cmF0aW9uOiAoRGF0ZS5ub3coKSAtIHRoaXMucGFnZVN0YXJ0VGltZSkgLyAxMDAwXG4gICAgfSk7XG4gIH1cblxuICBpbml0aWFsaXplKCkge1xuICAgIHRoaXMuZWRpdG9yU2VydmljZS5mZXRjaENvbGxlY3Rpb25IaWVyYXJjaHkodGhpcy5xdWVzdGlvblNldElkKS5zdWJzY3JpYmUoKHJlc3BvbnNlKSA9PiB7XG4gICAgICB0aGlzLnF1ZXN0aW9uU2V0SGllcmFyY2h5ID0gXy5nZXQocmVzcG9uc2UsICdyZXN1bHQucXVlc3Rpb25TZXQnKTtcbiAgICAgIGNvbnN0IHBhcmVudElkID0gdGhpcy5lZGl0b3JTZXJ2aWNlLnBhcmVudElkZW50aWZpZXIgPyB0aGlzLmVkaXRvclNlcnZpY2UucGFyZW50SWRlbnRpZmllciA6IHRoaXMucXVlc3Rpb25JZDtcbiAgICAgIC8vb25seSBmb3Igb2JzZXJ2YXRpb24sc3VydmV5LG9ic2VydmF0aW9uIHdpdGggcnVicmljc1xuICAgICAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmVudElkKSAmJiAhXy5pc1VuZGVmaW5lZCh0aGlzLmVkaXRvclNlcnZpY2UuZWRpdG9yQ29uZmlnLmNvbmZpZy5yZW5kZXJUYXhvbm9teSkpIHtcbiAgICAgICAgdGhpcy5nZXRQYXJlbnRRdWVzdGlvbk9wdGlvbnMocGFyZW50SWQpO1xuICAgICAgICBjb25zdCBzZWN0aW9uRGF0YSA9IHRoaXMudHJlZVNlcnZpY2UuZ2V0Tm9kZUJ5SWQocGFyZW50SWQpO1xuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IF8uZ2V0KHJlc3BvbnNlLCAncmVzdWx0LnF1ZXN0aW9uU2V0LmNoaWxkcmVuJyk7XG4gICAgICAgIHRoaXMuc2VjdGlvblByaW1hcnlDYXRlZ29yeSA9IF8uZ2V0KHJlc3BvbnNlLCAncmVzdWx0LnF1ZXN0aW9uU2V0LnByaW1hcnlDYXRlZ29yeScpO1xuICAgICAgICB0aGlzLnNlbGVjdGVkU2VjdGlvbklkID0gXy5nZXQoc2VjdGlvbkRhdGEsICdkYXRhLm1ldGFkYXRhLnBhcmVudCcpO1xuICAgICAgICB0aGlzLmdldEJyYW5jaGluZ0xvZ2ljKGNoaWxkcmVuKTtcbiAgICAgIH1cbiAgICAgIHRoaXMucXVlc3Rpb25Gb3JtQ29uZmlnID0gXy5jbG9uZURlZXAodGhpcy5sZWFmRm9ybUNvbmZpZyk7XG4gICAgICBsZXQgbGVhZkZvcm1Db25maWdGaWVsZHMgPSBfLmpvaW4oXy5tYXAodGhpcy5sZWFmRm9ybUNvbmZpZywgdmFsdWUgPT4gKHZhbHVlLmNvZGUpKSwgJywnKTtcbiAgICAgIGxlYWZGb3JtQ29uZmlnRmllbGRzICs9ICcsaXNSZXZpZXdNb2RpZmljYXRpb25BbGxvd2VkJztcbiAgICAgIGlmICghXy5pc1VuZGVmaW5lZCh0aGlzLnF1ZXN0aW9uSWQpKSB7XG4gICAgICAgIHRoaXMucXVlc3Rpb25TZXJ2aWNlLnJlYWRRdWVzdGlvbih0aGlzLnF1ZXN0aW9uSWQsIGxlYWZGb3JtQ29uZmlnRmllbGRzKVxuICAgICAgICAgIC5zdWJzY3JpYmUoKHJlcykgPT4ge1xuICAgICAgICAgICAgaWYgKF8uZ2V0KHJlcywgJ3Jlc3VsdCcpKSB7XG4gICAgICAgICAgICAgIHRoaXMucXVlc3Rpb25NZXRhRGF0YSA9IF8uZ2V0KHJlcywgJ3Jlc3VsdC5xdWVzdGlvbicpO1xuICAgICAgICAgICAgICB0aGlzLnF1ZXN0aW9uUHJpbWFyeUNhdGVnb3J5ID0gXy5nZXQodGhpcy5xdWVzdGlvbk1ldGFEYXRhLCdwcmltYXJ5Q2F0ZWdvcnknKTtcbiAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm1heC1saW5lLWxlbmd0aFxuICAgICAgICAgICAgICB0aGlzLnF1ZXN0aW9uSW50ZXJhY3Rpb25UeXBlID0gXy5nZXQodGhpcy5xdWVzdGlvbk1ldGFEYXRhLCdpbnRlcmFjdGlvblR5cGVzJykgPyBfLmdldCh0aGlzLnF1ZXN0aW9uTWV0YURhdGEsJ2ludGVyYWN0aW9uVHlwZXNbMF0nKSA6ICdkZWZhdWx0JztcbiAgICAgICAgICAgICAgdGhpcy5lZGl0b3JTZXJ2aWNlLnNldElzUmV2aWV3TW9kaWZpY2F0aW9uQWxsb3dlZChfLmdldCh0aGlzLnF1ZXN0aW9uTWV0YURhdGEsICdpc1Jldmlld01vZGlmaWNhdGlvbkFsbG93ZWQnLCBmYWxzZSkpO1xuICAgICAgICAgICAgICB0aGlzLnBvcHVsYXRlRm9ybURhdGEoKTtcbiAgICAgICAgICAgICAgaWYgKHRoaXMucXVlc3Rpb25JbnRlcmFjdGlvblR5cGUgPT09ICdkZWZhdWx0Jykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnF1ZXN0aW9uTWV0YURhdGEuZWRpdG9yU3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuZWRpdG9yU3RhdGUgPSB0aGlzLnF1ZXN0aW9uTWV0YURhdGEuZWRpdG9yU3RhdGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgaWYgKHRoaXMucXVlc3Rpb25JbnRlcmFjdGlvblR5cGUgPT09ICdzbGlkZXInKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucXVlc3Rpb25NZXRhRGF0YS5lZGl0b3JTdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgdGhpcy5lZGl0b3JTdGF0ZSA9IHRoaXMucXVlc3Rpb25NZXRhRGF0YS5lZGl0b3JTdGF0ZTtcbiAgICAgICAgICAgICAgICAgIHRoaXMuc2xpZGVyT3B0aW9ucyA9IHRoaXMucXVlc3Rpb25NZXRhRGF0YS5pbnRlcmFjdGlvbnMucmVzcG9uc2UxO1xuICAgICAgICAgICAgICAgICAgdGhpcy5zbGlkZXJEYXRhcyA9IHRoaXMucXVlc3Rpb25NZXRhRGF0YS5pbnRlcmFjdGlvbnMucmVzcG9uc2UxO1xuICAgICAgICAgICAgICAgICAgdGhpcy5oaW50cyA9IHRoaXMucXVlc3Rpb25NZXRhRGF0YS5oaW50cztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBpZiAodGhpcy5xdWVzdGlvbkludGVyYWN0aW9uVHlwZSA9PT0gJ3RleHQnKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucXVlc3Rpb25NZXRhRGF0YS5lZGl0b3JTdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgdGhpcy5lZGl0b3JTdGF0ZSA9IHRoaXMucXVlc3Rpb25NZXRhRGF0YS5lZGl0b3JTdGF0ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBpZiAodGhpcy5xdWVzdGlvbkludGVyYWN0aW9uVHlwZSA9PT0gJ2RhdGUnKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucXVlc3Rpb25NZXRhRGF0YS5lZGl0b3JTdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgdGhpcy5lZGl0b3JTdGF0ZSA9IHRoaXMucXVlc3Rpb25NZXRhRGF0YS5lZGl0b3JTdGF0ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBpZiAodGhpcy5xdWVzdGlvbkludGVyYWN0aW9uVHlwZSA9PT0gJ2Nob2ljZScpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZURlY2xhcmF0aW9uID0gdGhpcy5xdWVzdGlvbk1ldGFEYXRhLnJlc3BvbnNlRGVjbGFyYXRpb247XG4gICAgICAgICAgICAgICAgdGhpcy5zY29yZU1hcHBpbmcgPSBfLmdldChyZXNwb25zZURlY2xhcmF0aW9uLCAncmVzcG9uc2UxLm1hcHBpbmcnKTtcbiAgICAgICAgICAgICAgICBjb25zdCB0ZW1wbGF0ZUlkID0gdGhpcy5xdWVzdGlvbk1ldGFEYXRhLnRlbXBsYXRlSWQ7XG4gICAgICAgICAgICAgICAgY29uc3QgbnVtYmVyT2ZPcHRpb25zID0gdGhpcy5xdWVzdGlvbk1ldGFEYXRhPy5lZGl0b3JTdGF0ZT8ub3B0aW9ucz8ubGVuZ3RoIHx8IDA7XG4gICAgICAgICAgICAgICAgY29uc3QgbWF4aW11bU9wdGlvbnMgPSBfLmdldCh0aGlzLnF1ZXN0aW9uSW5wdXQsICdjb25maWcubWF4aW11bU9wdGlvbnMnKTtcbiAgICAgICAgICAgICAgICB0aGlzLmVkaXRvclNlcnZpY2Uub3B0aW9uc0xlbmd0aCA9IG51bWJlck9mT3B0aW9ucztcbiAgICAgICAgICAgICAgICBjb25zdCBvcHRpb25zID0gXy5tYXAodGhpcy5xdWVzdGlvbk1ldGFEYXRhPy5lZGl0b3JTdGF0ZT8ub3B0aW9ucywgb3B0aW9uID0+ICh7IGJvZHk6IG9wdGlvbi52YWx1ZS5ib2R5IH0pKTtcbiAgICAgICAgICAgICAgICBjb25zdCBxdWVzdGlvbiA9IHRoaXMucXVlc3Rpb25NZXRhRGF0YT8uZWRpdG9yU3RhdGU/LnF1ZXN0aW9uO1xuICAgICAgICAgICAgICAgIGNvbnN0IGludGVyYWN0aW9ucyA9IHRoaXMucXVlc3Rpb25NZXRhRGF0YT8uaW50ZXJhY3Rpb25zO1xuICAgICAgICAgICAgICAgIHRoaXMuZWRpdG9yU3RhdGUgPSBuZXcgTWNxRm9ybSh7XG4gICAgICAgICAgICAgICAgICBxdWVzdGlvbiwgb3B0aW9ucywgYW5zd2VyOiBfLmdldChyZXNwb25zZURlY2xhcmF0aW9uLCAncmVzcG9uc2UxLmNvcnJlY3RSZXNwb25zZS52YWx1ZScpXG4gICAgICAgICAgICAgICAgfSwgeyB0ZW1wbGF0ZUlkLCBudW1iZXJPZk9wdGlvbnMsbWF4aW11bU9wdGlvbnMgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5lZGl0b3JTdGF0ZS5zb2x1dGlvbnMgPSB0aGlzLnF1ZXN0aW9uTWV0YURhdGE/LmVkaXRvclN0YXRlPy5zb2x1dGlvbnM7XG4gICAgICAgICAgICAgICAgdGhpcy5lZGl0b3JTdGF0ZS5pbnRlcmFjdGlvbnMgPSBpbnRlcmFjdGlvbnM7XG4gICAgICAgICAgICAgICAgaWYgKF8uaGFzKHRoaXMucXVlc3Rpb25NZXRhRGF0YSwgJ3Jlc3BvbnNlRGVjbGFyYXRpb24nKSkge1xuICAgICAgICAgICAgICAgICAgdGhpcy5lZGl0b3JTdGF0ZS5yZXNwb25zZURlY2xhcmF0aW9uID0gXy5nZXQodGhpcy5xdWVzdGlvbk1ldGFEYXRhLCAncmVzcG9uc2VEZWNsYXJhdGlvbicpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoXy5oYXModGhpcy5xdWVzdGlvbk1ldGFEYXRhLCAncHJpbWFyeUNhdGVnb3J5JykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVkaXRvclN0YXRlLnByaW1hcnlDYXRlZ29yeSA9IF8uZ2V0KHRoaXMucXVlc3Rpb25NZXRhRGF0YSwgJ3ByaW1hcnlDYXRlZ29yeScpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHRoaXMuc2V0UXVlc3Rpb25UaXRsZSh0aGlzLnF1ZXN0aW9uSWQpO1xuICAgICAgICAgICAgICBpZiAoIV8uaXNFbXB0eSh0aGlzLmVkaXRvclN0YXRlLnNvbHV0aW9ucykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkU29sdXRpb25UeXBlID0gdGhpcy5lZGl0b3JTdGF0ZS5zb2x1dGlvbnNbMF0udHlwZTtcbiAgICAgICAgICAgICAgICB0aGlzLnNvbHV0aW9uVVVJRCA9IHRoaXMuZWRpdG9yU3RhdGUuc29sdXRpb25zWzBdLmlkO1xuICAgICAgICAgICAgICAgIHRoaXMuc2hvd1NvbHV0aW9uRHJvcERvd24gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dTb2x1dGlvbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRTb2x1dGlvblR5cGUgPT09ICd2aWRlbycpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gXy5maW5kSW5kZXgodGhpcy5xdWVzdGlvbk1ldGFEYXRhLm1lZGlhLCAobykgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gby50eXBlID09PSAndmlkZW8nICYmIG8uaWQgPT09IHRoaXMuZWRpdG9yU3RhdGUuc29sdXRpb25zWzBdLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICB0aGlzLnZpZGVvU29sdXRpb25OYW1lID0gdGhpcy5xdWVzdGlvbk1ldGFEYXRhLm1lZGlhW2luZGV4XS5uYW1lO1xuICAgICAgICAgICAgICAgICAgdGhpcy52aWRlb1RodW1ibmFpbCA9IHRoaXMucXVlc3Rpb25NZXRhRGF0YS5tZWRpYVtpbmRleF0udGh1bWJuYWlsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zZWxlY3RlZFNvbHV0aW9uVHlwZSA9PT0gJ2h0bWwnKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLmVkaXRvclN0YXRlLnNvbHV0aW9ucyA9IHRoaXMuZWRpdG9yU3RhdGUuc29sdXRpb25zWzBdLnZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAodGhpcy5xdWVzdGlvbk1ldGFEYXRhLm1lZGlhKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5tZWRpYUFyciA9IHRoaXMucXVlc3Rpb25NZXRhRGF0YS5tZWRpYTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvKiogZm9yIG9ic2VydmF0aW9uIGFuZCBzdXJ2ZXkgdG8gc2hvdyBoaW50LHRpcCxkZXBlbmRlbnQgcXVlc3Rpb24gb3B0aW9uLiAqL1xuICAgICAgICAgICAgICBpZighXy5pc1VuZGVmaW5lZCh0aGlzLmVkaXRvclNlcnZpY2U/LmVkaXRvckNvbmZpZz8uY29uZmlnPy5yZW5kZXJUYXhvbm9teSkpe1xuICAgICAgICAgICAgICAgIHRoaXMuc3ViTWVudUNvbmZpZygpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHRoaXMuY29udGVudENvbW1lbnQgPSBfLmdldCh0aGlzLmNyZWF0aW9uQ29udGV4dCwgJ2NvcnJlY3Rpb25Db21tZW50cycpO1xuICAgICAgICAgICAgICBpZiAodGhpcy5zaG93UHJldmlldykge1xuICAgICAgICAgICAgICAgIHRoaXMucHJldmlld0NvbnRlbnQoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB0aGlzLnNob3dMb2FkZXIgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LCAoZXJyOiBTZXJ2ZXJSZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZXJySW5mbyA9IHtcbiAgICAgICAgICAgICAgZXJyb3JNc2c6ICdGZXRjaGluZyBxdWVzdGlvbiBkZXRhaWxzIGZhaWxlZC4gUGxlYXNlIHRyeSBhZ2Fpbi4uLicsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IodGhpcy5lZGl0b3JTZXJ2aWNlLmFwaUVycm9ySGFuZGxpbmcoZXJyLCBlcnJJbmZvKSk7XG4gICAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAoXy5pc1VuZGVmaW5lZCh0aGlzLnF1ZXN0aW9uSWQpKSB7XG4gICAgICAgIHRoaXMudGVtcFF1ZXN0aW9uSWQgPSB1dWlkdjQoKTtcbiAgICAgICAgdGhpcy5wb3B1bGF0ZUZvcm1EYXRhKCk7XG4gICAgICAgIHRoaXMuc2V0UXVlc3Rpb25UaXRsZSgpO1xuICAgICAgICBsZXQgZWRpdG9yU3RhdGUgPSB7fVxuICAgICAgICBpZiAodGhpcy5xdWVzdGlvbkludGVyYWN0aW9uVHlwZSA9PT0gJ2RlZmF1bHQnKSB7XG4gICAgICAgICAgaWYgKHRoaXMucXVlc3Rpb25DYXRlZ29yeSkge1xuICAgICAgICAgICAgZWRpdG9yU3RhdGUgPSBfLmdldCh0aGlzLmNvbmZpZ1NlcnZpY2UsIGBlZGl0b3JDb25maWcuZGVmYXVsdFN0YXRlcy5ub25JbnRlcmFjdGl2ZVF1ZXN0aW9ucy4ke3RoaXMucXVlc3Rpb25DYXRlZ29yeX1gKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5lZGl0b3JTdGF0ZSA9IHsgcXVlc3Rpb246ICcnLCBhbnN3ZXI6ICcnLCBzb2x1dGlvbnM6ICcnIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuZWRpdG9yU3RhdGUgPSB7IC4uLmVkaXRvclN0YXRlIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5xdWVzdGlvbkludGVyYWN0aW9uVHlwZSA9PT0gJ2Nob2ljZScpIHtcbiAgICAgICAgICB0aGlzLmVkaXRvclN0YXRlID0gbmV3IE1jcUZvcm0oeyBxdWVzdGlvbjogJycsIG9wdGlvbnM6IFtdIH0sIHsgbnVtYmVyT2ZPcHRpb25zOiBfLmdldCh0aGlzLnF1ZXN0aW9uSW5wdXQsICdjb25maWcubnVtYmVyT2ZPcHRpb25zJyksIG1heGltdW1PcHRpb25zOiBfLmdldCh0aGlzLnF1ZXN0aW9uSW5wdXQsICdjb25maWcubWF4aW11bU9wdGlvbnMnKSB9KTtcbiAgICAgICAgfVxuICAgICAgICAvKiogZm9yIG9ic2VydmF0aW9uIGFuZCBzdXJ2ZXkgdG8gc2hvdyBoaW50LHRpcCxkZXBlbmRlbnQgcXVlc3Rpb24gb3B0aW9uLiAqL1xuICAgICAgICBpZighXy5pc1VuZGVmaW5lZCh0aGlzLmVkaXRvclNlcnZpY2U/LmVkaXRvckNvbmZpZz8uY29uZmlnPy5yZW5kZXJUYXhvbm9teSkpe1xuICAgICAgICAgIHRoaXMuc3ViTWVudUNvbmZpZygpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2hvd0xvYWRlciA9IGZhbHNlO1xuICAgICAgfVxuICAgIH0sIChlcnI6IFNlcnZlclJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCBlcnJJbmZvID0ge1xuICAgICAgICBlcnJvck1zZzogJ0ZldGNoaW5nIHF1ZXN0aW9uIHNldCBkZXRhaWxzIGZhaWxlZC4gUGxlYXNlIHRyeSBhZ2Fpbi4uLicsXG4gICAgICB9O1xuICAgICAgdGhpcy5lZGl0b3JTZXJ2aWNlLmFwaUVycm9ySGFuZGxpbmcoZXJyLCBlcnJJbmZvKTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldCBjb250ZW50UG9saWN5VXJsKCkge1xuICAgIHJldHVybiB0aGlzLmVkaXRvclNlcnZpY2UuY29udGVudFBvbGljeVVybDtcbiAgfVxuXG4gIHRvb2xiYXJFdmVudExpc3RlbmVyKGV2ZW50KSB7XG4gICAgdGhpcy5hY3Rpb25UeXBlID0gZXZlbnQuYnV0dG9uO1xuICAgIHN3aXRjaCAoZXZlbnQuYnV0dG9uKSB7XG4gICAgICBjYXNlICdzYXZlQ29udGVudCc6XG4gICAgICAgIHRoaXMuc2hvd0FkZFNlY29uZGFyeVF1ZXN0aW9uQ2F0ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc2F2ZUNvbnRlbnQoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdzaG93VHJhbnNsYXRpb24nOlxuICAgICAgICB0aGlzLnNob3dUcmFuc2xhdGlvbiA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnc3VibWl0UXVlc3Rpb24nOlxuICAgICAgICB0aGlzLnN1Ym1pdEhhbmRsZXIoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdjYW5jZWxDb250ZW50JzpcbiAgICAgICAgdGhpcy5oYW5kbGVSZWRpcmVjdFRvUXVlc3Rpb25zZXQoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdyZWplY3RRdWVzdGlvbic6XG4gICAgICAgIHRoaXMucmVqZWN0UXVlc3Rpb24oZXZlbnQuY29tbWVudCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAncHVibGlzaFF1ZXN0aW9uJzpcbiAgICAgICAgdGhpcy5wdWJsaXNoUXVlc3Rpb24oZXZlbnQpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3NvdXJjaW5nQXBwcm92ZVF1ZXN0aW9uJzpcbiAgICAgICAgdGhpcy5zb3VyY2luZ1VwZGF0ZShldmVudCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnc291cmNpbmdSZWplY3RRdWVzdGlvbic6XG4gICAgICAgIHRoaXMuc291cmNpbmdVcGRhdGUoZXZlbnQpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3NlbmRGb3JDb3JyZWN0aW9uc1F1ZXN0aW9uJzpcbiAgICAgICAgdGhpcy5zZW5kQmFja1F1ZXN0aW9uKGV2ZW50KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdiYWNrQ29udGVudCc6XG4gICAgICAgIHRoaXMuaGFuZGxlUmVkaXJlY3RUb1F1ZXN0aW9uc2V0KCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAncHJldmlld0NvbnRlbnQnOlxuICAgICAgICB0aGlzLnByZXZpZXdDb250ZW50KCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZWRpdENvbnRlbnQnOlxuICAgICAgICB0aGlzLmlzUmVhZE9ubHlNb2RlID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc2hvd1ByZXZpZXcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy50b29sYmFyQ29uZmlnLnNob3dQcmV2aWV3ID0gZmFsc2U7XG4gICAgICAgIHRoaXMucHJldmlld0Zvcm1EYXRhKCF0aGlzLnRvb2xiYXJDb25maWcuc2hvd1ByZXZpZXcpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3Nob3dSZXZpZXdjb21tZW50cyc6XG4gICAgICAgIHRoaXMuc2hvd1Jldmlld01vZGFsID0gIXRoaXMuc2hvd1Jldmlld01vZGFsO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3NhdmVRdWFsaXR5UGFyYW1ldGVycycgOlxuICAgICAgICB0aGlzLnNob3dRdWFsaXR5UGFyYW1ldGVyUG9wdXAgPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIGhhbmRsZVJlZGlyZWN0VG9RdWVzdGlvbnNldCgpIHtcbiAgICBpZiAoXy5pc1VuZGVmaW5lZCh0aGlzLnF1ZXN0aW9uSWQpIHx8IHRoaXMuY3JlYXRpb25Nb2RlID09PSAnZWRpdCcpIHtcbiAgICAgIHRoaXMuc2hvd0NvbmZpcm1Qb3B1cCA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmVkaXJlY3RUb1F1ZXN0aW9uc2V0KCk7XG4gICAgfVxuICB9XG5cblxuICBzdWJtaXRIYW5kbGVyKCkge1xuICAgIHRoaXMudmFsaWRhdGVRdWVzdGlvbkRhdGEoKTtcbiAgICB0aGlzLnZhbGlkYXRlRm9ybUZpZWxkcygpO1xuICAgIGlmICh0aGlzLnNob3dGb3JtRXJyb3IgPT09IGZhbHNlKSB7XG4gICAgICB0aGlzLnNob3dTdWJtaXRDb25maXJtUG9wdXAgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHNhdmVDb250ZW50KCkge1xuICAgIHRoaXMudmFsaWRhdGVRdWVzdGlvbkRhdGEoKTtcbiAgICBpZiAodGhpcy5zaG93Rm9ybUVycm9yID09PSBmYWxzZSAmJiB0aGlzLnF1ZXN0aW9uTWV0YWRhdGFGb3JtU3RhdHVzID09PSB0cnVlKSB7XG4gICAgICB0aGlzLnNhdmVRdWVzdGlvbigpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnRvYXN0ZXJTZXJ2aWNlLmVycm9yKF8uZ2V0KHRoaXMuY29uZmlnU2VydmljZSwgJ2xhYmVsQ29uZmlnLm1lc3NhZ2VzLmVycm9yLjA0NCcpKTtcbiAgICB9XG4gIH1cblxuICBvbkNvbnNlbnRTdWJtaXQoZXZlbnQpIHtcbiAgICB0aGlzLnNob3dTdWJtaXRDb25maXJtUG9wdXAgPSBmYWxzZTtcbiAgICBpZiAoZXZlbnQpIHtcbiAgICAgIHRoaXMucXVlc3Rpb25NZXRhRGF0YSA9IF8uYXNzaWduKHRoaXMucXVlc3Rpb25NZXRhRGF0YSwge2lzUmV2aWV3TW9kaWZpY2F0aW9uQWxsb3dlZDogZXZlbnQuZWRpdGluZ0NvbnNlbnR9KTtcbiAgICAgIHRoaXMuc2VuZEZvclJldmlldygpO1xuICAgIH1cbiAgfVxuXG4gIHNlbmRGb3JSZXZpZXcoKSB7XG4gICAgaWYgKCFfLmdldCh0aGlzLmVkaXRvclNlcnZpY2UuZWRpdG9yQ29uZmlnLCAnY29uZmlnLnNraXBUd29MZXZlbFJldmlldycpKSB7XG4gICAgICBsZXQgY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuZWRpdG9yU2VydmljZS5yZXZpZXdDb250ZW50KHRoaXMucXVlc3Rpb25JZCkuc3Vic2NyaWJlKGRhdGEgPT4ge1xuICAgICAgICAgIHRoaXMudG9hc3RlclNlcnZpY2Uuc3VjY2VzcyhfLmdldCh0aGlzLmNvbmZpZ1NlcnZpY2UsICdsYWJlbENvbmZpZy5tZXNzYWdlcy5zdWNjZXNzLjAwMicpKTtcbiAgICAgICAgICB0aGlzLnJlZGlyZWN0VG9DaGFwdGVyTGlzdCgpO1xuICAgICAgICB9LCBlcnIgPT4ge1xuICAgICAgICAgIHRoaXMudG9hc3RlclNlcnZpY2UuZXJyb3IoXy5nZXQodGhpcy5jb25maWdTZXJ2aWNlLCAnbGFiZWxDb25maWcubWVzc2FnZXMuZXJyb3IuMDAyJykpO1xuICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgICBpZiAoIXRoaXMucXVlc3Rpb25JZCkge1xuICAgICAgICBjYWxsYmFjayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB0aGlzLmVkaXRvclNlcnZpY2UucmV2aWV3Q29udGVudCh0aGlzLnF1ZXN0aW9uSWQpLnN1YnNjcmliZShkYXRhID0+IHtcbiAgICAgICAgICAgIHRoaXMudG9hc3RlclNlcnZpY2Uuc3VjY2VzcyhfLmdldCh0aGlzLmNvbmZpZ1NlcnZpY2UsICdsYWJlbENvbmZpZy5tZXNzYWdlcy5zdWNjZXNzLjAwMicpKTtcbiAgICAgICAgICAgIHRoaXMuYWRkUmVzb3VyY2VUb1F1ZXN0aW9uc2V0KCk7XG4gICAgICAgICAgfSwgZXJyID0+IHtcbiAgICAgICAgICAgIHRoaXMudG9hc3RlclNlcnZpY2UuZXJyb3IoXy5nZXQodGhpcy5jb25maWdTZXJ2aWNlLCAnbGFiZWxDb25maWcubWVzc2FnZXMuZXJyb3IuMDAyJykpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjay5iaW5kKHRoaXMpO1xuICAgICAgdGhpcy51cHNlcnRRdWVzdGlvbihjYWxsYmFjayk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHB1Ymxpc2hDYWxsYmFjayA9IHRoaXMuc2VuZFF1ZXN0aW9uRm9yUHVibGlzaC5iaW5kKHRoaXMpO1xuICAgICAgY29uc3QgY2FsbGJhY2sgPSB0aGlzLmFkZFJlc291cmNlVG9RdWVzdGlvbnNldC5iaW5kKHRoaXMsIHB1Ymxpc2hDYWxsYmFjayk7XG4gICAgICB0aGlzLnVwc2VydFF1ZXN0aW9uKGNhbGxiYWNrKTtcbiAgICB9XG4gIH1cblxuICByZXF1ZXN0Rm9yQ2hhbmdlcyhjb21tZW50KSB7XG4gICAgICB0aGlzLmVkaXRvclNlcnZpY2Uuc3VibWl0UmVxdWVzdENoYW5nZXModGhpcy5xdWVzdGlvbklkLCBjb21tZW50KS5zdWJzY3JpYmUocmVzID0+IHtcbiAgICAgICAgdGhpcy50b2FzdGVyU2VydmljZS5zdWNjZXNzKF8uZ2V0KHRoaXMuY29uZmlnU2VydmljZSwgJ2xhYmVsQ29uZmlnLm1lc3NhZ2VzLnN1Y2Nlc3MuMDAzJykpO1xuICAgICAgICB0aGlzLnJlZGlyZWN0VG9DaGFwdGVyTGlzdCgpO1xuICAgICAgfSwgZXJyID0+IHtcbiAgICAgICAgdGhpcy50b2FzdGVyU2VydmljZS5lcnJvcihfLmdldCh0aGlzLmNvbmZpZ1NlcnZpY2UsICdsYWJlbENvbmZpZy5tZXNzYWdlcy5lcnJvci4wMDMnKSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHNlbmRRdWVzdGlvbkZvclB1Ymxpc2goZXZlbnQpIHtcbiAgICB0aGlzLmVkaXRvclNlcnZpY2UucHVibGlzaENvbnRlbnQodGhpcy5xdWVzdGlvbklkLCBldmVudCkuc3Vic2NyaWJlKHJlcyA9PiB7XG4gICAgICBpZiAoISh0aGlzLmNyZWF0aW9uTW9kZSA9PT0gJ3NvdXJjaW5nUmV2aWV3JyAmJiB0aGlzLmVkaXRvclNlcnZpY2UuaXNSZXZpZXdNb2RpZmljYXRpb25BbGxvd2VkKSkge1xuICAgICAgICB0aGlzLnRvYXN0ZXJTZXJ2aWNlLnN1Y2Nlc3MoXy5nZXQodGhpcy5jb25maWdTZXJ2aWNlLCAnbGFiZWxDb25maWcubWVzc2FnZXMuc3VjY2Vzcy4wMzcnKSk7XG4gICAgICB9XG4gICAgICB0aGlzLnJlZGlyZWN0VG9DaGFwdGVyTGlzdCgpO1xuICAgIH0sIGVyciA9PiB7XG4gICAgICB0aGlzLnRvYXN0ZXJTZXJ2aWNlLmVycm9yKF8uZ2V0KHRoaXMuY29uZmlnU2VydmljZSwgJ2xhYmVsQ29uZmlnLm1lc3NhZ2VzLmVycm9yLjAzOCcpKTtcbiAgICB9KTtcbiAgfVxuXG4gIHJlamVjdFF1ZXN0aW9uKGNvbW1lbnQpIHtcbiAgICBjb25zdCBlZGl0YWJsZUZpZWxkcyA9IF8uZ2V0KHRoaXMuY3JlYXRpb25Db250ZXh0LCAnZWRpdGFibGVGaWVsZHMnKTtcbiAgICBpZiAodGhpcy5jcmVhdGlvbk1vZGUgPT09ICdvcmdyZXZpZXcnICYmIGVkaXRhYmxlRmllbGRzICYmICFfLmlzRW1wdHkoZWRpdGFibGVGaWVsZHNbdGhpcy5jcmVhdGlvbk1vZGVdKSkge1xuICAgICAgdGhpcy52YWxpZGF0ZUZvcm1GaWVsZHMoKTtcbiAgICAgIGlmKHRoaXMuc2hvd0Zvcm1FcnJvciA9PT0gdHJ1ZSkge1xuICAgICAgICB0aGlzLnRvYXN0ZXJTZXJ2aWNlLmVycm9yKF8uZ2V0KHRoaXMuY29uZmlnU2VydmljZSwgJ2xhYmVsQ29uZmlnLm1lc3NhZ2VzLmVycm9yLjAyOScpKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgbGV0IGNhbGxiYWNrID0gdGhpcy5yZXF1ZXN0Rm9yQ2hhbmdlcy5iaW5kKHRoaXMsIFtjb21tZW50XSk7XG4gICAgICB0aGlzLnVwc2VydFF1ZXN0aW9uKGNhbGxiYWNrKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yZXF1ZXN0Rm9yQ2hhbmdlcyhjb21tZW50KTtcbiAgICB9XG4gIH1cblxuICBwdWJsaXNoUXVlc3Rpb24oZXZlbnQpIHtcbiAgICBjb25zdCBlZGl0YWJsZUZpZWxkcyA9IF8uZ2V0KHRoaXMuY3JlYXRpb25Db250ZXh0LCAnZWRpdGFibGVGaWVsZHMnKTtcbiAgICBpZiAodGhpcy5jcmVhdGlvbk1vZGUgPT09ICdvcmdyZXZpZXcnICYmIGVkaXRhYmxlRmllbGRzICYmICFfLmlzRW1wdHkoZWRpdGFibGVGaWVsZHNbdGhpcy5jcmVhdGlvbk1vZGVdKSkge1xuICAgICAgdGhpcy52YWxpZGF0ZUZvcm1GaWVsZHMoKTtcbiAgICAgIGlmKHRoaXMuc2hvd0Zvcm1FcnJvciA9PT0gdHJ1ZSkge1xuICAgICAgICB0aGlzLnRvYXN0ZXJTZXJ2aWNlLmVycm9yKF8uZ2V0KHRoaXMuY29uZmlnU2VydmljZSwgJ2xhYmVsQ29uZmlnLm1lc3NhZ2VzLmVycm9yLjAyOScpKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgbGV0IGNhbGxiYWNrID0gdGhpcy5zZW5kUXVlc3Rpb25Gb3JQdWJsaXNoLmJpbmQodGhpcywgW2V2ZW50XSk7XG4gICAgICB0aGlzLnVwc2VydFF1ZXN0aW9uKGNhbGxiYWNrKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZW5kUXVlc3Rpb25Gb3JQdWJsaXNoKGV2ZW50KTtcbiAgICB9XG4gIH1cblxuICBzb3VyY2luZ1VwZGF0ZShldmVudCkge1xuICAgIGNvbnN0IGVkaXRhYmxlRmllbGRzID0gXy5nZXQodGhpcy5jcmVhdGlvbkNvbnRleHQsICdlZGl0YWJsZUZpZWxkcycpO1xuICAgIGlmICh0aGlzLmNyZWF0aW9uTW9kZSA9PT0gJ3NvdXJjaW5ncmV2aWV3JyAmJiBlZGl0YWJsZUZpZWxkcyAmJiAhXy5pc0VtcHR5KGVkaXRhYmxlRmllbGRzW3RoaXMuY3JlYXRpb25Nb2RlXSkpIHtcbiAgICAgIHRoaXMudmFsaWRhdGVGb3JtRmllbGRzKCk7XG4gICAgICBpZih0aGlzLnNob3dGb3JtRXJyb3IgPT09IHRydWUpIHtcbiAgICAgICAgdGhpcy50b2FzdGVyU2VydmljZS5lcnJvcihfLmdldCh0aGlzLmNvbmZpZ1NlcnZpY2UsICdsYWJlbENvbmZpZy5tZXNzYWdlcy5lcnJvci4wMjknKSk7XG4gICAgICAgIHJldHVybiBmYWxzZTsgICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGxldCBxdWVzdGlvbklkcyA9IFtdO1xuICAgICAgLy9sZXQgY29tbWVudHMgPSB7fTtcbiAgICAgIGxldCBjb21tZW50cyA9IGV2ZW50LmNvbW1lbnRcbiAgICAgIGxldCBzdWNjZXNzTWVzc2FnZSA9ICcnO1xuICAgICAgdGhpcy5lZGl0b3JTZXJ2aWNlLmZldGNoQ29sbGVjdGlvbkhpZXJhcmNoeSh0aGlzLnF1ZXN0aW9uU2V0SWQpLnN1YnNjcmliZShyZXMgPT4ge1xuICAgICAgICBjb25zdCBxdWVzdGlvblNldCA9IHJlcy5yZXN1bHRbJ3F1ZXN0aW9uU2V0J107XG4gICAgICAgIHN3aXRjaCAoZXZlbnQuYnV0dG9uKSB7XG4gICAgICAgICAgY2FzZSAnc291cmNpbmdBcHByb3ZlUXVlc3Rpb24nOlxuICAgICAgICAgICAgcXVlc3Rpb25JZHMgPSBxdWVzdGlvblNldC5hY2NlcHRlZENvbnRyaWJ1dGlvbnMgfHwgW107XG4gICAgICAgICAgICBzdWNjZXNzTWVzc2FnZSA9IF8uZ2V0KHRoaXMuY29uZmlnU2VydmljZSwgJ2xhYmVsQ29uZmlnLm1lc3NhZ2VzLnN1Y2Nlc3MuMDM4JylcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ3NvdXJjaW5nUmVqZWN0UXVlc3Rpb24nOlxuICAgICAgICAgICAgcXVlc3Rpb25JZHMgPSBxdWVzdGlvblNldC5yZWplY3RlZENvbnRyaWJ1dGlvbnMgfHwgW107XG4gICAgICAgICAgICBjb21tZW50cyA9IHF1ZXN0aW9uU2V0LnJlamVjdGVkQ29udHJpYnV0aW9uQ29tbWVudHMgfHwge307XG4gICAgICAgICAgICBjb21tZW50c1t0aGlzLnF1ZXN0aW9uSWRdID0gZXZlbnQuY29tbWVudDtcbiAgICAgICAgICAgIHN1Y2Nlc3NNZXNzYWdlID0gXy5nZXQodGhpcy5jb25maWdTZXJ2aWNlLCAnbGFiZWxDb25maWcubWVzc2FnZXMuc3VjY2Vzcy4wMzknKVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHF1ZXN0aW9uSWRzLnB1c2godGhpcy5xdWVzdGlvbklkKTtcbiAgICAgICAgZXZlbnRbJ3JlcXVlc3RCb2R5J10gPSB0aGlzLnByZXBhcmVTb3VyY2luZ1VwZGF0ZUJvZHkocXVlc3Rpb25JZHMsIGNvbW1lbnRzKTtcbiAgICAgICAgdGhpcy5lZGl0b3JTZXJ2aWNlLnVwZGF0ZUNvbGxlY3Rpb24odGhpcy5xdWVzdGlvblNldElkLCBldmVudCkuc3Vic2NyaWJlKHJlcyA9PiB7XG4gICAgICAgICAgdGhpcy50b2FzdGVyU2VydmljZS5zdWNjZXNzKHN1Y2Nlc3NNZXNzYWdlKTtcbiAgICAgICAgICB0aGlzLnJlZGlyZWN0VG9DaGFwdGVyTGlzdCgpO1xuICAgICAgICB9KVxuICAgICAgfSlcbiAgICB9XG5cbiAgc2VuZEJhY2tRdWVzdGlvbihldmVudCkge1xuICAgIHRoaXMucXVlc3Rpb25TZXJ2aWNlLnJlYWRRdWVzdGlvbih0aGlzLnF1ZXN0aW9uSWQsICdzdGF0dXMnKVxuICAgICAgLnN1YnNjcmliZSgocmVzKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3RPYmogPSB7XG4gICAgICAgICAgcXVlc3Rpb246IHtcbiAgICAgICAgICAgIHByZXZTdGF0dXM6IF8uZ2V0KHJlcy5yZXN1bHQsIGBxdWVzdGlvbi5zdGF0dXNgKSxcbiAgICAgICAgICAgIHN0YXR1czogJ0RyYWZ0JyxcbiAgICAgICAgICAgIHJlcXVlc3RDaGFuZ2VzOiBldmVudC5jb21tZW50XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLnF1ZXN0aW9uU2VydmljZS51cGRhdGVRdWVzdGlvbih0aGlzLnF1ZXN0aW9uSWQsIHJlcXVlc3RPYmopLnN1YnNjcmliZShyZXMgPT4ge1xuICAgICAgICAgICAgdGhpcy50b2FzdGVyU2VydmljZS5zdWNjZXNzKF8uZ2V0KHRoaXMuY29uZmlnU2VydmljZSwgJ2xhYmVsQ29uZmlnLm1lc3NhZ2VzLnN1Y2Nlc3MuMDQwJykpO1xuICAgICAgICAgICAgdGhpcy5yZWRpcmVjdFRvQ2hhcHRlckxpc3QoKTtcbiAgICAgICAgfSk7XG4gICAgICB9LCAoZXJyOiBTZXJ2ZXJSZXNwb25zZSkgPT4ge1xuICAgICAgICBjb25zdCBlcnJJbmZvID0ge1xuICAgICAgICAgIGVycm9yTXNnOiAnQ2Fubm90IHVwZGF0ZSBxdWVzdGlvbiBzdGF0dXMuIFBsZWFzZSB0cnkgYWdhaW4uLi4nLFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmVkaXRvclNlcnZpY2UuYXBpRXJyb3JIYW5kbGluZyhlcnIsIGVyckluZm8pO1xuICAgICAgfSk7XG4gIH1cblxuICB2YWxpZGF0ZVF1ZXN0aW9uRGF0YSgpIHtcblxuICAgIGlmIChbdW5kZWZpbmVkLCAnJ10uaW5jbHVkZXModGhpcy5lZGl0b3JTdGF0ZS5xdWVzdGlvbikpIHtcbiAgICAgIHRoaXMuc2hvd0Zvcm1FcnJvciA9IHRydWU7XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2hvd0Zvcm1FcnJvciA9IGZhbHNlO1xuICAgIH1cblxuXG4gICAgLy8gdG8gaGFuZGxlIHdoZW4gcXVlc3Rpb24gdHlwZSBpcyBzdWJqZWN0aXZlXG4gICAgaWYgKHRoaXMucXVlc3Rpb25JbnRlcmFjdGlvblR5cGUgPT09ICdkZWZhdWx0Jykge1xuICAgICAgaWYgKHRoaXMuZWRpdG9yU3RhdGUuYW5zd2VyICE9PSAnJykge1xuICAgICAgICB0aGlzLnNob3dGb3JtRXJyb3IgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2hvd0Zvcm1FcnJvciA9IHRydWU7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyB0byBoYW5kbGUgd2hlbiBxdWVzdGlvbiB0eXBlIGlzIG1jcVxuICAgIGlmICh0aGlzLnF1ZXN0aW9uSW50ZXJhY3Rpb25UeXBlID09PSAnY2hvaWNlJykge1xuICAgICAgY29uc3QgZGF0YSA9IF8uZ2V0KHRoaXMudHJlZU5vZGVEYXRhLCAnZGF0YS5tZXRhZGF0YScpO1xuICAgICAgaWYgKF8uZ2V0KHRoaXMuZWRpdG9yU3RhdGUsICdpbnRlcmFjdGlvblR5cGVzWzBdJykgPT09ICdjaG9pY2UnICYmXG4gICAgICAgIF8uaXNFbXB0eSh0aGlzLmVkaXRvclN0YXRlPy5yZXNwb25zZURlY2xhcmF0aW9uPy5yZXNwb25zZTE/Lm1hcHBpbmcpICYmXG4gICAgICAgICFfLmlzVW5kZWZpbmVkKHRoaXMuZWRpdG9yU2VydmljZT8uZWRpdG9yQ29uZmlnPy5jb25maWc/LnJlbmRlclRheG9ub215KSAmJlxuICAgICAgICBfLmdldChkYXRhLCdhbGxvd1Njb3JpbmcnKSA9PT0gJ1llcycpIHtcbiAgICAgICAgdGhpcy50b2FzdGVyU2VydmljZS5lcnJvcihfLmdldCh0aGlzLmNvbmZpZ1NlcnZpY2UsICdsYWJlbENvbmZpZy5tZXNzYWdlcy5lcnJvci4wMDUnKSk7XG4gICAgICAgIHRoaXMuc2hvd0Zvcm1FcnJvciA9IHRydWU7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2hvd0Zvcm1FcnJvciA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgY29uc3Qgb3B0aW9uVmFsaWQgPSBfLmZpbmQodGhpcy5lZGl0b3JTdGF0ZS5vcHRpb25zLCBvcHRpb24gPT5cbiAgICAgICAgKG9wdGlvbi5ib2R5ID09PSB1bmRlZmluZWQgfHwgb3B0aW9uLmJvZHkgPT09ICcnIHx8IG9wdGlvbi5sZW5ndGggPiB0aGlzLnNldENoYXJhY3RlckxpbWl0KSk7XG4gICAgICBpZiAob3B0aW9uVmFsaWQgfHwgKCF0aGlzLmVkaXRvclN0YXRlLmFuc3dlciAmJiB0aGlzLnNvdXJjaW5nU2V0dGluZ3M/LmVuZm9yY2VDb3JyZWN0QW5zd2VyKSkge1xuICAgICAgICB0aGlzLnNob3dGb3JtRXJyb3IgPSB0cnVlO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNob3dGb3JtRXJyb3IgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5xdWVzdGlvbkludGVyYWN0aW9uVHlwZSA9PT0gJ3NsaWRlcicpIHtcbiAgICAgIGNvbnN0IG1pbiA9IF8uZ2V0KHRoaXMuc2xpZGVyRGF0YXMsICd2YWxpZGF0aW9uLnJhbmdlLm1pbicpO1xuICAgICAgY29uc3QgbWF4ID0gXy5nZXQodGhpcy5zbGlkZXJEYXRhcywgJ3ZhbGlkYXRpb24ucmFuZ2UubWF4Jyk7XG4gICAgICBjb25zdCBzdGVwID0gIF8uZ2V0KHRoaXMuc2xpZGVyRGF0YXMsICdzdGVwJyk7XG4gICAgICBpZiAoXy5pc0VtcHR5KHRoaXMuc2xpZGVyRGF0YXMpIHx8IF8uaXNFbXB0eShtaW4pIHx8IF8uaXNFbXB0eShtYXgpIHx8IF8uaXNFbXB0eShzdGVwKSkge1xuICAgICAgICB0aGlzLnRvYXN0ZXJTZXJ2aWNlLmVycm9yKF8uZ2V0KHRoaXMuY29uZmlnU2VydmljZSwgJ2xhYmVsQ29uZmlnLm1lc3NhZ2VzLmVycm9yLjAwNScpKTtcbiAgICAgICAgdGhpcy5zaG93Rm9ybUVycm9yID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2hvd0Zvcm1FcnJvciA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICB9XG5cbiAgcmVkaXJlY3RUb1F1ZXN0aW9uc2V0KCkge1xuICAgIHRoaXMuc2hvd0NvbmZpcm1Qb3B1cCA9IGZhbHNlO1xuICAgIHRoaXMudHJlZVNlcnZpY2UuY2xlYXJUcmVlQ2FjaGUoKTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLnNob3dBZGRTZWNvbmRhcnlRdWVzdGlvbkNhdCkge1xuICAgICAgICB0aGlzLnF1ZXN0aW9uRW1pdHRlci5lbWl0KHtcbiAgICAgICAgICB0eXBlOiBcImNyZWF0ZU5ld0NvbnRlbnRcIixcbiAgICAgICAgICBpc0NoaWxkUXVlc3Rpb246IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5lZGl0b3JTZXJ2aWNlLnBhcmVudElkZW50aWZpZXIgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICB0aGlzLnNob3dBZGRTZWNvbmRhcnlRdWVzdGlvbkNhdCA9IGZhbHNlO1xuICAgICAgdGhpcy5xdWVzdGlvbkVtaXR0ZXIuZW1pdCh7IHN0YXR1czogZmFsc2UgfSk7XG4gICAgfSwgMTAwKTtcbiAgfVxuXG4gIHJlZGlyZWN0VG9DaGFwdGVyTGlzdCgpIHtcbiAgICB0aGlzLnNob3dDb25maXJtUG9wdXAgPSBmYWxzZTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMucXVlc3Rpb25FbWl0dGVyLmVtaXQoeyB0eXBlOiAnY2xvc2UnLCBhY3Rpb25UeXBlOiB0aGlzLmFjdGlvblR5cGUsIGlkZW50aWZpZXI6IHRoaXMucXVlc3Rpb25JZCB9KTtcbiAgICB9LCAxMDApO1xuICB9XG5cbiAgZWRpdG9yRGF0YUhhbmRsZXIoZXZlbnQsIHR5cGU/KSB7XG4gICAgaWYgKHR5cGUgPT09ICdxdWVzdGlvbicpIHtcbiAgICAgIHRoaXMuZWRpdG9yU3RhdGUucXVlc3Rpb24gPSBldmVudC5ib2R5O1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ3NvbHV0aW9uJykge1xuICAgICAgdGhpcy5lZGl0b3JTdGF0ZS5zb2x1dGlvbnMgPSBldmVudC5ib2R5O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVkaXRvclN0YXRlID0gXy5hc3NpZ24odGhpcy5lZGl0b3JTdGF0ZSwgZXZlbnQuYm9keSk7XG4gICAgfVxuXG4gICAgaWYgKGV2ZW50Lm1lZGlhb2JqKSB7XG4gICAgICBjb25zdCBtZWRpYSA9IGV2ZW50Lm1lZGlhb2JqO1xuICAgICAgdGhpcy5zZXRNZWRpYShtZWRpYSk7XG4gICAgfVxuICB9XG5cbiAgc2V0TWVkaWEobWVkaWEpIHtcbiAgICBpZiAobWVkaWEpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gXy5maW5kKHRoaXMubWVkaWFBcnIsIG9iID0+IHtcbiAgICAgICAgcmV0dXJuIG9iLmlkID09PSBtZWRpYS5pZDtcbiAgICAgIH0pO1xuICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5tZWRpYUFyci5wdXNoKG1lZGlhKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhZGRSZXNvdXJjZVRvUXVlc3Rpb25zZXQoY2FsbGJhY2sgPSBudWxsKSB7XG4gICAgdGhpcy5lZGl0b3JTZXJ2aWNlLmFkZFJlc291cmNlVG9RdWVzdGlvbnNldCh0aGlzLnF1ZXN0aW9uU2V0SWQsIHRoaXMudW5pdElkLCB0aGlzLnF1ZXN0aW9uSWQpLnN1YnNjcmliZShyZXMgPT4ge1xuICAgICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnJlZGlyZWN0VG9DaGFwdGVyTGlzdCgpO1xuICAgICAgfVxuICAgIH0sIGVyciA9PiB7XG4gICAgICAgIGNvbnN0IGVyckluZm8gPSB7XG4gICAgICAgICAgZXJyb3JNc2c6ICdBZGRpbmcgcXVlc3Rpb24gdG8gcXVlc3Rpb25zZXQgZmFpbGVkLiBQbGVhc2UgdHJ5IGFnYWluLicsXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB0aHJvd0Vycm9yKHRoaXMuZWRpdG9yU2VydmljZS5hcGlFcnJvckhhbmRsaW5nKGVyciwgZXJySW5mbykpO1xuICAgIH0pXG4gIH1cblxuICBzYXZlUXVlc3Rpb24oKSB7XG4gICAgaWYoXy5nZXQodGhpcy5jcmVhdGlvbkNvbnRleHQsICdvYmplY3RUeXBlJykgPT09ICdxdWVzdGlvbicpIHtcbiAgICAgIGlmKHRoaXMuY3JlYXRpb25Nb2RlID09PSAnZWRpdCcpIHtcbiAgICAgICAgY29uc3QgY2FsbGJhY2sgPSB0aGlzLmFkZFJlc291cmNlVG9RdWVzdGlvbnNldC5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLnVwc2VydFF1ZXN0aW9uKGNhbGxiYWNrKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5jcmVhdGlvbk1vZGUgPT09ICdzb3VyY2luZ1JldmlldycpIHtcbiAgICAgICAgY29uc3QgY2FsbGJhY2sgPSB0aGlzLnNlbmRRdWVzdGlvbkZvclB1Ymxpc2guYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy51cHNlcnRRdWVzdGlvbihjYWxsYmFjayk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnVwc2VydFF1ZXN0aW9uKHVuZGVmaW5lZCk7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgaWYgKF8uaXNVbmRlZmluZWQodGhpcy5xdWVzdGlvbklkKSkge1xuICAgICAgICB0aGlzLmNyZWF0ZVF1ZXN0aW9uKCk7XG4gICAgICB9XG4gICAgICBpZiAoIV8uaXNVbmRlZmluZWQodGhpcy5xdWVzdGlvbklkKSkge1xuICAgICAgICB0aGlzLnVwZGF0ZVF1ZXN0aW9uKCk7XG4gICAgICB9XG4gIH1cbiAgfVxuXG4gIHZpZGVvRGF0YU91dHB1dChldmVudCkge1xuICAgIGlmIChldmVudCkge1xuICAgICAgdGhpcy52aWRlb1NvbHV0aW9uRGF0YSA9IGV2ZW50O1xuICAgICAgdGhpcy52aWRlb1NvbHV0aW9uTmFtZSA9IGV2ZW50Lm5hbWU7XG4gICAgICB0aGlzLmVkaXRvclN0YXRlLnNvbHV0aW9ucyA9IGV2ZW50LmlkZW50aWZpZXI7XG4gICAgICB0aGlzLnZpZGVvVGh1bWJuYWlsID0gZXZlbnQudGh1bWJuYWlsO1xuICAgICAgY29uc3QgdmlkZW9NZWRpYTogYW55ID0ge307XG4gICAgICB2aWRlb01lZGlhLmlkID0gZXZlbnQuaWRlbnRpZmllcjtcbiAgICAgIHZpZGVvTWVkaWEuc3JjID0gZXZlbnQuc3JjO1xuICAgICAgdmlkZW9NZWRpYS50eXBlID0gJ3ZpZGVvJztcbiAgICAgIHZpZGVvTWVkaWEuYXNzZXRJZCA9IGV2ZW50LmlkZW50aWZpZXI7XG4gICAgICB2aWRlb01lZGlhLm5hbWUgPSBldmVudC5uYW1lO1xuICAgICAgdmlkZW9NZWRpYS50aHVtYm5haWwgPSB0aGlzLnZpZGVvVGh1bWJuYWlsO1xuICAgICAgdmlkZW9NZWRpYS5iYXNlVXJsID0gXy5nZXQodGhpcy5lZGl0b3JTZXJ2aWNlLmVkaXRvckNvbmZpZywgJ2NvbnRleHQuaG9zdCcpIHx8IGRvY3VtZW50LmxvY2F0aW9uLm9yaWdpbjtcbiAgICAgIGlmICh2aWRlb01lZGlhLnRodW1ibmFpbCkge1xuICAgICAgICBjb25zdCB0aHVtYm5haWxNZWRpYTogYW55ID0ge307XG4gICAgICAgIHRodW1ibmFpbE1lZGlhLnNyYyA9IHRoaXMudmlkZW9UaHVtYm5haWw7XG4gICAgICAgIHRodW1ibmFpbE1lZGlhLnR5cGUgPSAnaW1hZ2UnO1xuICAgICAgICB0aHVtYm5haWxNZWRpYS5pZCA9IGB2aWRlb18ke2V2ZW50LmlkZW50aWZpZXJ9YDtcbiAgICAgICAgdGh1bWJuYWlsTWVkaWEuYmFzZVVybCA9IF8uZ2V0KHRoaXMuZWRpdG9yU2VydmljZS5lZGl0b3JDb25maWcsICdjb250ZXh0Lmhvc3QnKSB8fCBkb2N1bWVudC5sb2NhdGlvbi5vcmlnaW47XG4gICAgICAgIHRoaXMubWVkaWFBcnIucHVzaCh0aHVtYm5haWxNZWRpYSk7XG4gICAgICB9XG4gICAgICB0aGlzLm1lZGlhQXJyLnB1c2godmlkZW9NZWRpYSk7XG4gICAgICB0aGlzLnNob3dTb2x1dGlvbkRyb3BEb3duID0gZmFsc2U7XG4gICAgICB0aGlzLnNob3dTb2x1dGlvbiA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGVsZXRlU29sdXRpb24oKTtcbiAgICB9XG4gICAgdGhpcy52aWRlb1Nob3cgPSBmYWxzZTtcbiAgfVxuXG4gIHNlbGVjdFNvbHV0aW9uVHlwZShkYXRhOiBhbnkpIHtcbiAgICBjb25zdCBpbmRleCA9IF8uZmluZEluZGV4KHRoaXMuc29sdXRpb25UeXBlcywgKHNvbDogYW55KSA9PiB7XG4gICAgICByZXR1cm4gc29sLnZhbHVlID09PSBkYXRhO1xuICAgIH0pO1xuICAgIHRoaXMuc2VsZWN0ZWRTb2x1dGlvblR5cGUgPSB0aGlzLnNvbHV0aW9uVHlwZXNbaW5kZXhdLnR5cGU7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRTb2x1dGlvblR5cGUgPT09ICd2aWRlbycpIHtcbiAgICAgIGNvbnN0IHNob3dWaWRlbyA9IHRydWU7XG4gICAgICB0aGlzLnZpZGVvU2hvdyA9IHNob3dWaWRlbztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zaG93U29sdXRpb25Ecm9wRG93biA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGRlbGV0ZVNvbHV0aW9uKCkge1xuICAgIGlmICh0aGlzLnNlbGVjdGVkU29sdXRpb25UeXBlID09PSAndmlkZW8nKSB7XG4gICAgICB0aGlzLm1lZGlhQXJyID0gXy5maWx0ZXIodGhpcy5tZWRpYUFyciwgKGl0ZW06IGFueSkgPT4gaXRlbS5pZCAhPT0gdGhpcy5lZGl0b3JTdGF0ZS5zb2x1dGlvbnMpO1xuICAgIH1cbiAgICB0aGlzLnNob3dTb2x1dGlvbkRyb3BEb3duID0gdHJ1ZTtcbiAgICB0aGlzLnNlbGVjdGVkU29sdXRpb25UeXBlID0gJyc7XG4gICAgdGhpcy52aWRlb1NvbHV0aW9uTmFtZSA9ICcnO1xuICAgIHRoaXMuZWRpdG9yU3RhdGUuc29sdXRpb25zID0gJyc7XG4gICAgdGhpcy52aWRlb1RodW1ibmFpbCA9ICcnO1xuICAgIHRoaXMuc2hvd1NvbHV0aW9uID0gZmFsc2U7XG4gIH1cblxuICBnZXRTb2x1dGlvbk9iaihzb2x1dGlvblVVSUQsIHNlbGVjdGVkU29sdXRpb25UeXBlLCBlZGl0b3JTdGF0ZVNvbHV0aW9uczogYW55KSB7XG4gICAgbGV0IHNvbHV0aW9uT2JqOiBhbnk7XG4gICAgc29sdXRpb25PYmogPSB7fTtcbiAgICBzb2x1dGlvbk9iai5pZCA9IHNvbHV0aW9uVVVJRDtcbiAgICBzb2x1dGlvbk9iai50eXBlID0gc2VsZWN0ZWRTb2x1dGlvblR5cGU7XG4gICAgaWYgKF8uaXNTdHJpbmcoZWRpdG9yU3RhdGVTb2x1dGlvbnMpKSB7XG4gICAgICBzb2x1dGlvbk9iai52YWx1ZSA9IGVkaXRvclN0YXRlU29sdXRpb25zO1xuICAgIH1cbiAgICBpZiAoXy5pc0FycmF5KGVkaXRvclN0YXRlU29sdXRpb25zKSkge1xuICAgICAgaWYgKF8uaGFzKGVkaXRvclN0YXRlU29sdXRpb25zWzBdLCAndmFsdWUnKSkge1xuICAgICAgICBzb2x1dGlvbk9iai52YWx1ZSA9IGVkaXRvclN0YXRlU29sdXRpb25zWzBdLnZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc29sdXRpb25PYmo7XG4gIH1cblxuICBnZXRRdWVzdGlvbk1ldGFkYXRhKCkge1xuICAgIGxldCBtZXRhZGF0YTogYW55ID0ge1xuICAgICAgbWltZVR5cGU6ICdhcHBsaWNhdGlvbi92bmQuc3VuYmlyZC5xdWVzdGlvbicsXG4gICAgICBtZWRpYTogdGhpcy5tZWRpYUFycixcbiAgICAgIGVkaXRvclN0YXRlOiB7fVxuICAgIH07XG4gICAgY29uc29sZS5sb2coJ2dldFF1ZXN0aW9uTWV0YWRhdGEnKTtcbiAgICBjb25zb2xlLmxvZyh0aGlzLmVkaXRvclN0YXRlKTtcbiAgICBtZXRhZGF0YSA9IF8uYXNzaWduKG1ldGFkYXRhLCB0aGlzLmVkaXRvclN0YXRlKTtcbiAgICBtZXRhZGF0YS5lZGl0b3JTdGF0ZS5xdWVzdGlvbiA9IG1ldGFkYXRhLnF1ZXN0aW9uO1xuICAgIG1ldGFkYXRhLmJvZHkgPSBtZXRhZGF0YS5xdWVzdGlvbjtcbiAgICBjb25zdCB0cmVlTm9kZURhdGEgPSBfLmdldCh0aGlzLnRyZWVOb2RlRGF0YSwgJ2RhdGEubWV0YWRhdGEnKTtcblxuICAgIGlmICghKF8uZ2V0KHRyZWVOb2RlRGF0YSwgXCJhbGxvd1Njb3JpbmdcIikgPT09IFwiWWVzXCIpKSB7XG4gICAgICBfLnNldChtZXRhZGF0YSwgXCJyZXNwb25zZURlY2xhcmF0aW9uLnJlc3BvbnNlMS5tYXBwaW5nXCIsIFtdKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5xdWVzdGlvbkludGVyYWN0aW9uVHlwZSA9PT0gJ2Nob2ljZScpIHtcbiAgICAgIG1ldGFkYXRhLmJvZHkgPSB0aGlzLmdldE1jcVF1ZXN0aW9uSHRtbEJvZHkodGhpcy5lZGl0b3JTdGF0ZS5xdWVzdGlvbiwgdGhpcy5lZGl0b3JTdGF0ZS50ZW1wbGF0ZUlkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbWV0YWRhdGEucmVzcG9uc2VEZWNsYXJhdGlvbiA9IHRoaXMuZ2V0UmVzcG9uc2VEZWNsYXJhdGlvbih0aGlzLnF1ZXN0aW9uSW50ZXJhY3Rpb25UeXBlKTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQodGhpcy5zZWxlY3RlZFNvbHV0aW9uVHlwZSkgJiYgIV8uaXNFbXB0eSh0aGlzLnNlbGVjdGVkU29sdXRpb25UeXBlKSkge1xuICAgICAgY29uc3Qgc29sdXRpb25PYmogPSB0aGlzLmdldFNvbHV0aW9uT2JqKHRoaXMuc29sdXRpb25VVUlELCB0aGlzLnNlbGVjdGVkU29sdXRpb25UeXBlLCB0aGlzLmVkaXRvclN0YXRlLnNvbHV0aW9ucyk7XG4gICAgICBtZXRhZGF0YS5lZGl0b3JTdGF0ZS5zb2x1dGlvbnMgPSBbc29sdXRpb25PYmpdO1xuICAgICAgbWV0YWRhdGEuc29sdXRpb25zID0gW3NvbHV0aW9uT2JqXTtcbiAgICB9XG4gICAgaWYgKF8uaXNFbXB0eSh0aGlzLmVkaXRvclN0YXRlLnNvbHV0aW9ucykpIHtcbiAgICAgIG1ldGFkYXRhLnNvbHV0aW9ucyA9IFtdO1xuICAgIH1cbiAgICBtZXRhZGF0YSA9IF8ubWVyZ2UobWV0YWRhdGEsIHRoaXMuZ2V0RGVmYXVsdFNlc3Npb25Db250ZXh0KCkpO1xuICAgIGlmKF8uZ2V0KHRoaXMuY3JlYXRpb25Db250ZXh0LCAnb2JqZWN0VHlwZScpID09PSAncXVlc3Rpb24nKSB7XG4gICAgICBtZXRhZGF0YS5wcm9ncmFtSWQgPSBfLmdldCh0aGlzLmVkaXRvclNlcnZpY2UsICdlZGl0b3JDb25maWcuY29udGV4dC5wcm9ncmFtSWQnKTtcbiAgICAgIG1ldGFkYXRhLmNvbGxlY3Rpb25JZCA9IF8uZ2V0KHRoaXMuZWRpdG9yU2VydmljZSwgJ2VkaXRvckNvbmZpZy5jb250ZXh0LmNvbGxlY3Rpb25JZGVudGlmaWVyJyk7XG4gICAgICBtZXRhZGF0YS5vcmdhbmlzYXRpb25JZCA9IF8uZ2V0KHRoaXMuZWRpdG9yU2VydmljZSwgJ2VkaXRvckNvbmZpZy5jb250ZXh0LmNvbnRyaWJ1dGlvbk9yZ0lkJyk7XG4gICAgfVxuICAgIGlmICh0aGlzLnF1ZXN0aW9uSW50ZXJhY3Rpb25UeXBlID09PSAnY2hvaWNlJykge1xuICAgICAgbWV0YWRhdGEucmVzcG9uc2VEZWNsYXJhdGlvbi5yZXNwb25zZTEubWF4U2NvcmUgPSB0aGlzLm1heFNjb3JlO1xuICAgICAgbWV0YWRhdGEucmVzcG9uc2VEZWNsYXJhdGlvbi5yZXNwb25zZTEuY29ycmVjdFJlc3BvbnNlLm91dGNvbWVzLlNDT1JFID0gdGhpcy5tYXhTY29yZTtcbiAgICB9XG4gICAgbWV0YWRhdGEgPSBfLm1lcmdlKG1ldGFkYXRhLCBfLnBpY2tCeSh0aGlzLmNoaWxkRm9ybURhdGEsIF8uaWRlbnRpdHkpKTtcbiAgICBpZiAoXy5nZXQodGhpcy5jcmVhdGlvbkNvbnRleHQsICdvYmplY3RUeXBlJykgPT09ICdxdWVzdGlvbicpIHtcbiAgICAgIG1ldGFkYXRhLmlzUmV2aWV3TW9kaWZpY2F0aW9uQWxsb3dlZCA9ICEhXy5nZXQodGhpcy5xdWVzdGlvbk1ldGFEYXRhLCAnaXNSZXZpZXdNb2RpZmljYXRpb25BbGxvd2VkJyk7XG4gICAgfVxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcbiAgICByZXR1cm4gXy5vbWl0KG1ldGFkYXRhLCBbJ3F1ZXN0aW9uJywgJ251bWJlck9mT3B0aW9ucycsICdvcHRpb25zJywgJ2FsbG93TXVsdGlTZWxlY3QnLCAnc2hvd0V2aWRlbmNlJywgJ2V2aWRlbmNlTWltZVR5cGUnLCAnc2hvd1JlbWFya3MnLCAnbWFya0FzTm90TWFuZGF0b3J5JywgJ2xlZnRBbmNob3InLCAncmlnaHRBbmNob3InLCAnc3RlcCcsICdudW1iZXJPbmx5JywgJ2NoYXJhY3RlckxpbWl0JywgJ2RhdGVGb3JtYXQnLCAnYXV0b0NhcHR1cmUnLCAncmVtYXJrc0xpbWl0JywgJ21heGltdW1PcHRpb25zJ10pO1xuICB9XG5cbiAgZ2V0UmVzcG9uc2VEZWNsYXJhdGlvbih0eXBlKSB7XG4gICAgY29uc3QgcmVzcG9uc2VEZWNsYXJhdGlvbiA9IHtcbiAgICAgIHJlc3BvbnNlMToge1xuICAgICAgICB0eXBlOiB0eXBlID09PSAnc2xpZGVyJyA/ICdpbnRlZ2VyJyA6ICdzdHJpbmcnXG4gICAgICB9XG4gICAgfTtcbiAgICBpZiAodHlwZSA9PT0gJ3RleHQnIHx8IHR5cGUgPT09ICdzbGlkZXInKSB7XG4gICAgICByZXNwb25zZURlY2xhcmF0aW9uLnJlc3BvbnNlMVsnbWF4U2NvcmUnXSA9IHRoaXMubWF4U2NvcmU7XG4gICAgfVxuICAgIHJldHVybiByZXNwb25zZURlY2xhcmF0aW9uO1xuICB9XG5cblxuXG4gIGdldE1jcVF1ZXN0aW9uSHRtbEJvZHkocXVlc3Rpb24sIHRlbXBsYXRlSWQpIHtcbiAgICBjb25zdCBtY3FUZW1wbGF0ZUNvbmZpZyA9IHtcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcbiAgICAgIG1jcUJvZHk6ICc8ZGl2IGNsYXNzPVxcJ3F1ZXN0aW9uLWJvZHlcXCcgdGFiaW5kZXg9XFwnLTFcXCc+PGRpdiBjbGFzcz1cXCdtY3EtdGl0bGVcXCcgdGFiaW5kZXg9XFwnMFxcJz57cXVlc3Rpb259PC9kaXY+PGRpdiBkYXRhLWNob2ljZS1pbnRlcmFjdGlvbj1cXCdyZXNwb25zZTFcXCcgY2xhc3M9XFwne3RlbXBsYXRlQ2xhc3N9XFwnPjwvZGl2PjwvZGl2PidcbiAgICB9O1xuICAgIGNvbnN0IHsgbWNxQm9keSB9ID0gbWNxVGVtcGxhdGVDb25maWc7XG4gICAgY29uc3QgcXVlc3Rpb25Cb2R5ID0gbWNxQm9keS5yZXBsYWNlKCd7dGVtcGxhdGVDbGFzc30nLCB0ZW1wbGF0ZUlkKVxuICAgICAgLnJlcGxhY2UoJ3txdWVzdGlvbn0nLCBxdWVzdGlvbik7XG4gICAgcmV0dXJuIHF1ZXN0aW9uQm9keTtcbiAgfVxuXG4gIGdldERlZmF1bHRTZXNzaW9uQ29udGV4dCgpIHtcbiAgICByZXR1cm4gXy5vbWl0QnkoXy5tZXJnZShcbiAgICAgIHtcbiAgICAgICAgY3JlYXRvcjogXy5nZXQodGhpcy5lZGl0b3JTZXJ2aWNlLmVkaXRvckNvbmZpZywgJ2NvbnRleHQudXNlci5mdWxsTmFtZScpLFxuICAgICAgICBjcmVhdGVkQnk6IF8uZ2V0KHRoaXMuZWRpdG9yU2VydmljZS5lZGl0b3JDb25maWcsICdjb250ZXh0LnVzZXIuaWQnKSxcbiAgICAgICAgLi4uXy5waWNrKF8uZ2V0KHRoaXMuZWRpdG9yU2VydmljZS5lZGl0b3JDb25maWcsICdjb250ZXh0JyksIFsnYm9hcmQnLCAnbWVkaXVtJywgJ2dyYWRlTGV2ZWwnLCAnc3ViamVjdCcsICd0b3BpYyddKVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgLi4uXy5waWNrKHRoaXMucXVlc3Rpb25TZXRIaWVyYXJjaHksIHRoaXMuY29uZmlnU2VydmljZS5zZXNzaW9uQ29udGV4dClcbiAgICAgIH1cbiAgICApLCBrZXkgPT4gXy5pc0VtcHR5KGtleSkpO1xuICB9XG5cbiAgc2V0UXVlc3Rpb25UeXBlVmFsdWVzKG1ldGFEYXRhKSB7XG4gICAgbWV0YURhdGEuc2hvd0V2aWRlbmNlID0gdGhpcy5jaGlsZEZvcm1EYXRhLnNob3dFdmlkZW5jZTtcbiAgICBpZiAobWV0YURhdGEuc2hvd0V2aWRlbmNlID09PSAnWWVzJykge1xuICAgICAgICBtZXRhRGF0YS5ldmlkZW5jZSA9IHtcbiAgICAgICAgICByZXF1aXJlZDogJ05vJyxcbiAgICAgICAgICBtaW1lVHlwZTogdGhpcy5jaGlsZEZvcm1EYXRhLmV2aWRlbmNlTWltZVR5cGUsXG4gICAgICAgICAgbWluQ291bnQ6IDEsXG4gICAgICAgICAgbWF4Q291bnQ6IDEsXG4gICAgICAgICAgc2l6ZUxpbWl0OiBldmlkZW5jZVNpemVMaW1pdCxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgbWV0YURhdGEuc2hvd1JlbWFya3MgPSB0aGlzLmNoaWxkRm9ybURhdGEuc2hvd1JlbWFya3M7XG4gICAgaWYgKG1ldGFEYXRhLnNob3dSZW1hcmtzID09PSAnWWVzJykge1xuICAgICAgbWV0YURhdGEucmVtYXJrcyA9IHtcbiAgICAgICAgbWF4TGVuZ3RoOiAgdGhpcy5jaGlsZEZvcm1EYXRhLnJlbWFya3NMaW1pdCxcbiAgICAgICAgcmVxdWlyZWQ6ICdObydcbiAgICAgIH07XG4gICAgfVxuICAgIG1ldGFEYXRhLmludGVyYWN0aW9ucyA9IG1ldGFEYXRhLmludGVyYWN0aW9ucyB8fCB7fTtcblxuICAgIG1ldGFEYXRhLmludGVyYWN0aW9ucy52YWxpZGF0aW9uID0geyByZXF1aXJlZDogdGhpcy5jaGlsZEZvcm1EYXRhLm1hcmtBc05vdE1hbmRhdG9yeSA9PT0gJ1llcycgPyAnTm8nIDogJ1llcyd9O1xuICAgIGlmICh0aGlzLmNoaWxkRm9ybURhdGEuYWxsb3dNdWx0aVNlbGVjdCA9PT0gJ1llcycpIHtcbiAgICAgIG1ldGFEYXRhLnJlc3BvbnNlRGVjbGFyYXRpb24ucmVzcG9uc2UxLmNhcmRpbmFsaXR5ID0gJ211bHRpcGxlJztcbiAgICB9IGVsc2V7XG4gICAgICBtZXRhRGF0YS5yZXNwb25zZURlY2xhcmF0aW9uLnJlc3BvbnNlMS5jYXJkaW5hbGl0eSA9ICdzaW5nbGUnO1xuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZCh0aGlzLmVkaXRvclNlcnZpY2U/LmVkaXRvckNvbmZpZz8uY29uZmlnPy5yZW5kZXJUYXhvbm9teSkpe1xuICAgICAgdGhpcy5jYWxjdWxhdGVNaW5NYXhTY29yZShtZXRhRGF0YSk7XG4gICAgIH1cblxuICAgIF8uZm9yRWFjaCh0aGlzLnN1Yk1lbnVzLCAoZWw6IGFueSkgPT4ge1xuICAgICAgaWYgKGVsLmlkID09PSAnYWRkSGludCcpIHtcbiAgICAgICAgbWV0YURhdGEuaGludHMgPSB7XG4gICAgICAgICAgZW46IFtlbC52YWx1ZV1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmIChlbC5pZCA9PT0gJ2FkZFRpcCcpIHtcbiAgICAgICAgbWV0YURhdGEuaW5zdHJ1Y3Rpb25zID0ge1xuICAgICAgICAgIGVuOiBbZWwudmFsdWVdXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAoIV8uaXNFbXB0eSh0aGlzLnNsaWRlckRhdGFzKSAmJiB0aGlzLnF1ZXN0aW9uSW50ZXJhY3Rpb25UeXBlID09PSAnc2xpZGVyJykge1xuICAgICAgbWV0YURhdGEuaW50ZXJhY3Rpb25UeXBlcyA9IFt0aGlzLnF1ZXN0aW9uSW50ZXJhY3Rpb25UeXBlXTtcbiAgICAgIG1ldGFEYXRhLnByaW1hcnlDYXRlZ29yeSA9IHRoaXMucXVlc3Rpb25QcmltYXJ5Q2F0ZWdvcnk7XG4gICAgICBtZXRhRGF0YS5pbnRlcmFjdGlvbnMgPSB7XG4gICAgICAgIC4uLm1ldGFEYXRhLmludGVyYWN0aW9ucyxcbiAgICAgICAgcmVzcG9uc2UxOiB7XG4gICAgICAgICAgdmFsaWRhdGlvbjogdGhpcy5zbGlkZXJEYXRhcy52YWxpZGF0aW9uLFxuICAgICAgICAgIHN0ZXA6IHRoaXMuc2xpZGVyRGF0YXMuc3RlcFxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmICh0aGlzLnF1ZXN0aW9uSW50ZXJhY3Rpb25UeXBlID09PSAnZGF0ZScpIHtcbiAgICAgIG1ldGFEYXRhLmludGVyYWN0aW9uVHlwZXMgPSBbdGhpcy5xdWVzdGlvbkludGVyYWN0aW9uVHlwZV07XG4gICAgICBtZXRhRGF0YS5wcmltYXJ5Q2F0ZWdvcnkgPSB0aGlzLnF1ZXN0aW9uUHJpbWFyeUNhdGVnb3J5O1xuICAgICAgbWV0YURhdGEuaW50ZXJhY3Rpb25zID0ge1xuICAgICAgICAuLi5tZXRhRGF0YS5pbnRlcmFjdGlvbnMsXG4gICAgICAgIHJlc3BvbnNlMToge1xuICAgICAgICAgIHZhbGlkYXRpb246IHtwYXR0ZXJuOiB0aGlzLmNoaWxkRm9ybURhdGEuZGF0ZUZvcm1hdH0sXG4gICAgICAgICAgYXV0b0NhcHR1cmU6IHRoaXMuY2hpbGRGb3JtRGF0YS5hdXRvQ2FwdHVyZVxuICAgICAgICB9XG4gICAgICB9O1xuICB9XG5cbiAgICBpZiAodGhpcy5xdWVzdGlvbkludGVyYWN0aW9uVHlwZSA9PT0gJ3RleHQnKSB7XG4gICAgICBtZXRhRGF0YS5pbnRlcmFjdGlvblR5cGVzID0gW3RoaXMucXVlc3Rpb25JbnRlcmFjdGlvblR5cGVdO1xuICAgICAgbWV0YURhdGEucHJpbWFyeUNhdGVnb3J5ID0gdGhpcy5xdWVzdGlvblByaW1hcnlDYXRlZ29yeTtcbiAgICAgIG1ldGFEYXRhLmludGVyYWN0aW9ucyA9IHtcbiAgICAgICAgLi4ubWV0YURhdGEuaW50ZXJhY3Rpb25zLFxuICAgICAgICByZXNwb25zZTE6IHtcbiAgICAgICAgICB2YWxpZGF0aW9uOiB7XG4gICAgICAgICAgICBsaW1pdDoge1xuICAgICAgICAgICAgICBtYXhMZW5ndGg6IHRoaXMuY2hpbGRGb3JtRGF0YS5jaGFyYWN0ZXJMaW1pdCxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG51bWJlcjogdGhpcy5jaGlsZEZvcm1EYXRhLm51bWJlck9ubHlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuICAgIC8vICByZXR1cm4gbWV0YURhdGE7XG4gIH1cblxuICBwcmVwYXJlUmVxdWVzdEJvZHkoKSB7XG4gICAgY29uc3QgcXVlc3Rpb25JZCA9IHRoaXMucXVlc3Rpb25JZCA/IHRoaXMucXVlc3Rpb25JZCA6IHV1aWR2NCgpO1xuICAgIHRoaXMubmV3UXVlc3Rpb25JRCA9IHF1ZXN0aW9uSWQ7XG4gICAgY29uc3QgZGF0YSA9IHRoaXMudHJlZU5vZGVEYXRhO1xuICAgIGNvbnN0IGFjdGl2ZU5vZGUgPSB0aGlzLnRyZWVTZXJ2aWNlLmdldEFjdGl2ZU5vZGUoKTtcbiAgICBjb25zdCBzZWxlY3RlZFVuaXRJZCA9IF8uZ2V0KGFjdGl2ZU5vZGUsICdkYXRhLmlkJyk7XG4gICAgdGhpcy5lZGl0b3JTZXJ2aWNlLmRhdGEgPSB7fTtcbiAgICB0aGlzLmVkaXRvclNlcnZpY2Uuc2VsZWN0ZWRTZWN0aW9uID0gc2VsZWN0ZWRVbml0SWQ7XG4gICAgY29uc3QgbWV0YURhdGEgPSB0aGlzLmdldFF1ZXN0aW9uTWV0YWRhdGEoKTtcbiAgICB0aGlzLnNldFF1ZXN0aW9uVHlwZVZhbHVlcyhtZXRhRGF0YSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5vZGVzTW9kaWZpZWQ6IHtcbiAgICAgICAgW3F1ZXN0aW9uSWRdOiB7XG4gICAgICAgICAgbWV0YWRhdGE6IF8ub21pdChtZXRhRGF0YSwgWydjcmVhdG9yJ10pLFxuICAgICAgICAgIG9iamVjdFR5cGU6ICdRdWVzdGlvbicsXG4gICAgICAgICAgcm9vdDogZmFsc2UsXG4gICAgICAgICAgaXNOZXc6ICF0aGlzLnF1ZXN0aW9uSWRcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGhpZXJhcmNoeTogdGhpcy5lZGl0b3JTZXJ2aWNlLmdldEhpZXJhcmNoeU9iaihkYXRhLCBxdWVzdGlvbklkLCBzZWxlY3RlZFVuaXRJZClcbiAgICB9O1xuICB9XG5cbiAgcHJlcGFyZVF1ZXN0aW9uQm9keSAoKSB7XG4gICAgcmV0dXJuIHRoaXMucXVlc3Rpb25JZCA/XG4gICAge1xuICAgICAgcXVlc3Rpb246IF8ub21pdCh0aGlzLmdldFF1ZXN0aW9uTWV0YWRhdGEoKSwgWydtaW1lVHlwZScsICdjcmVhdG9yJywgJ2NyZWF0ZWRCeScsICdvcmdhbmlzYXRpb25JZCddKVxuICAgIH0gOlxuICAgIHtcbiAgICAgIHF1ZXN0aW9uOiB7XG4gICAgICAgIGNvZGU6IHV1aWR2NCgpLFxuICAgICAgICAuLi50aGlzLmdldFF1ZXN0aW9uTWV0YWRhdGEoKVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBwcmVwYXJlU291cmNpbmdVcGRhdGVCb2R5IChxdWVzdGlvbklkcywgY29tbWVudHM/KSB7XG4gICAgICBjb25zdCBzb3VyY2luZ1VwZGF0ZUF0dHJpYnV0ZSA9IHRoaXMuYWN0aW9uVHlwZSA9PT0gJ3NvdXJjaW5nQXBwcm92ZVF1ZXN0aW9uJyA/ICdhY2NlcHRlZENvbnRyaWJ1dGlvbnMnXG4gICAgICAgIDogJ3JlamVjdGVkQ29udHJpYnV0aW9ucyc7XG4gICAgICBjb25zdCBjb2xsZWN0aW9uT2JqZWN0VHlwZSA9IF8ucmVwbGFjZShfLmxvd2VyQ2FzZSh0aGlzLmNyZWF0aW9uQ29udGV4dFsnY29sbGVjdGlvbk9iamVjdFR5cGUnXSksICcgJywgJycpO1xuICAgICAgY29uc3QgcmVxdWVzdEJvZHkgPSB7XG4gICAgICAgIHJlcXVlc3Q6IHtcbiAgICAgICAgICBbY29sbGVjdGlvbk9iamVjdFR5cGVdOiB7XG4gICAgICAgICAgICBbc291cmNpbmdVcGRhdGVBdHRyaWJ1dGVdOiBxdWVzdGlvbklkc1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGlmICh0aGlzLmFjdGlvblR5cGUgPT09ICdzb3VyY2luZ1JlamVjdFF1ZXN0aW9uJykge1xuICAgICAgICByZXF1ZXN0Qm9keS5yZXF1ZXN0W2NvbGxlY3Rpb25PYmplY3RUeXBlXVsncmVqZWN0ZWRDb250cmlidXRpb25Db21tZW50cyddID0gY29tbWVudHM7XG4gICAgICAgIC8vIHJlcXVlc3RCb2R5LnJlcXVlc3RbY29sbGVjdGlvbk9iamVjdFR5cGVdWydyZWplY3RDb21tZW50J10gPSBjb21tZW50cztcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXF1ZXN0Qm9keTtcbiAgfVxuXG4gIHVwc2VydFF1ZXN0aW9uKGNhbGxiYWNrKSB7XG4gICAgY29uc3QgcmVxdWVzdEJvZHkgPSB0aGlzLnByZXBhcmVRdWVzdGlvbkJvZHkoKTtcbiAgICB0aGlzLnNob3dIaWRlU3Bpbm5lckxvYWRlcih0cnVlKTtcbiAgICB0aGlzLnF1ZXN0aW9uU2VydmljZS51cHNlcnRRdWVzdGlvbih0aGlzLnF1ZXN0aW9uSWQsIHJlcXVlc3RCb2R5KS5waXBlKFxuICAgICAgZmluYWxpemUoKCkgPT4ge1xuICAgICAgICB0aGlzLnNob3dIaWRlU3Bpbm5lckxvYWRlcihmYWxzZSk7XG4gICAgICB9KSkuc3Vic2NyaWJlKChyZXNwb25zZTogU2VydmVyUmVzcG9uc2UpID0+IHtcbiAgICAgICAgaWYgKCFfLmluY2x1ZGVzKFsnc3VibWl0UXVlc3Rpb24nXSx0aGlzLmFjdGlvblR5cGUpKSB7XG4gICAgICAgICAgdGhpcy50b2FzdGVyU2VydmljZS5zdWNjZXNzKF8uZ2V0KHRoaXMuY29uZmlnU2VydmljZSwgJ2xhYmVsQ29uZmlnLm1lc3NhZ2VzLnN1Y2Nlc3MuMDEzJykpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0UXVlc3Rpb25JZChfLmdldChyZXNwb25zZSwgJ3Jlc3VsdC5pZGVudGlmaWVyJykpO1xuICAgICAgICBpZiAoY2FsbGJhY2spIGNhbGxiYWNrKCk7XG4gICAgICB9LCAoZXJyOiBTZXJ2ZXJSZXNwb25zZSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGVyckluZm8gPSB7XG4gICAgICAgICAgICBlcnJvck1zZzogJ0ZhaWxlZCB0byBzYXZlIHF1ZXN0aW9uLiBQbGVhc2UgdHJ5IGFnYWluLi4uJyxcbiAgICAgICAgICB9O1xuICAgICAgICAgIHRoaXMuZWRpdG9yU2VydmljZS5hcGlFcnJvckhhbmRsaW5nKGVyciwgZXJySW5mbyk7XG4gICAgICAgIH0pO1xuICB9XG5cblxuICBjcmVhdGVRdWVzdGlvbigpIHtcbiAgICBpZiAodGhpcy5zaG93T3B0aW9ucykge1xuICAgICAgdGhpcy5idWlsZENvbmRpdGlvbignY3JlYXRlJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHJlcXVlc3RCb2R5ID0gdGhpcy5wcmVwYXJlUmVxdWVzdEJvZHkoKTtcbiAgICAgIHRoaXMuc2F2ZVF1ZXN0aW9ucyhyZXF1ZXN0Qm9keSwgJ2NyZWF0ZScpO1xuICB9XG59XG5cblxuICBzYXZlUXVlc3Rpb25zKHJlcXVlc3RCb2R5LCB0eXBlKSB7XG4gICAgdGhpcy5zaG93SGlkZVNwaW5uZXJMb2FkZXIodHJ1ZSk7XG4gICAgdGhpcy5xdWVzdGlvblNlcnZpY2UudXBkYXRlSGllcmFyY2h5UXVlc3Rpb25DcmVhdGUocmVxdWVzdEJvZHkpLnBpcGUoXG4gICAgICBmaW5hbGl6ZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuc2hvd0hpZGVTcGlubmVyTG9hZGVyKGZhbHNlKTtcbiAgICAgIH0pKS5zdWJzY3JpYmUoKHJlc3BvbnNlOiBTZXJ2ZXJSZXNwb25zZSkgPT4ge1xuICAgICAgICBpZiAodGhpcy5zaG93QWRkU2Vjb25kYXJ5UXVlc3Rpb25DYXQpIHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBfLmdldChyZXNwb25zZS5yZXN1bHQuaWRlbnRpZmllcnMsIHRoaXMubmV3UXVlc3Rpb25JRCk7XG4gICAgICAgICAgdGhpcy5lZGl0b3JTZXJ2aWNlLnBhcmVudElkZW50aWZpZXIgPSByZXN1bHQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZSA9PT0gJ2NyZWF0ZScpIHtcbiAgICAgICAgICB0aGlzLnRvYXN0ZXJTZXJ2aWNlLnN1Y2Nlc3MoXy5nZXQodGhpcy5jb25maWdTZXJ2aWNlLCAnbGFiZWxDb25maWcubWVzc2FnZXMuc3VjY2Vzcy4wMDcnKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy50b2FzdGVyU2VydmljZS5zdWNjZXNzKF8uZ2V0KHRoaXMuY29uZmlnU2VydmljZSwgJ2xhYmVsQ29uZmlnLm1lc3NhZ2VzLnN1Y2Nlc3MuMDA4JykpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVkaXJlY3RUb1F1ZXN0aW9uc2V0KCk7XG4gICAgICB9LCAoZXJyOiBTZXJ2ZXJSZXNwb25zZSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGVyckluZm8gPSB7XG4gICAgICAgICAgICBlcnJvck1zZzogJ1F1ZXN0aW9uIGNyZWF0aW5nIGZhaWxlZC4gUGxlYXNlIHRyeSBhZ2Fpbi4uLicsXG4gICAgICAgICAgfTtcbiAgICAgICAgICB0aGlzLmVkaXRvclNlcnZpY2UuYXBpRXJyb3JIYW5kbGluZyhlcnIsIGVyckluZm8pO1xuICAgICAgICB9KTtcbiAgfVxuXG5cbiAgdXBkYXRlUXVlc3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuaXNDaGlsZFF1ZXN0aW9uKSB7XG4gICAgICB0aGlzLmJ1aWxkQ29uZGl0aW9uKCd1cGRhdGUnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zYXZlVXBkYXRlUXVlc3Rpb25zKCk7XG4gICAgfVxuICB9XG5cbiBzYXZlVXBkYXRlUXVlc3Rpb25zKCkge1xuICAgIGNvbnN0IHJlcXVlc3RCb2R5ID0gdGhpcy5wcmVwYXJlUmVxdWVzdEJvZHkoKTtcbiAgICB0aGlzLnNob3dIaWRlU3Bpbm5lckxvYWRlcih0cnVlKTtcbiAgICB0aGlzLnF1ZXN0aW9uU2VydmljZS51cGRhdGVIaWVyYXJjaHlRdWVzdGlvblVwZGF0ZShyZXF1ZXN0Qm9keSkucGlwZShcbiAgICAgIGZpbmFsaXplKCgpID0+IHtcbiAgICAgICAgdGhpcy5zaG93SGlkZVNwaW5uZXJMb2FkZXIoZmFsc2UpO1xuICAgICAgfSkpLnN1YnNjcmliZSgocmVzcG9uc2U6IFNlcnZlclJlc3BvbnNlKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLnNob3dBZGRTZWNvbmRhcnlRdWVzdGlvbkNhdCkge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IF8uZ2V0KHJlc3BvbnNlLnJlc3VsdC5pZGVudGlmaWVycywgdGhpcy5xdWVzdGlvbklkKTtcbiAgICAgICAgICB0aGlzLmVkaXRvclNlcnZpY2UucGFyZW50SWRlbnRpZmllciA9IHJlc3VsdDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudG9hc3RlclNlcnZpY2Uuc3VjY2VzcyhfLmdldCh0aGlzLmNvbmZpZ1NlcnZpY2UsICdsYWJlbENvbmZpZy5tZXNzYWdlcy5zdWNjZXNzLjAwOCcpKTtcbiAgICAgICAgdGhpcy5yZWRpcmVjdFRvUXVlc3Rpb25zZXQoKTtcbiAgICAgIH0sIChlcnI6IFNlcnZlclJlc3BvbnNlKSA9PiB7XG4gICAgICAgIGNvbnN0IGVyckluZm8gPSB7XG4gICAgICAgICAgZXJyb3JNc2c6ICdRdWVzdGlvbiB1cGRhdGluZyBmYWlsZWQuIFBsZWFzZSB0cnkgYWdhaW4uLi4nLFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmVkaXRvclNlcnZpY2UuYXBpRXJyb3JIYW5kbGluZyhlcnIsIGVyckluZm8pO1xuICAgICAgfSk7XG4gIH1cblxuICBzaG93SGlkZVNwaW5uZXJMb2FkZXIoc3RhdHVzOiBib29sZWFuLCB0eXBlPykge1xuICAgIHRoaXMuYnV0dG9uTG9hZGVycy5zYXZlQnV0dG9uTG9hZGVyID0gc3RhdHVzO1xuICAgIGlmKHR5cGUpIHtcbiAgICAgIHRoaXMuYnV0dG9uTG9hZGVyc1t0eXBlXSA9IHN0YXR1cztcbiAgICB9XG4gIH1cblxuICBwcmV2aWV3Q29udGVudCgpIHtcbiAgICB0aGlzLnZhbGlkYXRlUXVlc3Rpb25EYXRhKCk7XG4gICAgaWYgKHRoaXMuc2hvd0Zvcm1FcnJvciA9PT0gZmFsc2UgJiYgdGhpcy5xdWVzdGlvbk1ldGFkYXRhRm9ybVN0YXR1cyA9PT0gdHJ1ZSkge1xuICAgICAgdGhpcy5wcmV2aWV3Rm9ybURhdGEoZmFsc2UpO1xuICAgICAgY29uc3QgYWN0aXZlTm9kZSA9IHRoaXMudHJlZVNlcnZpY2UuZ2V0QWN0aXZlTm9kZSgpO1xuICAgICAgbGV0IHF1ZXN0aW9uSWQgPSAnJztcbiAgICAgIGlmIChfLmlzVW5kZWZpbmVkKHRoaXMucXVlc3Rpb25JZCkpIHtcbiAgICAgICAgcXVlc3Rpb25JZCA9IHRoaXMudGVtcFF1ZXN0aW9uSWQ7XG4gICAgICAgIHRoaXMuc2V0UGFyZW50Q29uZmlnKGFjdGl2ZU5vZGU/LmRhdGE/Lm1ldGFkYXRhKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHF1ZXN0aW9uSWQgPSB0aGlzLnF1ZXN0aW9uSWQ7XG4gICAgICAgIHRoaXMuc2V0UGFyZW50Q29uZmlnKGFjdGl2ZU5vZGU/LnBhcmVudD8uZGF0YT8ubWV0YWRhdGEpO1xuICAgICAgfVxuICAgICAgdGhpcy5xdWVzdGlvblNldEhpZXJhcmNoeS5jaGlsZE5vZGVzID0gW3F1ZXN0aW9uSWRdO1xuICAgICAgdGhpcy5zZXRRdW1sUGxheWVyRGF0YShxdWVzdGlvbklkKTtcbiAgICAgIHRoaXMuc2hvd1ByZXZpZXcgPSB0cnVlO1xuICAgICAgdGhpcy50b29sYmFyQ29uZmlnLnNob3dQcmV2aWV3ID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50b2FzdGVyU2VydmljZS5lcnJvcihfLmdldCh0aGlzLmNvbmZpZ1NlcnZpY2UsICdsYWJlbENvbmZpZy5tZXNzYWdlcy5lcnJvci4wNDQnKSk7XG4gICAgfVxuICB9XG5cbiAgc2V0UGFyZW50Q29uZmlnKHBhcmVudENvbmZpZykge1xuICAgIHRoaXMucXVlc3Rpb25TZXRIaWVyYXJjaHkuc2hvd1NvbHV0aW9ucyA9ICFfLmlzVW5kZWZpbmVkKHBhcmVudENvbmZpZz8uc2hvd1NvbHV0aW9ucykgP1xuICAgIHBhcmVudENvbmZpZy5zaG93U29sdXRpb25zIDogJ05vJztcbiAgICB0aGlzLnF1ZXN0aW9uU2V0SGllcmFyY2h5LnNodWZmbGUgPSAhXy5pc1VuZGVmaW5lZChwYXJlbnRDb25maWc/LnNodWZmbGUpID9cbiAgICBwYXJlbnRDb25maWcuc2h1ZmZsZSA6IHRydWU7XG4gICAgdGhpcy5xdWVzdGlvblNldEhpZXJhcmNoeS5zaG93RmVlZGJhY2sgPSAhXy5pc1VuZGVmaW5lZChwYXJlbnRDb25maWc/LnNob3dGZWVkYmFjaykgP1xuICAgIHBhcmVudENvbmZpZy5zaG93RmVlZGJhY2sgOiAnTm8nO1xuICB9XG5cbiAgc2V0UXVtbFBsYXllckRhdGEocXVlc3Rpb25JZDogc3RyaW5nKSB7XG4gICAgY29uc3QgcXVlc3Rpb25NZXRhZGF0YTogYW55ID0gXy5jbG9uZURlZXAodGhpcy5nZXRRdWVzdGlvbk1ldGFkYXRhKCkpO1xuICAgIHF1ZXN0aW9uTWV0YWRhdGEuaWRlbnRpZmllciA9IHF1ZXN0aW9uSWQ7XG4gICAgdGhpcy5xdWVzdGlvblNldEhpZXJhcmNoeS5jaGlsZHJlbiA9IFtxdWVzdGlvbk1ldGFkYXRhXTtcbiAgICBpZiAodGhpcy5xdWVzdGlvblNldEhpZXJhcmNoeS5zaHVmZmxlID09PSB0cnVlKSB7XG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tc3RyaW5nLWxpdGVyYWxcbiAgICAgIHRoaXMucXVlc3Rpb25TZXRIaWVyYXJjaHlbJ21heFNjb3JlJ10gPSAxO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAocXVlc3Rpb25NZXRhZGF0YS5xVHlwZSA9PT0gJ1NBJykge1xuICAgICAgICB0aGlzLnF1ZXN0aW9uU2V0SGllcmFyY2h5ID0gXy5vbWl0KHRoaXMucXVlc3Rpb25TZXRIaWVyYXJjaHksICdtYXhTY29yZScpO1xuICAgICAgfSBlbHNlIGlmIChxdWVzdGlvbk1ldGFkYXRhLm1heFNjb3JlKSB7XG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1zdHJpbmctbGl0ZXJhbFxuICAgICAgICB0aGlzLnF1ZXN0aW9uU2V0SGllcmFyY2h5WydtYXhTY29yZSddID0gdGhpcy5tYXhTY29yZTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5lZGl0b3JDdXJzb3Iuc2V0UXVlc3Rpb25NYXAocXVlc3Rpb25JZCwgcXVlc3Rpb25NZXRhZGF0YSk7XG4gIH1cblxuICBnZXRQbGF5ZXJFdmVudHMoZXZlbnQpIHtcbiAgICBjb25zb2xlLmxvZygnZ2V0IHBsYXllciBldmVudHMnLCBKU09OLnN0cmluZ2lmeShldmVudCkpO1xuICB9XG5cbiAgZ2V0VGVsZW1ldHJ5RXZlbnRzKGV2ZW50KSB7XG4gICAgY29uc29sZS5sb2coJ2V2ZW50IGlzIGZvciB0ZWxlbWV0cnknLCBKU09OLnN0cmluZ2lmeShldmVudCkpO1xuICB9XG5cbiAgc2V0UXVlc3Rpb25JZChxdWVzdGlvbklkKSB7XG4gICAgdGhpcy5xdWVzdGlvbklkID0gcXVlc3Rpb25JZDtcbiAgfVxuXG4gIHNldFF1ZXN0aW9uVGl0bGUocXVlc3Rpb25JZD8pIHtcbiAgICBsZXQgaW5kZXg7XG4gICAgbGV0IHF1ZXN0aW9uVGl0bGUgPSAnJztcbiAgICBpZiAoXy5nZXQodGhpcy5jcmVhdGlvbkNvbnRleHQsICdvYmplY3RUeXBlJykgPT09ICdxdWVzdGlvbicpIHtcbiAgICAgIGlmICghXy5pc1VuZGVmaW5lZCh0aGlzLnF1ZXN0aW9uUHJpbWFyeUNhdGVnb3J5KSkge1xuICAgICAgICBxdWVzdGlvblRpdGxlID0gdGhpcy5xdWVzdGlvblByaW1hcnlDYXRlZ29yeTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IGhpZXJhcmNoeUNoaWxkcmVuID0gdGhpcy50cmVlU2VydmljZS5nZXRDaGlsZHJlbigpO1xuICAgICAgaWYgKCFfLmlzVW5kZWZpbmVkKHF1ZXN0aW9uSWQpKSB7XG4gICAgICAgICAgY29uc3QgcGFyZW50Tm9kZSA9IHRoaXMudHJlZVNlcnZpY2UuZ2V0QWN0aXZlTm9kZSgpLmdldFBhcmVudCgpO1xuICAgICAgICAgIGhpZXJhcmNoeUNoaWxkcmVuID0gcGFyZW50Tm9kZS5nZXRDaGlsZHJlbigpO1xuICAgICAgICAgIF8uZm9yRWFjaChoaWVyYXJjaHlDaGlsZHJlbiwgKGNoaWxkKSA9PiB7XG4gICAgICAgICAgICBpZiAoY2hpbGQuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgICAgaW5kZXggPSAgXy5maW5kSW5kZXgoY2hpbGQuY2hpbGRyZW4sIHsgaWRlbnRpZmllcjogcXVlc3Rpb25JZCB9KTtcbiAgICAgICAgICAgICAgY29uc3QgcXVlc3Rpb24gID0gY2hpbGQuY2hpbGRyZW5baW5kZXhdO1xuICAgICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXG4gICAgICAgICAgICAgIHF1ZXN0aW9uVGl0bGUgPSBgUSR7KGluZGV4ICsgMSkudG9TdHJpbmcoKX0gfCBgICsgKF8uZ2V0KHRoaXMuY2F0ZWdvcnlMYWJlbCwgYCR7cXVlc3Rpb24ucHJpbWFyeUNhdGVnb3J5fWApIHx8IHF1ZXN0aW9uLnByaW1hcnlDYXRlZ29yeSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBpbmRleCA9ICBfLmZpbmRJbmRleChoaWVyYXJjaHlDaGlsZHJlbiwgKG5vZGUpID0+IG5vZGUuZGF0YS5pZCA9PT0gcXVlc3Rpb25JZCk7XG4gICAgICAgICAgICAgIGNvbnN0IHF1ZXN0aW9uICA9IGhpZXJhcmNoeUNoaWxkcmVuW2luZGV4XTtcbiAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm1heC1saW5lLWxlbmd0aFxuICAgICAgICAgICAgICBxdWVzdGlvblRpdGxlID0gYFEkeyhpbmRleCArIDEpLnRvU3RyaW5nKCl9IHwgYCArIChfLmdldCh0aGlzLmNhdGVnb3J5TGFiZWwsIGAke18uZ2V0KHF1ZXN0aW9uLCAnZGF0YS5wcmltYXJ5Q2F0ZWdvcnknKX1gKSB8fCBfLmdldChxdWVzdGlvbiwgJ2RhdGEucHJpbWFyeUNhdGVnb3J5JykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW5kZXggPSBoaWVyYXJjaHlDaGlsZHJlbi5sZW5ndGg7XG4gICAgICAgIHF1ZXN0aW9uVGl0bGUgPSBgUSR7KGluZGV4ICsgMSkudG9TdHJpbmcoKX0gfCBgO1xuICAgICAgICBpZiAoIV8uaXNVbmRlZmluZWQodGhpcy5xdWVzdGlvblByaW1hcnlDYXRlZ29yeSkpIHtcbiAgICAgICAgICBxdWVzdGlvblRpdGxlID0gcXVlc3Rpb25UaXRsZSArIChfLmdldCh0aGlzLmNhdGVnb3J5TGFiZWwsIGAke3RoaXMucXVlc3Rpb25QcmltYXJ5Q2F0ZWdvcnl9YCkgfHwgdGhpcy5xdWVzdGlvblByaW1hcnlDYXRlZ29yeSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy50b29sYmFyQ29uZmlnLnRpdGxlID0gcXVlc3Rpb25UaXRsZTtcbiAgfVxuXG4gIG91dHB1dChldmVudCkgeyB9XG5cbiAgb25TdGF0dXNDaGFuZ2VzKGV2ZW50KSB7XG4gICAgY29uc29sZS5sb2coZXZlbnQpO1xuICAgIGlmIChfLmhhcyhldmVudCwgJ2lzVmFsaWQnKSkge1xuICAgICAgdGhpcy5xdWVzdGlvbk1ldGFkYXRhRm9ybVN0YXR1cyA9IGV2ZW50LmlzVmFsaWQ7XG4gICAgfVxuICB9XG5cbiAgdmFsdWVDaGFuZ2VzKGV2ZW50KSB7XG4gICAgaWYgKF8uaGFzKGV2ZW50LCAnbWF4U2NvcmUnKSkge1xuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnJhZGl4XG4gICAgICBldmVudC5tYXhTY29yZSA9ICFfLmlzTnVsbChldmVudC5tYXhTY29yZSkgPyBwYXJzZUludChldmVudC5tYXhTY29yZSkgOiB0aGlzLm1heFNjb3JlO1xuICAgICAgdGhpcy5tYXhTY29yZSA9IGV2ZW50Lm1heFNjb3JlO1xuICAgIH1cbiAgICB0aGlzLmNoaWxkRm9ybURhdGEgPSBldmVudDtcbiAgfVxuXG4gIHZhbGlkYXRlRm9ybUZpZWxkcygpIHtcbiAgICBfLmZvckVhY2godGhpcy5xdWVzdGlvbkZvcm1Db25maWcsIChmb3JtRmllbGRDYXRlZ29yeSkgPT4ge1xuICAgICAgaWYgKGZvcm1GaWVsZENhdGVnb3J5LnJlcXVpcmVkICYmICF0aGlzLmNoaWxkRm9ybURhdGFbZm9ybUZpZWxkQ2F0ZWdvcnkuY29kZV0pIHtcbiAgICAgICAgdGhpcy5zaG93Rm9ybUVycm9yID0gdHJ1ZTtcbiAgICAgICAgdGhpcy50b2FzdGVyU2VydmljZS5lcnJvcihfLmdldCh0aGlzLmNvbmZpZ1NlcnZpY2UsICdsYWJlbENvbmZpZy5tZXNzYWdlcy5lcnJvci4wMDgnKSk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByZXZpZXdGb3JtRGF0YShzdGF0dXMpIHtcbiAgICBjb25zdCBmb3JtQ29uZmlnID0gXy5jbG9uZURlZXAodGhpcy5sZWFmRm9ybUNvbmZpZyk7XG4gICAgdGhpcy5xdWVzdGlvbkZvcm1Db25maWcgPSBudWxsO1xuICAgIF8uZm9yRWFjaChmb3JtQ29uZmlnLCAoZm9ybUZpZWxkQ2F0ZWdvcnkpID0+IHtcbiAgICAgIGlmIChfLmhhcyhmb3JtRmllbGRDYXRlZ29yeSwgJ2VkaXRhYmxlJykgJiYgIV8uaXNVbmRlZmluZWQoZm9ybUZpZWxkQ2F0ZWdvcnkuZWRpdGFibGUpKSB7XG4gICAgICAgIGZvcm1GaWVsZENhdGVnb3J5LmVkaXRhYmxlID0gc3RhdHVzID8gXy5maW5kKHRoaXMubGVhZkZvcm1Db25maWcsIHsgY29kZTogZm9ybUZpZWxkQ2F0ZWdvcnkuY29kZSB9KS5lZGl0YWJsZSA6IHN0YXR1cztcbiAgICAgICAgZm9ybUZpZWxkQ2F0ZWdvcnkuZGVmYXVsdCA9IHRoaXMuY2hpbGRGb3JtRGF0YVtmb3JtRmllbGRDYXRlZ29yeS5jb2RlXTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnF1ZXN0aW9uRm9ybUNvbmZpZyA9IGZvcm1Db25maWc7XG4gIH1cblxuICBpc0VkaXRhYmxlKGZpZWxkQ29kZSkge1xuICAgIGlmICh0aGlzLmNyZWF0aW9uTW9kZSA9PT0gJ2VkaXQnKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLnF1ZXN0aW9uSWQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwb3B1bGF0ZUZvcm1EYXRhKCkge1xuICAgIHRoaXMuY2hpbGRGb3JtRGF0YSA9IHt9O1xuICAgIF8uZm9yRWFjaCh0aGlzLmxlYWZGb3JtQ29uZmlnLCAoZm9ybUZpZWxkQ2F0ZWdvcnkpID0+IHtcbiAgICAgIGlmICghXy5pc1VuZGVmaW5lZCh0aGlzLnF1ZXN0aW9uSWQpKSB7XG4gICAgICAgIGlmIChmb3JtRmllbGRDYXRlZ29yeS5jb2RlID09PSAnbWF4U2NvcmUnICYmIHRoaXMucXVlc3Rpb25JbnRlcmFjdGlvblR5cGUgPT09ICdjaG9pY2UnKSB7XG4gICAgICAgICAgdGhpcy5jaGlsZEZvcm1EYXRhW2Zvcm1GaWVsZENhdGVnb3J5LmNvZGVdID0gXy5oYXModGhpcy5xdWVzdGlvbk1ldGFEYXRhLCAncmVzcG9uc2VEZWNsYXJhdGlvbi5yZXNwb25zZTEubWF4U2NvcmUnKSA/XG4gICAgICAgICAgXy5nZXQodGhpcy5xdWVzdGlvbk1ldGFEYXRhLCAncmVzcG9uc2VEZWNsYXJhdGlvbi5yZXNwb25zZTEubWF4U2NvcmUnKSA6IHRoaXMubWF4U2NvcmU7XG4gICAgICAgIH0gZWxzZSBpZiAoZm9ybUZpZWxkQ2F0ZWdvcnkuY29kZSA9PT0gJ2FsbG93TXVsdGlTZWxlY3QnICYmIHRoaXMucXVlc3Rpb25JbnRlcmFjdGlvblR5cGUgPT09ICdjaG9pY2UnKSB7XG4gICAgICAgICAgdGhpcy5jaGlsZEZvcm1EYXRhW2Zvcm1GaWVsZENhdGVnb3J5LmNvZGVdID0gXy5nZXQodGhpcy5xdWVzdGlvbk1ldGFEYXRhLCAncmVzcG9uc2VEZWNsYXJhdGlvbi5yZXNwb25zZTEuY2FyZGluYWxpdHknKSA9PT0gJ211bHRpcGxlJyA/ICdZZXMnIDogJ05vJztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLnF1ZXN0aW9uTWV0YURhdGEgJiYgXy5oYXModGhpcy5xdWVzdGlvbk1ldGFEYXRhLCBmb3JtRmllbGRDYXRlZ29yeS5jb2RlKSkge1xuICAgICAgICAgIGZvcm1GaWVsZENhdGVnb3J5LmRlZmF1bHQgPSB0aGlzLnF1ZXN0aW9uTWV0YURhdGFbZm9ybUZpZWxkQ2F0ZWdvcnkuY29kZV07XG4gICAgICAgICAgdGhpcy5jaGlsZEZvcm1EYXRhW2Zvcm1GaWVsZENhdGVnb3J5LmNvZGVdID0gdGhpcy5xdWVzdGlvbk1ldGFEYXRhW2Zvcm1GaWVsZENhdGVnb3J5LmNvZGVdO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgYXZhaWxhYmxlQWxpYXMgPSB7XG4gICAgICAgICAgICBkYXRlRm9ybWF0OiAnaW50ZXJhY3Rpb25zLnJlc3BvbnNlMS52YWxpZGF0aW9uLnBhdHRlcm4nLFxuICAgICAgICAgICAgYXV0b0NhcHR1cmU6ICdpbnRlcmFjdGlvbnMucmVzcG9uc2UxLmF1dG9DYXB0dXJlJyxcbiAgICAgICAgICAgIG1hcmtBc05vdE1hbmRhdG9yeTogJ2ludGVyYWN0aW9ucy52YWxpZGF0aW9uLnJlcXVpcmVkJyxcbiAgICAgICAgICAgIG51bWJlck9ubHk6ICdpbnRlcmFjdGlvbnMucmVzcG9uc2UxLnR5cGUubnVtYmVyJyxcbiAgICAgICAgICAgIGNoYXJhY3RlckxpbWl0OiAnaW50ZXJhY3Rpb25zLnJlc3BvbnNlMS52YWxpZGF0aW9uLmxpbWl0Lm1heExlbmd0aCcsXG4gICAgICAgICAgICByZW1hcmtzTGltaXQ6ICdyZW1hcmtzLm1heExlbmd0aCcsXG4gICAgICAgICAgICBldmlkZW5jZU1pbWVUeXBlOiAnZXZpZGVuY2UubWltZVR5cGUnXG4gICAgICAgICAgfTtcbiAgICAgICAgICBpZiAodGhpcy5xdWVzdGlvbk1ldGFEYXRhICYmIF8uaGFzKGF2YWlsYWJsZUFsaWFzLCBmb3JtRmllbGRDYXRlZ29yeS5jb2RlKSkge1xuICAgICAgICAgICAgbGV0IGRlZmF1bHRWYWx1ZSA9IF8uZ2V0KHRoaXMucXVlc3Rpb25NZXRhRGF0YSwgYXZhaWxhYmxlQWxpYXNbZm9ybUZpZWxkQ2F0ZWdvcnkuY29kZV0pO1xuICAgICAgICAgICAgaWYgKGZvcm1GaWVsZENhdGVnb3J5LmNvZGUgPT09ICdtYXJrQXNOb3RNYW5kYXRvcnknKSB7XG4gICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IGRlZmF1bHRWYWx1ZSA9PT0gJ1llcycgPyAnTm8nIDogJ1llcyc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3JtRmllbGRDYXRlZ29yeS5kZWZhdWx0ID0gZGVmYXVsdFZhbHVlO1xuICAgICAgICAgICAgdGhpcy5jaGlsZEZvcm1EYXRhW2Zvcm1GaWVsZENhdGVnb3J5LmNvZGVdID0gZGVmYXVsdFZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcblxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXG4gICAgICAgIGNvbnN0IHF1ZXN0aW9uU2V0RGVmYXVsdFZhbHVlID0gXy5nZXQodGhpcy5xdWVzdGlvblNldEhpZXJhcmNoeSwgZm9ybUZpZWxkQ2F0ZWdvcnkuY29kZSkgPyBfLmdldCh0aGlzLnF1ZXN0aW9uU2V0SGllcmFyY2h5LCBmb3JtRmllbGRDYXRlZ29yeS5jb2RlKSA6ICcnO1xuICAgICAgICBjb25zdCBkZWZhdWx0RWRpdFN0YXR1cyA9IF8uZmluZCh0aGlzLmluaXRpYWxMZWFmRm9ybUNvbmZpZywge2NvZGU6IGZvcm1GaWVsZENhdGVnb3J5LmNvZGV9KS5lZGl0YWJsZSA9PT0gdHJ1ZTtcbiAgICAgICAgZm9ybUZpZWxkQ2F0ZWdvcnkuZGVmYXVsdCA9IGRlZmF1bHRFZGl0U3RhdHVzID8gJycgOiBxdWVzdGlvblNldERlZmF1bHRWYWx1ZTtcbiAgICAgICAgdGhpcy5jaGlsZEZvcm1EYXRhW2Zvcm1GaWVsZENhdGVnb3J5LmNvZGVdID0gZm9ybUZpZWxkQ2F0ZWdvcnkuZGVmYXVsdDtcbiAgICAgICAgaWYgKGZvcm1GaWVsZENhdGVnb3J5LmNvZGUgPT09ICdtYXhTY29yZScgJiYgdGhpcy5xdWVzdGlvbkludGVyYWN0aW9uVHlwZSA9PT0gJ2Nob2ljZScpIHtcbiAgICAgICAgICB0aGlzLmNoaWxkRm9ybURhdGFbZm9ybUZpZWxkQ2F0ZWdvcnkuY29kZV0gPSB0aGlzLm1heFNjb3JlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5mZXRjaEZyYW1lV29ya0RldGFpbHMoKTtcbiAgICAodGhpcy5pc1JlYWRPbmx5TW9kZSA9PT10cnVlICYmICFfLmlzVW5kZWZpbmVkKHRoaXMuZWRpdG9yU2VydmljZT8uZWRpdG9yQ29uZmlnPy5jb25maWc/LnJlbmRlclRheG9ub215KSkgPyB0aGlzLnByZXZpZXdGb3JtRGF0YShmYWxzZSkgOiB0aGlzLnByZXZpZXdGb3JtRGF0YSh0cnVlKTtcbiAgfVxuXG4gIHN1Yk1lbnVDaGFuZ2UoeyBpbmRleCwgdmFsdWUgfSkge1xuICAgIGlmICh0aGlzLnN1Yk1lbnVzW2luZGV4XS5pZCA9PT0gJ2FkZERlcGVuZGFudFF1ZXN0aW9uJykge1xuICAgICAgdGhpcy5zaG93QWRkU2Vjb25kYXJ5UXVlc3Rpb25DYXQgPSB0cnVlO1xuICAgICAgdGhpcy5zYXZlQ29udGVudCgpO1xuICAgICAgaWYgKHRoaXMuc2hvd0Zvcm1FcnJvcikge1xuICAgICAgICB0aGlzLnNob3dBZGRTZWNvbmRhcnlRdWVzdGlvbkNhdCA9IGZhbHNlO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuc3ViTWVudXNbaW5kZXhdLnZhbHVlID0gdmFsdWU7XG4gIH1cblxuICBnZXQgZGVwZW5kZW50UXVlc3Rpb25zKCkge1xuICAgIHRyeSB7XG4gICAgICAgcmV0dXJuIHRoaXMuc3ViTWVudXMuZmlsdGVyKG1lbnUgPT4gbWVudS5pZCA9PT0gJ2FkZERlcGVuZGFudFF1ZXN0aW9uJylbMF0udmFsdWU7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuICBzdWJNZW51Q29uZmlnKCkge1xuICAgIHRoaXMuc3ViTWVudXMgPSBbXG4gICAgICB7XG4gICAgICAgIGlkOiAnYWRkSGludCcsXG4gICAgICAgIG5hbWU6ICdBZGQgSGludCcsXG4gICAgICAgIHZhbHVlOiBfLmdldCh0aGlzLnF1ZXN0aW9uTWV0YURhdGEsICdoaW50cy5lblswXScpLFxuICAgICAgICBsYWJlbDogJ0hpbnQnLFxuICAgICAgICBlbmFibGVkOiBfLmdldCh0aGlzLnF1ZXN0aW9uTWV0YURhdGEsICdoaW50cy5lblswXScpID8gdHJ1ZSA6IGZhbHNlLFxuICAgICAgICB0eXBlOiAnaW5wdXQnLFxuICAgICAgICBzaG93OiBfLmdldCh0aGlzLnNvdXJjaW5nU2V0dGluZ3MsICdzaG93QWRkSGludHMnKVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgaWQ6ICdhZGRUaXAnLFxuICAgICAgICBuYW1lOiAnQWRkIFRpcCcsXG4gICAgICAgIHZhbHVlOiBfLmdldCh0aGlzLnF1ZXN0aW9uTWV0YURhdGEsICdpbnN0cnVjdGlvbnMuZW5bMF0nKSxcbiAgICAgICAgbGFiZWw6ICdUaXAnLFxuICAgICAgICBlbmFibGVkOiBfLmdldCh0aGlzLnF1ZXN0aW9uTWV0YURhdGEsICdpbnN0cnVjdGlvbnMuZW5bMF0nKSA/IHRydWUgOiBmYWxzZSxcbiAgICAgICAgdHlwZTogJ2lucHV0JyxcbiAgICAgICAgc2hvdzogXy5nZXQodGhpcy5zb3VyY2luZ1NldHRpbmdzLCAnc2hvd0FkZFRpcHMnKVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgaWQ6ICdhZGREZXBlbmRhbnRRdWVzdGlvbicsXG4gICAgICAgIG5hbWU6ICdBZGQgRGVwZW5kYW50IFF1ZXN0aW9uJyxcbiAgICAgICAgbGFiZWw6ICcnLFxuICAgICAgICB2YWx1ZTogW10sXG4gICAgICAgIGVuYWJsZWQ6IGZhbHNlLFxuICAgICAgICB0eXBlOiAnJyxcbiAgICAgICAgc2hvdzogXy5nZXQodGhpcy5zb3VyY2luZ1NldHRpbmdzLCAnc2hvd0FkZFNlY29uZGFyeVF1ZXN0aW9uJykgJiYgIXRoaXMucXVlc3Rpb25JbnB1dC5zZXRDaGlsZFF1ZXN0b25cbiAgICAgIH0sXG4gICAgXTtcbiAgICBpZiAoIV8uZ2V0KHRoaXMuc291cmNpbmdTZXR0aW5ncywgJ3Nob3dBZGRTZWNvbmRhcnlRdWVzdGlvbicpICYmICF0aGlzLnF1ZXN0aW9uSW5wdXQuc2V0Q2hpbGRRdWVzdG9uKSB7XG4gICAgICB0aGlzLnNob3dPcHRpb25zID0gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICB0aGlzLnNob3dPcHRpb25zID0gKHRoaXMucXVlc3Rpb25JbnB1dC5zZXRDaGlsZFF1ZXN0b24gPT09IHRydWUpID8gdHJ1ZSA6IGZhbHNlO1xuICB9XG4gIH1cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5vbkNvbXBvbmVudERlc3Ryb3kkLm5leHQoKTtcbiAgICB0aGlzLm9uQ29tcG9uZW50RGVzdHJveSQuY29tcGxldGUoKTtcbiAgICB0aGlzLmVkaXRvckN1cnNvci5jbGVhclF1ZXN0aW9uTWFwKCk7XG4gIH1cblxuICBzbGlkZXJEYXRhKCRldmVudCkge1xuICAgIGNvbnN0IHZhbCA9ICRldmVudDtcbiAgICBjb25zdCBvYmogPSB7XG4gICAgICB2YWxpZGF0aW9uOiB7XG4gICAgICAgIHJhbmdlOiB7XG4gICAgICAgICAgbWluOiAnJyxcbiAgICAgICAgICBtYXg6ICcnXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBzdGVwOiAnJ1xuICAgIH07XG4gICAgaWYgKHZhbC5sZWZ0QW5jaG9yKSB7XG4gICAgICBvYmoudmFsaWRhdGlvbi5yYW5nZS5taW4gPSB2YWwubGVmdEFuY2hvcjtcbiAgICB9XG4gICAgaWYgKHZhbC5yaWdodEFuY2hvcikge1xuICAgICAgb2JqLnZhbGlkYXRpb24ucmFuZ2UubWF4ID0gdmFsLnJpZ2h0QW5jaG9yO1xuICAgIH1cbiAgICBpZiAodmFsLnN0ZXApIHtcbiAgICAgIG9iai5zdGVwID0gdmFsLnN0ZXA7XG4gICAgfVxuICAgIHRoaXMuc2xpZGVyRGF0YXMgPSBvYmo7XG4gIH1cblxuICBvcHRpb25IYW5kbGVyKGUpIHtcbiAgICB0aGlzLnRhcmdldE9wdGlvbiA9IGUudGFyZ2V0LnZhbHVlO1xuICB9XG5cblxuICBidWlsZENvbmRpdGlvbih0eXBlKSB7XG4gICAgaWYodGhpcy5jb25kaXRpb24gPT09J2RlZmF1bHQnIHx8IF8uaXNFbXB0eSh0aGlzLnNlbGVjdGVkT3B0aW9ucykgKXtcbiAgICAgIHRoaXMudG9hc3RlclNlcnZpY2UuZXJyb3IoXy5nZXQodGhpcy5jb25maWdTZXJ2aWNlLCAnbGFiZWxDb25maWcubWVzc2FnZXMuZXJyb3IuMDM4JykpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBxdWVzdGlvbklkID0gdGhpcy5xdWVzdGlvbklkID8gdGhpcy5xdWVzdGlvbklkIDogdXVpZHY0KCk7XG4gICAgY29uc3QgZGF0YSA9IHRoaXMudHJlZU5vZGVEYXRhO1xuICAgIGNvbnN0IGhpZXJhcmNoeURhdGEgPSB0aGlzLmVkaXRvclNlcnZpY2UuZ2V0SGllcmFyY2h5T2JqKGRhdGEsICcnLCB0aGlzLnNlbGVjdGVkU2VjdGlvbklkKTtcbiAgICBjb25zdCBzZWN0aW9uRGF0YSA9IF8uZ2V0KGhpZXJhcmNoeURhdGEsIGAke3RoaXMuc2VsZWN0ZWRTZWN0aW9uSWR9YCk7XG4gICAgY29uc3Qgc2VjdGlvbk5hbWUgPSBzZWN0aW9uRGF0YS5uYW1lO1xuICAgIGNvbnN0IGJyYW5jaGluZ0xvZ2ljID0ge1xuICAgICAgLi4udGhpcy5icmFuY2hpbmdMb2dpYyxcbiAgICAgIFt0aGlzLmVkaXRvclNlcnZpY2UucGFyZW50SWRlbnRpZmllcl06IHtcbiAgICAgICAgdGFyZ2V0OiB0aGlzLnVwZGF0ZVRhcmdldChxdWVzdGlvbklkKSxcbiAgICAgICAgcHJlQ29uZGl0aW9uOiB7fSxcbiAgICAgICAgc291cmNlOiBbXVxuICAgICAgfSxcbiAgICAgIFtxdWVzdGlvbklkXToge1xuICAgICAgICB0YXJnZXQ6IFtdLFxuICAgICAgICBzb3VyY2U6IFt0aGlzLmVkaXRvclNlcnZpY2UucGFyZW50SWRlbnRpZmllcl0sXG4gICAgICAgIHByZUNvbmRpdGlvbjoge1xuICAgICAgICAgIGFuZDogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBbdGhpcy5jb25kaXRpb25dOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgdmFyOiBgJHt0aGlzLmVkaXRvclNlcnZpY2UucGFyZW50SWRlbnRpZmllcn0uJHt0aGlzLnJlc3BvbnNlVmFyaWFibGV9LnZhbHVlYCxcbiAgICAgICAgICAgICAgICAgIHR5cGU6ICdyZXNwb25zZURlY2xhcmF0aW9uJyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRPcHRpb25zLFxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgfTtcbiAgICB0aGlzLnVwZGF0ZVRyZWVDYWNoZShzZWN0aW9uTmFtZSwgYnJhbmNoaW5nTG9naWMsIHRoaXMuc2VsZWN0ZWRTZWN0aW9uSWQpO1xuICAgIGNvbnN0IG1ldGFEYXRhID0gdGhpcy5nZXRRdWVzdGlvbk1ldGFkYXRhKCk7XG4gICAgdGhpcy5zZXRRdWVzdGlvblR5cGVWYWx1ZXMobWV0YURhdGEpO1xuICAgIGNvbnN0IGZpbmFsUmVzdWx0ID0ge1xuICAgICAgbm9kZXNNb2RpZmllZDoge1xuICAgICAgICBbcXVlc3Rpb25JZF06IHtcbiAgICAgICAgICBtZXRhZGF0YTogbWV0YURhdGEsXG4gICAgICAgICAgb2JqZWN0VHlwZTogJ1F1ZXN0aW9uJyxcbiAgICAgICAgICByb290OiBmYWxzZSxcbiAgICAgICAgICBpc05ldzogdGhpcy5xdWVzdGlvbklkID8gZmFsc2UgOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFt0aGlzLnNlbGVjdGVkU2VjdGlvbklkXToge1xuICAgICAgICAgIC4uLnRoaXMudHJlZVNlcnZpY2UudHJlZUNhY2hlLm5vZGVzTW9kaWZpZWRbdGhpcy5zZWxlY3RlZFNlY3Rpb25JZF1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGhpZXJhcmNoeTogdGhpcy5lZGl0b3JTZXJ2aWNlLmdldEhpZXJhcmNoeU9iaihkYXRhLCBxdWVzdGlvbklkLCB0aGlzLnNlbGVjdGVkU2VjdGlvbklkLHRoaXMuZWRpdG9yU2VydmljZS5wYXJlbnRJZGVudGlmaWVyKVxuICAgIH07XG4gICAgdGhpcy5zYXZlUXVlc3Rpb25zKGZpbmFsUmVzdWx0LCB0eXBlKTtcbiAgfVxuXG4gIHVwZGF0ZVRhcmdldChxdWVzdGlvbklkKSB7XG4gICAgaWYgKCFfLmlzRW1wdHkodGhpcy5icmFuY2hpbmdMb2dpYykgJiYgXy5nZXQodGhpcy5icmFuY2hpbmdMb2dpYywgYCR7dGhpcy5lZGl0b3JTZXJ2aWNlLnBhcmVudElkZW50aWZpZXJ9LnRhcmdldGApKSB7XG4gICAgICBpZiAodGhpcy5icmFuY2hpbmdMb2dpY1t0aGlzLmVkaXRvclNlcnZpY2UucGFyZW50SWRlbnRpZmllcl0udGFyZ2V0LmluY2x1ZGVzKHF1ZXN0aW9uSWQpKSB7XG4gICAgICAgIHJldHVybiBbLi4udGhpcy5icmFuY2hpbmdMb2dpY1t0aGlzLmVkaXRvclNlcnZpY2UucGFyZW50SWRlbnRpZmllcl0udGFyZ2V0XTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBbLi4udGhpcy5icmFuY2hpbmdMb2dpY1t0aGlzLmVkaXRvclNlcnZpY2UucGFyZW50SWRlbnRpZmllcl0udGFyZ2V0LCBgJHtxdWVzdGlvbklkfWBdO1xuICAgIH1cbiAgICByZXR1cm4gW2Ake3F1ZXN0aW9uSWR9YF07XG4gIH1cblxuICBnZXRPcHRpb25zKCkge1xuICAgIGlmICh0aGlzLmVkaXRvclNlcnZpY2Uub3B0aW9uc0xlbmd0aCkge1xuICAgICAgdGhpcy5vcHRpb25zID0gW107XG4gICAgICBBcnJheS5mcm9tKHtsZW5ndGg6IHRoaXMuZWRpdG9yU2VydmljZS5vcHRpb25zTGVuZ3RofSwgKHgsIGkpID0+IHtcbiAgICAgICAgdGhpcy5vcHRpb25zLnB1c2goe3ZhbHVlOiBpLCBsYWJlbDogaX0pO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0UGFyZW50UXVlc3Rpb25PcHRpb25zKHF1ZXN0aW9uSWQpIHtcbiAgICB0aGlzLmVkaXRvclNlcnZpY2UucGFyZW50SWRlbnRpZmllciA9IHF1ZXN0aW9uSWQ7XG4gICAgdGhpcy5xdWVzdGlvblNlcnZpY2UucmVhZFF1ZXN0aW9uKHF1ZXN0aW9uSWQpXG4gICAgLnN1YnNjcmliZSgocmVzKSA9PiB7XG4gICAgICBpZiAocmVzLnJlc3BvbnNlQ29kZSA9PT0gJ09LJykge1xuICAgICAgICBjb25zdCByZXN1bHQgPSByZXMucmVzdWx0LnF1ZXN0aW9uO1xuICAgICAgICBpZiAocmVzdWx0LmludGVyYWN0aW9uVHlwZXNbMF0gPT09ICdjaG9pY2UnKSB7XG4gICAgICAgICAgY29uc3QgbnVtYmVyT2ZPcHRpb25zID0gcmVzdWx0LmVkaXRvclN0YXRlLm9wdGlvbnMubGVuZ3RoO1xuICAgICAgICAgIHRoaXMuZWRpdG9yU2VydmljZS5vcHRpb25zTGVuZ3RoID0gbnVtYmVyT2ZPcHRpb25zO1xuICAgICAgICAgIHRoaXMuZ2V0T3B0aW9ucygpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICB1cGRhdGVUcmVlQ2FjaGUoc2VjdGlvbk5hbWUsIGJyYW5jaGluZ0xvZ2ljLCBzZWxlY3RlZFNlY3Rpb24pIHtcbiAgICBjb25zdCBtZXRhZGF0YSA9IHtcbiAgICAgIG5hbWU6IHNlY3Rpb25OYW1lLFxuICAgICAgcHJpbWFyeUNhdGVnb3J5OiB0aGlzLnNlY3Rpb25QcmltYXJ5Q2F0ZWdvcnksXG4gICAgICBhbGxvd0JyYW5jaGluZzogJ1llcycsXG4gICAgICBicmFuY2hpbmdMb2dpY1xuICAgIH07XG4gICAgdGhpcy50cmVlU2VydmljZS51cGRhdGVOb2RlKG1ldGFkYXRhLCBzZWxlY3RlZFNlY3Rpb24sIHRoaXMuc2VjdGlvblByaW1hcnlDYXRlZ29yeSk7XG4gIH1cblxuICBzZXRDb25kaXRpb24oZGF0YSkge1xuICAgIGNvbnN0IENvbmRpdGlvbiA9IF8uZ2V0KGRhdGE/LmJyYW5jaGluZ0xvZ2ljLCBgJHt0aGlzLnF1ZXN0aW9uSWR9LnByZUNvbmRpdGlvbi5hbmRbMF1gKTtcbiAgICBjb25zdCBnZXRDb25kaXRpb24gPSBPYmplY3Qua2V5cyhDb25kaXRpb24pO1xuICAgIHRoaXMuY29uZGl0aW9uID0gZ2V0Q29uZGl0aW9uWzBdO1xuICAgIHRoaXMuc2VsZWN0ZWRPcHRpb25zID0gQ29uZGl0aW9uW2dldENvbmRpdGlvbl1bMV07XG4gIH1cblxuICBnZXRCcmFuY2hpbmdMb2dpYyhjaGlsZHJlbikge1xuICAgIF8uZm9yRWFjaChjaGlsZHJlbiwgKGRhdGEpID0+IHtcbiAgICAgIGlmIChkYXRhLmlkZW50aWZpZXIgPT09IHRoaXMuc2VsZWN0ZWRTZWN0aW9uSWQpIHtcbiAgICAgICAgdGhpcy5icmFuY2hpbmdMb2dpYyA9IGRhdGE/LmJyYW5jaGluZ0xvZ2ljID8gZGF0YT8uYnJhbmNoaW5nTG9naWMgOiB7fTtcbiAgICAgICAgaWYgKF8uZ2V0KGRhdGE/LmJyYW5jaGluZ0xvZ2ljLCBgJHt0aGlzLnF1ZXN0aW9uSWR9LnNvdXJjZVswXWApKSB7XG4gICAgICAgICAgdGhpcy5pc0NoaWxkUXVlc3Rpb24gPSB0cnVlO1xuICAgICAgICAgIHRoaXMuZ2V0UGFyZW50UXVlc3Rpb25PcHRpb25zKGRhdGEuYnJhbmNoaW5nTG9naWNbdGhpcy5xdWVzdGlvbklkXS5zb3VyY2VbMF0pO1xuICAgICAgICAgIHRoaXMuc2V0Q29uZGl0aW9uKGRhdGEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZGF0YT8uY2hpbGRyZW4pIHtcbiAgICAgICAgdGhpcy5nZXRCcmFuY2hpbmdMb2dpYyhkYXRhPy5jaGlsZHJlbik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBvblF1YWxpdHlGb3JtU3VibWl0KGV2ZW50KSB7XG4gICAgc3dpdGNoIChldmVudC5hY3Rpb24pIHtcbiAgICAgIGNhc2UgJ3N1Ym1pdCc6XG4gICAgICAgIHRoaXMuc2F2ZVF1YWxpdHlQYXJhbWV0ZXJzKGV2ZW50LmRhdGEsIHRoaXMuc2VuZFF1ZXN0aW9uRm9yUHVibGlzaC5iaW5kKHRoaXMsIHt9KSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAncmVxdWVzdENoYW5nZSc6XG4gICAgICAgIHRoaXMucmVxdWVzdENoYW5nZXNQb3B1cEFjdGlvbiA9IG51bGw7XG4gICAgICAgIHRoaXMuc2F2ZVF1YWxpdHlQYXJhbWV0ZXJzKGV2ZW50LmRhdGEsIHRoaXMub3BlblJlcXVlc3RDaGFuZ2VzUG9wdXAuYmluZCh0aGlzLCB7fSkpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRoaXMuc2hvd1F1YWxpdHlQYXJhbWV0ZXJQb3B1cCA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHNhdmVRdWFsaXR5UGFyYW1ldGVycyhxdWFsaXR5UGFyYW1ldGVycywgY2FsbGJhY2spIHtcbiAgICBjb25zdCByZXF1ZXN0T2JqID0ge1xuICAgICAgcXVlc3Rpb246IHtcbiAgICAgICAgcmV2aWV3ZXJRdWFsaXR5Q2hlY2tzOiBxdWFsaXR5UGFyYW1ldGVyc1xuICAgICAgfVxuICAgIH07XG4gICAgdGhpcy5xdWVzdGlvblNlcnZpY2UudXBkYXRlUXVlc3Rpb24odGhpcy5xdWVzdGlvbklkLCByZXF1ZXN0T2JqKS5zdWJzY3JpYmUocmVzID0+IHtcbiAgICAgICAgdGhpcy5zaG93UXVhbGl0eVBhcmFtZXRlclBvcHVwID0gZmFsc2U7XG4gICAgICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIG9wZW5SZXF1ZXN0Q2hhbmdlc1BvcHVwKCkge1xuICAgIHRoaXMucmVxdWVzdENoYW5nZXNQb3B1cEFjdGlvbiA9ICdyZWplY3RRdWVzdGlvbic7XG4gIH1cblxuICBjYWxjdWxhdGVNaW5NYXhTY29yZShtZXRhRGF0YSl7XG4gICAgY29uc3Qgc2NvcmVzID0gW107XG4gICAgaWYgKCFfLmlzRW1wdHkobWV0YURhdGEucmVzcG9uc2VEZWNsYXJhdGlvbi5yZXNwb25zZTEubWFwcGluZykpIHtcbiAgICAgIG1ldGFEYXRhLnJlc3BvbnNlRGVjbGFyYXRpb24ucmVzcG9uc2UxLm1hcHBpbmcuZm9yRWFjaChpdGVtID0+IHNjb3Jlcy5wdXNoKGl0ZW0ub3V0Y29tZXMuc2NvcmUpKTtcbiAgICAgIG1ldGFEYXRhLnJlc3BvbnNlRGVjbGFyYXRpb24ucmVzcG9uc2UxLm1pblNjb3JlID0gTWF0aC5taW4oLi4uc2NvcmVzKTtcbiAgICAgIGlmIChfLmdldChtZXRhRGF0YSwgJ3Jlc3BvbnNlRGVjbGFyYXRpb24ucmVzcG9uc2UxLmNhcmRpbmFsaXR5JykgPT09ICdtdWx0aXBsZScpe1xuICAgICAgICBsZXQgc3VtID0gMDtcbiAgICAgICAgbWV0YURhdGEucmVzcG9uc2VEZWNsYXJhdGlvbi5yZXNwb25zZTEubWFwcGluZy5mb3JFYWNoKGl0ZW0gPT4gc3VtICs9ICsoaXRlbS5vdXRjb21lcy5zY29yZSkpO1xuICAgICAgICBtZXRhRGF0YS5yZXNwb25zZURlY2xhcmF0aW9uLnJlc3BvbnNlMS5tYXhTY29yZSA9IHN1bTtcbiAgICAgIH1lbHNle1xuICAgICAgbWV0YURhdGEucmVzcG9uc2VEZWNsYXJhdGlvbi5yZXNwb25zZTEubWF4U2NvcmUgPSBNYXRoLm1heCguLi5zY29yZXMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufSIsIjxkaXYgKm5nSWY9J3Nob3dMb2FkZXInIGNsYXNzPVwidWkgY29udGFpbmVyXCI+XG4gIDxhcHAtbG9hZGVyPjwvYXBwLWxvYWRlcj5cbjwvZGl2PlxuPGRpdiBjbGFzcz1cInNiLWVkaXRvci1jb250YWluZXIgbWItMFwiICpuZ0lmPVwiIXNob3dMb2FkZXJcIj5cbiAgPGxpYi1oZWFkZXIgW2xhYmVsQ29uZmlnRGF0YV09XCJ0b29sYmFyQ29uZmlnXCIgW2J1dHRvbkxvYWRlcnNdPVwiYnV0dG9uTG9hZGVyc1wiIFtwYWdlSWRdPVwicGFnZUlkXCIgW3JlcXVlc3RDaGFuZ2VdID0gXCJyZXF1ZXN0Q2hhbmdlc1BvcHVwQWN0aW9uXCIgKHRvb2xiYXJFbWl0dGVyKT1cInRvb2xiYXJFdmVudExpc3RlbmVyKCRldmVudClcIj5cbiAgPC9saWItaGVhZGVyPlxuXG4gIDxkaXYgY2xhc3M9XCJzYi1iZy13aGl0ZSBweS0yMFwiPlxuICAgIDxkaXYgY2xhc3M9XCJ1aSBjb250YWluZXIgc2ItY29udGFpbmVyXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwidWkgdHdlbHZlIGNvbHVtbiB3aWRlIGgtMTAwXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJweC0xNlwiPlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJzaG93UHJldmlld1wiIGNsYXNzPVwiYnItMiBiLTEtMTAwXCI+XG4gICAgICAgICAgICA8bGliLXF1bWwtcGxheWVyIFtxdWVzdGlvblNldEhpZXJhcmNoeV09XCJxdWVzdGlvblNldEhpZXJhcmNoeVwiIFtpc1NpbmdsZVF1ZXN0aW9uUHJldmlld109XCJ0cnVlXCI+PC9saWItcXVtbC1wbGF5ZXI+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7YWxpZ24taXRlbXM6IGZsZXgtZW5kO2p1c3RpZnktY29udGVudDogZmxleC1lbmQ7XCJcbiAgICAgICAgICAgICpuZ0lmPVwic2hvd09wdGlvbnMgfHwgaXNDaGlsZFF1ZXN0aW9uIFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm9wdGlvbnNcIj5cbiAgICAgICAgICAgICAgPHN1aS1zZWxlY3QgWyhuZ01vZGVsKV09XCJjb25kaXRpb25cIiB2YWx1ZUZpZWxkPVwidmFsdWVcIiBjbGFzcz1cInNlbGVjdGlvbiBtdWx0aXNlbGVjdFwiXG4gICAgICAgICAgICAgIGxhYmVsRmllbGQ9XCJsYWJlbFwiIFtwbGFjZWhvbGRlcl09XCInU2VsZWN0IENvbmRpdGlvbidcIiAjc2VsZWN0IFtpc0Rpc2FibGVkXT1cImlzUmVhZE9ubHlNb2RlXCI+XG4gICAgICAgICAgICAgICAgPHN1aS1zZWxlY3Qtb3B0aW9uIFt2YWx1ZV09XCJ7bGFiZWw6J0VxdWFsIHRvJyx2YWx1ZTonZXEnfVwiPjwvc3VpLXNlbGVjdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgPHN1aS1zZWxlY3Qtb3B0aW9uIFt2YWx1ZV09XCJ7bGFiZWw6J05vdCBlcXVhbCcsdmFsdWU6J25lJ31cIj48L3N1aS1zZWxlY3Qtb3B0aW9uPlxuICAgICAgICAgICAgICA8L3N1aS1zZWxlY3Q+XG5cbiAgICAgICAgICAgICAgPHN1aS1tdWx0aS1zZWxlY3QgY2xhc3M9XCJzZWxlY3Rpb24gbXVsdGlzZWxlY3RcIiBbKG5nTW9kZWwpXT1cInNlbGVjdGVkT3B0aW9uc1wiIHZhbHVlRmllbGQ9XCJ2YWx1ZVwiXG4gICAgICAgICAgICAgICAgbGFiZWxGaWVsZD1cImxhYmVsXCIgW2lzU2VhcmNoYWJsZV09XCJmYWxzZVwiICNtdWx0aVNlbGVjdCBbcGxhY2Vob2xkZXJdPVwiJ1NlbGVjdCBvcHRpb25zJ1wiIFtpc0Rpc2FibGVkXT1cImlzUmVhZE9ubHlNb2RlXCIgPlxuICAgICAgICAgICAgICAgIDxzdWktc2VsZWN0LW9wdGlvbiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIG9wdGlvbnNcIiBbdmFsdWVdPVwib3B0aW9uXCI+XG4gICAgICAgICAgICAgICAgPC9zdWktc2VsZWN0LW9wdGlvbj5cbiAgICAgICAgICAgICAgPC9zdWktbXVsdGktc2VsZWN0PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInB5LTIwIHB4LTMyIGJyLTQgYi0xLTEwMFwiICpuZ0lmPVwiIXNob3dQcmV2aWV3XCIgW25nQ2xhc3NdPVwieydzYi1iZy1jb2xvci1wcmltYXJ5LTAnOiAhaXNSZWFkT25seU1vZGV9XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2ItZmllbGQtZ3JvdXBcIj5cbiAgICAgICAgICAgICAgPGxhYmVsICpuZ0lmPVwiIWlzUmVhZE9ubHlNb2RlXCIgY2xhc3M9XCJmcy0wLTkyIGZvbnQtd2VpZ2h0LWJvbGRcIj57e2NvbmZpZ1NlcnZpY2UubGFiZWxDb25maWc/LmxibD8ucXVlc3Rpb259fTxzcGFuIGNsYXNzPVwic2ItcmVxdWlyZWRcIj4qPC9zcGFuPjwvbGFiZWw+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYi1maWVsZFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgW25nQ2xhc3NdPVwieydja2VkaXRvci10b29sX19xdWVzdGlvbic6ICFpc1JlYWRPbmx5TW9kZSwgJ2NrZWRpdG9yLXRvb2xfX3F1ZXN0aW9uLXJlYWRvbmx5JzogaXNSZWFkT25seU1vZGUsICdtYi01JzogdHJ1ZX1cIj5cbiAgICAgICAgICAgICAgICAgIDxsaWItY2tlZGl0b3ItdG9vbFxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiFpc1JlYWRPbmx5TW9kZVwiXG4gICAgICAgICAgICAgICAgICAgIChlZGl0b3JEYXRhT3V0cHV0KT1cImVkaXRvckRhdGFIYW5kbGVyKCRldmVudCwgJ3F1ZXN0aW9uJylcIlxuICAgICAgICAgICAgICAgICAgICBbZWRpdG9yRGF0YUlucHV0XT1cImVkaXRvclN0YXRlLnF1ZXN0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgKHZpZGVvRGF0YU91dHB1dCk9XCJ2aWRlb0RhdGFPdXRwdXQoJGV2ZW50KVwiIFt2aWRlb1Nob3ddPVwidmlkZW9TaG93XCI+PC9saWItY2tlZGl0b3ItdG9vbD5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc1JlYWRPbmx5TW9kZVwiPlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJweC0xNiBweS04IGZzLTAtOTIgbWItMCBja2VkaXRvci10b29sX19sYWJlbCB3aWR0aC0xMDBcIj57e2NvbmZpZ1NlcnZpY2UubGFiZWxDb25maWc/LmxibD8ucXVlc3Rpb259fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJja2VkaXRvci10b29sX19zb2x1dGlvbl9fYm9keVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiZnMtMC03ODUgcC0xNlwiIFtpbm5lckhUTUxdPVwiZWRpdG9yU3RhdGUucXVlc3Rpb24gfCBzYW5pdGl6ZUh0bWxcIj48L3A+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGxhYmVsICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgIHNob3dGb3JtRXJyb3IgJiZcbiAgICAgICAgICAgICAgICAgICAgW3VuZGVmaW5lZCwgJyddLmluY2x1ZGVzKGVkaXRvclN0YXRlLnF1ZXN0aW9uKVxuICAgICAgICAgICAgICAgICAgXCIgY2xhc3M9XCJzYi1jb2xvci1lcnJvciBmcy0wLTc4NVwiPnt7Y29uZmlnU2VydmljZS5sYWJlbENvbmZpZz8ubGJsPy5xdWVzdGlvblJlcXVpcmVkfX08L2xhYmVsPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGxpYi1xdWVzdGlvbi1vcHRpb24tc3ViLW1lbnUgKm5nSWY9XCJzdWJNZW51cz8ubGVuZ3RoXCIgW3N1Yk1lbnVzXT1cInN1Yk1lbnVzXCJcbiAgICAgICAgICAgICAgICAob25DaGFuZ2UpPVwic3ViTWVudUNoYW5nZSgkZXZlbnQpXCI+PC9saWItcXVlc3Rpb24tb3B0aW9uLXN1Yi1tZW51PlxuXG4gICAgICAgICAgICAgIDxsaWItYW5zd2VyICpuZ0lmPVwicXVlc3Rpb25JbnRlcmFjdGlvblR5cGUgPT09ICdkZWZhdWx0J1wiXG4gICAgICAgICAgICAgICAgW2VkaXRvclN0YXRlXT1cImVkaXRvclN0YXRlXCIgW3Nob3dGb3JtRXJyb3JdPVwic2hvd0Zvcm1FcnJvclwiXG4gICAgICAgICAgICAgICAgKGVkaXRvckRhdGFPdXRwdXQpPVwiZWRpdG9yRGF0YUhhbmRsZXIoJGV2ZW50KVwiIFtpc1JlYWRPbmx5TW9kZV09XCJpc1JlYWRPbmx5TW9kZVwiPjwvbGliLWFuc3dlcj5cblxuICAgICAgICAgICAgICA8bGliLW9wdGlvbnMgKm5nSWY9XCJxdWVzdGlvbkludGVyYWN0aW9uVHlwZSA9PT0gJ2Nob2ljZSdcIlxuICAgICAgICAgICAgICAgIFtxdWVzdGlvblByaW1hcnlDYXRlZ29yeV09XCJxdWVzdGlvblByaW1hcnlDYXRlZ29yeVwiXG4gICAgICAgICAgICAgICAgW2VkaXRvclN0YXRlXT1cImVkaXRvclN0YXRlXCIgW3Nob3dGb3JtRXJyb3JdPVwic2hvd0Zvcm1FcnJvclwiXG4gICAgICAgICAgICAgICAgKGVkaXRvckRhdGFPdXRwdXQpPVwiZWRpdG9yRGF0YUhhbmRsZXIoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgW3NvdXJjaW5nU2V0dGluZ3NdPVwic291cmNpbmdTZXR0aW5nc1wiIFttYXBwaW5nXT1cInNjb3JlTWFwcGluZ1wiXG4gICAgICAgICAgICAgICAgW2lzUmVhZE9ubHlNb2RlXT1cImlzUmVhZE9ubHlNb2RlXCI+PC9saWItb3B0aW9ucz5cblxuICAgICAgICAgICAgICA8bGliLXNsaWRlciAqbmdJZj1cInF1ZXN0aW9uSW50ZXJhY3Rpb25UeXBlID09PSAnc2xpZGVyJ1wiIFtlZGl0b3JEYXRhSW5wdXRdPVwic2xpZGVyT3B0aW9uc1wiXG4gICAgICAgICAgICAgICAgKG9uQ2hhbmdlKT1cInNsaWRlckRhdGEoJGV2ZW50KVwiPjwvbGliLXNsaWRlcj5cblxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzUmVhZE9ubHlNb2RlOyBlbHNlIHJlYWRPbmx5U29sdXRpb25zQ29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInNvdXJjaW5nU2V0dGluZ3M/LnNob3dTb2x1dGlvbiAhPT0gZmFsc2VcIiBjbGFzcz1cImQtZmxleCBmbGV4LWFpLWNlbnRlciBja2VkaXRvci10b29sX19zb2x1dGlvbiBweS0xMCBweC0xNiBtdC0xNSBzYi1iZy1jb2xvci13aGl0ZVwiPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZnMtMC05MiBtYi0wIGNrZWRpdG9yLXRvb2xfX2xhYmVsIHBiLTRcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzYi1jb2xvci1wcmltYXJ5IGZzLTAtNzg1IG1yLTRcIj57e2NvbmZpZ1NlcnZpY2UubGFiZWxDb25maWc/LmxibD8uc29sdXRpb259fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzYi1jb2xvci1ncmF5LTIwMCBmeHNtYWxsIGZvbnQtd2VpZ2h0LW5vcm1hbFwiPnt7Y29uZmlnU2VydmljZS5sYWJlbENvbmZpZz8ubGJsPy5vcHRpb25hbH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ1aSBkcm9wZG93biBzYi1idG4gc2ItYnRuLW91dGxpbmUtcHJpbWFyeSBzYi1idG4tbm9ybWFsIHNiLXJpZ2h0LWljb24tYnRuIHNiLWJ0bi1yYWRpdXMgbWwtYXV0b1wiXG4gICAgICAgICAgICAgICAgICAgIHN1aURyb3Bkb3duIGF1dG9DbG9zZT1cIml0ZW1DbGlja1wiICpuZ0lmPVwic2hvd1NvbHV0aW9uRHJvcERvd25cIiBsaWJUZWxlbWV0cnlJbnRlcmFjdFxuICAgICAgICAgICAgICAgICAgICBbdGVsZW1ldHJ5SW50ZXJhY3RFZGF0YV09XCJ0ZWxlbWV0cnlTZXJ2aWNlLmdldFRlbGVtZXRyeUludGVyYWN0RWRhdGEoJ2Nob29zZV90eXBlJywnY2xpY2snLCdzaW5nbGVfc2VsZWN0JywgdGVsZW1ldHJ5U2VydmljZS50ZWxlbWV0cnlQYWdlSWQpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0IGdyYXktMjAwXCI+e3tjb25maWdTZXJ2aWNlLmxhYmVsQ29uZmlnPy5sYmw/LmNob29zZVR5cGV9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImRyb3Bkb3duIGljb24gbXgtOFwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1lbnVcIiBzdWlEcm9wZG93bk1lbnU+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIml0ZW1cIiAoY2xpY2spPVwic2VsZWN0U29sdXRpb25UeXBlKCdUZXh0K0ltYWdlJylcIiAoa2V5ZG93bi5lbnRlcik9XCJzZWxlY3RTb2x1dGlvblR5cGUoJ1RleHQrSW1hZ2UnKVwiIHRhYmluZGV4PVwiMFwiIGxpYlRlbGVtZXRyeUludGVyYWN0XG4gICAgICAgICAgICAgICAgICAgICAgICBbdGVsZW1ldHJ5SW50ZXJhY3RFZGF0YV09XCJ0ZWxlbWV0cnlTZXJ2aWNlLmdldFRlbGVtZXRyeUludGVyYWN0RWRhdGEoJ3NvbHV0aW9uX3R5cGUnLCdzZWxlY3QnLCdzaW5nbGVfc2VsZWN0JywgdGVsZW1ldHJ5U2VydmljZS50ZWxlbWV0cnlQYWdlSWQsIHtzb2x1dGlvbl90eXBlOidUZXh0K0ltYWdlJ30pXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7e2NvbmZpZ1NlcnZpY2UubGFiZWxDb25maWc/LmxibD8udGV4dEltYWdlfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaXRlbVwiIChjbGljayk9XCJzZWxlY3RTb2x1dGlvblR5cGUoJ3ZpZGVvJylcIiAoa2V5ZG93bi5lbnRlcik9XCJzZWxlY3RTb2x1dGlvblR5cGUoJ3ZpZGVvJylcIiB0YWJpbmRleD1cIjBcIiBsaWJUZWxlbWV0cnlJbnRlcmFjdFxuICAgICAgICAgICAgICAgICAgICAgICAgW3RlbGVtZXRyeUludGVyYWN0RWRhdGFdPVwidGVsZW1ldHJ5U2VydmljZS5nZXRUZWxlbWV0cnlJbnRlcmFjdEVkYXRhKCdzb2x1dGlvbl90eXBlJywnc2VsZWN0Jywnc2luZ2xlX3NlbGVjdCcsIHRlbGVtZXRyeVNlcnZpY2UudGVsZW1ldHJ5UGFnZUlkLCB7c29sdXRpb25fdHlwZTondmlkZW8nfSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7Y29uZmlnU2VydmljZS5sYWJlbENvbmZpZz8ubGJsPy52aWRlb319XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNvbHV0aW9uX2h0bWxcIiAqbmdJZj1cInNlbGVjdGVkU29sdXRpb25UeXBlID09ICdodG1sJ1wiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNrZWRpdG9yLXRvb2wtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYi1ja2VkaXRvciByZWxhdGl2ZSBtYi04XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwiZGVsZXRlU29sdXRpb24oKVwiIGNsYXNzPVwic2ItYnRuIHNiLWNrZWRpdG9yLWNsb3NlIGFic29sdXRlXCIgbGliVGVsZW1ldHJ5SW50ZXJhY3RcbiAgICAgICAgICAgICAgICAgICAgICAgIFt0ZWxlbWV0cnlJbnRlcmFjdEVkYXRhXT1cInRlbGVtZXRyeVNlcnZpY2UuZ2V0VGVsZW1ldHJ5SW50ZXJhY3RFZGF0YSgnZGVsZXRlX3NvbHV0aW9uJywnY2xpY2snLCdjYW5jZWwnLCB0ZWxlbWV0cnlTZXJ2aWNlLnRlbGVtZXRyeVBhZ2VJZCwge3NvbHV0aW9uX3R5cGU6J1RleHQrSW1hZ2UnfSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiaWNvbiBjbG9zZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICA8bGliLWNrZWRpdG9yLXRvb2wgKGVkaXRvckRhdGFPdXRwdXQpPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGVkaXRvckRhdGFIYW5kbGVyKCRldmVudCwgJ3NvbHV0aW9uJylcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiW2VkaXRvckRhdGFJbnB1dF09XCJlZGl0b3JTdGF0ZS5zb2x1dGlvbnNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJja2VkaXRvci10b29sX19vcHRpb25cIj48L2xpYi1ja2VkaXRvci10b29sPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzb2x1dGlvbl92aWRlb1wiICpuZ0lmPVwic2VsZWN0ZWRTb2x1dGlvblR5cGUgPT0gJ3ZpZGVvJyAmJiBzaG93U29sdXRpb25cIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJja2VkaXRvci10b29sX19zb2x1dGlvbiBzYi1iZy1jb2xvci13aGl0ZSBzYi1ja2VkaXRvciByZWxhdGl2ZVwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic29sdXRpb24tbWVkaWEgcC0xNiBkLWZsZXggZmxleC1haS1jZW50ZXIgY2tlZGl0b3ItdG9vbF9fb3B0aW9uIHAtMTZcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWNxLWNoZWNrYm94LWFuc3dlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNiLWJ0biBzYi1ja2VkaXRvci1jbG9zZSBhYnNvbHV0ZVwiIChjbGljayk9XCJkZWxldGVTb2x1dGlvbigpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbGliVGVsZW1ldHJ5SW50ZXJhY3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3RlbGVtZXRyeUludGVyYWN0RWRhdGFdPVwidGVsZW1ldHJ5U2VydmljZS5nZXRUZWxlbWV0cnlJbnRlcmFjdEVkYXRhKCdkZWxldGVfc29sdXRpb24nLCdjbGljaycsJ2NhbmNlbCcsIHRoaXMudGVsZW1ldHJ5U2VydmljZS50ZWxlbWV0cnlQYWdlSWQsIHtzb2x1dGlvbl90eXBlOid2aWRlbyd9KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImljb24gY2xvc2VcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic29sdXRpb24tbWVkaWFfX3ZpZGVvIHJlbGF0aXZlIHBvc2l0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwib3ZlcmxheS1pbWFnZVwiIFtuZ1N0eWxlXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvVGh1bWJuYWlsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHsgYmFja2dyb3VuZDogJ3VybCgnICsgdmlkZW9UaHVtYm5haWwgKyAnKScgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB7IGJhY2tncm91bmQ6ICdyZ2JhKDAsMCwwLDAuMyknIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwicGxheSBjaXJjbGUgaWNvblwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzb2x1dGlvbi1tZWRpYV9fZGVzYyBtbC0xNiBzYi1jb2xvci1wcmltYXJ5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyB2aWRlb1NvbHV0aW9uTmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPGkgY2xhc3M9XCJpY29uIGVsbGlwc2lzIHZlcnRpY2FsIHNiLWNvbG9yLWJsYWNrXCI+PC9pPiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjcmVhZE9ubHlTb2x1dGlvbnNDb250YWluZXI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiICpuZ0lmPVwiZWRpdG9yU3RhdGUuc29sdXRpb25zXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidHdlbHZlIHdpZGUgY29sdW1uIHAtMFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJja2VkaXRvci10b29sIHdpZHRoLTEwMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2tlZGl0b3ItdG9vbF9fcXVlc3Rpb24tcmVhZG9ubHkgbWItMjRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInB4LTE2IHB5LTggZnMtMC05MiBtYi0wIGNrZWRpdG9yLXRvb2xfX2xhYmVsIHdpZHRoLTEwMFwiPlNvbHV0aW9uPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJja2VkaXRvci10b29sX19zb2x1dGlvbl9fYm9keVwiICpuZ0lmPVwic2VsZWN0ZWRTb2x1dGlvblR5cGUgPT0gJ2h0bWwnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJmcy0wLTc4NSBwLTE2XCIgW2lubmVySFRNTF09XCJlZGl0b3JTdGF0ZS5zb2x1dGlvbnMgfCBzYW5pdGl6ZUh0bWxcIj48L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJja2VkaXRvci10b29sX19zb2x1dGlvbl9fYm9keVwiICpuZ0lmPVwic2VsZWN0ZWRTb2x1dGlvblR5cGUgPT0gJ3ZpZGVvJyAmJiBzaG93U29sdXRpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic29sdXRpb24tbWVkaWEgcC0xNiBkLWZsZXggZmxleC1haS1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNvbHV0aW9uLW1lZGlhX192aWRlbyByZWxhdGl2ZSBwb3NpdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwib3ZlcmxheS1pbWFnZVwiIFtuZ1N0eWxlXT1cInZpZGVvVGh1bWJuYWlsID8gIHsnYmFja2dyb3VuZCcgOiAndXJsKCcgKyB2aWRlb1RodW1ibmFpbCArICcpJyB9ICA6IHsnYmFja2dyb3VuZCc6ICdyZ2JhKDAsMCwwLDAuMyknfVwiPjxpIGNsYXNzPVwicGxheSBjaXJjbGUgaWNvblwiPjwvaT48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzb2x1dGlvbi1tZWRpYV9fZGVzYyBtbC0xNlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e3ZpZGVvU29sdXRpb25OYW1lfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8IS0tIDxsaWItdHJhbnNsYXRpb25zICpuZ0lmPVwic2hvd1RyYW5zbGF0aW9uXCI+PC9saWItdHJhbnNsYXRpb25zPiAtLT5cbiAgICAgICAgICA8IS0tIGNoaWxkIHF1ZXN0aW9uIHNlY3Rpb24gLS0+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImItMS0xMDAgYnItNCBteS0xNSBweC0zMiBweS0xMCBzYi1iZy1jb2xvci1wcmltYXJ5LTBcIlxuICAgICAgICAgICAgKm5nRm9yPVwibGV0IHF1ZXN0aW9uIG9mIGRlcGVuZGVudFF1ZXN0aW9ucztsZXQgY2hpbGRpbmRleD1pbmRleFwiPlxuICAgICAgICAgICAge3sgcXVlc3Rpb25TZXRIaWVyYXJjaHkuY2hpbGRyZW4gPyAnUScrIChxdWVzdGlvblNldEhpZXJhcmNoeS5jaGlsZHJlbi5sZW5ndGgrMSk6Jyd9fSB7eycuICcrXG4gICAgICAgICAgICAoY2hpbGRpbmRleCsxKX19XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIGNsYXNzPVwic2ItYnRuIHNiLWJ0bi1vdXRsaW5lLXByaW1hcnkgc2ItYnRuLXhzIHNiLWxlZnQtaWNvbi1idG4gdGV4dC1pbmhlcml0IGItMCBiZy1ub25lIG5vLWhvdmVyIHBsLTBcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzYi1saW5lLWhlaWdodC0yNFwiPmVkaXQgcXVlc3Rpb248L3NwYW4+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8aHI+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cInF1ZXN0aW9uRm9ybUNvbmZpZ1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBsLTUgcHktMTAgZm9udC13ZWlnaHQtYm9sZCBmcy0wLTkyXCI+XG4gICAgICAgICAgICAgIHt7Y29uZmlnU2VydmljZS5sYWJlbENvbmZpZz8ubGJsPy5RdWVzdGlvbmRldGFpbHN9fVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jb250YWluZXIgcHgtMzBcIj5cbiAgICAgICAgICAgICAgPHNiLWR5bmFtaWMtZm9ybSBbY29uZmlnXT1cInF1ZXN0aW9uRm9ybUNvbmZpZ1wiIChpbml0aWFsaXplKT1cIm91dHB1dCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAoc3RhdHVzQ2hhbmdlcyk9XCJvblN0YXR1c0NoYW5nZXMoJGV2ZW50KVwiICh2YWx1ZUNoYW5nZXMpPVwidmFsdWVDaGFuZ2VzKCRldmVudClcIj48L3NiLWR5bmFtaWMtZm9ybT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuXG48c3VpLW1vZGFsICpuZ0lmPVwic2hvd0NvbmZpcm1Qb3B1cFwiIFttdXN0U2Nyb2xsXT1cInRydWVcIiBbaXNDbG9zYWJsZV09XCJ0cnVlXCIgW3RyYW5zaXRpb25EdXJhdGlvbl09XCIwXCIgW3NpemVdPVwiJ3NtYWxsJ1wiXG4gIGNsYXNzPVwic2ItbW9kYWwgYngtbm9uZSBvdmVyZmxvdy1tb2RhbFwiIGFwcEJvZHlTY3JvbGwgKGRpc21pc3NlZCk9XCJzaG93Q29uZmlybVBvcHVwID0gIXNob3dDb25maXJtUG9wdXBcIiAjbW9kYWw+XG4gIDxkaXYgY2xhc3M9XCJzYi1tb2RhbC1oZWFkZXJcIj48L2Rpdj5cbiAgPGRpdiBjbGFzcz1cInNiLW1vZGFsLWNvbnRlbnRcIj5cbiAgICB7e2NvbmZpZ1NlcnZpY2UubGFiZWxDb25maWc/LmxibD8uY29uZmlybVF1ZXN0aW9uTm90U2F2ZWR9fVxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cInNiLW1vZGFsLWFjdGlvbnNcIj5cbiAgICA8YnV0dG9uIGNsYXNzPVwic2ItYnRuIHNiLWJ0bi1ub3JtYWwgc2ItYnRuLXByaW1hcnlcIiAoY2xpY2spPVwicmVkaXJlY3RUb1F1ZXN0aW9uc2V0KClcIj5cbiAgICAgIHt7Y29uZmlnU2VydmljZS5sYWJlbENvbmZpZz8uYnV0dG9uX2xhYmVscz8ueWVzX2J0bl9sYWJlbH19XG4gICAgPC9idXR0b24+XG4gICAgPGJ1dHRvbiBjbGFzcz1cInNiLWJ0biBzYi1idG4tbm9ybWFsIHNiLWJ0bi1vdXRsaW5lLXByaW1hcnlcIiAoY2xpY2spPVwic2hvd0NvbmZpcm1Qb3B1cCA9ICFzaG93Q29uZmlybVBvcHVwXCI+XG4gICAgICB7e2NvbmZpZ1NlcnZpY2UubGFiZWxDb25maWc/LmJ1dHRvbl9sYWJlbHM/Lm5vX2J0bl9sYWJlbH19XG4gICAgPC9idXR0b24+XG4gIDwvZGl2PlxuPC9zdWktbW9kYWw+XG5cbjxsaWItdGVybS1hbmQtY29uZGl0aW9uXG4gICAgICAgIFtzaG93RWRpdGluZ0NvbnNlbnRdPVwiZWRpdG9yU2VydmljZS5pc1Jldmlld2VyRWRpdEVuYWJsZVwiXG4gICAgICAgIFtzaG93U3VibWl0Q29uZmlybVBvcHVwXT1cInNob3dTdWJtaXRDb25maXJtUG9wdXBcIiAoc2VuZEZvclJldmlld091dHB1dCk9XCJvbkNvbnNlbnRTdWJtaXQoJGV2ZW50KVwiPlxuPC9saWItdGVybS1hbmQtY29uZGl0aW9uPlxuXG48c3VpLW1vZGFsICpuZ0lmPVwic2hvd1Jldmlld01vZGFsXCIgW211c3RTY3JvbGxdPVwidHJ1ZVwiIFtpc0Nsb3NhYmxlXT1cImZhbHNlXCIgW3RyYW5zaXRpb25EdXJhdGlvbl09XCIwXCJcbiAgW3NpemVdPVwiJ25vcm1hbCdcIiBjbGFzcz1cInNiLW1vZGFsIGJ4LW5vbmUgb3ZlcmZsb3ctbW9kYWxcIiBhcHBCb2R5U2Nyb2xsICNtb2RhbCAoZGlzbWlzc2VkKT1cInNob3dSZXZpZXdNb2RhbCA9IGZhbHNlO1wiPlxuICA8ZGl2IGNsYXNzPVwic2ItbW9kYWwtaGVhZGVyXCI+XG4gICAge3tjb25maWdTZXJ2aWNlLmxhYmVsQ29uZmlnPy5sYmw/LnJldmlld0NvbW1lbnRzfX1cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJzYi1tb2RhbC1jb250ZW50XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwic2ItZmllbGRcIj5cbiAgICAgICAgICA8bGFiZWw+e3tjb25maWdTZXJ2aWNlLmxhYmVsQ29uZmlnPy5sYmw/LmNvbW1lbnRzfX08L2xhYmVsPlxuICAgICAgICAgICAgPHRleHRhcmVhIGRpc2FibGVkPVwiZGlzYWJsZWRcIiB0eXBlPVwidGV4dFwiIGNsYXNzPVwid21kLWlucHV0IHdpZHRoLTEwMCBzYi1mb3JtLWNvbnRyb2wgcC0xMCBzYi1kaXNhYmxlZC10ZXh0YXJlYVwiIGlkPVwid21kLWlucHV0XCIgWyhuZ01vZGVsKV09XCJjb250ZW50Q29tbWVudFwiIG5hbWU9XCJyZWplY3RlZENvbW1lbnRcIj48L3RleHRhcmVhPlxuICAgICAgPC9kaXY+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwic2ItbW9kYWwtYWN0aW9uc1wiPlxuICAgIDxidXR0b24gY2xhc3M9XCJzYi1idG4gc2ItYnRuLW5vcm1hbCBzYi1idG4tb3V0bGluZS1wcmltYXJ5XCIgKGNsaWNrKT1cIm1vZGFsLmRlbnkoJ2RlbmllZCcpXCJcbiAgICBsaWJUZWxlbWV0cnlJbnRlcmFjdCBbdGVsZW1ldHJ5SW50ZXJhY3RFZGF0YV09XCJ0ZWxlbWV0cnlTZXJ2aWNlLmdldFRlbGVtZXRyeUludGVyYWN0RWRhdGEoJ2Nsb3NlJywnY2xpY2snLCdjYW5jZWwnLCB0ZWxlbWV0cnlTZXJ2aWNlLnRlbGVtZXRyeVBhZ2VJZCwgIHtrZXk6ICdkaWFsb2dfaWQnLCB2YWx1ZTogJ3Jldmlld19jb21tZW50cyd9KVwiPnt7Y29uZmlnU2VydmljZS5sYWJlbENvbmZpZz8uYnV0dG9uX2xhYmVscz8uY2xvc2VfYnRuX2xhYmVsfX08L2J1dHRvbj5cbiAgPC9kaXY+XG48L3N1aS1tb2RhbD5cblxuPGxpYi1xdWFsaXR5LXBhcmFtcy1tb2RhbFxuICBbbGFiZWxDb25maWdEYXRhXT1cInRvb2xiYXJDb25maWdcIlxuICBbc2hvd1F1YWxpdHlQYXJhbWV0ZXJQb3B1cF09XCJzaG93UXVhbGl0eVBhcmFtZXRlclBvcHVwXCJcbiAgW3F1YWxpdHlGb3JtQ29uZmlnXT1cInF1YWxpdHlGb3JtQ29uZmlnXCJcbiAgKHF1YWxpdHlQYXJhbUNoYW5nZWQpPVwib25RdWFsaXR5Rm9ybVN1Ym1pdCgkZXZlbnQpXCI+XG48L2xpYi1xdWFsaXR5LXBhcmFtcy1tb2RhbD5cbiJdfQ==