@ecodev/natural 42.4.2 → 44.0.1

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 (156) hide show
  1. package/esm2020/lib/classes/abstract-controller.mjs +3 -3
  2. package/esm2020/lib/classes/abstract-detail.mjs +6 -6
  3. package/esm2020/lib/classes/abstract-editable-list.mjs +7 -7
  4. package/esm2020/lib/classes/abstract-list.mjs +3 -3
  5. package/esm2020/lib/classes/abstract-navigable-list.mjs +3 -3
  6. package/esm2020/lib/classes/query-variable-manager.mjs +2 -2
  7. package/esm2020/lib/classes/validators.mjs +1 -1
  8. package/esm2020/lib/directives/http-prefix.directive.mjs +3 -3
  9. package/esm2020/lib/modules/alert/alert.module.mjs +5 -5
  10. package/esm2020/lib/modules/alert/alert.service.mjs +3 -3
  11. package/esm2020/lib/modules/alert/confirm.component.mjs +5 -5
  12. package/esm2020/lib/modules/avatar/avatar.module.mjs +5 -5
  13. package/esm2020/lib/modules/avatar/component/avatar.component.mjs +7 -17
  14. package/esm2020/lib/modules/avatar/service/avatar.service.mjs +3 -3
  15. package/esm2020/lib/modules/columns-picker/columns-picker-column.directive.mjs +9 -5
  16. package/esm2020/lib/modules/columns-picker/columns-picker.component.mjs +9 -9
  17. package/esm2020/lib/modules/columns-picker/columns-picker.module.mjs +11 -13
  18. package/esm2020/lib/modules/common/common-module.mjs +5 -5
  19. package/esm2020/lib/modules/common/directives/linkable-tab.directive.mjs +5 -5
  20. package/esm2020/lib/modules/common/directives/src-density.directive.mjs +3 -3
  21. package/esm2020/lib/modules/common/pipes/capitalize.pipe.mjs +3 -3
  22. package/esm2020/lib/modules/common/pipes/ellipsis.pipe.mjs +3 -3
  23. package/esm2020/lib/modules/common/pipes/enum.pipe.mjs +3 -3
  24. package/esm2020/lib/modules/common/pipes/swiss-date.pipe.mjs +3 -3
  25. package/esm2020/lib/modules/common/services/memory-storage.mjs +3 -3
  26. package/esm2020/lib/modules/common/services/seo.service.mjs +3 -3
  27. package/esm2020/lib/modules/detail-header/detail-header.component.mjs +9 -9
  28. package/esm2020/lib/modules/detail-header/detail-header.module.mjs +5 -5
  29. package/esm2020/lib/modules/dialog-trigger/dialog-trigger.component.mjs +3 -3
  30. package/esm2020/lib/modules/dialog-trigger/dialog-trigger.module.mjs +5 -5
  31. package/esm2020/lib/modules/dropdown-components/abstract-association-select-component.directive.mjs +6 -6
  32. package/esm2020/lib/modules/dropdown-components/natural-dropdown-components.module.mjs +16 -18
  33. package/esm2020/lib/modules/dropdown-components/type-date/type-date.component.mjs +16 -16
  34. package/esm2020/lib/modules/dropdown-components/type-date-range/type-date-range.component.mjs +14 -14
  35. package/esm2020/lib/modules/dropdown-components/type-hierarchic-selector/type-hierarchic-selector.component.mjs +9 -9
  36. package/esm2020/lib/modules/dropdown-components/type-natural-select/type-natural-select.component.mjs +9 -9
  37. package/esm2020/lib/modules/dropdown-components/type-number/type-number.component.mjs +13 -13
  38. package/esm2020/lib/modules/dropdown-components/type-select/type-select.component.mjs +11 -11
  39. package/esm2020/lib/modules/dropdown-components/type-text/type-text.component.mjs +13 -10
  40. package/esm2020/lib/modules/dropdown-components/types.mjs +1 -1
  41. package/esm2020/lib/modules/file/abstract-file.mjs +3 -3
  42. package/esm2020/lib/modules/file/component/file.component.mjs +6 -6
  43. package/esm2020/lib/modules/file/file-drop.directive.mjs +3 -3
  44. package/esm2020/lib/modules/file/file-select.directive.mjs +3 -3
  45. package/esm2020/lib/modules/file/file.module.mjs +5 -5
  46. package/esm2020/lib/modules/file/file.service.mjs +3 -3
  47. package/esm2020/lib/modules/fixed-button/fixed-button.component.mjs +6 -6
  48. package/esm2020/lib/modules/fixed-button/fixed-button.module.mjs +5 -5
  49. package/esm2020/lib/modules/fixed-button-detail/fixed-button-detail.component.mjs +6 -6
  50. package/esm2020/lib/modules/fixed-button-detail/fixed-button-detail.module.mjs +5 -5
  51. package/esm2020/lib/modules/hierarchic-selector/hierarchic-selector/hierarchic-selector.component.mjs +10 -10
  52. package/esm2020/lib/modules/hierarchic-selector/hierarchic-selector/hierarchic-selector.service.mjs +3 -3
  53. package/esm2020/lib/modules/hierarchic-selector/hierarchic-selector-dialog/hierarchic-selector-dialog.component.mjs +5 -5
  54. package/esm2020/lib/modules/hierarchic-selector/hierarchic-selector-dialog/hierarchic-selector-dialog.service.mjs +3 -3
  55. package/esm2020/lib/modules/hierarchic-selector/hierarchic-selector.module.mjs +19 -21
  56. package/esm2020/lib/modules/icon/icon.component.mjs +5 -5
  57. package/esm2020/lib/modules/icon/icon.module.mjs +5 -5
  58. package/esm2020/lib/modules/logger/error-handler.mjs +3 -3
  59. package/esm2020/lib/modules/logger/error.module.mjs +5 -5
  60. package/esm2020/lib/modules/matomo/matomo-module.module.mjs +4 -4
  61. package/esm2020/lib/modules/matomo/matomo.service.mjs +3 -3
  62. package/esm2020/lib/modules/panels/abstract-panel.mjs +3 -3
  63. package/esm2020/lib/modules/panels/panels.component.mjs +3 -3
  64. package/esm2020/lib/modules/panels/panels.module.mjs +5 -5
  65. package/esm2020/lib/modules/panels/panels.service.mjs +3 -3
  66. package/esm2020/lib/modules/relations/relations.component.mjs +16 -11
  67. package/esm2020/lib/modules/relations/relations.module.mjs +14 -16
  68. package/esm2020/lib/modules/search/dropdown-container/dropdown-container.component.mjs +7 -7
  69. package/esm2020/lib/modules/search/dropdown-container/dropdown.service.mjs +4 -4
  70. package/esm2020/lib/modules/search/facet-selector/facet-selector.component.mjs +5 -5
  71. package/esm2020/lib/modules/search/group/group.component.mjs +5 -5
  72. package/esm2020/lib/modules/search/input/input.component.mjs +20 -20
  73. package/esm2020/lib/modules/search/search/search.component.mjs +5 -5
  74. package/esm2020/lib/modules/search/search.module.mjs +15 -17
  75. package/esm2020/lib/modules/select/abstract-select.component.mjs +6 -6
  76. package/esm2020/lib/modules/select/select/select.component.mjs +16 -16
  77. package/esm2020/lib/modules/select/select-enum/select-enum.component.mjs +8 -8
  78. package/esm2020/lib/modules/select/select-hierarchic/select-hierarchic.component.mjs +10 -10
  79. package/esm2020/lib/modules/select/select.module.mjs +16 -18
  80. package/esm2020/lib/modules/sidenav/sidenav/sidenav.component.mjs +3 -3
  81. package/esm2020/lib/modules/sidenav/sidenav-container/sidenav-container.component.mjs +8 -9
  82. package/esm2020/lib/modules/sidenav/sidenav-content/sidenav-content.component.mjs +3 -3
  83. package/esm2020/lib/modules/sidenav/sidenav-stack.service.mjs +3 -3
  84. package/esm2020/lib/modules/sidenav/sidenav.module.mjs +5 -5
  85. package/esm2020/lib/modules/sidenav/sidenav.service.mjs +3 -3
  86. package/esm2020/lib/modules/stamp/stamp-module.module.mjs +5 -5
  87. package/esm2020/lib/modules/stamp/stamp.component.mjs +5 -5
  88. package/esm2020/lib/modules/table-button/table-button.component.mjs +7 -7
  89. package/esm2020/lib/modules/table-button/table-button.module.mjs +5 -5
  90. package/esm2020/lib/services/abstract-model.service.mjs +51 -45
  91. package/esm2020/lib/services/enum.service.mjs +3 -3
  92. package/esm2020/lib/services/link-mutation.service.mjs +3 -3
  93. package/esm2020/lib/services/persistence.service.mjs +3 -3
  94. package/esm2020/lib/services/swiss-parsing-date-adapter.service.mjs +3 -3
  95. package/fesm2015/ecodev-natural.mjs +513 -517
  96. package/fesm2015/ecodev-natural.mjs.map +1 -1
  97. package/fesm2020/ecodev-natural.mjs +512 -517
  98. package/fesm2020/ecodev-natural.mjs.map +1 -1
  99. package/{ecodev-natural.d.ts → index.d.ts} +0 -0
  100. package/lib/classes/abstract-controller.d.ts +1 -1
  101. package/lib/classes/abstract-detail.d.ts +3 -3
  102. package/lib/classes/abstract-editable-list.d.ts +5 -5
  103. package/lib/classes/abstract-list.d.ts +1 -1
  104. package/lib/classes/abstract-navigable-list.d.ts +1 -1
  105. package/lib/classes/validators.d.ts +2 -2
  106. package/lib/directives/http-prefix.directive.d.ts +1 -1
  107. package/lib/modules/alert/confirm.component.d.ts +1 -1
  108. package/lib/modules/avatar/component/avatar.component.d.ts +1 -1
  109. package/lib/modules/columns-picker/columns-picker-column.directive.d.ts +2 -2
  110. package/lib/modules/columns-picker/columns-picker.component.d.ts +1 -1
  111. package/lib/modules/common/directives/linkable-tab.directive.d.ts +1 -1
  112. package/lib/modules/common/directives/src-density.directive.d.ts +1 -1
  113. package/lib/modules/common/pipes/capitalize.pipe.d.ts +1 -1
  114. package/lib/modules/common/pipes/ellipsis.pipe.d.ts +1 -1
  115. package/lib/modules/common/pipes/enum.pipe.d.ts +1 -1
  116. package/lib/modules/common/pipes/swiss-date.pipe.d.ts +1 -1
  117. package/lib/modules/detail-header/detail-header.component.d.ts +1 -1
  118. package/lib/modules/dialog-trigger/dialog-trigger.component.d.ts +1 -1
  119. package/lib/modules/dropdown-components/abstract-association-select-component.directive.d.ts +11 -8
  120. package/lib/modules/dropdown-components/type-date/type-date.component.d.ts +9 -6
  121. package/lib/modules/dropdown-components/type-date-range/type-date-range.component.d.ts +11 -8
  122. package/lib/modules/dropdown-components/type-hierarchic-selector/type-hierarchic-selector.component.d.ts +1 -1
  123. package/lib/modules/dropdown-components/type-natural-select/type-natural-select.component.d.ts +1 -1
  124. package/lib/modules/dropdown-components/type-number/type-number.component.d.ts +10 -7
  125. package/lib/modules/dropdown-components/type-select/type-select.component.d.ts +8 -5
  126. package/lib/modules/dropdown-components/type-text/type-text.component.d.ts +4 -4
  127. package/lib/modules/dropdown-components/types.d.ts +4 -2
  128. package/lib/modules/file/abstract-file.d.ts +1 -1
  129. package/lib/modules/file/component/file.component.d.ts +1 -1
  130. package/lib/modules/file/file-drop.directive.d.ts +1 -1
  131. package/lib/modules/file/file-select.directive.d.ts +1 -1
  132. package/lib/modules/fixed-button/fixed-button.component.d.ts +1 -1
  133. package/lib/modules/fixed-button-detail/fixed-button-detail.component.d.ts +1 -1
  134. package/lib/modules/hierarchic-selector/hierarchic-selector/hierarchic-selector.component.d.ts +1 -1
  135. package/lib/modules/hierarchic-selector/hierarchic-selector-dialog/hierarchic-selector-dialog.component.d.ts +1 -1
  136. package/lib/modules/icon/icon.component.d.ts +1 -1
  137. package/lib/modules/panels/abstract-panel.d.ts +1 -1
  138. package/lib/modules/panels/panels.component.d.ts +1 -1
  139. package/lib/modules/relations/relations.component.d.ts +2 -1
  140. package/lib/modules/search/dropdown-container/dropdown-container.component.d.ts +2 -2
  141. package/lib/modules/search/dropdown-container/dropdown.service.d.ts +1 -1
  142. package/lib/modules/search/facet-selector/facet-selector.component.d.ts +1 -1
  143. package/lib/modules/search/group/group.component.d.ts +1 -1
  144. package/lib/modules/search/input/input.component.d.ts +7 -8
  145. package/lib/modules/search/search/search.component.d.ts +1 -1
  146. package/lib/modules/select/abstract-select.component.d.ts +9 -9
  147. package/lib/modules/select/select/select.component.d.ts +7 -5
  148. package/lib/modules/select/select-enum/select-enum.component.d.ts +5 -3
  149. package/lib/modules/select/select-hierarchic/select-hierarchic.component.d.ts +3 -3
  150. package/lib/modules/sidenav/sidenav/sidenav.component.d.ts +1 -1
  151. package/lib/modules/sidenav/sidenav-container/sidenav-container.component.d.ts +3 -4
  152. package/lib/modules/sidenav/sidenav-content/sidenav-content.component.d.ts +1 -1
  153. package/lib/modules/stamp/stamp.component.d.ts +1 -1
  154. package/lib/modules/table-button/table-button.component.d.ts +1 -1
  155. package/lib/services/abstract-model.service.d.ts +4 -4
  156. package/package.json +8 -8
@@ -1,8 +1,8 @@
1
1
  import { gql } from 'apollo-angular';
2
2
  import { NetworkStatus } from '@apollo/client/core';
3
- import { FormControl, FormGroup } from '@angular/forms';
3
+ import { UntypedFormControl, UntypedFormGroup } from '@angular/forms';
4
4
  import { defaults, merge, mergeWith, omit, pick } from 'lodash-es';
5
- import { EMPTY, Observable, of, ReplaySubject, Subject } from 'rxjs';
5
+ import { combineLatest, EMPTY, first, Observable, of, ReplaySubject, Subject } from 'rxjs';
6
6
  import { debounceTime, filter, map, mergeMap, shareReplay, switchMap, take, takeWhile, tap } from 'rxjs/operators';
7
7
  import { NaturalQueryVariablesManager } from '../classes/query-variable-manager';
8
8
  import { makePlural, mergeOverrideArray, relationsToIds, upperCaseFirstLetter } from '../classes/utility';
@@ -58,7 +58,7 @@ export class NaturalAbstractModelService {
58
58
  const controls = {};
59
59
  const disabled = model.permissions ? !model.permissions.update : false;
60
60
  if (model.id) {
61
- controls['id'] = new FormControl({ value: model.id, disabled: true });
61
+ controls['id'] = new UntypedFormControl({ value: model.id, disabled: true });
62
62
  }
63
63
  // Configure form for each field of model
64
64
  for (const key of Object.keys(values)) {
@@ -69,7 +69,7 @@ export class NaturalAbstractModelService {
69
69
  };
70
70
  const validator = typeof validators[key] !== 'undefined' ? validators[key] : null;
71
71
  const asyncValidator = typeof asyncValidators[key] !== 'undefined' ? asyncValidators[key] : null;
72
- controls[key] = new FormControl(formState, validator, asyncValidator);
72
+ controls[key] = new UntypedFormControl(formState, validator, asyncValidator);
73
73
  }
74
74
  // Configure form for extra validators that are not on a specific field
75
75
  for (const key of Object.keys(validators)) {
@@ -78,7 +78,7 @@ export class NaturalAbstractModelService {
78
78
  value: model[key] ? model[key] : null,
79
79
  disabled: disabled,
80
80
  };
81
- controls[key] = new FormControl(formState, validators[key]);
81
+ controls[key] = new UntypedFormControl(formState, validators[key]);
82
82
  }
83
83
  }
84
84
  for (const key of Object.keys(asyncValidators)) {
@@ -90,7 +90,7 @@ export class NaturalAbstractModelService {
90
90
  value: model[key] ? model[key] : null,
91
91
  disabled: disabled,
92
92
  };
93
- controls[key] = new FormControl(formState, null, asyncValidators[key]);
93
+ controls[key] = new UntypedFormControl(formState, null, asyncValidators[key]);
94
94
  }
95
95
  }
96
96
  return controls;
@@ -103,7 +103,7 @@ export class NaturalAbstractModelService {
103
103
  */
104
104
  getFormGroup(model) {
105
105
  const formConfig = this.getFormConfig(model);
106
- return new FormGroup(formConfig, {
106
+ return new UntypedFormGroup(formConfig, {
107
107
  validators: this.getFormGroupValidators(model),
108
108
  asyncValidators: this.getFormGroupAsyncValidators(model),
109
109
  });
@@ -117,13 +117,15 @@ export class NaturalAbstractModelService {
117
117
  getOne(id) {
118
118
  this.throwIfObservable(id);
119
119
  this.throwIfNotQuery(this.oneQuery);
120
- const queryRef = this.apollo.watchQuery({
121
- query: this.oneQuery,
122
- variables: this.getVariablesForOne(id),
123
- fetchPolicy: 'cache-and-network',
124
- nextFetchPolicy: 'cache-only',
125
- });
126
- return queryRef.valueChanges.pipe(filter(result => !!result.data), takeWhile(result => result.networkStatus !== NetworkStatus.ready, true), map(result => result.data[this.name]));
120
+ return this.getVariablesForOne(id).pipe(switchMap(variables => {
121
+ this.throwIfNotQuery(this.oneQuery);
122
+ return this.apollo.watchQuery({
123
+ query: this.oneQuery,
124
+ variables: variables,
125
+ fetchPolicy: 'cache-and-network',
126
+ nextFetchPolicy: 'cache-only',
127
+ }).valueChanges;
128
+ }), filter(result => !!result.data), takeWhile(result => result.networkStatus !== NetworkStatus.ready, true), map(result => result.data[this.name]));
127
129
  }
128
130
  /**
129
131
  * Get a collection of objects
@@ -133,16 +135,17 @@ export class NaturalAbstractModelService {
133
135
  */
134
136
  getAll(queryVariablesManager) {
135
137
  this.throwIfNotQuery(this.allQuery);
136
- // Copy manager to prevent to apply internal variables to external QueryVariablesManager
137
- const manager = new NaturalQueryVariablesManager(queryVariablesManager);
138
- manager.merge('partial-variables', this.getPartialVariablesForAll());
139
- return this.apollo
140
- .query({
141
- query: this.allQuery,
142
- variables: manager.variables.value,
143
- fetchPolicy: 'network-only',
144
- })
145
- .pipe(this.mapAll());
138
+ return this.getPartialVariablesForAll().pipe(first(), switchMap(partialVariables => {
139
+ this.throwIfNotQuery(this.allQuery);
140
+ // Copy manager to prevent to apply internal variables to external QueryVariablesManager
141
+ const manager = new NaturalQueryVariablesManager(queryVariablesManager);
142
+ manager.merge('partial-variables', partialVariables);
143
+ return this.apollo.query({
144
+ query: this.allQuery,
145
+ variables: manager.variables.value,
146
+ fetchPolicy: 'network-only',
147
+ });
148
+ }), this.mapAll());
146
149
  }
147
150
  /**
148
151
  * Get a collection of objects
@@ -156,16 +159,19 @@ export class NaturalAbstractModelService {
156
159
  */
157
160
  watchAll(queryVariablesManager, fetchPolicy = 'cache-and-network') {
158
161
  this.throwIfNotQuery(this.allQuery);
159
- return queryVariablesManager.variables.pipe(
160
- // Ignore very fast variable changes
161
- debounceTime(20),
162
- // Wait for variables to be defined to prevent duplicate query: with and without variables
163
- // Null is accepted value for "no variables"
164
- filter(variables => typeof variables !== 'undefined'), switchMap(() => {
162
+ return combineLatest({
163
+ variables: queryVariablesManager.variables.pipe(
164
+ // Ignore very fast variable changes
165
+ debounceTime(20),
166
+ // Wait for variables to be defined to prevent duplicate query: with and without variables
167
+ // Null is accepted value for "no variables"
168
+ filter(variables => typeof variables !== 'undefined')),
169
+ partialVariables: this.getPartialVariablesForAll(),
170
+ }).pipe(switchMap(result => {
165
171
  // Apply partial variables from service
166
172
  // Copy manager to prevent to apply internal variables to external QueryVariablesManager
167
173
  const manager = new NaturalQueryVariablesManager(queryVariablesManager);
168
- manager.merge('partial-variables', this.getPartialVariablesForAll());
174
+ manager.merge('partial-variables', result.partialVariables);
169
175
  this.throwIfNotQuery(this.allQuery);
170
176
  return this.apollo
171
177
  .watchQuery({
@@ -382,22 +388,22 @@ export class NaturalAbstractModelService {
382
388
  const plural = makePlural(this.name);
383
389
  const queryName = 'Count' + upperCaseFirstLetter(plural);
384
390
  const filterType = upperCaseFirstLetter(this.name) + 'Filter';
385
- // Copy manager to prevent to apply internal variables to external QueryVariablesManager
386
- const manager = new NaturalQueryVariablesManager(queryVariablesManager);
387
- manager.merge('partial-variables', this.getPartialVariablesForAll());
388
391
  const query = gql `
389
392
  query ${queryName} ($filter: ${filterType}) {
390
393
  count: ${plural} (filter: $filter, pagination: {pageSize: 0, pageIndex: 0}) {
391
394
  length
392
395
  }
393
396
  }`;
394
- return this.apollo
395
- .query({
396
- query: query,
397
- variables: manager.variables.value,
398
- fetchPolicy: 'network-only',
399
- })
400
- .pipe(map(result => result.data.count.length));
397
+ return this.getPartialVariablesForAll().pipe(switchMap(partialVariables => {
398
+ // Copy manager to prevent to apply internal variables to external QueryVariablesManager
399
+ const manager = new NaturalQueryVariablesManager(queryVariablesManager);
400
+ manager.merge('partial-variables', partialVariables);
401
+ return this.apollo.query({
402
+ query: query,
403
+ variables: manager.variables.value,
404
+ fetchPolicy: 'network-only',
405
+ });
406
+ }), map(result => result.data.count.length));
401
407
  }
402
408
  /**
403
409
  * Return empty object with some default values from server perspective
@@ -449,7 +455,7 @@ export class NaturalAbstractModelService {
449
455
  * This is typically a site or state ID, and is needed to get appropriate access rights
450
456
  */
451
457
  getPartialVariablesForOne() {
452
- return {};
458
+ return of({});
453
459
  }
454
460
  /**
455
461
  * Returns additional variables to be used when getting multiple objects
@@ -457,7 +463,7 @@ export class NaturalAbstractModelService {
457
463
  * This is typically a site or state ID, but it could be something else to further filter the query
458
464
  */
459
465
  getPartialVariablesForAll() {
460
- return {};
466
+ return of({});
461
467
  }
462
468
  /**
463
469
  * Returns additional variables to be used when creating an object
@@ -495,7 +501,7 @@ export class NaturalAbstractModelService {
495
501
  * Merge given ID with additional partial variables if there is any
496
502
  */
497
503
  getVariablesForOne(id) {
498
- return merge({}, { id: id }, this.getPartialVariablesForOne());
504
+ return this.getPartialVariablesForOne().pipe(map(partialVariables => merge({}, { id: id }, partialVariables)));
499
505
  }
500
506
  /**
501
507
  * Throw exception to prevent executing null queries
@@ -506,4 +512,4 @@ export class NaturalAbstractModelService {
506
512
  }
507
513
  }
508
514
  }
509
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3QtbW9kZWwuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25hdHVyYWwvc3JjL2xpYi9zZXJ2aWNlcy9hYnN0cmFjdC1tb2RlbC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBUyxHQUFHLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBQWMsYUFBYSxFQUF3QixNQUFNLHFCQUFxQixDQUFDO0FBQ3RGLE9BQU8sRUFBb0MsV0FBVyxFQUFFLFNBQVMsRUFBYyxNQUFNLGdCQUFnQixDQUFDO0FBSXRHLE9BQU8sRUFBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2pFLE9BQU8sRUFBQyxLQUFLLEVBQUUsVUFBVSxFQUFFLEVBQUUsRUFBb0IsYUFBYSxFQUFFLE9BQU8sRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUNyRixPQUFPLEVBQUMsWUFBWSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUNqSCxPQUFPLEVBQUMsNEJBQTRCLEVBQWlCLE1BQU0sbUNBQW1DLENBQUM7QUFFL0YsT0FBTyxFQUFDLFVBQVUsRUFBRSxrQkFBa0IsRUFBRSxjQUFjLEVBQUUsb0JBQW9CLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQXlCeEcsTUFBTSxPQUFnQiwyQkFBMkI7SUE2QjdDLFlBQ3VCLE1BQWMsRUFDZCxJQUFZLEVBQ1osUUFBNkIsRUFDN0IsUUFBNkIsRUFDN0IsY0FBbUMsRUFDbkMsY0FBbUMsRUFDbkMsY0FBbUM7UUFObkMsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLFNBQUksR0FBSixJQUFJLENBQVE7UUFDWixhQUFRLEdB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LE9BQWtCO1FBQ3JELE9BQU8sRUFBRSxDQUFDO0lBQ2QsQ0FBQztJQUVEOztPQUVHO0lBQ08saUJBQWlCLENBQUMsS0FBVTtRQUNsQyxJQUFJLEtBQUssWUFBWSxVQUFVLEVBQUU7WUFDN0IsTUFBTSxJQUFJLEtBQUssQ0FDWCw4R0FBOEcsQ0FDakgsQ0FBQztTQUNMO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0ssa0JBQWtCLENBQUMsRUFBVTtRQUNqQyxPQUFPLEtBQUssQ0FBQyxFQUFFLEVBQUUsRUFBQyxFQUFFLEVBQUUsRUFBRSxFQUFDLEVBQUUsSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQVMsQ0FBQztJQUN6RSxDQUFDO0lBRUQ7O09BRUc7SUFDSyxlQUFlLENBQUMsS0FBMEI7UUFDOUMsSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNSLE1BQU0sSUFBSSxLQUFLLENBQUMsOEVBQThFLENBQUMsQ0FBQztTQUNuRztJQUNMLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7QXBvbGxvLCBncWx9IGZyb20gJ2Fwb2xsby1hbmd1bGFyJztcbmltcG9ydCB7RmV0Y2hSZXN1bHQsIE5ldHdvcmtTdGF0dXMsIFdhdGNoUXVlcnlGZXRjaFBvbGljeX0gZnJvbSAnQGFwb2xsby9jbGllbnQvY29yZSc7XG5pbXBvcnQge0Fic3RyYWN0Q29udHJvbCwgQXN5bmNWYWxpZGF0b3JGbiwgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgVmFsaWRhdG9yRm59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuaW1wb3J0IHtEb2N1bWVudE5vZGV9IGZyb20gJ2dyYXBocWwnO1xuXG5pbXBvcnQge2RlZmF1bHRzLCBtZXJnZSwgbWVyZ2VXaXRoLCBvbWl0LCBwaWNrfSBmcm9tICdsb2Rhc2gtZXMnO1xuaW1wb3J0IHtFTVBUWSwgT2JzZXJ2YWJsZSwgb2YsIE9wZXJhdG9yRnVuY3Rpb24sIFJlcGxheVN1YmplY3QsIFN1YmplY3R9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtkZWJvdW5jZVRpbWUsIGZpbHRlciwgbWFwLCBtZXJnZU1hcCwgc2hhcmVSZXBsYXksIHN3aXRjaE1hcCwgdGFrZSwgdGFrZVdoaWxlLCB0YXB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7TmF0dXJhbFF1ZXJ5VmFyaWFibGVzTWFuYWdlciwgUXVlcnlWYXJpYWJsZXN9IGZyb20gJy4uL2NsYXNzZXMvcXVlcnktdmFyaWFibGUtbWFuYWdlcic7XG5pbXBvcnQge0xpdGVyYWx9IGZyb20gJy4uL3R5cGVzL3R5cGVzJztcbmltcG9ydCB7bWFrZVBsdXJhbCwgbWVyZ2VPdmVycmlkZUFycmF5LCByZWxhdGlvbnNUb0lkcywgdXBwZXJDYXNlRmlyc3RMZXR0ZXJ9IGZyb20gJy4uL2NsYXNzZXMvdXRpbGl0eSc7XG5pbXBvcnQge1BhZ2luYXRlZERhdGF9IGZyb20gJy4uL2NsYXNzZXMvZGF0YS1zb3VyY2UnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1WYWxpZGF0b3JzIHtcbiAgICBba2V5OiBzdHJpbmddOiBWYWxpZGF0b3JGbltdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1Bc3luY1ZhbGlkYXRvcnMge1xuICAgIFtrZXk6IHN0cmluZ106IEFzeW5jVmFsaWRhdG9yRm5bXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWYXJpYWJsZXNXaXRoSW5wdXQge1xuICAgIGlucHV0OiBMaXRlcmFsO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1Db250cm9scyB7XG4gICAgW2tleTogc3RyaW5nXTogQWJzdHJhY3RDb250cm9sO1xufVxuXG5pbnRlcmZhY2UgUmVzb2x2ZTxUT25lPiB7XG4gICAgbW9kZWw6IFRPbmU7XG59XG5cbmV4cG9ydCB0eXBlIFdpdGhJZDxUPiA9IHtpZDogc3RyaW5nfSAmIFQ7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBOYXR1cmFsQWJzdHJhY3RNb2RlbFNlcnZpY2U8XG4gICAgVG9uZSxcbiAgICBWb25lIGV4dGVuZHMge2lkOiBzdHJpbmd9LFxuICAgIFRhbGwgZXh0ZW5kcyBQYWdpbmF0ZWREYXRhPExpdGVyYWw+LFxuICAgIFZhbGwgZXh0ZW5kcyBRdWVyeVZhcmlhYmxlcyxcbiAgICBUY3JlYXRlLFxuICAgIFZjcmVhdGUgZXh0ZW5kcyBWYXJpYWJsZXNXaXRoSW5wdXQsXG4gICAgVHVwZGF0ZSxcbiAgICBWdXBkYXRlIGV4dGVuZHMge2lkOiBzdHJpbmc7IGlucHV0OiBMaXRlcmFsfSxcbiAgICBUZGVsZXRlLFxuICAgIFZkZWxldGUgZXh0ZW5kcyB7aWRzOiBzdHJpbmdbXX0sXG4+IHtcbiAgICAvKipcbiAgICAgKiBTdG9yZXMgdGhlIGRlYm91bmNlZCB1cGRhdGUgZnVuY3Rpb25cbiAgICAgKi9cbiAgICBwcml2YXRlIGRlYm91bmNlZFVwZGF0ZUNhY2hlID0gbmV3IE1hcDxcbiAgICAgICAgc3RyaW5nLFxuICAgICAgICB7XG4gICAgICAgICAgICBzb3VyY2U6IFN1YmplY3Q8dm9pZD47XG4gICAgICAgICAgICBjYW5jZWxsZXI6IFN1YmplY3Q8dm9pZD47XG4gICAgICAgICAgICByZXN1bHQ6IE9ic2VydmFibGU8VHVwZGF0ZT47XG4gICAgICAgIH1cbiAgICA+KCk7XG5cbiAgICAvKipcbiAgICAgKiBTdG9yZSB0aGUgY3JlYXRpb24gbXV0YXRpb25zIHRoYXQgYXJlIHBlbmRpbmdcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IGNyZWF0aW5nQ2FjaGUgPSBuZXcgTWFwPFZjcmVhdGVbJ2lucHV0J10gfCBXaXRoSWQ8VnVwZGF0ZVsnaW5wdXQnXT4sIE9ic2VydmFibGU8VGNyZWF0ZT4+KCk7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgICAgIHByb3RlY3RlZCByZWFkb25seSBhcG9sbG86IEFwb2xsbyxcbiAgICAgICAgcHJvdGVjdGVkIHJlYWRvbmx5IG5hbWU6IHN0cmluZyxcbiAgICAgICAgcHJvdGVjdGVkIHJlYWRvbmx5IG9uZVF1ZXJ5OiBEb2N1bWVudE5vZGUgfCBudWxsLFxuICAgICAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgYWxsUXVlcnk6IERvY3VtZW50Tm9kZSB8IG51bGwsXG4gICAgICAgIHByb3RlY3RlZCByZWFkb25seSBjcmVhdGVNdXRhdGlvbjogRG9jdW1lbnROb2RlIHwgbnVsbCxcbiAgICAgICAgcHJvdGVjdGVkIHJlYWRvbmx5IHVwZGF0ZU11dGF0aW9uOiBEb2N1bWVudE5vZGUgfCBudWxsLFxuICAgICAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgZGVsZXRlTXV0YXRpb246IERvY3VtZW50Tm9kZSB8IG51bGwsXG4gICAgKSB7fVxuXG4gICAgcHVibGljIGdldENvbnNvbGlkYXRlZEZvckNsaWVudCgpOiBMaXRlcmFsIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24odGhpcy5nZXREZWZhdWx0Rm9yU2VydmVyKCksIHRoaXMuZ2V0RGVmYXVsdEZvckNsaWVudCgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIGluZGl2aWR1YWwgZmllbGRzIHZhbGlkYXRvcnNcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0Rm9ybVZhbGlkYXRvcnMobW9kZWw/OiBMaXRlcmFsKTogRm9ybVZhbGlkYXRvcnMge1xuICAgICAgICByZXR1cm4ge307XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBpbmRpdmlkdWFsIGFzeW5jIGZpZWxkcyB2YWxpZGF0b3JzXG4gICAgICovXG4gICAgcHVibGljIGdldEZvcm1Bc3luY1ZhbGlkYXRvcnMobW9kZWw/OiBMaXRlcmFsKTogRm9ybUFzeW5jVmFsaWRhdG9ycyB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIGdyb3VwZWQgZmllbGRzIHZhbGlkYXRvcnMgKGxpa2UgcGFzc3dvcmQgKyBjb25maXJtIHBhc3N3b3JkKVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRGb3JtR3JvdXBWYWxpZGF0b3JzKG1vZGVsPzogTGl0ZXJhbCk6IFZhbGlkYXRvckZuW10ge1xuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBhc3luYyBncm91cCBmaWVsZHMgdmFsaWRhdG9ycyAobGlrZSB1bmlxdWUgY29uc3RyYWludCBvbiBtdWx0aXBsZSBjb2x1bW5zKVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRGb3JtR3JvdXBBc3luY1ZhbGlkYXRvcnMobW9kZWw/OiBMaXRlcmFsKTogQXN5bmNWYWxpZGF0b3JGbltdIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRGb3JtQ29uZmlnKG1vZGVsOiBMaXRlcmFsKTogRm9ybUNvbnRyb2xzIHtcbiAgICAgICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXRDb25zb2xpZGF0ZWRGb3JDbGllbnQoKTtcbiAgICAgICAgY29uc3QgdmFsaWRhdG9ycyA9IHRoaXMuZ2V0Rm9ybVZhbGlkYXRvcnMobW9kZWwpO1xuICAgICAgICBjb25zdCBhc3luY1ZhbGlkYXRvcnMgPSB0aGlzLmdldEZvcm1Bc3luY1ZhbGlkYXRvcnMobW9kZWwpO1xuICAgICAgICBjb25zdCBjb250cm9sczogRm9ybUNvbnRyb2xzID0ge307XG4gICAgICAgIGNvbnN0IGRpc2FibGVkID0gbW9kZWwucGVybWlzc2lvbnMgPyAhbW9kZWwucGVybWlzc2lvbnMudXBkYXRlIDogZmFsc2U7XG5cbiAgICAgICAgaWYgKG1vZGVsLmlkKSB7XG4gICAgICAgICAgICBjb250cm9sc1snaWQnXSA9IG5ldyBGb3JtQ29udHJvbCh7dmFsdWU6IG1vZGVsLmlkLCBkaXNhYmxlZDogdHJ1ZX0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ29uZmlndXJlIGZvcm0gZm9yIGVhY2ggZmllbGQgb2YgbW9kZWxcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXModmFsdWVzKSkge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBtb2RlbFtrZXldICE9PSB1bmRlZmluZWQgPyBtb2RlbFtrZXldIDogdmFsdWVzW2tleV07XG4gICAgICAgICAgICBjb25zdCBmb3JtU3RhdGUgPSB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICAgICAgICAgIGRpc2FibGVkOiBkaXNhYmxlZCxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb25zdCB2YWxpZGF0b3IgPSB0eXBlb2YgdmFsaWRhdG9yc1trZXldICE9PSAndW5kZWZpbmVkJyA/IHZhbGlkYXRvcnNba2V5XSA6IG51bGw7XG4gICAgICAgICAgICBjb25zdCBhc3luY1ZhbGlkYXRvciA9IHR5cGVvZiBhc3luY1ZhbGlkYXRvcnNba2V5XSAhPT0gJ3VuZGVmaW5lZCcgPyBhc3luY1ZhbGlkYXRvcnNba2V5XSA6IG51bGw7XG5cbiAgICAgICAgICAgIGNvbnRyb2xzW2tleV0gPSBuZXcgRm9ybUNvbnRyb2woZm9ybVN0YXRlLCB2YWxpZGF0b3IsIGFzeW5jVmFsaWRhdG9yKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvbmZpZ3VyZSBmb3JtIGZvciBleHRyYSB2YWxpZGF0b3JzIHRoYXQgYXJlIG5vdCBvbiBhIHNwZWNpZmljIGZpZWxkXG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHZhbGlkYXRvcnMpKSB7XG4gICAgICAgICAgICBpZiAoIWNvbnRyb2xzW2tleV0pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmb3JtU3RhdGUgPSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBtb2RlbFtrZXldID8gbW9kZWxba2V5XSA6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGRpc2FibGVkOiBkaXNhYmxlZCxcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgY29udHJvbHNba2V5XSA9IG5ldyBGb3JtQ29udHJvbChmb3JtU3RhdGUsIHZhbGlkYXRvcnNba2V5XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhhc3luY1ZhbGlkYXRvcnMpKSB7XG4gICAgICAgICAgICBpZiAoY29udHJvbHNba2V5XSAmJiBhc3luY1ZhbGlkYXRvcnNba2V5XSkge1xuICAgICAgICAgICAgICAgIGNvbnRyb2xzW2tleV0uc2V0QXN5bmNWYWxpZGF0b3JzKGFzeW5jVmFsaWRhdG9yc1trZXldKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZm9ybVN0YXRlID0ge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbW9kZWxba2V5XSA/IG1vZGVsW2tleV0gOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZDogZGlzYWJsZWQsXG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIGNvbnRyb2xzW2tleV0gPSBuZXcgRm9ybUNvbnRyb2woZm9ybVN0YXRlLCBudWxsLCBhc3luY1ZhbGlkYXRvcnNba2V5XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY29udHJvbHM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIHRoZSBmaW5hbCBGb3JtR3JvdXAgZm9yIHRoZSBvYmplY3QsIGluY2x1ZGluZyBhbGwgdmFsaWRhdG9yc1xuICAgICAqXG4gICAgICogVGhpcyBtZXRob2Qgc2hvdWxkICoqbm90KiogYmUgb3ZlcnJpZGRlbiwgYnV0IGluc3RlYWQgYGdldEZvcm1Db25maWdgLFxuICAgICAqIGBnZXRGb3JtR3JvdXBWYWxpZGF0b3JzYCwgYGdldEZvcm1Hcm91cEFzeW5jVmFsaWRhdG9yc2AgbWlnaHQgYmUuXG4gICAgICovXG4gICAgcHVibGljIGdldEZvcm1Hcm91cChtb2RlbDogTGl0ZXJhbCk6IEZvcm1Hcm91cCB7XG4gICAgICAgIGNvbnN0IGZvcm1Db25maWcgPSB0aGlzLmdldEZvcm1Db25maWcobW9kZWwpO1xuICAgICAgICByZXR1cm4gbmV3IEZvcm1Hcm91cChmb3JtQ29uZmlnLCB7XG4gICAgICAgICAgICB2YWxpZGF0b3JzOiB0aGlzLmdldEZvcm1Hcm91cFZhbGlkYXRvcnMobW9kZWwpLFxuICAgICAgICAgICAgYXN5bmNWYWxpZGF0b3JzOiB0aGlzLmdldEZvcm1Hcm91cEFzeW5jVmFsaWRhdG9ycyhtb2RlbCksXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBhIHNpbmdsZSBvYmplY3RcbiAgICAgKlxuICAgICAqIElmIGF2YWlsYWJsZSBpdCB3aWxsIGVtaXQgb2JqZWN0IGZyb20gY2FjaGUgaW1tZWRpYXRlbHksIHRoZW4gaXRcbiAgICAgKiB3aWxsICoqYWx3YXlzKiogZmV0Y2ggZnJvbSBuZXR3b3JrIGFuZCB0aGVuIHRoZSBvYnNlcnZhYmxlIHdpbGwgYmUgY29tcGxldGVkXG4gICAgICovXG4gICAgcHVibGljIGdldE9uZShpZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxUb25lPiB7XG4gICAgICAgIHRoaXMudGhyb3dJZk9ic2VydmFibGUoaWQpO1xuICAgICAgICB0aGlzLnRocm93SWZOb3RRdWVyeSh0aGlzLm9uZVF1ZXJ5KTtcblxuICAgICAgICBjb25zdCBxdWVyeVJlZiA9IHRoaXMuYXBvbGxvLndhdGNoUXVlcnk8VG9uZSwgVm9uZT4oe1xuICAgICAgICAgICAgcXVlcnk6IHRoaXMub25lUXVlcnksXG4gICAgICAgICAgICB2YXJpYWJsZXM6IHRoaXMuZ2V0VmFyaWFibGVzRm9yT25lKGlkKSxcbiAgICAgICAgICAgIGZldGNoUG9saWN5OiAnY2FjaGUtYW5kLW5ldHdvcmsnLFxuICAgICAgICAgICAgbmV4dEZldGNoUG9saWN5OiAnY2FjaGUtb25seScsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBxdWVyeVJlZi52YWx1ZUNoYW5nZXMucGlwZShcbiAgICAgICAgICAgIGZpbHRlcihyZXN1bHQgPT4gISFyZXN1bHQuZGF0YSksXG4gICAgICAgICAgICB0YWtlV2hpbGUocmVzdWx0ID0+IHJlc3VsdC5uZXR3b3JrU3RhdHVzICE9PSBOZXR3b3JrU3RhdHVzLnJlYWR5LCB0cnVlKSxcbiAgICAgICAgICAgIG1hcChyZXN1bHQgPT4gKHJlc3VsdC5kYXRhIGFzIExpdGVyYWwpW3RoaXMubmFtZV0pLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBhIGNvbGxlY3Rpb24gb2Ygb2JqZWN0c1xuICAgICAqXG4gICAgICogSXQgd2lsbCAqKmFsd2F5cyoqIGZldGNoIGZyb20gbmV0d29yayBhbmQgdGhlbiB0aGUgb2JzZXJ2YWJsZSB3aWxsIGJlIGNvbXBsZXRlZC5cbiAgICAgKiBObyBjYWNoZSBpcyBldmVyIHVzZWQsIHNvIGl0J3Mgc2xvdyBidXQgY29ycmVjdC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0QWxsKHF1ZXJ5VmFyaWFibGVzTWFuYWdlcjogTmF0dXJhbFF1ZXJ5VmFyaWFibGVzTWFuYWdlcjxWYWxsPik6IE9ic2VydmFibGU8VGFsbD4ge1xuICAgICAgICB0aGlzLnRocm93SWZOb3RRdWVyeSh0aGlzLmFsbFF1ZXJ5KTtcblxuICAgICAgICAvLyBDb3B5IG1hbmFnZXIgdG8gcHJldmVudCB0byBhcHBseSBpbnRlcm5hbCB2YXJpYWJsZXMgdG8gZXh0ZXJuYWwgUXVlcnlWYXJpYWJsZXNNYW5hZ2VyXG4gICAgICAgIGNvbnN0IG1hbmFnZXIgPSBuZXcgTmF0dXJhbFF1ZXJ5VmFyaWFibGVzTWFuYWdlcjxWYWxsPihxdWVyeVZhcmlhYmxlc01hbmFnZXIpO1xuICAgICAgICBtYW5hZ2VyLm1lcmdlKCdwYXJ0aWFsLXZhcmlhYmxlcycsIHRoaXMuZ2V0UGFydGlhbFZhcmlhYmxlc0ZvckFsbCgpKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5hcG9sbG9cbiAgICAgICAgICAgIC5xdWVyeTxUYWxsLCBWYWxsPih7XG4gICAgICAgICAgICAgICAgcXVlcnk6IHRoaXMuYWxsUXVlcnksXG4gICAgICAgICAgICAgICAgdmFyaWFibGVzOiBtYW5hZ2VyLnZhcmlhYmxlcy52YWx1ZSxcbiAgICAgICAgICAgICAgICBmZXRjaFBvbGljeTogJ25ldHdvcmstb25seScsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLnBpcGUodGhpcy5tYXBBbGwoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGEgY29sbGVjdGlvbiBvZiBvYmplY3RzXG4gICAgICpcbiAgICAgKiBFdmVyeSB0aW1lIHRoZSBvYnNlcnZhYmxlIHZhcmlhYmxlcyBjaGFuZ2UsIGFuZCB0aGV5IGFyZSBub3QgdW5kZWZpbmVkLFxuICAgICAqIGl0IHdpbGwgcmV0dXJuIHJlc3VsdCBmcm9tIGNhY2hlLCB0aGVuIGl0IHdpbGwgKiphbHdheXMqKiBmZXRjaCBmcm9tIG5ldHdvcmsuXG4gICAgICpcbiAgICAgKiBZb3UgbXVzdCBzdWJzY3JpYmUgdG8gc3RhcnQgZ2V0dGluZyByZXN1bHRzIChhbmQgZmV0Y2ggZnJvbSBuZXR3b3JrKS5cbiAgICAgKlxuICAgICAqIFRoZSBvYnNlcnZhYmxlIHJlc3VsdCB3aWxsIG9ubHkgY29tcGxldGUgd2hlbiB1bnN1YnNjcmliaW5nLiBUaGF0IG1lYW5zIHlvdSAqKm11c3QqKiB1bnN1YnNjcmliZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgd2F0Y2hBbGwoXG4gICAgICAgIHF1ZXJ5VmFyaWFibGVzTWFuYWdlcjogTmF0dXJhbFF1ZXJ5VmFyaWFibGVzTWFuYWdlcjxWYWxsPixcbiAgICAgICAgZmV0Y2hQb2xpY3k6IFdhdGNoUXVlcnlGZXRjaFBvbGljeSA9ICdjYWNoZS1hbmQtbmV0d29yaycsXG4gICAgKTogT2JzZXJ2YWJsZTxUYWxsPiB7XG4gICAgICAgIHRoaXMudGhyb3dJZk5vdFF1ZXJ5KHRoaXMuYWxsUXVlcnkpO1xuXG4gICAgICAgIHJldHVybiBxdWVyeVZhcmlhYmxlc01hbmFnZXIudmFyaWFibGVzLnBpcGUoXG4gICAgICAgICAgICAvLyBJZ25vcmUgdmVyeSBmYXN0IHZhcmlhYmxlIGNoYW5nZXNcbiAgICAgICAgICAgIGRlYm91bmNlVGltZSgyMCksXG4gICAgICAgICAgICAvLyBXYWl0IGZvciB2YXJpYWJsZXMgdG8gYmUgZGVmaW5lZCB0byBwcmV2ZW50IGR1cGxpY2F0ZSBxdWVyeTogd2l0aCBhbmQgd2l0aG91dCB2YXJpYWJsZXNcbiAgICAgICAgICAgIC8vIE51bGwgaXMgYWNjZXB0ZWQgdmFsdWUgZm9yIFwibm8gdmFyaWFibGVzXCJcbiAgICAgICAgICAgIGZpbHRlcih2YXJpYWJsZXMgPT4gdHlwZW9mIHZhcmlhYmxlcyAhPT0gJ3VuZGVmaW5lZCcpLFxuICAgICAgICAgICAgc3dpdGNoTWFwKCgpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBBcHBseSBwYXJ0aWFsIHZhcmlhYmxlcyBmcm9tIHNlcnZpY2VcbiAgICAgICAgICAgICAgICAvLyBDb3B5IG1hbmFnZXIgdG8gcHJldmVudCB0byBhcHBseSBpbnRlcm5hbCB2YXJpYWJsZXMgdG8gZXh0ZXJuYWwgUXVlcnlWYXJpYWJsZXNNYW5hZ2VyXG4gICAgICAgICAgICAgICAgY29uc3QgbWFuYWdlciA9IG5ldyBOYXR1cmFsUXVlcnlWYXJpYWJsZXNNYW5hZ2VyPFZhbGw+KHF1ZXJ5VmFyaWFibGVzTWFuYWdlcik7XG4gICAgICAgICAgICAgICAgbWFuYWdlci5tZXJnZSgncGFydGlhbC12YXJpYWJsZXMnLCB0aGlzLmdldFBhcnRpYWxWYXJpYWJsZXNGb3JBbGwoKSk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnRocm93SWZOb3RRdWVyeSh0aGlzLmFsbFF1ZXJ5KTtcblxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmFwb2xsb1xuICAgICAgICAgICAgICAgICAgICAud2F0Y2hRdWVyeTxUYWxsLCBWYWxsPih7XG4gICAgICAgICAgICAgICAgICAgICAgICBxdWVyeTogdGhpcy5hbGxRdWVyeSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlczogbWFuYWdlci52YXJpYWJsZXMudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBmZXRjaFBvbGljeTogZmV0Y2hQb2xpY3ksXG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIC52YWx1ZUNoYW5nZXMucGlwZShcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcihyID0+ICEhci5kYXRhKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWFwQWxsKCksXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9ucyBhbGxvdyB0byBxdWlja2x5IGNyZWF0ZSBvciB1cGRhdGUgb2JqZWN0cy5cbiAgICAgKlxuICAgICAqIE1hbmFnZXMgYSBcImNyZWF0aW9uIGlzIHBlbmRpbmdcIiBzdGF0dXMsIGFuZCB1cGRhdGUgd2hlbiBjcmVhdGlvbiBpcyByZWFkeS5cbiAgICAgKiBVc2VzIHJlZ3VsYXIgdXBkYXRlL3VwZGF0ZU5vdyBhbmQgY3JlYXRlIG1ldGhvZHMuXG4gICAgICogVXNlZCBtYWlubHkgd2hlbiBlZGl0aW5nIG11bHRpcGxlIG9iamVjdHMgaW4gc2FtZSBjb250cm9sbGVyIChsaWtlIGluIGVkaXRhYmxlIGFycmF5cylcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlYXRlT3JVcGRhdGUoXG4gICAgICAgIG9iamVjdDogVmNyZWF0ZVsnaW5wdXQnXSB8IFdpdGhJZDxWdXBkYXRlWydpbnB1dCddPixcbiAgICAgICAgbm93OiBib29sZWFuID0gZmFsc2UsXG4gICAgKTogT2JzZXJ2YWJsZTxUY3JlYXRlIHwgVHVwZGF0ZT4ge1xuICAgICAgICB0aGlzLnRocm93SWZPYnNlcnZhYmxlKG9iamVjdCk7XG4gICAgICAgIHRoaXMudGhyb3dJZk5vdFF1ZXJ5KHRoaXMuY3JlYXRlTXV0YXRpb24pO1xuICAgICAgICB0aGlzLnRocm93SWZOb3RRdWVyeSh0aGlzLnVwZGF0ZU11dGF0aW9uKTtcblxuICAgICAgICAvLyBJZiBjcmVhdGlvbiBpcyBwZW5kaW5nLCBsaXN0ZW4gdG8gY3JlYXRpb24gb2JzZXJ2YWJsZSBhbmQgd2hlbiByZWFkeSwgZmlyZSB1cGRhdGVcbiAgICAgICAgY29uc3QgcGVuZGluZ0NyZWF0aW9uID0gdGhpcy5jcmVhdGluZ0NhY2hlLmdldChvYmplY3QpO1xuICAgICAgICBpZiAocGVuZGluZ0NyZWF0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gcGVuZGluZ0NyZWF0aW9uLnBpcGUoXG4gICAgICAgICAgICAgICAgc3dpdGNoTWFwKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudXBkYXRlKG9iamVjdCBhcyBXaXRoSWQ8VnVwZGF0ZVsnaW5wdXQnXT4pO1xuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIG9iamVjdCBoYXMgSWQsIGp1c3Qgc2F2ZSBpdFxuICAgICAgICBpZiAoJ2lkJyBpbiBvYmplY3QgJiYgb2JqZWN0LmlkKSB7XG4gICAgICAgICAgICBpZiAobm93KSB7XG4gICAgICAgICAgICAgICAgLy8gdXNlZCBtYWlubHkgZm9yIHRlc3RzLCBiZWNhdXNlIGxvZGFzaCBkZWJvdW5jZWQgdXNlZCBpbiB1cGRhdGUoKSBkb2VzIG5vdCB3b3JrIGZpbmUgd2l0aCBmYWtlQXN5bmMgYW5kIHRpY2soKVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnVwZGF0ZU5vdyhvYmplY3QgYXMgV2l0aElkPFZ1cGRhdGVbJ2lucHV0J10+KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudXBkYXRlKG9iamVjdCBhcyBXaXRoSWQ8VnVwZGF0ZVsnaW5wdXQnXT4pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgb2JqZWN0IHdhcyBub3Qgc2F2aW5nLCBhbmQgaGFzIG5vIElELCBjcmVhdGUgaXRcbiAgICAgICAgY29uc3QgY3JlYXRpb24gPSB0aGlzLmNyZWF0ZShvYmplY3QpLnBpcGUoXG4gICAgICAgICAgICB0YXAoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRpbmdDYWNoZS5kZWxldGUob2JqZWN0KTsgLy8gcmVtb3ZlIGZyb20gY2FjaGVcbiAgICAgICAgICAgIH0pLFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIHN0b3JlcyBjcmVhdGluZyBvYnNlcnZhYmxlIGluIGEgY2FjaGUgcmVwbGF5YWJsZSB2ZXJzaW9uIG9mIHRoZSBvYnNlcnZhYmxlLFxuICAgICAgICAvLyBzbyBzZXZlcmFsIHVwZGF0ZSgpIGNhbiBzdWJzY3JpYmUgdG8gdGhlIHNhbWUgY3JlYXRpb25cbiAgICAgICAgdGhpcy5jcmVhdGluZ0NhY2hlLnNldChvYmplY3QsIGNyZWF0aW9uLnBpcGUoc2hhcmVSZXBsYXkoKSkpO1xuXG4gICAgICAgIHJldHVybiBjcmVhdGlvbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYW4gb2JqZWN0IGluIERCIGFuZCB0aGVuIHJlZmV0Y2ggdGhlIGxpc3Qgb2Ygb2JqZWN0c1xuICAgICAqL1xuICAgIHB1YmxpYyBjcmVhdGUob2JqZWN0OiBWY3JlYXRlWydpbnB1dCddKTogT2JzZXJ2YWJsZTxUY3JlYXRlPiB7XG4gICAgICAgIHRoaXMudGhyb3dJZk9ic2VydmFibGUob2JqZWN0KTtcbiAgICAgICAgdGhpcy50aHJvd0lmTm90UXVlcnkodGhpcy5jcmVhdGVNdXRhdGlvbik7XG5cbiAgICAgICAgY29uc3QgdmFyaWFibGVzID0gbWVyZ2UoXG4gICAgICAgICAgICB7fSxcbiAgICAgICAgICAgIHtpbnB1dDogdGhpcy5nZXRJbnB1dChvYmplY3QpfSxcbiAgICAgICAgICAgIHRoaXMuZ2V0UGFydGlhbFZhcmlhYmxlc0ZvckNyZWF0aW9uKG9iamVjdCksXG4gICAgICAgICkgYXMgVmNyZWF0ZTtcblxuICAgICAgICByZXR1cm4gdGhpcy5hcG9sbG9cbiAgICAgICAgICAgIC5tdXRhdGU8VGNyZWF0ZSwgVmNyZWF0ZT4oe1xuICAgICAgICAgICAgICAgIG11dGF0aW9uOiB0aGlzLmNyZWF0ZU11dGF0aW9uLFxuICAgICAgICAgICAgICAgIHZhcmlhYmxlczogdmFyaWFibGVzLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIG1hcChyZXN1bHQgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFwb2xsby5jbGllbnQucmVGZXRjaE9ic2VydmFibGVRdWVyaWVzKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld09iamVjdCA9IHRoaXMubWFwQ3JlYXRpb24ocmVzdWx0KTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAobmV3T2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWVyZ2VXaXRoKG9iamVjdCwgbmV3T2JqZWN0LCBtZXJnZU92ZXJyaWRlQXJyYXkpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ld09iamVjdDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgYW4gb2JqZWN0LCBhZnRlciBhIHNob3J0IGRlYm91bmNlXG4gICAgICovXG4gICAgcHVibGljIHVwZGF0ZShvYmplY3Q6IFdpdGhJZDxWdXBkYXRlWydpbnB1dCddPik6IE9ic2VydmFibGU8VHVwZGF0ZT4ge1xuICAgICAgICB0aGlzLnRocm93SWZPYnNlcnZhYmxlKG9iamVjdCk7XG4gICAgICAgIHRoaXMudGhyb3dJZk5vdFF1ZXJ5KHRoaXMudXBkYXRlTXV0YXRpb24pO1xuXG4gICAgICAgIC8vIEtlZXAgYSBzaW5nbGUgaW5zdGFuY2Ugb2YgdGhlIGRlYm91bmNlZCB1cGRhdGUgZnVuY3Rpb25cbiAgICAgICAgY29uc3QgaWQgPSBvYmplY3QuaWQ7XG4gICAgICAgIGxldCBkZWJvdW5jZWQgPSB0aGlzLmRlYm91bmNlZFVwZGF0ZUNhY2hlLmdldChpZCk7XG5cbiAgICAgICAgaWYgKCFkZWJvdW5jZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZSA9IG5ldyBSZXBsYXlTdWJqZWN0PHZvaWQ+KDEpO1xuICAgICAgICAgICAgbGV0IHdhc0NhbmNlbGxlZCA9IGZhbHNlO1xuICAgICAgICAgICAgY29uc3QgY2FuY2VsbGVyID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgICAgICAgICAgIGNhbmNlbGxlci5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHdhc0NhbmNlbGxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgc291cmNlLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICAgICAgY2FuY2VsbGVyLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLy8gQ3JlYXRlIGRlYm91bmNlZCB1cGRhdGUgZnVuY3Rpb25cbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHNvdXJjZS5waXBlKFxuICAgICAgICAgICAgICAgIGRlYm91bmNlVGltZSgyMDAwKSwgLy8gV2FpdCAyc2VjLlxuICAgICAgICAgICAgICAgIHRha2UoMSksXG4gICAgICAgICAgICAgICAgbWVyZ2VNYXAoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRlYm91bmNlZFVwZGF0ZUNhY2hlLmRlbGV0ZShpZCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh3YXNDYW5jZWxsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFTVBUWTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnVwZGF0ZU5vdyhvYmplY3QpO1xuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIHNoYXJlUmVwbGF5KCksIC8vIEFsbCBhdHRlbXB0cyB0byB1cGRhdGUgd2lsbCBzaGFyZSB0aGUgZXhhY3Qgc2FtZSBzaW5nbGUgcmVzdWx0IGZyb20gQVBJXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBkZWJvdW5jZWQgPSB7XG4gICAgICAgICAgICAgICAgc291cmNlLFxuICAgICAgICAgICAgICAgIGNhbmNlbGxlcixcbiAgICAgICAgICAgICAgICByZXN1bHQsXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICB0aGlzLmRlYm91bmNlZFVwZGF0ZUNhY2hlLnNldChpZCwgZGVib3VuY2VkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE5vdGlmeSBvdXIgZGVib3VuY2VkIHVwZGF0ZSBlYWNoIHRpbWUgd2UgYXNrIHRvIHVwZGF0ZVxuICAgICAgICBkZWJvdW5jZWQuc291cmNlLm5leHQoKTtcblxuICAgICAgICAvLyBSZXR1cm4gYW5kIG9ic2VydmFibGUgdGhhdCBpcyB1cGRhdGVkIHdoZW4gbXV0YXRpb24gaXMgZG9uZVxuICAgICAgICByZXR1cm4gZGVib3VuY2VkLnJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgYW4gb2JqZWN0IGltbWVkaWF0ZWx5IHdoZW4gc3Vic2NyaWJpbmdcbiAgICAgKi9cbiAgICBwdWJsaWMgdXBkYXRlTm93KG9iamVjdDogV2l0aElkPFZ1cGRhdGVbJ2lucHV0J10+KTogT2JzZXJ2YWJsZTxUdXBkYXRlPiB7XG4gICAgICAgIHRoaXMudGhyb3dJZk9ic2VydmFibGUob2JqZWN0KTtcbiAgICAgICAgdGhpcy50aHJvd0lmTm90UXVlcnkodGhpcy51cGRhdGVNdXRhdGlvbik7XG5cbiAgICAgICAgY29uc3QgdmFyaWFibGVzID0gbWVyZ2UoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaWQ6IG9iamVjdC5pZCxcbiAgICAgICAgICAgICAgICBpbnB1dDogdGhpcy5nZXRJbnB1dChvYmplY3QpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRoaXMuZ2V0UGFydGlhbFZhcmlhYmxlc0ZvclVwZGF0ZShvYmplY3QpLFxuICAgICAgICApIGFzIFZ1cGRhdGU7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuYXBvbGxvXG4gICAgICAgICAgICAubXV0YXRlPFR1cGRhdGUsIFZ1cGRhdGU+KHtcbiAgICAgICAgICAgICAgICBtdXRhdGlvbjogdGhpcy51cGRhdGVNdXRhdGlvbixcbiAgICAgICAgICAgICAgICB2YXJpYWJsZXM6IHZhcmlhYmxlcyxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBtYXAocmVzdWx0ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hcG9sbG8uY2xpZW50LnJlRmV0Y2hPYnNlcnZhYmxlUXVlcmllcygpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXBwZWRSZXN1bHQgPSB0aGlzLm1hcFVwZGF0ZShyZXN1bHQpO1xuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBtZXJnZVdpdGgob2JqZWN0LCBtYXBwZWRSZXN1bHQsIG1lcmdlT3ZlcnJpZGVBcnJheSk7XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSBhbiBvYmplY3QgYnV0IHdpdGhvdXQgYXV0b21hdGljYWxseSBpbmplY3RpbmcgdmFsdWVzIGNvbWluZ1xuICAgICAqIGZyb20gYGdldERlZmF1bHRGb3JTZXJ2ZXIoKWAuXG4gICAgICovXG4gICAgcHVibGljIHVwZGF0ZVBhcnRpYWxseShvYmplY3Q6IFdpdGhJZDxWdXBkYXRlWydpbnB1dCddPik6IE9ic2VydmFibGU8VHVwZGF0ZT4ge1xuICAgICAgICB0aGlzLnRocm93SWZPYnNlcnZhYmxlKG9iamVjdCk7XG4gICAgICAgIHRoaXMudGhyb3dJZk5vdFF1ZXJ5KHRoaXMudXBkYXRlTXV0YXRpb24pO1xuXG4gICAgICAgIGNvbnN0IHZhcmlhYmxlcyA9IHtcbiAgICAgICAgICAgIGlkOiBvYmplY3QuaWQsXG4gICAgICAgICAgICBpbnB1dDogb21pdChyZWxhdGlvbnNUb0lkcyhvYmplY3QpLCAnaWQnKSxcbiAgICAgICAgfSBhcyBWdXBkYXRlO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmFwb2xsb1xuICAgICAgICAgICAgLm11dGF0ZTxUdXBkYXRlLCBWdXBkYXRlPih7XG4gICAgICAgICAgICAgICAgbXV0YXRpb246IHRoaXMudXBkYXRlTXV0YXRpb24sXG4gICAgICAgICAgICAgICAgdmFyaWFibGVzOiB2YXJpYWJsZXMsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgbWFwKHJlc3VsdCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXBvbGxvLmNsaWVudC5yZUZldGNoT2JzZXJ2YWJsZVF1ZXJpZXMoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubWFwVXBkYXRlKHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlbGV0ZSBvYmplY3RzIGFuZCB0aGVuIHJlZmV0Y2ggdGhlIGxpc3Qgb2Ygb2JqZWN0c1xuICAgICAqL1xuICAgIHB1YmxpYyBkZWxldGUob2JqZWN0czoge2lkOiBzdHJpbmd9W10pOiBPYnNlcnZhYmxlPFRkZWxldGU+IHtcbiAgICAgICAgdGhpcy50aHJvd0lmT2JzZXJ2YWJsZShvYmplY3RzKTtcbiAgICAgICAgdGhpcy50aHJvd0lmTm90UXVlcnkodGhpcy5kZWxldGVNdXRhdGlvbik7XG5cbiAgICAgICAgY29uc3QgaWRzID0gb2JqZWN0cy5tYXAobyA9PiB7XG4gICAgICAgICAgICAvLyBDYW5jZWwgcGVuZGluZyB1cGRhdGVcbiAgICAgICAgICAgIGNvbnN0IGRlYm91bmNlZCA9IHRoaXMuZGVib3VuY2VkVXBkYXRlQ2FjaGUuZ2V0KG8uaWQpO1xuICAgICAgICAgICAgZGVib3VuY2VkPy5jYW5jZWxsZXIubmV4dCgpO1xuXG4gICAgICAgICAgICByZXR1cm4gby5pZDtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHZhcmlhYmxlcyA9IG1lcmdlKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGlkczogaWRzLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRoaXMuZ2V0UGFydGlhbFZhcmlhYmxlc0ZvckRlbGV0ZShvYmplY3RzKSxcbiAgICAgICAgKSBhcyBWZGVsZXRlO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmFwb2xsb1xuICAgICAgICAgICAgLm11dGF0ZTxUZGVsZXRlLCBWZGVsZXRlPih7XG4gICAgICAgICAgICAgICAgbXV0YXRpb246IHRoaXMuZGVsZXRlTXV0YXRpb24sXG4gICAgICAgICAgICAgICAgdmFyaWFibGVzOiB2YXJpYWJsZXMsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgbWFwKHJlc3VsdCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXBvbGxvLmNsaWVudC5yZUZldGNoT2JzZXJ2YWJsZVF1ZXJpZXMoKTtcblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5tYXBEZWxldGUocmVzdWx0KTtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzb2x2ZSBtb2RlbCBhbmQgaXRlbXMgcmVsYXRlZCB0byB0aGUgbW9kZWwsIGlmIHRoZSBpZCBpcyBwcm92aWRlZCwgaW4gb3JkZXIgdG8gc2hvdyBhIGZvcm1cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVzb2x2ZShpZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxSZXNvbHZlPFRvbmU+PiB7XG4gICAgICAgIC8vIExvYWQgbW9kZWwgaWYgaWQgaXMgZ2l2ZW5cbiAgICAgICAgbGV0IG9ic2VydmFibGU7XG4gICAgICAgIGlmIChpZCkge1xuICAgICAgICAgICAgb2JzZXJ2YWJsZSA9IHRoaXMuZ2V0T25lKGlkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG9ic2VydmFibGUgPSBvZih0aGlzLmdldENvbnNvbGlkYXRlZEZvckNsaWVudCgpIGFzIFRvbmUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG9ic2VydmFibGUucGlwZShcbiAgICAgICAgICAgIG1hcChyZXN1bHQgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB7bW9kZWw6IHJlc3VsdH07XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gYW4gb2JqZWN0IHRoYXQgbWF0Y2ggdGhlIEdyYXBoUUwgaW5wdXQgdHlwZS5cbiAgICAgKiBJdCBjcmVhdGVzIGFuIG9iamVjdCB3aXRoIG1hbnVhbGx5IGZpbGxlZCBkYXRhIGFuZCBhZGQgdW5jb21wbGV0ZWQgZGF0YSAobGlrZSByZXF1aXJlZCBhdHRyaWJ1dGVzIHRoYXQgY2FuIGJlIGVtcHR5IHN0cmluZ3MpXG4gICAgICovXG4gICAgcHVibGljIGdldElucHV0KG9iamVjdDogTGl0ZXJhbCk6IFZjcmVhdGVbJ2lucHV0J10gfCBWdXBkYXRlWydpbnB1dCddIHtcbiAgICAgICAgLy8gQ29udmVydCByZWxhdGlvbnMgdG8gdGhlaXIgSURzIGZvciBtdXRhdGlvblxuICAgICAgICBvYmplY3QgPSByZWxhdGlvbnNUb0lkcyhvYmplY3QpO1xuXG4gICAgICAgIC8vIFBpY2sgb25seSBhdHRyaWJ1dGVzIHRoYXQgd2UgY2FuIGZpbmQgaW4gdGhlIGVtcHR5IG9iamVjdFxuICAgICAgICAvLyBJbiBvdGhlciB3b3JkcywgcHJldmVudCB0byBzZWxlY3QgZGF0YSB0aGF0IGhhcyB1bndhbnRlZCBhdHRyaWJ1dGVzXG4gICAgICAgIGNvbnN0IGVtcHR5T2JqZWN0ID0gdGhpcy5nZXREZWZhdWx0Rm9yU2VydmVyKCk7XG4gICAgICAgIGxldCBpbnB1dCA9IHBpY2sob2JqZWN0LCBPYmplY3Qua2V5cyhlbXB0eU9iamVjdCkpO1xuXG4gICAgICAgIC8vIENvbXBsZXRlIGEgcG90ZW50aWFsbHkgdW5jb21wbGV0ZWQgb2JqZWN0IHdpdGggZGVmYXVsdCB2YWx1ZXNcbiAgICAgICAgaW5wdXQgPSBkZWZhdWx0cyhpbnB1dCwgZW1wdHlPYmplY3QpO1xuXG4gICAgICAgIHJldHVybiBpbnB1dDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBvYmplY3RzIG1hdGNoaW5nIHRoZSBxdWVyeVxuICAgICAqXG4gICAgICogVGhpcyBpcyB1c2VkIGZvciB0aGUgdW5pcXVlIHZhbGlkYXRvclxuICAgICAqL1xuICAgIHB1YmxpYyBjb3VudChxdWVyeVZhcmlhYmxlc01hbmFnZXI6IE5hdHVyYWxRdWVyeVZhcmlhYmxlc01hbmFnZXI8VmFsbD4pOiBPYnNlcnZhYmxlPG51bWJlcj4ge1xuICAgICAgICBjb25zdCBwbHVyYWwgPSBtYWtlUGx1cmFsKHRoaXMubmFtZSk7XG4gICAgICAgIGNvbnN0IHF1ZXJ5TmFtZSA9ICdDb3VudCcgKyB1cHBlckNhc2VGaXJzdExldHRlcihwbHVyYWwpO1xuICAgICAgICBjb25zdCBmaWx0ZXJUeXBlID0gdXBwZXJDYXNlRmlyc3RMZXR0ZXIodGhpcy5uYW1lKSArICdGaWx0ZXInO1xuXG4gICAgICAgIC8vIENvcHkgbWFuYWdlciB0byBwcmV2ZW50IHRvIGFwcGx5IGludGVybmFsIHZhcmlhYmxlcyB0byBleHRlcm5hbCBRdWVyeVZhcmlhYmxlc01hbmFnZXJcbiAgICAgICAgY29uc3QgbWFuYWdlciA9IG5ldyBOYXR1cmFsUXVlcnlWYXJpYWJsZXNNYW5hZ2VyPFZhbGw+KHF1ZXJ5VmFyaWFibGVzTWFuYWdlcik7XG4gICAgICAgIG1hbmFnZXIubWVyZ2UoJ3BhcnRpYWwtdmFyaWFibGVzJywgdGhpcy5nZXRQYXJ0aWFsVmFyaWFibGVzRm9yQWxsKCkpO1xuXG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0gZ3FsYFxuICAgICAgICAgICAgcXVlcnkgJHtxdWVyeU5hbWV9ICgkZmlsdGVyOiAke2ZpbHRlclR5cGV9KSB7XG4gICAgICAgICAgICBjb3VudDogJHtwbHVyYWx9IChmaWx0ZXI6ICRmaWx0ZXIsIHBhZ2luYXRpb246IHtwYWdlU2l6ZTogMCwgcGFnZUluZGV4OiAwfSkge1xuICAgICAgICAgICAgbGVuZ3RoXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB9YDtcblxuICAgICAgICByZXR1cm4gdGhpcy5hcG9sbG9cbiAgICAgICAgICAgIC5xdWVyeTx7Y291bnQ6IHtsZW5ndGg6IG51bWJlcn19LCBWYWxsPih7XG4gICAgICAgICAgICAgICAgcXVlcnk6IHF1ZXJ5LFxuICAgICAgICAgICAgICAgIHZhcmlhYmxlczogbWFuYWdlci52YXJpYWJsZXMudmFsdWUsXG4gICAgICAgICAgICAgICAgZmV0Y2hQb2xpY3k6ICduZXR3b3JrLW9ubHknLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5waXBlKG1hcChyZXN1bHQgPT4gcmVzdWx0LmRhdGEuY291bnQubGVuZ3RoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJuIGVtcHR5IG9iamVjdCB3aXRoIHNvbWUgZGVmYXVsdCB2YWx1ZXMgZnJvbSBzZXJ2ZXIgcGVyc3BlY3RpdmVcbiAgICAgKlxuICAgICAqIFRoaXMgaXMgdHlwaWNhbGx5IHVzZWZ1bCB3aGVuIHNob3dpbmcgYSBmb3JtIGZvciBjcmVhdGlvblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBnZXREZWZhdWx0Rm9yU2VydmVyKCk6IFZjcmVhdGVbJ2lucHV0J10gfCBWdXBkYXRlWydpbnB1dCddIHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybiBlbXB0eSBvYmplY3Qgd2l0aCBzb21lIGRlZmF1bHQgdmFsdWVzIGZyb20gZnJvbnRlbmQgcGVyc3BlY3RpdmVcbiAgICAgKlxuICAgICAqIFdoZXJlIGVtcHR5IG9iamVjdCBtdXN0IHJlc3BlY3QgZ3JhcGhxbCBYWFhJbnB1dCB0eXBlLCBtYXkgbmVlZCBzb21lIGRlZmF1bHQgdmFsdWVzIGZvciBvdGhlciBmaWVsZHNcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZ2V0RGVmYXVsdEZvckNsaWVudCgpOiBMaXRlcmFsIHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgaXMgdXNlZCB0byBleHRyYWN0IG9ubHkgdGhlIGFycmF5IG9mIGZldGNoZWQgb2JqZWN0cyBvdXQgb2YgdGhlIGVudGlyZSBmZXRjaGVkIGRhdGFcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgbWFwQWxsKCk6IE9wZXJhdG9yRnVuY3Rpb248RmV0Y2hSZXN1bHQ8dW5rbm93bj4sIFRhbGw+IHtcbiAgICAgICAgY29uc3QgcGx1cmFsID0gbWFrZVBsdXJhbCh0aGlzLm5hbWUpO1xuICAgICAgICByZXR1cm4gbWFwKHJlc3VsdCA9PiAocmVzdWx0LmRhdGEgYXMgYW55KVtwbHVyYWxdKTsgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hcG9sbG9ncmFwaHFsL2Fwb2xsby1jbGllbnQvaXNzdWVzLzU2NjJcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGlzIHVzZWQgdG8gZXh0cmFjdCBvbmx5IHRoZSBjcmVhdGVkIG9iamVjdCBvdXQgb2YgdGhlIGVudGlyZSBmZXRjaGVkIGRhdGFcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgbWFwQ3JlYXRpb24ocmVzdWx0OiBGZXRjaFJlc3VsdCk6IFRjcmVhdGUge1xuICAgICAgICBjb25zdCBuYW1lID0gJ2NyZWF0ZScgKyB1cHBlckNhc2VGaXJzdExldHRlcih0aGlzLm5hbWUpO1xuICAgICAgICByZXR1cm4gKHJlc3VsdC5kYXRhIGFzIGFueSlbbmFtZV07IC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vYXBvbGxvZ3JhcGhxbC9hcG9sbG8tY2xpZW50L2lzc3Vlcy81NjYyXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBpcyB1c2VkIHRvIGV4dHJhY3Qgb25seSB0aGUgdXBkYXRlZCBvYmplY3Qgb3V0IG9mIHRoZSBlbnRpcmUgZmV0Y2hlZCBkYXRhXG4gICAgICovXG4gICAgcHJvdGVjdGVkIG1hcFVwZGF0ZShyZXN1bHQ6IEZldGNoUmVzdWx0KTogVHVwZGF0ZSB7XG4gICAgICAgIGNvbnN0IG5hbWUgPSAndXBkYXRlJyArIHVwcGVyQ2FzZUZpcnN0TGV0dGVyKHRoaXMubmFtZSk7XG4gICAgICAgIHJldHVybiAocmVzdWx0LmRhdGEgYXMgYW55KVtuYW1lXTsgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hcG9sbG9ncmFwaHFsL2Fwb2xsby1jbGllbnQvaXNzdWVzLzU2NjJcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGlzIHVzZWQgdG8gZXh0cmFjdCBvbmx5IGZsYWcgd2hlbiBkZWxldGluZyBhbiBvYmplY3RcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgbWFwRGVsZXRlKHJlc3VsdDogRmV0Y2hSZXN1bHQpOiBUZGVsZXRlIHtcbiAgICAgICAgY29uc3QgbmFtZSA9ICdkZWxldGUnICsgbWFrZVBsdXJhbCh1cHBlckNhc2VGaXJzdExldHRlcih0aGlzLm5hbWUpKTtcbiAgICAgICAgcmV0dXJuIChyZXN1bHQuZGF0YSBhcyBhbnkpW25hbWVdOyAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2Fwb2xsb2dyYXBocWwvYXBvbGxvLWNsaWVudC9pc3N1ZXMvNTY2MlxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYWRkaXRpb25hbCB2YXJpYWJsZXMgdG8gYmUgdXNlZCB3aGVuIGdldHRpbmcgYSBzaW5nbGUgb2JqZWN0XG4gICAgICpcbiAgICAgKiBUaGlzIGlzIHR5cGljYWxseSBhIHNpdGUgb3Igc3RhdGUgSUQsIGFuZCBpcyBuZWVkZWQgdG8gZ2V0IGFwcHJvcHJpYXRlIGFjY2VzcyByaWdodHNcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZ2V0UGFydGlhbFZhcmlhYmxlc0Zvck9uZSgpOiBQYXJ0aWFsPFZvbmU+IHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYWRkaXRpb25hbCB2YXJpYWJsZXMgdG8gYmUgdXNlZCB3aGVuIGdldHRpbmcgbXVsdGlwbGUgb2JqZWN0c1xuICAgICAqXG4gICAgICogVGhpcyBpcyB0eXBpY2FsbHkgYSBzaXRlIG9yIHN0YXRlIElELCBidXQgaXQgY291bGQgYmUgc29tZXRoaW5nIGVsc2UgdG8gZnVydGhlciBmaWx0ZXIgdGhlIHF1ZXJ5XG4gICAgICovXG4gICAgcHVibGljIGdldFBhcnRpYWxWYXJpYWJsZXNGb3JBbGwoKTogUGFydGlhbDxWYWxsPiB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFkZGl0aW9uYWwgdmFyaWFibGVzIHRvIGJlIHVzZWQgd2hlbiBjcmVhdGluZyBhbiBvYmplY3RcbiAgICAgKlxuICAgICAqIFRoaXMgaXMgdHlwaWNhbGx5IGEgc2l0ZSBvciBzdGF0ZSBJRFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBnZXRQYXJ0aWFsVmFyaWFibGVzRm9yQ3JlYXRpb24ob2JqZWN0OiBMaXRlcmFsKTogUGFydGlhbDxWY3JlYXRlPiB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFkZGl0aW9uYWwgdmFyaWFibGVzIHRvIGJlIHVzZWQgd2hlbiB1cGRhdGluZyBhbiBvYmplY3RcbiAgICAgKlxuICAgICAqIFRoaXMgaXMgdHlwaWNhbGx5IGEgc2l0ZSBvciBzdGF0ZSBJRFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBnZXRQYXJ0aWFsVmFyaWFibGVzRm9yVXBkYXRlKG9iamVjdDogTGl0ZXJhbCk6IFBhcnRpYWw8VnVwZGF0ZT4ge1xuICAgICAgICByZXR1cm4ge307XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJuIGFkZGl0aW9uYWwgdmFyaWFibGVzIHRvIGJlIHVzZWQgd2hlbiBkZWxldGluZyBhbiBvYmplY3RcbiAgICAgKlxuICAgICAqIFRoaXMgaXMgdHlwaWNhbGx5IGEgc2l0ZSBvciBzdGF0ZSBJRFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBnZXRQYXJ0aWFsVmFyaWFibGVzRm9yRGVsZXRlKG9iamVjdHM6IExpdGVyYWxbXSk6IFBhcnRpYWw8VmRlbGV0ZT4ge1xuICAgICAgICByZXR1cm4ge307XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhyb3cgZXhjZXB0aW9uIHRvIHByZXZlbnQgZXhlY3V0aW5nIHF1ZXJpZXMgd2l0aCBpbnZhbGlkIHZhcmlhYmxlc1xuICAgICAqL1xuICAgIHByb3RlY3RlZCB0aHJvd0lmT2JzZXJ2YWJsZSh2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE9ic2VydmFibGUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAnQ2Fubm90IHVzZSBPYnNlcnZhYmxlIGFzIHZhcmlhYmxlcy4gSW5zdGVhZCB5b3Ugc2hvdWxkIHVzZSAuc3Vic2NyaWJlKCkgdG8gY2FsbCB0aGUgbWV0aG9kIHdpdGggYSByZWFsIHZhbHVlJyxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNZXJnZSBnaXZlbiBJRCB3aXRoIGFkZGl0aW9uYWwgcGFydGlhbCB2YXJpYWJsZXMgaWYgdGhlcmUgaXMgYW55XG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXRWYXJpYWJsZXNGb3JPbmUoaWQ6IHN0cmluZyk6IFZvbmUge1xuICAgICAgICByZXR1cm4gbWVyZ2Uoe30sIHtpZDogaWR9LCB0aGlzLmdldFBhcnRpYWxWYXJpYWJsZXNGb3JPbmUoKSkgYXMgVm9uZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaHJvdyBleGNlcHRpb24gdG8gcHJldmVudCBleGVjdXRpbmcgbnVsbCBxdWVyaWVzXG4gICAgICovXG4gICAgcHJpdmF0ZSB0aHJvd0lmTm90UXVlcnkocXVlcnk6IERvY3VtZW50Tm9kZSB8IG51bGwpOiBhc3NlcnRzIHF1ZXJ5IHtcbiAgICAgICAgaWYgKCFxdWVyeSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdHcmFwaFFMIHF1ZXJ5IGZvciB0aGlzIG1ldGhvZCB3YXMgbm90IGNvbmZpZ3VyZWQgaW4gdGhpcyBzZXJ2aWNlIGNvbnN0cnVjdG9yJyk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=
515
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3QtbW9kZWwuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25hdHVyYWwvc3JjL2xpYi9zZXJ2aWNlcy9hYnN0cmFjdC1tb2RlbC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBUyxHQUFHLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBQWMsYUFBYSxFQUF3QixNQUFNLHFCQUFxQixDQUFDO0FBQ3RGLE9BQU8sRUFBb0Msa0JBQWtCLEVBQUUsZ0JBQWdCLEVBQWMsTUFBTSxnQkFBZ0IsQ0FBQztBQUlwSCxPQUFPLEVBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqRSxPQUFPLEVBQUMsYUFBYSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLEVBQUUsRUFBb0IsYUFBYSxFQUFFLE9BQU8sRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUMzRyxPQUFPLEVBQUMsWUFBWSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUNqSCxPQUFPLEVBQUMsNEJBQTRCLEVBQWlCLE1BQU0sbUNBQW1DLENBQUM7QUFFL0YsT0FBTyxFQUFDLFVBQVUsRUFBRSxrQkFBa0IsRUFBRSxjQUFjLEVBQUUsb0JBQW9CLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQXlCeEcsTUFBTSxPQUFnQiwyQkFBMkI7SUE2QjdDLFlBQ3VCLE1BQWMsRUFDZCxJQUFZLEVBQ1osUUFBNkIsRUFDN0IsUUFBNkIsRUFDN0IsY0FBbUMsRUFDbkMsY0FBbUMsRUFDbkMsY0FBbUM7UUFObkMsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLFNBQUksR0FB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S0FBSyxDQUFDLDhFQUE4RSxDQUFDLENBQUM7U0FDbkc7SUFDTCxDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0Fwb2xsbywgZ3FsfSBmcm9tICdhcG9sbG8tYW5ndWxhcic7XG5pbXBvcnQge0ZldGNoUmVzdWx0LCBOZXR3b3JrU3RhdHVzLCBXYXRjaFF1ZXJ5RmV0Y2hQb2xpY3l9IGZyb20gJ0BhcG9sbG8vY2xpZW50L2NvcmUnO1xuaW1wb3J0IHtBYnN0cmFjdENvbnRyb2wsIEFzeW5jVmFsaWRhdG9yRm4sIFVudHlwZWRGb3JtQ29udHJvbCwgVW50eXBlZEZvcm1Hcm91cCwgVmFsaWRhdG9yRm59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuaW1wb3J0IHtEb2N1bWVudE5vZGV9IGZyb20gJ2dyYXBocWwnO1xuXG5pbXBvcnQge2RlZmF1bHRzLCBtZXJnZSwgbWVyZ2VXaXRoLCBvbWl0LCBwaWNrfSBmcm9tICdsb2Rhc2gtZXMnO1xuaW1wb3J0IHtjb21iaW5lTGF0ZXN0LCBFTVBUWSwgZmlyc3QsIE9ic2VydmFibGUsIG9mLCBPcGVyYXRvckZ1bmN0aW9uLCBSZXBsYXlTdWJqZWN0LCBTdWJqZWN0fSBmcm9tICdyeGpzJztcbmltcG9ydCB7ZGVib3VuY2VUaW1lLCBmaWx0ZXIsIG1hcCwgbWVyZ2VNYXAsIHNoYXJlUmVwbGF5LCBzd2l0Y2hNYXAsIHRha2UsIHRha2VXaGlsZSwgdGFwfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge05hdHVyYWxRdWVyeVZhcmlhYmxlc01hbmFnZXIsIFF1ZXJ5VmFyaWFibGVzfSBmcm9tICcuLi9jbGFzc2VzL3F1ZXJ5LXZhcmlhYmxlLW1hbmFnZXInO1xuaW1wb3J0IHtMaXRlcmFsfSBmcm9tICcuLi90eXBlcy90eXBlcyc7XG5pbXBvcnQge21ha2VQbHVyYWwsIG1lcmdlT3ZlcnJpZGVBcnJheSwgcmVsYXRpb25zVG9JZHMsIHVwcGVyQ2FzZUZpcnN0TGV0dGVyfSBmcm9tICcuLi9jbGFzc2VzL3V0aWxpdHknO1xuaW1wb3J0IHtQYWdpbmF0ZWREYXRhfSBmcm9tICcuLi9jbGFzc2VzL2RhdGEtc291cmNlJztcblxuZXhwb3J0IGludGVyZmFjZSBGb3JtVmFsaWRhdG9ycyB7XG4gICAgW2tleTogc3RyaW5nXTogVmFsaWRhdG9yRm5bXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGb3JtQXN5bmNWYWxpZGF0b3JzIHtcbiAgICBba2V5OiBzdHJpbmddOiBBc3luY1ZhbGlkYXRvckZuW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmFyaWFibGVzV2l0aElucHV0IHtcbiAgICBpbnB1dDogTGl0ZXJhbDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGb3JtQ29udHJvbHMge1xuICAgIFtrZXk6IHN0cmluZ106IEFic3RyYWN0Q29udHJvbDtcbn1cblxuaW50ZXJmYWNlIFJlc29sdmU8VE9uZT4ge1xuICAgIG1vZGVsOiBUT25lO1xufVxuXG5leHBvcnQgdHlwZSBXaXRoSWQ8VD4gPSB7aWQ6IHN0cmluZ30gJiBUO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgTmF0dXJhbEFic3RyYWN0TW9kZWxTZXJ2aWNlPFxuICAgIFRvbmUsXG4gICAgVm9uZSBleHRlbmRzIHtpZDogc3RyaW5nfSxcbiAgICBUYWxsIGV4dGVuZHMgUGFnaW5hdGVkRGF0YTxMaXRlcmFsPixcbiAgICBWYWxsIGV4dGVuZHMgUXVlcnlWYXJpYWJsZXMsXG4gICAgVGNyZWF0ZSxcbiAgICBWY3JlYXRlIGV4dGVuZHMgVmFyaWFibGVzV2l0aElucHV0LFxuICAgIFR1cGRhdGUsXG4gICAgVnVwZGF0ZSBleHRlbmRzIHtpZDogc3RyaW5nOyBpbnB1dDogTGl0ZXJhbH0sXG4gICAgVGRlbGV0ZSxcbiAgICBWZGVsZXRlIGV4dGVuZHMge2lkczogc3RyaW5nW119LFxuPiB7XG4gICAgLyoqXG4gICAgICogU3RvcmVzIHRoZSBkZWJvdW5jZWQgdXBkYXRlIGZ1bmN0aW9uXG4gICAgICovXG4gICAgcHJpdmF0ZSBkZWJvdW5jZWRVcGRhdGVDYWNoZSA9IG5ldyBNYXA8XG4gICAgICAgIHN0cmluZyxcbiAgICAgICAge1xuICAgICAgICAgICAgc291cmNlOiBTdWJqZWN0PHZvaWQ+O1xuICAgICAgICAgICAgY2FuY2VsbGVyOiBTdWJqZWN0PHZvaWQ+O1xuICAgICAgICAgICAgcmVzdWx0OiBPYnNlcnZhYmxlPFR1cGRhdGU+O1xuICAgICAgICB9XG4gICAgPigpO1xuXG4gICAgLyoqXG4gICAgICogU3RvcmUgdGhlIGNyZWF0aW9uIG11dGF0aW9ucyB0aGF0IGFyZSBwZW5kaW5nXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBjcmVhdGluZ0NhY2hlID0gbmV3IE1hcDxWY3JlYXRlWydpbnB1dCddIHwgV2l0aElkPFZ1cGRhdGVbJ2lucHV0J10+LCBPYnNlcnZhYmxlPFRjcmVhdGU+PigpO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgYXBvbGxvOiBBcG9sbG8sXG4gICAgICAgIHByb3RlY3RlZCByZWFkb25seSBuYW1lOiBzdHJpbmcsXG4gICAgICAgIHByb3RlY3RlZCByZWFkb25seSBvbmVRdWVyeTogRG9jdW1lbnROb2RlIHwgbnVsbCxcbiAgICAgICAgcHJvdGVjdGVkIHJlYWRvbmx5IGFsbFF1ZXJ5OiBEb2N1bWVudE5vZGUgfCBudWxsLFxuICAgICAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgY3JlYXRlTXV0YXRpb246IERvY3VtZW50Tm9kZSB8IG51bGwsXG4gICAgICAgIHByb3RlY3RlZCByZWFkb25seSB1cGRhdGVNdXRhdGlvbjogRG9jdW1lbnROb2RlIHwgbnVsbCxcbiAgICAgICAgcHJvdGVjdGVkIHJlYWRvbmx5IGRlbGV0ZU11dGF0aW9uOiBEb2N1bWVudE5vZGUgfCBudWxsLFxuICAgICkge31cblxuICAgIHB1YmxpYyBnZXRDb25zb2xpZGF0ZWRGb3JDbGllbnQoKTogTGl0ZXJhbCB7XG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHRoaXMuZ2V0RGVmYXVsdEZvclNlcnZlcigpLCB0aGlzLmdldERlZmF1bHRGb3JDbGllbnQoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBpbmRpdmlkdWFsIGZpZWxkcyB2YWxpZGF0b3JzXG4gICAgICovXG4gICAgcHVibGljIGdldEZvcm1WYWxpZGF0b3JzKG1vZGVsPzogTGl0ZXJhbCk6IEZvcm1WYWxpZGF0b3JzIHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExpc3Qgb2YgaW5kaXZpZHVhbCBhc3luYyBmaWVsZHMgdmFsaWRhdG9yc1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXRGb3JtQXN5bmNWYWxpZGF0b3JzKG1vZGVsPzogTGl0ZXJhbCk6IEZvcm1Bc3luY1ZhbGlkYXRvcnMge1xuICAgICAgICByZXR1cm4ge307XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBncm91cGVkIGZpZWxkcyB2YWxpZGF0b3JzIChsaWtlIHBhc3N3b3JkICsgY29uZmlybSBwYXNzd29yZClcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0Rm9ybUdyb3VwVmFsaWRhdG9ycyhtb2RlbD86IExpdGVyYWwpOiBWYWxpZGF0b3JGbltdIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExpc3Qgb2YgYXN5bmMgZ3JvdXAgZmllbGRzIHZhbGlkYXRvcnMgKGxpa2UgdW5pcXVlIGNvbnN0cmFpbnQgb24gbXVsdGlwbGUgY29sdW1ucylcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0Rm9ybUdyb3VwQXN5bmNWYWxpZGF0b3JzKG1vZGVsPzogTGl0ZXJhbCk6IEFzeW5jVmFsaWRhdG9yRm5bXSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Rm9ybUNvbmZpZyhtb2RlbDogTGl0ZXJhbCk6IEZvcm1Db250cm9scyB7XG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0Q29uc29saWRhdGVkRm9yQ2xpZW50KCk7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRvcnMgPSB0aGlzLmdldEZvcm1WYWxpZGF0b3JzKG1vZGVsKTtcbiAgICAgICAgY29uc3QgYXN5bmNWYWxpZGF0b3JzID0gdGhpcy5nZXRGb3JtQXN5bmNWYWxpZGF0b3JzKG1vZGVsKTtcbiAgICAgICAgY29uc3QgY29udHJvbHM6IEZvcm1Db250cm9scyA9IHt9O1xuICAgICAgICBjb25zdCBkaXNhYmxlZCA9IG1vZGVsLnBlcm1pc3Npb25zID8gIW1vZGVsLnBlcm1pc3Npb25zLnVwZGF0ZSA6IGZhbHNlO1xuXG4gICAgICAgIGlmIChtb2RlbC5pZCkge1xuICAgICAgICAgICAgY29udHJvbHNbJ2lkJ10gPSBuZXcgVW50eXBlZEZvcm1Db250cm9sKHt2YWx1ZTogbW9kZWwuaWQsIGRpc2FibGVkOiB0cnVlfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDb25maWd1cmUgZm9ybSBmb3IgZWFjaCBmaWVsZCBvZiBtb2RlbFxuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh2YWx1ZXMpKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IG1vZGVsW2tleV0gIT09IHVuZGVmaW5lZCA/IG1vZGVsW2tleV0gOiB2YWx1ZXNba2V5XTtcbiAgICAgICAgICAgIGNvbnN0IGZvcm1TdGF0ZSA9IHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgICAgICAgICAgZGlzYWJsZWQ6IGRpc2FibGVkLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNvbnN0IHZhbGlkYXRvciA9IHR5cGVvZiB2YWxpZGF0b3JzW2tleV0gIT09ICd1bmRlZmluZWQnID8gdmFsaWRhdG9yc1trZXldIDogbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IGFzeW5jVmFsaWRhdG9yID0gdHlwZW9mIGFzeW5jVmFsaWRhdG9yc1trZXldICE9PSAndW5kZWZpbmVkJyA/IGFzeW5jVmFsaWRhdG9yc1trZXldIDogbnVsbDtcblxuICAgICAgICAgICAgY29udHJvbHNba2V5XSA9IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woZm9ybVN0YXRlLCB2YWxpZGF0b3IsIGFzeW5jVmFsaWRhdG9yKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvbmZpZ3VyZSBmb3JtIGZvciBleHRyYSB2YWxpZGF0b3JzIHRoYXQgYXJlIG5vdCBvbiBhIHNwZWNpZmljIGZpZWxkXG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHZhbGlkYXRvcnMpKSB7XG4gICAgICAgICAgICBpZiAoIWNvbnRyb2xzW2tleV0pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmb3JtU3RhdGUgPSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBtb2RlbFtrZXldID8gbW9kZWxba2V5XSA6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGRpc2FibGVkOiBkaXNhYmxlZCxcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgY29udHJvbHNba2V5XSA9IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woZm9ybVN0YXRlLCB2YWxpZGF0b3JzW2tleV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoYXN5bmNWYWxpZGF0b3JzKSkge1xuICAgICAgICAgICAgaWYgKGNvbnRyb2xzW2tleV0gJiYgYXN5bmNWYWxpZGF0b3JzW2tleV0pIHtcbiAgICAgICAgICAgICAgICBjb250cm9sc1trZXldLnNldEFzeW5jVmFsaWRhdG9ycyhhc3luY1ZhbGlkYXRvcnNba2V5XSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZvcm1TdGF0ZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG1vZGVsW2tleV0gPyBtb2RlbFtrZXldIDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ6IGRpc2FibGVkLFxuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICBjb250cm9sc1trZXldID0gbmV3IFVudHlwZWRGb3JtQ29udHJvbChmb3JtU3RhdGUsIG51bGwsIGFzeW5jVmFsaWRhdG9yc1trZXldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb250cm9scztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgdGhlIGZpbmFsIEZvcm1Hcm91cCBmb3IgdGhlIG9iamVjdCwgaW5jbHVkaW5nIGFsbCB2YWxpZGF0b3JzXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCBzaG91bGQgKipub3QqKiBiZSBvdmVycmlkZGVuLCBidXQgaW5zdGVhZCBgZ2V0Rm9ybUNvbmZpZ2AsXG4gICAgICogYGdldEZvcm1Hcm91cFZhbGlkYXRvcnNgLCBgZ2V0Rm9ybUdyb3VwQXN5bmNWYWxpZGF0b3JzYCBtaWdodCBiZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0Rm9ybUdyb3VwKG1vZGVsOiBMaXRlcmFsKTogVW50eXBlZEZvcm1Hcm91cCB7XG4gICAgICAgIGNvbnN0IGZvcm1Db25maWcgPSB0aGlzLmdldEZvcm1Db25maWcobW9kZWwpO1xuICAgICAgICByZXR1cm4gbmV3IFVudHlwZWRGb3JtR3JvdXAoZm9ybUNvbmZpZywge1xuICAgICAgICAgICAgdmFsaWRhdG9yczogdGhpcy5nZXRGb3JtR3JvdXBWYWxpZGF0b3JzKG1vZGVsKSxcbiAgICAgICAgICAgIGFzeW5jVmFsaWRhdG9yczogdGhpcy5nZXRGb3JtR3JvdXBBc3luY1ZhbGlkYXRvcnMobW9kZWwpLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYSBzaW5nbGUgb2JqZWN0XG4gICAgICpcbiAgICAgKiBJZiBhdmFpbGFibGUgaXQgd2lsbCBlbWl0IG9iamVjdCBmcm9tIGNhY2hlIGltbWVkaWF0ZWx5LCB0aGVuIGl0XG4gICAgICogd2lsbCAqKmFsd2F5cyoqIGZldGNoIGZyb20gbmV0d29yayBhbmQgdGhlbiB0aGUgb2JzZXJ2YWJsZSB3aWxsIGJlIGNvbXBsZXRlZFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRPbmUoaWQ6IHN0cmluZyk6IE9ic2VydmFibGU8VG9uZT4ge1xuICAgICAgICB0aGlzLnRocm93SWZPYnNlcnZhYmxlKGlkKTtcbiAgICAgICAgdGhpcy50aHJvd0lmTm90UXVlcnkodGhpcy5vbmVRdWVyeSk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VmFyaWFibGVzRm9yT25lKGlkKS5waXBlKFxuICAgICAgICAgICAgc3dpdGNoTWFwKHZhcmlhYmxlcyA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy50aHJvd0lmTm90UXVlcnkodGhpcy5vbmVRdWVyeSk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5hcG9sbG8ud2F0Y2hRdWVyeTxUb25lLCBWb25lPih7XG4gICAgICAgICAgICAgICAgICAgIHF1ZXJ5OiB0aGlzLm9uZVF1ZXJ5LFxuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZXM6IHZhcmlhYmxlcyxcbiAgICAgICAgICAgICAgICAgICAgZmV0Y2hQb2xpY3k6ICdjYWNoZS1hbmQtbmV0d29yaycsXG4gICAgICAgICAgICAgICAgICAgIG5leHRGZXRjaFBvbGljeTogJ2NhY2hlLW9ubHknLFxuICAgICAgICAgICAgICAgIH0pLnZhbHVlQ2hhbmdlcztcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgZmlsdGVyKHJlc3VsdCA9PiAhIXJlc3VsdC5kYXRhKSxcbiAgICAgICAgICAgIHRha2VXaGlsZShyZXN1bHQgPT4gcmVzdWx0Lm5ldHdvcmtTdGF0dXMgIT09IE5ldHdvcmtTdGF0dXMucmVhZHksIHRydWUpLFxuICAgICAgICAgICAgbWFwKHJlc3VsdCA9PiAocmVzdWx0LmRhdGEgYXMgTGl0ZXJhbClbdGhpcy5uYW1lXSksXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGEgY29sbGVjdGlvbiBvZiBvYmplY3RzXG4gICAgICpcbiAgICAgKiBJdCB3aWxsICoqYWx3YXlzKiogZmV0Y2ggZnJvbSBuZXR3b3JrIGFuZCB0aGVuIHRoZSBvYnNlcnZhYmxlIHdpbGwgYmUgY29tcGxldGVkLlxuICAgICAqIE5vIGNhY2hlIGlzIGV2ZXIgdXNlZCwgc28gaXQncyBzbG93IGJ1dCBjb3JyZWN0LlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRBbGwocXVlcnlWYXJpYWJsZXNNYW5hZ2VyOiBOYXR1cmFsUXVlcnlWYXJpYWJsZXNNYW5hZ2VyPFZhbGw+KTogT2JzZXJ2YWJsZTxUYWxsPiB7XG4gICAgICAgIHRoaXMudGhyb3dJZk5vdFF1ZXJ5KHRoaXMuYWxsUXVlcnkpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcnRpYWxWYXJpYWJsZXNGb3JBbGwoKS5waXBlKFxuICAgICAgICAgICAgZmlyc3QoKSxcbiAgICAgICAgICAgIHN3aXRjaE1hcChwYXJ0aWFsVmFyaWFibGVzID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnRocm93SWZOb3RRdWVyeSh0aGlzLmFsbFF1ZXJ5KTtcblxuICAgICAgICAgICAgICAgIC8vIENvcHkgbWFuYWdlciB0byBwcmV2ZW50IHRvIGFwcGx5IGludGVybmFsIHZhcmlhYmxlcyB0byBleHRlcm5hbCBRdWVyeVZhcmlhYmxlc01hbmFnZXJcbiAgICAgICAgICAgICAgICBjb25zdCBtYW5hZ2VyID0gbmV3IE5hdHVyYWxRdWVyeVZhcmlhYmxlc01hbmFnZXI8VmFsbD4ocXVlcnlWYXJpYWJsZXNNYW5hZ2VyKTtcbiAgICAgICAgICAgICAgICBtYW5hZ2VyLm1lcmdlKCdwYXJ0aWFsLXZhcmlhYmxlcycsIHBhcnRpYWxWYXJpYWJsZXMpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXBvbGxvLnF1ZXJ5PFRhbGwsIFZhbGw+KHtcbiAgICAgICAgICAgICAgICAgICAgcXVlcnk6IHRoaXMuYWxsUXVlcnksXG4gICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlczogbWFuYWdlci52YXJpYWJsZXMudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIGZldGNoUG9saWN5OiAnbmV0d29yay1vbmx5JyxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgdGhpcy5tYXBBbGwoKSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYSBjb2xsZWN0aW9uIG9mIG9iamVjdHNcbiAgICAgKlxuICAgICAqIEV2ZXJ5IHRpbWUgdGhlIG9ic2VydmFibGUgdmFyaWFibGVzIGNoYW5nZSwgYW5kIHRoZXkgYXJlIG5vdCB1bmRlZmluZWQsXG4gICAgICogaXQgd2lsbCByZXR1cm4gcmVzdWx0IGZyb20gY2FjaGUsIHRoZW4gaXQgd2lsbCAqKmFsd2F5cyoqIGZldGNoIGZyb20gbmV0d29yay5cbiAgICAgKlxuICAgICAqIFlvdSBtdXN0IHN1YnNjcmliZSB0byBzdGFydCBnZXR0aW5nIHJlc3VsdHMgKGFuZCBmZXRjaCBmcm9tIG5ldHdvcmspLlxuICAgICAqXG4gICAgICogVGhlIG9ic2VydmFibGUgcmVzdWx0IHdpbGwgb25seSBjb21wbGV0ZSB3aGVuIHVuc3Vic2NyaWJpbmcuIFRoYXQgbWVhbnMgeW91ICoqbXVzdCoqIHVuc3Vic2NyaWJlLlxuICAgICAqL1xuICAgIHB1YmxpYyB3YXRjaEFsbChcbiAgICAgICAgcXVlcnlWYXJpYWJsZXNNYW5hZ2VyOiBOYXR1cmFsUXVlcnlWYXJpYWJsZXNNYW5hZ2VyPFZhbGw+LFxuICAgICAgICBmZXRjaFBvbGljeTogV2F0Y2hRdWVyeUZldGNoUG9saWN5ID0gJ2NhY2hlLWFuZC1uZXR3b3JrJyxcbiAgICApOiBPYnNlcnZhYmxlPFRhbGw+IHtcbiAgICAgICAgdGhpcy50aHJvd0lmTm90UXVlcnkodGhpcy5hbGxRdWVyeSk7XG5cbiAgICAgICAgcmV0dXJuIGNvbWJpbmVMYXRlc3Qoe1xuICAgICAgICAgICAgdmFyaWFibGVzOiBxdWVyeVZhcmlhYmxlc01hbmFnZXIudmFyaWFibGVzLnBpcGUoXG4gICAgICAgICAgICAgICAgLy8gSWdub3JlIHZlcnkgZmFzdCB2YXJpYWJsZSBjaGFuZ2VzXG4gICAgICAgICAgICAgICAgZGVib3VuY2VUaW1lKDIwKSxcbiAgICAgICAgICAgICAgICAvLyBXYWl0IGZvciB2YXJpYWJsZXMgdG8gYmUgZGVmaW5lZCB0byBwcmV2ZW50IGR1cGxpY2F0ZSBxdWVyeTogd2l0aCBhbmQgd2l0aG91dCB2YXJpYWJsZXNcbiAgICAgICAgICAgICAgICAvLyBOdWxsIGlzIGFjY2VwdGVkIHZhbHVlIGZvciBcIm5vIHZhcmlhYmxlc1wiXG4gICAgICAgICAgICAgICAgZmlsdGVyKHZhcmlhYmxlcyA9PiB0eXBlb2YgdmFyaWFibGVzICE9PSAndW5kZWZpbmVkJyksXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgcGFydGlhbFZhcmlhYmxlczogdGhpcy5nZXRQYXJ0aWFsVmFyaWFibGVzRm9yQWxsKCksXG4gICAgICAgIH0pLnBpcGUoXG4gICAgICAgICAgICBzd2l0Y2hNYXAocmVzdWx0ID0+IHtcbiAgICAgICAgICAgICAgICAvLyBBcHBseSBwYXJ0aWFsIHZhcmlhYmxlcyBmcm9tIHNlcnZpY2VcbiAgICAgICAgICAgICAgICAvLyBDb3B5IG1hbmFnZXIgdG8gcHJldmVudCB0byBhcHBseSBpbnRlcm5hbCB2YXJpYWJsZXMgdG8gZXh0ZXJuYWwgUXVlcnlWYXJpYWJsZXNNYW5hZ2VyXG4gICAgICAgICAgICAgICAgY29uc3QgbWFuYWdlciA9IG5ldyBOYXR1cmFsUXVlcnlWYXJpYWJsZXNNYW5hZ2VyPFZhbGw+KHF1ZXJ5VmFyaWFibGVzTWFuYWdlcik7XG4gICAgICAgICAgICAgICAgbWFuYWdlci5tZXJnZSgncGFydGlhbC12YXJpYWJsZXMnLCByZXN1bHQucGFydGlhbFZhcmlhYmxlcyk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnRocm93SWZOb3RRdWVyeSh0aGlzLmFsbFF1ZXJ5KTtcblxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmFwb2xsb1xuICAgICAgICAgICAgICAgICAgICAud2F0Y2hRdWVyeTxUYWxsLCBWYWxsPih7XG4gICAgICAgICAgICAgICAgICAgICAgICBxdWVyeTogdGhpcy5hbGxRdWVyeSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlczogbWFuYWdlci52YXJpYWJsZXMudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBmZXRjaFBvbGljeTogZmV0Y2hQb2xpY3ksXG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIC52YWx1ZUNoYW5nZXMucGlwZShcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcihyID0+ICEhci5kYXRhKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWFwQWxsKCksXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9ucyBhbGxvdyB0byBxdWlja2x5IGNyZWF0ZSBvciB1cGRhdGUgb2JqZWN0cy5cbiAgICAgKlxuICAgICAqIE1hbmFnZXMgYSBcImNyZWF0aW9uIGlzIHBlbmRpbmdcIiBzdGF0dXMsIGFuZCB1cGRhdGUgd2hlbiBjcmVhdGlvbiBpcyByZWFkeS5cbiAgICAgKiBVc2VzIHJlZ3VsYXIgdXBkYXRlL3VwZGF0ZU5vdyBhbmQgY3JlYXRlIG1ldGhvZHMuXG4gICAgICogVXNlZCBtYWlubHkgd2hlbiBlZGl0aW5nIG11bHRpcGxlIG9iamVjdHMgaW4gc2FtZSBjb250cm9sbGVyIChsaWtlIGluIGVkaXRhYmxlIGFycmF5cylcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlYXRlT3JVcGRhdGUoXG4gICAgICAgIG9iamVjdDogVmNyZWF0ZVsnaW5wdXQnXSB8IFdpdGhJZDxWdXBkYXRlWydpbnB1dCddPixcbiAgICAgICAgbm93OiBib29sZWFuID0gZmFsc2UsXG4gICAgKTogT2JzZXJ2YWJsZTxUY3JlYXRlIHwgVHVwZGF0ZT4ge1xuICAgICAgICB0aGlzLnRocm93SWZPYnNlcnZhYmxlKG9iamVjdCk7XG4gICAgICAgIHRoaXMudGhyb3dJZk5vdFF1ZXJ5KHRoaXMuY3JlYXRlTXV0YXRpb24pO1xuICAgICAgICB0aGlzLnRocm93SWZOb3RRdWVyeSh0aGlzLnVwZGF0ZU11dGF0aW9uKTtcblxuICAgICAgICAvLyBJZiBjcmVhdGlvbiBpcyBwZW5kaW5nLCBsaXN0ZW4gdG8gY3JlYXRpb24gb2JzZXJ2YWJsZSBhbmQgd2hlbiByZWFkeSwgZmlyZSB1cGRhdGVcbiAgICAgICAgY29uc3QgcGVuZGluZ0NyZWF0aW9uID0gdGhpcy5jcmVhdGluZ0NhY2hlLmdldChvYmplY3QpO1xuICAgICAgICBpZiAocGVuZGluZ0NyZWF0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gcGVuZGluZ0NyZWF0aW9uLnBpcGUoXG4gICAgICAgICAgICAgICAgc3dpdGNoTWFwKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudXBkYXRlKG9iamVjdCBhcyBXaXRoSWQ8VnVwZGF0ZVsnaW5wdXQnXT4pO1xuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIG9iamVjdCBoYXMgSWQsIGp1c3Qgc2F2ZSBpdFxuICAgICAgICBpZiAoJ2lkJyBpbiBvYmplY3QgJiYgb2JqZWN0LmlkKSB7XG4gICAgICAgICAgICBpZiAobm93KSB7XG4gICAgICAgICAgICAgICAgLy8gdXNlZCBtYWlubHkgZm9yIHRlc3RzLCBiZWNhdXNlIGxvZGFzaCBkZWJvdW5jZWQgdXNlZCBpbiB1cGRhdGUoKSBkb2VzIG5vdCB3b3JrIGZpbmUgd2l0aCBmYWtlQXN5bmMgYW5kIHRpY2soKVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnVwZGF0ZU5vdyhvYmplY3QgYXMgV2l0aElkPFZ1cGRhdGVbJ2lucHV0J10+KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudXBkYXRlKG9iamVjdCBhcyBXaXRoSWQ8VnVwZGF0ZVsnaW5wdXQnXT4pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgb2JqZWN0IHdhcyBub3Qgc2F2aW5nLCBhbmQgaGFzIG5vIElELCBjcmVhdGUgaXRcbiAgICAgICAgY29uc3QgY3JlYXRpb24gPSB0aGlzLmNyZWF0ZShvYmplY3QpLnBpcGUoXG4gICAgICAgICAgICB0YXAoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRpbmdDYWNoZS5kZWxldGUob2JqZWN0KTsgLy8gcmVtb3ZlIGZyb20gY2FjaGVcbiAgICAgICAgICAgIH0pLFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIHN0b3JlcyBjcmVhdGluZyBvYnNlcnZhYmxlIGluIGEgY2FjaGUgcmVwbGF5YWJsZSB2ZXJzaW9uIG9mIHRoZSBvYnNlcnZhYmxlLFxuICAgICAgICAvLyBzbyBzZXZlcmFsIHVwZGF0ZSgpIGNhbiBzdWJzY3JpYmUgdG8gdGhlIHNhbWUgY3JlYXRpb25cbiAgICAgICAgdGhpcy5jcmVhdGluZ0NhY2hlLnNldChvYmplY3QsIGNyZWF0aW9uLnBpcGUoc2hhcmVSZXBsYXkoKSkpO1xuXG4gICAgICAgIHJldHVybiBjcmVhdGlvbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYW4gb2JqZWN0IGluIERCIGFuZCB0aGVuIHJlZmV0Y2ggdGhlIGxpc3Qgb2Ygb2JqZWN0c1xuICAgICAqL1xuICAgIHB1YmxpYyBjcmVhdGUob2JqZWN0OiBWY3JlYXRlWydpbnB1dCddKTogT2JzZXJ2YWJsZTxUY3JlYXRlPiB7XG4gICAgICAgIHRoaXMudGhyb3dJZk9ic2VydmFibGUob2JqZWN0KTtcbiAgICAgICAgdGhpcy50aHJvd0lmTm90UXVlcnkodGhpcy5jcmVhdGVNdXRhdGlvbik7XG5cbiAgICAgICAgY29uc3QgdmFyaWFibGVzID0gbWVyZ2UoXG4gICAgICAgICAgICB7fSxcbiAgICAgICAgICAgIHtpbnB1dDogdGhpcy5nZXRJbnB1dChvYmplY3QpfSxcbiAgICAgICAgICAgIHRoaXMuZ2V0UGFydGlhbFZhcmlhYmxlc0ZvckNyZWF0aW9uKG9iamVjdCksXG4gICAgICAgICkgYXMgVmNyZWF0ZTtcblxuICAgICAgICByZXR1cm4gdGhpcy5hcG9sbG9cbiAgICAgICAgICAgIC5tdXRhdGU8VGNyZWF0ZSwgVmNyZWF0ZT4oe1xuICAgICAgICAgICAgICAgIG11dGF0aW9uOiB0aGlzLmNyZWF0ZU11dGF0aW9uLFxuICAgICAgICAgICAgICAgIHZhcmlhYmxlczogdmFyaWFibGVzLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIG1hcChyZXN1bHQgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFwb2xsby5jbGllbnQucmVGZXRjaE9ic2VydmFibGVRdWVyaWVzKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld09iamVjdCA9IHRoaXMubWFwQ3JlYXRpb24ocmVzdWx0KTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAobmV3T2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWVyZ2VXaXRoKG9iamVjdCwgbmV3T2JqZWN0LCBtZXJnZU92ZXJyaWRlQXJyYXkpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ld09iamVjdDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgYW4gb2JqZWN0LCBhZnRlciBhIHNob3J0IGRlYm91bmNlXG4gICAgICovXG4gICAgcHVibGljIHVwZGF0ZShvYmplY3Q6IFdpdGhJZDxWdXBkYXRlWydpbnB1dCddPik6IE9ic2VydmFibGU8VHVwZGF0ZT4ge1xuICAgICAgICB0aGlzLnRocm93SWZPYnNlcnZhYmxlKG9iamVjdCk7XG4gICAgICAgIHRoaXMudGhyb3dJZk5vdFF1ZXJ5KHRoaXMudXBkYXRlTXV0YXRpb24pO1xuXG4gICAgICAgIC8vIEtlZXAgYSBzaW5nbGUgaW5zdGFuY2Ugb2YgdGhlIGRlYm91bmNlZCB1cGRhdGUgZnVuY3Rpb25cbiAgICAgICAgY29uc3QgaWQgPSBvYmplY3QuaWQ7XG4gICAgICAgIGxldCBkZWJvdW5jZWQgPSB0aGlzLmRlYm91bmNlZFVwZGF0ZUNhY2hlLmdldChpZCk7XG5cbiAgICAgICAgaWYgKCFkZWJvdW5jZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZSA9IG5ldyBSZXBsYXlTdWJqZWN0PHZvaWQ+KDEpO1xuICAgICAgICAgICAgbGV0IHdhc0NhbmNlbGxlZCA9IGZhbHNlO1xuICAgICAgICAgICAgY29uc3QgY2FuY2VsbGVyID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgICAgICAgICAgIGNhbmNlbGxlci5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHdhc0NhbmNlbGxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgc291cmNlLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICAgICAgY2FuY2VsbGVyLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLy8gQ3JlYXRlIGRlYm91bmNlZCB1cGRhdGUgZnVuY3Rpb25cbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHNvdXJjZS5waXBlKFxuICAgICAgICAgICAgICAgIGRlYm91bmNlVGltZSgyMDAwKSwgLy8gV2FpdCAyc2VjLlxuICAgICAgICAgICAgICAgIHRha2UoMSksXG4gICAgICAgICAgICAgICAgbWVyZ2VNYXAoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRlYm91bmNlZFVwZGF0ZUNhY2hlLmRlbGV0ZShpZCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh3YXNDYW5jZWxsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFTVBUWTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnVwZGF0ZU5vdyhvYmplY3QpO1xuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIHNoYXJlUmVwbGF5KCksIC8vIEFsbCBhdHRlbXB0cyB0byB1cGRhdGUgd2lsbCBzaGFyZSB0aGUgZXhhY3Qgc2FtZSBzaW5nbGUgcmVzdWx0IGZyb20gQVBJXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBkZWJvdW5jZWQgPSB7XG4gICAgICAgICAgICAgICAgc291cmNlLFxuICAgICAgICAgICAgICAgIGNhbmNlbGxlcixcbiAgICAgICAgICAgICAgICByZXN1bHQsXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICB0aGlzLmRlYm91bmNlZFVwZGF0ZUNhY2hlLnNldChpZCwgZGVib3VuY2VkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE5vdGlmeSBvdXIgZGVib3VuY2VkIHVwZGF0ZSBlYWNoIHRpbWUgd2UgYXNrIHRvIHVwZGF0ZVxuICAgICAgICBkZWJvdW5jZWQuc291cmNlLm5leHQoKTtcblxuICAgICAgICAvLyBSZXR1cm4gYW5kIG9ic2VydmFibGUgdGhhdCBpcyB1cGRhdGVkIHdoZW4gbXV0YXRpb24gaXMgZG9uZVxuICAgICAgICByZXR1cm4gZGVib3VuY2VkLnJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgYW4gb2JqZWN0IGltbWVkaWF0ZWx5IHdoZW4gc3Vic2NyaWJpbmdcbiAgICAgKi9cbiAgICBwdWJsaWMgdXBkYXRlTm93KG9iamVjdDogV2l0aElkPFZ1cGRhdGVbJ2lucHV0J10+KTogT2JzZXJ2YWJsZTxUdXBkYXRlPiB7XG4gICAgICAgIHRoaXMudGhyb3dJZk9ic2VydmFibGUob2JqZWN0KTtcbiAgICAgICAgdGhpcy50aHJvd0lmTm90UXVlcnkodGhpcy51cGRhdGVNdXRhdGlvbik7XG5cbiAgICAgICAgY29uc3QgdmFyaWFibGVzID0gbWVyZ2UoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaWQ6IG9iamVjdC5pZCxcbiAgICAgICAgICAgICAgICBpbnB1dDogdGhpcy5nZXRJbnB1dChvYmplY3QpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRoaXMuZ2V0UGFydGlhbFZhcmlhYmxlc0ZvclVwZGF0ZShvYmplY3QpLFxuICAgICAgICApIGFzIFZ1cGRhdGU7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuYXBvbGxvXG4gICAgICAgICAgICAubXV0YXRlPFR1cGRhdGUsIFZ1cGRhdGU+KHtcbiAgICAgICAgICAgICAgICBtdXRhdGlvbjogdGhpcy51cGRhdGVNdXRhdGlvbixcbiAgICAgICAgICAgICAgICB2YXJpYWJsZXM6IHZhcmlhYmxlcyxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBtYXAocmVzdWx0ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hcG9sbG8uY2xpZW50LnJlRmV0Y2hPYnNlcnZhYmxlUXVlcmllcygpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXBwZWRSZXN1bHQgPSB0aGlzLm1hcFVwZGF0ZShyZXN1bHQpO1xuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBtZXJnZVdpdGgob2JqZWN0LCBtYXBwZWRSZXN1bHQsIG1lcmdlT3ZlcnJpZGVBcnJheSk7XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSBhbiBvYmplY3QgYnV0IHdpdGhvdXQgYXV0b21hdGljYWxseSBpbmplY3RpbmcgdmFsdWVzIGNvbWluZ1xuICAgICAqIGZyb20gYGdldERlZmF1bHRGb3JTZXJ2ZXIoKWAuXG4gICAgICovXG4gICAgcHVibGljIHVwZGF0ZVBhcnRpYWxseShvYmplY3Q6IFdpdGhJZDxWdXBkYXRlWydpbnB1dCddPik6IE9ic2VydmFibGU8VHVwZGF0ZT4ge1xuICAgICAgICB0aGlzLnRocm93SWZPYnNlcnZhYmxlKG9iamVjdCk7XG4gICAgICAgIHRoaXMudGhyb3dJZk5vdFF1ZXJ5KHRoaXMudXBkYXRlTXV0YXRpb24pO1xuXG4gICAgICAgIGNvbnN0IHZhcmlhYmxlcyA9IHtcbiAgICAgICAgICAgIGlkOiBvYmplY3QuaWQsXG4gICAgICAgICAgICBpbnB1dDogb21pdChyZWxhdGlvbnNUb0lkcyhvYmplY3QpLCAnaWQnKSxcbiAgICAgICAgfSBhcyBWdXBkYXRlO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmFwb2xsb1xuICAgICAgICAgICAgLm11dGF0ZTxUdXBkYXRlLCBWdXBkYXRlPih7XG4gICAgICAgICAgICAgICAgbXV0YXRpb246IHRoaXMudXBkYXRlTXV0YXRpb24sXG4gICAgICAgICAgICAgICAgdmFyaWFibGVzOiB2YXJpYWJsZXMsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgbWFwKHJlc3VsdCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXBvbGxvLmNsaWVudC5yZUZldGNoT2JzZXJ2YWJsZVF1ZXJpZXMoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubWFwVXBkYXRlKHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlbGV0ZSBvYmplY3RzIGFuZCB0aGVuIHJlZmV0Y2ggdGhlIGxpc3Qgb2Ygb2JqZWN0c1xuICAgICAqL1xuICAgIHB1YmxpYyBkZWxldGUob2JqZWN0czoge2lkOiBzdHJpbmd9W10pOiBPYnNlcnZhYmxlPFRkZWxldGU+IHtcbiAgICAgICAgdGhpcy50aHJvd0lmT2JzZXJ2YWJsZShvYmplY3RzKTtcbiAgICAgICAgdGhpcy50aHJvd0lmTm90UXVlcnkodGhpcy5kZWxldGVNdXRhdGlvbik7XG5cbiAgICAgICAgY29uc3QgaWRzID0gb2JqZWN0cy5tYXAobyA9PiB7XG4gICAgICAgICAgICAvLyBDYW5jZWwgcGVuZGluZyB1cGRhdGVcbiAgICAgICAgICAgIGNvbnN0IGRlYm91bmNlZCA9IHRoaXMuZGVib3VuY2VkVXBkYXRlQ2FjaGUuZ2V0KG8uaWQpO1xuICAgICAgICAgICAgZGVib3VuY2VkPy5jYW5jZWxsZXIubmV4dCgpO1xuXG4gICAgICAgICAgICByZXR1cm4gby5pZDtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHZhcmlhYmxlcyA9IG1lcmdlKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGlkczogaWRzLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRoaXMuZ2V0UGFydGlhbFZhcmlhYmxlc0ZvckRlbGV0ZShvYmplY3RzKSxcbiAgICAgICAgKSBhcyBWZGVsZXRlO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmFwb2xsb1xuICAgICAgICAgICAgLm11dGF0ZTxUZGVsZXRlLCBWZGVsZXRlPih7XG4gICAgICAgICAgICAgICAgbXV0YXRpb246IHRoaXMuZGVsZXRlTXV0YXRpb24sXG4gICAgICAgICAgICAgICAgdmFyaWFibGVzOiB2YXJpYWJsZXMsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgbWFwKHJlc3VsdCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXBvbGxvLmNsaWVudC5yZUZldGNoT2JzZXJ2YWJsZVF1ZXJpZXMoKTtcblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5tYXBEZWxldGUocmVzdWx0KTtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzb2x2ZSBtb2RlbCBhbmQgaXRlbXMgcmVsYXRlZCB0byB0aGUgbW9kZWwsIGlmIHRoZSBpZCBpcyBwcm92aWRlZCwgaW4gb3JkZXIgdG8gc2hvdyBhIGZvcm1cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVzb2x2ZShpZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxSZXNvbHZlPFRvbmU+PiB7XG4gICAgICAgIC8vIExvYWQgbW9kZWwgaWYgaWQgaXMgZ2l2ZW5cbiAgICAgICAgbGV0IG9ic2VydmFibGU7XG4gICAgICAgIGlmIChpZCkge1xuICAgICAgICAgICAgb2JzZXJ2YWJsZSA9IHRoaXMuZ2V0T25lKGlkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG9ic2VydmFibGUgPSBvZih0aGlzLmdldENvbnNvbGlkYXRlZEZvckNsaWVudCgpIGFzIFRvbmUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG9ic2VydmFibGUucGlwZShcbiAgICAgICAgICAgIG1hcChyZXN1bHQgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB7bW9kZWw6IHJlc3VsdH07XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gYW4gb2JqZWN0IHRoYXQgbWF0Y2ggdGhlIEdyYXBoUUwgaW5wdXQgdHlwZS5cbiAgICAgKiBJdCBjcmVhdGVzIGFuIG9iamVjdCB3aXRoIG1hbnVhbGx5IGZpbGxlZCBkYXRhIGFuZCBhZGQgdW5jb21wbGV0ZWQgZGF0YSAobGlrZSByZXF1aXJlZCBhdHRyaWJ1dGVzIHRoYXQgY2FuIGJlIGVtcHR5IHN0cmluZ3MpXG4gICAgICovXG4gICAgcHVibGljIGdldElucHV0KG9iamVjdDogTGl0ZXJhbCk6IFZjcmVhdGVbJ2lucHV0J10gfCBWdXBkYXRlWydpbnB1dCddIHtcbiAgICAgICAgLy8gQ29udmVydCByZWxhdGlvbnMgdG8gdGhlaXIgSURzIGZvciBtdXRhdGlvblxuICAgICAgICBvYmplY3QgPSByZWxhdGlvbnNUb0lkcyhvYmplY3QpO1xuXG4gICAgICAgIC8vIFBpY2sgb25seSBhdHRyaWJ1dGVzIHRoYXQgd2UgY2FuIGZpbmQgaW4gdGhlIGVtcHR5IG9iamVjdFxuICAgICAgICAvLyBJbiBvdGhlciB3b3JkcywgcHJldmVudCB0byBzZWxlY3QgZGF0YSB0aGF0IGhhcyB1bndhbnRlZCBhdHRyaWJ1dGVzXG4gICAgICAgIGNvbnN0IGVtcHR5T2JqZWN0ID0gdGhpcy5nZXREZWZhdWx0Rm9yU2VydmVyKCk7XG4gICAgICAgIGxldCBpbnB1dCA9IHBpY2sob2JqZWN0LCBPYmplY3Qua2V5cyhlbXB0eU9iamVjdCkpO1xuXG4gICAgICAgIC8vIENvbXBsZXRlIGEgcG90ZW50aWFsbHkgdW5jb21wbGV0ZWQgb2JqZWN0IHdpdGggZGVmYXVsdCB2YWx1ZXNcbiAgICAgICAgaW5wdXQgPSBkZWZhdWx0cyhpbnB1dCwgZW1wdHlPYmplY3QpO1xuXG4gICAgICAgIHJldHVybiBpbnB1dDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBvYmplY3RzIG1hdGNoaW5nIHRoZSBxdWVyeVxuICAgICAqXG4gICAgICogVGhpcyBpcyB1c2VkIGZvciB0aGUgdW5pcXVlIHZhbGlkYXRvclxuICAgICAqL1xuICAgIHB1YmxpYyBjb3VudChxdWVyeVZhcmlhYmxlc01hbmFnZXI6IE5hdHVyYWxRdWVyeVZhcmlhYmxlc01hbmFnZXI8VmFsbD4pOiBPYnNlcnZhYmxlPG51bWJlcj4ge1xuICAgICAgICBjb25zdCBwbHVyYWwgPSBtYWtlUGx1cmFsKHRoaXMubmFtZSk7XG4gICAgICAgIGNvbnN0IHF1ZXJ5TmFtZSA9ICdDb3VudCcgKyB1cHBlckNhc2VGaXJzdExldHRlcihwbHVyYWwpO1xuICAgICAgICBjb25zdCBmaWx0ZXJUeXBlID0gdXBwZXJDYXNlRmlyc3RMZXR0ZXIodGhpcy5uYW1lKSArICdGaWx0ZXInO1xuXG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0gZ3FsYFxuICAgICAgICAgICAgcXVlcnkgJHtxdWVyeU5hbWV9ICgkZmlsdGVyOiAke2ZpbHRlclR5cGV9KSB7XG4gICAgICAgICAgICBjb3VudDogJHtwbHVyYWx9IChmaWx0ZXI6ICRmaWx0ZXIsIHBhZ2luYXRpb246IHtwYWdlU2l6ZTogMCwgcGFnZUluZGV4OiAwfSkge1xuICAgICAgICAgICAgbGVuZ3RoXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB9YDtcblxuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJ0aWFsVmFyaWFibGVzRm9yQWxsKCkucGlwZShcbiAgICAgICAgICAgIHN3aXRjaE1hcChwYXJ0aWFsVmFyaWFibGVzID0+IHtcbiAgICAgICAgICAgICAgICAvLyBDb3B5IG1hbmFnZXIgdG8gcHJldmVudCB0byBhcHBseSBpbnRlcm5hbCB2YXJpYWJsZXMgdG8gZXh0ZXJuYWwgUXVlcnlWYXJpYWJsZXNNYW5hZ2VyXG4gICAgICAgICAgICAgICAgY29uc3QgbWFuYWdlciA9IG5ldyBOYXR1cmFsUXVlcnlWYXJpYWJsZXNNYW5hZ2VyPFZhbGw+KHF1ZXJ5VmFyaWFibGVzTWFuYWdlcik7XG4gICAgICAgICAgICAgICAgbWFuYWdlci5tZXJnZSgncGFydGlhbC12YXJpYWJsZXMnLCBwYXJ0aWFsVmFyaWFibGVzKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmFwb2xsby5xdWVyeTx7Y291bnQ6IHtsZW5ndGg6IG51bWJlcn19LCBWYWxsPih7XG4gICAgICAgICAgICAgICAgICAgIHF1ZXJ5OiBxdWVyeSxcbiAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVzOiBtYW5hZ2VyLnZhcmlhYmxlcy52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgZmV0Y2hQb2xpY3k6ICduZXR3b3JrLW9ubHknLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBtYXAocmVzdWx0ID0+IHJlc3VsdC5kYXRhLmNvdW50Lmxlbmd0aCksXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJuIGVtcHR5IG9iamVjdCB3aXRoIHNvbWUgZGVmYXVsdCB2YWx1ZXMgZnJvbSBzZXJ2ZXIgcGVyc3BlY3RpdmVcbiAgICAgKlxuICAgICAqIFRoaXMgaXMgdHlwaWNhbGx5IHVzZWZ1bCB3aGVuIHNob3dpbmcgYSBmb3JtIGZvciBjcmVhdGlvblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBnZXREZWZhdWx0Rm9yU2VydmVyKCk6IFZjcmVhdGVbJ2lucHV0J10gfCBWdXBkYXRlWydpbnB1dCddIHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybiBlbXB0eSBvYmplY3Qgd2l0aCBzb21lIGRlZmF1bHQgdmFsdWVzIGZyb20gZnJvbnRlbmQgcGVyc3BlY3RpdmVcbiAgICAgKlxuICAgICAqIFdoZXJlIGVtcHR5IG9iamVjdCBtdXN0IHJlc3BlY3QgZ3JhcGhxbCBYWFhJbnB1dCB0eXBlLCBtYXkgbmVlZCBzb21lIGRlZmF1bHQgdmFsdWVzIGZvciBvdGhlciBmaWVsZHNcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZ2V0RGVmYXVsdEZvckNsaWVudCgpOiBMaXRlcmFsIHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgaXMgdXNlZCB0byBleHRyYWN0IG9ubHkgdGhlIGFycmF5IG9mIGZldGNoZWQgb2JqZWN0cyBvdXQgb2YgdGhlIGVudGlyZSBmZXRjaGVkIGRhdGFcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgbWFwQWxsKCk6IE9wZXJhdG9yRnVuY3Rpb248RmV0Y2hSZXN1bHQ8dW5rbm93bj4sIFRhbGw+IHtcbiAgICAgICAgY29uc3QgcGx1cmFsID0gbWFrZVBsdXJhbCh0aGlzLm5hbWUpO1xuICAgICAgICByZXR1cm4gbWFwKHJlc3VsdCA9PiAocmVzdWx0LmRhdGEgYXMgYW55KVtwbHVyYWxdKTsgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hcG9sbG9ncmFwaHFsL2Fwb2xsby1jbGllbnQvaXNzdWVzLzU2NjJcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGlzIHVzZWQgdG8gZXh0cmFjdCBvbmx5IHRoZSBjcmVhdGVkIG9iamVjdCBvdXQgb2YgdGhlIGVudGlyZSBmZXRjaGVkIGRhdGFcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgbWFwQ3JlYXRpb24ocmVzdWx0OiBGZXRjaFJlc3VsdCk6IFRjcmVhdGUge1xuICAgICAgICBjb25zdCBuYW1lID0gJ2NyZWF0ZScgKyB1cHBlckNhc2VGaXJzdExldHRlcih0aGlzLm5hbWUpO1xuICAgICAgICByZXR1cm4gKHJlc3VsdC5kYXRhIGFzIGFueSlbbmFtZV07IC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vYXBvbGxvZ3JhcGhxbC9hcG9sbG8tY2xpZW50L2lzc3Vlcy81NjYyXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBpcyB1c2VkIHRvIGV4dHJhY3Qgb25seSB0aGUgdXBkYXRlZCBvYmplY3Qgb3V0IG9mIHRoZSBlbnRpcmUgZmV0Y2hlZCBkYXRhXG4gICAgICovXG4gICAgcHJvdGVjdGVkIG1hcFVwZGF0ZShyZXN1bHQ6IEZldGNoUmVzdWx0KTogVHVwZGF0ZSB7XG4gICAgICAgIGNvbnN0IG5hbWUgPSAndXBkYXRlJyArIHVwcGVyQ2FzZUZpcnN0TGV0dGVyKHRoaXMubmFtZSk7XG4gICAgICAgIHJldHVybiAocmVzdWx0LmRhdGEgYXMgYW55KVtuYW1lXTsgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hcG9sbG9ncmFwaHFsL2Fwb2xsby1jbGllbnQvaXNzdWVzLzU2NjJcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGlzIHVzZWQgdG8gZXh0cmFjdCBvbmx5IGZsYWcgd2hlbiBkZWxldGluZyBhbiBvYmplY3RcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgbWFwRGVsZXRlKHJlc3VsdDogRmV0Y2hSZXN1bHQpOiBUZGVsZXRlIHtcbiAgICAgICAgY29uc3QgbmFtZSA9ICdkZWxldGUnICsgbWFrZVBsdXJhbCh1cHBlckNhc2VGaXJzdExldHRlcih0aGlzLm5hbWUpKTtcbiAgICAgICAgcmV0dXJuIChyZXN1bHQuZGF0YSBhcyBhbnkpW25hbWVdOyAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2Fwb2xsb2dyYXBocWwvYXBvbGxvLWNsaWVudC9pc3N1ZXMvNTY2MlxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYWRkaXRpb25hbCB2YXJpYWJsZXMgdG8gYmUgdXNlZCB3aGVuIGdldHRpbmcgYSBzaW5nbGUgb2JqZWN0XG4gICAgICpcbiAgICAgKiBUaGlzIGlzIHR5cGljYWxseSBhIHNpdGUgb3Igc3RhdGUgSUQsIGFuZCBpcyBuZWVkZWQgdG8gZ2V0IGFwcHJvcHJpYXRlIGFjY2VzcyByaWdodHNcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZ2V0UGFydGlhbFZhcmlhYmxlc0Zvck9uZSgpOiBPYnNlcnZhYmxlPFBhcnRpYWw8Vm9uZT4+IHtcbiAgICAgICAgcmV0dXJuIG9mKHt9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFkZGl0aW9uYWwgdmFyaWFibGVzIHRvIGJlIHVzZWQgd2hlbiBnZXR0aW5nIG11bHRpcGxlIG9iamVjdHNcbiAgICAgKlxuICAgICAqIFRoaXMgaXMgdHlwaWNhbGx5IGEgc2l0ZSBvciBzdGF0ZSBJRCwgYnV0IGl0IGNvdWxkIGJlIHNvbWV0aGluZyBlbHNlIHRvIGZ1cnRoZXIgZmlsdGVyIHRoZSBxdWVyeVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRQYXJ0aWFsVmFyaWFibGVzRm9yQWxsKCk6IE9ic2VydmFibGU8UGFydGlhbDxWYWxsPj4ge1xuICAgICAgICByZXR1cm4gb2Yoe30pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYWRkaXRpb25hbCB2YXJpYWJsZXMgdG8gYmUgdXNlZCB3aGVuIGNyZWF0aW5nIGFuIG9iamVjdFxuICAgICAqXG4gICAgICogVGhpcyBpcyB0eXBpY2FsbHkgYSBzaXRlIG9yIHN0YXRlIElEXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGdldFBhcnRpYWxWYXJpYWJsZXNGb3JDcmVhdGlvbihvYmplY3Q6IExpdGVyYWwpOiBQYXJ0aWFsPFZjcmVhdGU+IHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYWRkaXRpb25hbCB2YXJpYWJsZXMgdG8gYmUgdXNlZCB3aGVuIHVwZGF0aW5nIGFuIG9iamVjdFxuICAgICAqXG4gICAgICogVGhpcyBpcyB0eXBpY2FsbHkgYSBzaXRlIG9yIHN0YXRlIElEXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGdldFBhcnRpYWxWYXJpYWJsZXNGb3JVcGRhdGUob2JqZWN0OiBMaXRlcmFsKTogUGFydGlhbDxWdXBkYXRlPiB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gYWRkaXRpb25hbCB2YXJpYWJsZXMgdG8gYmUgdXNlZCB3aGVuIGRlbGV0aW5nIGFuIG9iamVjdFxuICAgICAqXG4gICAgICogVGhpcyBpcyB0eXBpY2FsbHkgYSBzaXRlIG9yIHN0YXRlIElEXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGdldFBhcnRpYWxWYXJpYWJsZXNGb3JEZWxldGUob2JqZWN0czogTGl0ZXJhbFtdKTogUGFydGlhbDxWZGVsZXRlPiB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaHJvdyBleGNlcHRpb24gdG8gcHJldmVudCBleGVjdXRpbmcgcXVlcmllcyB3aXRoIGludmFsaWQgdmFyaWFibGVzXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHRocm93SWZPYnNlcnZhYmxlKHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgT2JzZXJ2YWJsZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICdDYW5ub3QgdXNlIE9ic2VydmFibGUgYXMgdmFyaWFibGVzLiBJbnN0ZWFkIHlvdSBzaG91bGQgdXNlIC5zdWJzY3JpYmUoKSB0byBjYWxsIHRoZSBtZXRob2Qgd2l0aCBhIHJlYWwgdmFsdWUnLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1lcmdlIGdpdmVuIElEIHdpdGggYWRkaXRpb25hbCBwYXJ0aWFsIHZhcmlhYmxlcyBpZiB0aGVyZSBpcyBhbnlcbiAgICAgKi9cbiAgICBwcml2YXRlIGdldFZhcmlhYmxlc0Zvck9uZShpZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxWb25lPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcnRpYWxWYXJpYWJsZXNGb3JPbmUoKS5waXBlKFxuICAgICAgICAgICAgbWFwKHBhcnRpYWxWYXJpYWJsZXMgPT4gbWVyZ2Uoe30sIHtpZDogaWR9IGFzIFZvbmUsIHBhcnRpYWxWYXJpYWJsZXMpKSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaHJvdyBleGNlcHRpb24gdG8gcHJldmVudCBleGVjdXRpbmcgbnVsbCBxdWVyaWVzXG4gICAgICovXG4gICAgcHJpdmF0ZSB0aHJvd0lmTm90UXVlcnkocXVlcnk6IERvY3VtZW50Tm9kZSB8IG51bGwpOiBhc3NlcnRzIHF1ZXJ5IHtcbiAgICAgICAgaWYgKCFxdWVyeSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdHcmFwaFFMIHF1ZXJ5IGZvciB0aGlzIG1ldGhvZCB3YXMgbm90IGNvbmZpZ3VyZWQgaW4gdGhpcyBzZXJ2aWNlIGNvbnN0cnVjdG9yJyk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=
@@ -56,9 +56,9 @@ export class NaturalEnumService {
56
56
  }));
57
57
  }
58
58
  }
59
- NaturalEnumService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: NaturalEnumService, deps: [{ token: i1.Apollo }], target: i0.ɵɵFactoryTarget.Injectable });
60
- NaturalEnumService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: NaturalEnumService, providedIn: 'root' });
61
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: NaturalEnumService, decorators: [{
59
+ NaturalEnumService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.1", ngImport: i0, type: NaturalEnumService, deps: [{ token: i1.Apollo }], target: i0.ɵɵFactoryTarget.Injectable });
60
+ NaturalEnumService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.1.1", ngImport: i0, type: NaturalEnumService, providedIn: 'root' });
61
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.1", ngImport: i0, type: NaturalEnumService, decorators: [{
62
62
  type: Injectable,
63
63
  args: [{
64
64
  providedIn: 'root',
@@ -142,9 +142,9 @@ export class NaturalLinkMutationService {
142
142
  }`;
143
143
  }
144
144
  }
145
- NaturalLinkMutationService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: NaturalLinkMutationService, deps: [{ token: i1.Apollo }], target: i0.ɵɵFactoryTarget.Injectable });
146
- NaturalLinkMutationService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: NaturalLinkMutationService, providedIn: 'root' });
147
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: NaturalLinkMutationService, decorators: [{
145
+ NaturalLinkMutationService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.1", ngImport: i0, type: NaturalLinkMutationService, deps: [{ token: i1.Apollo }], target: i0.ɵɵFactoryTarget.Injectable });
146
+ NaturalLinkMutationService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.1.1", ngImport: i0, type: NaturalLinkMutationService, providedIn: 'root' });
147
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.1", ngImport: i0, type: NaturalLinkMutationService, decorators: [{
148
148
  type: Injectable,
149
149
  args: [{
150
150
  providedIn: 'root',
@@ -99,9 +99,9 @@ export class NaturalPersistenceService {
99
99
  return value == null || value === ''; // == means null or undefined;
100
100
  }
101
101
  }
102
- NaturalPersistenceService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: NaturalPersistenceService, deps: [{ token: i1.Router }, { token: SESSION_STORAGE }], target: i0.ɵɵFactoryTarget.Injectable });
103
- NaturalPersistenceService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: NaturalPersistenceService, providedIn: 'root' });
104
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: NaturalPersistenceService, decorators: [{
102
+ NaturalPersistenceService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.1", ngImport: i0, type: NaturalPersistenceService, deps: [{ token: i1.Router }, { token: SESSION_STORAGE }], target: i0.ɵɵFactoryTarget.Injectable });
103
+ NaturalPersistenceService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.1.1", ngImport: i0, type: NaturalPersistenceService, providedIn: 'root' });
104
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.1", ngImport: i0, type: NaturalPersistenceService, decorators: [{
105
105
  type: Injectable,
106
106
  args: [{
107
107
  providedIn: 'root',
@@ -44,9 +44,9 @@ export class NaturalSwissParsingDateAdapter extends NativeDateAdapter {
44
44
  return 1;
45
45
  }
46
46
  }
47
- NaturalSwissParsingDateAdapter.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: NaturalSwissParsingDateAdapter, deps: null, target: i0.ɵɵFactoryTarget.Injectable });
48
- NaturalSwissParsingDateAdapter.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: NaturalSwissParsingDateAdapter, providedIn: 'root' });
49
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: NaturalSwissParsingDateAdapter, decorators: [{
47
+ NaturalSwissParsingDateAdapter.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.1", ngImport: i0, type: NaturalSwissParsingDateAdapter, deps: null, target: i0.ɵɵFactoryTarget.Injectable });
48
+ NaturalSwissParsingDateAdapter.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.1.1", ngImport: i0, type: NaturalSwissParsingDateAdapter, providedIn: 'root' });
49
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.1", ngImport: i0, type: NaturalSwissParsingDateAdapter, decorators: [{
50
50
  type: Injectable,
51
51
  args: [{
52
52
  providedIn: 'root',