@fundamental-ngx/platform 0.48.0-rc.21 → 0.48.0-rc.23

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 (147) hide show
  1. package/esm2022/form/combobox/combobox-mobile/combobox/combobox-mobile.component.mjs +6 -8
  2. package/esm2022/form/combobox/commons/base-combobox.mjs +6 -5
  3. package/esm2022/form/form-generator/form-generator/form-generator.component.mjs +8 -8
  4. package/esm2022/form/form-generator/form-generator.service.mjs +8 -13
  5. package/esm2022/form/form-group/form-field/form-field.component.mjs +27 -29
  6. package/esm2022/form/form-group/form-group.component.mjs +37 -40
  7. package/esm2022/form/multi-combobox/commons/base-multi-combobox.mjs +9 -8
  8. package/esm2022/form/multi-combobox/multi-combobox/multi-combobox.component.mjs +3 -3
  9. package/esm2022/form/multi-combobox/multi-combobox-mobile/multi-combobox/multi-combobox-mobile.component.mjs +10 -13
  10. package/esm2022/form/multi-combobox/multi-combobox.interface.mjs +1 -1
  11. package/esm2022/form/multi-input/base-multi-input.mjs +5 -4
  12. package/esm2022/form/multi-input/multi-input-mobile/multi-input-mobile.component.mjs +4 -7
  13. package/esm2022/form/radio-group/radio-group.component.mjs +23 -24
  14. package/esm2022/form/select/commons/base-select.mjs +3 -3
  15. package/esm2022/form/step-input/base.step-input.mjs +25 -35
  16. package/esm2022/form/step-input/number/number-step-input.component.mjs +3 -3
  17. package/esm2022/form/step-input/step-input-action-button.mjs +6 -10
  18. package/esm2022/icon-tab-bar/components/icon-tab-bar-base.class.mjs +6 -8
  19. package/esm2022/icon-tab-bar/directives/dnd/icon-bar-dnd-container.directive.mjs +10 -19
  20. package/esm2022/icon-tab-bar/directives/dnd/icon-bar-dnd-item.directive.mjs +7 -9
  21. package/esm2022/icon-tab-bar/directives/dnd/icon-bar-dnd-list.directive.mjs +7 -8
  22. package/esm2022/icon-tab-bar/icon-tab-bar.component.mjs +9 -20
  23. package/esm2022/list/list.component.mjs +7 -8
  24. package/esm2022/menu/menu.component.mjs +3 -4
  25. package/esm2022/message-popover/components/message-popover-form-wrapper/message-popover-form-wrapper.component.mjs +8 -11
  26. package/esm2022/message-popover/message-popover.component.mjs +52 -53
  27. package/esm2022/message-popover/models/message-popover-wrapper.interface.mjs +1 -1
  28. package/esm2022/search-field/search-field-mobile/search-field/search-field-mobile.component.mjs +3 -7
  29. package/esm2022/search-field/search-field.component.mjs +20 -21
  30. package/esm2022/settings-generator/settings-generator.service.mjs +9 -10
  31. package/esm2022/shared/form/base.input.mjs +7 -8
  32. package/esm2022/smart-filter-bar/components/smart-filter-bar-settings-dialog/smart-filter-bar-settings-dialog.component.mjs +10 -15
  33. package/esm2022/split-menu-button/split-menu-button.component.mjs +7 -18
  34. package/esm2022/table/components/reset-button/reset-button.component.mjs +5 -6
  35. package/esm2022/table/components/table-cell-header-popover/table-cell-header-popover.component.mjs +6 -7
  36. package/esm2022/table/components/table-column-resizer/table-column-resizer.component.mjs +6 -8
  37. package/esm2022/table/components/table-group-row/table-group-row.component.mjs +3 -7
  38. package/esm2022/table/components/table-header-cell-content/table-header-cell-content.component.mjs +29 -13
  39. package/esm2022/table/components/table-header-row/table-header-row.component.mjs +7 -11
  40. package/esm2022/table/components/table-p13-dialog/columns/columns.component.mjs +5 -7
  41. package/esm2022/table/components/table-p13-dialog/filtering/filtering.component.mjs +5 -8
  42. package/esm2022/table/components/table-p13-dialog/grouping/grouping.component.mjs +5 -8
  43. package/esm2022/table/components/table-p13-dialog/sorting/sorting.component.mjs +5 -8
  44. package/esm2022/table/components/table-popping-row/table-popping-row.component.mjs +4 -5
  45. package/esm2022/table/components/table-row/table-row.component.mjs +6 -13
  46. package/esm2022/table/components/table-toolbar/table-toolbar.component.mjs +34 -21
  47. package/esm2022/table/components/table-view-settings-dialog/filtering/filters.component.mjs +5 -8
  48. package/esm2022/table/components/table-view-settings-dialog/grouping/grouping.component.mjs +6 -9
  49. package/esm2022/table/components/table-view-settings-dialog/sorting/sorting.component.mjs +6 -9
  50. package/esm2022/table/table.component.mjs +39 -49
  51. package/esm2022/table-helpers/directives/table-cell-header-popover.directive.mjs +1 -1
  52. package/esm2022/table-helpers/directives/table-cell-resizable.directive.mjs +8 -10
  53. package/esm2022/table-helpers/directives/table-data-source.directive.mjs +6 -6
  54. package/esm2022/table-helpers/services/table-column-resize.service.mjs +14 -17
  55. package/esm2022/table-helpers/services/table-responsive.service.mjs +6 -11
  56. package/esm2022/table-helpers/services/table.service.mjs +20 -18
  57. package/esm2022/value-help-dialog/value-help-dialog/value-help-dialog.component.mjs +10 -18
  58. package/esm2022/wizard-generator/base-wizard-generator.mjs +12 -19
  59. package/esm2022/wizard-generator/components/dialog-wizard-generator/dialog-wizard-generator.component.mjs +5 -4
  60. package/esm2022/wizard-generator/components/wizard-body/wizard-body.component.mjs +7 -13
  61. package/esm2022/wizard-generator/components/wizard-generator-step/wizard-generator-step.component.mjs +8 -7
  62. package/fesm2022/fundamental-ngx-platform-form.mjs +137 -174
  63. package/fesm2022/fundamental-ngx-platform-form.mjs.map +1 -1
  64. package/fesm2022/fundamental-ngx-platform-icon-tab-bar.mjs +24 -46
  65. package/fesm2022/fundamental-ngx-platform-icon-tab-bar.mjs.map +1 -1
  66. package/fesm2022/fundamental-ngx-platform-list.mjs +6 -7
  67. package/fesm2022/fundamental-ngx-platform-list.mjs.map +1 -1
  68. package/fesm2022/fundamental-ngx-platform-menu.mjs +3 -3
  69. package/fesm2022/fundamental-ngx-platform-menu.mjs.map +1 -1
  70. package/fesm2022/fundamental-ngx-platform-message-popover.mjs +57 -60
  71. package/fesm2022/fundamental-ngx-platform-message-popover.mjs.map +1 -1
  72. package/fesm2022/fundamental-ngx-platform-search-field.mjs +21 -38
  73. package/fesm2022/fundamental-ngx-platform-search-field.mjs.map +1 -1
  74. package/fesm2022/fundamental-ngx-platform-settings-generator.mjs +6 -8
  75. package/fesm2022/fundamental-ngx-platform-settings-generator.mjs.map +1 -1
  76. package/fesm2022/fundamental-ngx-platform-shared.mjs +6 -7
  77. package/fesm2022/fundamental-ngx-platform-shared.mjs.map +1 -1
  78. package/fesm2022/fundamental-ngx-platform-smart-filter-bar.mjs +9 -15
  79. package/fesm2022/fundamental-ngx-platform-smart-filter-bar.mjs.map +1 -1
  80. package/fesm2022/fundamental-ngx-platform-split-menu-button.mjs +6 -17
  81. package/fesm2022/fundamental-ngx-platform-split-menu-button.mjs.map +1 -1
  82. package/fesm2022/fundamental-ngx-platform-table-helpers.mjs +42 -52
  83. package/fesm2022/fundamental-ngx-platform-table-helpers.mjs.map +1 -1
  84. package/fesm2022/fundamental-ngx-platform-table.mjs +145 -157
  85. package/fesm2022/fundamental-ngx-platform-table.mjs.map +1 -1
  86. package/fesm2022/fundamental-ngx-platform-value-help-dialog.mjs +9 -17
  87. package/fesm2022/fundamental-ngx-platform-value-help-dialog.mjs.map +1 -1
  88. package/fesm2022/fundamental-ngx-platform-wizard-generator.mjs +20 -33
  89. package/fesm2022/fundamental-ngx-platform-wizard-generator.mjs.map +1 -1
  90. package/form/combobox/combobox-mobile/combobox/combobox-mobile.component.d.ts +2 -4
  91. package/form/form-generator/form-generator/form-generator.component.d.ts +1 -1
  92. package/form/form-generator/form-generator.service.d.ts +3 -7
  93. package/form/form-group/form-field/form-field.component.d.ts +12 -12
  94. package/form/form-group/form-group.component.d.ts +35 -31
  95. package/form/multi-combobox/commons/base-multi-combobox.d.ts +2 -2
  96. package/form/multi-combobox/multi-combobox-mobile/multi-combobox/multi-combobox-mobile.component.d.ts +3 -5
  97. package/form/multi-combobox/multi-combobox.interface.d.ts +3 -3
  98. package/form/multi-input/multi-input-mobile/multi-input-mobile.component.d.ts +2 -4
  99. package/form/radio-group/radio-group.component.d.ts +3 -3
  100. package/form/step-input/base.step-input.d.ts +5 -6
  101. package/form/step-input/step-input-action-button.d.ts +4 -7
  102. package/fundamental-ngx-platform-v0.48.0-rc.23.tgz +0 -0
  103. package/icon-tab-bar/components/icon-tab-bar-base.class.d.ts +1 -1
  104. package/icon-tab-bar/directives/dnd/icon-bar-dnd-container.directive.d.ts +5 -8
  105. package/icon-tab-bar/directives/dnd/icon-bar-dnd-item.directive.d.ts +1 -1
  106. package/icon-tab-bar/directives/dnd/icon-bar-dnd-list.directive.d.ts +1 -1
  107. package/icon-tab-bar/icon-tab-bar.component.d.ts +4 -6
  108. package/list/list.component.d.ts +1 -3
  109. package/message-popover/components/message-popover-form-wrapper/message-popover-form-wrapper.component.d.ts +2 -4
  110. package/message-popover/message-popover.component.d.ts +13 -20
  111. package/message-popover/models/message-popover-wrapper.interface.d.ts +2 -2
  112. package/package.json +4 -4
  113. package/search-field/search-field-mobile/search-field/search-field-mobile.component.d.ts +4 -6
  114. package/search-field/search-field.component.d.ts +6 -4
  115. package/settings-generator/settings-generator.service.d.ts +1 -1
  116. package/shared/form/base.input.d.ts +2 -2
  117. package/smart-filter-bar/components/smart-filter-bar-settings-dialog/smart-filter-bar-settings-dialog.component.d.ts +4 -8
  118. package/split-menu-button/split-menu-button.component.d.ts +3 -8
  119. package/table/components/reset-button/reset-button.component.d.ts +2 -3
  120. package/table/components/table-cell-header-popover/table-cell-header-popover.component.d.ts +1 -2
  121. package/table/components/table-column-resizer/table-column-resizer.component.d.ts +1 -1
  122. package/table/components/table-group-row/table-group-row.component.d.ts +2 -5
  123. package/table/components/table-header-cell-content/table-header-cell-content.component.d.ts +11 -6
  124. package/table/components/table-header-row/table-header-row.component.d.ts +1 -1
  125. package/table/components/table-p13-dialog/columns/columns.component.d.ts +2 -4
  126. package/table/components/table-p13-dialog/filtering/filtering.component.d.ts +1 -4
  127. package/table/components/table-p13-dialog/grouping/grouping.component.d.ts +1 -4
  128. package/table/components/table-p13-dialog/sorting/sorting.component.d.ts +1 -4
  129. package/table/components/table-row/table-row.component.d.ts +2 -2
  130. package/table/components/table-toolbar/table-toolbar.component.d.ts +20 -7
  131. package/table/components/table-view-settings-dialog/filtering/filters.component.d.ts +1 -4
  132. package/table/components/table-view-settings-dialog/grouping/grouping.component.d.ts +1 -4
  133. package/table/components/table-view-settings-dialog/sorting/sorting.component.d.ts +1 -4
  134. package/table/table.component.d.ts +4 -18
  135. package/table-helpers/directives/table-cell-header-popover.directive.d.ts +2 -3
  136. package/table-helpers/directives/table-cell-resizable.directive.d.ts +1 -1
  137. package/table-helpers/directives/table-data-source.directive.d.ts +1 -1
  138. package/table-helpers/services/table-column-resize.service.d.ts +2 -2
  139. package/table-helpers/services/table-responsive.service.d.ts +3 -5
  140. package/table-helpers/services/table.service.d.ts +12 -10
  141. package/value-help-dialog/value-help-dialog/value-help-dialog.component.d.ts +2 -1
  142. package/wizard-generator/base-wizard-generator.d.ts +4 -8
  143. package/wizard-generator/components/wizard-body/wizard-body.component.d.ts +3 -7
  144. package/wizard-generator/components/wizard-generator-step/wizard-generator-step.component.d.ts +1 -1
  145. package/esm2022/search-field/search-field-mobile/search-field-mobile.module.mjs +0 -16
  146. package/fundamental-ngx-platform-v0.48.0-rc.21.tgz +0 -0
  147. package/search-field/search-field-mobile/search-field-mobile.module.d.ts +0 -7
@@ -1,10 +1,12 @@
1
- import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, Inject, Input, Output, QueryList, TemplateRef, ViewChild, ViewChildren, ViewEncapsulation } from '@angular/core';
1
+ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, DestroyRef, EventEmitter, Inject, Input, Output, QueryList, TemplateRef, ViewChild, ViewChildren, ViewEncapsulation, inject } from '@angular/core';
2
2
  import { FormGroupDirective, FormsModule, NgForm, ReactiveFormsModule } from '@angular/forms';
3
+ import { destroyObservable } from '@fundamental-ngx/cdk/utils';
3
4
  import { FDP_DO_CHECK } from '@fundamental-ngx/platform/shared';
4
5
  import { BehaviorSubject, Subject, isObservable, merge, of } from 'rxjs';
5
6
  import { debounceTime, filter, startWith, switchMap, take, takeUntil } from 'rxjs/operators';
6
7
  import { FormGeneratorFieldComponent } from '../form-generator-field/form-generator-field.component';
7
8
  import { NgTemplateOutlet } from '@angular/common';
9
+ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
8
10
  import { BusyIndicatorModule } from '@fundamental-ngx/core/busy-indicator';
9
11
  import { SkeletonComponent } from '@fundamental-ngx/core/skeleton';
10
12
  import { DefaultGapLayout, DefaultVerticalFieldLayout, DefaultVerticalLabelLayout } from '../../form-group/constants';
@@ -135,7 +137,7 @@ export class FormGeneratorComponent {
135
137
  * @hidden
136
138
  * An RxJS Subject that will kill the data stream upon component’s destruction (for unsubscribing)
137
139
  */
138
- this._onDestroy$ = new Subject();
140
+ this._destroyRef = inject(DestroyRef);
139
141
  /** @hidden */
140
142
  this._mappedFormitems = new Map();
141
143
  this._defaultHintOptions = {
@@ -165,8 +167,6 @@ export class FormGeneratorComponent {
165
167
  * @hidden
166
168
  */
167
169
  ngOnDestroy() {
168
- this._onDestroy$.next();
169
- this._onDestroy$.complete();
170
170
  this._ngSubmitSubscription?.unsubscribe();
171
171
  }
172
172
  /**
@@ -254,7 +254,7 @@ export class FormGeneratorComponent {
254
254
  this.formControlItems = this._getOrderedControls(form.controls);
255
255
  this.shouldShowFields = await this._fgService.checkVisibleFormItems(this.form);
256
256
  this._formValueSubscription = this.form.valueChanges
257
- .pipe(debounceTime(50), takeUntil(this._onDestroy$))
257
+ .pipe(debounceTime(50), takeUntilDestroyed(this._destroyRef))
258
258
  .subscribe(async () => {
259
259
  this.shouldShowFields = await this._fgService.checkVisibleFormItems(this.form);
260
260
  this._cd.markForCheck();
@@ -290,7 +290,7 @@ export class FormGeneratorComponent {
290
290
  _listenToSubmit() {
291
291
  this._ngSubmitSubscription?.unsubscribe();
292
292
  this._ngSubmitSubscription = this.formGroup.ngSubmit
293
- .pipe(switchMap(() => this.formGroup.statusChanges.pipe(startWith(this.formGroup.status), filter((status) => status !== 'PENDING'), take(1), takeUntil(this._onDestroy$))))
293
+ .pipe(switchMap(() => this.formGroup.statusChanges.pipe(startWith(this.formGroup.status), filter((status) => status !== 'PENDING'), take(1), takeUntilDestroyed(this._destroyRef))))
294
294
  .subscribe(async () => {
295
295
  await this._onSubmit();
296
296
  this._listenToSubmit();
@@ -301,7 +301,7 @@ export class FormGeneratorComponent {
301
301
  this._refresh$.next();
302
302
  this._refresh$.complete();
303
303
  this._refresh$ = new Subject();
304
- items.pipe(takeUntil(merge(this._refresh$, this._onDestroy$))).subscribe((formItems) => {
304
+ items.pipe(takeUntil(merge(this._refresh$, destroyObservable(this._destroyRef)))).subscribe((formItems) => {
305
305
  this._mappedFormitems = mapFormItems(formItems);
306
306
  this._generateForm();
307
307
  });
@@ -414,4 +414,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.4", ngImpor
414
414
  type: ViewChildren,
415
415
  args: [FormGeneratorFieldComponent]
416
416
  }] } });
417
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1nZW5lcmF0b3IuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9wbGF0Zm9ybS9mb3JtL2Zvcm0tZ2VuZXJhdG9yL2Zvcm0tZ2VuZXJhdG9yL2Zvcm0tZ2VuZXJhdG9yLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvcGxhdGZvcm0vZm9ybS9mb3JtLWdlbmVyYXRvci9mb3JtLWdlbmVyYXRvci9mb3JtLWdlbmVyYXRvci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0gsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBR0wsTUFBTSxFQUNOLFNBQVMsRUFFVCxXQUFXLEVBQ1gsU0FBUyxFQUNULFlBQVksRUFDWixpQkFBaUIsRUFDcEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFxQixrQkFBa0IsRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFakgsT0FBTyxFQUVILFlBQVksRUFLZixNQUFNLGtDQUFrQyxDQUFDO0FBQzFDLE9BQU8sRUFBRSxlQUFlLEVBQWMsT0FBTyxFQUFnQixZQUFZLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNuRyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3RixPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSx3REFBd0QsQ0FBQztBQUVyRyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUMzRSxP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RFosS0FBSztnQkFLTixrQkFBa0I7c0JBRGpCLEtBQUs7Z0JBU04sbUJBQW1CO3NCQURsQixLQUFLO2dCQVFOLFdBQVc7c0JBRFYsTUFBTTtnQkFRUCxhQUFhO3NCQURaLE1BQU07Z0JBT1AsbUJBQW1CO3NCQURsQixNQUFNO2dCQU9QLE1BQU07c0JBREwsU0FBUzt1QkFBQyxNQUFNO2dCQUtqQixTQUFTO3NCQURSLFNBQVM7dUJBQUMsa0JBQWtCO2dCQUs3QixNQUFNO3NCQURMLFlBQVk7dUJBQUMsMkJBQTJCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBDb21wb25lbnQsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIEluamVjdCxcbiAgICBJbnB1dCxcbiAgICBPbkNoYW5nZXMsXG4gICAgT25EZXN0cm95LFxuICAgIE91dHB1dCxcbiAgICBRdWVyeUxpc3QsXG4gICAgU2ltcGxlQ2hhbmdlcyxcbiAgICBUZW1wbGF0ZVJlZixcbiAgICBWaWV3Q2hpbGQsXG4gICAgVmlld0NoaWxkcmVuLFxuICAgIFZpZXdFbmNhcHN1bGF0aW9uXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUNvbnRyb2xTdGF0dXMsIEZvcm1Hcm91cERpcmVjdGl2ZSwgRm9ybXNNb2R1bGUsIE5nRm9ybSwgUmVhY3RpdmVGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE51bGxhYmxlIH0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9jZGsvdXRpbHMnO1xuaW1wb3J0IHtcbiAgICBDb2x1bW5MYXlvdXQsXG4gICAgRkRQX0RPX0NIRUNLLFxuICAgIEZpZWxkSGludE9wdGlvbnMsXG4gICAgSGludElucHV0LFxuICAgIEhpbnRPcHRpb25zLFxuICAgIFBsYXRmb3JtRm9ybUZpZWxkQ29udHJvbFxufSBmcm9tICdAZnVuZGFtZW50YWwtbmd4L3BsYXRmb3JtL3NoYXJlZCc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIFN1YmplY3QsIFN1YnNjcmlwdGlvbiwgaXNPYnNlcnZhYmxlLCBtZXJnZSwgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgZmlsdGVyLCBzdGFydFdpdGgsIHN3aXRjaE1hcCwgdGFrZSwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgRm9ybUdlbmVyYXRvckZpZWxkQ29tcG9uZW50IH0gZnJvbSAnLi4vZm9ybS1nZW5lcmF0b3ItZmllbGQvZm9ybS1nZW5lcmF0b3ItZmllbGQuY29tcG9uZW50JztcblxuaW1wb3J0IHsgTmdUZW1wbGF0ZU91dGxldCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBCdXN5SW5kaWNhdG9yTW9kdWxlIH0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9jb3JlL2J1c3ktaW5kaWNhdG9yJztcbmltcG9ydCB7IFNrZWxldG9uQ29tcG9uZW50IH0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9jb3JlL3NrZWxldG9uJztcbmltcG9ydCB7IERlZmF1bHRHYXBMYXlvdXQsIERlZmF1bHRWZXJ0aWNhbEZpZWxkTGF5b3V0LCBEZWZhdWx0VmVydGljYWxMYWJlbExheW91dCB9IGZyb20gJy4uLy4uL2Zvcm0tZ3JvdXAvY29uc3RhbnRzJztcbmltcG9ydCB7IEZkcEZvcm1Hcm91cE1vZHVsZSB9IGZyb20gJy4uLy4uL2Zvcm0tZ3JvdXAvZmRwLWZvcm0ubW9kdWxlJztcbmltcG9ydCB7IGRlZmF1bHRGb3JtR2VuZXJhdG9ySGludE9wdGlvbnMgfSBmcm9tICcuLi9jb25maWcvZGVmYXVsdC1mb3JtLWdlbmVyYXRvci1oaW50LW9wdGlvbnMnO1xuaW1wb3J0IHtcbiAgICBEeW5hbWljRm9ybUNvbnRyb2wsXG4gICAgRHluYW1pY0Zvcm1Db250cm9sR3JvdXAsXG4gICAgRHluYW1pY0Zvcm1Hcm91cENvbnRyb2wsXG4gICAgRHluYW1pY0Zvcm1Hcm91cENvbnRyb2xzXG59IGZyb20gJy4uL2R5bmFtaWMtZm9ybS1jb250cm9sJztcbmltcG9ydCB7IER5bmFtaWNGb3JtQ29udHJvbEZpZWxkRGlyZWN0aXZlIH0gZnJvbSAnLi4vZHluYW1pYy1mb3JtLWNvbnRyb2wtZmllbGQuZGlyZWN0aXZlJztcbmltcG9ydCB7IEZvcm1HZW5lcmF0b3JTZXJ2aWNlIH0gZnJvbSAnLi4vZm9ybS1nZW5lcmF0b3Iuc2VydmljZSc7XG5pbXBvcnQgeyBGRFBfRk9STV9HRU5FUkFUT1JfREVGQVVMVF9ISU5UX09QVElPTlMgfSBmcm9tICcuLi9mb3JtLWdlbmVyYXRvci50b2tlbnMnO1xuaW1wb3J0IHsgZ2V0UGFyZW50SXRlbSwgaXNGb3JtRmllbGRJdGVtLCBtYXBGb3JtSXRlbXMsIHRyYW5zZm9ybUZvcm1JdGVtIH0gZnJvbSAnLi4vaGVscGVycyc7XG5pbXBvcnQgeyBEeW5hbWljRm9ybUdyb3VwIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9keW5hbWljLWZvcm0tZ3JvdXAnO1xuaW1wb3J0IHtcbiAgICBEeW5hbWljRm9ybUl0ZW0sXG4gICAgRHluYW1pY0Zvcm1JdGVtTWFwLFxuICAgIER5bmFtaWNGb3JtSXRlbVZhbGlkYXRpb25PYmplY3QsXG4gICAgRHluYW1pY0Zvcm1WYWx1ZVxufSBmcm9tICcuLi9pbnRlcmZhY2VzL2R5bmFtaWMtZm9ybS1pdGVtJztcbmltcG9ydCB7IEdldEhpbnRPcHRpb25zUGlwZSB9IGZyb20gJy4uL3BpcGVzL2dldC1oaW50LW9wdGlvbnMucGlwZSc7XG5pbXBvcnQgeyBHZXRPcmRlcmVkRmllbGRDb250cm9sc1BpcGUgfSBmcm9tICcuLi9waXBlcy9nZXQtb3JkZXJlZC1mb3JtLWNvbnRyb2xzLnBpcGUnO1xuXG5sZXQgZm9ybVVuaXF1ZUlkID0gMDtcblxuZXhwb3J0IHR5cGUgRm9ybUdlbmVyYXRvckFjY2VwdGFibGVJdGVtcyA9IER5bmFtaWNGb3JtSXRlbVtdIHwgT2JzZXJ2YWJsZTxEeW5hbWljRm9ybUl0ZW1bXT47XG5cbmV4cG9ydCBjb25zdCBGRFBfRk9STV9JR05PUkVEX1NUQVRVU0VTOiBGb3JtQ29udHJvbFN0YXR1c1tdID0gWydJTlZBTElEJywgJ1BFTkRJTkcnLCAnRElTQUJMRUQnXTtcblxuZXhwb3J0IGludGVyZmFjZSBTdWJtaXRGb3JtRXZlbnRSZXN1bHQge1xuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvbiBJbmRpY2F0b3IgaWYgdmFsaWRhdGlvbiBoYXMgYmVlbiBwYXNzZWQuXG4gICAgICovXG4gICAgc3VjY2VzczogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb24gRm9ybWF0dGVkIGZvcm0gdmFsdWUuXG4gICAgICovXG4gICAgdmFsdWU6IER5bmFtaWNGb3JtVmFsdWUgfCBudWxsO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBGb3JtIEdlbmVyYXRvciBjb21wb25lbnQgcmVwcmVzZW50cyBhIGhpZ2gtbGV2ZWwgY29tcG9uZW50XG4gKiB3aGljaCBpbmNsdWRlcyBAc2VlIEZvcm1Hcm91cCBpbnNpZGUuXG4gKi9cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnZmRwLWZvcm0tZ2VuZXJhdG9yJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vZm9ybS1nZW5lcmF0b3IuY29tcG9uZW50Lmh0bWwnLFxuICAgIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICAgIHByb3ZpZGU6IEZEUF9ET19DSEVDSyxcbiAgICAgICAgICAgIHVzZUZhY3Rvcnk6IChmb3JtR2VuZXJhdG9yOiBGb3JtR2VuZXJhdG9yQ29tcG9uZW50KSA9PiBmb3JtR2VuZXJhdG9yLmRvQ2hlY2skLFxuICAgICAgICAgICAgZGVwczogW0Zvcm1HZW5lcmF0b3JDb21wb25lbnRdXG4gICAgICAgIH1cbiAgICBdLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaW1wb3J0czogW1xuICAgICAgICBCdXN5SW5kaWNhdG9yTW9kdWxlLFxuICAgICAgICBGZHBGb3JtR3JvdXBNb2R1bGUsXG4gICAgICAgIEZvcm1zTW9kdWxlLFxuICAgICAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgICAgICBOZ1RlbXBsYXRlT3V0bGV0LFxuICAgICAgICBEeW5hbWljRm9ybUNvbnRyb2xGaWVsZERpcmVjdGl2ZSxcbiAgICAgICAgRm9ybUdlbmVyYXRvckZpZWxkQ29tcG9uZW50LFxuICAgICAgICBTa2VsZXRvbkNvbXBvbmVudCxcbiAgICAgICAgR2V0T3JkZXJlZEZpZWxkQ29udHJvbHNQaXBlLFxuICAgICAgICBHZXRIaW50T3B0aW9uc1BpcGVcbiAgICBdXG59KVxuZXhwb3J0IGNsYXNzIEZvcm1HZW5lcmF0b3JDb21wb25lbnQgaW1wbGVtZW50cyBPbkRlc3Ryb3ksIE9uQ2hhbmdlcyB7XG4gICAgLyoqIEBkZXNjcmlwdGlvbiBVbmlxdWUgZm9ybSBuYW1lICovXG4gICAgQElucHV0KClcbiAgICBmb3JtTmFtZSA9IGBmZHAtZm9ybS1nZW5lcmF0b3ItJHtmb3JtVW5pcXVlSWQrK31gO1xuXG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIExpc3Qgb2YgQHNlZSBEeW5hbWljRm9ybUl0ZW0gcmVwcmVzZW50aW5nIHRoZSBsaXN0IG9mIGl0ZW1zXG4gICAgICogdG8gYmUgcmVuZGVyZWQgaW4gdGhlIGZvcm0uXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBzZXQgZm9ybUl0ZW1zKGZvcm1JdGVtczogRm9ybUdlbmVyYXRvckFjY2VwdGFibGVJdGVtcykge1xuICAgICAgICBpZiAoIWZvcm1JdGVtcykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9ybUl0ZW1zID0gaXNPYnNlcnZhYmxlKGZvcm1JdGVtcykgPyBmb3JtSXRlbXMgOiBvZihmb3JtSXRlbXMpO1xuXG4gICAgICAgIHRoaXMuX29uRm9ybUl0ZW1zQ2hhbmdlKGZvcm1JdGVtcyk7XG4gICAgfVxuICAgIGdldCBmb3JtSXRlbXMoKTogRm9ybUdlbmVyYXRvckFjY2VwdGFibGVJdGVtcyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9mb3JtSXRlbXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIEZvcm0gbWFpbiB0aXRsZS5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIG1haW5UaXRsZTogTnVsbGFibGU8c3RyaW5nPjtcblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdG8gaGlkZSBtYWluIHRpdGxlLiBEZWZhdWx0IGlzIGZhbHNlLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgaGlkZU1haW5USXRsZSA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uXG4gICAgICogSGludCBmb3IgdGhlIG1haW4gdGl0bGVcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIGhpbnQ6IEhpbnRJbnB1dDtcblxuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvbiBTcGVjaWZ5IHRoZSBjb2x1bW4gbGF5b3V0IGluIHRoZSBmb3JtYXQgYFhMbi1Mbi1Nbi1TbmBcbiAgICAgKiB3aGVyZSBuIGlzIHRoZSBudW1iZXIgb2YgY29sdW1ucyBhbmQgY2FuIGJlIGRpZmZlcmVudCBmb3IgZWFjaCBzaXplLlxuICAgICAqIGVnOiBYTDItTDItTTItUzEgd291bGQgY3JlYXRlIDItY29sdW1uIGxheW91dHMgZm9yIFhMLCBMLFxuICAgICAqIGFuZCBNIHNpemVzIGFuZCBzaW5nbGUtY29sdW1uIGxheW91dCBmb3IgUyBzaXplLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgY29sdW1uTGF5b3V0OiBOdWxsYWJsZTxzdHJpbmc+O1xuXG4gICAgLyoqXG4gICAgICogRGVmaW5lcyBsYWJlbCdzIGNvbHVtbiBsYXlvdXQuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBsYWJlbENvbHVtbkxheW91dDogQ29sdW1uTGF5b3V0ID0gRGVmYXVsdFZlcnRpY2FsTGFiZWxMYXlvdXQ7XG5cbiAgICAvKipcbiAgICAgKiBEZWZpbmVzIGZpZWxkJ3MgY29sdW1uIGxheW91dC5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIGZpZWxkQ29sdW1uTGF5b3V0OiBDb2x1bW5MYXlvdXQgPSBEZWZhdWx0VmVydGljYWxGaWVsZExheW91dDtcblxuICAgIC8qKlxuICAgICAqIERlZmluZXMgZ2FwIGNvbHVtbiBsYXlvdXQuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBnYXBDb2x1bW5MYXlvdXQ6IENvbHVtbkxheW91dCA9IERlZmF1bHRHYXBMYXlvdXQ7XG5cbiAgICAvKiogV2hldGhlciBhbGwgZm9ybSBpdGVtcyBzaG91bGQgaGF2ZSBpZGVudGljYWwgbGF5b3V0IHByb3ZpZGVkIGZvciBmb3JtIGdyb3VwLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgdW5pZmllZExheW91dCA9IHRydWU7XG5cbiAgICAvKiogSW5saW5lIGNvbHVtbiBsYXlvdXQgKi9cbiAgICBASW5wdXQoKVxuICAgIGlubGluZUNvbHVtbkxheW91dDogQ29sdW1uTGF5b3V0ID0gRGVmYXVsdFZlcnRpY2FsRmllbGRMYXlvdXQ7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogUmVtb3ZlcyBleHRyYSBlbXB0eSByb3cuXG4gICAgICogVE9ETzogcmVtb3ZlIGFmdGVyICM3NTMzIGhhcyBiZWVuIGZpeGVkLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgbm9BZGRpdGlvbmFsQ29udGVudCA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIEV2ZW50IHdoaWNoIG5vdGlmaWVzIHBhcmVudCBjb21wb25lbnQgdGhhdCB0aGUgZm9ybSBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgY3JlYXRlZFxuICAgICAqIGFuZCBhbGwgY29udHJvbHMgYXJlIGluIHBsYWNlLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIGZvcm1DcmVhdGVkID0gbmV3IEV2ZW50RW1pdHRlcjxEeW5hbWljRm9ybUdyb3VwPigpO1xuXG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIEV2ZW50IHdoaWNoIG5vdGlmaWVzIHBhcmVudCBjb21wb25lbnQgdGhhdCB0aGUgZm9ybSBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgdmFsaWRhdGVkXG4gICAgICogYW5kIHN1Ym1pdHRlZC4gQ29udGFpbnMgZm9ybVxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIGZvcm1TdWJtaXR0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPER5bmFtaWNGb3JtVmFsdWU+KCk7XG5cbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb24gRXZlbnQgd2hpY2ggbm90aWZpZXMgcGFyZW50IGNvbXBvbmVudCB0aGF0IHRoZSBmb3JtIHdhcyBzdWJtaXR0ZWQuXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgZm9ybVN1Ym1pdHRlZFN0YXR1cyA9IG5ldyBFdmVudEVtaXR0ZXI8U3VibWl0Rm9ybUV2ZW50UmVzdWx0PigpO1xuXG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIFJlcHJlc2VudHMgdGhlIGZvcm0gaW5zdGFuY2UuIEBzZWUgTmdGb3JtXG4gICAgICovXG4gICAgQFZpZXdDaGlsZChOZ0Zvcm0pXG4gICAgbmdGb3JtOiBOZ0Zvcm07XG5cbiAgICAvKiogSW5uZXIgZm9ybSBncm91cCBkaXJlY3RpdmUuICovXG4gICAgQFZpZXdDaGlsZChGb3JtR3JvdXBEaXJlY3RpdmUpXG4gICAgZm9ybUdyb3VwOiBGb3JtR3JvdXBEaXJlY3RpdmU7XG5cbiAgICAvKiogSW5uZXIgZm9ybSBmaWVsZHMgKi9cbiAgICBAVmlld0NoaWxkcmVuKEZvcm1HZW5lcmF0b3JGaWVsZENvbXBvbmVudClcbiAgICBmaWVsZHM6IFF1ZXJ5TGlzdDxGb3JtR2VuZXJhdG9yRmllbGRDb21wb25lbnQ+O1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBkb0NoZWNrJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgICAvKiogQXJyYXkgb2YgZm9ybSBmaWVsZCBjb250cm9scy4gKi9cbiAgICBnZXQgZm9ybUZpZWxkcygpOiBQbGF0Zm9ybUZvcm1GaWVsZENvbnRyb2xbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZpZWxkc1xuICAgICAgICAgICAgPy50b0FycmF5KClcbiAgICAgICAgICAgIC5maWx0ZXIoKGZpZWxkKSA9PiAhIWZpZWxkLmZpZWxkUmVuZGVyZXI/LmNvbnRyb2wpXG4gICAgICAgICAgICAubWFwKChmaWVsZCkgPT4gZmllbGQuZmllbGRSZW5kZXJlci5jb250cm9sISk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIER5bmFtaWNhbGx5IGdlbmVyYXRlZCBmb3JtLiBAc2VlIEZvcm1HZW5lcmF0b3JTZXJ2aWNlXG4gICAgICovXG4gICAgZm9ybTogRHluYW1pY0Zvcm1Hcm91cDtcbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb24gTGlzdCBvZiB0aGUgZm9ybSBjb250cm9scy5cbiAgICAgKi9cbiAgICBmb3JtQ29udHJvbEl0ZW1zOiBEeW5hbWljRm9ybUdyb3VwQ29udHJvbFtdO1xuXG4gICAgLyoqXG4gICAgICogU2V0IG9mIGZsYWdzIHJlcHJlc2VudGluZyBpZiBwYXJ0aWN1bGFyIGZvcm0gaXRlbSBzaG91bGQgYmUgdmlzaWJsZSB0byB0aGUgdXNlci5cbiAgICAgKi9cbiAgICBzaG91bGRTaG93RmllbGRzOiB7IFtrZXk6IHN0cmluZ106IGJvb2xlYW4gfSA9IHt9O1xuXG4gICAgLyoqXG4gICAgICogRmxhZyByZXByZXNlbnRpbmcgdGhhdCBmb3JtIGlzIGxvYWRpbmdcbiAgICAgKi9cbiAgICBmb3JtTG9hZGluZyA9IHRydWU7XG5cbiAgICAvKipcbiAgICAgKiBTdHJlYW0gb2YgZm9ybSBsb2FkaW5nIHN0YXRlLlxuICAgICAqL1xuICAgIGxvYWRpbmckID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPih0aGlzLmZvcm1Mb2FkaW5nKTtcblxuICAgIC8qKlxuICAgICAqIFN0cmVhbSBvZiBsYXN0IGZvcm0gc3VibWlzc2lvbiBzdGF0dXMuXG4gICAgICovXG4gICAgZm9ybVN1Ym1pdHRlZFN0YXR1cyQgPSBuZXcgU3ViamVjdDxTdWJtaXRGb3JtRXZlbnRSZXN1bHQ+KCk7XG5cbiAgICAvKipcbiAgICAgKiBTdHJlYW0gb2YgbGFzdCBmb3JtIHN1Ym1pc3Npb24gdmFsdWUuXG4gICAgICovXG4gICAgZm9ybVZhbHVlJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8RHluYW1pY0Zvcm1WYWx1ZT4oe30pO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIFRvIGRpZmZlcmVudGlhdGUgYmV0d2VlbiBmaXJzdCBsb2FkaW5nIHdoZW4gc2tlbGV0b25zIGJlIHNob3duIGFuZCBzdWJzZXF1ZW50IGxvYWRpbmdzIHdoZW4gYnVzeSBpbmRpY2F0b3IgYmUgc2hvd25cbiAgICAgKi9cbiAgICBfZmlyc3RMb2FkaW5nRG9uZSA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIGhpbnRPcHRpb25zOiBIaW50T3B0aW9ucztcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgX2Vycm9yTW9kZWxzOiB7IHR5cGU6IHN0cmluZzsgdmFsdWU6IGFueSB9W10gPSBbXTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9mb3JtSXRlbXM6IEZvcm1HZW5lcmF0b3JBY2NlcHRhYmxlSXRlbXM7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfZm9ybVZhbHVlU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX3JlZnJlc2gkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBBbiBSeEpTIFN1YmplY3QgdGhhdCB3aWxsIGtpbGwgdGhlIGRhdGEgc3RyZWFtIHVwb24gY29tcG9uZW504oCZcyBkZXN0cnVjdGlvbiAoZm9yIHVuc3Vic2NyaWJpbmcpXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBfb25EZXN0cm95JDogU3ViamVjdDx2b2lkPiA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX2RlZmF1bHRIaW50T3B0aW9uczogRmllbGRIaW50T3B0aW9ucztcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfbmdTdWJtaXRTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiB8IHVuZGVmaW5lZDtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfbWFwcGVkRm9ybWl0ZW1zOiBNYXA8c3RyaW5nLCBEeW5hbWljRm9ybUl0ZW1NYXA+ID0gbmV3IE1hcCgpO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSBfZmdTZXJ2aWNlOiBGb3JtR2VuZXJhdG9yU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBfY2Q6IENoYW5nZURldGVjdG9yUmVmLFxuICAgICAgICBASW5qZWN0KEZEUF9GT1JNX0dFTkVSQVRPUl9ERUZBVUxUX0hJTlRfT1BUSU9OUykgX3Byb3ZpZGVkSGludE9wdGlvbnM6IEZpZWxkSGludE9wdGlvbnNcbiAgICApIHtcbiAgICAgICAgdGhpcy5fZGVmYXVsdEhpbnRPcHRpb25zID0ge1xuICAgICAgICAgICAgLi4uZGVmYXVsdEZvcm1HZW5lcmF0b3JIaW50T3B0aW9ucyxcbiAgICAgICAgICAgIC4uLl9wcm92aWRlZEhpbnRPcHRpb25zXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5fZXJyb3JNb2RlbHMgPSB0aGlzLl9nZXRFcnJvcnMoKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAgICAgaWYgKGNoYW5nZXMuaGludCkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmhpbnQgPT09ICdzdHJpbmcnIHx8IHRoaXMuaGludCBpbnN0YW5jZW9mIFRlbXBsYXRlUmVmKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5oaW50T3B0aW9ucyA9IHtcbiAgICAgICAgICAgICAgICAgICAgLi4udGhpcy5fZGVmYXVsdEhpbnRPcHRpb25zLFxuICAgICAgICAgICAgICAgICAgICBjb250ZW50OiB0aGlzLmhpbnRcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhpbnRPcHRpb25zID0ge1xuICAgICAgICAgICAgICAgICAgICAuLi50aGlzLl9kZWZhdWx0SGludE9wdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgIC4uLnRoaXMuaGludFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX29uRGVzdHJveSQubmV4dCgpO1xuICAgICAgICB0aGlzLl9vbkRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gICAgICAgIHRoaXMuX25nU3VibWl0U3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlZnJlc2hlcyBmb3JtIGl0ZW1zIHZpc2liaWxpdHkgd2l0aCAnd2hlbicgY29uZGl0aW9uLlxuICAgICAqL1xuICAgIGFzeW5jIHJlZnJlc2hTdGVwc1Zpc2liaWxpdHkoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMuc2hvdWxkU2hvd0ZpZWxkcyA9IGF3YWl0IHRoaXMuX2ZnU2VydmljZS5jaGVja1Zpc2libGVGb3JtSXRlbXModGhpcy5mb3JtKTtcbiAgICAgICAgdGhpcy5fY2QubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIGFzeW5jIF9vblN1Ym1pdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5mb3JtLm1hcmtBbGxBc1RvdWNoZWQoKTtcbiAgICAgICAgdGhpcy5fY2QuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB0aGlzLmRvQ2hlY2skLm5leHQoKTtcblxuICAgICAgICBjb25zdCBmb3JtVmFsdWUgPSBhd2FpdCB0aGlzLl9mZ1NlcnZpY2UuZ2V0Rm9ybVZhbHVlKHRoaXMuZm9ybSk7XG5cbiAgICAgICAgdGhpcy5mb3JtU3VibWl0dGVkU3RhdHVzLmVtaXQoeyBzdWNjZXNzOiAhdGhpcy5mb3JtLmludmFsaWQsIHZhbHVlOiBmb3JtVmFsdWUgfSk7XG4gICAgICAgIHRoaXMuZm9ybVN1Ym1pdHRlZFN0YXR1cyQubmV4dCh7IHN1Y2Nlc3M6ICF0aGlzLmZvcm0uaW52YWxpZCwgdmFsdWU6IGZvcm1WYWx1ZSB9KTtcblxuICAgICAgICBpZiAodGhpcy5mb3JtLmludmFsaWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZvcm1TdWJtaXR0ZWQuZW1pdChmb3JtVmFsdWUpO1xuICAgICAgICB0aGlzLmZvcm1WYWx1ZSQubmV4dChmb3JtVmFsdWUpO1xuXG4gICAgICAgIHRoaXMuZm9ybS5tYXJrQXNQcmlzdGluZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgbmV3IGNvbnRyb2wgdG8gYW4gZXhpc3RpbmcgZm9ybS5cbiAgICAgKiBAcGFyYW0gY29udHJvbCBDb250cm9sIGNvbmZpZ3VyYXRpb24gdG8gYWRkLlxuICAgICAqIEBwYXJhbSBwYXRoIFBhdGggb2YgdGhlIGNvbnRyb2wuXG4gICAgICovXG4gICAgYXN5bmMgYWRkQ29udHJvbChjb250cm9sOiBEeW5hbWljRm9ybUl0ZW0sIHBhdGg/OiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLl9hZGRDb250cm9sVG9Gb3JtSXRlbXMoY29udHJvbCwgcGF0aCk7XG4gICAgICAgIHRoaXMuX2ZnU2VydmljZS5hZGRDb250cm9sKGNvbnRyb2wsIHRoaXMuZm9ybSwgcGF0aCk7XG5cbiAgICAgICAgdGhpcy5mb3JtQ29udHJvbEl0ZW1zID0gdGhpcy5fZ2V0T3JkZXJlZENvbnRyb2xzKHRoaXMuZm9ybS5jb250cm9scyk7XG5cbiAgICAgICAgdGhpcy5zaG91bGRTaG93RmllbGRzID0gYXdhaXQgdGhpcy5fZmdTZXJ2aWNlLmNoZWNrVmlzaWJsZUZvcm1JdGVtcyh0aGlzLmZvcm0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgdGhlIGNvbnRyb2wgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBieSB0aGUgZ2l2ZW4gcGF0aC5cbiAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBjb250cm9sLlxuICAgICAqIEBwYXJhbSBwYXRoIFBhdGggb2YgdGhlIGNvbnRyb2wuXG4gICAgICovXG4gICAgYXN5bmMgcmVtb3ZlQ29udHJvbChuYW1lOiBzdHJpbmcsIHBhdGg6IHN0cmluZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMuX3JlbW92ZUNvbnRyb2xGcm9tSXRlbXMobmFtZSwgcGF0aCk7XG4gICAgICAgIHRoaXMuX2ZnU2VydmljZS5yZW1vdmVDb250cm9sKG5hbWUsIHRoaXMuZm9ybSwgcGF0aCk7XG4gICAgICAgIHRoaXMuZm9ybUNvbnRyb2xJdGVtcyA9IHRoaXMuX2dldE9yZGVyZWRDb250cm9scyh0aGlzLmZvcm0uY29udHJvbHMpO1xuXG4gICAgICAgIHRoaXMuc2hvdWxkU2hvd0ZpZWxkcyA9IGF3YWl0IHRoaXMuX2ZnU2VydmljZS5jaGVja1Zpc2libGVGb3JtSXRlbXModGhpcy5mb3JtKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBfdHJhY2tGbihpbmRleDogbnVtYmVyLCB2YWx1ZTogRHluYW1pY0Zvcm1Hcm91cENvbnRyb2wpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gYCR7aW5kZXh9XyR7dmFsdWUuZm9ybUl0ZW0ubmFtZX1gO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgX2dyb3VwVHJhY2tGbihpbmRleDogbnVtYmVyLCB2YWx1ZTogRHluYW1pY0Zvcm1Hcm91cENvbnRyb2wpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gKHZhbHVlIGFzIER5bmFtaWNGb3JtQ29udHJvbEdyb3VwKS5mb3JtSXRlbS5uYW1lO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqXG4gICAgICogQGRlc2NyaXB0aW9uIFByb2dyYW1tYXRpY2FsbHkgc3VibWl0IGZvcm0uXG4gICAgICogVGhpcyBtZXRob2QgYWxzbyBjYWxscyB2YWxpZGF0aW9uIGZvciB0aGUgZm9ybSBpdGVtcy5cbiAgICAgKi9cbiAgICBzdWJtaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZm9ybUdyb3VwLm9uU3VibWl0KG5ldyBFdmVudCgnc3VibWl0JykpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgX2lzQWR2YW5jZWRFcnJvcihlcnJvcjogYW55KTogZXJyb3IgaXMgRHluYW1pY0Zvcm1JdGVtVmFsaWRhdGlvbk9iamVjdCB7XG4gICAgICAgIHJldHVybiBlcnJvci5oZWFkaW5nICYmIGVycm9yLmRlc2NyaXB0aW9uICYmIGVycm9yLnR5cGU7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBfZXJyb3JzVHJhY2tCeShfOiBudW1iZXIsIGVycm9yOiB7IHR5cGU6IHN0cmluZzsgdmFsdWU6IGFueSB9KTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGVycm9yLnR5cGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByaXZhdGUgYXN5bmMgX2dlbmVyYXRlRm9ybSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5mb3JtTG9hZGluZyA9IHRydWU7XG4gICAgICAgIHRoaXMubG9hZGluZyQubmV4dCh0aGlzLmZvcm1Mb2FkaW5nKTtcblxuICAgICAgICBjb25zdCBmb3JtID0gYXdhaXQgdGhpcy5fZmdTZXJ2aWNlLmdlbmVyYXRlRm9ybSh0aGlzLmZvcm1OYW1lLCB0aGlzLl9tYXBwZWRGb3JtaXRlbXMpO1xuXG4gICAgICAgIHRoaXMuX2Zvcm1WYWx1ZVN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcblxuICAgICAgICB0aGlzLmZvcm0gPSBmb3JtO1xuXG4gICAgICAgIHRoaXMuZm9ybUNvbnRyb2xJdGVtcyA9IHRoaXMuX2dldE9yZGVyZWRDb250cm9scyhmb3JtLmNvbnRyb2xzKTtcblxuICAgICAgICB0aGlzLnNob3VsZFNob3dGaWVsZHMgPSBhd2FpdCB0aGlzLl9mZ1NlcnZpY2UuY2hlY2tWaXNpYmxlRm9ybUl0ZW1zKHRoaXMuZm9ybSk7XG5cbiAgICAgICAgdGhpcy5fZm9ybVZhbHVlU3Vic2NyaXB0aW9uID0gdGhpcy5mb3JtLnZhbHVlQ2hhbmdlc1xuICAgICAgICAgICAgLnBpcGUoZGVib3VuY2VUaW1lKDUwKSwgdGFrZVVudGlsKHRoaXMuX29uRGVzdHJveSQpKVxuICAgICAgICAgICAgLnN1YnNjcmliZShhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zaG91bGRTaG93RmllbGRzID0gYXdhaXQgdGhpcy5fZmdTZXJ2aWNlLmNoZWNrVmlzaWJsZUZvcm1JdGVtcyh0aGlzLmZvcm0pO1xuICAgICAgICAgICAgICAgIHRoaXMuX2NkLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5mb3JtTG9hZGluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9maXJzdExvYWRpbmdEb25lID0gdHJ1ZTtcblxuICAgICAgICB0aGlzLl9jZC5kZXRlY3RDaGFuZ2VzKCk7XG5cbiAgICAgICAgdGhpcy5mb3JtQ3JlYXRlZC5lbWl0KHRoaXMuZm9ybSk7XG4gICAgICAgIHRoaXMubG9hZGluZyQubmV4dCh0aGlzLmZvcm1Mb2FkaW5nKTtcblxuICAgICAgICBpZiAoIXRoaXMuZm9ybUdyb3VwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9saXN0ZW5Ub1N1Ym1pdCgpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfZ2V0T3JkZXJlZENvbnRyb2xzKGNvbnRyb2xzOiBEeW5hbWljRm9ybUdyb3VwQ29udHJvbHMpOiAoRHluYW1pY0Zvcm1Db250cm9sIHwgRHluYW1pY0Zvcm1Db250cm9sR3JvdXApW10ge1xuICAgICAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyhjb250cm9scykuc29ydChcbiAgICAgICAgICAgIChhLCBiKSA9PiAoYS5mb3JtSXRlbT8ucmFuayA/PyAtSW5maW5pdHkpIC0gKGIuZm9ybUl0ZW0/LnJhbmsgPz8gLUluZmluaXR5KVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfZ2V0RXJyb3JzKCk6IHsgdHlwZTogc3RyaW5nOyB2YWx1ZTogYW55IH1bXSB7XG4gICAgICAgIGNvbnN0IHJldHVybkVycm9yczogeyB0eXBlOiBzdHJpbmc7IHZhbHVlOiBhbnkgfVtdID0gW107XG4gICAgICAgIGNvbnN0IHJlZ2lzdGVyZWRFcnJvcnMgPSB0aGlzLl9mZ1NlcnZpY2UudmFsaWRhdGlvbkVycm9ySGludHM7XG4gICAgICAgIE9iamVjdC5lbnRyaWVzKHJlZ2lzdGVyZWRFcnJvcnMpLmZvckVhY2goKHR5cGUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IFtlcnJvclR5cGUsIGVycm9yVmFsdWVdID0gdHlwZTtcblxuICAgICAgICAgICAgcmV0dXJuRXJyb3JzLnB1c2goe1xuICAgICAgICAgICAgICAgIHR5cGU6IGVycm9yVHlwZSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogZXJyb3JWYWx1ZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiByZXR1cm5FcnJvcnM7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9saXN0ZW5Ub1N1Ym1pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fbmdTdWJtaXRTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIHRoaXMuX25nU3VibWl0U3Vic2NyaXB0aW9uID0gdGhpcy5mb3JtR3JvdXAubmdTdWJtaXRcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIHN3aXRjaE1hcCgoKSA9PlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZvcm1Hcm91cC5zdGF0dXNDaGFuZ2VzIS5waXBlKFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRXaXRoKHRoaXMuZm9ybUdyb3VwLnN0YXR1cyksXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoKHN0YXR1czogRm9ybUNvbnRyb2xTdGF0dXMpID0+IHN0YXR1cyAhPT0gJ1BFTkRJTkcnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRha2UoMSksXG4gICAgICAgICAgICAgICAgICAgICAgICB0YWtlVW50aWwodGhpcy5fb25EZXN0cm95JClcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX29uU3VibWl0KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fbGlzdGVuVG9TdWJtaXQoKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfb25Gb3JtSXRlbXNDaGFuZ2UoaXRlbXM6IE9ic2VydmFibGU8RHluYW1pY0Zvcm1JdGVtW10+KTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3JlZnJlc2gkLm5leHQoKTtcbiAgICAgICAgdGhpcy5fcmVmcmVzaCQuY29tcGxldGUoKTtcblxuICAgICAgICB0aGlzLl9yZWZyZXNoJCA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgICAgICAgaXRlbXMucGlwZSh0YWtlVW50aWwobWVyZ2UodGhpcy5fcmVmcmVzaCQsIHRoaXMuX29uRGVzdHJveSQpKSkuc3Vic2NyaWJlKChmb3JtSXRlbXMpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX21hcHBlZEZvcm1pdGVtcyA9IG1hcEZvcm1JdGVtcyhmb3JtSXRlbXMpO1xuICAgICAgICAgICAgdGhpcy5fZ2VuZXJhdGVGb3JtKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfYXBwbHlSYW5rKGl0ZW1zOiBEeW5hbWljRm9ybUl0ZW1bXSk6IER5bmFtaWNGb3JtSXRlbVtdIHtcbiAgICAgICAgaXRlbXMgPSBpdGVtcy5tYXAoKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBpdGVtLnJhbmsgPSBpdGVtLnJhbmsgfHwgaW5kZXg7XG4gICAgICAgICAgICBpZiAoaXRlbS5pdGVtcykge1xuICAgICAgICAgICAgICAgIGl0ZW0uaXRlbXMgPSB0aGlzLl9hcHBseVJhbmsoaXRlbS5pdGVtcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gaXRlbTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGl0ZW1zO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfYWRkQ29udHJvbFRvRm9ybUl0ZW1zKGl0ZW06IER5bmFtaWNGb3JtSXRlbSwgcGF0aD86IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgICAgIGlmICghcGF0aCkge1xuICAgICAgICAgICAgdGhpcy5fbWFwcGVkRm9ybWl0ZW1zLnNldChpdGVtLm5hbWUsIHRyYW5zZm9ybUZvcm1JdGVtKGl0ZW0sIHRoaXMuX21hcHBlZEZvcm1pdGVtcy5zaXplKSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwYXJlbnRJdGVtID0gZ2V0UGFyZW50SXRlbShwYXRoLCB0aGlzLl9tYXBwZWRGb3JtaXRlbXMpO1xuXG4gICAgICAgIGlmICghcGFyZW50SXRlbSB8fCBpc0Zvcm1GaWVsZEl0ZW0ocGFyZW50SXRlbSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHBhcmVudEl0ZW0uaXRlbXMgPSBwYXJlbnRJdGVtLml0ZW1zIHx8IG5ldyBNYXAoKTtcbiAgICAgICAgcGFyZW50SXRlbS5pdGVtcy5zZXQoaXRlbS5uYW1lLCB0cmFuc2Zvcm1Gb3JtSXRlbShpdGVtLCBwYXJlbnRJdGVtLml0ZW1zLnNpemUpKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX3JlbW92ZUNvbnRyb2xGcm9tSXRlbXMobmFtZTogc3RyaW5nLCBwYXRoPzogc3RyaW5nW10pOiB2b2lkIHtcbiAgICAgICAgaWYgKCFwYXRoKSB7XG4gICAgICAgICAgICB0aGlzLl9tYXBwZWRGb3JtaXRlbXMuZGVsZXRlKG5hbWUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGFyZW50SXRlbSA9IGdldFBhcmVudEl0ZW0ocGF0aCwgdGhpcy5fbWFwcGVkRm9ybWl0ZW1zKTtcblxuICAgICAgICBpZiAoIXBhcmVudEl0ZW0gfHwgaXNGb3JtRmllbGRJdGVtKHBhcmVudEl0ZW0pKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBwYXJlbnRJdGVtLml0ZW1zPy5kZWxldGUobmFtZSk7XG4gICAgfVxufVxuIiwiQGlmIChfZmlyc3RMb2FkaW5nRG9uZSkge1xuICAgIDxmZC1idXN5LWluZGljYXRvciBbbG9hZGluZ109XCJmb3JtTG9hZGluZ1wiIFtibG9ja109XCJ0cnVlXCI+XG4gICAgICAgIEBpZiAoZm9ybSkge1xuICAgICAgICAgICAgPGZkcC1mb3JtLWdyb3VwXG4gICAgICAgICAgICAgICAgW2hpbnRdPVwiaGludFwiXG4gICAgICAgICAgICAgICAgW21haW5UaXRsZV09XCJtYWluVGl0bGVcIlxuICAgICAgICAgICAgICAgIFtoaWRlTWFpblRJdGxlXT1cImhpZGVNYWluVEl0bGVcIlxuICAgICAgICAgICAgICAgIFtmb3JtR3JvdXBdPVwiZm9ybVwiXG4gICAgICAgICAgICAgICAgW2NvbHVtbkxheW91dF09XCJjb2x1bW5MYXlvdXRcIlxuICAgICAgICAgICAgICAgIFtsYWJlbENvbHVtbkxheW91dF09XCJsYWJlbENvbHVtbkxheW91dFwiXG4gICAgICAgICAgICAgICAgW2ZpZWxkQ29sdW1uTGF5b3V0XT1cImZpZWxkQ29sdW1uTGF5b3V0XCJcbiAgICAgICAgICAgICAgICBbZ2FwQ29sdW1uTGF5b3V0XT1cImdhcENvbHVtbkxheW91dFwiXG4gICAgICAgICAgICAgICAgW3VuaWZpZWRMYXlvdXRdPVwidW5pZmllZExheW91dFwiXG4gICAgICAgICAgICAgICAgW2lubGluZUNvbHVtbkxheW91dF09XCJpbmxpbmVDb2x1bW5MYXlvdXRcIlxuICAgICAgICAgICAgICAgIFt1c2VGb3JtXT1cInRydWVcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIEBmb3IgKGVycm9yIG9mIF9lcnJvck1vZGVsczsgdHJhY2sgX2Vycm9yc1RyYWNrQnkoJGluZGV4LCBlcnJvcikpIHtcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gKmZkcEZvcm1GaWVsZEVycm9yPVwiZXJyb3IudHlwZTsgbGV0IGRpcmVjdGl2ZUVycm9yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYgKF9pc0FkdmFuY2VkRXJyb3IoZGlyZWN0aXZlRXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChkaXJlY3RpdmVFcnJvci5oZWFkaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpmZHBGb3JtRmllbGRFcnJvckhlYWRpbmc9XCJsZXQgdmFsaWRhdGlvbkVycm9yOyB0eXBlOiBkaXJlY3RpdmVFcnJvci50eXBlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyB2YWxpZGF0aW9uRXJyb3IuaGVhZGluZyB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoZGlyZWN0aXZlRXJyb3IuZGVzY3JpcHRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKmZkcEZvcm1GaWVsZEVycm9yRGVzY3JpcHRpb249XCJsZXQgdmFsaWRhdGlvbkVycm9yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyB2YWxpZGF0aW9uRXJyb3IuZGVzY3JpcHRpb24gfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpmZHBGb3JtRmllbGRFcnJvckhlYWRpbmc9XCJsZXQgdmFsaWRhdGlvbkVycm9yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGVycm9yLnZhbHVlID8gZXJyb3IudmFsdWUgOiB2YWxpZGF0aW9uRXJyb3IgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgQGZvciAoZmllbGQgb2YgZm9ybUNvbnRyb2xJdGVtczsgdHJhY2sgX3RyYWNrRm4oJGluZGV4LCBmaWVsZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJmaWVsZC50eXBlID09PSAnZmllbGQnID8gZmllbGRSZW5kZXJlciA6IGdyb3VwUmVuZGVyZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZDogZmllbGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUZpZWxkTmFtZTogZmllbGQuZm9ybUl0ZW0ubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5rOiBmaWVsZC5mb3JtSXRlbT8ucmFuayB8fCAwXG4gICAgICAgICAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICAgICAgPjwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgI2ZpZWxkUmVuZGVyZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldC1maWVsZD1cImZpZWxkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldC1mb3JtRmllbGROYW1lPVwiZm9ybUZpZWxkTmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQtZm9ybUdyb3VwTmFtZT1cImZvcm1Hcm91cE5hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0LXJhbms9XCJyYW5rXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpmZHBEeW5hbWljRm9ybUNvbnRyb2xGaWVsZD1cImZpZWxkOyBzaG93OiBzaG91bGRTaG93RmllbGRzW2ZpZWxkLmZvcm1JdGVtLm5hbWVdICE9PSBmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZkcC1mb3JtLWdlbmVyYXRvci1maWVsZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaGludE9wdGlvbnNdPVwiZmllbGQuZm9ybUl0ZW0uZ3VpT3B0aW9ucyB8IGdldEhpbnRPcHRpb25zXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1dPVwiZm9ybVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG91bGRTaG93XT1cInNob3VsZFNob3dGaWVsZHNbZmllbGQuZm9ybUl0ZW0ubmFtZV0gIT09IGZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ZpZWxkXT1cImZpZWxkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1GaWVsZE5hbWVdPVwiZm9ybUZpZWxkTmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtR3JvdXBOYW1lUGF0aF09XCJmb3JtR3JvdXBOYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JhbmtdPVwicmFua1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvZmRwLWZvcm0tZ2VuZXJhdG9yLWZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZ3JvdXBSZW5kZXJlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxmZHAtZm9ybS1maWVsZC1ncm91cFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtoaW50T3B0aW9uc109XCJmaWVsZC5mb3JtSXRlbS5ndWlPcHRpb25zIHwgZ2V0SGludE9wdGlvbnNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJmaWVsZC5mb3JtSXRlbS5tZXNzYWdlIHx8ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxDb2x1bW5MYXlvdXRdPVwiZmllbGQuZm9ybUl0ZW0uZ3VpT3B0aW9ucz8ubGFiZWxDb2x1bW5MYXlvdXRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmaWVsZENvbHVtbkxheW91dF09XCJmaWVsZC5mb3JtSXRlbS5ndWlPcHRpb25zPy5maWVsZENvbHVtbkxheW91dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2dhcENvbHVtbkxheW91dF09XCJmaWVsZC5mb3JtSXRlbS5ndWlPcHRpb25zPy5nYXBDb2x1bW5MYXlvdXRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtTmFtZV09XCJmaWVsZC5mb3JtSXRlbS5uYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAZm9yIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBGaWVsZCBvZiBmaWVsZCB8IGdldE9yZGVyZWRGaWVsZENvbnRyb2xzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjayBfZ3JvdXBUcmFja0ZuKCRpbmRleCwgZ3JvdXBGaWVsZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmZkcER5bmFtaWNGb3JtQ29udHJvbEZpZWxkPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBGaWVsZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93OiBzaG91bGRTaG93RmllbGRzW2dyb3VwRmllbGQuZm9ybUl0ZW0ubmFtZSFdICE9PSBmYWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZkcC1mb3JtLWdlbmVyYXRvci1maWVsZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtoaW50T3B0aW9uc109XCJncm91cEZpZWxkLmZvcm1JdGVtLmd1aU9wdGlvbnMgfCBnZXRIaW50T3B0aW9uc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1dPVwiZm9ybVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ZpZWxkXT1cImdyb3VwRmllbGRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG91bGRTaG93XT1cInNob3VsZFNob3dGaWVsZHNbZ3JvdXBGaWVsZC5mb3JtSXRlbS5uYW1lIV0gIT09IGZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUZpZWxkTmFtZV09XCJncm91cEZpZWxkLmZvcm1JdGVtLm5hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtR3JvdXBOYW1lUGF0aF09XCJmaWVsZC5mb3JtSXRlbS5uYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmFua109XCJncm91cEZpZWxkLmZvcm1JdGVtLnJhbmsgfHwgMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9mZHAtZm9ybS1nZW5lcmF0b3ItZmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZmRwLWZvcm0tZmllbGQtZ3JvdXA+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIEBpZiAoIW5vQWRkaXRpb25hbENvbnRlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgPGZkcC1mb3JtLWZpZWxkIFtjb2x1bW5dPVwiMVwiIFtyYW5rXT1cImZvcm1Db250cm9sSXRlbXMubGVuZ3RoICsgMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBGb3IgdXNlci1kZWZpbmVkIGVsZW1lbnRzLCBsaWtlIHN1Ym1pdCBidXR0b24gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICAgIDwvZmRwLWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9mZHAtZm9ybS1ncm91cD5cbiAgICAgICAgfVxuICAgIDwvZmQtYnVzeS1pbmRpY2F0b3I+XG59IEBlbHNlIHtcbiAgICA8ZmQtc2tlbGV0b24gd2lkdGg9XCIxMDAlXCIgaGVpZ2h0PVwiMTAwcHhcIiBbc3R5bGUucGFkZGluZy5yZW1dPVwiMVwiPlxuICAgICAgICA8c3ZnOnJlY3QgeD1cIjBcIiB5PVwiMFwiIHJ4PVwiNFwiIHdpZHRoPVwiMTUlXCIgaGVpZ2h0PVwiOFwiIC8+XG4gICAgICAgIDxzdmc6cmVjdCB4PVwiMFwiIHk9XCIyMFwiIHJ4PVwiNFwiIHdpZHRoPVwiMjUlXCIgaGVpZ2h0PVwiMTZcIiAvPlxuICAgICAgICA8c3ZnOnJlY3QgeD1cIjM1JVwiIHk9XCIwXCIgcng9XCI0XCIgd2lkdGg9XCIxNSVcIiBoZWlnaHQ9XCI4XCIgLz5cbiAgICAgICAgPHN2ZzpyZWN0IHg9XCIzNSVcIiB5PVwiMjBcIiByeD1cIjRcIiB3aWR0aD1cIjI1JVwiIGhlaWdodD1cIjE2XCIgLz5cbiAgICAgICAgPHN2ZzpyZWN0IHg9XCIwXCIgeT1cIjYwXCIgcng9XCI0XCIgd2lkdGg9XCIxNSVcIiBoZWlnaHQ9XCI4XCIgLz5cbiAgICAgICAgPHN2ZzpyZWN0IHg9XCIwXCIgeT1cIjgwXCIgcng9XCI0XCIgd2lkdGg9XCIyNSVcIiBoZWlnaHQ9XCIxNlwiIC8+XG4gICAgPC9mZC1za2VsZXRvbj5cbn1cbiJdfQ==
417
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1nZW5lcmF0b3IuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9wbGF0Zm9ybS9mb3JtL2Zvcm0tZ2VuZXJhdG9yL2Zvcm0tZ2VuZXJhdG9yL2Zvcm0tZ2VuZXJhdG9yLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvcGxhdGZvcm0vZm9ybS9mb3JtLWdlbmVyYXRvci9mb3JtLWdlbmVyYXRvci9mb3JtLWdlbmVyYXRvci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0gsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUdMLE1BQU0sRUFDTixTQUFTLEVBRVQsV0FBVyxFQUNYLFNBQVMsRUFDVCxZQUFZLEVBQ1osaUJBQWlCLEVBQ2pCLE1BQU0sRUFDVCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQXFCLGtCQUFrQixFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNqSCxPQUFPLEVBQVksaUJBQWlCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN6RSxPQUFPLEVBRUgsWUFBWSxFQUtmLE1BQU0sa0NBQWtDLENBQUM7QUFDMUMsT0FBTyxFQUFFLGVBQWUsRUFBYyxPQUFPLEVBQWdCLFlBQVksRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ25HLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdGLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLHdEQUF3RCxDQUFDO0FBRXJHLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFN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QUFpQjtzQkFEaEIsS0FBSztnQkFPTixlQUFlO3NCQURkLEtBQUs7Z0JBS04sYUFBYTtzQkFEWixLQUFLO2dCQUtOLGtCQUFrQjtzQkFEakIsS0FBSztnQkFTTixtQkFBbUI7c0JBRGxCLEtBQUs7Z0JBUU4sV0FBVztzQkFEVixNQUFNO2dCQVFQLGFBQWE7c0JBRFosTUFBTTtnQkFPUCxtQkFBbUI7c0JBRGxCLE1BQU07Z0JBT1AsTUFBTTtzQkFETCxTQUFTO3VCQUFDLE1BQU07Z0JBS2pCLFNBQVM7c0JBRFIsU0FBUzt1QkFBQyxrQkFBa0I7Z0JBSzdCLE1BQU07c0JBREwsWUFBWTt1QkFBQywyQkFBMkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIENvbXBvbmVudCxcbiAgICBEZXN0cm95UmVmLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBJbmplY3QsXG4gICAgSW5wdXQsXG4gICAgT25DaGFuZ2VzLFxuICAgIE9uRGVzdHJveSxcbiAgICBPdXRwdXQsXG4gICAgUXVlcnlMaXN0LFxuICAgIFNpbXBsZUNoYW5nZXMsXG4gICAgVGVtcGxhdGVSZWYsXG4gICAgVmlld0NoaWxkLFxuICAgIFZpZXdDaGlsZHJlbixcbiAgICBWaWV3RW5jYXBzdWxhdGlvbixcbiAgICBpbmplY3Rcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQ29udHJvbFN0YXR1cywgRm9ybUdyb3VwRGlyZWN0aXZlLCBGb3Jtc01vZHVsZSwgTmdGb3JtLCBSZWFjdGl2ZUZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTnVsbGFibGUsIGRlc3Ryb3lPYnNlcnZhYmxlIH0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9jZGsvdXRpbHMnO1xuaW1wb3J0IHtcbiAgICBDb2x1bW5MYXlvdXQsXG4gICAgRkRQX0RPX0NIRUNLLFxuICAgIEZpZWxkSGludE9wdGlvbnMsXG4gICAgSGludElucHV0LFxuICAgIEhpbnRPcHRpb25zLFxuICAgIFBsYXRmb3JtRm9ybUZpZWxkQ29udHJvbFxufSBmcm9tICdAZnVuZGFtZW50YWwtbmd4L3BsYXRmb3JtL3NoYXJlZCc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIFN1YmplY3QsIFN1YnNjcmlwdGlvbiwgaXNPYnNlcnZhYmxlLCBtZXJnZSwgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgZmlsdGVyLCBzdGFydFdpdGgsIHN3aXRjaE1hcCwgdGFrZSwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgRm9ybUdlbmVyYXRvckZpZWxkQ29tcG9uZW50IH0gZnJvbSAnLi4vZm9ybS1nZW5lcmF0b3ItZmllbGQvZm9ybS1nZW5lcmF0b3ItZmllbGQuY29tcG9uZW50JztcblxuaW1wb3J0IHsgTmdUZW1wbGF0ZU91dGxldCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBCdXN5SW5kaWNhdG9yTW9kdWxlIH0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9jb3JlL2J1c3ktaW5kaWNhdG9yJztcbmltcG9ydCB7IFNrZWxldG9uQ29tcG9uZW50IH0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9jb3JlL3NrZWxldG9uJztcbmltcG9ydCB7IERlZmF1bHRHYXBMYXlvdXQsIERlZmF1bHRWZXJ0aWNhbEZpZWxkTGF5b3V0LCBEZWZhdWx0VmVydGljYWxMYWJlbExheW91dCB9IGZyb20gJy4uLy4uL2Zvcm0tZ3JvdXAvY29uc3RhbnRzJztcbmltcG9ydCB7IEZkcEZvcm1Hcm91cE1vZHVsZSB9IGZyb20gJy4uLy4uL2Zvcm0tZ3JvdXAvZmRwLWZvcm0ubW9kdWxlJztcbmltcG9ydCB7IGRlZmF1bHRGb3JtR2VuZXJhdG9ySGludE9wdGlvbnMgfSBmcm9tICcuLi9jb25maWcvZGVmYXVsdC1mb3JtLWdlbmVyYXRvci1oaW50LW9wdGlvbnMnO1xuaW1wb3J0IHtcbiAgICBEeW5hbWljRm9ybUNvbnRyb2wsXG4gICAgRHluYW1pY0Zvcm1Db250cm9sR3JvdXAsXG4gICAgRHluYW1pY0Zvcm1Hcm91cENvbnRyb2wsXG4gICAgRHluYW1pY0Zvcm1Hcm91cENvbnRyb2xzXG59IGZyb20gJy4uL2R5bmFtaWMtZm9ybS1jb250cm9sJztcbmltcG9ydCB7IER5bmFtaWNGb3JtQ29udHJvbEZpZWxkRGlyZWN0aXZlIH0gZnJvbSAnLi4vZHluYW1pYy1mb3JtLWNvbnRyb2wtZmllbGQuZGlyZWN0aXZlJztcbmltcG9ydCB7IEZvcm1HZW5lcmF0b3JTZXJ2aWNlIH0gZnJvbSAnLi4vZm9ybS1nZW5lcmF0b3Iuc2VydmljZSc7XG5pbXBvcnQgeyBGRFBfRk9STV9HRU5FUkFUT1JfREVGQVVMVF9ISU5UX09QVElPTlMgfSBmcm9tICcuLi9mb3JtLWdlbmVyYXRvci50b2tlbnMnO1xuaW1wb3J0IHsgZ2V0UGFyZW50SXRlbSwgaXNGb3JtRmllbGRJdGVtLCBtYXBGb3JtSXRlbXMsIHRyYW5zZm9ybUZvcm1JdGVtIH0gZnJvbSAnLi4vaGVscGVycyc7XG5pbXBvcnQgeyBEeW5hbWljRm9ybUdyb3VwIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9keW5hbWljLWZvcm0tZ3JvdXAnO1xuaW1wb3J0IHtcbiAgICBEeW5hbWljRm9ybUl0ZW0sXG4gICAgRHluYW1pY0Zvcm1JdGVtTWFwLFxuICAgIER5bmFtaWNGb3JtSXRlbVZhbGlkYXRpb25PYmplY3QsXG4gICAgRHluYW1pY0Zvcm1WYWx1ZVxufSBmcm9tICcuLi9pbnRlcmZhY2VzL2R5bmFtaWMtZm9ybS1pdGVtJztcbmltcG9ydCB7IEdldEhpbnRPcHRpb25zUGlwZSB9IGZyb20gJy4uL3BpcGVzL2dldC1oaW50LW9wdGlvbnMucGlwZSc7XG5pbXBvcnQgeyBHZXRPcmRlcmVkRmllbGRDb250cm9sc1BpcGUgfSBmcm9tICcuLi9waXBlcy9nZXQtb3JkZXJlZC1mb3JtLWNvbnRyb2xzLnBpcGUnO1xuXG5sZXQgZm9ybVVuaXF1ZUlkID0gMDtcblxuZXhwb3J0IHR5cGUgRm9ybUdlbmVyYXRvckFjY2VwdGFibGVJdGVtcyA9IER5bmFtaWNGb3JtSXRlbVtdIHwgT2JzZXJ2YWJsZTxEeW5hbWljRm9ybUl0ZW1bXT47XG5cbmV4cG9ydCBjb25zdCBGRFBfRk9STV9JR05PUkVEX1NUQVRVU0VTOiBGb3JtQ29udHJvbFN0YXR1c1tdID0gWydJTlZBTElEJywgJ1BFTkRJTkcnLCAnRElTQUJMRUQnXTtcblxuZXhwb3J0IGludGVyZmFjZSBTdWJtaXRGb3JtRXZlbnRSZXN1bHQge1xuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvbiBJbmRpY2F0b3IgaWYgdmFsaWRhdGlvbiBoYXMgYmVlbiBwYXNzZWQuXG4gICAgICovXG4gICAgc3VjY2VzczogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb24gRm9ybWF0dGVkIGZvcm0gdmFsdWUuXG4gICAgICovXG4gICAgdmFsdWU6IER5bmFtaWNGb3JtVmFsdWUgfCBudWxsO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBGb3JtIEdlbmVyYXRvciBjb21wb25lbnQgcmVwcmVzZW50cyBhIGhpZ2gtbGV2ZWwgY29tcG9uZW50XG4gKiB3aGljaCBpbmNsdWRlcyBAc2VlIEZvcm1Hcm91cCBpbnNpZGUuXG4gKi9cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnZmRwLWZvcm0tZ2VuZXJhdG9yJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vZm9ybS1nZW5lcmF0b3IuY29tcG9uZW50Lmh0bWwnLFxuICAgIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICAgIHByb3ZpZGU6IEZEUF9ET19DSEVDSyxcbiAgICAgICAgICAgIHVzZUZhY3Rvcnk6IChmb3JtR2VuZXJhdG9yOiBGb3JtR2VuZXJhdG9yQ29tcG9uZW50KSA9PiBmb3JtR2VuZXJhdG9yLmRvQ2hlY2skLFxuICAgICAgICAgICAgZGVwczogW0Zvcm1HZW5lcmF0b3JDb21wb25lbnRdXG4gICAgICAgIH1cbiAgICBdLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaW1wb3J0czogW1xuICAgICAgICBCdXN5SW5kaWNhdG9yTW9kdWxlLFxuICAgICAgICBGZHBGb3JtR3JvdXBNb2R1bGUsXG4gICAgICAgIEZvcm1zTW9kdWxlLFxuICAgICAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgICAgICBOZ1RlbXBsYXRlT3V0bGV0LFxuICAgICAgICBEeW5hbWljRm9ybUNvbnRyb2xGaWVsZERpcmVjdGl2ZSxcbiAgICAgICAgRm9ybUdlbmVyYXRvckZpZWxkQ29tcG9uZW50LFxuICAgICAgICBTa2VsZXRvbkNvbXBvbmVudCxcbiAgICAgICAgR2V0T3JkZXJlZEZpZWxkQ29udHJvbHNQaXBlLFxuICAgICAgICBHZXRIaW50T3B0aW9uc1BpcGVcbiAgICBdXG59KVxuZXhwb3J0IGNsYXNzIEZvcm1HZW5lcmF0b3JDb21wb25lbnQgaW1wbGVtZW50cyBPbkRlc3Ryb3ksIE9uQ2hhbmdlcyB7XG4gICAgLyoqIEBkZXNjcmlwdGlvbiBVbmlxdWUgZm9ybSBuYW1lICovXG4gICAgQElucHV0KClcbiAgICBmb3JtTmFtZSA9IGBmZHAtZm9ybS1nZW5lcmF0b3ItJHtmb3JtVW5pcXVlSWQrK31gO1xuXG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIExpc3Qgb2YgQHNlZSBEeW5hbWljRm9ybUl0ZW0gcmVwcmVzZW50aW5nIHRoZSBsaXN0IG9mIGl0ZW1zXG4gICAgICogdG8gYmUgcmVuZGVyZWQgaW4gdGhlIGZvcm0uXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBzZXQgZm9ybUl0ZW1zKGZvcm1JdGVtczogRm9ybUdlbmVyYXRvckFjY2VwdGFibGVJdGVtcykge1xuICAgICAgICBpZiAoIWZvcm1JdGVtcykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9ybUl0ZW1zID0gaXNPYnNlcnZhYmxlKGZvcm1JdGVtcykgPyBmb3JtSXRlbXMgOiBvZihmb3JtSXRlbXMpO1xuXG4gICAgICAgIHRoaXMuX29uRm9ybUl0ZW1zQ2hhbmdlKGZvcm1JdGVtcyk7XG4gICAgfVxuICAgIGdldCBmb3JtSXRlbXMoKTogRm9ybUdlbmVyYXRvckFjY2VwdGFibGVJdGVtcyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9mb3JtSXRlbXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIEZvcm0gbWFpbiB0aXRsZS5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIG1haW5UaXRsZTogTnVsbGFibGU8c3RyaW5nPjtcblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdG8gaGlkZSBtYWluIHRpdGxlLiBEZWZhdWx0IGlzIGZhbHNlLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgaGlkZU1haW5USXRsZSA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uXG4gICAgICogSGludCBmb3IgdGhlIG1haW4gdGl0bGVcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIGhpbnQ6IEhpbnRJbnB1dDtcblxuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvbiBTcGVjaWZ5IHRoZSBjb2x1bW4gbGF5b3V0IGluIHRoZSBmb3JtYXQgYFhMbi1Mbi1Nbi1TbmBcbiAgICAgKiB3aGVyZSBuIGlzIHRoZSBudW1iZXIgb2YgY29sdW1ucyBhbmQgY2FuIGJlIGRpZmZlcmVudCBmb3IgZWFjaCBzaXplLlxuICAgICAqIGVnOiBYTDItTDItTTItUzEgd291bGQgY3JlYXRlIDItY29sdW1uIGxheW91dHMgZm9yIFhMLCBMLFxuICAgICAqIGFuZCBNIHNpemVzIGFuZCBzaW5nbGUtY29sdW1uIGxheW91dCBmb3IgUyBzaXplLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgY29sdW1uTGF5b3V0OiBOdWxsYWJsZTxzdHJpbmc+O1xuXG4gICAgLyoqXG4gICAgICogRGVmaW5lcyBsYWJlbCdzIGNvbHVtbiBsYXlvdXQuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBsYWJlbENvbHVtbkxheW91dDogQ29sdW1uTGF5b3V0ID0gRGVmYXVsdFZlcnRpY2FsTGFiZWxMYXlvdXQ7XG5cbiAgICAvKipcbiAgICAgKiBEZWZpbmVzIGZpZWxkJ3MgY29sdW1uIGxheW91dC5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIGZpZWxkQ29sdW1uTGF5b3V0OiBDb2x1bW5MYXlvdXQgPSBEZWZhdWx0VmVydGljYWxGaWVsZExheW91dDtcblxuICAgIC8qKlxuICAgICAqIERlZmluZXMgZ2FwIGNvbHVtbiBsYXlvdXQuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBnYXBDb2x1bW5MYXlvdXQ6IENvbHVtbkxheW91dCA9IERlZmF1bHRHYXBMYXlvdXQ7XG5cbiAgICAvKiogV2hldGhlciBhbGwgZm9ybSBpdGVtcyBzaG91bGQgaGF2ZSBpZGVudGljYWwgbGF5b3V0IHByb3ZpZGVkIGZvciBmb3JtIGdyb3VwLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgdW5pZmllZExheW91dCA9IHRydWU7XG5cbiAgICAvKiogSW5saW5lIGNvbHVtbiBsYXlvdXQgKi9cbiAgICBASW5wdXQoKVxuICAgIGlubGluZUNvbHVtbkxheW91dDogQ29sdW1uTGF5b3V0ID0gRGVmYXVsdFZlcnRpY2FsRmllbGRMYXlvdXQ7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogUmVtb3ZlcyBleHRyYSBlbXB0eSByb3cuXG4gICAgICogVE9ETzogcmVtb3ZlIGFmdGVyICM3NTMzIGhhcyBiZWVuIGZpeGVkLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgbm9BZGRpdGlvbmFsQ29udGVudCA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIEV2ZW50IHdoaWNoIG5vdGlmaWVzIHBhcmVudCBjb21wb25lbnQgdGhhdCB0aGUgZm9ybSBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgY3JlYXRlZFxuICAgICAqIGFuZCBhbGwgY29udHJvbHMgYXJlIGluIHBsYWNlLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIGZvcm1DcmVhdGVkID0gbmV3IEV2ZW50RW1pdHRlcjxEeW5hbWljRm9ybUdyb3VwPigpO1xuXG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIEV2ZW50IHdoaWNoIG5vdGlmaWVzIHBhcmVudCBjb21wb25lbnQgdGhhdCB0aGUgZm9ybSBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgdmFsaWRhdGVkXG4gICAgICogYW5kIHN1Ym1pdHRlZC4gQ29udGFpbnMgZm9ybVxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIGZvcm1TdWJtaXR0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPER5bmFtaWNGb3JtVmFsdWU+KCk7XG5cbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb24gRXZlbnQgd2hpY2ggbm90aWZpZXMgcGFyZW50IGNvbXBvbmVudCB0aGF0IHRoZSBmb3JtIHdhcyBzdWJtaXR0ZWQuXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgZm9ybVN1Ym1pdHRlZFN0YXR1cyA9IG5ldyBFdmVudEVtaXR0ZXI8U3VibWl0Rm9ybUV2ZW50UmVzdWx0PigpO1xuXG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIFJlcHJlc2VudHMgdGhlIGZvcm0gaW5zdGFuY2UuIEBzZWUgTmdGb3JtXG4gICAgICovXG4gICAgQFZpZXdDaGlsZChOZ0Zvcm0pXG4gICAgbmdGb3JtOiBOZ0Zvcm07XG5cbiAgICAvKiogSW5uZXIgZm9ybSBncm91cCBkaXJlY3RpdmUuICovXG4gICAgQFZpZXdDaGlsZChGb3JtR3JvdXBEaXJlY3RpdmUpXG4gICAgZm9ybUdyb3VwOiBGb3JtR3JvdXBEaXJlY3RpdmU7XG5cbiAgICAvKiogSW5uZXIgZm9ybSBmaWVsZHMgKi9cbiAgICBAVmlld0NoaWxkcmVuKEZvcm1HZW5lcmF0b3JGaWVsZENvbXBvbmVudClcbiAgICBmaWVsZHM6IFF1ZXJ5TGlzdDxGb3JtR2VuZXJhdG9yRmllbGRDb21wb25lbnQ+O1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBkb0NoZWNrJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgICAvKiogQXJyYXkgb2YgZm9ybSBmaWVsZCBjb250cm9scy4gKi9cbiAgICBnZXQgZm9ybUZpZWxkcygpOiBQbGF0Zm9ybUZvcm1GaWVsZENvbnRyb2xbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZpZWxkc1xuICAgICAgICAgICAgPy50b0FycmF5KClcbiAgICAgICAgICAgIC5maWx0ZXIoKGZpZWxkKSA9PiAhIWZpZWxkLmZpZWxkUmVuZGVyZXI/LmNvbnRyb2wpXG4gICAgICAgICAgICAubWFwKChmaWVsZCkgPT4gZmllbGQuZmllbGRSZW5kZXJlci5jb250cm9sISk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIER5bmFtaWNhbGx5IGdlbmVyYXRlZCBmb3JtLiBAc2VlIEZvcm1HZW5lcmF0b3JTZXJ2aWNlXG4gICAgICovXG4gICAgZm9ybTogRHluYW1pY0Zvcm1Hcm91cDtcbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb24gTGlzdCBvZiB0aGUgZm9ybSBjb250cm9scy5cbiAgICAgKi9cbiAgICBmb3JtQ29udHJvbEl0ZW1zOiBEeW5hbWljRm9ybUdyb3VwQ29udHJvbFtdO1xuXG4gICAgLyoqXG4gICAgICogU2V0IG9mIGZsYWdzIHJlcHJlc2VudGluZyBpZiBwYXJ0aWN1bGFyIGZvcm0gaXRlbSBzaG91bGQgYmUgdmlzaWJsZSB0byB0aGUgdXNlci5cbiAgICAgKi9cbiAgICBzaG91bGRTaG93RmllbGRzOiB7IFtrZXk6IHN0cmluZ106IGJvb2xlYW4gfSA9IHt9O1xuXG4gICAgLyoqXG4gICAgICogRmxhZyByZXByZXNlbnRpbmcgdGhhdCBmb3JtIGlzIGxvYWRpbmdcbiAgICAgKi9cbiAgICBmb3JtTG9hZGluZyA9IHRydWU7XG5cbiAgICAvKipcbiAgICAgKiBTdHJlYW0gb2YgZm9ybSBsb2FkaW5nIHN0YXRlLlxuICAgICAqL1xuICAgIGxvYWRpbmckID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPih0aGlzLmZvcm1Mb2FkaW5nKTtcblxuICAgIC8qKlxuICAgICAqIFN0cmVhbSBvZiBsYXN0IGZvcm0gc3VibWlzc2lvbiBzdGF0dXMuXG4gICAgICovXG4gICAgZm9ybVN1Ym1pdHRlZFN0YXR1cyQgPSBuZXcgU3ViamVjdDxTdWJtaXRGb3JtRXZlbnRSZXN1bHQ+KCk7XG5cbiAgICAvKipcbiAgICAgKiBTdHJlYW0gb2YgbGFzdCBmb3JtIHN1Ym1pc3Npb24gdmFsdWUuXG4gICAgICovXG4gICAgZm9ybVZhbHVlJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8RHluYW1pY0Zvcm1WYWx1ZT4oe30pO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIFRvIGRpZmZlcmVudGlhdGUgYmV0d2VlbiBmaXJzdCBsb2FkaW5nIHdoZW4gc2tlbGV0b25zIGJlIHNob3duIGFuZCBzdWJzZXF1ZW50IGxvYWRpbmdzIHdoZW4gYnVzeSBpbmRpY2F0b3IgYmUgc2hvd25cbiAgICAgKi9cbiAgICBfZmlyc3RMb2FkaW5nRG9uZSA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIGhpbnRPcHRpb25zOiBIaW50T3B0aW9ucztcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgX2Vycm9yTW9kZWxzOiB7IHR5cGU6IHN0cmluZzsgdmFsdWU6IGFueSB9W10gPSBbXTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9mb3JtSXRlbXM6IEZvcm1HZW5lcmF0b3JBY2NlcHRhYmxlSXRlbXM7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfZm9ybVZhbHVlU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX3JlZnJlc2gkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBBbiBSeEpTIFN1YmplY3QgdGhhdCB3aWxsIGtpbGwgdGhlIGRhdGEgc3RyZWFtIHVwb24gY29tcG9uZW504oCZcyBkZXN0cnVjdGlvbiAoZm9yIHVuc3Vic2NyaWJpbmcpXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBfZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBfZGVmYXVsdEhpbnRPcHRpb25zOiBGaWVsZEhpbnRPcHRpb25zO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9uZ1N1Ym1pdFN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uIHwgdW5kZWZpbmVkO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9tYXBwZWRGb3JtaXRlbXM6IE1hcDxzdHJpbmcsIER5bmFtaWNGb3JtSXRlbU1hcD4gPSBuZXcgTWFwKCk7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIF9mZ1NlcnZpY2U6IEZvcm1HZW5lcmF0b3JTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIF9jZDogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgICAgIEBJbmplY3QoRkRQX0ZPUk1fR0VORVJBVE9SX0RFRkFVTFRfSElOVF9PUFRJT05TKSBfcHJvdmlkZWRIaW50T3B0aW9uczogRmllbGRIaW50T3B0aW9uc1xuICAgICkge1xuICAgICAgICB0aGlzLl9kZWZhdWx0SGludE9wdGlvbnMgPSB7XG4gICAgICAgICAgICAuLi5kZWZhdWx0Rm9ybUdlbmVyYXRvckhpbnRPcHRpb25zLFxuICAgICAgICAgICAgLi4uX3Byb3ZpZGVkSGludE9wdGlvbnNcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLl9lcnJvck1vZGVscyA9IHRoaXMuX2dldEVycm9ycygpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgICAgICBpZiAoY2hhbmdlcy5oaW50KSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMuaGludCA9PT0gJ3N0cmluZycgfHwgdGhpcy5oaW50IGluc3RhbmNlb2YgVGVtcGxhdGVSZWYpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhpbnRPcHRpb25zID0ge1xuICAgICAgICAgICAgICAgICAgICAuLi50aGlzLl9kZWZhdWx0SGludE9wdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6IHRoaXMuaGludFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuaGludE9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgICAgIC4uLnRoaXMuX2RlZmF1bHRIaW50T3B0aW9ucyxcbiAgICAgICAgICAgICAgICAgICAgLi4udGhpcy5oaW50XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fbmdTdWJtaXRTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVmcmVzaGVzIGZvcm0gaXRlbXMgdmlzaWJpbGl0eSB3aXRoICd3aGVuJyBjb25kaXRpb24uXG4gICAgICovXG4gICAgYXN5bmMgcmVmcmVzaFN0ZXBzVmlzaWJpbGl0eSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5zaG91bGRTaG93RmllbGRzID0gYXdhaXQgdGhpcy5fZmdTZXJ2aWNlLmNoZWNrVmlzaWJsZUZvcm1JdGVtcyh0aGlzLmZvcm0pO1xuICAgICAgICB0aGlzLl9jZC5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgYXN5bmMgX29uU3VibWl0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLmZvcm0ubWFya0FsbEFzVG91Y2hlZCgpO1xuICAgICAgICB0aGlzLl9jZC5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIHRoaXMuZG9DaGVjayQubmV4dCgpO1xuXG4gICAgICAgIGNvbnN0IGZvcm1WYWx1ZSA9IGF3YWl0IHRoaXMuX2ZnU2VydmljZS5nZXRGb3JtVmFsdWUodGhpcy5mb3JtKTtcblxuICAgICAgICB0aGlzLmZvcm1TdWJtaXR0ZWRTdGF0dXMuZW1pdCh7IHN1Y2Nlc3M6ICF0aGlzLmZvcm0uaW52YWxpZCwgdmFsdWU6IGZvcm1WYWx1ZSB9KTtcbiAgICAgICAgdGhpcy5mb3JtU3VibWl0dGVkU3RhdHVzJC5uZXh0KHsgc3VjY2VzczogIXRoaXMuZm9ybS5pbnZhbGlkLCB2YWx1ZTogZm9ybVZhbHVlIH0pO1xuXG4gICAgICAgIGlmICh0aGlzLmZvcm0uaW52YWxpZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZm9ybVN1Ym1pdHRlZC5lbWl0KGZvcm1WYWx1ZSk7XG4gICAgICAgIHRoaXMuZm9ybVZhbHVlJC5uZXh0KGZvcm1WYWx1ZSk7XG5cbiAgICAgICAgdGhpcy5mb3JtLm1hcmtBc1ByaXN0aW5lKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyBuZXcgY29udHJvbCB0byBhbiBleGlzdGluZyBmb3JtLlxuICAgICAqIEBwYXJhbSBjb250cm9sIENvbnRyb2wgY29uZmlndXJhdGlvbiB0byBhZGQuXG4gICAgICogQHBhcmFtIHBhdGggUGF0aCBvZiB0aGUgY29udHJvbC5cbiAgICAgKi9cbiAgICBhc3luYyBhZGRDb250cm9sKGNvbnRyb2w6IER5bmFtaWNGb3JtSXRlbSwgcGF0aD86IHN0cmluZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMuX2FkZENvbnRyb2xUb0Zvcm1JdGVtcyhjb250cm9sLCBwYXRoKTtcbiAgICAgICAgdGhpcy5fZmdTZXJ2aWNlLmFkZENvbnRyb2woY29udHJvbCwgdGhpcy5mb3JtLCBwYXRoKTtcblxuICAgICAgICB0aGlzLmZvcm1Db250cm9sSXRlbXMgPSB0aGlzLl9nZXRPcmRlcmVkQ29udHJvbHModGhpcy5mb3JtLmNvbnRyb2xzKTtcblxuICAgICAgICB0aGlzLnNob3VsZFNob3dGaWVsZHMgPSBhd2FpdCB0aGlzLl9mZ1NlcnZpY2UuY2hlY2tWaXNpYmxlRm9ybUl0ZW1zKHRoaXMuZm9ybSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyB0aGUgY29udHJvbCB3aXRoIHRoZSBnaXZlbiBuYW1lIGJ5IHRoZSBnaXZlbiBwYXRoLlxuICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIGNvbnRyb2wuXG4gICAgICogQHBhcmFtIHBhdGggUGF0aCBvZiB0aGUgY29udHJvbC5cbiAgICAgKi9cbiAgICBhc3luYyByZW1vdmVDb250cm9sKG5hbWU6IHN0cmluZywgcGF0aDogc3RyaW5nW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5fcmVtb3ZlQ29udHJvbEZyb21JdGVtcyhuYW1lLCBwYXRoKTtcbiAgICAgICAgdGhpcy5fZmdTZXJ2aWNlLnJlbW92ZUNvbnRyb2wobmFtZSwgdGhpcy5mb3JtLCBwYXRoKTtcbiAgICAgICAgdGhpcy5mb3JtQ29udHJvbEl0ZW1zID0gdGhpcy5fZ2V0T3JkZXJlZENvbnRyb2xzKHRoaXMuZm9ybS5jb250cm9scyk7XG5cbiAgICAgICAgdGhpcy5zaG91bGRTaG93RmllbGRzID0gYXdhaXQgdGhpcy5fZmdTZXJ2aWNlLmNoZWNrVmlzaWJsZUZvcm1JdGVtcyh0aGlzLmZvcm0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIF90cmFja0ZuKGluZGV4OiBudW1iZXIsIHZhbHVlOiBEeW5hbWljRm9ybUdyb3VwQ29udHJvbCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBgJHtpbmRleH1fJHt2YWx1ZS5mb3JtSXRlbS5uYW1lfWA7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBfZ3JvdXBUcmFja0ZuKGluZGV4OiBudW1iZXIsIHZhbHVlOiBEeW5hbWljRm9ybUdyb3VwQ29udHJvbCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiAodmFsdWUgYXMgRHluYW1pY0Zvcm1Db250cm9sR3JvdXApLmZvcm1JdGVtLm5hbWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAZGVzY3JpcHRpb24gUHJvZ3JhbW1hdGljYWxseSBzdWJtaXQgZm9ybS5cbiAgICAgKiBUaGlzIG1ldGhvZCBhbHNvIGNhbGxzIHZhbGlkYXRpb24gZm9yIHRoZSBmb3JtIGl0ZW1zLlxuICAgICAqL1xuICAgIHN1Ym1pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5mb3JtR3JvdXAub25TdWJtaXQobmV3IEV2ZW50KCdzdWJtaXQnKSk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBfaXNBZHZhbmNlZEVycm9yKGVycm9yOiBhbnkpOiBlcnJvciBpcyBEeW5hbWljRm9ybUl0ZW1WYWxpZGF0aW9uT2JqZWN0IHtcbiAgICAgICAgcmV0dXJuIGVycm9yLmhlYWRpbmcgJiYgZXJyb3IuZGVzY3JpcHRpb24gJiYgZXJyb3IudHlwZTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIF9lcnJvcnNUcmFja0J5KF86IG51bWJlciwgZXJyb3I6IHsgdHlwZTogc3RyaW5nOyB2YWx1ZTogYW55IH0pOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gZXJyb3IudHlwZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJpdmF0ZSBhc3luYyBfZ2VuZXJhdGVGb3JtKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLmZvcm1Mb2FkaW5nID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5sb2FkaW5nJC5uZXh0KHRoaXMuZm9ybUxvYWRpbmcpO1xuXG4gICAgICAgIGNvbnN0IGZvcm0gPSBhd2FpdCB0aGlzLl9mZ1NlcnZpY2UuZ2VuZXJhdGVGb3JtKHRoaXMuZm9ybU5hbWUsIHRoaXMuX21hcHBlZEZvcm1pdGVtcyk7XG5cbiAgICAgICAgdGhpcy5fZm9ybVZhbHVlU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuXG4gICAgICAgIHRoaXMuZm9ybSA9IGZvcm07XG5cbiAgICAgICAgdGhpcy5mb3JtQ29udHJvbEl0ZW1zID0gdGhpcy5fZ2V0T3JkZXJlZENvbnRyb2xzKGZvcm0uY29udHJvbHMpO1xuXG4gICAgICAgIHRoaXMuc2hvdWxkU2hvd0ZpZWxkcyA9IGF3YWl0IHRoaXMuX2ZnU2VydmljZS5jaGVja1Zpc2libGVGb3JtSXRlbXModGhpcy5mb3JtKTtcblxuICAgICAgICB0aGlzLl9mb3JtVmFsdWVTdWJzY3JpcHRpb24gPSB0aGlzLmZvcm0udmFsdWVDaGFuZ2VzXG4gICAgICAgICAgICAucGlwZShkZWJvdW5jZVRpbWUoNTApLCB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5fZGVzdHJveVJlZikpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNob3VsZFNob3dGaWVsZHMgPSBhd2FpdCB0aGlzLl9mZ1NlcnZpY2UuY2hlY2tWaXNpYmxlRm9ybUl0ZW1zKHRoaXMuZm9ybSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fY2QubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmZvcm1Mb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2ZpcnN0TG9hZGluZ0RvbmUgPSB0cnVlO1xuXG4gICAgICAgIHRoaXMuX2NkLmRldGVjdENoYW5nZXMoKTtcblxuICAgICAgICB0aGlzLmZvcm1DcmVhdGVkLmVtaXQodGhpcy5mb3JtKTtcbiAgICAgICAgdGhpcy5sb2FkaW5nJC5uZXh0KHRoaXMuZm9ybUxvYWRpbmcpO1xuXG4gICAgICAgIGlmICghdGhpcy5mb3JtR3JvdXApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2xpc3RlblRvU3VibWl0KCk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9nZXRPcmRlcmVkQ29udHJvbHMoY29udHJvbHM6IER5bmFtaWNGb3JtR3JvdXBDb250cm9scyk6IChEeW5hbWljRm9ybUNvbnRyb2wgfCBEeW5hbWljRm9ybUNvbnRyb2xHcm91cClbXSB7XG4gICAgICAgIHJldHVybiBPYmplY3QudmFsdWVzKGNvbnRyb2xzKS5zb3J0KFxuICAgICAgICAgICAgKGEsIGIpID0+IChhLmZvcm1JdGVtPy5yYW5rID8/IC1JbmZpbml0eSkgLSAoYi5mb3JtSXRlbT8ucmFuayA/PyAtSW5maW5pdHkpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9nZXRFcnJvcnMoKTogeyB0eXBlOiBzdHJpbmc7IHZhbHVlOiBhbnkgfVtdIHtcbiAgICAgICAgY29uc3QgcmV0dXJuRXJyb3JzOiB7IHR5cGU6IHN0cmluZzsgdmFsdWU6IGFueSB9W10gPSBbXTtcbiAgICAgICAgY29uc3QgcmVnaXN0ZXJlZEVycm9ycyA9IHRoaXMuX2ZnU2VydmljZS52YWxpZGF0aW9uRXJyb3JIaW50cztcbiAgICAgICAgT2JqZWN0LmVudHJpZXMocmVnaXN0ZXJlZEVycm9ycykuZm9yRWFjaCgodHlwZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgW2Vycm9yVHlwZSwgZXJyb3JWYWx1ZV0gPSB0eXBlO1xuXG4gICAgICAgICAgICByZXR1cm5FcnJvcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgdHlwZTogZXJyb3JUeXBlLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBlcnJvclZhbHVlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHJldHVybkVycm9ycztcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX2xpc3RlblRvU3VibWl0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9uZ1N1Ym1pdFN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgdGhpcy5fbmdTdWJtaXRTdWJzY3JpcHRpb24gPSB0aGlzLmZvcm1Hcm91cC5uZ1N1Ym1pdFxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgc3dpdGNoTWFwKCgpID0+XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybUdyb3VwLnN0YXR1c0NoYW5nZXMhLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFydFdpdGgodGhpcy5mb3JtR3JvdXAuc3RhdHVzKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcigoc3RhdHVzOiBGb3JtQ29udHJvbFN0YXR1cykgPT4gc3RhdHVzICE9PSAnUEVORElORycpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGFrZSgxKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLl9kZXN0cm95UmVmKVxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnN1YnNjcmliZShhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fb25TdWJtaXQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9saXN0ZW5Ub1N1Ym1pdCgpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9vbkZvcm1JdGVtc0NoYW5nZShpdGVtczogT2JzZXJ2YWJsZTxEeW5hbWljRm9ybUl0ZW1bXT4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fcmVmcmVzaCQubmV4dCgpO1xuICAgICAgICB0aGlzLl9yZWZyZXNoJC5jb21wbGV0ZSgpO1xuXG4gICAgICAgIHRoaXMuX3JlZnJlc2gkID0gbmV3IFN1YmplY3QoKTtcblxuICAgICAgICBpdGVtcy5waXBlKHRha2VVbnRpbChtZXJnZSh0aGlzLl9yZWZyZXNoJCwgZGVzdHJveU9ic2VydmFibGUodGhpcy5fZGVzdHJveVJlZikpKSkuc3Vic2NyaWJlKChmb3JtSXRlbXMpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX21hcHBlZEZvcm1pdGVtcyA9IG1hcEZvcm1JdGVtcyhmb3JtSXRlbXMpO1xuICAgICAgICAgICAgdGhpcy5fZ2VuZXJhdGVGb3JtKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfYXBwbHlSYW5rKGl0ZW1zOiBEeW5hbWljRm9ybUl0ZW1bXSk6IER5bmFtaWNGb3JtSXRlbVtdIHtcbiAgICAgICAgaXRlbXMgPSBpdGVtcy5tYXAoKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBpdGVtLnJhbmsgPSBpdGVtLnJhbmsgfHwgaW5kZXg7XG4gICAgICAgICAgICBpZiAoaXRlbS5pdGVtcykge1xuICAgICAgICAgICAgICAgIGl0ZW0uaXRlbXMgPSB0aGlzLl9hcHBseVJhbmsoaXRlbS5pdGVtcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gaXRlbTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGl0ZW1zO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfYWRkQ29udHJvbFRvRm9ybUl0ZW1zKGl0ZW06IER5bmFtaWNGb3JtSXRlbSwgcGF0aD86IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgICAgIGlmICghcGF0aCkge1xuICAgICAgICAgICAgdGhpcy5fbWFwcGVkRm9ybWl0ZW1zLnNldChpdGVtLm5hbWUsIHRyYW5zZm9ybUZvcm1JdGVtKGl0ZW0sIHRoaXMuX21hcHBlZEZvcm1pdGVtcy5zaXplKSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwYXJlbnRJdGVtID0gZ2V0UGFyZW50SXRlbShwYXRoLCB0aGlzLl9tYXBwZWRGb3JtaXRlbXMpO1xuXG4gICAgICAgIGlmICghcGFyZW50SXRlbSB8fCBpc0Zvcm1GaWVsZEl0ZW0ocGFyZW50SXRlbSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHBhcmVudEl0ZW0uaXRlbXMgPSBwYXJlbnRJdGVtLml0ZW1zIHx8IG5ldyBNYXAoKTtcbiAgICAgICAgcGFyZW50SXRlbS5pdGVtcy5zZXQoaXRlbS5uYW1lLCB0cmFuc2Zvcm1Gb3JtSXRlbShpdGVtLCBwYXJlbnRJdGVtLml0ZW1zLnNpemUpKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX3JlbW92ZUNvbnRyb2xGcm9tSXRlbXMobmFtZTogc3RyaW5nLCBwYXRoPzogc3RyaW5nW10pOiB2b2lkIHtcbiAgICAgICAgaWYgKCFwYXRoKSB7XG4gICAgICAgICAgICB0aGlzLl9tYXBwZWRGb3JtaXRlbXMuZGVsZXRlKG5hbWUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGFyZW50SXRlbSA9IGdldFBhcmVudEl0ZW0ocGF0aCwgdGhpcy5fbWFwcGVkRm9ybWl0ZW1zKTtcblxuICAgICAgICBpZiAoIXBhcmVudEl0ZW0gfHwgaXNGb3JtRmllbGRJdGVtKHBhcmVudEl0ZW0pKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBwYXJlbnRJdGVtLml0ZW1zPy5kZWxldGUobmFtZSk7XG4gICAgfVxufVxuIiwiQGlmIChfZmlyc3RMb2FkaW5nRG9uZSkge1xuICAgIDxmZC1idXN5LWluZGljYXRvciBbbG9hZGluZ109XCJmb3JtTG9hZGluZ1wiIFtibG9ja109XCJ0cnVlXCI+XG4gICAgICAgIEBpZiAoZm9ybSkge1xuICAgICAgICAgICAgPGZkcC1mb3JtLWdyb3VwXG4gICAgICAgICAgICAgICAgW2hpbnRdPVwiaGludFwiXG4gICAgICAgICAgICAgICAgW21haW5UaXRsZV09XCJtYWluVGl0bGVcIlxuICAgICAgICAgICAgICAgIFtoaWRlTWFpblRJdGxlXT1cImhpZGVNYWluVEl0bGVcIlxuICAgICAgICAgICAgICAgIFtmb3JtR3JvdXBdPVwiZm9ybVwiXG4gICAgICAgICAgICAgICAgW2NvbHVtbkxheW91dF09XCJjb2x1bW5MYXlvdXRcIlxuICAgICAgICAgICAgICAgIFtsYWJlbENvbHVtbkxheW91dF09XCJsYWJlbENvbHVtbkxheW91dFwiXG4gICAgICAgICAgICAgICAgW2ZpZWxkQ29sdW1uTGF5b3V0XT1cImZpZWxkQ29sdW1uTGF5b3V0XCJcbiAgICAgICAgICAgICAgICBbZ2FwQ29sdW1uTGF5b3V0XT1cImdhcENvbHVtbkxheW91dFwiXG4gICAgICAgICAgICAgICAgW3VuaWZpZWRMYXlvdXRdPVwidW5pZmllZExheW91dFwiXG4gICAgICAgICAgICAgICAgW2lubGluZUNvbHVtbkxheW91dF09XCJpbmxpbmVDb2x1bW5MYXlvdXRcIlxuICAgICAgICAgICAgICAgIFt1c2VGb3JtXT1cInRydWVcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIEBmb3IgKGVycm9yIG9mIF9lcnJvck1vZGVsczsgdHJhY2sgX2Vycm9yc1RyYWNrQnkoJGluZGV4LCBlcnJvcikpIHtcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gKmZkcEZvcm1GaWVsZEVycm9yPVwiZXJyb3IudHlwZTsgbGV0IGRpcmVjdGl2ZUVycm9yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYgKF9pc0FkdmFuY2VkRXJyb3IoZGlyZWN0aXZlRXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChkaXJlY3RpdmVFcnJvci5oZWFkaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpmZHBGb3JtRmllbGRFcnJvckhlYWRpbmc9XCJsZXQgdmFsaWRhdGlvbkVycm9yOyB0eXBlOiBkaXJlY3RpdmVFcnJvci50eXBlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyB2YWxpZGF0aW9uRXJyb3IuaGVhZGluZyB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoZGlyZWN0aXZlRXJyb3IuZGVzY3JpcHRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKmZkcEZvcm1GaWVsZEVycm9yRGVzY3JpcHRpb249XCJsZXQgdmFsaWRhdGlvbkVycm9yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyB2YWxpZGF0aW9uRXJyb3IuZGVzY3JpcHRpb24gfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpmZHBGb3JtRmllbGRFcnJvckhlYWRpbmc9XCJsZXQgdmFsaWRhdGlvbkVycm9yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGVycm9yLnZhbHVlID8gZXJyb3IudmFsdWUgOiB2YWxpZGF0aW9uRXJyb3IgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgQGZvciAoZmllbGQgb2YgZm9ybUNvbnRyb2xJdGVtczsgdHJhY2sgX3RyYWNrRm4oJGluZGV4LCBmaWVsZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJmaWVsZC50eXBlID09PSAnZmllbGQnID8gZmllbGRSZW5kZXJlciA6IGdyb3VwUmVuZGVyZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZDogZmllbGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUZpZWxkTmFtZTogZmllbGQuZm9ybUl0ZW0ubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5rOiBmaWVsZC5mb3JtSXRlbT8ucmFuayB8fCAwXG4gICAgICAgICAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICAgICAgPjwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgI2ZpZWxkUmVuZGVyZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldC1maWVsZD1cImZpZWxkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldC1mb3JtRmllbGROYW1lPVwiZm9ybUZpZWxkTmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQtZm9ybUdyb3VwTmFtZT1cImZvcm1Hcm91cE5hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0LXJhbms9XCJyYW5rXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpmZHBEeW5hbWljRm9ybUNvbnRyb2xGaWVsZD1cImZpZWxkOyBzaG93OiBzaG91bGRTaG93RmllbGRzW2ZpZWxkLmZvcm1JdGVtLm5hbWVdICE9PSBmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZkcC1mb3JtLWdlbmVyYXRvci1maWVsZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaGludE9wdGlvbnNdPVwiZmllbGQuZm9ybUl0ZW0uZ3VpT3B0aW9ucyB8IGdldEhpbnRPcHRpb25zXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1dPVwiZm9ybVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG91bGRTaG93XT1cInNob3VsZFNob3dGaWVsZHNbZmllbGQuZm9ybUl0ZW0ubmFtZV0gIT09IGZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ZpZWxkXT1cImZpZWxkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1GaWVsZE5hbWVdPVwiZm9ybUZpZWxkTmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtR3JvdXBOYW1lUGF0aF09XCJmb3JtR3JvdXBOYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JhbmtdPVwicmFua1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvZmRwLWZvcm0tZ2VuZXJhdG9yLWZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZ3JvdXBSZW5kZXJlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxmZHAtZm9ybS1maWVsZC1ncm91cFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtoaW50T3B0aW9uc109XCJmaWVsZC5mb3JtSXRlbS5ndWlPcHRpb25zIHwgZ2V0SGludE9wdGlvbnNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJmaWVsZC5mb3JtSXRlbS5tZXNzYWdlIHx8ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxDb2x1bW5MYXlvdXRdPVwiZmllbGQuZm9ybUl0ZW0uZ3VpT3B0aW9ucz8ubGFiZWxDb2x1bW5MYXlvdXRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmaWVsZENvbHVtbkxheW91dF09XCJmaWVsZC5mb3JtSXRlbS5ndWlPcHRpb25zPy5maWVsZENvbHVtbkxheW91dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2dhcENvbHVtbkxheW91dF09XCJmaWVsZC5mb3JtSXRlbS5ndWlPcHRpb25zPy5nYXBDb2x1bW5MYXlvdXRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtTmFtZV09XCJmaWVsZC5mb3JtSXRlbS5uYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAZm9yIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBGaWVsZCBvZiBmaWVsZCB8IGdldE9yZGVyZWRGaWVsZENvbnRyb2xzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjayBfZ3JvdXBUcmFja0ZuKCRpbmRleCwgZ3JvdXBGaWVsZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmZkcER5bmFtaWNGb3JtQ29udHJvbEZpZWxkPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBGaWVsZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93OiBzaG91bGRTaG93RmllbGRzW2dyb3VwRmllbGQuZm9ybUl0ZW0ubmFtZSFdICE9PSBmYWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZkcC1mb3JtLWdlbmVyYXRvci1maWVsZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtoaW50T3B0aW9uc109XCJncm91cEZpZWxkLmZvcm1JdGVtLmd1aU9wdGlvbnMgfCBnZXRIaW50T3B0aW9uc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1dPVwiZm9ybVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ZpZWxkXT1cImdyb3VwRmllbGRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG91bGRTaG93XT1cInNob3VsZFNob3dGaWVsZHNbZ3JvdXBGaWVsZC5mb3JtSXRlbS5uYW1lIV0gIT09IGZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUZpZWxkTmFtZV09XCJncm91cEZpZWxkLmZvcm1JdGVtLm5hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtR3JvdXBOYW1lUGF0aF09XCJmaWVsZC5mb3JtSXRlbS5uYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmFua109XCJncm91cEZpZWxkLmZvcm1JdGVtLnJhbmsgfHwgMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9mZHAtZm9ybS1nZW5lcmF0b3ItZmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZmRwLWZvcm0tZmllbGQtZ3JvdXA+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIEBpZiAoIW5vQWRkaXRpb25hbENvbnRlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgPGZkcC1mb3JtLWZpZWxkIFtjb2x1bW5dPVwiMVwiIFtyYW5rXT1cImZvcm1Db250cm9sSXRlbXMubGVuZ3RoICsgMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBGb3IgdXNlci1kZWZpbmVkIGVsZW1lbnRzLCBsaWtlIHN1Ym1pdCBidXR0b24gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICAgIDwvZmRwLWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9mZHAtZm9ybS1ncm91cD5cbiAgICAgICAgfVxuICAgIDwvZmQtYnVzeS1pbmRpY2F0b3I+XG59IEBlbHNlIHtcbiAgICA8ZmQtc2tlbGV0b24gd2lkdGg9XCIxMDAlXCIgaGVpZ2h0PVwiMTAwcHhcIiBbc3R5bGUucGFkZGluZy5yZW1dPVwiMVwiPlxuICAgICAgICA8c3ZnOnJlY3QgeD1cIjBcIiB5PVwiMFwiIHJ4PVwiNFwiIHdpZHRoPVwiMTUlXCIgaGVpZ2h0PVwiOFwiIC8+XG4gICAgICAgIDxzdmc6cmVjdCB4PVwiMFwiIHk9XCIyMFwiIHJ4PVwiNFwiIHdpZHRoPVwiMjUlXCIgaGVpZ2h0PVwiMTZcIiAvPlxuICAgICAgICA8c3ZnOnJlY3QgeD1cIjM1JVwiIHk9XCIwXCIgcng9XCI0XCIgd2lkdGg9XCIxNSVcIiBoZWlnaHQ9XCI4XCIgLz5cbiAgICAgICAgPHN2ZzpyZWN0IHg9XCIzNSVcIiB5PVwiMjBcIiByeD1cIjRcIiB3aWR0aD1cIjI1JVwiIGhlaWdodD1cIjE2XCIgLz5cbiAgICAgICAgPHN2ZzpyZWN0IHg9XCIwXCIgeT1cIjYwXCIgcng9XCI0XCIgd2lkdGg9XCIxNSVcIiBoZWlnaHQ9XCI4XCIgLz5cbiAgICAgICAgPHN2ZzpyZWN0IHg9XCIwXCIgeT1cIjgwXCIgcng9XCI0XCIgd2lkdGg9XCIyNSVcIiBoZWlnaHQ9XCIxNlwiIC8+XG4gICAgPC9mZC1za2VsZXRvbj5cbn1cbiJdfQ==
@@ -1,9 +1,9 @@
1
- import { Inject, Injectable, Optional, SkipSelf } from '@angular/core';
1
+ import { DestroyRef, Inject, Injectable, Optional, SkipSelf, inject } from '@angular/core';
2
2
  import { FormBuilder, Validators } from '@angular/forms';
3
3
  import { isFunction, selectStrategy } from '@fundamental-ngx/cdk/utils';
4
4
  import { cloneDeep, merge } from 'lodash-es';
5
- import { Subject } from 'rxjs';
6
- import { debounceTime, takeUntil } from 'rxjs/operators';
5
+ import { debounceTime } from 'rxjs/operators';
6
+ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
7
7
  import { DEFAULT_VALIDATION_ERRORS } from './config/default-validation-errors';
8
8
  import { DynamicFormControl, DynamicFormControlGroup } from './dynamic-form-control';
9
9
  import { FormGeneratorComponentsAccessorService } from './form-generator-components-accessor.service';
@@ -36,16 +36,9 @@ export class FormGeneratorService {
36
36
  * @hidden
37
37
  * An RxJS Subject that will kill the data stream upon component’s destruction (for unsubscribing)
38
38
  */
39
- this._onDestroy$ = new Subject();
39
+ this._destroyRef = inject(DestroyRef);
40
40
  this._config = merge(cloneDeep(this._config), cloneDeep(this._providedConfig));
41
41
  }
42
- /**
43
- * @hidden
44
- */
45
- ngOnDestroy() {
46
- this._onDestroy$.next();
47
- this._onDestroy$.complete();
48
- }
49
42
  /**
50
43
  * @description Generates `FormGroup` class with the list of `DynamicFormControl` control classes
51
44
  * defined in `formItems` argument.
@@ -294,7 +287,9 @@ export class FormGeneratorService {
294
287
  updateOn: 'change'
295
288
  });
296
289
  if (isFunction(formItem.onchange)) {
297
- formControl.valueChanges.pipe(debounceTime(50), takeUntil(this._onDestroy$)).subscribe(async (value) => {
290
+ formControl.valueChanges
291
+ .pipe(debounceTime(50), takeUntilDestroyed(this._destroyRef))
292
+ .subscribe(async (value) => {
298
293
  const obj = formItem.onchange(value, this.forms, formControl);
299
294
  await this._getFunctionValue(obj);
300
295
  });
@@ -445,4 +440,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.4", ngImpor
445
440
  type: Inject,
446
441
  args: [FORM_GENERATOR_CONFIG]
447
442
  }] }] });
448
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1nZW5lcmF0b3Iuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvcGxhdGZvcm0vZm9ybS9mb3JtLWdlbmVyYXRvci9mb3JtLWdlbmVyYXRvci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFhLFFBQVEsRUFBRSxRQUFRLEVBQVEsTUFBTSxlQUFlLENBQUM7QUFDeEYsT0FBTyxFQUFvQixXQUFXLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0UsT0FBTyxFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN4RSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUU3QyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFJekQsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDL0UsT0FBTyxFQUFFLGtCQUFrQixFQUFFLHVCQUF1QixFQUEyQixNQUFNLHdCQUF3QixDQUFDO0FBQzlHLE9BQU8sRUFBRSxzQ0FBc0MsRUFBRSxNQUFNLDhDQUE4QyxDQUFDO0FBQ3RHLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFZNUMsT0FBTyxFQUFFLHFCQUFxQixFQUFFLDBCQUEwQixFQUFFLDBCQUEwQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7Ozs7QUFFdEg7O0dBRUc7QUFFSCxNQUFNLE9BQU8sb0JBQW9CO0lBb0I3QixjQUFjO0lBQ2QsWUFDWSxHQUFnQixFQUNoQixtQkFBMkQsRUFJM0Qsa0JBQWlELEVBSWpELGVBQTZDO1FBVDdDLFFBQUcsR0FBSCxHQUFHLENBQWE7UUFDaEIsd0JBQW1C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LCBPcHRpb25hbCwgU2tpcFNlbGYsIFR5cGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFzeW5jVmFsaWRhdG9yRm4sIEZvcm1CdWlsZGVyLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgaXNGdW5jdGlvbiwgc2VsZWN0U3RyYXRlZ3kgfSBmcm9tICdAZnVuZGFtZW50YWwtbmd4L2Nkay91dGlscyc7XG5pbXBvcnQgeyBjbG9uZURlZXAsIG1lcmdlIH0gZnJvbSAnbG9kYXNoLWVzJztcblxuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IFNlbGVjdEl0ZW0gfSBmcm9tICdAZnVuZGFtZW50YWwtbmd4L3BsYXRmb3JtL3NoYXJlZCc7XG5pbXBvcnQgeyBCYXNlRHluYW1pY0Zvcm1HZW5lcmF0b3JDb250cm9sIH0gZnJvbSAnLi9iYXNlLWR5bmFtaWMtZm9ybS1nZW5lcmF0b3ItY29udHJvbCc7XG5pbXBvcnQgeyBERUZBVUxUX1ZBTElEQVRJT05fRVJST1JTIH0gZnJvbSAnLi9jb25maWcvZGVmYXVsdC12YWxpZGF0aW9uLWVycm9ycyc7XG5pbXBvcnQgeyBEeW5hbWljRm9ybUNvbnRyb2wsIER5bmFtaWNGb3JtQ29udHJvbEdyb3VwLCBEeW5hbWljRm9ybUdyb3VwQ29udHJvbCB9IGZyb20gJy4vZHluYW1pYy1mb3JtLWNvbnRyb2wnO1xuaW1wb3J0IHsgRm9ybUdlbmVyYXRvckNvbXBvbmVudHNBY2Nlc3NvclNlcnZpY2UgfSBmcm9tICcuL2Zvcm0tZ2VuZXJhdG9yLWNvbXBvbmVudHMtYWNjZXNzb3Iuc2VydmljZSc7XG5pbXBvcnQgeyBpc0Zvcm1GaWVsZEl0ZW0gfSBmcm9tICcuL2hlbHBlcnMnO1xuaW1wb3J0IHsgRHluYW1pY0Zvcm1Hcm91cCB9IGZyb20gJy4vaW50ZXJmYWNlcy9keW5hbWljLWZvcm0tZ3JvdXAnO1xuaW1wb3J0IHtcbiAgICBEeW5hbWljRm9ybUZpZWxkSXRlbSxcbiAgICBEeW5hbWljRm9ybUl0ZW0sXG4gICAgRHluYW1pY0Zvcm1JdGVtQ2hvaWNlVHlwZXMsXG4gICAgRHluYW1pY0Zvcm1JdGVtTWFwLFxuICAgIER5bmFtaWNGb3JtVmFsdWUsXG4gICAgUHJlcGFyZWREeW5hbWljRm9ybUZpZWxkSXRlbVxufSBmcm9tICcuL2ludGVyZmFjZXMvZHluYW1pYy1mb3JtLWl0ZW0nO1xuaW1wb3J0IHsgRm9ybUNvbXBvbmVudERlZmluaXRpb24gfSBmcm9tICcuL2ludGVyZmFjZXMvZm9ybS1jb21wb25lbnQtZGVmaW5pdGlvbic7XG5pbXBvcnQgeyBGb3JtR2VuZXJhdG9yQ29uZmlnIH0gZnJvbSAnLi9pbnRlcmZhY2VzL2Zvcm0tZ2VuZXJhdG9yLW1vZHVsZS1jb25maWcnO1xuaW1wb3J0IHsgRk9STV9HRU5FUkFUT1JfQ09ORklHLCBGT1JNX0dFTkVSQVRPUl9JVEVNX0NPTkZJRywgZGVmYXVsdEZvcm1HZW5lcmF0b3JDb25maWcgfSBmcm9tICcuL3Byb3ZpZGVycy9wcm92aWRlcnMnO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBGb3JtIGdlbmVyYXRvciBzZXJ2aWNlXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBGb3JtR2VuZXJhdG9yU2VydmljZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gICAgLyoqXG4gICAgICogTWFwIG9mIGdlbmVyYXRlZCBmb3JtcyB0byBhY2Nlc3MgbGF0ZXIuXG4gICAgICovXG4gICAgcmVhZG9ubHkgZm9ybXM6IE1hcDxzdHJpbmcsIER5bmFtaWNGb3JtR3JvdXA+ID0gbmV3IE1hcDxzdHJpbmcsIER5bmFtaWNGb3JtR3JvdXA+KCk7XG5cbiAgICAvKipcbiAgICAgKiBQcmVkZWZpbmVkIHZhbGlkYXRpb24gZXJyb3IgbWVzc2FnZXMuXG4gICAgICovXG4gICAgdmFsaWRhdGlvbkVycm9ySGludHMgPSBERUZBVUxUX1ZBTElEQVRJT05fRVJST1JTO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jb25maWc6IEZvcm1HZW5lcmF0b3JDb25maWcgPSBkZWZhdWx0Rm9ybUdlbmVyYXRvckNvbmZpZztcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBBbiBSeEpTIFN1YmplY3QgdGhhdCB3aWxsIGtpbGwgdGhlIGRhdGEgc3RyZWFtIHVwb24gY29tcG9uZW504oCZcyBkZXN0cnVjdGlvbiAoZm9yIHVuc3Vic2NyaWJpbmcpXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBfb25EZXN0cm95JDogU3ViamVjdDx2b2lkPiA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIF9mYjogRm9ybUJ1aWxkZXIsXG4gICAgICAgIHByaXZhdGUgX2NvbXBvbmVudHNBY2Nlc3NvcjogRm9ybUdlbmVyYXRvckNvbXBvbmVudHNBY2Nlc3NvclNlcnZpY2UsXG4gICAgICAgIEBPcHRpb25hbCgpXG4gICAgICAgIEBTa2lwU2VsZigpXG4gICAgICAgIEBJbmplY3QoRk9STV9HRU5FUkFUT1JfSVRFTV9DT05GSUcpXG4gICAgICAgIHByaXZhdGUgX2RlZmF1bHRJdGVtQ29uZmlnOiBQYXJ0aWFsPER5bmFtaWNGb3JtRmllbGRJdGVtPixcbiAgICAgICAgQE9wdGlvbmFsKClcbiAgICAgICAgQFNraXBTZWxmKClcbiAgICAgICAgQEluamVjdChGT1JNX0dFTkVSQVRPUl9DT05GSUcpXG4gICAgICAgIHByaXZhdGUgX3Byb3ZpZGVkQ29uZmlnOiBQYXJ0aWFsPEZvcm1HZW5lcmF0b3JDb25maWc+XG4gICAgKSB7XG4gICAgICAgIHRoaXMuX2NvbmZpZyA9IG1lcmdlKGNsb25lRGVlcCh0aGlzLl9jb25maWcpLCBjbG9uZURlZXAodGhpcy5fcHJvdmlkZWRDb25maWcpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX29uRGVzdHJveSQubmV4dCgpO1xuICAgICAgICB0aGlzLl9vbkRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIEdlbmVyYXRlcyBgRm9ybUdyb3VwYCBjbGFzcyB3aXRoIHRoZSBsaXN0IG9mIGBEeW5hbWljRm9ybUNvbnRyb2xgIGNvbnRyb2wgY2xhc3Nlc1xuICAgICAqIGRlZmluZWQgaW4gYGZvcm1JdGVtc2AgYXJndW1lbnQuXG4gICAgICogQHBhcmFtIGZvcm1OYW1lIEZvcm0gbmFtZS5cbiAgICAgKiBAcGFyYW0gZm9ybUl0ZW1zIHRoZSBsaXN0IG9mIGZvcm0gaXRlbXMgd2hpY2ggdXNlZCBmb3IgZm9ybSBjb250cm9sIGdlbmVyYXRpb24uXG4gICAgICogQHJldHVybnMgYEZvcm1Hcm91cGAgY2xhc3Mgd2l0aCB0aGUgbGlzdCBvZiBgRHluYW1pY0Zvcm1Db250cm9sYCBjb250cm9sIGNsYXNzZXMuXG4gICAgICovXG4gICAgYXN5bmMgZ2VuZXJhdGVGb3JtKGZvcm1OYW1lOiBzdHJpbmcsIGZvcm1JdGVtczogTWFwPHN0cmluZywgRHluYW1pY0Zvcm1JdGVtTWFwPik6IFByb21pc2U8RHluYW1pY0Zvcm1Hcm91cD4ge1xuICAgICAgICBjb25zdCBleGlzdGluZ0Zvcm0gPSB0aGlzLmZvcm1zLmdldChmb3JtTmFtZSk7XG4gICAgICAgIGNvbnN0IGZvcm0gPSB0aGlzLl9mYi5ncm91cCh7fSkgYXMgRHluYW1pY0Zvcm1Hcm91cDtcblxuICAgICAgICBjb25zdCBkZWZhdWx0Rm9ybUdyb3VwID0gbmV3IER5bmFtaWNGb3JtQ29udHJvbEdyb3VwKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6IHRoaXMuX2NvbmZpZy51bmdyb3VwZWRDb250cm9sc05hbWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7fVxuICAgICAgICApO1xuXG4gICAgICAgIGRlZmF1bHRGb3JtR3JvdXAuZm9ybUl0ZW0uaXRlbXMgPSBuZXcgTWFwKCk7XG5cbiAgICAgICAgZm9ybUl0ZW1zID0gdGhpcy5fdHJhbnNmb3JtRm9ybUl0ZW1zKGZvcm1JdGVtcyk7XG5cbiAgICAgICAgZm9ybUl0ZW1zLmZvckVhY2goKGZvcm1JdGVtKSA9PiB7XG4gICAgICAgICAgICBpZiAoIWlzRm9ybUZpZWxkSXRlbShmb3JtSXRlbSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWZvcm1JdGVtLml0ZW1zIHx8IGZvcm1JdGVtLml0ZW1zLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGdyb3VwID0gbmV3IER5bmFtaWNGb3JtQ29udHJvbEdyb3VwKGZvcm1JdGVtLCB7fSk7XG5cbiAgICAgICAgICAgICAgICBmb3JtSXRlbS5pdGVtcy5mb3JFYWNoKChncm91cEZvcm1JdGVtKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGdyb3VwRm9ybUNvbnRyb2wgPSB0aGlzLl9nZW5lcmF0ZUR5bmFtaWNGb3JtSXRlbShcbiAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwRm9ybUl0ZW0gYXMgUHJlcGFyZWREeW5hbWljRm9ybUZpZWxkSXRlbSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1cbiAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoIWdyb3VwRm9ybUNvbnRyb2wpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGdyb3VwLmFkZENvbnRyb2woZ3JvdXBGb3JtSXRlbS5uYW1lLCBncm91cEZvcm1Db250cm9sKTtcblxuICAgICAgICAgICAgICAgICAgICBncm91cEZvcm1Db250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgZm9ybS5hZGRDb250cm9sKGZvcm1JdGVtLm5hbWUsIGdyb3VwKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGZvcm1Db250cm9sID0gdGhpcy5fZ2VuZXJhdGVEeW5hbWljRm9ybUl0ZW0oZm9ybUl0ZW0gYXMgUHJlcGFyZWREeW5hbWljRm9ybUZpZWxkSXRlbSwgZm9ybSk7XG5cbiAgICAgICAgICAgIGlmICghZm9ybUNvbnRyb2wpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGRlZmF1bHRGb3JtR3JvdXAuYWRkQ29udHJvbChmb3JtSXRlbS5uYW1lLCBmb3JtQ29udHJvbCk7XG5cbiAgICAgICAgICAgIGRlZmF1bHRGb3JtR3JvdXAuZm9ybUl0ZW0uaXRlbXM/LnNldChmb3JtSXRlbS5uYW1lLCBmb3JtSXRlbSk7XG5cbiAgICAgICAgICAgIGZvcm1Db250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBmb3JtQ29udHJvbE5hbWVzID0gT2JqZWN0LmtleXMoZGVmYXVsdEZvcm1Hcm91cC5jb250cm9scyk7XG5cbiAgICAgICAgZm9ybS5hZGRDb250cm9sKHRoaXMuX2NvbmZpZy51bmdyb3VwZWRDb250cm9sc05hbWUsIGRlZmF1bHRGb3JtR3JvdXApO1xuXG4gICAgICAgIC8vIEFmdGVyIHdlIGNyZWF0ZWQgaW5pdGlhbCBmb3JtLCB3ZSBuZWVkIHRvIGdldCBkeW5hbWljIGxhYmVscywgY2hvaWNlcyBhbmQgdmFsdWVcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgZm9ybUNvbnRyb2xOYW1lcykge1xuICAgICAgICAgICAgY29uc3QgZm9ybUl0ZW0gPSBmb3JtSXRlbXMuZ2V0KGtleSk7XG5cbiAgICAgICAgICAgIGlmICghaXNGb3JtRmllbGRJdGVtKGZvcm1JdGVtKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBbW21lc3NhZ2UsIHBsYWNlaG9sZGVyLCBkZWZhdWx0VmFsdWVdLCBjaG9pY2VzXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICAgICAgICB0aGlzLl9nZXRGb3JtSXRlbVByb3BlcnRpZXM8W3N0cmluZywgc3RyaW5nLCBhbnldPihmb3JtSXRlbSwgZGVmYXVsdEZvcm1Hcm91cCwgW1xuICAgICAgICAgICAgICAgICAgICAnbWVzc2FnZScsXG4gICAgICAgICAgICAgICAgICAgICdwbGFjZWhvbGRlcicsXG4gICAgICAgICAgICAgICAgICAgICdkZWZhdWx0J1xuICAgICAgICAgICAgICAgIF0pLFxuICAgICAgICAgICAgICAgIHRoaXMuX2dldEZvcm1JdGVtQ2hvaWNlcyhmb3JtSXRlbSwgZGVmYXVsdEZvcm1Hcm91cClcbiAgICAgICAgICAgIF0pO1xuXG4gICAgICAgICAgICBmb3JtSXRlbS5tZXNzYWdlID0gbWVzc2FnZTtcbiAgICAgICAgICAgIGZvcm1JdGVtLnBsYWNlaG9sZGVyID0gcGxhY2Vob2xkZXI7XG4gICAgICAgICAgICBmb3JtSXRlbS5kZWZhdWx0ID0gZGVmYXVsdFZhbHVlO1xuICAgICAgICAgICAgZm9ybUl0ZW0uY2hvaWNlcyA9IGNob2ljZXM7XG5cbiAgICAgICAgICAgIC8vIFVwZGF0ZSBmb3JtIHZhbHVlIHNpbmNlIGl0IG1pZ2h0IGJlIGNoYW5nZWRcbiAgICAgICAgICAgIGRlZmF1bHRGb3JtR3JvdXAuY29udHJvbHNbZm9ybUl0ZW0ubmFtZV0uc2V0VmFsdWUoZm9ybUl0ZW0uZGVmYXVsdCk7XG5cbiAgICAgICAgICAgIGRlZmF1bHRGb3JtR3JvdXAuY29udHJvbHNba2V5XS5mb3JtSXRlbSA9IGZvcm1JdGVtIGFzIFByZXBhcmVkRHluYW1pY0Zvcm1GaWVsZEl0ZW07XG4gICAgICAgIH1cblxuICAgICAgICBPYmplY3Qua2V5cyhmb3JtLmNvbnRyb2xzKS5mb3JFYWNoKChjb250cm9sTmFtZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgbmV3Q29udHJvbCA9IGZvcm0uZ2V0KGNvbnRyb2xOYW1lKSBhcyBEeW5hbWljRm9ybUNvbnRyb2xHcm91cDtcbiAgICAgICAgICAgIGNvbnN0IG9sZENvbnRyb2wgPSBleGlzdGluZ0Zvcm0/LmdldChjb250cm9sTmFtZSkgYXMgRHluYW1pY0Zvcm1Db250cm9sR3JvdXA7XG4gICAgICAgICAgICB0aGlzLl9jbG9uZU9sZEZvcm1Hcm91cChuZXdDb250cm9sLCBvbGRDb250cm9sKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5mb3Jtcy5zZXQoZm9ybU5hbWUsIGZvcm0pO1xuXG4gICAgICAgIHJldHVybiBmb3JtO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgbmV3IGNvbnRyb2wgdG8gYSBmb3JtLlxuICAgICAqIEBwYXJhbSBjb250cm9sIENvbnRyb2wgdG8gYWRkXG4gICAgICogQHBhcmFtIGZvcm0gRm9ybSBvZiB0aGUgY29udHJvbCB0byBiZSBhZGRlZC5cbiAgICAgKiBAcGFyYW0gcGF0aCBHcm91cCBwYXRoLlxuICAgICAqL1xuICAgIGFzeW5jIGFkZENvbnRyb2woY29udHJvbDogRHluYW1pY0Zvcm1JdGVtLCBmb3JtOiBEeW5hbWljRm9ybUdyb3VwLCBwYXRoOiBzdHJpbmdbXSA9IFtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGZvcm1Hcm91cCA9IHRoaXMuZ2V0Rm9ybUNvbnRyb2woZm9ybSwgLi4ucGF0aCk7XG5cbiAgICAgICAgaWYgKGZvcm1Hcm91cCBpbnN0YW5jZW9mIER5bmFtaWNGb3JtQ29udHJvbEdyb3VwKSB7XG4gICAgICAgICAgICBjb25zdCBmb3JtQ29udHJvbCA9IHRoaXMuX2dlbmVyYXRlRHluYW1pY0Zvcm1JdGVtKGNvbnRyb2wgYXMgUHJlcGFyZWREeW5hbWljRm9ybUZpZWxkSXRlbSwgZm9ybSk7XG4gICAgICAgICAgICBmb3JtR3JvdXAuYWRkQ29udHJvbChjb250cm9sLm5hbWUsIGZvcm1Db250cm9sKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgdGhlIGNvbnRyb2wgd2l0aCBnaXZlbiBuYW1lIGZyb20gdGhlIGZvcm0uXG4gICAgICogQHBhcmFtIGNvbnRyb2xOYW1lXG4gICAgICogQHBhcmFtIHBhdGhcbiAgICAgKi9cbiAgICByZW1vdmVDb250cm9sKGNvbnRyb2xOYW1lOiBzdHJpbmcsIGZvcm06IER5bmFtaWNGb3JtR3JvdXAsIHBhdGg6IHN0cmluZ1tdID0gW10pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZm9ybUdyb3VwID0gdGhpcy5nZXRGb3JtQ29udHJvbChmb3JtLCAuLi5wYXRoKTtcblxuICAgICAgICBpZiAoZm9ybUdyb3VwIGluc3RhbmNlb2YgRHluYW1pY0Zvcm1Db250cm9sR3JvdXApIHtcbiAgICAgICAgICAgIGZvcm1Hcm91cC5yZW1vdmVDb250cm9sKGNvbnRyb2xOYW1lKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvbiBSZXR1cm5zIGZvcm0gdmFsdWUgd2l0aCBhcHBsaWVkIGZpbHRlcnMgYW5kIHRyYW5zZm9ybWVycy5cbiAgICAgKiBAcGFyYW0gZm9ybSBGb3JtIGdlbmVyYXRvciBmb3JtXG4gICAgICogQHBhcmFtIHJlbmRlclZhbHVlIFdoZXRoZXIgb3Igbm90IGZvcm0gdmFsdWUgd2lsbCBiZSB1c2VkIGZvciByZW5kZXJpbmcgcHVycG9zZXMuXG4gICAgICogQHJldHVybnMgZm9ybSB2YWx1ZSBvYmplY3QuXG4gICAgICovXG4gICAgYXN5bmMgZ2V0Rm9ybVZhbHVlKFxuICAgICAgICBmb3JtOiBEeW5hbWljRm9ybUdyb3VwIHwgRHluYW1pY0Zvcm1Db250cm9sR3JvdXAsXG4gICAgICAgIHJlbmRlclZhbHVlID0gZmFsc2VcbiAgICApOiBQcm9taXNlPER5bmFtaWNGb3JtVmFsdWU+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5fdHJpZ2dlckZpZWxkc09uY2hhbmdlKGZvcm0pO1xuXG4gICAgICAgIGNvbnN0IGZvcm1WYWx1ZSA9IGNsb25lRGVlcChmb3JtLnZhbHVlKTtcblxuICAgICAgICBmb3IgKGNvbnN0IFtpLCBjb250cm9sXSBvZiBPYmplY3QuZW50cmllcyhmb3JtLmNvbnRyb2xzKSkge1xuICAgICAgICAgICAgY29uc3QgZm9ybUl0ZW0gPSBjb250cm9sLmZvcm1JdGVtO1xuXG4gICAgICAgICAgICBpZiAoIWlzRm9ybUZpZWxkSXRlbShmb3JtSXRlbSkpIHtcbiAgICAgICAgICAgICAgICBmb3JtVmFsdWVbaV0gPSBhd2FpdCB0aGlzLmdldEZvcm1WYWx1ZShjb250cm9sIGFzIER5bmFtaWNGb3JtQ29udHJvbEdyb3VwLCByZW5kZXJWYWx1ZSk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChmb3JtSXRlbS5zaG91bGRTaG93ID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBmb3JtVmFsdWVbaV07XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChmb3JtSXRlbS50cmFuc2Zvcm1lcikge1xuICAgICAgICAgICAgICAgIGNvbnN0IG9iaiA9IGZvcm1JdGVtLnRyYW5zZm9ybWVyKGZvcm1WYWx1ZVtpXSwgZm9ybVZhbHVlLCBmb3JtSXRlbSk7XG4gICAgICAgICAgICAgICAgZm9ybVZhbHVlW2ldID0gYXdhaXQgdGhpcy5fZ2V0RnVuY3Rpb25WYWx1ZShvYmopO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocmVuZGVyVmFsdWUgJiYgZm9ybUl0ZW0udmFsdWVSZW5kZXJlcikge1xuICAgICAgICAgICAgICAgIGNvbnN0IG9iaiA9IGZvcm1JdGVtLnZhbHVlUmVuZGVyZXIoZm9ybVZhbHVlW2ldLCBmb3JtVmFsdWUsIGZvcm1JdGVtKTtcbiAgICAgICAgICAgICAgICBmb3JtVmFsdWVbaV0gPSBhd2FpdCB0aGlzLl9nZXRGdW5jdGlvblZhbHVlKG9iaik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChyZW5kZXJWYWx1ZSAmJiBmb3JtSXRlbVsnY29udHJvbFR5cGUnXSA9PT0gJ3Bhc3N3b3JkJykge1xuICAgICAgICAgICAgICAgIGZvcm1WYWx1ZVtpXSA9IHRoaXMuX2Zvcm1hdFBhc3N3b3JkVmFsdWUoZm9ybVZhbHVlW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRGb3JtVmFsdWVXaXRob3V0VW5ncm91cGVkKGZvcm1WYWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIEFkZHMgY3VzdG9tIGNvbXBvbmVudCB0byB0aGUgbGlzdCBvZiBhdmFpbGFibGUgY29tcG9uZW50cyBmb3IgdGhlIGZvcm0gZ2VuZXJhdG9yIGl0ZW1zLlxuICAgICAqIEBwYXJhbSBjb21wb25lbnQgQW5ndWxhciBjb21wb25lbnQuXG4gICAgICogQHBhcmFtIHR5cGVzIHR5cGVzIG9mIHRoZSBmb3JtIGl0ZW0uXG4gICAgICovXG4gICAgYWRkQ29tcG9uZW50KGNvbXBvbmVudDogVHlwZTxCYXNlRHluYW1pY0Zvcm1HZW5lcmF0b3JDb250cm9sPiwgdHlwZXM6IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb21wb25lbnRzQWNjZXNzb3IuYWRkQ29tcG9uZW50KGNvbXBvbmVudCwgdHlwZXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvbiBSZXR1cm5zIGJlc3QtbWF0Y2hlZCBjb21wb25lbnQgYmFzZWQgb24gcHJvdmlkZWQgYHR5cGVgIGFyZ3VtZW50XG4gICAgICogQHBhcmFtIHR5cGUgZm9ybSBpdGVtIHR5cGVcbiAgICAgKiBAcmV0dXJucyBAc2VlIEZvcm1Db21wb25lbnREZWZpbml0aW9uIENvbXBvbmVudCBkZWZpbml0aW9uIGZvciB0aGUgZm9ybSBpdGVtXG4gICAgICovXG4gICAgZ2V0Q29tcG9uZW50RGVmaW5pdGlvbkJ5VHlwZSh0eXBlOiBzdHJpbmcpOiBGb3JtQ29tcG9uZW50RGVmaW5pdGlvbiB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb21wb25lbnRzQWNjZXNzb3IuZ2V0Q29tcG9uZW50RGVmaW5pdGlvbkJ5VHlwZSh0eXBlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyBPYmplY3Qgb2YgYXZhaWxhYmxlIGVycm9ycywgd2hlcmUga2V5IGlzIGFuIGVycm9yIHR5cGUsXG4gICAgICogYW5kIGl0J3MgdmFsdWUgaXMgYSBkaXNwbGF5IHRleHQuXG4gICAgICovXG4gICAgZ2V0VmFsaWRhdGlvbkVycm9ySGludHMoa2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy52YWxpZGF0aW9uRXJyb3JIaW50c1trZXldO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvbiBBZGRzIGN1c3RvbSBlcnJvciBoaW50IGRlZmluZWQgYnkgdXNlci5cbiAgICAgKiBAcGFyYW0gdHlwZSBlcnJvciB0eXBlIGZyb20gdmFsaWRhdG9yLlxuICAgICAqIEBwYXJhbSB2YWx1ZSBkaXNwbGF5IHRleHQuXG4gICAgICovXG4gICAgYWRkVmFsaWRhdGlvbkVycm9ySGludCh0eXBlOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy52YWxpZGF0aW9uRXJyb3JIaW50c1t0eXBlXSA9IHZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvbiBDaGVja3MgaWYgc29tZSBpdGVtcyBvZiB0aGUgZm9ybSBzaG91bGQgYmUgaGlkZGVuLFxuICAgICAqIG9yIHZpc2libGUgYmFzZWQgb24gYHdoZW5gIG1ldGhvZCByZXN1bHQuXG4gICAgICogQHBhcmFtIGZvcm1cbiAgICAgKiBAcmV0dXJucyBgU2V0YCB3aGVyZSBrZXkgaXMgaXRlbSBuYW1lLCBhbmQgYm9vbGVhbiB2YWx1ZSBpZiBmaWVsZCBuZWVkcyB0byBiZSBzaG93bi5cbiAgICAgKi9cbiAgICBhc3luYyBjaGVja1Zpc2libGVGb3JtSXRlbXMoZm9ybTogRHluYW1pY0Zvcm1Hcm91cCk6IFByb21pc2U8eyBba2V5OiBzdHJpbmddOiBib29sZWFuIH0+IHtcbiAgICAgICAgY29uc3QgZm9ybVZhbHVlID0gdGhpcy5fZ2V0Rm9ybVZhbHVlV2l0aG91dFVuZ3JvdXBlZChjbG9uZURlZXAoZm9ybS52YWx1ZSkpO1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5fY2hlY2tGb3JtQ29udHJvbHNWaXNpYmlsaXR5KGZvcm0sIGZvcm1WYWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWV0aG9kIGZvciBzZWFyY2hpbmcgYSBmb3JtIGNvbnRyb2wgaW5zaWRlIGZvcm0gZ3JvdXAuIENhbiBhbHNvIHNlYXJjaCBpbnNpZGUgdW5ncm91cGVkIGZvcm0gZ3JvdXAuXG4gICAgICogQHBhcmFtIGZvcm0gRm9ybSBncm91cC5cbiAgICAgKiBAcGFyYW0gY29udHJvbE5hbWVzIE5hbWUgb2YgdGhlIGZvcm0gY29udHJvbC5cbiAgICAgKiBAcmV0dXJucyBGb3VuZCBmb3JtIGNvbnRyb2wuXG4gICAgICovXG4gICAgZ2V0Rm9ybUNvbnRyb2woZm9ybTogRHluYW1pY0Zvcm1Hcm91cCwgLi4uY29udHJvbE5hbWVzOiBzdHJpbmdbXSk6IER5bmFtaWNGb3JtR3JvdXBDb250cm9sIHtcbiAgICAgICAgY29udHJvbE5hbWVzID0gY29udHJvbE5hbWVzLnJlZHVjZSgobmFtZXM6IHN0cmluZ1tdLCBuYW1lKSA9PiB7XG4gICAgICAgICAgICBuYW1lcyA9IFsuLi5uYW1lcywgLi4ubmFtZS5zcGxpdCh0aGlzLl9jb25maWcuY29udHJvbE5hbWVTZXBhcmF0b3IpXTtcblxuICAgICAgICAgICAgcmV0dXJuIG5hbWVzO1xuICAgICAgICB9LCBbXSk7XG5cbiAgICAgICAgbGV0IGNvbnRyb2wgPSBmb3JtPy5nZXQoY29udHJvbE5hbWVzKTtcblxuICAgICAgICAvLyBJZiBubyBjb250cm9sIGZvdW5kLCB0cnkgdG8gZmluZCBpdCBpbiB1bmdyb3VwZWQgZ3JvdXBcbiAgICAgICAgaWYgKCFjb250cm9sKSB7XG4gICAgICAgICAgICBjb250cm9sID0gZm9ybT8uZ2V0KFt0aGlzLl9jb25maWcudW5ncm91cGVkQ29udHJvbHNOYW1lLCAuLi5jb250cm9sTmFtZXNdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb250cm9sIGFzIER5bmFtaWNGb3JtR3JvdXBDb250cm9sO1xuICAgIH1cblxuICAgIC8qKiBSZXNldHMgdGhlIGZvcm0gdG8gaXQncyBpbml0aWFsIHN0YXRlLiAqL1xuICAgIHJlc2V0Rm9ybShmb3JtOiBEeW5hbWljRm9ybUdyb3VwKTogdm9pZCB7XG4gICAgICAgIGZvciAoY29uc3QgY29udHJvbCBvZiBPYmplY3QudmFsdWVzKGZvcm0uY29udHJvbHMpKSB7XG4gICAgICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIER5bmFtaWNGb3JtQ29udHJvbEdyb3VwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXNldEZvcm0oY29udHJvbCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gR2V0IGRlZmF1bHQgdmFsdWVcbiAgICAgICAgICAgIGNvbnRyb2wuc2V0VmFsdWUoY29udHJvbC5mb3JtSXRlbS5kZWZhdWx0KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgX2dldEZvcm1WYWx1ZVdpdGhvdXRVbmdyb3VwZWQodmFsdWU6IGFueSk6IGFueSB7XG4gICAgICAgIGlmICh2YWx1ZVt0aGlzLl9jb25maWcudW5ncm91cGVkQ29udHJvbHNOYW1lXSkge1xuICAgICAgICAgICAgY29uc3QgdW5ncm91cGVkR3JvdXBWYWx1ZTogUmVjb3JkPHN0cmluZywgYW55PiA9IHZhbHVlW3RoaXMuX2NvbmZpZy51bmdyb3VwZWRDb250cm9sc05hbWVdO1xuICAgICAgICAgICAgZm9yIChjb25zdCBbZmllbGROYW1lLCBmaWVsZFZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh1bmdyb3VwZWRHcm91cFZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHZhbHVlW2ZpZWxkTmFtZV0gPSBmaWVsZFZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGRlbGV0ZSB2YWx1ZVt0aGlzLl9jb25maWcudW5ncm91cGVkQ29udHJvbHNOYW1lXTtcblxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9hc3NpZ25Gb3JtSXRlbVZhbGlkYXRvcnMoXG4gICAgICAgIGZvcm1JdGVtOiBQcmVwYXJlZER5bmFtaWNGb3JtRmllbGRJdGVtLFxuICAgICAgICBmb3JtOiBEeW5hbWljRm9ybUdyb3VwXG4gICAgKTogUHJlcGFyZWREeW5hbWljRm9ybUZpZWxkSXRlbSB7XG4gICAgICAgIGxldCB2YWxpZGF0b3I6IEFzeW5jVmFsaWRhdG9yRm4gfCBudWxsID0gbnVsbDtcblxuICAgICAgICBpZiAoaXNGdW5jdGlvbihmb3JtSXRlbS52YWxpZGF0ZSkpIHtcbiAgICAgICAgICAgIHZhbGlkYXRvciA9IGFzeW5jIChjb250cm9sKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb2JqID0gZm9ybUl0ZW0udmFsaWRhdGUhKGNvbnRyb2wudmFsdWUsIHRoaXMuX2dldEZvcm1WYWx1ZVdpdGhvdXRVbmdyb3VwZWQoZm9ybSkpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5fZ2V0RnVuY3Rpb25WYWx1ZShvYmopO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgcmV0dXJuT2JqID0ge307XG5cbiAgICAgICAgICAgICAgICByZXR1cm5PYmpbYCR7KDxEeW5hbWljRm9ybUNvbnRyb2w+Y29udHJvbCkuZm9ybUl0ZW0ubmFtZX1WYWxpZGF0b3JgXSA9XG4gICAgICAgICAgICAgICAgICAgIHR5cGVvZiByZXN1bHQgPT09ICdib29sZWFuJyA/IHRydWUgOiByZXN1bHQ7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ID09PSBudWxsID8gcmVzdWx0IDogcmV0dXJuT2JqO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgZm9ybUl0ZW0uYXN5bmNWYWxpZGF0b3JzID0gZm9ybUl0ZW0uYXN5bmNWYWxpZGF0b3JzIHx8IFtdO1xuICAgICAgICAgICAgZm9ybUl0ZW0uYXN5bmNWYWxpZGF0b3JzID1cbiAgICAgICAgICAgICAgICB0eXBlb2YgZm9ybUl0ZW0uYXN5bmNWYWxpZGF0b3JzID09PSAnZnVuY3Rpb24nID8gW2Zvcm1JdGVtLmFzeW5jVmFsaWRhdG9yc10gOiBmb3JtSXRlbS5hc3luY1ZhbGlkYXRvcnM7XG5cbiAgICAgICAgICAgIGZvcm1JdGVtLmFzeW5jVmFsaWRhdG9ycy5wdXNoKHZhbGlkYXRvcik7XG4gICAgICAgIH1cblxuICAgICAgICBmb3JtSXRlbS52YWxpZGF0b3JzID0gZm9ybUl0ZW0udmFsaWRhdG9ycyB8fCBbVmFsaWRhdG9ycy5udWxsVmFsaWRhdG9yXTtcblxuICAgICAgICBmb3JtSXRlbS5yZXF1aXJlZCA9IGZvcm1JdGVtLnJlcXVpcmVkIHx8IGZvcm1JdGVtLnZhbGlkYXRvcnMuaW5jbHVkZXMoVmFsaWRhdG9ycy5yZXF1aXJlZCk7XG5cbiAgICAgICAgcmV0dXJuIGZvcm1JdGVtO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfZ2VuZXJhdGVEeW5hbWljRm9ybUl0ZW0oXG4gICAgICAgIGZvcm1JdGVtOiBQcmVwYXJlZER5bmFtaWNGb3JtRmllbGRJdGVtLFxuICAgICAgICBmb3JtOiBEeW5hbWljRm9ybUdyb3VwXG4gICAgKTogRHluYW1pY0Zvcm1Db250cm9sIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgY29uc3QgZm9ybUl0ZW1Db21wb25lbnRUeXBlID0gdGhpcy5nZXRDb21wb25lbnREZWZpbml0aW9uQnlUeXBlKGZvcm1JdGVtLnR5cGUpO1xuXG4gICAgICAgIGlmICghZm9ybUl0ZW1Db21wb25lbnRUeXBlKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYEZvcm0gaXRlbSAnJHtmb3JtSXRlbS5uYW1lfScgd2l0aCB0eXBlICcke2Zvcm1JdGVtLnR5cGV9JyBoYXMgbm8gZGVmaW5lZCBjb21wb25lbnQuXG4gICAgICAgICAgICBQbGVhc2UgdXNlICdhZGRDb21wb25lbnQnIG1ldGhvZCBpbiAke0Zvcm1HZW5lcmF0b3JTZXJ2aWNlLm5hbWV9IHRvIGRlZmluZSBhcHByb3ByaWF0ZSByZWxhdGlvbnMuYCk7XG5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvcm1JdGVtID0gdGhpcy5fYXNzaWduRm9ybUl0ZW1WYWxpZGF0b3JzKGZvcm1JdGVtLCBmb3JtKTtcblxuICAgICAgICBjb25zdCBmb3JtQ29udHJvbCA9IG5ldyBEeW5hbWljRm9ybUNvbnRyb2woZm9ybUl0ZW0uZGVmYXVsdCwge1xuICAgICAgICAgICAgdmFsaWRhdG9yczogZm9ybUl0ZW0udmFsaWRhdG9ycyxcbiAgICAgICAgICAgIGFzeW5jVmFsaWRhdG9yczogZm9ybUl0ZW0uYXN5bmNWYWxpZGF0b3JzLFxuICAgICAgICAgICAgZHluYW1pY0Zvcm1JdGVtOiBmb3JtSXRlbSxcbiAgICAgICAgICAgIHVwZGF0ZU9uOiAnY2hhbmdlJ1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoaXNGdW5jdGlvbihmb3JtSXRlbS5vbmNoYW5nZSkpIHtcbiAgICAgICAgICAgIGZvcm1Db250cm9sLnZhbHVlQ2hhbmdlcy5waXBlKGRlYm91bmNlVGltZSg1MCksIHRha2VVbnRpbCh0aGlzLl9vbkRlc3Ryb3kkKSkuc3Vic2NyaWJlKGFzeW5jICh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG9iaiA9IGZvcm1JdGVtLm9uY2hhbmdlISh2YWx1ZSwgdGhpcy5mb3JtcywgZm9ybUNvbnRyb2wpO1xuXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fZ2V0RnVuY3Rpb25WYWx1ZShvYmopO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3JtQ29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcblxuICAgICAgICByZXR1cm4gZm9ybUNvbnRyb2w7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIGFzeW5jIF9jaGVja0Zvcm1Db250cm9sc1Zpc2liaWxpdHkoXG4gICAgICAgIGZvcm06IER5bmFtaWNGb3JtR3JvdXAgfCBEeW5hbWljRm9ybUNvbnRyb2xHcm91cCxcbiAgICAgICAgZm9ybVZhbHVlOiBhbnlcbiAgICApOiBQcm9taXNlPHsgW2tleTogc3RyaW5nXTogYm9vbGVhbiB9PiB7XG4gICAgICAgIGxldCBzaG91bGRTaG93RmllbGRzOiB7IFtrZXk6IHN0cmluZ106IGJvb2xlYW4gfSA9IHt9O1xuICAgICAgICBmb3JtID0gZm9ybSBpbnN0YW5jZW9mIER5bmFtaWNGb3JtQ29udHJvbEdyb3VwID8gZm9ybSA6IGZvcm07XG5cbiAgICAgICAgZm9yIChjb25zdCBba2V5LCBjb250cm9sXSBvZiBPYmplY3QuZW50cmllcyhmb3JtLmNvbnRyb2xzKSkge1xuICAgICAgICAgICAgY29uc3QgZm9ybUl0ZW0gPSBjb250cm9sLmZvcm1JdGVtO1xuXG4gICAgICAgICAgICBpZiAoIWlzRm9ybUZpZWxkSXRlbShmb3JtSXRlbSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBncm91cFZpc2libGVJdGVtcyA9IGF3YWl0IHRoaXMuX2NoZWNrRm9ybUNvbnRyb2xzVmlzaWJpbGl0eShcbiAgICAgICAgICAgICAgICAgICAgY29udHJvbCBhcyBEeW5hbWljRm9ybUNvbnRyb2xHcm91cCxcbiAgICAgICAgICAgICAgICAgICAgZm9ybVZhbHVlXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIHNob3VsZFNob3dGaWVsZHMgPSBPYmplY3QuYXNzaWduKHNob3VsZFNob3dGaWVsZHMsIGdyb3VwVmlzaWJsZUl0ZW1zKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFmb3JtSXRlbS53aGVuKSB7XG4gICAgICAgICAgICAgICAgc2hvdWxkU2hvd0ZpZWxkc1trZXldID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3Qgb2JqID0gZm9ybUl0ZW0ud2hlbihmb3JtVmFsdWUsIHRoaXMuZm9ybXMsIGNvbnRyb2wpO1xuICAgICAgICAgICAgc2hvdWxkU2hvd0ZpZWxkc1trZXldID0gYXdhaXQgdGhpcy5fZ2V0RnVuY3Rpb25WYWx1ZShvYmopO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHNob3VsZFNob3dGaWVsZHM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBwYXJhbSBmb3JtSXRlbVxuICAgICAqIEBwYXJhbSBmb3JtXG4gICAgICogQHBhcmFtIGtleVxuICAgICAqIEByZXR1cm5zXG4gICAgICovXG4gICAgcHJpdmF0ZSBhc3luYyBfZ2V0Rm9ybUl0ZW1Qcm9wZXJ0eVZhbHVlPFQgPSBzdHJpbmc+KFxuICAgICAgICBmb3JtSXRlbTogRHluYW1pY0Zvcm1GaWVsZEl0ZW0sXG4gICAgICAgIGZvcm06IER5bmFtaWNGb3JtR3JvdXAsXG4gICAgICAgIGtleToga2V5b2YgRHluYW1pY0Zvcm1GaWVsZEl0ZW1cbiAgICApOiBQcm9taXNlPFQ+IHtcbiAgICAgICAgbGV0IHZhbHVlID0gZm9ybUl0ZW1ba2V5XTtcblxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjb25zdCBvYmogPSB2YWx1ZSh0aGlzLl9nZXRGb3JtVmFsdWVXaXRob3V0VW5ncm91cGVkKGZvcm0pKTtcblxuICAgICAgICAgICAgdmFsdWUgPSBhd2FpdCB0aGlzLl9nZXRGdW5jdGlvblZhbHVlKG9iaik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gKGF3YWl0IHRoaXMuX2dldEZ1bmN0aW9uVmFsdWUodmFsdWUpKSBhcyBUO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBhc3luYyBfZ2V0Rm9ybUl0ZW1Qcm9wZXJ0aWVzPFRUeXBlcyBleHRlbmRzIGFueVtdID0gYW55W10+KFxuICAgICAgICBmb3JtSXRlbTogRHluYW1pY0Zvcm1GaWVsZEl0ZW0sXG4gICAgICAgIGZvcm06IER5bmFtaWNGb3JtR3JvdXAsXG4gICAgICAgIGtleXM6IHN0cmluZ1tdXG4gICAgKTogUHJvbWlzZTxUVHlwZXM+IHtcbiAgICAgICAgY29uc3QgcHJvbWlzZXM6IFByb21pc2U8YW55PltdID0gW107XG4gICAgICAgIGtleXMuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICBwcm9taXNlcy5wdXNoKHRoaXMuX2dldEZvcm1JdGVtUHJvcGVydHlWYWx1ZShmb3JtSXRlbSwgZm9ybSwga2V5KSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gKGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKSkgYXMgVFR5cGVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAcGFyYW0gZm9ybUl0ZW1cbiAgICAgKiBAcGFyYW0gZm9ybVxuICAgICAqIEByZXR1cm5zXG4gICAgICovXG4gICAgcHJpdmF0ZSBhc3luYyBfZ2V0Rm9ybUl0ZW1DaG9pY2VzKGZvcm1JdGVtOiBEeW5hbWljRm9ybUZpZWxkSXRlbSwgZm9ybTogRHluYW1pY0Zvcm1Hcm91cCk6IFByb21pc2U8U2VsZWN0SXRlbVtdPiB7XG4gICAgICAgIGNvbnN0IGRlZmF1bHRDaG9pY2VzID0gYXdhaXQgdGhpcy5fZ2V0Rm9ybUl0ZW1Qcm9wZXJ0eVZhbHVlPER5bmFtaWNGb3JtSXRlbUNob2ljZVR5cGVzW10+KFxuICAgICAgICAgICAgZm9ybUl0ZW0sXG4gICAgICAgICAgICBmb3JtLFxuICAgICAgICAgICAgJ2Nob2ljZXMnXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKCFkZWZhdWx0Q2hvaWNlcykge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRlZmF1bHRDaG9pY2VzLm1hcCgoYzogc3RyaW5nIHwgbnVtYmVyIHwgU2VsZWN0SXRlbSkgPT5cbiAgICAgICAgICAgIHR5cGVvZiBjID09PSAnb2JqZWN0JyA/IGMgOiAoeyBsYWJlbDogYywgdmFsdWU6IGMgfSBhcyBTZWxlY3RJdGVtKVxuICAgICAgICApIGFzIFNlbGVjdEl0ZW1bXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGRlc2NyaXB0aW9uIFJldHVybnMgdmFsdWUgZnJvbSBQcm9taXNlLWxpa2UsIE9ic2VydmFibGUtbGlrZSwgc2ltcGxlIGZ1bmN0aW9uIG9yIGp1c3Qgc29tZSBvYmplY3QuXG4gICAgICogQHBhcmFtIG9ialxuICAgICAqIEByZXR1cm5zXG4gICAgICovXG4gICAgcHJpdmF0ZSBhc3luYyBfZ2V0RnVuY3Rpb25WYWx1ZShvYmo6IGFueSk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIGNvbnN0IHN0cmF0ZWd5ID0gc2VsZWN0U3RyYXRlZ3kob2JqKTtcblxuICAgICAgICBsZXQgcmVzdWx0OiBhbnk7XG5cbiAgICAgICAgYXdhaXQgc3RyYXRlZ3kuY3JlYXRlU3Vic2NyaXB0aW9uKG9iaiwgKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJlc3VsdCA9IHZhbHVlO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoaXNGdW5jdGlvbihyZXN1bHQpKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9nZXRGdW5jdGlvblZhbHVlKHJlc3VsdCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfZm9ybWF0UGFzc3dvcmRWYWx1ZShwYXNzd29yZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuICcqJy5yZXBlYXQocGFzc3dvcmQ/Lmxlbmd0aCk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9nZXRNZXJnZWRGb3JtRmllbGRJdGVtQ29uZmlnKGZvcm1JdGVtOiBEeW5hbWljRm9ybUl0ZW1NYXApOiBEeW5hbWljRm9ybUl0ZW1NYXAge1xuICAgICAgICByZXR1cm4gbWVyZ2UoY2xvbmVEZWVwKHRoaXMuX2RlZmF1bHRJdGVtQ29uZmlnKSwgZm9ybUl0ZW0pO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfdHJhbnNmb3JtRm9ybUl0ZW1zKGZvcm1JdGVtczogTWFwPHN0cmluZywgRHluYW1pY0Zvcm1JdGVtTWFwPik6IE1hcDxzdHJpbmcsIER5bmFtaWNGb3JtSXRlbU1hcD4ge1xuICAgICAgICBmb3JtSXRlbXMuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGlmICghaXNGb3JtRmllbGRJdGVtKGl0ZW0pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3JtSXRlbXMuc2V0KGluZGV4LCB0aGlzLl9nZXRNZXJnZWRGb3JtRmllbGRJdGVtQ29uZmlnKGl0ZW0pKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGZvcm1JdGVtcztcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgYXN5bmMgX3RyaWdnZXJGaWVsZHNPbmNoYW5nZShmb3JtOiBEeW5hbWljRm9ybUdyb3VwIHwgRHluYW1pY0Zvcm1Db250cm9sR3JvdXApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgZm9yIChjb25zdCBjb250cm9sIG9mIE9iamVjdC52YWx1ZXMoZm9ybS5jb250cm9scykpIHtcbiAgICAgICAgICAgIGNvbnN0IGZvcm1JdGVtID0gY29udHJvbC5mb3JtSXRlbTtcblxuICAgICAgICAgICAgaWYgKCFpc0Zvcm1GaWVsZEl0ZW0oZm9ybUl0ZW0pKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fdHJpZ2dlckZpZWxkc09uY2hhbmdlKGNvbnRyb2wgYXMgRHluYW1pY0Zvcm1Db250cm9sR3JvdXApO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZm9ybUl0ZW0ub25jaGFuZ2UpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBvYmogPSBmb3JtSXRlbS5vbmNoYW5nZShjb250cm9sLnZhbHVlIGFzIGFueSwgdGhpcy5mb3JtcywgY29udHJvbCBhcyBEeW5hbWljRm9ybUNvbnRyb2wpO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX2dldEZ1bmN0aW9uVmFsdWUob2JqKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfY2xvbmVPbGRGb3JtR3JvdXAobmV3R3JvdXA6IER5bmFtaWNGb3JtQ29udHJvbEdyb3VwLCBvbGRHcm91cD86IER5bmFtaWNGb3JtQ29udHJvbEdyb3VwKTogdm9pZCB7XG4gICAgICAgIE9iamVjdC5rZXlzKG5ld0dyb3VwLmNvbnRyb2xzKS5mb3JFYWNoKChjb250cm9sTmFtZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY29udHJvbCA9IG5ld0dyb3VwLmdldChjb250cm9sTmFtZSk7XG4gICAgICAgICAgICBjb25zdCBvbGRDb250cm9sID0gb2xkR3JvdXA/LmdldChjb250cm9sTmFtZSkgYXMgRHluYW1pY0Zvcm1Db250cm9sR3JvdXA7XG4gICAgICAgICAgICBpZiAoIW9sZENvbnRyb2wpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIER5bmFtaWNGb3JtQ29udHJvbEdyb3VwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fY2xvbmVPbGRGb3JtR3JvdXAoY29udHJvbCwgb2xkQ29udHJvbCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb250cm9sPy5zZXRWYWx1ZShvbGRDb250cm9sLnZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG5cbiAgICAgICAgICAgIGlmIChvbGRDb250cm9sLnRvdWNoZWQpIHtcbiAgICAgICAgICAgICAgICBjb250cm9sPy5tYXJrQXNUb3VjaGVkKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiJdfQ==
443
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1nZW5lcmF0b3Iuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvcGxhdGZvcm0vZm9ybS9mb3JtLWdlbmVyYXRvci9mb3JtLWdlbmVyYXRvci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFRLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRyxPQUFPLEVBQW9CLFdBQVcsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzRSxPQUFPLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRTdDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUU5QyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUdoRSxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUMvRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsdUJBQXVCLEVBQTJCLE1BQU0sd0JBQXdCLENBQUM7QUFDOUcsT0FBTyxFQUFFLHNDQUFzQyxFQUFFLE1BQU0sOENBQThDLENBQUM7QUFDdEcsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQVk1QyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsMEJBQTBCLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQzs7OztBQUV0SDs7R0FFRztBQUVILE1BQU0sT0FBTyxvQkFBb0I7SUFvQjdCLGNBQWM7SUFDZCxZQUNZLEdBQWdCLEVBQ2hCLG1CQUEyRCxFQUkzRCxrQkFBaUQsRUFJakQsZUFBNkM7UUFUN0MsUUFBRyxHQUFILEdBQUcsQ0FBYTtRQUNoQix3QkFBbUIsR0FBbkIsbUJBQW1CLENBQXdDO1FBSTNELHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBK0I7UUFJakQsb0JBQWUsR0FBZixlQUFlLENBQThCO1FBOUJ6RDs7V0FFRztRQUNNLFVBQUssR0FBa0MsSUFBSSxHQUFHLEVBQTRCLENBQUM7UUFFcEY7O1dBRUc7UUFDSCx5QkFBb0IsR0FBRyx5QkFBeUIsQ0FBQztRQUVqRCxjQUFjO1FBQ0csWUFBTyxHQUF3QiwwQkFBMEIsQ0FBQztRQUUzRTs7O1dBR0c7UUFDYyxnQkFBVyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQWU5QyxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLFNBQVMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQztJQUNuRixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsS0FBSyxDQUFDLFlBQVksQ0FBQyxRQUFnQixFQUFFLFNBQTBDO1FBQzNFLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzlDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBcUIsQ0FBQztRQUVwRCxNQUFNLGdCQUFnQixHQUFHLElBQUksdUJBQXVCLENBQ2hEO1lBQ0ksSUFBSSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMscUJBQXFCO1NBQzNDLEVBQ0QsRUFBRSxDQUNMLENBQUM7UUFFRixnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsS0FBSyxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7UUFFNUMsU0FBUyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUVoRCxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7WUFDM0IsSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsRUFBRTtnQkFDNUIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLElBQUksUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUFFO29CQUM5QyxPQUFPO2lCQUNWO2dCQUVELE1BQU0sS0FBSyxHQUFHLElBQUksdUJBQXVCLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUV4RCxRQUFRLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLGFBQWEsRUFBRSxFQUFFO29CQUNyQyxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyx3QkFBd0IsQ0FDbEQsYUFBNkMsRUFDN0MsSUFBSSxDQUNQLENBQUM7b0JBRUYsSUFBSSxDQUFDLGdCQUFnQixFQUFFO3dCQUNuQixPQUFPO3FCQUNWO29CQUVELEtBQUssQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO29CQUV2RCxnQkFBZ0IsQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO2dCQUNsRSxDQUFDLENBQUMsQ0FBQztnQkFFSCxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQ3RDLE9BQU87YUFDVjtZQUVELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxRQUF3QyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBRWxHLElBQUksQ0FBQyxXQUFXLEVBQUU7Z0JBQ2QsT0FBTzthQUNWO1lBRUQsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLENBQUM7WUFFeEQsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQztZQUU5RCxXQUFXLENBQUMsc0JBQXNCLENBQUMsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUM3RCxDQUFDLENBQUMsQ0FBQztRQUVILE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUVoRSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMscUJBQXFCLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztRQUV0RSxrRkFBa0Y7UUFDbEYsS0FBSyxNQUFNLEdBQUcsSUFBSSxnQkFBZ0IsRUFBRTtZQUNoQyxNQUFNLFFBQVEsR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBRXBDLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLEVBQUU7Z0JBQzVCLFNBQVM7YUFDWjtZQUVELE1BQU0sQ0FBQyxDQUFDLE9BQU8sRUFBRSxXQUFXLEVBQUUsWUFBWSxDQUFDLEVBQUUsT0FBTyxDQUFDLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDO2dCQUN0RSxJQUFJLENBQUMsc0JBQXNCLENBQXdCLFFBQVEsRUFBRSxnQkFBZ0IsRUFBRTtvQkFDM0UsU0FBUztvQkFDVCxhQUFhO29CQUNiLFNBQVM7aUJBQ1osQ0FBQztnQkFDRixJQUFJLENBQUMsbUJBQW1CLENBQUMsUUFBUSxFQUFFLGdCQUFnQixDQUFDO2FBQ3ZELENBQUMsQ0FBQztZQUVILFFBQVEsQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1lBQzNCLFFBQVEsQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO1lBQ25DLFFBQVEsQ0FBQyxPQUFPLEdBQUcsWUFBWSxDQUFDO1lBQ2hDLFFBQVEsQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1lBRTNCLDhDQUE4QztZQUM5QyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7WUFFcEUsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsR0FBRyxRQUF3QyxDQUFDO1NBQ3RGO1FBRUQsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsV0FBVyxFQUFFLEVBQUU7WUFDL0MsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQTRCLENBQUM7WUFDcEUsTUFBTSxVQUFVLEdBQUcsWUFBWSxFQUFFLEdBQUcsQ0FBQyxXQUFXLENBQTRCLENBQUM7WUFDN0UsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUNwRCxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUUvQixPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxLQUFLLENBQUMsVUFBVSxDQUFDLE9BQXdCLEVBQUUsSUFBc0IsRUFBRSxPQUFpQixFQUFFO1FBQ2xGLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7UUFFckQsSUFBSSxTQUFTLFlBQVksdUJBQXVCLEVBQUU7WUFDOUMsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUFDLE9BQXVDLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDakcsU0FBUyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1lBQ2hELE9BQU87U0FDVjtJQUNMLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsYUFBYSxDQUFDLFdBQW1CLEVBQUUsSUFBc0IsRUFBRSxPQUFpQixFQUFFO1FBQzFFLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7UUFFckQsSUFBSSxTQUFTLFlBQVksdUJBQXVCLEVBQUU7WUFDOUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQztTQUN4QztJQUNMLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILEtBQUssQ0FBQyxZQUFZLENBQ2QsSUFBZ0QsRUFDaEQsV0FBVyxHQUFHLEtBQUs7UUFFbkIsTUFBTSxJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFeEMsTUFBTSxTQUFTLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUV4QyxLQUFLLE1BQU0sQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUU7WUFDdEQsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQztZQUVsQyxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxFQUFFO2dCQUM1QixTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQWtDLEVBQUUsV0FBVyxDQUFDLENBQUM7Z0JBQ3hGLFNBQVM7YUFDWjtZQUVELElBQUksUUFBUSxDQUFDLFVBQVUsS0FBSyxLQUFLLEVBQUU7Z0JBQy9CLE9BQU8sU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNwQixTQUFTO2FBQ1o7WUFFRCxJQUFJLFFBQVEsQ0FBQyxXQUFXLEVBQUU7Z0JBQ3RCLE1BQU0sR0FBRyxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQztnQkFDcEUsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQ3BEO1lBRUQsSUFBSSxXQUFXLElBQUksUUFBUSxDQUFDLGFBQWEsRUFBRTtnQkFDdkMsTUFBTSxHQUFHLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDO2dCQUN0RSxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDcEQ7WUFFRCxJQUFJLFdBQVcsSUFBSSxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssVUFBVSxFQUFFO2dCQUN2RCxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQzFEO1NBQ0o7UUFFRCxPQUFPLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFlBQVksQ0FBQyxTQUFnRCxFQUFFLEtBQWU7UUFDMUUsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQUMsWUFBWSxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNuRSxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILDRCQUE0QixDQUFDLElBQVk7UUFDckMsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQUMsNEJBQTRCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdkUsQ0FBQztJQUVEOzs7T0FHRztJQUNILHVCQUF1QixDQUFDLEdBQVc7UUFDL0IsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxzQkFBc0IsQ0FBQyxJQUFZLEVBQUUsS0FBYTtRQUM5QyxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDO0lBQzVDLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxJQUFzQjtRQUM5QyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsNkJBQTZCLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQzVFLE9BQU8sTUFBTSxJQUFJLENBQUMsNEJBQTRCLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ3BFLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILGNBQWMsQ0FBQyxJQUFzQixFQUFFLEdBQUcsWUFBc0I7UUFDNUQsWUFBWSxHQUFHLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFlLEVBQUUsSUFBSSxFQUFFLEVBQUU7WUFDekQsS0FBSyxHQUFHLENBQUMsR0FBRyxLQUFLLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDO1lBRXJFLE9BQU8sS0FBSyxDQUFDO1FBQ2pCLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVQLElBQUksT0FBTyxHQUFHLElBQUksRUFBRSxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUM7UUFFdEMseURBQXlEO1FBQ3pELElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDVixPQUFPLEdBQUcsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMscUJBQXFCLEVBQUUsR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDO1NBQzlFO1FBRUQsT0FBTyxPQUFrQyxDQUFDO0lBQzlDLENBQUM7SUFFRCw2Q0FBNkM7SUFDN0MsU0FBUyxDQUFDLElBQXNCO1FBQzVCLEtBQUssTUFBTSxPQUFPLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUU7WUFDaEQsSUFBSSxPQUFPLFlBQVksdUJBQXVCLEVBQUU7Z0JBQzVDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ3hCLE9BQU87YUFDVjtZQUNELG9CQUFvQjtZQUNwQixPQUFPLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDOUM7SUFDTCxDQUFDO0lBRUQsY0FBYztJQUNkLDZCQUE2QixDQUFDLEtBQVU7UUFDcEMsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxFQUFFO1lBQzNDLE1BQU0sbUJBQW1CLEdBQXdCLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLHFCQUFxQixDQUFDLENBQUM7WUFDM0YsS0FBSyxNQUFNLENBQUMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUMsRUFBRTtnQkFDdkUsS0FBSyxDQUFDLFNBQVMsQ0FBQyxHQUFHLFVBQVUsQ0FBQzthQUNqQztTQUNKO1FBQ0QsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBRWpELE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7SUFFRCxjQUFjO0lBQ04seUJBQXlCLENBQzdCLFFBQXNDLEVBQ3RDLElBQXNCO1FBRXRCLElBQUksU0FBUyxHQUE0QixJQUFJLENBQUM7UUFFOUMsSUFBSSxVQUFVLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQy9CLFNBQVMsR0FBRyxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUU7Z0JBQzFCLE1BQU0sR0FBRyxHQUFHLFFBQVEsQ0FBQyxRQUFTLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsNkJBQTZCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztnQkFFeEYsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBRWpELE1BQU0sU0FBUyxHQUFHLEVBQUUsQ0FBQztnQkFFckIsU0FBUyxDQUFDLEdBQXdCLE9BQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxXQUFXLENBQUM7b0JBQ2hFLE9BQU8sTUFBTSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7Z0JBRWhELE9BQU8sTUFBTSxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDaEQsQ0FBQyxDQUFDO1lBRUYsUUFBUSxDQUFDLGVBQWUsR0FBRyxRQUFRLENBQUMsZUFBZSxJQUFJLEVBQUUsQ0FBQztZQUMxRCxRQUFRLENBQUMsZUFBZTtnQkFDcEIsT0FBTyxRQUFRLENBQUMsZUFBZSxLQUFLLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUM7WUFFM0csUUFBUSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDNUM7UUFFRCxRQUFRLENBQUMsVUFBVSxHQUFHLFFBQVEsQ0FBQyxVQUFVLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLENBQUM7UUFFeEUsUUFBUSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUMsUUFBUSxJQUFJLFFBQVEsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUUzRixPQUFPLFFBQVEsQ0FBQztJQUNwQixDQUFDO0lBRUQsY0FBYztJQUNOLHdCQUF3QixDQUM1QixRQUFzQyxFQUN0QyxJQUFzQjtRQUV0QixNQUFNLHFCQUFxQixHQUFHLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFL0UsSUFBSSxDQUFDLHFCQUFxQixFQUFFO1lBQ3hCLE9BQU8sQ0FBQyxJQUFJLENBQUMsY0FBYyxRQUFRLENBQUMsSUFBSSxnQkFBZ0IsUUFBUSxDQUFDLElBQUk7a0RBQy9CLG9CQUFvQixDQUFDLElBQUksbUNBQW1DLENBQUMsQ0FBQztZQUVwRyxPQUFPO1NBQ1Y7UUFFRCxRQUFRLEdBQUcsSUFBSSxDQUFDLHlCQUF5QixDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUUxRCxNQUFNLFdBQVcsR0FBRyxJQUFJLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUU7WUFDekQsVUFBVSxFQUFFLFFBQVEsQ0FBQyxVQUFVO1lBQy9CLGVBQWUsRUFBRSxRQUFRLENBQUMsZUFBZTtZQUN6QyxlQUFlLEVBQUUsUUFBUTtZQUN6QixRQUFRLEVBQUUsUUFBUTtTQUNyQixDQUFDLENBQUM7UUFFSCxJQUFJLFVBQVUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEVBQUU7WUFDL0IsV0FBVyxDQUFDLFlBQVk7aUJBQ25CLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLEVBQUUsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2lCQUM1RCxTQUFTLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxFQUFFO2dCQUN2QixNQUFNLEdBQUcsR0FBRyxRQUFRLENBQUMsUUFBUyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxDQUFDO2dCQUUvRCxNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN0QyxDQUFDLENBQUMsQ0FBQztTQUNWO1FBRUQsV0FBVyxDQUFDLHNCQUFzQixDQUFDLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7UUFFekQsT0FBTyxXQUFXLENBQUM7SUFDdkIsQ0FBQztJQUVELGNBQWM7SUFDTixLQUFLLENBQUMsNEJBQTRCLENBQ3RDLElBQWdELEVBQ2hELFNBQWM7UUFFZCxJQUFJLGdCQUFnQixHQUErQixFQUFFLENBQUM7UUFDdEQsSUFBSSxHQUFHLElBQUksWUFBWSx1QkFBdUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFFN0QsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQ3hELE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUM7WUFFbEMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsRUFBRTtnQkFDNUIsTUFBTSxpQkFBaUIsR0FBRyxNQUFNLElBQUksQ0FBQyw0QkFBNEIsQ0FDN0QsT0FBa0MsRUFDbEMsU0FBUyxDQUNaLENBQUM7Z0JBRUYsZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO2dCQUN0RSxTQUFTO2FBQ1o7WUFFRCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRTtnQkFDaEIsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDO2dCQUM3QixTQUFTO2FBQ1o7WUFFRCxNQUFNLEdBQUcsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQzFELGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxHQUFHLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQzdEO1FBRUQsT0FBTyxnQkFBZ0IsQ0FBQztJQUM1QixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ssS0FBSyxDQUFDLHlCQUF5QixDQUNuQyxRQUE4QixFQUM5QixJQUFzQixFQUN0QixHQUErQjtRQUUvQixJQUFJLEtBQUssR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFMUIsSUFBSSxPQUFPLEtBQUssS0FBSyxVQUFVLEVBQUU7WUFDN0IsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBRTVELEtBQUssR0FBRyxNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUM3QztRQUVELE9BQU8sQ0FBQyxNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBTSxDQUFDO0lBQ3RELENBQUM7SUFFRCxjQUFjO0lBQ04sS0FBSyxDQUFDLHNCQUFzQixDQUNoQyxRQUE4QixFQUM5QixJQUFzQixFQUN0QixJQUFjO1FBRWQsTUFBTSxRQUFRLEdBQW1CLEVBQUUsQ0FBQztRQUNwQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7WUFDakIsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMseUJBQXlCLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3ZFLENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxDQUFDLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBVyxDQUFDO0lBQ25ELENBQUM7SUFFRDs7Ozs7T0FLRztJQUNLLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxRQUE4QixFQUFFLElBQXNCO1FBQ3BGLE1BQU0sY0FBYyxHQUFHLE1BQU0sSUFBSSxDQUFDLHlCQUF5QixDQUN2RCxRQUFRLEVBQ1IsSUFBSSxFQUNKLFNBQVMsQ0FDWixDQUFDO1FBRUYsSUFBSSxDQUFDLGNBQWMsRUFBRTtZQUNqQixPQUFPLEVBQUUsQ0FBQztTQUNiO1FBRUQsT0FBTyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBK0IsRUFBRSxFQUFFLENBQzFELE9BQU8sQ0FBQyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBRSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBaUIsQ0FDckQsQ0FBQztJQUN0QixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSyxLQUFLLENBQUMsaUJBQWlCLENBQUMsR0FBUTtRQUNwQyxNQUFNLFFBQVEsR0FBRyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFckMsSUFBSSxNQUFXLENBQUM7UUFFaEIsTUFBTSxRQUFRLENBQUMsa0JBQWtCLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBVSxFQUFFLEVBQUU7WUFDbEQsTUFBTSxHQUFHLEtBQUssQ0FBQztRQUNuQixDQUFDLENBQUMsQ0FBQztRQUVILElBQUksVUFBVSxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ3BCLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQ3hDO1FBRUQsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQztJQUVELGNBQWM7SUFDTixvQkFBb0IsQ0FBQyxRQUFnQjtRQUN6QyxPQUFPLEdBQUcsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFRCxjQUFjO0lBQ04sNkJBQTZCLENBQUMsUUFBNEI7UUFDOUQsT0FBTyxLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQy9ELENBQUM7SUFFRCxjQUFjO0lBQ04sbUJBQW1CLENBQUMsU0FBMEM7UUFDbEUsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRTtZQUM5QixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUN4QixPQUFPO2FBQ1Y7WUFFRCxTQUFTLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsNkJBQTZCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNuRSxDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sU0FBUyxDQUFDO0lBQ3JCLENBQUM7SUFFRCxjQUFjO0lBQ04sS0FBSyxDQUFDLHNCQUFzQixDQUFDLElBQWdEO1FBQ2pGLEtBQUssTUFBTSxPQUFPLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUU7WUFDaEQsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQztZQUVsQyxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxFQUFFO2dCQUM1QixNQUFNLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxPQUFrQyxDQUFDLENBQUM7Z0JBQ3RFLFNBQVM7YUFDWjtZQUVELElBQUksUUFBUSxDQUFDLFFBQVEsRUFBRTtnQkFDbkIsTUFBTSxHQUFHLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsS0FBWSxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsT0FBNkIsQ0FBQyxDQUFDO2dCQUMvRixNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUNyQztTQUNKO0lBQ0wsQ0FBQztJQUVELGNBQWM7SUFDTixrQkFBa0IsQ0FBQyxRQUFpQyxFQUFFLFFBQWtDO1FBQzVGLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFdBQVcsRUFBRSxFQUFFO1lBQ25ELE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDMUMsTUFBTSxVQUFVLEdBQUcsUUFBUSxFQUFFLEdBQUcsQ0FBQyxXQUFXLENBQTRCLENBQUM7WUFDekUsSUFBSSxDQUFDLFVBQVUsRUFBRTtnQkFDYixPQUFPO2FBQ1Y7WUFDRCxJQUFJLE9BQU8sWUFBWSx1QkFBdUIsRUFBRTtnQkFDNUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQztnQkFDN0MsT0FBTzthQUNWO1lBRUQsT0FBTyxFQUFFLFFBQVEsQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7WUFFMUQsSUFBSSxVQUFVLENBQUMsT0FBTyxFQUFFO2dCQUNwQixPQUFPLEVBQUUsYUFBYSxFQUFFLENBQUM7YUFDNUI7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7OEdBMWlCUSxvQkFBb0IsbUdBMEJqQiwwQkFBMEIsNkNBSTFCLHFCQUFxQjtrSEE5QnhCLG9CQUFvQjs7MkZBQXBCLG9CQUFvQjtrQkFEaEMsVUFBVTs7MEJBeUJGLFFBQVE7OzBCQUNSLFFBQVE7OzBCQUNSLE1BQU07MkJBQUMsMEJBQTBCOzswQkFFakMsUUFBUTs7MEJBQ1IsUUFBUTs7MEJBQ1IsTUFBTTsyQkFBQyxxQkFBcUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEZXN0cm95UmVmLCBJbmplY3QsIEluamVjdGFibGUsIE9wdGlvbmFsLCBTa2lwU2VsZiwgVHlwZSwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBc3luY1ZhbGlkYXRvckZuLCBGb3JtQnVpbGRlciwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IGlzRnVuY3Rpb24sIHNlbGVjdFN0cmF0ZWd5IH0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9jZGsvdXRpbHMnO1xuaW1wb3J0IHsgY2xvbmVEZWVwLCBtZXJnZSB9IGZyb20gJ2xvZGFzaC1lcyc7XG5cbmltcG9ydCB7IGRlYm91bmNlVGltZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgU2VsZWN0SXRlbSB9IGZyb20gJ0BmdW5kYW1lbnRhbC1uZ3gvcGxhdGZvcm0vc2hhcmVkJztcbmltcG9ydCB7IEJhc2VEeW5hbWljRm9ybUdlbmVyYXRvckNvbnRyb2wgfSBmcm9tICcuL2Jhc2UtZHluYW1pYy1mb3JtLWdlbmVyYXRvci1jb250cm9sJztcbmltcG9ydCB7IERFRkFVTFRfVkFMSURBVElPTl9FUlJPUlMgfSBmcm9tICcuL2NvbmZpZy9kZWZhdWx0LXZhbGlkYXRpb24tZXJyb3JzJztcbmltcG9ydCB7IER5bmFtaWNGb3JtQ29udHJvbCwgRHluYW1pY0Zvcm1Db250cm9sR3JvdXAsIER5bmFtaWNGb3JtR3JvdXBDb250cm9sIH0gZnJvbSAnLi9keW5hbWljLWZvcm0tY29udHJvbCc7XG5pbXBvcnQgeyBGb3JtR2VuZXJhdG9yQ29tcG9uZW50c0FjY2Vzc29yU2VydmljZSB9IGZyb20gJy4vZm9ybS1nZW5lcmF0b3ItY29tcG9uZW50cy1hY2Nlc3Nvci5zZXJ2aWNlJztcbmltcG9ydCB7IGlzRm9ybUZpZWxkSXRlbSB9IGZyb20gJy4vaGVscGVycyc7XG5pbXBvcnQgeyBEeW5hbWljRm9ybUdyb3VwIH0gZnJvbSAnLi9pbnRlcmZhY2VzL2R5bmFtaWMtZm9ybS1ncm91cCc7XG5pbXBvcnQge1xuICAgIER5bmFtaWNGb3JtRmllbGRJdGVtLFxuICAgIER5bmFtaWNGb3JtSXRlbSxcbiAgICBEeW5hbWljRm9ybUl0ZW1DaG9pY2VUeXBlcyxcbiAgICBEeW5hbWljRm9ybUl0ZW1NYXAsXG4gICAgRHluYW1pY0Zvcm1WYWx1ZSxcbiAgICBQcmVwYXJlZER5bmFtaWNGb3JtRmllbGRJdGVtXG59IGZyb20gJy4vaW50ZXJmYWNlcy9keW5hbWljLWZvcm0taXRlbSc7XG5pbXBvcnQgeyBGb3JtQ29tcG9uZW50RGVmaW5pdGlvbiB9IGZyb20gJy4vaW50ZXJmYWNlcy9mb3JtLWNvbXBvbmVudC1kZWZpbml0aW9uJztcbmltcG9ydCB7IEZvcm1HZW5lcmF0b3JDb25maWcgfSBmcm9tICcuL2ludGVyZmFjZXMvZm9ybS1nZW5lcmF0b3ItbW9kdWxlLWNvbmZpZyc7XG5pbXBvcnQgeyBGT1JNX0dFTkVSQVRPUl9DT05GSUcsIEZPUk1fR0VORVJBVE9SX0lURU1fQ09ORklHLCBkZWZhdWx0Rm9ybUdlbmVyYXRvckNvbmZpZyB9IGZyb20gJy4vcHJvdmlkZXJzL3Byb3ZpZGVycyc7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEZvcm0gZ2VuZXJhdG9yIHNlcnZpY2VcbiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEZvcm1HZW5lcmF0b3JTZXJ2aWNlIHtcbiAgICAvKipcbiAgICAgKiBNYXAgb2YgZ2VuZXJhdGVkIGZvcm1zIHRvIGFjY2VzcyBsYXRlci5cbiAgICAgKi9cbiAgICByZWFkb25seSBmb3JtczogTWFwPHN0cmluZywgRHluYW1pY0Zvcm1Hcm91cD4gPSBuZXcgTWFwPHN0cmluZywgRHluYW1pY0Zvcm1Hcm91cD4oKTtcblxuICAgIC8qKlxuICAgICAqIFByZWRlZmluZWQgdmFsaWRhdGlvbiBlcnJvciBtZXNzYWdlcy5cbiAgICAgKi9cbiAgICB2YWxpZGF0aW9uRXJyb3JIaW50cyA9IERFRkFVTFRfVkFMSURBVElPTl9FUlJPUlM7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NvbmZpZzogRm9ybUdlbmVyYXRvckNvbmZpZyA9IGRlZmF1bHRGb3JtR2VuZXJhdG9yQ29uZmlnO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEFuIFJ4SlMgU3ViamVjdCB0aGF0IHdpbGwga2lsbCB0aGUgZGF0YSBzdHJlYW0gdXBvbiBjb21wb25lbnTigJlzIGRlc3RydWN0aW9uIChmb3IgdW5zdWJzY3JpYmluZylcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IF9kZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSBfZmI6IEZvcm1CdWlsZGVyLFxuICAgICAgICBwcml2YXRlIF9jb21wb25lbnRzQWNjZXNzb3I6IEZvcm1HZW5lcmF0b3JDb21wb25lbnRzQWNjZXNzb3JTZXJ2aWNlLFxuICAgICAgICBAT3B0aW9uYWwoKVxuICAgICAgICBAU2tpcFNlbGYoKVxuICAgICAgICBASW5qZWN0KEZPUk1fR0VORVJBVE9SX0lURU1fQ09ORklHKVxuICAgICAgICBwcml2YXRlIF9kZWZhdWx0SXRlbUNvbmZpZzogUGFydGlhbDxEeW5hbWljRm9ybUZpZWxkSXRlbT4sXG4gICAgICAgIEBPcHRpb25hbCgpXG4gICAgICAgIEBTa2lwU2VsZigpXG4gICAgICAgIEBJbmplY3QoRk9STV9HRU5FUkFUT1JfQ09ORklHKVxuICAgICAgICBwcml2YXRlIF9wcm92aWRlZENvbmZpZzogUGFydGlhbDxGb3JtR2VuZXJhdG9yQ29uZmlnPlxuICAgICkge1xuICAgICAgICB0aGlzLl9jb25maWcgPSBtZXJnZShjbG9uZURlZXAodGhpcy5fY29uZmlnKSwgY2xvbmVEZWVwKHRoaXMuX3Byb3ZpZGVkQ29uZmlnKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIEdlbmVyYXRlcyBgRm9ybUdyb3VwYCBjbGFzcyB3aXRoIHRoZSBsaXN0IG9mIGBEeW5hbWljRm9ybUNvbnRyb2xgIGNvbnRyb2wgY2xhc3Nlc1xuICAgICAqIGRlZmluZWQgaW4gYGZvcm1JdGVtc2AgYXJndW1lbnQuXG4gICAgICogQHBhcmFtIGZvcm1OYW1lIEZvcm0gbmFtZS5cbiAgICAgKiBAcGFyYW0gZm9ybUl0ZW1zIHRoZSBsaXN0IG9mIGZvcm0gaXRlbXMgd2hpY2ggdXNlZCBmb3IgZm9ybSBjb250cm9sIGdlbmVyYXRpb24uXG4gICAgICogQHJldHVybnMgYEZvcm1Hcm91cGAgY2xhc3Mgd2l0aCB0aGUgbGlzdCBvZiBgRHluYW1pY0Zvcm1Db250cm9sYCBjb250cm9sIGNsYXNzZXMuXG4gICAgICovXG4gICAgYXN5bmMgZ2VuZXJhdGVGb3JtKGZvcm1OYW1lOiBzdHJpbmcsIGZvcm1JdGVtczogTWFwPHN0cmluZywgRHluYW1pY0Zvcm1JdGVtTWFwPik6IFByb21pc2U8RHluYW1pY0Zvcm1Hcm91cD4ge1xuICAgICAgICBjb25zdCBleGlzdGluZ0Zvcm0gPSB0aGlzLmZvcm1zLmdldChmb3JtTmFtZSk7XG4gICAgICAgIGNvbnN0IGZvcm0gPSB0aGlzLl9mYi5ncm91cCh7fSkgYXMgRHluYW1pY0Zvcm1Hcm91cDtcblxuICAgICAgICBjb25zdCBkZWZhdWx0Rm9ybUdyb3VwID0gbmV3IER5bmFtaWNGb3JtQ29udHJvbEdyb3VwKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6IHRoaXMuX2NvbmZpZy51bmdyb3VwZWRDb250cm9sc05hbWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7fVxuICAgICAgICApO1xuXG4gICAgICAgIGRlZmF1bHRGb3JtR3JvdXAuZm9ybUl0ZW0uaXRlbXMgPSBuZXcgTWFwKCk7XG5cbiAgICAgICAgZm9ybUl0ZW1zID0gdGhpcy5fdHJhbnNmb3JtRm9ybUl0ZW1zKGZvcm1JdGVtcyk7XG5cbiAgICAgICAgZm9ybUl0ZW1zLmZvckVhY2goKGZvcm1JdGVtKSA9PiB7XG4gICAgICAgICAgICBpZiAoIWlzRm9ybUZpZWxkSXRlbShmb3JtSXRlbSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWZvcm1JdGVtLml0ZW1zIHx8IGZvcm1JdGVtLml0ZW1zLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGdyb3VwID0gbmV3IER5bmFtaWNGb3JtQ29udHJvbEdyb3VwKGZvcm1JdGVtLCB7fSk7XG5cbiAgICAgICAgICAgICAgICBmb3JtSXRlbS5pdGVtcy5mb3JFYWNoKChncm91cEZvcm1JdGVtKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGdyb3VwRm9ybUNvbnRyb2wgPSB0aGlzLl9nZW5lcmF0ZUR5bmFtaWNGb3JtSXRlbShcbiAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwRm9ybUl0ZW0gYXMgUHJlcGFyZWREeW5hbWljRm9ybUZpZWxkSXRlbSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1cbiAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoIWdyb3VwRm9ybUNvbnRyb2wpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGdyb3VwLmFkZENvbnRyb2woZ3JvdXBGb3JtSXRlbS5uYW1lLCBncm91cEZvcm1Db250cm9sKTtcblxuICAgICAgICAgICAgICAgICAgICBncm91cEZvcm1Db250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgZm9ybS5hZGRDb250cm9sKGZvcm1JdGVtLm5hbWUsIGdyb3VwKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGZvcm1Db250cm9sID0gdGhpcy5fZ2VuZXJhdGVEeW5hbWljRm9ybUl0ZW0oZm9ybUl0ZW0gYXMgUHJlcGFyZWREeW5hbWljRm9ybUZpZWxkSXRlbSwgZm9ybSk7XG5cbiAgICAgICAgICAgIGlmICghZm9ybUNvbnRyb2wpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGRlZmF1bHRGb3JtR3JvdXAuYWRkQ29udHJvbChmb3JtSXRlbS5uYW1lLCBmb3JtQ29udHJvbCk7XG5cbiAgICAgICAgICAgIGRlZmF1bHRGb3JtR3JvdXAuZm9ybUl0ZW0uaXRlbXM/LnNldChmb3JtSXRlbS5uYW1lLCBmb3JtSXRlbSk7XG5cbiAgICAgICAgICAgIGZvcm1Db250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBmb3JtQ29udHJvbE5hbWVzID0gT2JqZWN0LmtleXMoZGVmYXVsdEZvcm1Hcm91cC5jb250cm9scyk7XG5cbiAgICAgICAgZm9ybS5hZGRDb250cm9sKHRoaXMuX2NvbmZpZy51bmdyb3VwZWRDb250cm9sc05hbWUsIGRlZmF1bHRGb3JtR3JvdXApO1xuXG4gICAgICAgIC8vIEFmdGVyIHdlIGNyZWF0ZWQgaW5pdGlhbCBmb3JtLCB3ZSBuZWVkIHRvIGdldCBkeW5hbWljIGxhYmVscywgY2hvaWNlcyBhbmQgdmFsdWVcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgZm9ybUNvbnRyb2xOYW1lcykge1xuICAgICAgICAgICAgY29uc3QgZm9ybUl0ZW0gPSBmb3JtSXRlbXMuZ2V0KGtleSk7XG5cbiAgICAgICAgICAgIGlmICghaXNGb3JtRmllbGRJdGVtKGZvcm1JdGVtKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBbW21lc3NhZ2UsIHBsYWNlaG9sZGVyLCBkZWZhdWx0VmFsdWVdLCBjaG9pY2VzXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICAgICAgICB0aGlzLl9nZXRGb3JtSXRlbVByb3BlcnRpZXM8W3N0cmluZywgc3RyaW5nLCBhbnldPihmb3JtSXRlbSwgZGVmYXVsdEZvcm1Hcm91cCwgW1xuICAgICAgICAgICAgICAgICAgICAnbWVzc2FnZScsXG4gICAgICAgICAgICAgICAgICAgICdwbGFjZWhvbGRlcicsXG4gICAgICAgICAgICAgICAgICAgICdkZWZhdWx0J1xuICAgICAgICAgICAgICAgIF0pLFxuICAgICAgICAgICAgICAgIHRoaXMuX2dldEZvcm1JdGVtQ2hvaWNlcyhmb3JtSXRlbSwgZGVmYXVsdEZvcm1Hcm91cClcbiAgICAgICAgICAgIF0pO1xuXG4gICAgICAgICAgICBmb3JtSXRlbS5tZXNzYWdlID0gbWVzc2FnZTtcbiAgICAgICAgICAgIGZvcm1JdGVtLnBsYWNlaG9sZGVyID0gcGxhY2Vob2xkZXI7XG4gICAgICAgICAgICBmb3JtSXRlbS5kZWZhdWx0ID0gZGVmYXVsdFZhbHVlO1xuICAgICAgICAgICAgZm9ybUl0ZW0uY2hvaWNlcyA9IGNob2ljZXM7XG5cbiAgICAgICAgICAgIC8vIFVwZGF0ZSBmb3JtIHZhbHVlIHNpbmNlIGl0IG1pZ2h0IGJlIGNoYW5nZWRcbiAgICAgICAgICAgIGRlZmF1bHRGb3JtR3JvdXAuY29udHJvbHNbZm9ybUl0ZW0ubmFtZV0uc2V0VmFsdWUoZm9ybUl0ZW0uZGVmYXVsdCk7XG5cbiAgICAgICAgICAgIGRlZmF1bHRGb3JtR3JvdXAuY29udHJvbHNba2V5XS5mb3JtSXRlbSA9IGZvcm1JdGVtIGFzIFByZXBhcmVkRHluYW1pY0Zvcm1GaWVsZEl0ZW07XG4gICAgICAgIH1cblxuICAgICAgICBPYmplY3Qua2V5cyhmb3JtLmNvbnRyb2xzKS5mb3JFYWNoKChjb250cm9sTmFtZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgbmV3Q29udHJvbCA9IGZvcm0uZ2V0KGNvbnRyb2xOYW1lKSBhcyBEeW5hbWljRm9ybUNvbnRyb2xHcm91cDtcbiAgICAgICAgICAgIGNvbnN0IG9sZENvbnRyb2wgPSBleGlzdGluZ0Zvcm0/LmdldChjb250cm9sTmFtZSkgYXMgRHluYW1pY0Zvcm1Db250cm9sR3JvdXA7XG4gICAgICAgICAgICB0aGlzLl9jbG9uZU9sZEZvcm1Hcm91cChuZXdDb250cm9sLCBvbGRDb250cm9sKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5mb3Jtcy5zZXQoZm9ybU5hbWUsIGZvcm0pO1xuXG4gICAgICAgIHJldHVybiBmb3JtO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgbmV3IGNvbnRyb2wgdG8gYSBmb3JtLlxuICAgICAqIEBwYXJhbSBjb250cm9sIENvbnRyb2wgdG8gYWRkXG4gICAgICogQHBhcmFtIGZvcm0gRm9ybSBvZiB0aGUgY29udHJvbCB0byBiZSBhZGRlZC5cbiAgICAgKiBAcGFyYW0gcGF0aCBHcm91cCBwYXRoLlxuICAgICAqL1xuICAgIGFzeW5jIGFkZENvbnRyb2woY29udHJvbDogRHluYW1pY0Zvcm1JdGVtLCBmb3JtOiBEeW5hbWljRm9ybUdyb3VwLCBwYXRoOiBzdHJpbmdbXSA9IFtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGZvcm1Hcm91cCA9IHRoaXMuZ2V0Rm9ybUNvbnRyb2woZm9ybSwgLi4ucGF0aCk7XG5cbiAgICAgICAgaWYgKGZvcm1Hcm91cCBpbnN0YW5jZW9mIER5bmFtaWNGb3JtQ29udHJvbEdyb3VwKSB7XG4gICAgICAgICAgICBjb25zdCBmb3JtQ29udHJvbCA9IHRoaXMuX2dlbmVyYXRlRHluYW1pY0Zvcm1JdGVtKGNvbnRyb2wgYXMgUHJlcGFyZWREeW5hbWljRm9ybUZpZWxkSXRlbSwgZm9ybSk7XG4gICAgICAgICAgICBmb3JtR3JvdXAuYWRkQ29udHJvbChjb250cm9sLm5hbWUsIGZvcm1Db250cm9sKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgdGhlIGNvbnRyb2wgd2l0aCBnaXZlbiBuYW1lIGZyb20gdGhlIGZvcm0uXG4gICAgICogQHBhcmFtIGNvbnRyb2xOYW1lXG4gICAgICogQHBhcmFtIHBhdGhcbiAgICAgKi9cbiAgICByZW1vdmVDb250cm9sKGNvbnRyb2xOYW1lOiBzdHJpbmcsIGZvcm06IER5bmFtaWNGb3JtR3JvdXAsIHBhdGg6IHN0cmluZ1tdID0gW10pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZm9ybUdyb3VwID0gdGhpcy5nZXRGb3JtQ29udHJvbChmb3JtLCAuLi5wYXRoKTtcblxuICAgICAgICBpZiAoZm9ybUdyb3VwIGluc3RhbmNlb2YgRHluYW1pY0Zvcm1Db250cm9sR3JvdXApIHtcbiAgICAgICAgICAgIGZvcm1Hcm91cC5yZW1vdmVDb250cm9sKGNvbnRyb2xOYW1lKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvbiBSZXR1cm5zIGZvcm0gdmFsdWUgd2l0aCBhcHBsaWVkIGZpbHRlcnMgYW5kIHRyYW5zZm9ybWVycy5cbiAgICAgKiBAcGFyYW0gZm9ybSBGb3JtIGdlbmVyYXRvciBmb3JtXG4gICAgICogQHBhcmFtIHJlbmRlclZhbHVlIFdoZXRoZXIgb3Igbm90IGZvcm0gdmFsdWUgd2lsbCBiZSB1c2VkIGZvciByZW5kZXJpbmcgcHVycG9zZXMuXG4gICAgICogQHJldHVybnMgZm9ybSB2YWx1ZSBvYmplY3QuXG4gICAgICovXG4gICAgYXN5bmMgZ2V0Rm9ybVZhbHVlKFxuICAgICAgICBmb3JtOiBEeW5hbWljRm9ybUdyb3VwIHwgRHluYW1pY0Zvcm1Db250cm9sR3JvdXAsXG4gICAgICAgIHJlbmRlclZhbHVlID0gZmFsc2VcbiAgICApOiBQcm9taXNlPER5bmFtaWNGb3JtVmFsdWU+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5fdHJpZ2dlckZpZWxkc09uY2hhbmdlKGZvcm0pO1xuXG4gICAgICAgIGNvbnN0IGZvcm1WYWx1ZSA9IGNsb25lRGVlcChmb3JtLnZhbHVlKTtcblxuICAgICAgICBmb3IgKGNvbnN0IFtpLCBjb250cm9sXSBvZiBPYmplY3QuZW50cmllcyhmb3JtLmNvbnRyb2xzKSkge1xuICAgICAgICAgICAgY29uc3QgZm9ybUl0ZW0gPSBjb250cm9sLmZvcm1JdGVtO1xuXG4gICAgICAgICAgICBpZiAoIWlzRm9ybUZpZWxkSXRlbShmb3JtSXRlbSkpIHtcbiAgICAgICAgICAgICAgICBmb3JtVmFsdWVbaV0gPSBhd2FpdCB0aGlzLmdldEZvcm1WYWx1ZShjb250cm9sIGFzIER5bmFtaWNGb3JtQ29udHJvbEdyb3VwLCByZW5kZXJWYWx1ZSk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChmb3JtSXRlbS5zaG91bGRTaG93ID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBmb3JtVmFsdWVbaV07XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChmb3JtSXRlbS50cmFuc2Zvcm1lcikge1xuICAgICAgICAgICAgICAgIGNvbnN0IG9iaiA9IGZvcm1JdGVtLnRyYW5zZm9ybWVyKGZvcm1WYWx1ZVtpXSwgZm9ybVZhbHVlLCBmb3JtSXRlbSk7XG4gICAgICAgICAgICAgICAgZm9ybVZhbHVlW2ldID0gYXdhaXQgdGhpcy5fZ2V0RnVuY3Rpb25WYWx1ZShvYmopO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocmVuZGVyVmFsdWUgJiYgZm9ybUl0ZW0udmFsdWVSZW5kZXJlcikge1xuICAgICAgICAgICAgICAgIGNvbnN0IG9iaiA9IGZvcm1JdGVtLnZhbHVlUmVuZGVyZXIoZm9ybVZhbHVlW2ldLCBmb3JtVmFsdWUsIGZvcm1JdGVtKTtcbiAgICAgICAgICAgICAgICBmb3JtVmFsdWVbaV0gPSBhd2FpdCB0aGlzLl9nZXRGdW5jdGlvblZhbHVlKG9iaik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChyZW5kZXJWYWx1ZSAmJiBmb3JtSXRlbVsnY29udHJvbFR5cGUnXSA9PT0gJ3Bhc3N3b3JkJykge1xuICAgICAgICAgICAgICAgIGZvcm1WYWx1ZVtpXSA9IHRoaXMuX2Zvcm1hdFBhc3N3b3JkVmFsdWUoZm9ybVZhbHVlW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRGb3JtVmFsdWVXaXRob3V0VW5ncm91cGVkKGZvcm1WYWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIEFkZHMgY3VzdG9tIGNvbXBvbmVudCB0byB0aGUgbGlzdCBvZiBhdmFpbGFibGUgY29tcG9uZW50cyBmb3IgdGhlIGZvcm0gZ2VuZXJhdG9yIGl0ZW1zLlxuICAgICAqIEBwYXJhbSBjb21wb25lbnQgQW5ndWxhciBjb21wb25lbnQuXG4gICAgICogQHBhcmFtIHR5cGVzIHR5cGVzIG9mIHRoZSBmb3JtIGl0ZW0uXG4gICAgICovXG4gICAgYWRkQ29tcG9uZW50KGNvbXBvbmVudDogVHlwZTxCYXNlRHluYW1pY0Zvcm1HZW5lcmF0b3JDb250cm9sPiwgdHlwZXM6IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb21wb25lbnRzQWNjZXNzb3IuYWRkQ29tcG9uZW50KGNvbXBvbmVudCwgdHlwZXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvbiBSZXR1cm5zIGJlc3QtbWF0Y2hlZCBjb21wb25lbnQgYmFzZWQgb24gcHJvdmlkZWQgYHR5cGVgIGFyZ3VtZW50XG4gICAgICogQHBhcmFtIHR5cGUgZm9ybSBpdGVtIHR5cGVcbiAgICAgKiBAcmV0dXJucyBAc2VlIEZvcm1Db21wb25lbnREZWZpbml0aW9uIENvbXBvbmVudCBkZWZpbml0aW9uIGZvciB0aGUgZm9ybSBpdGVtXG4gICAgICovXG4gICAgZ2V0Q29tcG9uZW50RGVmaW5pdGlvbkJ5VHlwZSh0eXBlOiBzdHJpbmcpOiBGb3JtQ29tcG9uZW50RGVmaW5pdGlvbiB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb21wb25lbnRzQWNjZXNzb3IuZ2V0Q29tcG9uZW50RGVmaW5pdGlvbkJ5VHlwZSh0eXBlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyBPYmplY3Qgb2YgYXZhaWxhYmxlIGVycm9ycywgd2hlcmUga2V5IGlzIGFuIGVycm9yIHR5cGUsXG4gICAgICogYW5kIGl0J3MgdmFsdWUgaXMgYSBkaXNwbGF5IHRleHQuXG4gICAgICovXG4gICAgZ2V0VmFsaWRhdGlvbkVycm9ySGludHMoa2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy52YWxpZGF0aW9uRXJyb3JIaW50c1trZXldO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvbiBBZGRzIGN1c3RvbSBlcnJvciBoaW50IGRlZmluZWQgYnkgdXNlci5cbiAgICAgKiBAcGFyYW0gdHlwZSBlcnJvciB0eXBlIGZyb20gdmFsaWRhdG9yLlxuICAgICAqIEBwYXJhbSB2YWx1ZSBkaXNwbGF5IHRleHQuXG4gICAgICovXG4gICAgYWRkVmFsaWRhdGlvbkVycm9ySGludCh0eXBlOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy52YWxpZGF0aW9uRXJyb3JIaW50c1t0eXBlXSA9IHZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvbiBDaGVja3MgaWYgc29tZSBpdGVtcyBvZiB0aGUgZm9ybSBzaG91bGQgYmUgaGlkZGVuLFxuICAgICAqIG9yIHZpc2libGUgYmFzZWQgb24gYHdoZW5gIG1ldGhvZCByZXN1bHQuXG4gICAgICogQHBhcmFtIGZvcm1cbiAgICAgKiBAcmV0dXJucyBgU2V0YCB3aGVyZSBrZXkgaXMgaXRlbSBuYW1lLCBhbmQgYm9vbGVhbiB2YWx1ZSBpZiBmaWVsZCBuZWVkcyB0byBiZSBzaG93bi5cbiAgICAgKi9cbiAgICBhc3luYyBjaGVja1Zpc2libGVGb3JtSXRlbXMoZm9ybTogRHluYW1pY0Zvcm1Hcm91cCk6IFByb21pc2U8eyBba2V5OiBzdHJpbmddOiBib29sZWFuIH0+IHtcbiAgICAgICAgY29uc3QgZm9ybVZhbHVlID0gdGhpcy5fZ2V0Rm9ybVZhbHVlV2l0aG91dFVuZ3JvdXBlZChjbG9uZURlZXAoZm9ybS52YWx1ZSkpO1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5fY2hlY2tGb3JtQ29udHJvbHNWaXNpYmlsaXR5KGZvcm0sIGZvcm1WYWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWV0aG9kIGZvciBzZWFyY2hpbmcgYSBmb3JtIGNvbnRyb2wgaW5zaWRlIGZvcm0gZ3JvdXAuIENhbiBhbHNvIHNlYXJjaCBpbnNpZGUgdW5ncm91cGVkIGZvcm0gZ3JvdXAuXG4gICAgICogQHBhcmFtIGZvcm0gRm9ybSBncm91cC5cbiAgICAgKiBAcGFyYW0gY29udHJvbE5hbWVzIE5hbWUgb2YgdGhlIGZvcm0gY29udHJvbC5cbiAgICAgKiBAcmV0dXJucyBGb3VuZCBmb3JtIGNvbnRyb2wuXG4gICAgICovXG4gICAgZ2V0Rm9ybUNvbnRyb2woZm9ybTogRHluYW1pY0Zvcm1Hcm91cCwgLi4uY29udHJvbE5hbWVzOiBzdHJpbmdbXSk6IER5bmFtaWNGb3JtR3JvdXBDb250cm9sIHtcbiAgICAgICAgY29udHJvbE5hbWVzID0gY29udHJvbE5hbWVzLnJlZHVjZSgobmFtZXM6IHN0cmluZ1tdLCBuYW1lKSA9PiB7XG4gICAgICAgICAgICBuYW1lcyA9IFsuLi5uYW1lcywgLi4ubmFtZS5zcGxpdCh0aGlzLl9jb25maWcuY29udHJvbE5hbWVTZXBhcmF0b3IpXTtcblxuICAgICAgICAgICAgcmV0dXJuIG5hbWVzO1xuICAgICAgICB9LCBbXSk7XG5cbiAgICAgICAgbGV0IGNvbnRyb2wgPSBmb3JtPy5nZXQoY29udHJvbE5hbWVzKTtcblxuICAgICAgICAvLyBJZiBubyBjb250cm9sIGZvdW5kLCB0cnkgdG8gZmluZCBpdCBpbiB1bmdyb3VwZWQgZ3JvdXBcbiAgICAgICAgaWYgKCFjb250cm9sKSB7XG4gICAgICAgICAgICBjb250cm9sID0gZm9ybT8uZ2V0KFt0aGlzLl9jb25maWcudW5ncm91cGVkQ29udHJvbHNOYW1lLCAuLi5jb250cm9sTmFtZXNdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb250cm9sIGFzIER5bmFtaWNGb3JtR3JvdXBDb250cm9sO1xuICAgIH1cblxuICAgIC8qKiBSZXNldHMgdGhlIGZvcm0gdG8gaXQncyBpbml0aWFsIHN0YXRlLiAqL1xuICAgIHJlc2V0Rm9ybShmb3JtOiBEeW5hbWljRm9ybUdyb3VwKTogdm9pZCB7XG4gICAgICAgIGZvciAoY29uc3QgY29udHJvbCBvZiBPYmplY3QudmFsdWVzKGZvcm0uY29udHJvbHMpKSB7XG4gICAgICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIER5bmFtaWNGb3JtQ29udHJvbEdyb3VwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXNldEZvcm0oY29udHJvbCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gR2V0IGRlZmF1bHQgdmFsdWVcbiAgICAgICAgICAgIGNvbnRyb2wuc2V0VmFsdWUoY29udHJvbC5mb3JtSXRlbS5kZWZhdWx0KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgX2dldEZvcm1WYWx1ZVdpdGhvdXRVbmdyb3VwZWQodmFsdWU6IGFueSk6IGFueSB7XG4gICAgICAgIGlmICh2YWx1ZVt0aGlzLl9jb25maWcudW5ncm91cGVkQ29udHJvbHNOYW1lXSkge1xuICAgICAgICAgICAgY29uc3QgdW5ncm91cGVkR3JvdXBWYWx1ZTogUmVjb3JkPHN0cmluZywgYW55PiA9IHZhbHVlW3RoaXMuX2NvbmZpZy51bmdyb3VwZWRDb250cm9sc05hbWVdO1xuICAgICAgICAgICAgZm9yIChjb25zdCBbZmllbGROYW1lLCBmaWVsZFZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh1bmdyb3VwZWRHcm91cFZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHZhbHVlW2ZpZWxkTmFtZV0gPSBmaWVsZFZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGRlbGV0ZSB2YWx1ZVt0aGlzLl9jb25maWcudW5ncm91cGVkQ29udHJvbHNOYW1lXTtcblxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9hc3NpZ25Gb3JtSXRlbVZhbGlkYXRvcnMoXG4gICAgICAgIGZvcm1JdGVtOiBQcmVwYXJlZER5bmFtaWNGb3JtRmllbGRJdGVtLFxuICAgICAgICBmb3JtOiBEeW5hbWljRm9ybUdyb3VwXG4gICAgKTogUHJlcGFyZWREeW5hbWljRm9ybUZpZWxkSXRlbSB7XG4gICAgICAgIGxldCB2YWxpZGF0b3I6IEFzeW5jVmFsaWRhdG9yRm4gfCBudWxsID0gbnVsbDtcblxuICAgICAgICBpZiAoaXNGdW5jdGlvbihmb3JtSXRlbS52YWxpZGF0ZSkpIHtcbiAgICAgICAgICAgIHZhbGlkYXRvciA9IGFzeW5jIChjb250cm9sKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb2JqID0gZm9ybUl0ZW0udmFsaWRhdGUhKGNvbnRyb2wudmFsdWUsIHRoaXMuX2dldEZvcm1WYWx1ZVdpdGhvdXRVbmdyb3VwZWQoZm9ybSkpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5fZ2V0RnVuY3Rpb25WYWx1ZShvYmopO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgcmV0dXJuT2JqID0ge307XG5cbiAgICAgICAgICAgICAgICByZXR1cm5PYmpbYCR7KDxEeW5hbWljRm9ybUNvbnRyb2w+Y29udHJvbCkuZm9ybUl0ZW0ubmFtZX1WYWxpZGF0b3JgXSA9XG4gICAgICAgICAgICAgICAgICAgIHR5cGVvZiByZXN1bHQgPT09ICdib29sZWFuJyA/IHRydWUgOiByZXN1bHQ7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ID09PSBudWxsID8gcmVzdWx0IDogcmV0dXJuT2JqO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgZm9ybUl0ZW0uYXN5bmNWYWxpZGF0b3JzID0gZm9ybUl0ZW0uYXN5bmNWYWxpZGF0b3JzIHx8IFtdO1xuICAgICAgICAgICAgZm9ybUl0ZW0uYXN5bmNWYWxpZGF0b3JzID1cbiAgICAgICAgICAgICAgICB0eXBlb2YgZm9ybUl0ZW0uYXN5bmNWYWxpZGF0b3JzID09PSAnZnVuY3Rpb24nID8gW2Zvcm1JdGVtLmFzeW5jVmFsaWRhdG9yc10gOiBmb3JtSXRlbS5hc3luY1ZhbGlkYXRvcnM7XG5cbiAgICAgICAgICAgIGZvcm1JdGVtLmFzeW5jVmFsaWRhdG9ycy5wdXNoKHZhbGlkYXRvcik7XG4gICAgICAgIH1cblxuICAgICAgICBmb3JtSXRlbS52YWxpZGF0b3JzID0gZm9ybUl0ZW0udmFsaWRhdG9ycyB8fCBbVmFsaWRhdG9ycy5udWxsVmFsaWRhdG9yXTtcblxuICAgICAgICBmb3JtSXRlbS5yZXF1aXJlZCA9IGZvcm1JdGVtLnJlcXVpcmVkIHx8IGZvcm1JdGVtLnZhbGlkYXRvcnMuaW5jbHVkZXMoVmFsaWRhdG9ycy5yZXF1aXJlZCk7XG5cbiAgICAgICAgcmV0dXJuIGZvcm1JdGVtO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfZ2VuZXJhdGVEeW5hbWljRm9ybUl0ZW0oXG4gICAgICAgIGZvcm1JdGVtOiBQcmVwYXJlZER5bmFtaWNGb3JtRmllbGRJdGVtLFxuICAgICAgICBmb3JtOiBEeW5hbWljRm9ybUdyb3VwXG4gICAgKTogRHluYW1pY0Zvcm1Db250cm9sIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgY29uc3QgZm9ybUl0ZW1Db21wb25lbnRUeXBlID0gdGhpcy5nZXRDb21wb25lbnREZWZpbml0aW9uQnlUeXBlKGZvcm1JdGVtLnR5cGUpO1xuXG4gICAgICAgIGlmICghZm9ybUl0ZW1Db21wb25lbnRUeXBlKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYEZvcm0gaXRlbSAnJHtmb3JtSXRlbS5uYW1lfScgd2l0aCB0eXBlICcke2Zvcm1JdGVtLnR5cGV9JyBoYXMgbm8gZGVmaW5lZCBjb21wb25lbnQuXG4gICAgICAgICAgICBQbGVhc2UgdXNlICdhZGRDb21wb25lbnQnIG1ldGhvZCBpbiAke0Zvcm1HZW5lcmF0b3JTZXJ2aWNlLm5hbWV9IHRvIGRlZmluZSBhcHByb3ByaWF0ZSByZWxhdGlvbnMuYCk7XG5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvcm1JdGVtID0gdGhpcy5fYXNzaWduRm9ybUl0ZW1WYWxpZGF0b3JzKGZvcm1JdGVtLCBmb3JtKTtcblxuICAgICAgICBjb25zdCBmb3JtQ29udHJvbCA9IG5ldyBEeW5hbWljRm9ybUNvbnRyb2woZm9ybUl0ZW0uZGVmYXVsdCwge1xuICAgICAgICAgICAgdmFsaWRhdG9yczogZm9ybUl0ZW0udmFsaWRhdG9ycyxcbiAgICAgICAgICAgIGFzeW5jVmFsaWRhdG9yczogZm9ybUl0ZW0uYXN5bmNWYWxpZGF0b3JzLFxuICAgICAgICAgICAgZHluYW1pY0Zvcm1JdGVtOiBmb3JtSXRlbSxcbiAgICAgICAgICAgIHVwZGF0ZU9uOiAnY2hhbmdlJ1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoaXNGdW5jdGlvbihmb3JtSXRlbS5vbmNoYW5nZSkpIHtcbiAgICAgICAgICAgIGZvcm1Db250cm9sLnZhbHVlQ2hhbmdlc1xuICAgICAgICAgICAgICAgIC5waXBlKGRlYm91bmNlVGltZSg1MCksIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLl9kZXN0cm95UmVmKSlcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKGFzeW5jICh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBvYmogPSBmb3JtSXRlbS5vbmNoYW5nZSEodmFsdWUsIHRoaXMuZm9ybXMsIGZvcm1Db250cm9sKTtcblxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9nZXRGdW5jdGlvblZhbHVlKG9iaik7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3JtQ29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcblxuICAgICAgICByZXR1cm4gZm9ybUNvbnRyb2w7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIGFzeW5jIF9jaGVja0Zvcm1Db250cm9sc1Zpc2liaWxpdHkoXG4gICAgICAgIGZvcm06IER5bmFtaWNGb3JtR3JvdXAgfCBEeW5hbWljRm9ybUNvbnRyb2xHcm91cCxcbiAgICAgICAgZm9ybVZhbHVlOiBhbnlcbiAgICApOiBQcm9taXNlPHsgW2tleTogc3RyaW5nXTogYm9vbGVhbiB9PiB7XG4gICAgICAgIGxldCBzaG91bGRTaG93RmllbGRzOiB7IFtrZXk6IHN0cmluZ106IGJvb2xlYW4gfSA9IHt9O1xuICAgICAgICBmb3JtID0gZm9ybSBpbnN0YW5jZW9mIER5bmFtaWNGb3JtQ29udHJvbEdyb3VwID8gZm9ybSA6IGZvcm07XG5cbiAgICAgICAgZm9yIChjb25zdCBba2V5LCBjb250cm9sXSBvZiBPYmplY3QuZW50cmllcyhmb3JtLmNvbnRyb2xzKSkge1xuICAgICAgICAgICAgY29uc3QgZm9ybUl0ZW0gPSBjb250cm9sLmZvcm1JdGVtO1xuXG4gICAgICAgICAgICBpZiAoIWlzRm9ybUZpZWxkSXRlbShmb3JtSXRlbSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBncm91cFZpc2libGVJdGVtcyA9IGF3YWl0IHRoaXMuX2NoZWNrRm9ybUNvbnRyb2xzVmlzaWJpbGl0eShcbiAgICAgICAgICAgICAgICAgICAgY29udHJvbCBhcyBEeW5hbWljRm9ybUNvbnRyb2xHcm91cCxcbiAgICAgICAgICAgICAgICAgICAgZm9ybVZhbHVlXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIHNob3VsZFNob3dGaWVsZHMgPSBPYmplY3QuYXNzaWduKHNob3VsZFNob3dGaWVsZHMsIGdyb3VwVmlzaWJsZUl0ZW1zKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFmb3JtSXRlbS53aGVuKSB7XG4gICAgICAgICAgICAgICAgc2hvdWxkU2hvd0ZpZWxkc1trZXldID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3Qgb2JqID0gZm9ybUl0ZW0ud2hlbihmb3JtVmFsdWUsIHRoaXMuZm9ybXMsIGNvbnRyb2wpO1xuICAgICAgICAgICAgc2hvdWxkU2hvd0ZpZWxkc1trZXldID0gYXdhaXQgdGhpcy5fZ2V0RnVuY3Rpb25WYWx1ZShvYmopO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHNob3VsZFNob3dGaWVsZHM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBwYXJhbSBmb3JtSXRlbVxuICAgICAqIEBwYXJhbSBmb3JtXG4gICAgICogQHBhcmFtIGtleVxuICAgICAqIEByZXR1cm5zXG4gICAgICovXG4gICAgcHJpdmF0ZSBhc3luYyBfZ2V0Rm9ybUl0ZW1Qcm9wZXJ0eVZhbHVlPFQgPSBzdHJpbmc+KFxuICAgICAgICBmb3JtSXRlbTogRHluYW1pY0Zvcm1GaWVsZEl0ZW0sXG4gICAgICAgIGZvcm06IER5bmFtaWNGb3JtR3JvdXAsXG4gICAgICAgIGtleToga2V5b2YgRHluYW1pY0Zvcm1GaWVsZEl0ZW1cbiAgICApOiBQcm9taXNlPFQ+IHtcbiAgICAgICAgbGV0IHZhbHVlID0gZm9ybUl0ZW1ba2V5XTtcblxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjb25zdCBvYmogPSB2YWx1ZSh0aGlzLl9nZXRGb3JtVmFsdWVXaXRob3V0VW5ncm91cGVkKGZvcm0pKTtcblxuICAgICAgICAgICAgdmFsdWUgPSBhd2FpdCB0aGlzLl9nZXRGdW5jdGlvblZhbHVlKG9iaik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gKGF3YWl0IHRoaXMuX2dldEZ1bmN0aW9uVmFsdWUodmFsdWUpKSBhcyBUO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBhc3luYyBfZ2V0Rm9ybUl0ZW1Qcm9wZXJ0aWVzPFRUeXBlcyBleHRlbmRzIGFueVtdID0gYW55W10+KFxuICAgICAgICBmb3JtSXRlbTogRHluYW1pY0Zvcm1GaWVsZEl0ZW0sXG4gICAgICAgIGZvcm06IER5bmFtaWNGb3JtR3JvdXAsXG4gICAgICAgIGtleXM6IHN0cmluZ1tdXG4gICAgKTogUHJvbWlzZTxUVHlwZXM+IHtcbiAgICAgICAgY29uc3QgcHJvbWlzZXM6IFByb21pc2U8YW55PltdID0gW107XG4gICAgICAgIGtleXMuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICBwcm9taXNlcy5wdXNoKHRoaXMuX2dldEZvcm1JdGVtUHJvcGVydHlWYWx1ZShmb3JtSXRlbSwgZm9ybSwga2V5KSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gKGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKSkgYXMgVFR5cGVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAcGFyYW0gZm9ybUl0ZW1cbiAgICAgKiBAcGFyYW0gZm9ybVxuICAgICAqIEByZXR1cm5zXG4gICAgICovXG4gICAgcHJpdmF0ZSBhc3luYyBfZ2V0Rm9ybUl0ZW1DaG9pY2VzKGZvcm1JdGVtOiBEeW5hbWljRm9ybUZpZWxkSXRlbSwgZm9ybTogRHluYW1pY0Zvcm1Hcm91cCk6IFByb21pc2U8U2VsZWN0SXRlbVtdPiB7XG4gICAgICAgIGNvbnN0IGRlZmF1bHRDaG9pY2VzID0gYXdhaXQgdGhpcy5fZ2V0Rm9ybUl0ZW1Qcm9wZXJ0eVZhbHVlPER5bmFtaWNGb3JtSXRlbUNob2ljZVR5cGVzW10+KFxuICAgICAgICAgICAgZm9ybUl0ZW0sXG4gICAgICAgICAgICBmb3JtLFxuICAgICAgICAgICAgJ2Nob2ljZXMnXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKCFkZWZhdWx0Q2hvaWNlcykge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRlZmF1bHRDaG9pY2VzLm1hcCgoYzogc3RyaW5nIHwgbnVtYmVyIHwgU2VsZWN0SXRlbSkgPT5cbiAgICAgICAgICAgIHR5cGVvZiBjID09PSAnb2JqZWN0JyA/IGMgOiAoeyBsYWJlbDogYywgdmFsdWU6IGMgfSBhcyBTZWxlY3RJdGVtKVxuICAgICAgICApIGFzIFNlbGVjdEl0ZW1bXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGRlc2NyaXB0aW9uIFJldHVybnMgdmFsdWUgZnJvbSBQcm9taXNlLWxpa2UsIE9ic2VydmFibGUtbGlrZSwgc2ltcGxlIGZ1bmN0aW9uIG9yIGp1c3Qgc29tZSBvYmplY3QuXG4gICAgICogQHBhcmFtIG9ialxuICAgICAqIEByZXR1cm5zXG4gICAgICovXG4gICAgcHJpdmF0ZSBhc3luYyBfZ2V0RnVuY3Rpb25WYWx1ZShvYmo6IGFueSk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIGNvbnN0IHN0cmF0ZWd5ID0gc2VsZWN0U3RyYXRlZ3kob2JqKTtcblxuICAgICAgICBsZXQgcmVzdWx0OiBhbnk7XG5cbiAgICAgICAgYXdhaXQgc3RyYXRlZ3kuY3JlYXRlU3Vic2NyaXB0aW9uKG9iaiwgKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJlc3VsdCA9IHZhbHVlO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoaXNGdW5jdGlvbihyZXN1bHQpKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9nZXRGdW5jdGlvblZhbHVlKHJlc3VsdCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfZm9ybWF0UGFzc3dvcmRWYWx1ZShwYXNzd29yZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuICcqJy5yZXBlYXQocGFzc3dvcmQ/Lmxlbmd0aCk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9nZXRNZXJnZWRGb3JtRmllbGRJdGVtQ29uZmlnKGZvcm1JdGVtOiBEeW5hbWljRm9ybUl0ZW1NYXApOiBEeW5hbWljRm9ybUl0ZW1NYXAge1xuICAgICAgICByZXR1cm4gbWVyZ2UoY2xvbmVEZWVwKHRoaXMuX2RlZmF1bHRJdGVtQ29uZmlnKSwgZm9ybUl0ZW0pO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfdHJhbnNmb3JtRm9ybUl0ZW1zKGZvcm1JdGVtczogTWFwPHN0cmluZywgRHluYW1pY0Zvcm1JdGVtTWFwPik6IE1hcDxzdHJpbmcsIER5bmFtaWNGb3JtSXRlbU1hcD4ge1xuICAgICAgICBmb3JtSXRlbXMuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGlmICghaXNGb3JtRmllbGRJdGVtKGl0ZW0pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3JtSXRlbXMuc2V0KGluZGV4LCB0aGlzLl9nZXRNZXJnZWRGb3JtRmllbGRJdGVtQ29uZmlnKGl0ZW0pKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGZvcm1JdGVtcztcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgYXN5bmMgX3RyaWdnZXJGaWVsZHNPbmNoYW5nZShmb3JtOiBEeW5hbWljRm9ybUdyb3VwIHwgRHluYW1pY0Zvcm1Db250cm9sR3JvdXApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgZm9yIChjb25zdCBjb250cm9sIG9mIE9iamVjdC52YWx1ZXMoZm9ybS5jb250cm9scykpIHtcbiAgICAgICAgICAgIGNvbnN0IGZvcm1JdGVtID0gY29udHJvbC5mb3JtSXRlbTtcblxuICAgICAgICAgICAgaWYgKCFpc0Zvcm1GaWVsZEl0ZW0oZm9ybUl0ZW0pKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fdHJpZ2dlckZpZWxkc09uY2hhbmdlKGNvbnRyb2wgYXMgRHluYW1pY0Zvcm1Db250cm9sR3JvdXApO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZm9ybUl0ZW0ub25jaGFuZ2UpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBvYmogPSBmb3JtSXRlbS5vbmNoYW5nZShjb250cm9sLnZhbHVlIGFzIGFueSwgdGhpcy5mb3JtcywgY29udHJvbCBhcyBEeW5hbWljRm9ybUNvbnRyb2wpO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX2dldEZ1bmN0aW9uVmFsdWUob2JqKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfY2xvbmVPbGRGb3JtR3JvdXAobmV3R3JvdXA6IER5bmFtaWNGb3JtQ29udHJvbEdyb3VwLCBvbGRHcm91cD86IER5bmFtaWNGb3JtQ29udHJvbEdyb3VwKTogdm9pZCB7XG4gICAgICAgIE9iamVjdC5rZXlzKG5ld0dyb3VwLmNvbnRyb2xzKS5mb3JFYWNoKChjb250cm9sTmFtZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY29udHJvbCA9IG5ld0dyb3VwLmdldChjb250cm9sTmFtZSk7XG4gICAgICAgICAgICBjb25zdCBvbGRDb250cm9sID0gb2xkR3JvdXA/LmdldChjb250cm9sTmFtZSkgYXMgRHluYW1pY0Zvcm1Db250cm9sR3JvdXA7XG4gICAgICAgICAgICBpZiAoIW9sZENvbnRyb2wpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIER5bmFtaWNGb3JtQ29udHJvbEdyb3VwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fY2xvbmVPbGRGb3JtR3JvdXAoY29udHJvbCwgb2xkQ29udHJvbCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb250cm9sPy5zZXRWYWx1ZShvbGRDb250cm9sLnZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG5cbiAgICAgICAgICAgIGlmIChvbGRDb250cm9sLnRvdWNoZWQpIHtcbiAgICAgICAgICAgICAgICBjb250cm9sPy5tYXJrQXNUb3VjaGVkKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiJdfQ==