@netgrif/components-core 6.2.3 → 6.3.0-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (123) hide show
  1. package/esm2020/assets/i18n/de.json +17 -0
  2. package/esm2020/assets/i18n/en.json +17 -0
  3. package/esm2020/assets/i18n/sk.json +17 -0
  4. package/esm2020/lib/authentication/models/user.transformer.mjs +2 -2
  5. package/esm2020/lib/authentication/public-api.mjs +3 -1
  6. package/esm2020/lib/authorization/permission/permission.service.mjs +2 -2
  7. package/esm2020/lib/dashboard/cards/model/custom-dashboard-model/custom-card.mjs +1 -1
  8. package/esm2020/lib/dashboard/cards/model/custom-dashboard-model/custom-iframe-card.mjs +2 -0
  9. package/esm2020/lib/dashboard/cards/model/dashboard-card-types.mjs +2 -1
  10. package/esm2020/lib/dashboard/cards/model/dashboard-card.mjs +1 -1
  11. package/esm2020/lib/data-fields/filter-field/abstract-filter-field-tab-view-content.component.mjs +60 -0
  12. package/esm2020/lib/data-fields/filter-field/abstract-filter-field-tab-view.component.mjs +53 -0
  13. package/esm2020/lib/data-fields/filter-field/abstract-filter-field.component.mjs +4 -1
  14. package/esm2020/lib/data-fields/public-api.mjs +17 -1
  15. package/esm2020/lib/data-fields/task-ref-field/abstract-task-ref-field.component.mjs +133 -0
  16. package/esm2020/lib/data-fields/task-ref-field/model/task-ref-components.mjs +8 -0
  17. package/esm2020/lib/data-fields/task-ref-field/model/task-ref-dashboard-constants.mjs +10 -0
  18. package/esm2020/lib/data-fields/task-ref-field/model/task-ref-dashboard-tile-constants.mjs +13 -0
  19. package/esm2020/lib/data-fields/task-ref-field/model/task-ref-dashboard-tile.mjs +2 -0
  20. package/esm2020/lib/data-fields/task-ref-field/model/task-ref-field.mjs +19 -1
  21. package/esm2020/lib/data-fields/task-ref-field/task-ref-dashboard-field/task-ref-dashboard-tile/abstract-task-ref-dashboard-tile.component.mjs +140 -0
  22. package/esm2020/lib/data-fields/text-field/abstract-dashboard-text-field.component.mjs +42 -0
  23. package/esm2020/lib/data-fields/text-field/dashboard-bar-chart-text-field/abstract-dashboard-bar-chart-text-field.component.mjs +33 -0
  24. package/esm2020/lib/data-fields/text-field/dashboard-iframe-text-field/abstract-dashboard-iframe-text-field.component.mjs +27 -0
  25. package/esm2020/lib/data-fields/text-field/dashboard-line-chart-text-field/abstract-dashboard-line-chart-text-field.component.mjs +33 -0
  26. package/esm2020/lib/data-fields/text-field/dashboard-pie-chart-text-field/abstract-dashboard-pie-chart-text-field.component.mjs +31 -0
  27. package/esm2020/lib/data-fields/text-field/dashboard-portal-text-field/abstract-dashboard-portal-text-field.component.mjs +27 -0
  28. package/esm2020/lib/data-fields/text-field/dashboard-portal-text-field/dashboard-portal-component-registry.service.mjs +35 -0
  29. package/esm2020/lib/data-fields/text-field/dashboard-portal-text-field/dashboard-view-constants.mjs +10 -0
  30. package/esm2020/lib/data-fields/text-field/models/text-field.mjs +23 -1
  31. package/esm2020/lib/filter/filter.repository.mjs +7 -1
  32. package/esm2020/lib/filter/user-filters.service.mjs +3 -1
  33. package/esm2020/lib/impersonation/models/user-impersonate-config-metadata.mjs +2 -0
  34. package/esm2020/lib/impersonation/models/user-impersonation-constants.mjs +11 -0
  35. package/esm2020/lib/impersonation/public-api.mjs +9 -0
  36. package/esm2020/lib/impersonation/services/impersonation-user-list.service.mjs +19 -0
  37. package/esm2020/lib/impersonation/services/impersonation-user-resource.service.mjs +25 -0
  38. package/esm2020/lib/impersonation/services/impersonation-user-select.service.mjs +85 -0
  39. package/esm2020/lib/impersonation/services/impersonation.service.mjs +90 -0
  40. package/esm2020/lib/navigation/navigation-double-drawer/abstract-navigation-double-drawer.mjs +19 -6
  41. package/esm2020/lib/navigation/navigation-drawer/abstract-navigation-drawer.component.mjs +2 -2
  42. package/esm2020/lib/navigation/quick-panel/components/abstract-quick-panel.component.mjs +1 -1
  43. package/esm2020/lib/panel/task-panel/abstract-task-panel.component.mjs +25 -8
  44. package/esm2020/lib/resources/engine-endpoint/public/public-task-resource.service.mjs +3 -3
  45. package/esm2020/lib/resources/interface/data-groups.mjs +1 -1
  46. package/esm2020/lib/resources/interface/user-resource.mjs +1 -1
  47. package/esm2020/lib/side-menu/content-components/injection-tokens.mjs +3 -1
  48. package/esm2020/lib/side-menu/content-components/public-api.mjs +3 -1
  49. package/esm2020/lib/side-menu/content-components/user-impersonate/abstract-user-impersonate.component.mjs +37 -0
  50. package/esm2020/lib/side-menu/content-components/user-impersonate/model/user-impersonate-injection-data.mjs +2 -0
  51. package/esm2020/lib/side-menu/models/side-menu-size.mjs +2 -1
  52. package/esm2020/lib/task-content/model/preprocessed-data-groups.mjs +2 -0
  53. package/esm2020/lib/task-content/task-content/abstract-task-content.component.mjs +149 -4
  54. package/esm2020/lib/user/models/user.mjs +15 -2
  55. package/esm2020/lib/user/services/user-comparator.service.mjs +4 -3
  56. package/esm2020/lib/user/services/user.service.mjs +17 -12
  57. package/esm2020/lib/utility/public-api.mjs +2 -1
  58. package/esm2020/lib/utility/tests/mocks/mock-user.service.mjs +38 -0
  59. package/esm2020/lib/utility/tests/test-config.mjs +6 -1
  60. package/esm2020/lib/view/public-api.mjs +2 -1
  61. package/esm2020/lib/view/task-view/models/injection-token-task-force-open.mjs +3 -0
  62. package/esm2020/public-api.mjs +2 -1
  63. package/fesm2015/netgrif-components-core.mjs +4363 -3202
  64. package/fesm2015/netgrif-components-core.mjs.map +1 -1
  65. package/fesm2020/netgrif-components-core.mjs +4353 -3206
  66. package/fesm2020/netgrif-components-core.mjs.map +1 -1
  67. package/lib/authentication/public-api.d.ts +2 -0
  68. package/lib/dashboard/cards/model/custom-dashboard-model/custom-card.d.ts +8 -7
  69. package/lib/dashboard/cards/model/custom-dashboard-model/custom-iframe-card.d.ts +4 -0
  70. package/lib/dashboard/cards/model/dashboard-card-types.d.ts +1 -0
  71. package/lib/dashboard/cards/model/dashboard-card.d.ts +1 -1
  72. package/lib/data-fields/filter-field/abstract-filter-field-tab-view-content.component.d.ts +17 -0
  73. package/lib/data-fields/filter-field/abstract-filter-field-tab-view.component.d.ts +17 -0
  74. package/lib/data-fields/filter-field/abstract-filter-field.component.d.ts +1 -0
  75. package/lib/data-fields/public-api.d.ts +16 -0
  76. package/lib/data-fields/task-ref-field/abstract-task-ref-field.component.d.ts +20 -0
  77. package/lib/data-fields/task-ref-field/model/task-ref-components.d.ts +6 -0
  78. package/lib/data-fields/task-ref-field/model/task-ref-dashboard-constants.d.ts +8 -0
  79. package/lib/data-fields/task-ref-field/model/task-ref-dashboard-tile-constants.d.ts +11 -0
  80. package/lib/data-fields/task-ref-field/model/task-ref-dashboard-tile.d.ts +9 -0
  81. package/lib/data-fields/task-ref-field/model/task-ref-field.d.ts +10 -0
  82. package/lib/data-fields/task-ref-field/task-ref-dashboard-field/task-ref-dashboard-tile/abstract-task-ref-dashboard-tile.component.d.ts +36 -0
  83. package/lib/data-fields/text-field/abstract-dashboard-text-field.component.d.ts +23 -0
  84. package/lib/data-fields/text-field/dashboard-bar-chart-text-field/abstract-dashboard-bar-chart-text-field.component.d.ts +10 -0
  85. package/lib/data-fields/text-field/dashboard-iframe-text-field/abstract-dashboard-iframe-text-field.component.d.ts +11 -0
  86. package/lib/data-fields/text-field/dashboard-line-chart-text-field/abstract-dashboard-line-chart-text-field.component.d.ts +10 -0
  87. package/lib/data-fields/text-field/dashboard-pie-chart-text-field/abstract-dashboard-pie-chart-text-field.component.d.ts +10 -0
  88. package/lib/data-fields/text-field/dashboard-portal-text-field/abstract-dashboard-portal-text-field.component.d.ts +10 -0
  89. package/lib/data-fields/text-field/dashboard-portal-text-field/dashboard-portal-component-registry.service.d.ts +14 -0
  90. package/lib/data-fields/text-field/dashboard-portal-text-field/dashboard-view-constants.d.ts +8 -0
  91. package/lib/data-fields/text-field/models/text-field.d.ts +20 -0
  92. package/lib/filter/filter.repository.d.ts +4 -0
  93. package/lib/impersonation/models/user-impersonate-config-metadata.d.ts +3 -0
  94. package/lib/impersonation/models/user-impersonation-constants.d.ts +9 -0
  95. package/lib/impersonation/public-api.d.ts +6 -0
  96. package/lib/impersonation/services/impersonation-user-list.service.d.ts +12 -0
  97. package/lib/impersonation/services/impersonation-user-resource.service.d.ts +17 -0
  98. package/lib/impersonation/services/impersonation-user-select.service.d.ts +25 -0
  99. package/lib/impersonation/services/impersonation.service.d.ts +37 -0
  100. package/lib/navigation/navigation-double-drawer/abstract-navigation-double-drawer.d.ts +9 -2
  101. package/lib/navigation/quick-panel/components/abstract-quick-panel.component.d.ts +1 -1
  102. package/lib/panel/task-panel/abstract-task-panel.component.d.ts +8 -3
  103. package/lib/resources/engine-endpoint/public/public-task-resource.service.d.ts +2 -1
  104. package/lib/resources/interface/data-groups.d.ts +10 -5
  105. package/lib/resources/interface/user-resource.d.ts +1 -0
  106. package/lib/side-menu/content-components/injection-tokens.d.ts +2 -0
  107. package/lib/side-menu/content-components/public-api.d.ts +2 -0
  108. package/lib/side-menu/content-components/user-impersonate/abstract-user-impersonate.component.d.ts +14 -0
  109. package/lib/side-menu/content-components/user-impersonate/model/user-impersonate-injection-data.d.ts +8 -0
  110. package/lib/side-menu/models/side-menu-size.d.ts +2 -1
  111. package/lib/task-content/model/preprocessed-data-groups.d.ts +5 -0
  112. package/lib/task-content/task-content/abstract-task-content.component.d.ts +42 -1
  113. package/lib/user/models/user.d.ts +10 -1
  114. package/lib/user/services/user-comparator.service.d.ts +1 -1
  115. package/lib/utility/public-api.d.ts +1 -0
  116. package/lib/utility/tests/mocks/mock-user.service.d.ts +16 -0
  117. package/lib/view/public-api.d.ts +1 -0
  118. package/lib/view/task-view/models/injection-token-task-force-open.d.ts +2 -0
  119. package/package.json +1 -1
  120. package/public-api.d.ts +1 -0
  121. package/src/assets/i18n/de.json +17 -0
  122. package/src/assets/i18n/en.json +17 -0
  123. package/src/assets/i18n/sk.json +17 -0
@@ -8,7 +8,9 @@ import { LoadingEmitter } from '../../utility/loading-emitter';
8
8
  import { BehaviorSubject } from 'rxjs';
9
9
  import { map } from 'rxjs/operators';
10
10
  import { NAE_ASYNC_RENDERING_CONFIGURATION } from '../model/async-rendering-configuration-injection-token';
11
+ import { TaskRefDashboardConstants } from '../../data-fields/task-ref-field/model/task-ref-dashboard-constants';
11
12
  import { TaskRefField } from '../../data-fields/task-ref-field/model/task-ref-field';
13
+ import { TaskRefComponents } from '../../data-fields/task-ref-field/model/task-ref-components';
12
14
  import { Subgrid } from '../model/subgrid';
13
15
  import { IncrementingCounter } from '../../utility/incrementing-counter';
14
16
  import * as i0 from "@angular/core";
@@ -249,11 +251,29 @@ export class AbstractTaskContentComponent {
249
251
  /**
250
252
  * Clones the content of the data groups to prevent unintentional memory accesses to source data.
251
253
  * Rearranges the data groups to accommodate taskrefs. Filters out hidden and forbidden fields.
254
+ * Populates dashboard task ref fields with dashboard tile data.
252
255
  * @param dataGroups
253
- * @returns the preprocesses data groups
256
+ * @returns the preprocessed data groups
254
257
  */
255
258
  preprocessDataGroups(dataGroups) {
256
- dataGroups = this.cloneAndFilterHidden(dataGroups);
259
+ const rearrangeResult = this.rearrangeDataGroups(dataGroups);
260
+ let unfilteredDataGroups = rearrangeResult.dataGroups;
261
+ if (rearrangeResult.containsDashboardTaskRef) {
262
+ unfilteredDataGroups = this.preprocessDashboardTaskRef(rearrangeResult.dataGroups, dataGroups);
263
+ }
264
+ return this.cloneAndFilterHidden(unfilteredDataGroups);
265
+ }
266
+ /**
267
+ * Clones the content of the data groups to prevent unintentional memory accesses to source data.
268
+ * Rearranges the data groups to accommodate taskrefs.
269
+ * Determines if the data groups contain a dashboard task ref field.
270
+ * @param dataGroups
271
+ * @returns the preprocessed data groups with metadata
272
+ */
273
+ rearrangeDataGroups(dataGroups) {
274
+ dataGroups = this.cloneDataGroups(dataGroups);
275
+ this.initializeLocalFieldLayout(dataGroups);
276
+ let containsDashboard = false;
257
277
  const result = [];
258
278
  for (let i = 0; i < dataGroups.length; i++) {
259
279
  const group = dataGroups[i];
@@ -265,6 +285,10 @@ export class AbstractTaskContentComponent {
265
285
  if (split.startGroup !== undefined) {
266
286
  result.push(split.startGroup);
267
287
  }
288
+ if (split.taskRef.component?.name === TaskRefComponents.DASHBOARD) {
289
+ result.push(this.createDashboardTaskRefDataGroup(group, split.taskRef));
290
+ containsDashboard = true;
291
+ }
268
292
  if (split.taskRef.value.length === 0 || split.endGroup === undefined) {
269
293
  if (split.endGroup !== undefined) {
270
294
  dataGroups.splice(i + 1, 0, split.endGroup);
@@ -287,7 +311,38 @@ export class AbstractTaskContentComponent {
287
311
  }
288
312
  dataGroups.splice(firstNonDescendantIndex, 0, split.endGroup);
289
313
  }
290
- return result;
314
+ return {
315
+ dataGroups: result,
316
+ containsDashboardTaskRef: containsDashboard
317
+ };
318
+ }
319
+ /**
320
+ * Creates a duplicate of the provided data group array.
321
+ *
322
+ * Only the data groups are cloned, the fields are only copied as references.
323
+ * @param dataGroups the data groups that should be cloned
324
+ * @returns the duplicated data groups
325
+ */
326
+ cloneDataGroups(dataGroups) {
327
+ return dataGroups.map(group => {
328
+ const g = { ...group };
329
+ g.fields = g.fields.map(field => field);
330
+ return g;
331
+ });
332
+ }
333
+ /**
334
+ * Passes over all the fields in the provided data groups and if they are visible, initializes their local layout attribute.
335
+ * @param dataGroups the containers of the fields that should have their local layout initialized
336
+ */
337
+ initializeLocalFieldLayout(dataGroups) {
338
+ for (const g of dataGroups) {
339
+ for (const f of g.fields) {
340
+ if (f.behavior.hidden || f.behavior.forbidden) {
341
+ continue;
342
+ }
343
+ f.resetLocalLayout();
344
+ }
345
+ }
291
346
  }
292
347
  /**
293
348
  * Creates a duplicate of the provided data group array and filters away any fields and data groups that are marked as hidden.
@@ -345,6 +400,96 @@ export class AbstractTaskContentComponent {
345
400
  }
346
401
  return result;
347
402
  }
403
+ /**
404
+ * Creates a new data group that contains only the passed task ref.
405
+ * The information about nesting and parent task/case are preserved from the passed original data group.
406
+ * @param originalDataGroup source of the information about parent task/case
407
+ * @param taskRef the task ref that will be added to the new data group
408
+ * @protected
409
+ */
410
+ createDashboardTaskRefDataGroup(originalDataGroup, taskRef) {
411
+ return {
412
+ fields: [taskRef],
413
+ alignment: undefined,
414
+ stretch: false,
415
+ title: undefined,
416
+ parentTaskId: originalDataGroup.parentTaskId,
417
+ parentTransitionId: originalDataGroup.parentTransitionId,
418
+ parentCaseId: originalDataGroup.parentCaseId,
419
+ parentTaskRefId: originalDataGroup.parentTaskRefId,
420
+ nestingLevel: originalDataGroup.nestingLevel,
421
+ layout: originalDataGroup.layout
422
+ };
423
+ }
424
+ /**
425
+ * Identifies data groups that represent dashboard tiles,
426
+ * removes them from the data group array and passes them onto the task ref field instance.
427
+ * @param preprocessedDataGroups
428
+ * @param rawDataGroups
429
+ * @returns an array of data group objects that does not contain dashboard tiles referenced by the dashboard task ref
430
+ * @protected
431
+ */
432
+ preprocessDashboardTaskRef(preprocessedDataGroups, rawDataGroups) {
433
+ // TODO support more than one dashboard task ref in a task
434
+ let dashboardTaskRefField;
435
+ let dashboardParentInformation;
436
+ for (const dg of preprocessedDataGroups) {
437
+ for (const field of dg.fields) {
438
+ if (this.isTaskRef(field) && field.component?.name === TaskRefComponents.DASHBOARD) {
439
+ dashboardTaskRefField = field;
440
+ dashboardParentInformation = {
441
+ parentTaskId: dg.parentTaskId,
442
+ parentTransitionId: dg.parentTransitionId,
443
+ parentCaseId: dg.parentCaseId,
444
+ parentTaskRefId: dg.parentTaskRefId,
445
+ nestingLevel: dg.nestingLevel
446
+ };
447
+ break;
448
+ }
449
+ }
450
+ if (dashboardTaskRefField !== undefined) {
451
+ break;
452
+ }
453
+ }
454
+ if (dashboardTaskRefField === undefined) {
455
+ this._logger.error('preprocessDashboardTaskRef method was called on task content without dashboard task refs!');
456
+ return preprocessedDataGroups;
457
+ }
458
+ const tiles = new Map();
459
+ // TODO resolve transitive tile content
460
+ const nonDashboardDataGroups = [];
461
+ for (const dg of preprocessedDataGroups) {
462
+ if (dg.parentTaskRefId !== dashboardTaskRefField.stringId) {
463
+ nonDashboardDataGroups.push(dg);
464
+ continue;
465
+ }
466
+ if (tiles.has(dg.parentTaskId)) {
467
+ const tile = tiles.get(dg.parentTaskId);
468
+ tile.dataGroups.push(dg);
469
+ }
470
+ else {
471
+ tiles.set(dg.parentTaskId, { dataGroups: [dg] });
472
+ }
473
+ }
474
+ for (const rdg of rawDataGroups) {
475
+ if (rdg.parentTaskId === dashboardParentInformation.parentTaskId
476
+ && rdg.parentTransitionId === dashboardParentInformation.parentTransitionId
477
+ && rdg.parentCaseId === dashboardParentInformation.parentCaseId
478
+ && rdg.parentTaskRefId === dashboardParentInformation.parentTaskRefId
479
+ && rdg.nestingLevel === dashboardParentInformation.nestingLevel) {
480
+ for (const filed of rdg.fields) {
481
+ if (filed.stringId === TaskRefDashboardConstants.DASHBOARD_COLS) {
482
+ dashboardTaskRefField.dashboardCols = filed.value;
483
+ }
484
+ else if (filed.stringId === TaskRefDashboardConstants.DASHBOARD_ROWS) {
485
+ dashboardTaskRefField.dashboardRows = filed.value;
486
+ }
487
+ }
488
+ }
489
+ }
490
+ dashboardTaskRefField.dashboardTiles = Array.from(tiles.values());
491
+ return nonDashboardDataGroups;
492
+ }
348
493
  /**
349
494
  * Computes the layout data for a single data group with grid layout. The resulting layout is saved into the input objects.
350
495
  * @param dataGroup the data group that should be laid out into a grid
@@ -660,4 +805,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImpo
660
805
  }], taskEvent: [{
661
806
  type: Output
662
807
  }] } });
663
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3QtdGFzay1jb250ZW50LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25ldGdyaWYtY29tcG9uZW50cy1jb3JlL3NyYy9saWIvdGFzay1jb250ZW50L3Rhc2stY29udGVudC9hYnN0cmFjdC10YXNrLWNvbnRlbnQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQWEsUUFBUSxFQUFFLE1BQU0sRUFBQyxNQUFNLGVBQWUsQ0FBQztBQVFsRyxPQUFPLEVBQVksa0JBQWtCLEVBQUMsTUFBTSx1Q0FBdUMsQ0FBQztBQUNwRixPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0NBQW9DLENBQUM7QUFFbkUsT0FBTyxFQUFDLGdCQUFnQixFQUFFLHNCQUFzQixFQUFtQixtQkFBbUIsRUFBQyxNQUFNLDZDQUE2QyxDQUFDO0FBQzNJLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSwyQ0FBMkMsQ0FBQztBQUN6RSxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSw4QkFBOEIsQ0FBQztBQUMvRCxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sK0JBQStCLENBQUM7QUFDN0QsT0FBTyxFQUFDLGVBQWUsRUFBMkIsTUFBTSxNQUFNLENBQUM7QUFDL0QsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ25DLE9BQU8sRUFBQyxpQ0FBaUMsRUFBQyxNQUFNLHdEQUF3RCxDQUFDO0FBRXpHLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSx1REFBdUQsQ0FBQztBQUVuRixPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDekMsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sb0NBQW9DLENBQUM7Ozs7Ozs7QUFNdkUsTUFBTSxPQUFnQiw0QkFBNEI7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RSxDQUFDO1lBQzlGLEtBQUssZUFBZSxDQUFDLE1BQU07Z0JBQ3ZCLE9BQU8sT0FBTyxDQUFDLFVBQVUsR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLG9CQUFvQixDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2hHLEtBQUssZUFBZSxDQUFDLGdCQUFnQjtnQkFDakMsT0FBTyxPQUFPLENBQUMsS0FBSyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsb0JBQW9CLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDekY7Z0JBQ0ksT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLG9CQUFvQixDQUFDLFFBQVEsRUFBRSxDQUFDO1NBQ3BHO0lBQ0wsQ0FBQzs7MEhBcHVCaUIsNEJBQTRCLHNNQTRFSixpQ0FBaUM7OEdBNUV6RCw0QkFBNEIsOE1BRnBDLEVBQUU7NEZBRU0sNEJBQTRCO2tCQUpqRCxTQUFTO21CQUFDO29CQUNQLFFBQVEsRUFBRSwyQkFBMkI7b0JBQ3JDLFFBQVEsRUFBRSxFQUFFO2lCQUNmOzswQkE0RTBCLFFBQVE7OzBCQUNSLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsaUNBQWlDOzRDQTVDbEUsVUFBVTtzQkFBbEIsS0FBSztnQkFNRyxVQUFVO3NCQUFsQixLQUFLO2dCQU1HLGlCQUFpQjtzQkFBekIsS0FBSztnQkFJSSxTQUFTO3NCQUFsQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5qZWN0LCBJbnB1dCwgT25EZXN0cm95LCBPcHRpb25hbCwgT3V0cHV0fSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7RGF0YWZpZWxkR3JpZExheW91dEVsZW1lbnR9IGZyb20gJy4uL21vZGVsL2RhdGFmaWVsZC1ncmlkLWxheW91dC1lbGVtZW50JztcbmltcG9ydCB7RmllbGRDb252ZXJ0ZXJTZXJ2aWNlfSBmcm9tICcuLi9zZXJ2aWNlcy9maWVsZC1jb252ZXJ0ZXIuc2VydmljZSc7XG5pbXBvcnQge1Rhc2tDb250ZW50U2VydmljZX0gZnJvbSAnLi4vc2VydmljZXMvdGFzay1jb250ZW50LnNlcnZpY2UnO1xuaW1wb3J0IHtQYXBlclZpZXdTZXJ2aWNlfSBmcm9tICcuLi8uLi9uYXZpZ2F0aW9uL3F1aWNrLXBhbmVsL2NvbXBvbmVudHMvcGFwZXItdmlldy5zZXJ2aWNlJztcbmltcG9ydCB7TG9nZ2VyU2VydmljZX0gZnJvbSAnLi4vLi4vbG9nZ2VyL3NlcnZpY2VzL2xvZ2dlci5zZXJ2aWNlJztcbmltcG9ydCB7VGFza0V2ZW50Tm90aWZpY2F0aW9ufSBmcm9tICcuLi9tb2RlbC90YXNrLWV2ZW50LW5vdGlmaWNhdGlvbic7XG5pbXBvcnQge1Rhc2tFdmVudFNlcnZpY2V9IGZyb20gJy4uL3NlcnZpY2VzL3Rhc2stZXZlbnQuc2VydmljZSc7XG5pbXBvcnQge0RhdGFHcm91cCwgRGF0YUdyb3VwQWxpZ25tZW50fSBmcm9tICcuLi8uLi9yZXNvdXJjZXMvaW50ZXJmYWNlL2RhdGEtZ3JvdXBzJztcbmltcG9ydCB7VGFza0VsZW1lbnRUeXBlfSBmcm9tICcuLi9tb2RlbC90YXNrLWNvbnRlbnQtZWxlbWVudC10eXBlJztcbmltcG9ydCB7RGF0YUZpZWxkfSBmcm9tICcuLi8uLi9kYXRhLWZpZWxkcy9tb2RlbHMvYWJzdHJhY3QtZGF0YS1maWVsZCc7XG5pbXBvcnQge0RhdGFHcm91cENvbXBhY3QsIERhdGFHcm91cEhpZGVFbXB0eVJvd3MsIERhdGFHcm91cExheW91dCwgRGF0YUdyb3VwTGF5b3V0VHlwZX0gZnJvbSAnLi4vLi4vcmVzb3VyY2VzL2ludGVyZmFjZS9kYXRhLWdyb3VwLWxheW91dCc7XG5pbXBvcnQge0ZpZWxkQWxpZ25tZW50fSBmcm9tICcuLi8uLi9yZXNvdXJjZXMvaW50ZXJmYWNlL2ZpZWxkLWFsaWdubWVudCc7XG5pbXBvcnQge0ZpZWxkVHlwZVJlc291cmNlfSBmcm9tICcuLi9tb2RlbC9maWVsZC10eXBlLXJlc291cmNlJztcbmltcG9ydCB7TG9hZGluZ0VtaXR0ZXJ9IGZyb20gJy4uLy4uL3V0aWxpdHkvbG9hZGluZy1lbWl0dGVyJztcbmltcG9ydCB7QmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlLCBTdWJzY3JpcHRpb259IGZyb20gJ3J4anMnO1xuaW1wb3J0IHttYXB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7TkFFX0FTWU5DX1JFTkRFUklOR19DT05GSUdVUkFUSU9OfSBmcm9tICcuLi9tb2RlbC9hc3luYy1yZW5kZXJpbmctY29uZmlndXJhdGlvbi1pbmplY3Rpb24tdG9rZW4nO1xuaW1wb3J0IHtBc3luY1JlbmRlcmluZ0NvbmZpZ3VyYXRpb259IGZyb20gJy4uL21vZGVsL2FzeW5jLXJlbmRlcmluZy1jb25maWd1cmF0aW9uJztcbmltcG9ydCB7VGFza1JlZkZpZWxkfSBmcm9tICcuLi8uLi9kYXRhLWZpZWxkcy90YXNrLXJlZi1maWVsZC9tb2RlbC90YXNrLXJlZi1maWVsZCc7XG5pbXBvcnQge1NwbGl0RGF0YUdyb3VwfSBmcm9tICcuLi9tb2RlbC9zcGxpdC1kYXRhLWdyb3VwJztcbmltcG9ydCB7U3ViZ3JpZH0gZnJvbSAnLi4vbW9kZWwvc3ViZ3JpZCc7XG5pbXBvcnQge0luY3JlbWVudGluZ0NvdW50ZXJ9IGZyb20gJy4uLy4uL3V0aWxpdHkvaW5jcmVtZW50aW5nLWNvdW50ZXInO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ25jYy1hYnN0cmFjdC10YXNrLWNvbnRlbnQnLFxuICAgIHRlbXBsYXRlOiAnJ1xufSlcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFRhc2tDb250ZW50Q29tcG9uZW50IGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgICByZWFkb25seSBERUZBVUxUX0xBWU9VVF9UWVBFID0gRGF0YUdyb3VwTGF5b3V0VHlwZS5MRUdBQ1k7XG4gICAgcmVhZG9ubHkgREVGQVVMVF9GSUVMRF9BTElHTk1FTlQgPSBGaWVsZEFsaWdubWVudC5DRU5URVI7XG4gICAgcmVhZG9ubHkgREVGQVVMVF9BU1lOQ19SRU5ERVJJTkdfQ09ORklHVVJBVElPTjogQXN5bmNSZW5kZXJpbmdDb25maWd1cmF0aW9uID0ge1xuICAgICAgICBiYXRjaFNpemU6IDQsXG4gICAgICAgIGJhdGNoRGVsYXk6IDIwMCxcbiAgICAgICAgbnVtYmVyT2ZQbGFjZWhvbGRlcnM6IDQsXG4gICAgICAgIGVuYWJsZUFzeW5jUmVuZGVyaW5nRm9yTmV3RmllbGRzOiB0cnVlLFxuICAgICAgICBlbmFibGVBc3luY1JlbmRlcmluZ09uVGFza0V4cGFuZDogdHJ1ZVxuICAgIH07XG4gICAgcmVhZG9ubHkgREVGQVVMVF9DT01QQUNUX0RJUkVDVElPTiA9IERhdGFHcm91cENvbXBhY3QuTk9ORTtcbiAgICByZWFkb25seSBERUZBVUxUX0hJREVfRU1QVFlfUk9XUyA9IERhdGFHcm91cEhpZGVFbXB0eVJvd3MuQUxMO1xuXG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgZGF0YSBpcyBiZWluZyBsb2FkZWQgZnJvbSBiYWNrZW5kLCBvciBpZiBpdCBpcyBiZWluZyBwcm9jZXNzZWQuXG4gICAgICovXG4gICAgbG9hZGluZyQ6IExvYWRpbmdFbWl0dGVyO1xuICAgIC8qKlxuICAgICAqIEVtaXRzIGB0cnVlYCBpZiB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgZGF0YSBmaWVsZCwgdGhhdCBzaG91bGQgYmUgZGlzcGxheWVkLiBFbWl0cyBgZmFsc2VgIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICBoYXNEYXRhVG9EaXNwbGF5JDogT2JzZXJ2YWJsZTxib29sZWFuPjtcblxuICAgIC8qKlxuICAgICAqIEV4aXN0cyB0byBhbGxvdyByZWZlcmVuY2VzIHRvIHRoZSBlbnVtIGluIHRoZSBIVE1MXG4gICAgICovXG4gICAgcHVibGljIGZpZWxkVHlwZVJlc291cmNlID0gRmllbGRUeXBlUmVzb3VyY2U7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgdHJhbnNsYXRlIHRleHQgdGhhdCBzaG91bGQgYmUgZGlzcGxheWVkIHdoZW4gdGhlIHRhc2sgY29udGFpbnMgbm8gZGF0YS5cbiAgICAgKlxuICAgICAqIElmIGEgZmFsc3kgdmFsdWUgaXMgcHJvdmlkZWQgdGhlIGRlZmF1bHQgdGV4dCBpcyBkaXNwbGF5ZWRcbiAgICAgKi9cbiAgICBASW5wdXQoKSBub0RhdGFUZXh0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGljb24gdGhhdCBzaG91bGQgYmUgZGlzcGxheWVkIHdoZW4gdGhlIHRhc2sgY29udGFpbnMgbm8gZGF0YS5cbiAgICAgKlxuICAgICAqIElmIGEgZmFsc3kgdmFsdWUgaXMgcHJvdmlkZWQgdGhlIGRlZmF1bHQgaWNvbiBpcyBkaXNwbGF5ZWRcbiAgICAgKi9cbiAgICBASW5wdXQoKSBub0RhdGFJY29uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogV2hldGhlciBhbiBpY29uIHNob3VsZCBiZSBkaXNwbGF5ZWQgd2hlbiB0aGUgbm8gZGF0YSBtZXNzYWdlIGlzIHNob3duLlxuICAgICAqXG4gICAgICogQW4gaWNvbiBpcyBkaXNwbGF5ZWQgYnkgZGVmYXVsdFxuICAgICAqL1xuICAgIEBJbnB1dCgpIGRpc3BsYXlOb0RhdGFJY29uID0gdHJ1ZTtcbiAgICAvKipcbiAgICAgKiBFbWl0cyBub3RpZmljYXRpb25zIGFib3V0IHRhc2sgZXZlbnRzXG4gICAgICovXG4gICAgQE91dHB1dCgpIHRhc2tFdmVudDogRXZlbnRFbWl0dGVyPFRhc2tFdmVudE5vdGlmaWNhdGlvbj47XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGEgZmllbGRzIHRoYXQgYXJlIGN1cnJlbnRseSBkaXNwbGF5ZWRcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX2RhdGFTb3VyY2UkOiBCZWhhdmlvclN1YmplY3Q8QXJyYXk8U3ViZ3JpZD4+O1xuICAgIHByb3RlY3RlZCBfc3ViVGFza0NvbnRlbnQ6IFN1YnNjcmlwdGlvbjtcbiAgICBwcm90ZWN0ZWQgX3N1YlRhc2tFdmVudDogU3Vic2NyaXB0aW9uO1xuICAgIHByb3RlY3RlZCBfYXN5bmNSZW5kZXJpbmdDb25maWc6IEFzeW5jUmVuZGVyaW5nQ29uZmlndXJhdGlvbjtcbiAgICBwcm90ZWN0ZWQgX2FzeW5jUmVuZGVyVGltZW91dDogbnVtYmVyO1xuXG4gICAgcHJvdGVjdGVkIF9kZWZhdWx0QWxpZ25tZW50OiBGaWVsZEFsaWdubWVudDtcbiAgICBwcm90ZWN0ZWQgX2RlZmF1bHRDb21wYWN0RGlyZWN0aW9uOiBEYXRhR3JvdXBDb21wYWN0O1xuICAgIHByb3RlY3RlZCBfZGVmYXVsdEhpZGVFbXB0eVJvd3M6IERhdGFHcm91cEhpZGVFbXB0eVJvd3M7XG4gICAgcHJvdGVjdGVkIF9kZWZhdWx0TnVtYmVyT2ZDb2xzOiBudW1iZXI7XG5cbiAgICBwcm90ZWN0ZWQgX3N1YmdyaWRJZENvdW50ZXI6IEluY3JlbWVudGluZ0NvdW50ZXI7XG4gICAgcHJvdGVjdGVkIF9leGlzdGluZ1N1YmdyaWRJZHM6IFNldDxzdHJpbmc+O1xuXG4gICAgLyoqXG4gICAgICogRGVmaW5lcyB0aGUgcm93IGhlaWdodCBvZiBvbmUgcm93IGluIHRhc2sgY29udGVudFxuICAgICAqL1xuICAgIHByb3RlY3RlZCByb3dIZWlnaHQgPSAxMDU7XG5cbiAgICBwcm90ZWN0ZWQgY29uc3RydWN0b3IocHJvdGVjdGVkIF9maWVsZENvbnZlcnRlcjogRmllbGRDb252ZXJ0ZXJTZXJ2aWNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdGFza0NvbnRlbnRTZXJ2aWNlOiBUYXNrQ29udGVudFNlcnZpY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBfcGFwZXJWaWV3OiBQYXBlclZpZXdTZXJ2aWNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX2xvZ2dlcjogTG9nZ2VyU2VydmljZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgQE9wdGlvbmFsKCkgcHJvdGVjdGVkIF90YXNrRXZlbnRTZXJ2aWNlOiBUYXNrRXZlbnRTZXJ2aWNlID0gbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChOQUVfQVNZTkNfUkVOREVSSU5HX0NPTkZJR1VSQVRJT04pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3luY1JlbmRlcmluZ0NvbmZpZ3VyYXRpb246IEFzeW5jUmVuZGVyaW5nQ29uZmlndXJhdGlvbiA9IG51bGwpIHtcbiAgICAgICAgdGhpcy5fYXN5bmNSZW5kZXJpbmdDb25maWcgPSB7Li4udGhpcy5ERUZBVUxUX0FTWU5DX1JFTkRFUklOR19DT05GSUdVUkFUSU9OfTtcbiAgICAgICAgaWYgKGFzeW5jUmVuZGVyaW5nQ29uZmlndXJhdGlvbiAhPT0gbnVsbCkge1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLl9hc3luY1JlbmRlcmluZ0NvbmZpZywgYXN5bmNSZW5kZXJpbmdDb25maWd1cmF0aW9uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubG9hZGluZyQgPSBuZXcgTG9hZGluZ0VtaXR0ZXIodHJ1ZSk7XG4gICAgICAgIHRoaXMuX2RhdGFTb3VyY2UkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxBcnJheTxTdWJncmlkPj4oW10pO1xuICAgICAgICB0aGlzLmhhc0RhdGFUb0Rpc3BsYXkkID0gdGhpcy5fZGF0YVNvdXJjZSQucGlwZShtYXAoZGF0YSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gZGF0YS5sZW5ndGggIT09IDA7XG4gICAgICAgIH0pKTtcblxuICAgICAgICB0aGlzLl9zdWJUYXNrQ29udGVudCA9IHRoaXMudGFza0NvbnRlbnRTZXJ2aWNlLiRzaG91bGRDcmVhdGUuc3Vic2NyaWJlKGRhdGEgPT4ge1xuICAgICAgICAgICAgaWYgKGRhdGEubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb21wdXRlRGVmYXVsdExheW91dENvbmZpZ3VyYXRpb24oKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbXB1dGVMYXlvdXREYXRhKGRhdGEpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlckNvbnRlbnQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMubG9hZGluZyQub2ZmKCk7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAodGhpcy5fdGFza0V2ZW50U2VydmljZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy50YXNrRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPFRhc2tFdmVudE5vdGlmaWNhdGlvbj4oKTtcbiAgICAgICAgICAgIHRoaXMuX3N1YlRhc2tFdmVudCA9IF90YXNrRXZlbnRTZXJ2aWNlLnRhc2tFdmVudE5vdGlmaWNhdGlvbnMkLnN1YnNjcmliZShldmVudCA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy50YXNrRXZlbnQuZW1pdChldmVudCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmxvYWRpbmckLmNvbXBsZXRlKCk7XG4gICAgICAgIHRoaXMuX2RhdGFTb3VyY2UkLmNvbXBsZXRlKCk7XG4gICAgICAgIHRoaXMuX3N1YlRhc2tDb250ZW50LnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIGlmICh0aGlzLnRhc2tFdmVudCkge1xuICAgICAgICAgICAgdGhpcy50YXNrRXZlbnQuY29tcGxldGUoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fc3ViVGFza0V2ZW50KSB7XG4gICAgICAgICAgICB0aGlzLl9zdWJUYXNrRXZlbnQudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fYXN5bmNSZW5kZXJUaW1lb3V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5fYXN5bmNSZW5kZXJUaW1lb3V0KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgdGFza0lkKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnRhc2tDb250ZW50U2VydmljZS50YXNrLnN0cmluZ0lkO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZGF0YVNvdXJjZSgpOiBBcnJheTxTdWJncmlkPiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlJC5nZXRWYWx1ZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIHRoZSBudW1iZXIgb2YgY29sdW1ucyBhcyBzcGVjaWZpZWQgYnkgdGhlIHRhc2tzIGxheW91dCBwcm9wZXJ0eSwgb3IgNCBpZiBubyB2YWx1ZSBpcyBzcGVjaWZpZWQuXG4gICAgICovXG4gICAgcHVibGljIGdldE51bWJlck9mRm9ybUNvbHVtbnMoKTogbnVtYmVyIHtcbiAgICAgICAgaWYgKCF0aGlzLnRhc2tDb250ZW50U2VydmljZS50YXNrXG4gICAgICAgICAgICB8fCAhdGhpcy50YXNrQ29udGVudFNlcnZpY2UudGFzay5sYXlvdXRcbiAgICAgICAgICAgIHx8IHRoaXMudGFza0NvbnRlbnRTZXJ2aWNlLnRhc2subGF5b3V0LmNvbHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIDQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50YXNrQ29udGVudFNlcnZpY2UudGFzay5sYXlvdXQuY29scztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBpc1BhcGVyVmlldygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcGVyVmlldy5wYXBlclZpZXc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIGl0ZW0gYW4gb2JqZWN0IGNvbnRhaW5pbmcgZ3JpZCBlbGVtZW50IGluZm9ybWF0aW9uXG4gICAgICogQHJldHVybnMgdGhlIEFuZ3VsYXIgZmxleCBsYXlvdXRzIGFsaWdubWVudCBwcm9wZXJ0eSBmb3IgaW5kaXZpZHVhbCBkYXRhIGZpZWxkcyBiYXNlZCBvblxuICAgICAqIHRoZSBsYXlvdXQgY29uZmlndXJhdGlvbiBzcGVjaWZpZWQgYnkgdGhlIHByb2Nlc3NcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0SXRlbUFsaWdubWVudChpdGVtOiBEYXRhZmllbGRHcmlkTGF5b3V0RWxlbWVudCk6IHN0cmluZyB7XG4gICAgICAgIGlmIChpdGVtLmFsaWdubWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIGl0ZW0uYWxpZ25tZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmllbGRBbGlnbm1lbnQgPSBpdGVtLml0ZW0/LmxvY2FsTGF5b3V0Py5hbGlnbm1lbnQgPz8gdGhpcy5fZGVmYXVsdEFsaWdubWVudDtcblxuICAgICAgICBsZXQgYWxpZ25tZW50O1xuICAgICAgICBzd2l0Y2ggKGZpZWxkQWxpZ25tZW50KSB7XG4gICAgICAgICAgICBjYXNlIEZpZWxkQWxpZ25tZW50LlRPUDpcbiAgICAgICAgICAgICAgICBhbGlnbm1lbnQgPSAnc3RhcnQnO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBGaWVsZEFsaWdubWVudC5DRU5URVI6XG4gICAgICAgICAgICAgICAgYWxpZ25tZW50ID0gJ2NlbnRlcic7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEZpZWxkQWxpZ25tZW50LkJPVFRPTTpcbiAgICAgICAgICAgICAgICBhbGlnbm1lbnQgPSAnZW5kJztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGl0ZW0uYWxpZ25tZW50ID0gJ3NwYWNlLWJldHdlZW4gJyArIGFsaWdubWVudDtcbiAgICAgICAgcmV0dXJuIGl0ZW0uYWxpZ25tZW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbXB1dGVzIGNvbXBvbmVudCBoZWlnaHQgaWYgdGhlIHJvd3MgYXR0cmlidXRlIG9mIHRhc2sgbGF5b3V0IGlzIHNldC5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVzb2x2ZUNvbnRlbnRIZWlnaHRDc3MoKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKHRoaXMuc2Nyb2xsaW5nTmVlZGVkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRhc2tDb250ZW50U2VydmljZS50YXNrLmxheW91dC5yb3dzICogdGhpcy5yb3dIZWlnaHQgKyAncHgnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuICcxMDAlJztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlY2lkZXMgd2hldGhlciB0aGVyZSBpcyBhIGZpeGVkIG51bWJlciBvZiByb3dzIGFuZCBpdCBuZWVkLXMgc2Nyb2xsaW5nXG4gICAgICovXG4gICAgcHVibGljIHNjcm9sbGluZ05lZWRlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGFza0NvbnRlbnRTZXJ2aWNlLnRhc2tcbiAgICAgICAgICAgICYmICEhdGhpcy50YXNrQ29udGVudFNlcnZpY2UudGFzay5sYXlvdXRcbiAgICAgICAgICAgICYmICEhdGhpcy50YXNrQ29udGVudFNlcnZpY2UudGFzay5sYXlvdXQucm93c1xuICAgICAgICAgICAgJiYgdGhpcy50YXNrQ29udGVudFNlcnZpY2UudGFzay5sYXlvdXQucm93cyA+IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybnMgdGhlIGRlZmF1bHQgYWxpZ25tZW50IGZvciB0aGUgZGlzcGxheWVkIHRhc2sgdGhhdCBjYW4gYmUgb3ZlcnJpZGRlbiBieSBmaWVsZHMgaW5kaXZpZHVhbCBwcm9wZXJ0eS5cbiAgICAgKiBJZiB0ZSB0YXNrIHNwZWNpZmllcyBubyBkZWZhdWx0IHZhbHVlIHRoZSBbZ2xvYmFsIGRlZmF1bHRde0BsaW5rIEFic3RyYWN0VGFza0NvbnRlbnRDb21wb25lbnQjREVGQVVMVF9GSUVMRF9BTElHTk1FTlR9XG4gICAgICogdmFsdWUgaXMgcmV0dXJuZWQuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGNvbXB1dGVEZWZhdWx0TGF5b3V0Q29uZmlndXJhdGlvbigpIHtcbiAgICAgICAgdGhpcy5fZGVmYXVsdEFsaWdubWVudCA9IHRoaXMudGFza0NvbnRlbnRTZXJ2aWNlLnRhc2s/LmxheW91dD8uZmllbGRBbGlnbm1lbnQgPz8gdGhpcy5ERUZBVUxUX0ZJRUxEX0FMSUdOTUVOVDtcbiAgICAgICAgdGhpcy5fZGVmYXVsdENvbXBhY3REaXJlY3Rpb24gPSB0aGlzLnRhc2tDb250ZW50U2VydmljZS50YXNrPy5sYXlvdXQ/LmNvbXBhY3REaXJlY3Rpb24gPz8gdGhpcy5ERUZBVUxUX0NPTVBBQ1RfRElSRUNUSU9OO1xuICAgICAgICB0aGlzLl9kZWZhdWx0SGlkZUVtcHR5Um93cyA9IHRoaXMudGFza0NvbnRlbnRTZXJ2aWNlLnRhc2s/LmxheW91dD8uaGlkZUVtcHR5Um93cyA/PyB0aGlzLkRFRkFVTFRfSElERV9FTVBUWV9ST1dTO1xuICAgICAgICB0aGlzLl9kZWZhdWx0TnVtYmVyT2ZDb2xzID0gdGhpcy5nZXROdW1iZXJPZkZvcm1Db2x1bW5zKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29tcHV0ZXMgdGhlIGxheW91dCBkYXRhIGZvciB0aGUgdGFza3MgZ3JpZCBsYXlvdXQgYW5kIHNldHMgdGhlIHJlc3VsdCB0byB0aGUgcHVibGljIHByb3BlcnRpZXNcbiAgICAgKiBvZiB0aGlzIGNsYXNzIHRoYXQgYXJlIHRoZW4gYm91bmQgdG8gSFRNTC5cbiAgICAgKiBAcGFyYW0gZGF0YUdyb3VwcyB0aGUgZGF0YSBncm91cHMgdGhhdCBzaG91bGQgYmUgbGFpZCBvdXRcbiAgICAgKi9cbiAgICBwdWJsaWMgY29tcHV0ZUxheW91dERhdGEoZGF0YUdyb3VwczogQXJyYXk8RGF0YUdyb3VwPikge1xuICAgICAgICBpZiAoIXRoaXMudGFza0NvbnRlbnRTZXJ2aWNlLnRhc2spIHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyQ29udGVudCgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fc3ViZ3JpZElkQ291bnRlciA9IG5ldyBJbmNyZW1lbnRpbmdDb3VudGVyKCk7XG4gICAgICAgIHRoaXMuX2V4aXN0aW5nU3ViZ3JpZElkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBNYXA8c3RyaW5nLCBTdWJncmlkPigpO1xuXG4gICAgICAgIGRhdGFHcm91cHMgPSB0aGlzLnByZXByb2Nlc3NEYXRhR3JvdXBzKGRhdGFHcm91cHMpO1xuXG4gICAgICAgIGNvbnN0IGRlZmF1bHRMYXlvdXQgPSB0aGlzLnRhc2tDb250ZW50U2VydmljZS50YXNrLmxheW91dCAmJiB0aGlzLnRhc2tDb250ZW50U2VydmljZS50YXNrLmxheW91dC50eXBlXG4gICAgICAgICAgICA/IHRoaXMudGFza0NvbnRlbnRTZXJ2aWNlLnRhc2subGF5b3V0LnR5cGVcbiAgICAgICAgICAgIDogdGhpcy5ERUZBVUxUX0xBWU9VVF9UWVBFO1xuXG4gICAgICAgIGRhdGFHcm91cHMuZm9yRWFjaChncm91cCA9PiB7XG4gICAgICAgICAgICBpZiAoIWdyb3VwLmxheW91dCkge1xuICAgICAgICAgICAgICAgIGdyb3VwLmxheW91dCA9IHtyb3dzOiB1bmRlZmluZWQsIGNvbHM6IHVuZGVmaW5lZCwgdHlwZTogZGVmYXVsdExheW91dH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWdyb3VwLmxheW91dC50eXBlKSB7XG4gICAgICAgICAgICAgICAgZ3JvdXAubGF5b3V0LnR5cGUgPSBkZWZhdWx0TGF5b3V0O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBzdWJncmlkID0gbmV3IFN1YmdyaWQoXG4gICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVTdWJncmlkSWQoZ3JvdXApLFxuICAgICAgICAgICAgICAgIGdyb3VwLmxheW91dC5jb2xzID8/IHRoaXMuX2RlZmF1bHROdW1iZXJPZkNvbHMsXG4gICAgICAgICAgICAgICAgdGhpcy5fYXN5bmNSZW5kZXJpbmdDb25maWdcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGlmIChncm91cC50aXRsZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGl0bGUgPSBzdWJncmlkLmFkZFRpdGxlKGdyb3VwKTtcbiAgICAgICAgICAgICAgICBzdWJncmlkLmFkZFJvdyh0aGlzLm5ld0dyaWRSb3coc3ViZ3JpZC5jb2xzLCB0aXRsZS5ncmlkQXJlYUlkKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXAubGF5b3V0LnR5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlIERhdGFHcm91cExheW91dFR5cGUuR1JJRDpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21wdXRlR3JpZExheW91dChncm91cCwgc3ViZ3JpZCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgRGF0YUdyb3VwTGF5b3V0VHlwZS5GTE9XOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbXB1dGVGbG93TGF5b3V0KGdyb3VwLCBzdWJncmlkKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBEYXRhR3JvdXBMYXlvdXRUeXBlLkxFR0FDWTpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21wdXRlTGVnYWN5TGF5b3V0KGdyb3VwLCBzdWJncmlkKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHRhc2sgbGF5b3V0IHR5cGUgJyR7dGhpcy50YXNrQ29udGVudFNlcnZpY2UudGFzay5sYXlvdXQudHlwZX0nYCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHN1YmdyaWQuZmluYWxpemUoKTtcbiAgICAgICAgICAgIHJlc3VsdC5zZXQoc3ViZ3JpZC5zdWJncmlkSWQsIHN1YmdyaWQpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnJlbmRlckZpZWxkcyhyZXN1bHQpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCByZW5kZXJGaWVsZHMoc3ViZ3JpZHM6IE1hcDxzdHJpbmcsIFN1YmdyaWQ+KSB7XG4gICAgICAgIGNvbnN0IHN1YmdyaWRzQXJyYXkgPSBBcnJheS5mcm9tKHN1YmdyaWRzLnZhbHVlcygpKTtcblxuICAgICAgICBpZiAoIXRoaXMuX2FzeW5jUmVuZGVyaW5nQ29uZmlnLmVuYWJsZUFzeW5jUmVuZGVyaW5nRm9yTmV3RmllbGRzXG4gICAgICAgICAgICAmJiAhKHRoaXMuX2FzeW5jUmVuZGVyaW5nQ29uZmlnLmVuYWJsZUFzeW5jUmVuZGVyaW5nT25UYXNrRXhwYW5kICYmIHRoaXMudGFza0NvbnRlbnRTZXJ2aWNlLmlzRXhwYW5kaW5nKSkge1xuICAgICAgICAgICAgc3ViZ3JpZHNBcnJheS5mb3JFYWNoKHN1YmdyaWQgPT4ge1xuICAgICAgICAgICAgICAgIHN1YmdyaWQuZGlzcGxheUFsbEZpZWxkcygpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLnJlbmRlckNvbnRlbnQoc3ViZ3JpZHNBcnJheSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoISh0aGlzLnRhc2tDb250ZW50U2VydmljZS5pc0V4cGFuZGluZyAmJiB0aGlzLl9hc3luY1JlbmRlcmluZ0NvbmZpZy5lbmFibGVBc3luY1JlbmRlcmluZ09uVGFza0V4cGFuZCkpIHtcbiAgICAgICAgICAgIHRoaXMuX2RhdGFTb3VyY2UkLnZhbHVlLmZvckVhY2gob2xkU3ViZ3JpZCA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHN1YmdyaWRzLmhhcyhvbGRTdWJncmlkLnN1YmdyaWRJZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgc3ViZ3JpZHMuZ2V0KG9sZFN1YmdyaWQuc3ViZ3JpZElkKS5kZXRlcm1pbmVLZXB0RmllbGRzKG9sZFN1YmdyaWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZW5kZXJDb250ZW50KHN1YmdyaWRzQXJyYXkpO1xuICAgICAgICB0aGlzLnNwcmVhZEZpZWxkUmVuZGVyaW5nT3ZlclRpbWUoc3ViZ3JpZHNBcnJheSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHNwcmVhZEZpZWxkUmVuZGVyaW5nT3ZlclRpbWUoc3ViZ3JpZHM6IEFycmF5PFN1YmdyaWQ+LCBpdGVyYXRpb24gPSAwKSB7XG4gICAgICAgIHRoaXMuX2FzeW5jUmVuZGVyVGltZW91dCA9IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKGl0ZXJhdGlvbiA8IHN1YmdyaWRzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5fYXN5bmNSZW5kZXJUaW1lb3V0ID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHN1YmdyaWRzW2l0ZXJhdGlvbl0ucmVuZGVyQ29udGVudE92ZXJUaW1lKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zcHJlYWRGaWVsZFJlbmRlcmluZ092ZXJUaW1lKHN1YmdyaWRzLCBpdGVyYXRpb24gKyAxKTtcbiAgICAgICAgICAgICAgICB9LCBpdGVyYXRpb24gPT09IDApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbG9uZXMgdGhlIGNvbnRlbnQgb2YgdGhlIGRhdGEgZ3JvdXBzIHRvIHByZXZlbnQgdW5pbnRlbnRpb25hbCBtZW1vcnkgYWNjZXNzZXMgdG8gc291cmNlIGRhdGEuXG4gICAgICogUmVhcnJhbmdlcyB0aGUgZGF0YSBncm91cHMgdG8gYWNjb21tb2RhdGUgdGFza3JlZnMuIEZpbHRlcnMgb3V0IGhpZGRlbiBhbmQgZm9yYmlkZGVuIGZpZWxkcy5cbiAgICAgKiBAcGFyYW0gZGF0YUdyb3Vwc1xuICAgICAqIEByZXR1cm5zIHRoZSBwcmVwcm9jZXNzZXMgZGF0YSBncm91cHNcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcHJlcHJvY2Vzc0RhdGFHcm91cHMoZGF0YUdyb3VwczogQXJyYXk8RGF0YUdyb3VwPik6IEFycmF5PERhdGFHcm91cD4ge1xuICAgICAgICBkYXRhR3JvdXBzID0gdGhpcy5jbG9uZUFuZEZpbHRlckhpZGRlbihkYXRhR3JvdXBzKTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhR3JvdXBzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBncm91cCA9IGRhdGFHcm91cHNbaV07XG4gICAgICAgICAgICBpZiAoIWdyb3VwLmZpZWxkcy5zb21lKGYgPT4gdGhpcy5pc1Rhc2tSZWYoZikpKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goZ3JvdXApO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgc3BsaXQgPSB0aGlzLnNwbGl0RGF0YUdyb3VwT25UYXNrUmVmKGdyb3VwKTtcbiAgICAgICAgICAgIGlmIChzcGxpdC5zdGFydEdyb3VwICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChzcGxpdC5zdGFydEdyb3VwKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHNwbGl0LnRhc2tSZWYudmFsdWUubGVuZ3RoID09PSAwIHx8IHNwbGl0LmVuZEdyb3VwID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBpZiAoc3BsaXQuZW5kR3JvdXAgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBkYXRhR3JvdXBzLnNwbGljZShpICsgMSwgMCwgc3BsaXQuZW5kR3JvdXApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgZGlyZWN0Q2hpbGQgPSBkYXRhR3JvdXBzW2kgKyAxXTsgLy8gdGhlIGRhdGEgZ3JvdXAgdGhhdCBpbW1lZGlhdGVseSBmb2xsb3dzIElTIEFMV0FZUyBhIGRpcmVjdCBjaGlsZFxuICAgICAgICAgICAgbGV0IGZpcnN0Tm9uRGVzY2VuZGFudEluZGV4ID0gaSArIDI7XG4gICAgICAgICAgICBmb3IgKDsgZmlyc3ROb25EZXNjZW5kYW50SW5kZXggPCBkYXRhR3JvdXBzLmxlbmd0aDsgZmlyc3ROb25EZXNjZW5kYW50SW5kZXgrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5leHRHcm91cCA9IGRhdGFHcm91cHNbZmlyc3ROb25EZXNjZW5kYW50SW5kZXhdO1xuICAgICAgICAgICAgICAgIGlmIChuZXh0R3JvdXAubmVzdGluZ0xldmVsID09PSB1bmRlZmluZWQgfHwgbmV4dEdyb3VwLm5lc3RpbmdMZXZlbCA8IGRpcmVjdENoaWxkLm5lc3RpbmdMZXZlbCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBlbmQgb2YgdGhlIGJsb2NrIG9mIG5lc3RlZCBkYXRhIGdyb3Vwc1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG5leHRHcm91cC5uZXN0aW5nTGV2ZWwgPT09IGRpcmVjdENoaWxkLm5lc3RpbmdMZXZlbFxuICAgICAgICAgICAgICAgICAgICAmJiAobmV4dEdyb3VwLnBhcmVudFRhc2tSZWZJZCAhPT0gc3BsaXQudGFza1JlZi5zdHJpbmdJZFxuICAgICAgICAgICAgICAgICAgICAgICAgfHwgIXNwbGl0LnRhc2tSZWYudmFsdWUuc29tZShyZWZmZWRUYXNrSWQgPT4gcmVmZmVkVGFza0lkID09PSBuZXh0R3JvdXAucGFyZW50VGFza0lkKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkYXRhR3JvdXBzLnNwbGljZShmaXJzdE5vbkRlc2NlbmRhbnRJbmRleCwgMCwgc3BsaXQuZW5kR3JvdXApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZHVwbGljYXRlIG9mIHRoZSBwcm92aWRlZCBkYXRhIGdyb3VwIGFycmF5IGFuZCBmaWx0ZXJzIGF3YXkgYW55IGZpZWxkcyBhbmQgZGF0YSBncm91cHMgdGhhdCBhcmUgbWFya2VkIGFzIGhpZGRlbi5cbiAgICAgKiBCZWNhdXNlIG9mIHRoZSBkdXBsaWNhdGlvbiB0aGUgZmlsdGVyaW5nIGRvZXNuJ3QgYWZmZWN0IHRoZSBvcmlnaW5hbCBpbnN0YW5jZXMgYW5kIHRoZXkgcmVtYWluIHVuY2hhbmdlZC5cbiAgICAgKiBAcGFyYW0gZGF0YUdyb3VwcyB0aGUgZGF0YSBncm91cHMgdGhhdCBzaG91bGQgYmUgZmlsdGVyZWRcbiAgICAgKiBAcmV0dXJucyB0aGUgZmlsdGVyZWQgZHVwbGljYXRlZCBkYXRhIGdyb3Vwc1xuICAgICAqL1xuICAgIHByb3RlY3RlZCBjbG9uZUFuZEZpbHRlckhpZGRlbihkYXRhR3JvdXBzOiBBcnJheTxEYXRhR3JvdXA+KTogQXJyYXk8RGF0YUdyb3VwPiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGRhdGFHcm91cHMubWFwKGdyb3VwID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGcgPSB7Li4uZ3JvdXB9O1xuICAgICAgICAgICAgZy5maWVsZHMgPSBnLmZpZWxkcy5maWx0ZXIoZmllbGQgPT4gIWZpZWxkLmJlaGF2aW9yLmhpZGRlbiAmJiAhZmllbGQuYmVoYXZpb3IuZm9yYmlkZGVuKS5tYXAoZmllbGQgPT4ge1xuICAgICAgICAgICAgICAgIGZpZWxkLnJlc2V0TG9jYWxMYXlvdXQoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmllbGQ7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBnO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gcmVzdWx0LmZpbHRlcihncm91cCA9PiBncm91cC5maWVsZHMubGVuZ3RoID4gMCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGlzVGFza1JlZihmaWVsZDogRGF0YUZpZWxkPHVua25vd24+KTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBmaWVsZCBpbnN0YW5jZW9mIFRhc2tSZWZGaWVsZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTb3J0cyB0aGUgaW5wdXQgZGF0YSBncm91cCBiYXNlZCBvbiB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSBmaWVsZHMgYW5kIHNwbGl0cyBpdCBpbnRvIHBhcnRzIG9uIHRoZSBmaXJzdCB0YXNrIHJlZi5cbiAgICAgKiBJZiBzb21lIGZpZWxkcyBhcHBlYXIgYmVmb3JlIHRoZSBmaXJzdCB0YXNrIHJlZiB0aGV5IGFyZSBleHRyYWN0ZWQgaW50byBhIG5ldyBbc3RhcnRHcm91cF17QGxpbmsgU3BsaXREYXRhR3JvdXAjc3RhcnRHcm91cH0uXG4gICAgICogSWYgc29tZSBmaWVsZHMgYXBwZWFyIGFmdGVyIHRoZSBmaXJzdCB0YXNrIHJlZiB0aGV5IGFyZSBleHRyYWN0ZWQgaW50byBhIG5ldyBbZW5kR3JvdXBde0BsaW5rIFNwbGl0RGF0YUdyb3VwI2VuZEdyb3VwfS5cbiAgICAgKiBAcGFyYW0gZGF0YUdyb3VwXG4gICAgICogQHByb3RlY3RlZFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBzcGxpdERhdGFHcm91cE9uVGFza1JlZihkYXRhR3JvdXA6IERhdGFHcm91cCk6IFNwbGl0RGF0YUdyb3VwIHtcbiAgICAgICAgZGF0YUdyb3VwLmZpZWxkcy5zb3J0KChhLCBiKSA9PiBhLmxvY2FsTGF5b3V0LnkgLSBiLmxvY2FsTGF5b3V0LnkpO1xuICAgICAgICBjb25zdCB0YXNrUmVmUG9zaXRpb24gPSBkYXRhR3JvdXAuZmllbGRzLmZpbmRJbmRleChmID0+IHRoaXMuaXNUYXNrUmVmKGYpKTtcbiAgICAgICAgY29uc3QgcmVzdWx0OiBTcGxpdERhdGFHcm91cCA9IHtcbiAgICAgICAgICAgIHRhc2tSZWY6IGRhdGFHcm91cC5maWVsZHNbdGFza1JlZlBvc2l0aW9uXVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmICh0YXNrUmVmUG9zaXRpb24gIT09IDApIHtcbiAgICAgICAgICAgIHJlc3VsdC5zdGFydEdyb3VwID0ge1xuICAgICAgICAgICAgICAgIHRpdGxlOiBkYXRhR3JvdXAudGl0bGUsXG4gICAgICAgICAgICAgICAgYWxpZ25tZW50OiBkYXRhR3JvdXAuYWxpZ25tZW50LFxuICAgICAgICAgICAgICAgIGxheW91dDogZGF0YUdyb3VwLmxheW91dCxcbiAgICAgICAgICAgICAgICBzdHJldGNoOiBkYXRhR3JvdXAuc3RyZXRjaCxcbiAgICAgICAgICAgICAgICBmaWVsZHM6IGRhdGFHcm91cC5maWVsZHMuc2xpY2UoMCwgdGFza1JlZlBvc2l0aW9uKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGFza1JlZlBvc2l0aW9uICE9PSBkYXRhR3JvdXAuZmllbGRzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgIHJlc3VsdC5lbmRHcm91cCA9IHtcbiAgICAgICAgICAgICAgICB0aXRsZTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIGFsaWdubWVudDogZGF0YUdyb3VwLmFsaWdubWVudCxcbiAgICAgICAgICAgICAgICBsYXlvdXQ6IGRhdGFHcm91cC5sYXlvdXQsXG4gICAgICAgICAgICAgICAgc3RyZXRjaDogZGF0YUdyb3VwLnN0cmV0Y2gsXG4gICAgICAgICAgICAgICAgZmllbGRzOiBkYXRhR3JvdXAuZmllbGRzLnNsaWNlKHRhc2tSZWZQb3NpdGlvbiArIDEpLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJlc3VsdC5lbmRHcm91cC5maWVsZHMuZm9yRWFjaChmID0+IHtcbiAgICAgICAgICAgICAgICBmLmxvY2FsTGF5b3V0LnkgPSBmLmxvY2FsTGF5b3V0LnkgLSByZXN1bHQudGFza1JlZi5sb2NhbExheW91dC55IC0gMTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb21wdXRlcyB0aGUgbGF5b3V0IGRhdGEgZm9yIGEgc2luZ2xlIGRhdGEgZ3JvdXAgd2l0aCBncmlkIGxheW91dC4gVGhlIHJlc3VsdGluZyBsYXlvdXQgaXMgc2F2ZWQgaW50byB0aGUgaW5wdXQgb2JqZWN0cy5cbiAgICAgKiBAcGFyYW0gZGF0YUdyb3VwIHRoZSBkYXRhIGdyb3VwIHRoYXQgc2hvdWxkIGJlIGxhaWQgb3V0IGludG8gYSBncmlkXG4gICAgICogQHBhcmFtIHN1YmdyaWQgdGhlIG9iamVjdCB0aGF0IGhvbGRzIHRoZSBjb250ZXh0IG9mIHRoZSBjb21wdXRlZCBsYXlvdXRpbmcgdW5pdFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBjb21wdXRlR3JpZExheW91dChkYXRhR3JvdXA6IERhdGFHcm91cCwgc3ViZ3JpZDogU3ViZ3JpZCkge1xuICAgICAgICBjb25zdCBsb2NhbEdyaWQ6IEFycmF5PEFycmF5PHN0cmluZz4+ID0gW107XG5cbiAgICAgICAgZGF0YUdyb3VwLmZpZWxkcy5mb3JFYWNoKGRhdGFGaWVsZCA9PiB7XG4gICAgICAgICAgICBpZiAoIWRhdGFGaWVsZC5sb2NhbExheW91dFxuICAgICAgICAgICAgICAgIHx8IGRhdGFGaWVsZC5sb2NhbExheW91dC54ID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICB8fCBkYXRhRmllbGQubG9jYWxMYXlvdXQueSA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgfHwgIWRhdGFGaWVsZC5sb2NhbExheW91dC5yb3dzXG4gICAgICAgICAgICAgICAgfHwgIWRhdGFGaWVsZC5sb2NhbExheW91dC5jb2xzKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICAgICBgWW91IGNhbm5vdCB1c2UgJ2dyaWQnIGxheW91dCB3aXRob3V0IHNwZWNpZnlpbmcgdGhlIGxheW91dCBvZiB0aGUgZGF0YSBmaWVsZHMgKGZpZWxkIElEOiAke2RhdGFGaWVsZC5zdHJpbmdJZH0pYCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHdoaWxlIChsb2NhbEdyaWQubGVuZ3RoIDwgZGF0YUZpZWxkLmxvY2FsTGF5b3V0LnkgKyBkYXRhRmllbGQubG9jYWxMYXlvdXQucm93cykge1xuICAgICAgICAgICAgICAgIGxvY2FsR3JpZC5wdXNoKHRoaXMubmV3R3JpZFJvdyhzdWJncmlkLmNvbHMpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgZmllbGRFbGVtZW50ID0gc3ViZ3JpZC5hZGRGaWVsZChkYXRhRmllbGQsIHRoaXMuX2ZpZWxkQ29udmVydGVyLnJlc29sdmVUeXBlKGRhdGFGaWVsZCkpO1xuICAgICAgICAgICAgdGhpcy5vY2N1cHlTcGFjZShsb2NhbEdyaWQsIGRhdGFGaWVsZC5sb2NhbExheW91dC55LCBkYXRhRmllbGQubG9jYWxMYXlvdXQueCxcbiAgICAgICAgICAgICAgICBkYXRhRmllbGQubG9jYWxMYXlvdXQuY29scywgZmllbGRFbGVtZW50LmdyaWRBcmVhSWQsIGRhdGFGaWVsZC5sb2NhbExheW91dC5yb3dzKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5jb2xsYXBzZUdyaWRFbXB0eVNwYWNlKGxvY2FsR3JpZCwgZGF0YUdyb3VwLmxheW91dCwgc3ViZ3JpZCk7XG5cbiAgICAgICAgbG9jYWxHcmlkLmZvckVhY2gobG9jYWxHcmlkUm93ID0+IHN1YmdyaWQuYWRkUm93KGxvY2FsR3JpZFJvdykpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFwcGxpZXMgdGhlIGVtcHR5IHJvdyByZW1vdmFsIGFuZCBmaWVsZCBjb21wYWN0aW5nIHJ1bGVzIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBsYXlvdXQgY29uZmlndXJhdGlvbi5cbiAgICAgKlxuICAgICAqIFRoZSBpbnB1dCBncmlkIGlzIG1vZGlmaWVkIGluIHBsYWNlLlxuICAgICAqIEBwYXJhbSBncmlkIHRoZSBzdGF0ZSBvZiB0aGUgZ3JpZCB0aGF0IHNob3VsZCBiZSBtb2RpZmllZFxuICAgICAqIEBwYXJhbSBsYXlvdXQgY29uZmlndXJhdGlvbiBvZiB0aGUgYXBwbGllZCBjb21wYWN0aW5nIHJ1bGVzXG4gICAgICogQHBhcmFtIHN1YmdyaWQgdGhlIG9iamVjdCB0aGF0IGhvbGRzIHRoZSBjb250ZXh0IG9mIHRoZSBjb21wdXRlZCBsYXlvdXRpbmcgdW5pdFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBjb2xsYXBzZUdyaWRFbXB0eVNwYWNlKGdyaWQ6IEFycmF5PEFycmF5PHN0cmluZz4+LCBsYXlvdXQ6IERhdGFHcm91cExheW91dCwgc3ViZ3JpZDogU3ViZ3JpZCkge1xuICAgICAgICBjb25zdCBoaWRlUm93cyA9IGxheW91dC5oaWRlRW1wdHlSb3dzID8/IHRoaXMuX2RlZmF1bHRIaWRlRW1wdHlSb3dzO1xuXG4gICAgICAgIGlmIChoaWRlUm93cyA9PT0gRGF0YUdyb3VwSGlkZUVtcHR5Um93cy5BTEwpIHtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlRW1wdHlSb3dzKGdyaWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgc3dpdGNoIChsYXlvdXQuY29tcGFjdERpcmVjdGlvbiA/PyB0aGlzLl9kZWZhdWx0Q29tcGFjdERpcmVjdGlvbikge1xuICAgICAgICAgICAgY2FzZSBEYXRhR3JvdXBDb21wYWN0LlVQOlxuICAgICAgICAgICAgICAgIHRoaXMuY29tcGFjdEZpZWxkc1VwKGdyaWQsIGhpZGVSb3dzLCBzdWJncmlkKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1vdmVzIGFueSBlbGVtZW50IGFzIGZhciBVUCBhcyBpdCBjYW4gZ28uIEVsZW1lbnRzIHRoYXQgd2VyZSBvcmlnaW5hbGx5IGRlY2xhcmVkIGluIHRoZSBzYW1lIHJvdyBtaWdodCBlbmQgdXAgaW4gZGlmZmVyZW50IHJvd3MuXG4gICAgICogUmVzdWx0aW5nIHRyYWlsaW5nIGVtcHR5IHJvd3MgYXJlIHJlbW92ZWQuXG4gICAgICpcbiAgICAgKiBUaGUgaW5wdXQgZ3JpZCBpcyBtb2RpZmllZCBpbiBwbGFjZS5cbiAgICAgKiBAcGFyYW0gZ3JpZCB0aGUgc3RhdGUgb2YgdGhlIGdyaWQgdGhhdCBzaG91bGQgYmUgbW9kaWZpZWRcbiAgICAgKiBAcGFyYW0gaGlkZVJvd3MgY29uZmlndXJhdGlvbiBmb3IgZW1wdHkgcm93IHJlbW92YWwgZHVyaW5nIHRoZSBjb21wYWN0aW5nIHByb2Nlc3NcbiAgICAgKiBAcGFyYW0gc3ViZ3JpZCB0aGUgb2JqZWN0IHRoYXQgaG9sZHMgdGhlIGNvbnRleHQgb2YgdGhlIGNvbXB1dGVkIGxheW91dGluZyB1bml0XG4gICAgICovXG4gICAgcHJvdGVjdGVkIGNvbXBhY3RGaWVsZHNVcChncmlkOiBBcnJheTxBcnJheTxzdHJpbmc+PiwgaGlkZVJvd3M6IERhdGFHcm91cEhpZGVFbXB0eVJvd3MsIHN1YmdyaWQ6IFN1YmdyaWQpIHtcbiAgICAgICAgZm9yIChsZXQgcm93SW5kZXggPSAwOyByb3dJbmRleCA8IGdyaWQubGVuZ3RoOyByb3dJbmRleCsrKSB7XG4gICAgICAgICAgICBjb25zdCByb3cgPSBncmlkW3Jvd0luZGV4XTtcblxuICAgICAgICAgICAgZm9yIChsZXQgY29sdW1uSW5kZXggPSAwOyBjb2x1bW5JbmRleCA8IHJvdy5sZW5ndGg7IGNvbHVtbkluZGV4KyspIHtcbiAgICAgICAgICAgICAgICBpZiAocm93W2NvbHVtbkluZGV4XSAhPT0gJycpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGV0IGZvdW5kRWxlbWVudCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGxldCBmb3VuZEVsZW1lbnRSb3dJbmRleCA9IHJvd0luZGV4ICsgMTtcbiAgICAgICAgICAgICAgICBmb3IgKDsgZm91bmRFbGVtZW50Um93SW5kZXggPCBncmlkLmxlbmd0aDsgZm91bmRFbGVtZW50Um93SW5kZXgrKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZ3JpZFtmb3VuZEVsZW1lbnRSb3dJbmRleF1bY29sdW1uSW5kZXhdICE9PSAnJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRFbGVtZW50ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghZm91bmRFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChjb2x1bW5JbmRleCA+IDAgJiYgZ3JpZFtmb3VuZEVsZW1lbnRSb3dJbmRleF1bY29sdW1uSW5kZXggLSAxXSA9PT0gZ3JpZFtmb3VuZEVsZW1lbnRSb3dJbmRleF1bY29sdW1uSW5kZXhdKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnREaW1lbnNpb25zID0gdGhpcy5nZXRFbGVtZW50RGltZW5zaW9ucyhncmlkLCBjb2x1bW5JbmRleCwgZm91bmRFbGVtZW50Um93SW5kZXgsIHN1YmdyaWQpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNBcmVhRW1wdHkoZ3JpZCwgY29sdW1uSW5kZXgsIHJvd0luZGV4LCBlbGVtZW50RGltZW5zaW9ucy53aWR0aCwgZm91bmRFbGVtZW50Um93SW5kZXggLSByb3dJbmRleCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IGdyaWRbZm91bmRFbGVtZW50Um93SW5kZXhdW2NvbHVtbkluZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vY2N1cHlTcGFjZShncmlkLCBmb3VuZEVsZW1lbnRSb3dJbmRleCwgY29sdW1uSW5kZXgsIGVsZW1lbnREaW1lbnNpb25zLndpZHRoLCAnJywgZWxlbWVudERpbWVuc2lvbnMuaGVpZ2h0LCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub2NjdXB5U3BhY2UoZ3JpZCwgcm93SW5kZXgsIGNvbHVtbkluZGV4LCBlbGVtZW50RGltZW5zaW9ucy53aWR0aCwgZWxlbWVudCwgZWxlbWVudERpbWVuc2lvbnMuaGVpZ2h0LCBmYWxzZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGhpZGVSb3dzICE9PSBEYXRhR3JvdXBIaWRlRW1wdHlSb3dzLk5PTkUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIG9ubHkgY2hlY2sgdGhlIHJvd3MgcG90ZW50aWFsbHkgY2xlYXJlZCBieSBtb3ZpbmcgdGhlIGdyaWQgZWxlbWVudCB1cFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVFbXB0eVJvd3MoZ3JpZCwgZm91bmRFbGVtZW50Um93SW5kZXgsIGZvdW5kRWxlbWVudFJvd0luZGV4ICsgZWxlbWVudERpbWVuc2lvbnMuaGVpZ2h0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgcm93cyBmcm9tIHRoZSBncmlkIHRoYXQgb25seSBjb250YWluIGVtcHR5IGVsZW1lbnRzIChhcmUgZW1wdHkpLiBUaGUgZ3JpZCBpcyBtb2RpZmllZCBpbiBwbGFjZS5cbiAgICAgKiBAcGFyYW0gZ3JpZCB0aGUgZ3JpZCB0aGF0IHNob3VsZCBoYXZlIGl0J3MgZW1wdHkgcm93cyByZW1vdmVkXG4gICAgICogQHBhcmFtIGZpcnN0Um93IHRoZSAwIGJhc2VkIGluZGV4IG9mIHRoZSBmaXJzdCByb3cgdGhhdCBzaG91bGQgYmUgY2hlY2tlZC4gVXNlIDAgdG8gc3RhcnQgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBncmlkLlxuICAgICAqXG4gICAgICogSWYgbm8gdmFsdWUgaXMgcHJvdmlkZWQsIHRoZSBncmlkIHdpbGwgYmUgY2hlY2tlZCBmcm9tIHRoZSBmaXJzdCByb3cuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbGFzdFJvdyB0aGUgMCBiYXNlZCBpbmRleCBvZiB0aGUgcm93IHdoZXJlIHRoZSBjaGVja2luZyBzaG91bGQgZW5kLiBUaGUgcm93IHdpdGggdGhpcyBpbmRleCBpcyBub3QgY2hlY2tlZC5cbiAgICAgKlxuICAgICAqIElmIG5vIHZhbHVlIGlzIHByb3ZpZGVkIHRoZSBlbnRpcmUgZ3JpZCBmcm9tIHRoZSBgZmlyc3RSb3dgIHdpbGwgYmUgY2hlY2tlZC5cbiAgICAgKlxuICAgICAqIElmIGEgdmFsdWUgdGhhdCBpcyBzbWFsbGVyIG9yIGVxdWFsIHRvIHRoZSBgZmlyc3RSb3dgIGlzIHByb3ZpZGVkIG5vIGNoZWNrcyB3aWxsIGJlIHByZWZvcm1lZC5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcmVtb3ZlRW1wdHlSb3dzKGdyaWQ6IEFycmF5PEFycmF5PHN0cmluZz4+LCBmaXJzdFJvdyA9IDAsIGxhc3RSb3cgPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpIHtcbiAgICAgICAgbGV0IGkgPSBmaXJzdFJvdztcbiAgICAgICAgd2hpbGUgKGkgPCBncmlkLmxlbmd0aCAmJiBpIDwgbGFzdFJvdykge1xuICAgICAgICAgICAgaWYgKGdyaWRbaV0uZXZlcnkoZWxlbWVudCA9PiBlbGVtZW50ID09PSAnJykpIHtcbiAgICAgICAgICAgICAgICBncmlkLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lcyB0aGUgZGltZW5zaW9ucyBvZiB0aGUgZWxlbWVudCBpbiB0aGUgZ3JpZCB3aXRoIGl0cyB0b3AtbGVmdCBjb3JuZXIgYXQgdGhlIHNwZWNpZmllZCBwb3NpdGlvblxuICAgICAqIEBwYXJhbSBncmlkIHRoZSBncmlkIG9mIGVsZW1lbnRzXG4gICAgICogQHBhcmFtIHggdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgZGVzaXJlZCBlbGVtZW50cyB0b3AtbGVmdCBjb3JuZXJcbiAgICAgKiBAcGFyYW0geSB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSBkZXNpcmVkIGVsZW1lbnRzIHRvcC1sZWZ0IGNvcm5lclxuICAgICAqIEBwYXJhbSBzdWJncmlkIHRoZSBvYmplY3QgdGhhdCBob2xkcyB0aGUgY29udGV4dCBvZiB0aGUgY29tcHV0ZWQgbGF5b3V0aW5nIHVuaXRcbiAgICAgKiBAcmV0dXJucyB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgc3BlY2lmaWVkIGVsZW1lbnRcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZ2V0RWxlbWVudERpbWVuc2lvbnMoZ3JpZDogQXJyYXk8QXJyYXk8c3RyaW5nPj4sIHg6IG51bWJlciwgeTogbnVtYmVyLCBzdWJncmlkOiBTdWJncmlkKTogeyB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlciB9IHtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IGdyaWRbeV1beF07XG4gICAgICAgIGxldCB3aWR0aCA9IDE7XG4gICAgICAgIHdoaWxlICh4ICsgd2lkdGggPCBzdWJncmlkLmNvbHMgJiYgZ3JpZFt5XVt4ICsgd2lkdGhdID09PSBlbGVtZW50KSB7XG4gICAgICAgICAgICB3aWR0aCsrO1xuICAgICAgICB9XG4gICAgICAgIGxldCBoZWlnaHQgPSAxO1xuICAgICAgICB3aGlsZSAoeSArIGhlaWdodCA8IGdyaWQubGVuZ3RoICYmIGdyaWRbeSArIGhlaWdodF1beF0gPT09IGVsZW1lbnQpIHtcbiAgICAgICAgICAgIGhlaWdodCsrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7d2lkdGgsIGhlaWdodH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgYXJlYSBpbiB0aGUgZ3JpZCBjb250YWlucyBubyBlbGVtZW50cywgb3Igbm90XG4gICAgICogQHBhcmFtIGdyaWQgdGhlIGdyaWQgb2YgZWxlbWVudHNcbiAgICAgKiBAcGFyYW0geCB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSB0ZXN0ZWQgYXJlYXMgdG9wLWxlZnQgY29ybmVyXG4gICAgICogQHBhcmFtIHkgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgdGVzdGVkIGFyZWFzIHRvcC1sZWZ0IGNvcm5lclxuICAgICAqIEBwYXJhbSB3aWR0aCB0aGUgd2lkdGggb2YgdGhlIHRlc3RlZCBhcmVhXG4gICAgICogQHBhcmFtIGhlaWdodCB0aGUgaGVpZ2h0IG9mIHRoZSB0ZXN0ZWQgYXJlYVxuICAgICAqL1xuICAgIHByb3RlY3RlZCBpc0FyZWFFbXB0eShncmlkOiBBcnJheTxBcnJheTxzdHJpbmc+PiwgeDogbnVtYmVyLCB5OiBudW1iZXIsIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIGZvciAobGV0IGkgPSB5OyBpIDwgeSArIGhlaWdodDsgaSsrKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0geDsgaiA8IHggKyB3aWR0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGdyaWRbaV1bal0gIT09ICcnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29tcHV0ZXMgdGhlIGxheW91dCBkYXRhIGZvciBhIHNpbmdsZSBkYXRhIGdyb3VwIHdpdGggZmxvdyBsYXlvdXQuIFRoZSByZXN1bHRpbmcgbGF5b3V0IGlzIHNhdmVkIGludG8gdGhlIGlucHV0IG9iamVjdHMuXG4gICAgICogQHBhcmFtIGRhdGFHcm91cCB0aGUgZGF0YSBncm91cCB0aGF0IHNob3VsZCBiZSBsYWlkIG91dCBpbnRvIGEgZ3JpZCB1c2luZyB0aGUgZmxvdyBhbGdvcml0aG1cbiAgICAgKiBAcGFyYW0gc3ViZ3JpZCB0aGUgb2JqZWN0IHRoYXQgaG9sZHMgdGhlIGNvbnRleHQgb2YgdGhlIGNvbXB1dGVkIGxheW91dGluZyB1bml0XG4gICAgICovXG4gICAgcHJvdGVjdGVkIGNvbXB1dGVGbG93TGF5b3V0KGRhdGFHcm91cDogRGF0YUdyb3VwLCBzdWJncmlkOiBTdWJncmlkKSB7XG4gICAgICAgIHRoaXMuZmxvd0ZpZWxkcyhkYXRhR3JvdXAsIHN1YmdyaWQsIDEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbXB1dGVzIHRoZSBsYXlvdXQgZGF0YSBmb3IgYSBzaW5nbGUgZGF0YSBncm91cCB3aXRoIGxlZ2FjeSBsYXlvdXQuIFRoZSByZXN1bHRpbmcgbGF5b3V0IGlzIHNhdmVkIGludG8gdGhlIGlucHV0IG9iamVjdHMuXG4gICAgICpcbiAgICAgKiBUaGUgbGVnYWN5IGxheW91dCBmb3JjZXMgdGhlIG51bWJlciBvZiBjb2x1bW5zIHRvIGJlIDQgYW5kIGxvZ3MgYSB3YXJuaW5nIGlmIHRoaXMgd2FzIG5vdCB0aGUgY2FzZS5cbiAgICAgKiBAcGFyYW0gZGF0YUdyb3VwIHRoZSBkYXRhIGdyb3VwIHRoYXQgc2hvdWxkIGJlIGxhaWQgb3V0IGludG8gYSBncmlkIHVzaW5nIHRoZSBsZWdhY3kgYWxnb3JpdGhtIHVzZWQgaW4gTkFFIHZlcnNpb25zIDwgNC4wLjBcbiAgICAgKiBAcGFyYW0gc3ViZ3JpZCB0aGUgb2JqZWN0IHRoYXQgaG9sZHMgdGhlIGNvbnRleHQgb2YgdGhlIGNvbXB1dGVkIGxheW91dGluZyB1bml0XG4gICAgICovXG4gICAgcHJvdGVjdGVkIGNvbXB1dGVMZWdhY3lMYXlvdXQoZGF0YUdyb3VwOiBEYXRhR3JvdXAsIHN1YmdyaWQ6IFN1YmdyaWQpIHtcbiAgICAgICAgaWYgKHN1YmdyaWQuY29scyAhPT0gNCkge1xuICAgICAgICAgICAgc3ViZ3JpZC5jb2xzID0gNDtcbiAgICAgICAgICAgIHRoaXMuX2xvZ2dlci53YXJuKGBUYXNrIHdpdGggaWQgJyR7dGhpcy50YXNrQ29udGVudFNlcnZpY2UudGFzay5zdHJpbmdJZH0nIGhhcyBhIGRhdGEgZ3JvdXAgd2l0aCBsZWdhY3kgbGF5b3V0IHdpdGggYSBgXG4gICAgICAgICAgICAgICAgKyBgbm9uLWRlZmF1bHQgbnVtYmVyIG9mIGNvbHVtbnMuIElmIHlvdSB3YW50IHRvIHVzZSBhIGxheW91dCB3aXRoIGRpZmZlcmVudCBudW1iZXIgb2YgY29sdW1ucyB0aGFuIDIgdXNlIGEgZGlmZmVyZW50IGBcbiAgICAgICAgICAgICAgICArIGBsYXlvdXQgdHlwZSBpbnN0ZWFkLmApO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5mbG93RmllbGRzKGRhdGFHcm91cCwgc3ViZ3JpZCwgMik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTGF5cyBvdXQgdGhlIGZpZWxkcyBmcm9tIGxlZnQgdG8gcmlnaHQsIGZyb20gdG9wIHRvIGJvdHRvbS4gSWYgdGhlIHdpZHRoIGlzIGdyZWF0ZXIgdGhhbiAxIGFuZCB0aGUgYmxvY2sgb2YgZmxvd2VkIGZpZWxkcyBkb2Vzbid0IGZpdFxuICAgICAqIG5lYXRseSBpbnRvIHRoZSBjb2x1bW5zIChpZiB0aGUgd2lkdGggb2YgYSBzaW5nbGUgZmllbGQgaXMgbm90IGEgZGl2aXNvciBvZiBjb2x1bW4gY291bnQpLCB0aGVuIHRoZSBlbnRpcmUgYmxvY2sgb2YgZmllbGRzIGlzXG4gICAgICogbGVmdCBhbGlnbmVkLiBUaGUgbGFzdCByb3cgb2YgZmllbGRzIGlzIGFsaWduZWQgdG8gdGhlIGxlZnQsIGNlbnRlciBvciByaWdodCBiYXNlZCBvbiB0aGUgZGF0YSBncm91cHMgcHJvcGVydHkuXG4gICAgICogSWYgdGhlIGxhc3Qgcm93IGNhbm5vdCBiZSBhbGlnbmVkIHRvIHRoZSBleGFjdCBjZW50ZXIgaXQgaXMgb2Zmc2V0IG9uZSBncmlkIHRpbGUgdG8gdGhlIGxlZnQuXG4gICAgICogQHBhcmFtIGRhdGFHcm91cCB0aGUgZGF0YSBncm91cCB0aGF0IHNob3VsZCBiZSBsYWlkIG91dCBpbnRvIGEgZ3JpZFxuICAgICAqIEBwYXJhbSBzdWJncmlkIHRoZSBvYmplY3QgdGhhdCBob2xkcyB0aGUgY29udGV4dCBvZiB0aGUgY29tcHV0ZWQgbGF5b3V0aW5nIHVuaXRcbiAgICAgKiBAcGFyYW0gZmllbGRXaWR0aCB0aGUgbnVtYmVyIG9mIGdyaWQgdGlsZXMsIHRoYXQgc2hvdWxkIGJlIG9jY3VwaWVkIGJ5IGVhY2ggZmllbGRcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZmxvd0ZpZWxkcyhkYXRhR3JvdXA6IERhdGFHcm91cCwgc3ViZ3JpZDogU3ViZ3JpZCwgZmllbGRXaWR0aDogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IGZpZWxkc1BlclJvdyA9IE1hdGguZmxvb3Ioc3ViZ3JpZC5jb2xzIC8gZmllbGRXaWR0aCk7XG4gICAgICAgIGNvbnN0IG1heFhQb3NpdGlvbiA9IGZpZWxkV2lkdGggKiAoZmllbGRzUGVyUm93IC0gMSk7XG5cbiAgICAgICAgbGV0IHhQb3NpdGlvbiA9IDA7XG4gICAgICAgIGNvbnN0IGxvY2FsR3JpZDogQXJyYXk8QXJyYXk8c3RyaW5nPj4gPSBbXTtcbiAgICAgICAgZGF0YUdyb3VwLmZpZWxkcy5mb3JFYWNoKChkYXRhRmllbGQsIGRhdGFGaWVsZENvdW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmaWVsZEVsZW1lbnQgPSBzdWJncmlkLmFkZEZpZWxkKGRhdGFGaWVsZCwgdGhpcy5fZmllbGRDb252ZXJ0ZXIucmVzb2x2ZVR5cGUoZGF0YUZpZWxkKSk7XG4gICAgICAgICAgICBpZiAoZGF0YUdyb3VwLnN0cmV0Y2gpIHtcbiAgICAgICAgICAgICAgICBzdWJncmlkLmFkZFJvdyh0aGlzLm5ld0dyaWRSb3coc3ViZ3JpZC5jb2xzLCBmaWVsZEVsZW1lbnQuZ3JpZEFyZWFJZCkpO1xuICAgICAgICAgICAgICAgIHJldHVybjsgLy8gY29udGludWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGVsc2VcbiAgICAgICAgICAgIGlmICh4UG9zaXRpb24gPT09IDApIHtcbiAgICAgICAgICAgICAgICBsb2NhbEdyaWQucHVzaCh0aGlzLm5ld0dyaWRSb3coc3ViZ3JpZC5jb2xzKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoeFBvc2l0aW9uID09PSAwICYmIHRoaXMuaXNMYXN0Um93KGRhdGFGaWVsZENvdW50LCBkYXRhR3JvdXAsIGZpZWxkc1BlclJvdykpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmaWVsZHNJbkxhc3RSb3cgPSBkYXRhR3JvdXAuZmllbGRzLmxlbmd0aCAlIGZpZWxkc1BlclJvdztcbiAgICAgICAgICAgICAgICBjb25zdCByb3dXaWR0aCA9IG1heFhQb3NpdGlvbiArIGZpZWxkV2lkdGg7XG4gICAgICAgICAgICAgICAgaWYgKGRhdGFHcm91cC5hbGlnbm1lbnQgPT09IERhdGFHcm91cEFsaWdubWVudC5FTkQpIHtcbiAgICAgICAgICAgICAgICAgICAgeFBvc2l0aW9uID0gcm93V2lkdGggLSBmaWVsZFdpZHRoICogZmllbGRzSW5MYXN0Um93O1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGF0YUdyb3VwLmFsaWdubWVudCA9PT0gRGF0YUdyb3VwQWxpZ25tZW50LkNFTlRFUikge1xuICAgICAgICAgICAgICAgICAgICB4UG9zaXRpb24gPSBNYXRoLmZsb29yKChyb3dXaWR0aCAtIGZpZWxkc0luTGFzdFJvdyAqIGZpZWxkV2lkdGgpIC8gMik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5vY2N1cHlTcGFjZShsb2NhbEdyaWQsIGxvY2FsR3JpZC5sZW5ndGggLSAxLCB4UG9zaXRpb24sIGZpZWxkV2lkdGgsIGZpZWxkRWxlbWVudC5ncmlkQXJlYUlkKTtcblxuICAgICAgICAgICAgeFBvc2l0aW9uICs9IGZpZWxkV2lkdGg7XG4gICAgICAgICAgICBpZiAoeFBvc2l0aW9uID4gbWF4WFBvc2l0aW9uKSB7XG4gICAgICAgICAgICAgICAgeFBvc2l0aW9uID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGxvY2FsR3JpZC5mb3JFYWNoKHJvdyA9PiBzdWJncmlkLmFkZFJvdyhyb3cpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gd2lkdGggd2lkdGggb2YgdGhlIHJvd1xuICAgICAqIEBwYXJhbSBjb250ZW50IHRoZSB2YWx1ZSB0aGF0IHNob3VsZCBiZSB1c2VkIHRvIGZpbGwgYWxsIGVsZW1lbnRzIGluIHRoZSByb3dcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgbmV3R3JpZFJvdyh3aWR0aDogbnVtYmVyLCBjb250ZW50ID0gJycpOiBBcnJheTxzdHJpbmc+IHtcbiAgICAgICAgcmV0dXJuIEFycmF5KHdpZHRoKS5maWxsKGNvbnRlbnQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpbGxzIHRoZSBzcGVjaWZpZWQgcmVjdGFuZ3VsYXIgYXJlYSB3aXRoIHRoZSBzcGVjaWZpZWQgdmFsdWUgaW4gdGhlIHByb3ZpZGVkIGdyaWQuXG4gICAgICpcbiAgICAgKiBJZiB0aGUgc3BlY2lmaWVkIGFyZWEgY29udGFpbnMgdmFsdWVzIG90aGVyIHRoYW4gdGhlIGVtcHR5IHN0cmluZyBhbiBlcnJvciB3aWxsIGJlIHRocm93bi5cbiAgICAgKiBAcGFyYW0gZ3JpZCB0aGUgZ3JpZCB0aGF0IHNob3VsZCBiZSBtb2RpZmllZFxuICAgICAqIEBwYXJhbSB5IHRoZSAwIGJhc2VkIHJvdyBpbmRleCBvZiB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBmaWxsZWQgYXJlYVxuICAgICAqIEBwYXJhbSB4IHRoZSAwIGJhc2VkIGNvbHVtbiBpbmRleCBvZiB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBmaWxsZWQgYXJlYVxuICAgICAqIEBwYXJhbSB3aWR0aCB0aGUgd2lkdGggb2YgdGhlIGZpbGxlZCBhcmVhXG4gICAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0aGF0IGlzIHNldCBpbnRvIGV2ZXJ5IGNlbGwgb2YgdGhlIGdyaWQgaW5zaWRlIHRoZSBzcGVjaWZpZWQgYXJlYVxuICAgICAqIEBwYXJhbSBoZWlnaHQgdGhlIGhlaWdodCBvZiB0aGUgZmlsbGVkIGFyZWFcbiAgICAgKiBAcGFyYW0gY2hlY2tPY2N1cGFudHMgd2hldGhlciB0aGUgZmlsbGVkIGFyZWEgc2hvdWxkIGJlIGNoZWNrZWQgZm9yIG90aGVyIGVsZW1lbnRzLlxuICAgICAqIElmIGEgY2hlY2sgaXMgcGVyZm9ybWVkIGFuIGVycm9yIHdpbGwgYmUgdGhyb3duIGlmIGVsZW1lbnRzIGFyZSBmb3VuZC5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgb2NjdXB5U3BhY2UoZ3JpZDogQXJyYXk8QXJyYXk8c3RyaW5nPj4sIHk6IG51bWJlciwgeDogbnVtYmVyLCB3aWR0aDogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogc3RyaW5nLCBoZWlnaHQgPSAxLCBjaGVja09jY3VwYW50cyA9IHRydWUpIHtcbiAgICAgICAgZm9yIChsZXQgaiA9IHk7IGogPCB5ICsgaGVpZ2h0OyBqKyspIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSB4OyBpIDwgeCArIHdpZHRoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoY2hlY2tPY2N1cGFudHMgJiYgZ3JpZFtqXVtpXSAhPT0gJycpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgcGxhY2UgZWxlbWVudCAke3ZhbHVlfSBpbnRvIHRoZSBncmlkIGxheW91dCwgYmVjYXVzZSBpdCdzIHNwYWNlICh4OiAke2l9LCB5OiAke2p9KWAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYCBpcyBhbHJlYWR5IG9jY3VwaWVkIGJ5IGFub3RoZXIgZWxlbWVudCAoJHtncmlkW2pdW2ldfSlgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZ3JpZFtqXVtpXSA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIGluZGV4IHRoZSBpbmRleCBvZiB0aGUgY2hlY2tlZCBlbGVtZW50IHdpdGhpbiBpdHMgZGF0YSBncm91cFxuICAgICAqIEBwYXJhbSBkYXRhR3JvdXAgdGhlIGNoZWNrZWQgZGF0YSBncm91cFxuICAgICAqIEBwYXJhbSBmaWVsZHNQZXJSb3cgdGhlIG51bWJlciBvZiBmaWVsZHMgdGhhdCBpcyByZXF1aXJlZCB0byBmaWxsIGFuIGVudGlyZSByb3dcbiAgICAgKiBAcmV0dXJucyB3aGV0aGVyIHRoZSBmaWVsZCBhdCB0aGUgZ2l2ZW4gaW5kZXggaXMgd2l0aGluIHRoZSBsYXN0IHJvdyBvZiBlbGVtZW50cyBvZiB0aGUgcHJvdmlkZWQgZGF0YSBncm91cC5cbiAgICAgKiBOb3RlIHRoYXQgaWYgdGhlIGxhc3Qgcm93IGNvbnRhaW5zIGVub3VnaCBlbGVtZW50cyB0byBiZSBjb21wbGV0ZWx5IGZpbGxlZCB0aGlzIG1ldGhvZCByZXR1cm5zIGBmYWxzZWAuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGlzTGFzdFJvdyhpbmRleDogbnVtYmVyLCBkYXRhR3JvdXA6IERhdGFHcm91cCwgZmllbGRzUGVyUm93OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGluZGV4ICsgZmllbGRzUGVyUm93ID49IGRhdGFHcm91cC5maWVsZHMubGVuZ3RoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlc3Ryb3lzIHRoZSBwcmV2aW91cyBjb250ZW50IGFuZCBwdXNoZXMgdGhlIG5ldyBjb250ZW50IGludG8gdGhlIHN0cmVhbVxuICAgICAqIEBwYXJhbSBjb250ZW50IHRoZSBuZXcgY29udGVudFxuICAgICAqL1xuICAgIHByb3RlY3RlZCByZW5kZXJDb250ZW50KGNvbnRlbnQ6IEFycmF5PFN1YmdyaWQ+ID0gW10pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fZGF0YVNvdXJjZSQudmFsdWUuZm9yRWFjaChzdWJncmlkID0+IHN1YmdyaWQuZGVzdHJveSgpKTtcbiAgICAgICAgdGhpcy5fZGF0YVNvdXJjZSQubmV4dChjb250ZW50KTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgY3JlYXRlU3ViZ3JpZElkKGRhdGFHcm91cDogRGF0YUdyb3VwKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IGlkQmFzZTogc3RyaW5nO1xuICAgICAgICBpZiAoZGF0YUdyb3VwLnBhcmVudFRhc2tJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBpZEJhc2UgPSBbZGF0YUdyb3VwLnBhcmVudFRhc2tJZCwgZGF0YUdyb3VwLnBhcmVudFRhc2tSZWZJZCwgZGF0YUdyb3VwLm5lc3RpbmdMZXZlbF0uam9pbignIycpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWRCYXNlID0gJ3Jvb3QnO1xuICAgICAgICB9XG4gICAgICAgIGxldCBpZCA9IGlkQmFzZTtcbiAgICAgICAgd2hpbGUgKHRoaXMuX2V4aXN0aW5nU3ViZ3JpZElkcy5oYXMoaWQpKSB7XG4gICAgICAgICAgICBpZCA9IGlkQmFzZSArIHRoaXMuX3N1YmdyaWRJZENvdW50ZXIubmV4dCgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2V4aXN0aW5nU3ViZ3JpZElkcy5hZGQoaWQpO1xuICAgICAgICByZXR1cm4gaWQ7XG4gICAgfVxuXG4gICAgcHVibGljIHRyYWNrQnlTdWJncmlkRm4gPSAoaW5kZXg6IG51bWJlciwgc3ViZ3JpZDogU3ViZ3JpZCkgPT4gc3ViZ3JpZC5zdWJncmlkSWQ7XG5cbiAgICBwdWJsaWMgdHJhY2tCeUZuID0gKGluZGV4OiBudW1iZXIsIGVsZW1lbnQ6IERhdGFmaWVsZEdyaWRMYXlvdXRFbGVtZW50KSA9PiB0aGlzLnRyYWNrQnlEYXRhZmllbGRzKGluZGV4LCBlbGVtZW50KTtcblxuICAgIHByb3RlY3RlZCB0cmFja0J5RGF0YWZpZWxkcyhpbmRleDogbnVtYmVyLCBlbGVtZW50OiBEYXRhZmllbGRHcmlkTGF5b3V0RWxlbWVudCkge1xuICAgICAgICBzd2l0Y2ggKGVsZW1lbnQudHlwZSkge1xuICAgICAgICAgICAgY2FzZSBUYXNrRWxlbWVudFR5cGUuQkxBTks6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuZ3JpZEFyZWFJZCArICctJyArIHRoaXMudGFza0NvbnRlbnRTZXJ2aWNlLiRzaG91bGRDcmVhdGVDb3VudGVyLmdldFZhbHVlKCk7XG4gICAgICAgICAgICBjYXNlIFRhc2tFbGVtZW50VHlwZS5MT0FERVI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuZ3JpZEFyZWFJZCArICctTC0nICsgdGhpcy50YXNrQ29udGVudFNlcnZpY2UuJHNob3VsZENyZWF0ZUNvdW50ZXIuZ2V0VmFsdWUoKTtcbiAgICAgICAgICAgIGNhc2UgVGFza0VsZW1lbnRUeXBlLkRBVEFfR1JPVVBfVElUTEU6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQudGl0bGUgKyAnLScgKyB0aGlzLnRhc2tDb250ZW50U2VydmljZS4kc2hvdWxkQ3JlYXRlQ291bnRlci5nZXRWYWx1ZSgpO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudC5pdGVtLnN0cmluZ0lkICsgJy0nICsgdGhpcy50YXNrQ29udGVudFNlcnZpY2UuJHNob3VsZENyZWF0ZUNvdW50ZXIuZ2V0VmFsdWUoKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiJdfQ==
808
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3QtdGFzay1jb250ZW50LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25ldGdyaWYtY29tcG9uZW50cy1jb3JlL3NyYy9saWIvdGFzay1jb250ZW50L3Rhc2stY29udGVudC9hYnN0cmFjdC10YXNrLWNvbnRlbnQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQWEsUUFBUSxFQUFFLE1BQU0sRUFBQyxNQUFNLGVBQWUsQ0FBQztBQVFsRyxPQUFPLEVBQVksa0JBQWtCLEVBQTZCLE1BQU0sdUNBQXVDLENBQUM7QUFDaEgsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9DQUFvQyxDQUFDO0FBRW5FLE9BQU8sRUFDSCxnQkFBZ0IsRUFDaEIsc0JBQXNCLEVBRXRCLG1CQUFtQixFQUN0QixNQUFNLDZDQUE2QyxDQUFDO0FBQ3JELE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSwyQ0FBMkMsQ0FBQztBQUN6RSxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSw4QkFBOEIsQ0FBQztBQUMvRCxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sK0JBQStCLENBQUM7QUFDN0QsT0FBTyxFQUFDLGVBQWUsRUFBMkIsTUFBTSxNQUFNLENBQUM7QUFDL0QsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ25DLE9BQU8sRUFBQyxpQ0FBaUMsRUFBQyxNQUFNLHdEQUF3RCxDQUFDO0FBRXpHLE9BQU8sRUFBQyx5QkFBeUIsRUFBQyxNQUFNLHFFQUFxRSxDQUFDO0FBQzlHLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSx1REFBdUQsQ0FBQztBQUNuRixPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSw0REFBNEQsQ0FBQztBQUU3RixPQUFPLEVBQUMsT0FBTyxFQUFD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LElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNoRyxLQUFLLGVBQWUsQ0FBQyxnQkFBZ0I7Z0JBQ2pDLE9BQU8sT0FBTyxDQUFDLEtBQUssR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLG9CQUFvQixDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3pGO2dCQUNJLE9BQU8sT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLEVBQUUsQ0FBQztTQUNwRztJQUNMLENBQUM7OzBIQTkzQmlCLDRCQUE0QixzTUE0RUosaUNBQWlDOzhHQTVFekQsNEJBQTRCLDhNQUZwQyxFQUFFOzRGQUVNLDRCQUE0QjtrQkFKakQsU0FBUzttQkFBQztvQkFDUCxRQUFRLEVBQUUsMkJBQTJCO29CQUNyQyxRQUFRLEVBQUUsRUFBRTtpQkFDZjs7MEJBNEUwQixRQUFROzswQkFDUixRQUFROzswQkFBSSxNQUFNOzJCQUFDLGlDQUFpQzs0Q0E1Q2xFLFVBQVU7c0JBQWxCLEtBQUs7Z0JBTUcsVUFBVTtzQkFBbEIsS0FBSztnQkFNRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBSUksU0FBUztzQkFBbEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIEluamVjdCwgSW5wdXQsIE9uRGVzdHJveSwgT3B0aW9uYWwsIE91dHB1dH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0RhdGFmaWVsZEdyaWRMYXlvdXRFbGVtZW50fSBmcm9tICcuLi9tb2RlbC9kYXRhZmllbGQtZ3JpZC1sYXlvdXQtZWxlbWVudCc7XG5pbXBvcnQge0ZpZWxkQ29udmVydGVyU2VydmljZX0gZnJvbSAnLi4vc2VydmljZXMvZmllbGQtY29udmVydGVyLnNlcnZpY2UnO1xuaW1wb3J0IHtUYXNrQ29udGVudFNlcnZpY2V9IGZyb20gJy4uL3NlcnZpY2VzL3Rhc2stY29udGVudC5zZXJ2aWNlJztcbmltcG9ydCB7UGFwZXJWaWV3U2VydmljZX0gZnJvbSAnLi4vLi4vbmF2aWdhdGlvbi9xdWljay1wYW5lbC9jb21wb25lbnRzL3BhcGVyLXZpZXcuc2VydmljZSc7XG5pbXBvcnQge0xvZ2dlclNlcnZpY2V9IGZyb20gJy4uLy4uL2xvZ2dlci9zZXJ2aWNlcy9sb2dnZXIuc2VydmljZSc7XG5pbXBvcnQge1Rhc2tFdmVudE5vdGlmaWNhdGlvbn0gZnJvbSAnLi4vbW9kZWwvdGFzay1ldmVudC1ub3RpZmljYXRpb24nO1xuaW1wb3J0IHtUYXNrRXZlbnRTZXJ2aWNlfSBmcm9tICcuLi9zZXJ2aWNlcy90YXNrLWV2ZW50LnNlcnZpY2UnO1xuaW1wb3J0IHtEYXRhR3JvdXAsIERhdGFHcm91cEFsaWdubWVudCwgUGFyZW50RGF0YUdyb3VwSW5mb3JtYXRpb259IGZyb20gJy4uLy4uL3Jlc291cmNlcy9pbnRlcmZhY2UvZGF0YS1ncm91cHMnO1xuaW1wb3J0IHtUYXNrRWxlbWVudFR5cGV9IGZyb20gJy4uL21vZGVsL3Rhc2stY29udGVudC1lbGVtZW50LXR5cGUnO1xuaW1wb3J0IHtEYXRhRmllbGR9IGZyb20gJy4uLy4uL2RhdGEtZmllbGRzL21vZGVscy9hYnN0cmFjdC1kYXRhLWZpZWxkJztcbmltcG9ydCB7XG4gICAgRGF0YUdyb3VwQ29tcGFjdCxcbiAgICBEYXRhR3JvdXBIaWRlRW1wdHlSb3dzLFxuICAgIERhdGFHcm91cExheW91dCxcbiAgICBEYXRhR3JvdXBMYXlvdXRUeXBlXG59IGZyb20gJy4uLy4uL3Jlc291cmNlcy9pbnRlcmZhY2UvZGF0YS1ncm91cC1sYXlvdXQnO1xuaW1wb3J0IHtGaWVsZEFsaWdubWVudH0gZnJvbSAnLi4vLi4vcmVzb3VyY2VzL2ludGVyZmFjZS9maWVsZC1hbGlnbm1lbnQnO1xuaW1wb3J0IHtGaWVsZFR5cGVSZXNvdXJjZX0gZnJvbSAnLi4vbW9kZWwvZmllbGQtdHlwZS1yZXNvdXJjZSc7XG5pbXBvcnQge0xvYWRpbmdFbWl0dGVyfSBmcm9tICcuLi8uLi91dGlsaXR5L2xvYWRpbmctZW1pdHRlcic7XG5pbXBvcnQge0JlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9ufSBmcm9tICdyeGpzJztcbmltcG9ydCB7bWFwfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge05BRV9BU1lOQ19SRU5ERVJJTkdfQ09ORklHVVJBVElPTn0gZnJvbSAnLi4vbW9kZWwvYXN5bmMtcmVuZGVyaW5nLWNvbmZpZ3VyYXRpb24taW5qZWN0aW9uLXRva2VuJztcbmltcG9ydCB7QXN5bmNSZW5kZXJpbmdDb25maWd1cmF0aW9ufSBmcm9tICcuLi9tb2RlbC9hc3luYy1yZW5kZXJpbmctY29uZmlndXJhdGlvbic7XG5pbXBvcnQge1Rhc2tSZWZEYXNoYm9hcmRDb25zdGFudHN9IGZyb20gJy4uLy4uL2RhdGEtZmllbGRzL3Rhc2stcmVmLWZpZWxkL21vZGVsL3Rhc2stcmVmLWRhc2hib2FyZC1jb25zdGFudHMnO1xuaW1wb3J0IHtUYXNrUmVmRmllbGR9IGZyb20gJy4uLy4uL2RhdGEtZmllbGRzL3Rhc2stcmVmLWZpZWxkL21vZGVsL3Rhc2stcmVmLWZpZWxkJztcbmltcG9ydCB7VGFza1JlZkNvbXBvbmVudHN9IGZyb20gJy4uLy4uL2RhdGEtZmllbGRzL3Rhc2stcmVmLWZpZWxkL21vZGVsL3Rhc2stcmVmLWNvbXBvbmVudHMnO1xuaW1wb3J0IHtTcGxpdERhdGFHcm91cH0gZnJvbSAnLi4vbW9kZWwvc3BsaXQtZGF0YS1ncm91cCc7XG5pbXBvcnQge1N1YmdyaWR9IGZyb20gJy4uL21vZGVsL3N1YmdyaWQnO1xuaW1wb3J0IHtJbmNyZW1lbnRpbmdDb3VudGVyfSBmcm9tICcuLi8uLi91dGlsaXR5L2luY3JlbWVudGluZy1jb3VudGVyJztcbmltcG9ydCB7UHJlcHJvY2Vzc2VkRGF0YUdyb3Vwc30gZnJvbSAnLi4vbW9kZWwvcHJlcHJvY2Vzc2VkLWRhdGEtZ3JvdXBzJztcbmltcG9ydCB7VGFza1JlZkRhc2hib2FyZFRpbGV9IGZyb20gJy4uLy4uL2RhdGEtZmllbGRzL3Rhc2stcmVmLWZpZWxkL21vZGVsL3Rhc2stcmVmLWRhc2hib2FyZC10aWxlJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICduY2MtYWJzdHJhY3QtdGFzay1jb250ZW50JyxcbiAgICB0ZW1wbGF0ZTogJydcbn0pXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RUYXNrQ29udGVudENvbXBvbmVudCBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gICAgcmVhZG9ubHkgREVGQVVMVF9MQVlPVVRfVFlQRSA9IERhdGFHcm91cExheW91dFR5cGUuTEVHQUNZO1xuICAgIHJlYWRvbmx5IERFRkFVTFRfRklFTERfQUxJR05NRU5UID0gRmllbGRBbGlnbm1lbnQuQ0VOVEVSO1xuICAgIHJlYWRvbmx5IERFRkFVTFRfQVNZTkNfUkVOREVSSU5HX0NPTkZJR1VSQVRJT046IEFzeW5jUmVuZGVyaW5nQ29uZmlndXJhdGlvbiA9IHtcbiAgICAgICAgYmF0Y2hTaXplOiA0LFxuICAgICAgICBiYXRjaERlbGF5OiAyMDAsXG4gICAgICAgIG51bWJlck9mUGxhY2Vob2xkZXJzOiA0LFxuICAgICAgICBlbmFibGVBc3luY1JlbmRlcmluZ0Zvck5ld0ZpZWxkczogdHJ1ZSxcbiAgICAgICAgZW5hYmxlQXN5bmNSZW5kZXJpbmdPblRhc2tFeHBhbmQ6IHRydWVcbiAgICB9O1xuICAgIHJlYWRvbmx5IERFRkFVTFRfQ09NUEFDVF9ESVJFQ1RJT04gPSBEYXRhR3JvdXBDb21wYWN0Lk5PTkU7XG4gICAgcmVhZG9ubHkgREVGQVVMVF9ISURFX0VNUFRZX1JPV1MgPSBEYXRhR3JvdXBIaWRlRW1wdHlSb3dzLkFMTDtcblxuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyB3aGV0aGVyIGRhdGEgaXMgYmVpbmcgbG9hZGVkIGZyb20gYmFja2VuZCwgb3IgaWYgaXQgaXMgYmVpbmcgcHJvY2Vzc2VkLlxuICAgICAqL1xuICAgIGxvYWRpbmckOiBMb2FkaW5nRW1pdHRlcjtcbiAgICAvKipcbiAgICAgKiBFbWl0cyBgdHJ1ZWAgaWYgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGRhdGEgZmllbGQsIHRoYXQgc2hvdWxkIGJlIGRpc3BsYXllZC4gRW1pdHMgYGZhbHNlYCBvdGhlcndpc2UuXG4gICAgICovXG4gICAgaGFzRGF0YVRvRGlzcGxheSQ6IE9ic2VydmFibGU8Ym9vbGVhbj47XG5cbiAgICAvKipcbiAgICAgKiBFeGlzdHMgdG8gYWxsb3cgcmVmZXJlbmNlcyB0byB0aGUgZW51bSBpbiB0aGUgSFRNTFxuICAgICAqL1xuICAgIHB1YmxpYyBmaWVsZFR5cGVSZXNvdXJjZSA9IEZpZWxkVHlwZVJlc291cmNlO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHRyYW5zbGF0ZSB0ZXh0IHRoYXQgc2hvdWxkIGJlIGRpc3BsYXllZCB3aGVuIHRoZSB0YXNrIGNvbnRhaW5zIG5vIGRhdGEuXG4gICAgICpcbiAgICAgKiBJZiBhIGZhbHN5IHZhbHVlIGlzIHByb3ZpZGVkIHRoZSBkZWZhdWx0IHRleHQgaXMgZGlzcGxheWVkXG4gICAgICovXG4gICAgQElucHV0KCkgbm9EYXRhVGV4dDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBpY29uIHRoYXQgc2hvdWxkIGJlIGRpc3BsYXllZCB3aGVuIHRoZSB0YXNrIGNvbnRhaW5zIG5vIGRhdGEuXG4gICAgICpcbiAgICAgKiBJZiBhIGZhbHN5IHZhbHVlIGlzIHByb3ZpZGVkIHRoZSBkZWZhdWx0IGljb24gaXMgZGlzcGxheWVkXG4gICAgICovXG4gICAgQElucHV0KCkgbm9EYXRhSWNvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgYW4gaWNvbiBzaG91bGQgYmUgZGlzcGxheWVkIHdoZW4gdGhlIG5vIGRhdGEgbWVzc2FnZSBpcyBzaG93bi5cbiAgICAgKlxuICAgICAqIEFuIGljb24gaXMgZGlzcGxheWVkIGJ5IGRlZmF1bHRcbiAgICAgKi9cbiAgICBASW5wdXQoKSBkaXNwbGF5Tm9EYXRhSWNvbiA9IHRydWU7XG4gICAgLyoqXG4gICAgICogRW1pdHMgbm90aWZpY2F0aW9ucyBhYm91dCB0YXNrIGV2ZW50c1xuICAgICAqL1xuICAgIEBPdXRwdXQoKSB0YXNrRXZlbnQ6IEV2ZW50RW1pdHRlcjxUYXNrRXZlbnROb3RpZmljYXRpb24+O1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRhIGZpZWxkcyB0aGF0IGFyZSBjdXJyZW50bHkgZGlzcGxheWVkXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9kYXRhU291cmNlJDogQmVoYXZpb3JTdWJqZWN0PEFycmF5PFN1YmdyaWQ+PjtcbiAgICBwcm90ZWN0ZWQgX3N1YlRhc2tDb250ZW50OiBTdWJzY3JpcHRpb247XG4gICAgcHJvdGVjdGVkIF9zdWJUYXNrRXZlbnQ6IFN1YnNjcmlwdGlvbjtcbiAgICBwcm90ZWN0ZWQgX2FzeW5jUmVuZGVyaW5nQ29uZmlnOiBBc3luY1JlbmRlcmluZ0NvbmZpZ3VyYXRpb247XG4gICAgcHJvdGVjdGVkIF9hc3luY1JlbmRlclRpbWVvdXQ6IG51bWJlcjtcblxuICAgIHByb3RlY3RlZCBfZGVmYXVsdEFsaWdubWVudDogRmllbGRBbGlnbm1lbnQ7XG4gICAgcHJvdGVjdGVkIF9kZWZhdWx0Q29tcGFjdERpcmVjdGlvbjogRGF0YUdyb3VwQ29tcGFjdDtcbiAgICBwcm90ZWN0ZWQgX2RlZmF1bHRIaWRlRW1wdHlSb3dzOiBEYXRhR3JvdXBIaWRlRW1wdHlSb3dzO1xuICAgIHByb3RlY3RlZCBfZGVmYXVsdE51bWJlck9mQ29sczogbnVtYmVyO1xuXG4gICAgcHJvdGVjdGVkIF9zdWJncmlkSWRDb3VudGVyOiBJbmNyZW1lbnRpbmdDb3VudGVyO1xuICAgIHByb3RlY3RlZCBfZXhpc3RpbmdTdWJncmlkSWRzOiBTZXQ8c3RyaW5nPjtcblxuICAgIC8qKlxuICAgICAqIERlZmluZXMgdGhlIHJvdyBoZWlnaHQgb2Ygb25lIHJvdyBpbiB0YXNrIGNvbnRlbnRcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcm93SGVpZ2h0ID0gMTA1O1xuXG4gICAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBfZmllbGRDb252ZXJ0ZXI6IEZpZWxkQ29udmVydGVyU2VydmljZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHRhc2tDb250ZW50U2VydmljZTogVGFza0NvbnRlbnRTZXJ2aWNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX3BhcGVyVmlldzogUGFwZXJWaWV3U2VydmljZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIF9sb2dnZXI6IExvZ2dlclNlcnZpY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIEBPcHRpb25hbCgpIHByb3RlY3RlZCBfdGFza0V2ZW50U2VydmljZTogVGFza0V2ZW50U2VydmljZSA9IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIEBPcHRpb25hbCgpIEBJbmplY3QoTkFFX0FTWU5DX1JFTkRFUklOR19DT05GSUdVUkFUSU9OKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXN5bmNSZW5kZXJpbmdDb25maWd1cmF0aW9uOiBBc3luY1JlbmRlcmluZ0NvbmZpZ3VyYXRpb24gPSBudWxsKSB7XG4gICAgICAgIHRoaXMuX2FzeW5jUmVuZGVyaW5nQ29uZmlnID0gey4uLnRoaXMuREVGQVVMVF9BU1lOQ19SRU5ERVJJTkdfQ09ORklHVVJBVElPTn07XG4gICAgICAgIGlmIChhc3luY1JlbmRlcmluZ0NvbmZpZ3VyYXRpb24gIT09IG51bGwpIHtcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24odGhpcy5fYXN5bmNSZW5kZXJpbmdDb25maWcsIGFzeW5jUmVuZGVyaW5nQ29uZmlndXJhdGlvbik7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmxvYWRpbmckID0gbmV3IExvYWRpbmdFbWl0dGVyKHRydWUpO1xuICAgICAgICB0aGlzLl9kYXRhU291cmNlJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8QXJyYXk8U3ViZ3JpZD4+KFtdKTtcbiAgICAgICAgdGhpcy5oYXNEYXRhVG9EaXNwbGF5JCA9IHRoaXMuX2RhdGFTb3VyY2UkLnBpcGUobWFwKGRhdGEgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGRhdGEubGVuZ3RoICE9PSAwO1xuICAgICAgICB9KSk7XG5cbiAgICAgICAgdGhpcy5fc3ViVGFza0NvbnRlbnQgPSB0aGlzLnRhc2tDb250ZW50U2VydmljZS4kc2hvdWxkQ3JlYXRlLnN1YnNjcmliZShkYXRhID0+IHtcbiAgICAgICAgICAgIGlmIChkYXRhLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29tcHV0ZURlZmF1bHRMYXlvdXRDb25maWd1cmF0aW9uKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5jb21wdXRlTGF5b3V0RGF0YShkYXRhKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJDb250ZW50KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmxvYWRpbmckLm9mZigpO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHRoaXMuX3Rhc2tFdmVudFNlcnZpY2UgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMudGFza0V2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxUYXNrRXZlbnROb3RpZmljYXRpb24+KCk7XG4gICAgICAgICAgICB0aGlzLl9zdWJUYXNrRXZlbnQgPSBfdGFza0V2ZW50U2VydmljZS50YXNrRXZlbnROb3RpZmljYXRpb25zJC5zdWJzY3JpYmUoZXZlbnQgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMudGFza0V2ZW50LmVtaXQoZXZlbnQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5sb2FkaW5nJC5jb21wbGV0ZSgpO1xuICAgICAgICB0aGlzLl9kYXRhU291cmNlJC5jb21wbGV0ZSgpO1xuICAgICAgICB0aGlzLl9zdWJUYXNrQ29udGVudC51bnN1YnNjcmliZSgpO1xuICAgICAgICBpZiAodGhpcy50YXNrRXZlbnQpIHtcbiAgICAgICAgICAgIHRoaXMudGFza0V2ZW50LmNvbXBsZXRlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX3N1YlRhc2tFdmVudCkge1xuICAgICAgICAgICAgdGhpcy5fc3ViVGFza0V2ZW50LnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2FzeW5jUmVuZGVyVGltZW91dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuX2FzeW5jUmVuZGVyVGltZW91dCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHRhc2tJZCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy50YXNrQ29udGVudFNlcnZpY2UudGFzay5zdHJpbmdJZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGRhdGFTb3VyY2UoKTogQXJyYXk8U3ViZ3JpZD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZSQuZ2V0VmFsdWUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgYXMgc3BlY2lmaWVkIGJ5IHRoZSB0YXNrcyBsYXlvdXQgcHJvcGVydHksIG9yIDQgaWYgbm8gdmFsdWUgaXMgc3BlY2lmaWVkLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXROdW1iZXJPZkZvcm1Db2x1bW5zKCk6IG51bWJlciB7XG4gICAgICAgIGlmICghdGhpcy50YXNrQ29udGVudFNlcnZpY2UudGFza1xuICAgICAgICAgICAgfHwgIXRoaXMudGFza0NvbnRlbnRTZXJ2aWNlLnRhc2subGF5b3V0XG4gICAgICAgICAgICB8fCB0aGlzLnRhc2tDb250ZW50U2VydmljZS50YXNrLmxheW91dC5jb2xzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiA0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudGFza0NvbnRlbnRTZXJ2aWNlLnRhc2subGF5b3V0LmNvbHM7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgaXNQYXBlclZpZXcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYXBlclZpZXcucGFwZXJWaWV3O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBpdGVtIGFuIG9iamVjdCBjb250YWluaW5nIGdyaWQgZWxlbWVudCBpbmZvcm1hdGlvblxuICAgICAqIEByZXR1cm5zIHRoZSBBbmd1bGFyIGZsZXggbGF5b3V0cyBhbGlnbm1lbnQgcHJvcGVydHkgZm9yIGluZGl2aWR1YWwgZGF0YSBmaWVsZHMgYmFzZWQgb25cbiAgICAgKiB0aGUgbGF5b3V0IGNvbmZpZ3VyYXRpb24gc3BlY2lmaWVkIGJ5IHRoZSBwcm9jZXNzXG4gICAgICovXG4gICAgcHVibGljIGdldEl0ZW1BbGlnbm1lbnQoaXRlbTogRGF0YWZpZWxkR3JpZExheW91dEVsZW1lbnQpOiBzdHJpbmcge1xuICAgICAgICBpZiAoaXRlbS5hbGlnbm1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBpdGVtLmFsaWdubWVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZpZWxkQWxpZ25tZW50ID0gaXRlbS5pdGVtPy5sb2NhbExheW91dD8uYWxpZ25tZW50ID8/IHRoaXMuX2RlZmF1bHRBbGlnbm1lbnQ7XG5cbiAgICAgICAgbGV0IGFsaWdubWVudDtcbiAgICAgICAgc3dpdGNoIChmaWVsZEFsaWdubWVudCkge1xuICAgICAgICAgICAgY2FzZSBGaWVsZEFsaWdubWVudC5UT1A6XG4gICAgICAgICAgICAgICAgYWxpZ25tZW50ID0gJ3N0YXJ0JztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgRmllbGRBbGlnbm1lbnQuQ0VOVEVSOlxuICAgICAgICAgICAgICAgIGFsaWdubWVudCA9ICdjZW50ZXInO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBGaWVsZEFsaWdubWVudC5CT1RUT006XG4gICAgICAgICAgICAgICAgYWxpZ25tZW50ID0gJ2VuZCc7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBpdGVtLmFsaWdubWVudCA9ICdzcGFjZS1iZXR3ZWVuICcgKyBhbGlnbm1lbnQ7XG4gICAgICAgIHJldHVybiBpdGVtLmFsaWdubWVudDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb21wdXRlcyBjb21wb25lbnQgaGVpZ2h0IGlmIHRoZSByb3dzIGF0dHJpYnV0ZSBvZiB0YXNrIGxheW91dCBpcyBzZXQuXG4gICAgICovXG4gICAgcHVibGljIHJlc29sdmVDb250ZW50SGVpZ2h0Q3NzKCk6IHN0cmluZyB7XG4gICAgICAgIGlmICh0aGlzLnNjcm9sbGluZ05lZWRlZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50YXNrQ29udGVudFNlcnZpY2UudGFzay5sYXlvdXQucm93cyAqIHRoaXMucm93SGVpZ2h0ICsgJ3B4JztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAnMTAwJSc7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWNpZGVzIHdoZXRoZXIgdGhlcmUgaXMgYSBmaXhlZCBudW1iZXIgb2Ygcm93cyBhbmQgaXQgbmVlZC1zIHNjcm9sbGluZ1xuICAgICAqL1xuICAgIHB1YmxpYyBzY3JvbGxpbmdOZWVkZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnRhc2tDb250ZW50U2VydmljZS50YXNrXG4gICAgICAgICAgICAmJiAhIXRoaXMudGFza0NvbnRlbnRTZXJ2aWNlLnRhc2subGF5b3V0XG4gICAgICAgICAgICAmJiAhIXRoaXMudGFza0NvbnRlbnRTZXJ2aWNlLnRhc2subGF5b3V0LnJvd3NcbiAgICAgICAgICAgICYmIHRoaXMudGFza0NvbnRlbnRTZXJ2aWNlLnRhc2subGF5b3V0LnJvd3MgPiAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIHRoZSBkZWZhdWx0IGFsaWdubWVudCBmb3IgdGhlIGRpc3BsYXllZCB0YXNrIHRoYXQgY2FuIGJlIG92ZXJyaWRkZW4gYnkgZmllbGRzIGluZGl2aWR1YWwgcHJvcGVydHkuXG4gICAgICogSWYgdGUgdGFzayBzcGVjaWZpZXMgbm8gZGVmYXVsdCB2YWx1ZSB0aGUgW2dsb2JhbCBkZWZhdWx0XXtAbGluayBBYnN0cmFjdFRhc2tDb250ZW50Q29tcG9uZW50I0RFRkFVTFRfRklFTERfQUxJR05NRU5UfVxuICAgICAqIHZhbHVlIGlzIHJldHVybmVkLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBjb21wdXRlRGVmYXVsdExheW91dENvbmZpZ3VyYXRpb24oKSB7XG4gICAgICAgIHRoaXMuX2RlZmF1bHRBbGlnbm1lbnQgPSB0aGlzLnRhc2tDb250ZW50U2VydmljZS50YXNrPy5sYXlvdXQ/LmZpZWxkQWxpZ25tZW50ID8/IHRoaXMuREVGQVVMVF9GSUVMRF9BTElHTk1FTlQ7XG4gICAgICAgIHRoaXMuX2RlZmF1bHRDb21wYWN0RGlyZWN0aW9uID0gdGhpcy50YXNrQ29udGVudFNlcnZpY2UudGFzaz8ubGF5b3V0Py5jb21wYWN0RGlyZWN0aW9uID8/IHRoaXMuREVGQVVMVF9DT01QQUNUX0RJUkVDVElPTjtcbiAgICAgICAgdGhpcy5fZGVmYXVsdEhpZGVFbXB0eVJvd3MgPSB0aGlzLnRhc2tDb250ZW50U2VydmljZS50YXNrPy5sYXlvdXQ/LmhpZGVFbXB0eVJvd3MgPz8gdGhpcy5ERUZBVUxUX0hJREVfRU1QVFlfUk9XUztcbiAgICAgICAgdGhpcy5fZGVmYXVsdE51bWJlck9mQ29scyA9IHRoaXMuZ2V0TnVtYmVyT2ZGb3JtQ29sdW1ucygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbXB1dGVzIHRoZSBsYXlvdXQgZGF0YSBmb3IgdGhlIHRhc2tzIGdyaWQgbGF5b3V0IGFuZCBzZXRzIHRoZSByZXN1bHQgdG8gdGhlIHB1YmxpYyBwcm9wZXJ0aWVzXG4gICAgICogb2YgdGhpcyBjbGFzcyB0aGF0IGFyZSB0aGVuIGJvdW5kIHRvIEhUTUwuXG4gICAgICogQHBhcmFtIGRhdGFHcm91cHMgdGhlIGRhdGEgZ3JvdXBzIHRoYXQgc2hvdWxkIGJlIGxhaWQgb3V0XG4gICAgICovXG4gICAgcHVibGljIGNvbXB1dGVMYXlvdXREYXRhKGRhdGFHcm91cHM6IEFycmF5PERhdGFHcm91cD4pIHtcbiAgICAgICAgaWYgKCF0aGlzLnRhc2tDb250ZW50U2VydmljZS50YXNrKSB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlckNvbnRlbnQoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3N1YmdyaWRJZENvdW50ZXIgPSBuZXcgSW5jcmVtZW50aW5nQ291bnRlcigpO1xuICAgICAgICB0aGlzLl9leGlzdGluZ1N1YmdyaWRJZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgTWFwPHN0cmluZywgU3ViZ3JpZD4oKTtcblxuICAgICAgICBkYXRhR3JvdXBzID0gdGhpcy5wcmVwcm9jZXNzRGF0YUdyb3VwcyhkYXRhR3JvdXBzKTtcblxuICAgICAgICBjb25zdCBkZWZhdWx0TGF5b3V0ID0gdGhpcy50YXNrQ29udGVudFNlcnZpY2UudGFzay5sYXlvdXQgJiYgdGhpcy50YXNrQ29udGVudFNlcnZpY2UudGFzay5sYXlvdXQudHlwZVxuICAgICAgICAgICAgPyB0aGlzLnRhc2tDb250ZW50U2VydmljZS50YXNrLmxheW91dC50eXBlXG4gICAgICAgICAgICA6IHRoaXMuREVGQVVMVF9MQVlPVVRfVFlQRTtcblxuICAgICAgICBkYXRhR3JvdXBzLmZvckVhY2goZ3JvdXAgPT4ge1xuICAgICAgICAgICAgaWYgKCFncm91cC5sYXlvdXQpIHtcbiAgICAgICAgICAgICAgICBncm91cC5sYXlvdXQgPSB7cm93czogdW5kZWZpbmVkLCBjb2xzOiB1bmRlZmluZWQsIHR5cGU6IGRlZmF1bHRMYXlvdXR9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFncm91cC5sYXlvdXQudHlwZSkge1xuICAgICAgICAgICAgICAgIGdyb3VwLmxheW91dC50eXBlID0gZGVmYXVsdExheW91dDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3Qgc3ViZ3JpZCA9IG5ldyBTdWJncmlkKFxuICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlU3ViZ3JpZElkKGdyb3VwKSxcbiAgICAgICAgICAgICAgICBncm91cC5sYXlvdXQuY29scyA/PyB0aGlzLl9kZWZhdWx0TnVtYmVyT2ZDb2xzLFxuICAgICAgICAgICAgICAgIHRoaXMuX2FzeW5jUmVuZGVyaW5nQ29uZmlnXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBpZiAoZ3JvdXAudGl0bGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRpdGxlID0gc3ViZ3JpZC5hZGRUaXRsZShncm91cCk7XG4gICAgICAgICAgICAgICAgc3ViZ3JpZC5hZGRSb3codGhpcy5uZXdHcmlkUm93KHN1YmdyaWQuY29scywgdGl0bGUuZ3JpZEFyZWFJZCkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzd2l0Y2ggKGdyb3VwLmxheW91dC50eXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBEYXRhR3JvdXBMYXlvdXRUeXBlLkdSSUQ6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29tcHV0ZUdyaWRMYXlvdXQoZ3JvdXAsIHN1YmdyaWQpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIERhdGFHcm91cExheW91dFR5cGUuRkxPVzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21wdXRlRmxvd0xheW91dChncm91cCwgc3ViZ3JpZCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgRGF0YUdyb3VwTGF5b3V0VHlwZS5MRUdBQ1k6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29tcHV0ZUxlZ2FjeUxheW91dChncm91cCwgc3ViZ3JpZCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biB0YXNrIGxheW91dCB0eXBlICcke3RoaXMudGFza0NvbnRlbnRTZXJ2aWNlLnRhc2subGF5b3V0LnR5cGV9J2ApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzdWJncmlkLmZpbmFsaXplKCk7XG4gICAgICAgICAgICByZXN1bHQuc2V0KHN1YmdyaWQuc3ViZ3JpZElkLCBzdWJncmlkKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5yZW5kZXJGaWVsZHMocmVzdWx0KTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcmVuZGVyRmllbGRzKHN1YmdyaWRzOiBNYXA8c3RyaW5nLCBTdWJncmlkPikge1xuICAgICAgICBjb25zdCBzdWJncmlkc0FycmF5ID0gQXJyYXkuZnJvbShzdWJncmlkcy52YWx1ZXMoKSk7XG5cbiAgICAgICAgaWYgKCF0aGlzLl9hc3luY1JlbmRlcmluZ0NvbmZpZy5lbmFibGVBc3luY1JlbmRlcmluZ0Zvck5ld0ZpZWxkc1xuICAgICAgICAgICAgJiYgISh0aGlzLl9hc3luY1JlbmRlcmluZ0NvbmZpZy5lbmFibGVBc3luY1JlbmRlcmluZ09uVGFza0V4cGFuZCAmJiB0aGlzLnRhc2tDb250ZW50U2VydmljZS5pc0V4cGFuZGluZykpIHtcbiAgICAgICAgICAgIHN1YmdyaWRzQXJyYXkuZm9yRWFjaChzdWJncmlkID0+IHtcbiAgICAgICAgICAgICAgICBzdWJncmlkLmRpc3BsYXlBbGxGaWVsZHMoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJDb250ZW50KHN1YmdyaWRzQXJyYXkpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCEodGhpcy50YXNrQ29udGVudFNlcnZpY2UuaXNFeHBhbmRpbmcgJiYgdGhpcy5fYXN5bmNSZW5kZXJpbmdDb25maWcuZW5hYmxlQXN5bmNSZW5kZXJpbmdPblRhc2tFeHBhbmQpKSB7XG4gICAgICAgICAgICB0aGlzLl9kYXRhU291cmNlJC52YWx1ZS5mb3JFYWNoKG9sZFN1YmdyaWQgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChzdWJncmlkcy5oYXMob2xkU3ViZ3JpZC5zdWJncmlkSWQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHN1YmdyaWRzLmdldChvbGRTdWJncmlkLnN1YmdyaWRJZCkuZGV0ZXJtaW5lS2VwdEZpZWxkcyhvbGRTdWJncmlkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucmVuZGVyQ29udGVudChzdWJncmlkc0FycmF5KTtcbiAgICAgICAgdGhpcy5zcHJlYWRGaWVsZFJlbmRlcmluZ092ZXJUaW1lKHN1YmdyaWRzQXJyYXkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBzcHJlYWRGaWVsZFJlbmRlcmluZ092ZXJUaW1lKHN1YmdyaWRzOiBBcnJheTxTdWJncmlkPiwgaXRlcmF0aW9uID0gMCkge1xuICAgICAgICB0aGlzLl9hc3luY1JlbmRlclRpbWVvdXQgPSB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChpdGVyYXRpb24gPCBzdWJncmlkcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuX2FzeW5jUmVuZGVyVGltZW91dCA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICBzdWJncmlkc1tpdGVyYXRpb25dLnJlbmRlckNvbnRlbnRPdmVyVGltZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3ByZWFkRmllbGRSZW5kZXJpbmdPdmVyVGltZShzdWJncmlkcywgaXRlcmF0aW9uICsgMSk7XG4gICAgICAgICAgICAgICAgfSwgaXRlcmF0aW9uID09PSAwKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xvbmVzIHRoZSBjb250ZW50IG9mIHRoZSBkYXRhIGdyb3VwcyB0byBwcmV2ZW50IHVuaW50ZW50aW9uYWwgbWVtb3J5IGFjY2Vzc2VzIHRvIHNvdXJjZSBkYXRhLlxuICAgICAqIFJlYXJyYW5nZXMgdGhlIGRhdGEgZ3JvdXBzIHRvIGFjY29tbW9kYXRlIHRhc2tyZWZzLiBGaWx0ZXJzIG91dCBoaWRkZW4gYW5kIGZvcmJpZGRlbiBmaWVsZHMuXG4gICAgICogUG9wdWxhdGVzIGRhc2hib2FyZCB0YXNrIHJlZiBmaWVsZHMgd2l0aCBkYXNoYm9hcmQgdGlsZSBkYXRhLlxuICAgICAqIEBwYXJhbSBkYXRhR3JvdXBzXG4gICAgICogQHJldHVybnMgdGhlIHByZXByb2Nlc3NlZCBkYXRhIGdyb3Vwc1xuICAgICAqL1xuICAgIHByb3RlY3RlZCBwcmVwcm9jZXNzRGF0YUdyb3VwcyhkYXRhR3JvdXBzOiBBcnJheTxEYXRhR3JvdXA+KTogQXJyYXk8RGF0YUdyb3VwPiB7XG4gICAgICAgIGNvbnN0IHJlYXJyYW5nZVJlc3VsdCA9IHRoaXMucmVhcnJhbmdlRGF0YUdyb3VwcyhkYXRhR3JvdXBzKTtcbiAgICAgICAgbGV0IHVuZmlsdGVyZWREYXRhR3JvdXBzID0gcmVhcnJhbmdlUmVzdWx0LmRhdGFHcm91cHM7XG5cbiAgICAgICAgaWYgKHJlYXJyYW5nZVJlc3VsdC5jb250YWluc0Rhc2hib2FyZFRhc2tSZWYpIHtcbiAgICAgICAgICAgIHVuZmlsdGVyZWREYXRhR3JvdXBzID0gdGhpcy5wcmVwcm9jZXNzRGFzaGJvYXJkVGFza1JlZihyZWFycmFuZ2VSZXN1bHQuZGF0YUdyb3VwcywgZGF0YUdyb3Vwcyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5jbG9uZUFuZEZpbHRlckhpZGRlbih1bmZpbHRlcmVkRGF0YUdyb3Vwcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xvbmVzIHRoZSBjb250ZW50IG9mIHRoZSBkYXRhIGdyb3VwcyB0byBwcmV2ZW50IHVuaW50ZW50aW9uYWwgbWVtb3J5IGFjY2Vzc2VzIHRvIHNvdXJjZSBkYXRhLlxuICAgICAqIFJlYXJyYW5nZXMgdGhlIGRhdGEgZ3JvdXBzIHRvIGFjY29tbW9kYXRlIHRhc2tyZWZzLlxuICAgICAqIERldGVybWluZXMgaWYgdGhlIGRhdGEgZ3JvdXBzIGNvbnRhaW4gYSBkYXNoYm9hcmQgdGFzayByZWYgZmllbGQuXG4gICAgICogQHBhcmFtIGRhdGFHcm91cHNcbiAgICAgKiBAcmV0dXJucyB0aGUgcHJlcHJvY2Vzc2VkIGRhdGEgZ3JvdXBzIHdpdGggbWV0YWRhdGFcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcmVhcnJhbmdlRGF0YUdyb3VwcyhkYXRhR3JvdXBzOiBBcnJheTxEYXRhR3JvdXA+KTogUHJlcHJvY2Vzc2VkRGF0YUdyb3VwcyB7XG4gICAgICAgIGRhdGFHcm91cHMgPSB0aGlzLmNsb25lRGF0YUdyb3VwcyhkYXRhR3JvdXBzKTtcbiAgICAgICAgdGhpcy5pbml0aWFsaXplTG9jYWxGaWVsZExheW91dChkYXRhR3JvdXBzKTtcblxuICAgICAgICBsZXQgY29udGFpbnNEYXNoYm9hcmQgPSBmYWxzZTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YUdyb3Vwcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgZ3JvdXAgPSBkYXRhR3JvdXBzW2ldO1xuICAgICAgICAgICAgaWYgKCFncm91cC5maWVsZHMuc29tZShmID0+IHRoaXMuaXNUYXNrUmVmKGYpKSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGdyb3VwKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHNwbGl0ID0gdGhpcy5zcGxpdERhdGFHcm91cE9uVGFza1JlZihncm91cCk7XG4gICAgICAgICAgICBpZiAoc3BsaXQuc3RhcnRHcm91cCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goc3BsaXQuc3RhcnRHcm91cCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChzcGxpdC50YXNrUmVmLmNvbXBvbmVudD8ubmFtZSA9PT0gVGFza1JlZkNvbXBvbmVudHMuREFTSEJPQVJEKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godGhpcy5jcmVhdGVEYXNoYm9hcmRUYXNrUmVmRGF0YUdyb3VwKGdyb3VwLCBzcGxpdC50YXNrUmVmKSk7XG4gICAgICAgICAgICAgICAgY29udGFpbnNEYXNoYm9hcmQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoc3BsaXQudGFza1JlZi52YWx1ZS5sZW5ndGggPT09IDAgfHwgc3BsaXQuZW5kR3JvdXAgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGlmIChzcGxpdC5lbmRHcm91cCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGFHcm91cHMuc3BsaWNlKGkgKyAxLCAwLCBzcGxpdC5lbmRHcm91cCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBkaXJlY3RDaGlsZCA9IGRhdGFHcm91cHNbaSArIDFdOyAvLyB0aGUgZGF0YSBncm91cCB0aGF0IGltbWVkaWF0ZWx5IGZvbGxvd3MgSVMgQUxXQVlTIGEgZGlyZWN0IGNoaWxkXG4gICAgICAgICAgICBsZXQgZmlyc3ROb25EZXNjZW5kYW50SW5kZXggPSBpICsgMjtcbiAgICAgICAgICAgIGZvciAoOyBmaXJzdE5vbkRlc2NlbmRhbnRJbmRleCA8IGRhdGFHcm91cHMubGVuZ3RoOyBmaXJzdE5vbkRlc2NlbmRhbnRJbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dEdyb3VwID0gZGF0YUdyb3Vwc1tmaXJzdE5vbkRlc2NlbmRhbnRJbmRleF07XG4gICAgICAgICAgICAgICAgaWYgKG5leHRHcm91cC5uZXN0aW5nTGV2ZWwgPT09IHVuZGVmaW5lZCB8fCBuZXh0R3JvdXAubmVzdGluZ0xldmVsIDwgZGlyZWN0Q2hpbGQubmVzdGluZ0xldmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGVuZCBvZiB0aGUgYmxvY2sgb2YgbmVzdGVkIGRhdGEgZ3JvdXBzXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobmV4dEdyb3VwLm5lc3RpbmdMZXZlbCA9PT0gZGlyZWN0Q2hpbGQubmVzdGluZ0xldmVsXG4gICAgICAgICAgICAgICAgICAgICYmIChuZXh0R3JvdXAucGFyZW50VGFza1JlZklkICE9PSBzcGxpdC50YXNrUmVmLnN0cmluZ0lkXG4gICAgICAgICAgICAgICAgICAgICAgICB8fCAhc3BsaXQudGFza1JlZi52YWx1ZS5zb21lKHJlZmZlZFRhc2tJZCA9PiByZWZmZWRUYXNrSWQgPT09IG5leHRHcm91cC5wYXJlbnRUYXNrSWQpKSkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGRhdGFHcm91cHMuc3BsaWNlKGZpcnN0Tm9uRGVzY2VuZGFudEluZGV4LCAwLCBzcGxpdC5lbmRHcm91cCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZGF0YUdyb3VwczogcmVzdWx0LFxuICAgICAgICAgICAgY29udGFpbnNEYXNoYm9hcmRUYXNrUmVmOiBjb250YWluc0Rhc2hib2FyZFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBkdXBsaWNhdGUgb2YgdGhlIHByb3ZpZGVkIGRhdGEgZ3JvdXAgYXJyYXkuXG4gICAgICpcbiAgICAgKiBPbmx5IHRoZSBkYXRhIGdyb3VwcyBhcmUgY2xvbmVkLCB0aGUgZmllbGRzIGFyZSBvbmx5IGNvcGllZCBhcyByZWZlcmVuY2VzLlxuICAgICAqIEBwYXJhbSBkYXRhR3JvdXBzIHRoZSBkYXRhIGdyb3VwcyB0aGF0IHNob3VsZCBiZSBjbG9uZWRcbiAgICAgKiBAcmV0dXJucyB0aGUgZHVwbGljYXRlZCBkYXRhIGdyb3Vwc1xuICAgICAqL1xuICAgIHByb3RlY3RlZCBjbG9uZURhdGFHcm91cHMoZGF0YUdyb3VwczogQXJyYXk8RGF0YUdyb3VwPik6IEFycmF5PERhdGFHcm91cD4ge1xuICAgICAgICByZXR1cm4gZGF0YUdyb3Vwcy5tYXAoZ3JvdXAgPT4ge1xuICAgICAgICAgICAgY29uc3QgZyA9IHsuLi5ncm91cH07XG4gICAgICAgICAgICBnLmZpZWxkcyA9IGcuZmllbGRzLm1hcChmaWVsZCA9PiBmaWVsZCk7XG4gICAgICAgICAgICByZXR1cm4gZztcbiAgICAgICAgfSk7XG5cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQYXNzZXMgb3ZlciBhbGwgdGhlIGZpZWxkcyBpbiB0aGUgcHJvdmlkZWQgZGF0YSBncm91cHMgYW5kIGlmIHRoZXkgYXJlIHZpc2libGUsIGluaXRpYWxpemVzIHRoZWlyIGxvY2FsIGxheW91dCBhdHRyaWJ1dGUuXG4gICAgICogQHBhcmFtIGRhdGFHcm91cHMgdGhlIGNvbnRhaW5lcnMgb2YgdGhlIGZpZWxkcyB0aGF0IHNob3VsZCBoYXZlIHRoZWlyIGxvY2FsIGxheW91dCBpbml0aWFsaXplZFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBpbml0aWFsaXplTG9jYWxGaWVsZExheW91dChkYXRhR3JvdXBzOiBBcnJheTxEYXRhR3JvdXA+KTogdm9pZCB7XG4gICAgICAgIGZvciAoY29uc3QgZyBvZiBkYXRhR3JvdXBzKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGYgb2YgZy5maWVsZHMpIHtcbiAgICAgICAgICAgICAgICBpZiAoZi5iZWhhdmlvci5oaWRkZW4gfHwgZi5iZWhhdmlvci5mb3JiaWRkZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGYucmVzZXRMb2NhbExheW91dCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGR1cGxpY2F0ZSBvZiB0aGUgcHJvdmlkZWQgZGF0YSBncm91cCBhcnJheSBhbmQgZmlsdGVycyBhd2F5IGFueSBmaWVsZHMgYW5kIGRhdGEgZ3JvdXBzIHRoYXQgYXJlIG1hcmtlZCBhcyBoaWRkZW4uXG4gICAgICogQmVjYXVzZSBvZiB0aGUgZHVwbGljYXRpb24gdGhlIGZpbHRlcmluZyBkb2Vzbid0IGFmZmVjdCB0aGUgb3JpZ2luYWwgaW5zdGFuY2VzIGFuZCB0aGV5IHJlbWFpbiB1bmNoYW5nZWQuXG4gICAgICogQHBhcmFtIGRhdGFHcm91cHMgdGhlIGRhdGEgZ3JvdXBzIHRoYXQgc2hvdWxkIGJlIGZpbHRlcmVkXG4gICAgICogQHJldHVybnMgdGhlIGZpbHRlcmVkIGR1cGxpY2F0ZWQgZGF0YSBncm91cHNcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgY2xvbmVBbmRGaWx0ZXJIaWRkZW4oZGF0YUdyb3VwczogQXJyYXk8RGF0YUdyb3VwPik6IEFycmF5PERhdGFHcm91cD4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBkYXRhR3JvdXBzLm1hcChncm91cCA9PiB7XG4gICAgICAgICAgICBjb25zdCBnID0gey4uLmdyb3VwfTtcbiAgICAgICAgICAgIGcuZmllbGRzID0gZy5maWVsZHMuZmlsdGVyKGZpZWxkID0+ICFmaWVsZC5iZWhhdmlvci5oaWRkZW4gJiYgIWZpZWxkLmJlaGF2aW9yLmZvcmJpZGRlbikubWFwKGZpZWxkID0+IHtcbiAgICAgICAgICAgICAgICBmaWVsZC5yZXNldExvY2FsTGF5b3V0KCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gZztcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdC5maWx0ZXIoZ3JvdXAgPT4gZ3JvdXAuZmllbGRzLmxlbmd0aCA+IDApO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBpc1Rhc2tSZWYoZmllbGQ6IERhdGFGaWVsZDx1bmtub3duPik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gZmllbGQgaW5zdGFuY2VvZiBUYXNrUmVmRmllbGQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU29ydHMgdGhlIGlucHV0IGRhdGEgZ3JvdXAgYmFzZWQgb24gdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgZmllbGRzIGFuZCBzcGxpdHMgaXQgaW50byBwYXJ0cyBvbiB0aGUgZmlyc3QgdGFzayByZWYuXG4gICAgICogSWYgc29tZSBmaWVsZHMgYXBwZWFyIGJlZm9yZSB0aGUgZmlyc3QgdGFzayByZWYgdGhleSBhcmUgZXh0cmFjdGVkIGludG8gYSBuZXcgW3N0YXJ0R3JvdXBde0BsaW5rIFNwbGl0RGF0YUdyb3VwI3N0YXJ0R3JvdXB9LlxuICAgICAqIElmIHNvbWUgZmllbGRzIGFwcGVhciBhZnRlciB0aGUgZmlyc3QgdGFzayByZWYgdGhleSBhcmUgZXh0cmFjdGVkIGludG8gYSBuZXcgW2VuZEdyb3VwXXtAbGluayBTcGxpdERhdGFHcm91cCNlbmRHcm91cH0uXG4gICAgICogQHBhcmFtIGRhdGFHcm91cFxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgc3BsaXREYXRhR3JvdXBPblRhc2tSZWYoZGF0YUdyb3VwOiBEYXRhR3JvdXApOiBTcGxpdERhdGFHcm91cCB7XG4gICAgICAgIGRhdGFHcm91cC5maWVsZHMuc29ydCgoYSwgYikgPT4gYS5sb2NhbExheW91dC55IC0gYi5sb2NhbExheW91dC55KTtcbiAgICAgICAgY29uc3QgdGFza1JlZlBvc2l0aW9uID0gZGF0YUdyb3VwLmZpZWxkcy5maW5kSW5kZXgoZiA9PiB0aGlzLmlzVGFza1JlZihmKSk7XG4gICAgICAgIGNvbnN0IHJlc3VsdDogU3BsaXREYXRhR3JvdXAgPSB7XG4gICAgICAgICAgICB0YXNrUmVmOiBkYXRhR3JvdXAuZmllbGRzW3Rhc2tSZWZQb3NpdGlvbl0gYXMgVGFza1JlZkZpZWxkXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHRhc2tSZWZQb3NpdGlvbiAhPT0gMCkge1xuICAgICAgICAgICAgcmVzdWx0LnN0YXJ0R3JvdXAgPSB7XG4gICAgICAgICAgICAgICAgdGl0bGU6IGRhdGFHcm91cC50aXRsZSxcbiAgICAgICAgICAgICAgICBhbGlnbm1lbnQ6IGRhdGFHcm91cC5hbGlnbm1lbnQsXG4gICAgICAgICAgICAgICAgbGF5b3V0OiBkYXRhR3JvdXAubGF5b3V0LFxuICAgICAgICAgICAgICAgIHN0cmV0Y2g6IGRhdGFHcm91cC5zdHJldGNoLFxuICAgICAgICAgICAgICAgIGZpZWxkczogZGF0YUdyb3VwLmZpZWxkcy5zbGljZSgwLCB0YXNrUmVmUG9zaXRpb24pLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0YXNrUmVmUG9zaXRpb24gIT09IGRhdGFHcm91cC5maWVsZHMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgcmVzdWx0LmVuZEdyb3VwID0ge1xuICAgICAgICAgICAgICAgIHRpdGxlOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgYWxpZ25tZW50OiBkYXRhR3JvdXAuYWxpZ25tZW50LFxuICAgICAgICAgICAgICAgIGxheW91dDogZGF0YUdyb3VwLmxheW91dCxcbiAgICAgICAgICAgICAgICBzdHJldGNoOiBkYXRhR3JvdXAuc3RyZXRjaCxcbiAgICAgICAgICAgICAgICBmaWVsZHM6IGRhdGFHcm91cC5maWVsZHMuc2xpY2UodGFza1JlZlBvc2l0aW9uICsgMSksXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmVzdWx0LmVuZEdyb3VwLmZpZWxkcy5mb3JFYWNoKGYgPT4ge1xuICAgICAgICAgICAgICAgIGYubG9jYWxMYXlvdXQueSA9IGYubG9jYWxMYXlvdXQueSAtIHJlc3VsdC50YXNrUmVmLmxvY2FsTGF5b3V0LnkgLSAxO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgZGF0YSBncm91cCB0aGF0IGNvbnRhaW5zIG9ubHkgdGhlIHBhc3NlZCB0YXNrIHJlZi5cbiAgICAgKiBUaGUgaW5mb3JtYXRpb24gYWJvdXQgbmVzdGluZyBhbmQgcGFyZW50IHRhc2svY2FzZSBhcmUgcHJlc2VydmVkIGZyb20gdGhlIHBhc3NlZCBvcmlnaW5hbCBkYXRhIGdyb3VwLlxuICAgICAqIEBwYXJhbSBvcmlnaW5hbERhdGFHcm91cCBzb3VyY2Ugb2YgdGhlIGluZm9ybWF0aW9uIGFib3V0IHBhcmVudCB0YXNrL2Nhc2VcbiAgICAgKiBAcGFyYW0gdGFza1JlZiB0aGUgdGFzayByZWYgdGhhdCB3aWxsIGJlIGFkZGVkIHRvIHRoZSBuZXcgZGF0YSBncm91cFxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgY3JlYXRlRGFzaGJvYXJkVGFza1JlZkRhdGFHcm91cChvcmlnaW5hbERhdGFHcm91cDogRGF0YUdyb3VwLCB0YXNrUmVmOiBUYXNrUmVmRmllbGQpOiBEYXRhR3JvdXAge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZmllbGRzOiBbdGFza1JlZl0sXG4gICAgICAgICAgICBhbGlnbm1lbnQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHN0cmV0Y2g6IGZhbHNlLFxuICAgICAgICAgICAgdGl0bGU6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHBhcmVudFRhc2tJZDogb3JpZ2luYWxEYXRhR3JvdXAucGFyZW50VGFza0lkLFxuICAgICAgICAgICAgcGFyZW50VHJhbnNpdGlvbklkOiBvcmlnaW5hbERhdGFHcm91cC5wYXJlbnRUcmFuc2l0aW9uSWQsXG4gICAgICAgICAgICBwYXJlbnRDYXNlSWQ6IG9yaWdpbmFsRGF0YUdyb3VwLnBhcmVudENhc2VJZCxcbiAgICAgICAgICAgIHBhcmVudFRhc2tSZWZJZDogb3JpZ2luYWxEYXRhR3JvdXAucGFyZW50VGFza1JlZklkLFxuICAgICAgICAgICAgbmVzdGluZ0xldmVsOiBvcmlnaW5hbERhdGFHcm91cC5uZXN0aW5nTGV2ZWwsXG4gICAgICAgICAgICBsYXlvdXQ6IG9yaWdpbmFsRGF0YUdyb3VwLmxheW91dFxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSWRlbnRpZmllcyBkYXRhIGdyb3VwcyB0aGF0IHJlcHJlc2VudCBkYXNoYm9hcmQgdGlsZXMsXG4gICAgICogcmVtb3ZlcyB0aGVtIGZyb20gdGhlIGRhdGEgZ3JvdXAgYXJyYXkgYW5kIHBhc3NlcyB0aGVtIG9udG8gdGhlIHRhc2sgcmVmIGZpZWxkIGluc3RhbmNlLlxuICAgICAqIEBwYXJhbSBwcmVwcm9jZXNzZWREYXRhR3JvdXBzXG4gICAgICogQHBhcmFtIHJhd0RhdGFHcm91cHNcbiAgICAgKiBAcmV0dXJucyBhbiBhcnJheSBvZiBkYXRhIGdyb3VwIG9iamVjdHMgdGhhdCBkb2VzIG5vdCBjb250YWluIGRhc2hib2FyZCB0aWxlcyByZWZlcmVuY2VkIGJ5IHRoZSBkYXNoYm9hcmQgdGFzayByZWZcbiAgICAgKiBAcHJvdGVjdGVkXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHByZXByb2Nlc3NEYXNoYm9hcmRUYXNrUmVmKHByZXByb2Nlc3NlZERhdGFHcm91cHM6IEFycmF5PERhdGFHcm91cD4sIHJhd0RhdGFHcm91cHM6IEFycmF5PERhdGFHcm91cD4pOiBBcnJheTxEYXRhR3JvdXA+IHtcbiAgICAgICAgLy8gVE9ETyBzdXBwb3J0IG1vcmUgdGhhbiBvbmUgZGFzaGJvYXJkIHRhc2sgcmVmIGluIGEgdGFza1xuICAgICAgICBsZXQgZGFzaGJvYXJkVGFza1JlZkZpZWxkOiBUYXNrUmVmRmllbGQ7XG4gICAgICAgIGxldCBkYXNoYm9hcmRQYXJlbnRJbmZvcm1hdGlvbjogUGFyZW50RGF0YUdyb3VwSW5mb3JtYXRpb247XG4gICAgICAgIGZvciAoY29uc3QgZGcgb2YgcHJlcHJvY2Vzc2VkRGF0YUdyb3Vwcykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBmaWVsZCBvZiBkZy5maWVsZHMpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc1Rhc2tSZWYoZmllbGQpICYmIGZpZWxkLmNvbXBvbmVudD8ubmFtZSA9PT0gVGFza1JlZkNvbXBvbmVudHMuREFTSEJPQVJEKSB7XG4gICAgICAgICAgICAgICAgICAgIGRhc2hib2FyZFRhc2tSZWZGaWVsZCA9IGZpZWxkIGFzIFRhc2tSZWZGaWVsZDtcbiAgICAgICAgICAgICAgICAgICAgZGFzaGJvYXJkUGFyZW50SW5mb3JtYXRpb24gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRUYXNrSWQ6IGRnLnBhcmVudFRhc2tJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudFRyYW5zaXRpb25JZDogZGcucGFyZW50VHJhbnNpdGlvbklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50Q2FzZUlkOiBkZy5wYXJlbnRDYXNlSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRUYXNrUmVmSWQ6IGRnLnBhcmVudFRhc2tSZWZJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5lc3RpbmdMZXZlbDogZGcubmVzdGluZ0xldmVsXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGRhc2hib2FyZFRhc2tSZWZGaWVsZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRhc2hib2FyZFRhc2tSZWZGaWVsZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ3ByZXByb2Nlc3NEYXNoYm9hcmRUYXNrUmVmIG1ldGhvZCB3YXMgY2FsbGVkIG9uIHRhc2sgY29udGVudCB3aXRob3V0IGRhc2hib2FyZCB0YXNrIHJlZnMhJyk7XG4gICAgICAgICAgICByZXR1cm4gcHJlcHJvY2Vzc2VkRGF0YUdyb3VwcztcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRpbGVzID0gbmV3IE1hcDxzdHJpbmcsIFRhc2tSZWZEYXNoYm9hcmRUaWxlPigpO1xuXG4gICAgICAgIC8vIFRPRE8gcmVzb2x2ZSB0cmFuc2l0aXZlIHRpbGUgY29udGVudFxuICAgICAgICBjb25zdCBub25EYXNoYm9hcmREYXRhR3JvdXBzID0gW107XG4gICAgICAgIGZvciAoY29uc3QgZGcgb2YgcHJlcHJvY2Vzc2VkRGF0YUdyb3Vwcykge1xuICAgICAgICAgICAgaWYgKGRnLnBhcmVudFRhc2tSZWZJZCAhPT0gZGFzaGJvYXJkVGFza1JlZkZpZWxkLnN0cmluZ0lkKSB7XG4gICAgICAgICAgICAgICAgbm9uRGFzaGJvYXJkRGF0YUdyb3Vwcy5wdXNoKGRnKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aWxlcy5oYXMoZGcucGFyZW50VGFza0lkKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRpbGUgPSB0aWxlcy5nZXQoZGcucGFyZW50VGFza0lkKTtcbiAgICAgICAgICAgICAgICB0aWxlLmRhdGFHcm91cHMucHVzaChkZyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRpbGVzLnNldChkZy5wYXJlbnRUYXNrSWQsIHtkYXRhR3JvdXBzOiBbZGddfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IHJkZyBvZiByYXdEYXRhR3JvdXBzKSB7XG4gICAgICAgICAgICBpZiAocmRnLnBhcmVudFRhc2tJZCA9PT0gZGFzaGJvYXJkUGFyZW50SW5mb3JtYXRpb24ucGFyZW50VGFza0lkXG4gICAgICAgICAgICAgICAgJiYgcmRnLnBhcmVudFRyYW5zaXRpb25JZCA9PT0gZGFzaGJvYXJkUGFyZW50SW5mb3JtYXRpb24ucGFyZW50VHJhbnNpdGlvbklkXG4gICAgICAgICAgICAgICAgJiYgcmRnLnBhcmVudENhc2VJZCA9PT0gZGFzaGJvYXJkUGFyZW50SW5mb3JtYXRpb24ucGFyZW50Q2FzZUlkXG4gICAgICAgICAgICAgICAgJiYgcmRnLnBhcmVudFRhc2tSZWZJZCA9PT0gZGFzaGJvYXJkUGFyZW50SW5mb3JtYXRpb24ucGFyZW50VGFza1JlZklkXG4gICAgICAgICAgICAgICAgJiYgcmRnLm5lc3RpbmdMZXZlbCA9PT0gZGFzaGJvYXJkUGFyZW50SW5mb3JtYXRpb24ubmVzdGluZ0xldmVsKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBmaWxlZCBvZiByZGcuZmllbGRzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmaWxlZC5zdHJpbmdJZCA9PT0gVGFza1JlZkRhc2hib2FyZENvbnN0YW50cy5EQVNIQk9BUkRfQ09MUykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGFzaGJvYXJkVGFza1JlZkZpZWxkLmRhc2hib2FyZENvbHMgPSBmaWxlZC52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmaWxlZC5zdHJpbmdJZCA9PT0gVGFza1JlZkRhc2hib2FyZENvbnN0YW50cy5EQVNIQk9BUkRfUk9XUykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGFzaGJvYXJkVGFza1JlZkZpZWxkLmRhc2hib2FyZFJvd3MgPSBmaWxlZC52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGRhc2hib2FyZFRhc2tSZWZGaWVsZC5kYXNoYm9hcmRUaWxlcyA9IEFycmF5LmZyb20odGlsZXMudmFsdWVzKCkpO1xuICAgICAgICByZXR1cm4gbm9uRGFzaGJvYXJkRGF0YUdyb3VwcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb21wdXRlcyB0aGUgbGF5b3V0IGRhdGEgZm9yIGEgc2luZ2xlIGRhdGEgZ3JvdXAgd2l0aCBncmlkIGxheW91dC4gVGhlIHJlc3VsdGluZyBsYXlvdXQgaXMgc2F2ZWQgaW50byB0aGUgaW5wdXQgb2JqZWN0cy5cbiAgICAgKiBAcGFyYW0gZGF0YUdyb3VwIHRoZSBkYXRhIGdyb3VwIHRoYXQgc2hvdWxkIGJlIGxhaWQgb3V0IGludG8gYSBncmlkXG4gICAgICogQHBhcmFtIHN1YmdyaWQgdGhlIG9iamVjdCB0aGF0IGhvbGRzIHRoZSBjb250ZXh0IG9mIHRoZSBjb21wdXRlZCBsYXlvdXRpbmcgdW5pdFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBjb21wdXRlR3JpZExheW91dChkYXRhR3JvdXA6IERhdGFHcm91cCwgc3ViZ3JpZDogU3ViZ3JpZCkge1xuICAgICAgICBjb25zdCBsb2NhbEdyaWQ6IEFycmF5PEFycmF5PHN0cmluZz4+ID0gW107XG5cbiAgICAgICAgZGF0YUdyb3VwLmZpZWxkcy5mb3JFYWNoKGRhdGFGaWVsZCA9PiB7XG4gICAgICAgICAgICBpZiAoIWRhdGFGaWVsZC5sb2NhbExheW91dFxuICAgICAgICAgICAgICAgIHx8IGRhdGFGaWVsZC5sb2NhbExheW91dC54ID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICB8fCBkYXRhRmllbGQubG9jYWxMYXlvdXQueSA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgfHwgIWRhdGFGaWVsZC5sb2NhbExheW91dC5yb3dzXG4gICAgICAgICAgICAgICAgfHwgIWRhdGFGaWVsZC5sb2NhbExheW91dC5jb2xzKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICAgICBgWW91IGNhbm5vdCB1c2UgJ2dyaWQnIGxheW91dCB3aXRob3V0IHNwZWNpZnlpbmcgdGhlIGxheW91dCBvZiB0aGUgZGF0YSBmaWVsZHMgKGZpZWxkIElEOiAke2RhdGFGaWVsZC5zdHJpbmdJZH0pYCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHdoaWxlIChsb2NhbEdyaWQubGVuZ3RoIDwgZGF0YUZpZWxkLmxvY2FsTGF5b3V0LnkgKyBkYXRhRmllbGQubG9jYWxMYXlvdXQucm93cykge1xuICAgICAgICAgICAgICAgIGxvY2FsR3JpZC5wdXNoKHRoaXMubmV3R3JpZFJvdyhzdWJncmlkLmNvbHMpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgZmllbGRFbGVtZW50ID0gc3ViZ3JpZC5hZGRGaWVsZChkYXRhRmllbGQsIHRoaXMuX2ZpZWxkQ29udmVydGVyLnJlc29sdmVUeXBlKGRhdGFGaWVsZCkpO1xuICAgICAgICAgICAgdGhpcy5vY2N1cHlTcGFjZShsb2NhbEdyaWQsIGRhdGFGaWVsZC5sb2NhbExheW91dC55LCBkYXRhRmllbGQubG9jYWxMYXlvdXQueCxcbiAgICAgICAgICAgICAgICBkYXRhRmllbGQubG9jYWxMYXlvdXQuY29scywgZmllbGRFbGVtZW50LmdyaWRBcmVhSWQsIGRhdGFGaWVsZC5sb2NhbExheW91dC5yb3dzKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5jb2xsYXBzZUdyaWRFbXB0eVNwYWNlKGxvY2FsR3JpZCwgZGF0YUdyb3VwLmxheW91dCwgc3ViZ3JpZCk7XG5cbiAgICAgICAgbG9jYWxHcmlkLmZvckVhY2gobG9jYWxHcmlkUm93ID0+IHN1YmdyaWQuYWRkUm93KGxvY2FsR3JpZFJvdykpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFwcGxpZXMgdGhlIGVtcHR5IHJvdyByZW1vdmFsIGFuZCBmaWVsZCBjb21wYWN0aW5nIHJ1bGVzIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBsYXlvdXQgY29uZmlndXJhdGlvbi5cbiAgICAgKlxuICAgICAqIFRoZSBpbnB1dCBncmlkIGlzIG1vZGlmaWVkIGluIHBsYWNlLlxuICAgICAqIEBwYXJhbSBncmlkIHRoZSBzdGF0ZSBvZiB0aGUgZ3JpZCB0aGF0IHNob3VsZCBiZSBtb2RpZmllZFxuICAgICAqIEBwYXJhbSBsYXlvdXQgY29uZmlndXJhdGlvbiBvZiB0aGUgYXBwbGllZCBjb21wYWN0aW5nIHJ1bGVzXG4gICAgICogQHBhcmFtIHN1YmdyaWQgdGhlIG9iamVjdCB0aGF0IGhvbGRzIHRoZSBjb250ZXh0IG9mIHRoZSBjb21wdXRlZCBsYXlvdXRpbmcgdW5pdFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBjb2xsYXBzZUdyaWRFbXB0eVNwYWNlKGdyaWQ6IEFycmF5PEFycmF5PHN0cmluZz4+LCBsYXlvdXQ6IERhdGFHcm91cExheW91dCwgc3ViZ3JpZDogU3ViZ3JpZCkge1xuICAgICAgICBjb25zdCBoaWRlUm93cyA9IGxheW91dC5oaWRlRW1wdHlSb3dzID8/IHRoaXMuX2RlZmF1bHRIaWRlRW1wdHlSb3dzO1xuXG4gICAgICAgIGlmIChoaWRlUm93cyA9PT0gRGF0YUdyb3VwSGlkZUVtcHR5Um93cy5BTEwpIHtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlRW1wdHlSb3dzKGdyaWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgc3dpdGNoIChsYXlvdXQuY29tcGFjdERpcmVjdGlvbiA/PyB0aGlzLl9kZWZhdWx0Q29tcGFjdERpcmVjdGlvbikge1xuICAgICAgICAgICAgY2FzZSBEYXRhR3JvdXBDb21wYWN0LlVQOlxuICAgICAgICAgICAgICAgIHRoaXMuY29tcGFjdEZpZWxkc1VwKGdyaWQsIGhpZGVSb3dzLCBzdWJncmlkKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1vdmVzIGFueSBlbGVtZW50IGFzIGZhciBVUCBhcyBpdCBjYW4gZ28uIEVsZW1lbnRzIHRoYXQgd2VyZSBvcmlnaW5hbGx5IGRlY2xhcmVkIGluIHRoZSBzYW1lIHJvdyBtaWdodCBlbmQgdXAgaW4gZGlmZmVyZW50IHJvd3MuXG4gICAgICogUmVzdWx0aW5nIHRyYWlsaW5nIGVtcHR5IHJvd3MgYXJlIHJlbW92ZWQuXG4gICAgICpcbiAgICAgKiBUaGUgaW5wdXQgZ3JpZCBpcyBtb2RpZmllZCBpbiBwbGFjZS5cbiAgICAgKiBAcGFyYW0gZ3JpZCB0aGUgc3RhdGUgb2YgdGhlIGdyaWQgdGhhdCBzaG91bGQgYmUgbW9kaWZpZWRcbiAgICAgKiBAcGFyYW0gaGlkZVJvd3MgY29uZmlndXJhdGlvbiBmb3IgZW1wdHkgcm93IHJlbW92YWwgZHVyaW5nIHRoZSBjb21wYWN0aW5nIHByb2Nlc3NcbiAgICAgKiBAcGFyYW0gc3ViZ3JpZCB0aGUgb2JqZWN0IHRoYXQgaG9sZHMgdGhlIGNvbnRleHQgb2YgdGhlIGNvbXB1dGVkIGxheW91dGluZyB1bml0XG4gICAgICovXG4gICAgcHJvdGVjdGVkIGNvbXBhY3RGaWVsZHNVcChncmlkOiBBcnJheTxBcnJheTxzdHJpbmc+PiwgaGlkZVJvd3M6IERhdGFHcm91cEhpZGVFbXB0eVJvd3MsIHN1YmdyaWQ6IFN1YmdyaWQpIHtcbiAgICAgICAgZm9yIChsZXQgcm93SW5kZXggPSAwOyByb3dJbmRleCA8IGdyaWQubGVuZ3RoOyByb3dJbmRleCsrKSB7XG4gICAgICAgICAgICBjb25zdCByb3cgPSBncmlkW3Jvd0luZGV4XTtcblxuICAgICAgICAgICAgZm9yIChsZXQgY29sdW1uSW5kZXggPSAwOyBjb2x1bW5JbmRleCA8IHJvdy5sZW5ndGg7IGNvbHVtbkluZGV4KyspIHtcbiAgICAgICAgICAgICAgICBpZiAocm93W2NvbHVtbkluZGV4XSAhPT0gJycpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGV0IGZvdW5kRWxlbWVudCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGxldCBmb3VuZEVsZW1lbnRSb3dJbmRleCA9IHJvd0luZGV4ICsgMTtcbiAgICAgICAgICAgICAgICBmb3IgKDsgZm91bmRFbGVtZW50Um93SW5kZXggPCBncmlkLmxlbmd0aDsgZm91bmRFbGVtZW50Um93SW5kZXgrKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZ3JpZFtmb3VuZEVsZW1lbnRSb3dJbmRleF1bY29sdW1uSW5kZXhdICE9PSAnJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRFbGVtZW50ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghZm91bmRFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChjb2x1bW5JbmRleCA+IDAgJiYgZ3JpZFtmb3VuZEVsZW1lbnRSb3dJbmRleF1bY29sdW1uSW5kZXggLSAxXSA9PT0gZ3JpZFtmb3VuZEVsZW1lbnRSb3dJbmRleF1bY29sdW1uSW5kZXhdKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnREaW1lbnNpb25zID0gdGhpcy5nZXRFbGVtZW50RGltZW5zaW9ucyhncmlkLCBjb2x1bW5JbmRleCwgZm91bmRFbGVtZW50Um93SW5kZXgsIHN1YmdyaWQpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNBcmVhRW1wdHkoZ3JpZCwgY29sdW1uSW5kZXgsIHJvd0luZGV4LCBlbGVtZW50RGltZW5zaW9ucy53aWR0aCwgZm91bmRFbGVtZW50Um93SW5kZXggLSByb3dJbmRleCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IGdyaWRbZm91bmRFbGVtZW50Um93SW5kZXhdW2NvbHVtbkluZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vY2N1cHlTcGFjZShncmlkLCBmb3VuZEVsZW1lbnRSb3dJbmRleCwgY29sdW1uSW5kZXgsIGVsZW1lbnREaW1lbnNpb25zLndpZHRoLCAnJywgZWxlbWVudERpbWVuc2lvbnMuaGVpZ2h0LCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub2NjdXB5U3BhY2UoZ3JpZCwgcm93SW5kZXgsIGNvbHVtbkluZGV4LCBlbGVtZW50RGltZW5zaW9ucy53aWR0aCwgZWxlbWVudCwgZWxlbWVudERpbWVuc2lvbnMuaGVpZ2h0LCBmYWxzZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGhpZGVSb3dzICE9PSBEYXRhR3JvdXBIaWRlRW1wdHlSb3dzLk5PTkUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIG9ubHkgY2hlY2sgdGhlIHJvd3MgcG90ZW50aWFsbHkgY2xlYXJlZCBieSBtb3ZpbmcgdGhlIGdyaWQgZWxlbWVudCB1cFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVFbXB0eVJvd3MoZ3JpZCwgZm91bmRFbGVtZW50Um93SW5kZXgsIGZvdW5kRWxlbWVudFJvd0luZGV4ICsgZWxlbWVudERpbWVuc2lvbnMuaGVpZ2h0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgcm93cyBmcm9tIHRoZSBncmlkIHRoYXQgb25seSBjb250YWluIGVtcHR5IGVsZW1lbnRzIChhcmUgZW1wdHkpLiBUaGUgZ3JpZCBpcyBtb2RpZmllZCBpbiBwbGFjZS5cbiAgICAgKiBAcGFyYW0gZ3JpZCB0aGUgZ3JpZCB0aGF0IHNob3VsZCBoYXZlIGl0J3MgZW1wdHkgcm93cyByZW1vdmVkXG4gICAgICogQHBhcmFtIGZpcnN0Um93IHRoZSAwIGJhc2VkIGluZGV4IG9mIHRoZSBmaXJzdCByb3cgdGhhdCBzaG91bGQgYmUgY2hlY2tlZC4gVXNlIDAgdG8gc3RhcnQgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBncmlkLlxuICAgICAqXG4gICAgICogSWYgbm8gdmFsdWUgaXMgcHJvdmlkZWQsIHRoZSBncmlkIHdpbGwgYmUgY2hlY2tlZCBmcm9tIHRoZSBmaXJzdCByb3cuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbGFzdFJvdyB0aGUgMCBiYXNlZCBpbmRleCBvZiB0aGUgcm93IHdoZXJlIHRoZSBjaGVja2luZyBzaG91bGQgZW5kLiBUaGUgcm93IHdpdGggdGhpcyBpbmRleCBpcyBub3QgY2hlY2tlZC5cbiAgICAgKlxuICAgICAqIElmIG5vIHZhbHVlIGlzIHByb3ZpZGVkIHRoZSBlbnRpcmUgZ3JpZCBmcm9tIHRoZSBgZmlyc3RSb3dgIHdpbGwgYmUgY2hlY2tlZC5cbiAgICAgKlxuICAgICAqIElmIGEgdmFsdWUgdGhhdCBpcyBzbWFsbGVyIG9yIGVxdWFsIHRvIHRoZSBgZmlyc3RSb3dgIGlzIHByb3ZpZGVkIG5vIGNoZWNrcyB3aWxsIGJlIHByZWZvcm1lZC5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcmVtb3ZlRW1wdHlSb3dzKGdyaWQ6IEFycmF5PEFycmF5PHN0cmluZz4+LCBmaXJzdFJvdyA9IDAsIGxhc3RSb3cgPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpIHtcbiAgICAgICAgbGV0IGkgPSBmaXJzdFJvdztcbiAgICAgICAgd2hpbGUgKGkgPCBncmlkLmxlbmd0aCAmJiBpIDwgbGFzdFJvdykge1xuICAgICAgICAgICAgaWYgKGdyaWRbaV0uZXZlcnkoZWxlbWVudCA9PiBlbGVtZW50ID09PSAnJykpIHtcbiAgICAgICAgICAgICAgICBncmlkLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lcyB0aGUgZGltZW5zaW9ucyBvZiB0aGUgZWxlbWVudCBpbiB0aGUgZ3JpZCB3aXRoIGl0cyB0b3AtbGVmdCBjb3JuZXIgYXQgdGhlIHNwZWNpZmllZCBwb3NpdGlvblxuICAgICAqIEBwYXJhbSBncmlkIHRoZSBncmlkIG9mIGVsZW1lbnRzXG4gICAgICogQHBhcmFtIHggdGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgZGVzaXJlZCBlbGVtZW50cyB0b3AtbGVmdCBjb3JuZXJcbiAgICAgKiBAcGFyYW0geSB0aGUgWSBjb29yZGluYXRlIG9mIHRoZSBkZXNpcmVkIGVsZW1lbnRzIHRvcC1sZWZ0IGNvcm5lclxuICAgICAqIEBwYXJhbSBzdWJncmlkIHRoZSBvYmplY3QgdGhhdCBob2xkcyB0aGUgY29udGV4dCBvZiB0aGUgY29tcHV0ZWQgbGF5b3V0aW5nIHVuaXRcbiAgICAgKiBAcmV0dXJucyB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgc3BlY2lmaWVkIGVsZW1lbnRcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZ2V0RWxlbWVudERpbWVuc2lvbnMoZ3JpZDogQXJyYXk8QXJyYXk8c3RyaW5nPj4sIHg6IG51bWJlciwgeTogbnVtYmVyLCBzdWJncmlkOiBTdWJncmlkKTogeyB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlciB9IHtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IGdyaWRbeV1beF07XG4gICAgICAgIGxldCB3aWR0aCA9IDE7XG4gICAgICAgIHdoaWxlICh4ICsgd2lkdGggPCBzdWJncmlkLmNvbHMgJiYgZ3JpZFt5XVt4ICsgd2lkdGhdID09PSBlbGVtZW50KSB7XG4gICAgICAgICAgICB3aWR0aCsrO1xuICAgICAgICB9XG4gICAgICAgIGxldCBoZWlnaHQgPSAxO1xuICAgICAgICB3aGlsZSAoeSArIGhlaWdodCA8IGdyaWQubGVuZ3RoICYmIGdyaWRbeSArIGhlaWdodF1beF0gPT09IGVsZW1lbnQpIHtcbiAgICAgICAgICAgIGhlaWdodCsrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7d2lkdGgsIGhlaWdodH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgYXJlYSBpbiB0aGUgZ3JpZCBjb250YWlucyBubyBlbGVtZW50cywgb3Igbm90XG4gICAgICogQHBhcmFtIGdyaWQgdGhlIGdyaWQgb2YgZWxlbWVudHNcbiAgICAgKiBAcGFyYW0geCB0aGUgWCBjb29yZGluYXRlIG9mIHRoZSB0ZXN0ZWQgYXJlYXMgdG9wLWxlZnQgY29ybmVyXG4gICAgICogQHBhcmFtIHkgdGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgdGVzdGVkIGFyZWFzIHRvcC1sZWZ0IGNvcm5lclxuICAgICAqIEBwYXJhbSB3aWR0aCB0aGUgd2lkdGggb2YgdGhlIHRlc3RlZCBhcmVhXG4gICAgICogQHBhcmFtIGhlaWdodCB0aGUgaGVpZ2h0IG9mIHRoZSB0ZXN0ZWQgYXJlYVxuICAgICAqL1xuICAgIHByb3RlY3RlZCBpc0FyZWFFbXB0eShncmlkOiBBcnJheTxBcnJheTxzdHJpbmc+PiwgeDogbnVtYmVyLCB5OiBudW1iZXIsIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIGZvciAobGV0IGkgPSB5OyBpIDwgeSArIGhlaWdodDsgaSsrKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0geDsgaiA8IHggKyB3aWR0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGdyaWRbaV1bal0gIT09ICcnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29tcHV0ZXMgdGhlIGxheW91dCBkYXRhIGZvciBhIHNpbmdsZSBkYXRhIGdyb3VwIHdpdGggZmxvdyBsYXlvdXQuIFRoZSByZXN1bHRpbmcgbGF5b3V0IGlzIHNhdmVkIGludG8gdGhlIGlucHV0IG9iamVjdHMuXG4gICAgICogQHBhcmFtIGRhdGFHcm91cCB0aGUgZGF0YSBncm91cCB0aGF0IHNob3VsZCBiZSBsYWlkIG91dCBpbnRvIGEgZ3JpZCB1c2luZyB0aGUgZmxvdyBhbGdvcml0aG1cbiAgICAgKiBAcGFyYW0gc3ViZ3JpZCB0aGUgb2JqZWN0IHRoYXQgaG9sZHMgdGhlIGNvbnRleHQgb2YgdGhlIGNvbXB1dGVkIGxheW91dGluZyB1bml0XG4gICAgICovXG4gICAgcHJvdGVjdGVkIGNvbXB1dGVGbG93TGF5b3V0KGRhdGFHcm91cDogRGF0YUdyb3VwLCBzdWJncmlkOiBTdWJncmlkKSB7XG4gICAgICAgIHRoaXMuZmxvd0ZpZWxkcyhkYXRhR3JvdXAsIHN1YmdyaWQsIDEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbXB1dGVzIHRoZSBsYXlvdXQgZGF0YSBmb3IgYSBzaW5nbGUgZGF0YSBncm91cCB3aXRoIGxlZ2FjeSBsYXlvdXQuIFRoZSByZXN1bHRpbmcgbGF5b3V0IGlzIHNhdmVkIGludG8gdGhlIGlucHV0IG9iamVjdHMuXG4gICAgICpcbiAgICAgKiBUaGUgbGVnYWN5IGxheW91dCBmb3JjZXMgdGhlIG51bWJlciBvZiBjb2x1bW5zIHRvIGJlIDQgYW5kIGxvZ3MgYSB3YXJuaW5nIGlmIHRoaXMgd2FzIG5vdCB0aGUgY2FzZS5cbiAgICAgKiBAcGFyYW0gZGF0YUdyb3VwIHRoZSBkYXRhIGdyb3VwIHRoYXQgc2hvdWxkIGJlIGxhaWQgb3V0IGludG8gYSBncmlkIHVzaW5nIHRoZSBsZWdhY3kgYWxnb3JpdGhtIHVzZWQgaW4gTkFFIHZlcnNpb25zIDwgNC4wLjBcbiAgICAgKiBAcGFyYW0gc3ViZ3JpZCB0aGUgb2JqZWN0IHRoYXQgaG9sZHMgdGhlIGNvbnRleHQgb2YgdGhlIGNvbXB1dGVkIGxheW91dGluZyB1bml0XG4gICAgICovXG4gICAgcHJvdGVjdGVkIGNvbXB1dGVMZWdhY3lMYXlvdXQoZGF0YUdyb3VwOiBEYXRhR3JvdXAsIHN1YmdyaWQ6IFN1YmdyaWQpIHtcbiAgICAgICAgaWYgKHN1YmdyaWQuY29scyAhPT0gNCkge1xuICAgICAgICAgICAgc3ViZ3JpZC5jb2xzID0gNDtcbiAgICAgICAgICAgIHRoaXMuX2xvZ2dlci53YXJuKGBUYXNrIHdpdGggaWQgJyR7dGhpcy50YXNrQ29udGVudFNlcnZpY2UudGFzay5zdHJpbmdJZH0nIGhhcyBhIGRhdGEgZ3JvdXAgd2l0aCBsZWdhY3kgbGF5b3V0IHdpdGggYSBgXG4gICAgICAgICAgICAgICAgKyBgbm9uLWRlZmF1bHQgbnVtYmVyIG9mIGNvbHVtbnMuIElmIHlvdSB3YW50IHRvIHVzZSBhIGxheW91dCB3aXRoIGRpZmZlcmVudCBudW1iZXIgb2YgY29sdW1ucyB0aGFuIDIgdXNlIGEgZGlmZmVyZW50IGBcbiAgICAgICAgICAgICAgICArIGBsYXlvdXQgdHlwZSBpbnN0ZWFkLmApO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5mbG93RmllbGRzKGRhdGFHcm91cCwgc3ViZ3JpZCwgMik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTGF5cyBvdXQgdGhlIGZpZWxkcyBmcm9tIGxlZnQgdG8gcmlnaHQsIGZyb20gdG9wIHRvIGJvdHRvbS4gSWYgdGhlIHdpZHRoIGlzIGdyZWF0ZXIgdGhhbiAxIGFuZCB0aGUgYmxvY2sgb2YgZmxvd2VkIGZpZWxkcyBkb2Vzbid0IGZpdFxuICAgICAqIG5lYXRseSBpbnRvIHRoZSBjb2x1bW5zIChpZiB0aGUgd2lkdGggb2YgYSBzaW5nbGUgZmllbGQgaXMgbm90IGEgZGl2aXNvciBvZiBjb2x1bW4gY291bnQpLCB0aGVuIHRoZSBlbnRpcmUgYmxvY2sgb2YgZmllbGRzIGlzXG4gICAgICogbGVmdCBhbGlnbmVkLiBUaGUgbGFzdCByb3cgb2YgZmllbGRzIGlzIGFsaWduZWQgdG8gdGhlIGxlZnQsIGNlbnRlciBvciByaWdodCBiYXNlZCBvbiB0aGUgZGF0YSBncm91cHMgcHJvcGVydHkuXG4gICAgICogSWYgdGhlIGxhc3Qgcm93IGNhbm5vdCBiZSBhbGlnbmVkIHRvIHRoZSBleGFjdCBjZW50ZXIgaXQgaXMgb2Zmc2V0IG9uZSBncmlkIHRpbGUgdG8gdGhlIGxlZnQuXG4gICAgICogQHBhcmFtIGRhdGFHcm91cCB0aGUgZGF0YSBncm91cCB0aGF0IHNob3VsZCBiZSBsYWlkIG91dCBpbnRvIGEgZ3JpZFxuICAgICAqIEBwYXJhbSBzdWJncmlkIHRoZSBvYmplY3QgdGhhdCBob2xkcyB0aGUgY29udGV4dCBvZiB0aGUgY29tcHV0ZWQgbGF5b3V0aW5nIHVuaXRcbiAgICAgKiBAcGFyYW0gZmllbGRXaWR0aCB0aGUgbnVtYmVyIG9mIGdyaWQgdGlsZXMsIHRoYXQgc2hvdWxkIGJlIG9jY3VwaWVkIGJ5IGVhY2ggZmllbGRcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZmxvd0ZpZWxkcyhkYXRhR3JvdXA6IERhdGFHcm91cCwgc3ViZ3JpZDogU3ViZ3JpZCwgZmllbGRXaWR0aDogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IGZpZWxkc1BlclJvdyA9IE1hdGguZmxvb3Ioc3ViZ3JpZC5jb2xzIC8gZmllbGRXaWR0aCk7XG4gICAgICAgIGNvbnN0IG1heFhQb3NpdGlvbiA9IGZpZWxkV2lkdGggKiAoZmllbGRzUGVyUm93IC0gMSk7XG5cbiAgICAgICAgbGV0IHhQb3NpdGlvbiA9IDA7XG4gICAgICAgIGNvbnN0IGxvY2FsR3JpZDogQXJyYXk8QXJyYXk8c3RyaW5nPj4gPSBbXTtcbiAgICAgICAgZGF0YUdyb3VwLmZpZWxkcy5mb3JFYWNoKChkYXRhRmllbGQsIGRhdGFGaWVsZENvdW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmaWVsZEVsZW1lbnQgPSBzdWJncmlkLmFkZEZpZWxkKGRhdGFGaWVsZCwgdGhpcy5fZmllbGRDb252ZXJ0ZXIucmVzb2x2ZVR5cGUoZGF0YUZpZWxkKSk7XG4gICAgICAgICAgICBpZiAoZGF0YUdyb3VwLnN0cmV0Y2gpIHtcbiAgICAgICAgICAgICAgICBzdWJncmlkLmFkZFJvdyh0aGlzLm5ld0dyaWRSb3coc3ViZ3JpZC5jb2xzLCBmaWVsZEVsZW1lbnQuZ3JpZEFyZWFJZCkpO1xuICAgICAgICAgICAgICAgIHJldHVybjsgLy8gY29udGludWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGVsc2VcbiAgICAgICAgICAgIGlmICh4UG9zaXRpb24gPT09IDApIHtcbiAgICAgICAgICAgICAgICBsb2NhbEdyaWQucHVzaCh0aGlzLm5ld0dyaWRSb3coc3ViZ3JpZC5jb2xzKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoeFBvc2l0aW9uID09PSAwICYmIHRoaXMuaXNMYXN0Um93KGRhdGFGaWVsZENvdW50LCBkYXRhR3JvdXAsIGZpZWxkc1BlclJvdykpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmaWVsZHNJbkxhc3RSb3cgPSBkYXRhR3JvdXAuZmllbGRzLmxlbmd0aCAlIGZpZWxkc1BlclJvdztcbiAgICAgICAgICAgICAgICBjb25zdCByb3dXaWR0aCA9IG1heFhQb3NpdGlvbiArIGZpZWxkV2lkdGg7XG4gICAgICAgICAgICAgICAgaWYgKGRhdGFHcm91cC5hbGlnbm1lbnQgPT09IERhdGFHcm91cEFsaWdubWVudC5FTkQpIHtcbiAgICAgICAgICAgICAgICAgICAgeFBvc2l0aW9uID0gcm93V2lkdGggLSBmaWVsZFdpZHRoICogZmllbGRzSW5MYXN0Um93O1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGF0YUdyb3VwLmFsaWdubWVudCA9PT0gRGF0YUdyb3VwQWxpZ25tZW50LkNFTlRFUikge1xuICAgICAgICAgICAgICAgICAgICB4UG9zaXRpb24gPSBNYXRoLmZsb29yKChyb3dXaWR0aCAtIGZpZWxkc0luTGFzdFJvdyAqIGZpZWxkV2lkdGgpIC8gMik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5vY2N1cHlTcGFjZShsb2NhbEdyaWQsIGxvY2FsR3JpZC5sZW5ndGggLSAxLCB4UG9zaXRpb24sIGZpZWxkV2lkdGgsIGZpZWxkRWxlbWVudC5ncmlkQXJlYUlkKTtcblxuICAgICAgICAgICAgeFBvc2l0aW9uICs9IGZpZWxkV2lkdGg7XG4gICAgICAgICAgICBpZiAoeFBvc2l0aW9uID4gbWF4WFBvc2l0aW9uKSB7XG4gICAgICAgICAgICAgICAgeFBvc2l0aW9uID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGxvY2FsR3JpZC5mb3JFYWNoKHJvdyA9PiBzdWJncmlkLmFkZFJvdyhyb3cpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gd2lkdGggd2lkdGggb2YgdGhlIHJvd1xuICAgICAqIEBwYXJhbSBjb250ZW50IHRoZSB2YWx1ZSB0aGF0IHNob3VsZCBiZSB1c2VkIHRvIGZpbGwgYWxsIGVsZW1lbnRzIGluIHRoZSByb3dcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgbmV3R3JpZFJvdyh3aWR0aDogbnVtYmVyLCBjb250ZW50ID0gJycpOiBBcnJheTxzdHJpbmc+IHtcbiAgICAgICAgcmV0dXJuIEFycmF5KHdpZHRoKS5maWxsKGNvbnRlbnQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpbGxzIHRoZSBzcGVjaWZpZWQgcmVjdGFuZ3VsYXIgYXJlYSB3aXRoIHRoZSBzcGVjaWZpZWQgdmFsdWUgaW4gdGhlIHByb3ZpZGVkIGdyaWQuXG4gICAgICpcbiAgICAgKiBJZiB0aGUgc3BlY2lmaWVkIGFyZWEgY29udGFpbnMgdmFsdWVzIG90aGVyIHRoYW4gdGhlIGVtcHR5IHN0cmluZyBhbiBlcnJvciB3aWxsIGJlIHRocm93bi5cbiAgICAgKiBAcGFyYW0gZ3JpZCB0aGUgZ3JpZCB0aGF0IHNob3VsZCBiZSBtb2RpZmllZFxuICAgICAqIEBwYXJhbSB5IHRoZSAwIGJhc2VkIHJvdyBpbmRleCBvZiB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBmaWxsZWQgYXJlYVxuICAgICAqIEBwYXJhbSB4IHRoZSAwIGJhc2VkIGNvbHVtbiBpbmRleCBvZiB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBmaWxsZWQgYXJlYVxuICAgICAqIEBwYXJhbSB3aWR0aCB0aGUgd2lkdGggb2YgdGhlIGZpbGxlZCBhcmVhXG4gICAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0aGF0IGlzIHNldCBpbnRvIGV2ZXJ5IGNlbGwgb2YgdGhlIGdyaWQgaW5zaWRlIHRoZSBzcGVjaWZpZWQgYXJlYVxuICAgICAqIEBwYXJhbSBoZWlnaHQgdGhlIGhlaWdodCBvZiB0aGUgZmlsbGVkIGFyZWFcbiAgICAgKiBAcGFyYW0gY2hlY2tPY2N1cGFudHMgd2hldGhlciB0aGUgZmlsbGVkIGFyZWEgc2hvdWxkIGJlIGNoZWNrZWQgZm9yIG90aGVyIGVsZW1lbnRzLlxuICAgICAqIElmIGEgY2hlY2sgaXMgcGVyZm9ybWVkIGFuIGVycm9yIHdpbGwgYmUgdGhyb3duIGlmIGVsZW1lbnRzIGFyZSBmb3VuZC5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgb2NjdXB5U3BhY2UoZ3JpZDogQXJyYXk8QXJyYXk8c3RyaW5nPj4sIHk6IG51bWJlciwgeDogbnVtYmVyLCB3aWR0aDogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogc3RyaW5nLCBoZWlnaHQgPSAxLCBjaGVja09jY3VwYW50cyA9IHRydWUpIHtcbiAgICAgICAgZm9yIChsZXQgaiA9IHk7IGogPCB5ICsgaGVpZ2h0OyBqKyspIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSB4OyBpIDwgeCArIHdpZHRoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoY2hlY2tPY2N1cGFudHMgJiYgZ3JpZFtqXVtpXSAhPT0gJycpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgcGxhY2UgZWxlbWVudCAke3ZhbHVlfSBpbnRvIHRoZSBncmlkIGxheW91dCwgYmVjYXVzZSBpdCdzIHNwYWNlICh4OiAke2l9LCB5OiAke2p9KWAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYCBpcyBhbHJlYWR5IG9jY3VwaWVkIGJ5IGFub3RoZXIgZWxlbWVudCAoJHtncmlkW2pdW2ldfSlgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZ3JpZFtqXVtpXSA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIGluZGV4IHRoZSBpbmRleCBvZiB0aGUgY2hlY2tlZCBlbGVtZW50IHdpdGhpbiBpdHMgZGF0YSBncm91cFxuICAgICAqIEBwYXJhbSBkYXRhR3JvdXAgdGhlIGNoZWNrZWQgZGF0YSBncm91cFxuICAgICAqIEBwYXJhbSBmaWVsZHNQZXJSb3cgdGhlIG51bWJlciBvZiBmaWVsZHMgdGhhdCBpcyByZXF1aXJlZCB0byBmaWxsIGFuIGVudGlyZSByb3dcbiAgICAgKiBAcmV0dXJucyB3aGV0aGVyIHRoZSBmaWVsZCBhdCB0aGUgZ2l2ZW4gaW5kZXggaXMgd2l0aGluIHRoZSBsYXN0IHJvdyBvZiBlbGVtZW50cyBvZiB0aGUgcHJvdmlkZWQgZGF0YSBncm91cC5cbiAgICAgKiBOb3RlIHRoYXQgaWYgdGhlIGxhc3Qgcm93IGNvbnRhaW5zIGVub3VnaCBlbGVtZW50cyB0byBiZSBjb21wbGV0ZWx5IGZpbGxlZCB0aGlzIG1ldGhvZCByZXR1cm5zIGBmYWxzZWAuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGlzTGFzdFJvdyhpbmRleDogbnVtYmVyLCBkYXRhR3JvdXA6IERhdGFHcm91cCwgZmllbGRzUGVyUm93OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGluZGV4ICsgZmllbGRzUGVyUm93ID49IGRhdGFHcm91cC5maWVsZHMubGVuZ3RoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlc3Ryb3lzIHRoZSBwcmV2aW91cyBjb250ZW50IGFuZCBwdXNoZXMgdGhlIG5ldyBjb250ZW50IGludG8gdGhlIHN0cmVhbVxuICAgICAqIEBwYXJhbSBjb250ZW50IHRoZSBuZXcgY29udGVudFxuICAgICAqL1xuICAgIHByb3RlY3RlZCByZW5kZXJDb250ZW50KGNvbnRlbnQ6IEFycmF5PFN1YmdyaWQ+ID0gW10pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fZGF0YVNvdXJjZSQudmFsdWUuZm9yRWFjaChzdWJncmlkID0+IHN1YmdyaWQuZGVzdHJveSgpKTtcbiAgICAgICAgdGhpcy5fZGF0YVNvdXJjZSQubmV4dChjb250ZW50KTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgY3JlYXRlU3ViZ3JpZElkKGRhdGFHcm91cDogRGF0YUdyb3VwKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IGlkQmFzZTogc3RyaW5nO1xuICAgICAgICBpZiAoZGF0YUdyb3VwLnBhcmVudFRhc2tJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBpZEJhc2UgPSBbZGF0YUdyb3VwLnBhcmVudFRhc2tJZCwgZGF0YUdyb3VwLnBhcmVudFRhc2tSZWZJZCwgZGF0YUdyb3VwLm5lc3RpbmdMZXZlbF0uam9pbignIycpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWRCYXNlID0gJ3Jvb3QnO1xuICAgICAgICB9XG4gICAgICAgIGxldCBpZCA9IGlkQmFzZTtcbiAgICAgICAgd2hpbGUgKHRoaXMuX2V4aXN0aW5nU3ViZ3JpZElkcy5oYXMoaWQpKSB7XG4gICAgICAgICAgICBpZCA9IGlkQmFzZSArIHRoaXMuX3N1YmdyaWRJZENvdW50ZXIubmV4dCgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2V4aXN0aW5nU3ViZ3JpZElkcy5hZGQoaWQpO1xuICAgICAgICByZXR1cm4gaWQ7XG4gICAgfVxuXG4gICAgcHVibGljIHRyYWNrQnlTdWJncmlkRm4gPSAoaW5kZXg6IG51bWJlciwgc3ViZ3JpZDogU3ViZ3JpZCkgPT4gc3ViZ3JpZC5zdWJncmlkSWQ7XG5cbiAgICBwdWJsaWMgdHJhY2tCeUZuID0gKGluZGV4OiBudW1iZXIsIGVsZW1lbnQ6IERhdGFmaWVsZEdyaWRMYXlvdXRFbGVtZW50KSA9PiB0aGlzLnRyYWNrQnlEYXRhZmllbGRzKGluZGV4LCBlbGVtZW50KTtcblxuICAgIHByb3RlY3RlZCB0cmFja0J5RGF0YWZpZWxkcyhpbmRleDogbnVtYmVyLCBlbGVtZW50OiBEYXRhZmllbGRHcmlkTGF5b3V0RWxlbWVudCkge1xuICAgICAgICBzd2l0Y2ggKGVsZW1lbnQudHlwZSkge1xuICAgICAgICAgICAgY2FzZSBUYXNrRWxlbWVudFR5cGUuQkxBTks6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuZ3JpZEFyZWFJZCArICctJyArIHRoaXMudGFza0NvbnRlbnRTZXJ2aWNlLiRzaG91bGRDcmVhdGVDb3VudGVyLmdldFZhbHVlKCk7XG4gICAgICAgICAgICBjYXNlIFRhc2tFbGVtZW50VHlwZS5MT0FERVI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuZ3JpZEFyZWFJZCArICctTC0nICsgdGhpcy50YXNrQ29udGVudFNlcnZpY2UuJHNob3VsZENyZWF0ZUNvdW50ZXIuZ2V0VmFsdWUoKTtcbiAgICAgICAgICAgIGNhc2UgVGFza0VsZW1lbnRUeXBlLkRBVEFfR1JPVVBfVElUTEU6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQudGl0bGUgKyAnLScgKyB0aGlzLnRhc2tDb250ZW50U2VydmljZS4kc2hvdWxkQ3JlYXRlQ291bnRlci5nZXRWYWx1ZSgpO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudC5pdGVtLnN0cmluZ0lkICsgJy0nICsgdGhpcy50YXNrQ29udGVudFNlcnZpY2UuJHNob3VsZENyZWF0ZUNvdW50ZXIuZ2V0VmFsdWUoKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiJdfQ==
@@ -2,7 +2,7 @@
2
2
  * The user object that is used by the frontend in its logic.
3
3
  */
4
4
  export class User {
5
- constructor(id, email, firstName, lastName, authorities, roles, groups, nextGroups) {
5
+ constructor(id, email, firstName, lastName, authorities, roles, groups, nextGroups, impersonated) {
6
6
  this.id = id;
7
7
  this.email = email;
8
8
  this.firstName = firstName;
@@ -11,6 +11,7 @@ export class User {
11
11
  this.roles = roles;
12
12
  this.groups = groups;
13
13
  this.nextGroups = nextGroups;
14
+ this.impersonated = impersonated;
14
15
  }
15
16
  get fullName() {
16
17
  return this.firstName + ' ' + this.lastName;
@@ -33,5 +34,17 @@ export class User {
33
34
  isEmpty() {
34
35
  return this.id === '';
35
36
  }
37
+ /**
38
+ * @returns self if no impersonated user is present, or impersonated user otherwise
39
+ */
40
+ getSelfOrImpersonated() {
41
+ return this.isImpersonating() ? this.impersonated : this;
42
+ }
43
+ /**
44
+ * @returns true if user is impersonating another user
45
+ */
46
+ isImpersonating() {
47
+ return !!this.impersonated;
48
+ }
36
49
  }
37
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25ldGdyaWYtY29tcG9uZW50cy1jb3JlL3NyYy9saWIvdXNlci9tb2RlbHMvdXNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFHQTs7R0FFRztBQUNILE1BQU0sT0FBTyxJQUFJO0lBRWIsWUFDVyxFQUFVLEVBQ1YsS0FBYSxFQUNiLFNBQWlCLEVBQ2pCLFFBQWdCLEVBQ2hCLFdBQTBCLEVBQzFCLEtBQXlCLEVBQ3pCLE1BQXNCLEVBQ3RCLFVBQTBCO1FBUDFCLE9BQUUsR0FBRixFQUFFLENBQVE7UUFDVixVQUFLLEdBQUwsS0FBSyxDQUFRO1FBQ2IsY0FBUyxHQUFULFNBQVMsQ0FBUTtRQUNqQixhQUFRLEdBQVIsUUFBUSxDQUFRO1FBQ2hCLGdCQUFXLEdBQVgsV0FBVyxDQUFlO1FBQzFCLFVBQUssR0FBTCxLQUFLLENBQW9CO1FBQ3pCLFdBQU0sR0FBTixNQUFNLENBQWdCO1FBQ3RCLGVBQVUsR0FBVixVQUFVLENBQWdCO0lBRXJDLENBQUM7SUFFRCxJQUFJLFFBQVE7UUFDUixPQUFPLElBQUksQ0FBQyxTQUFTLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDaEQsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBVyxJQUFJO1FBQ1gsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQzFCLENBQUM7SUFFRDs7T0FFRztJQUNILElBQVcsT0FBTztRQUNkLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN6QixDQUFDO0lBRUQ7O09BRUc7SUFDSSxPQUFPO1FBQ1YsT0FBTyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQztJQUMxQixDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1Byb2Nlc3NSb2xlfSBmcm9tICcuLi8uLi9yZXNvdXJjZXMvaW50ZXJmYWNlL3Byb2Nlc3Mtcm9sZSc7XG5pbXBvcnQge0lVc2VyfSBmcm9tICcuL2l1c2VyJztcblxuLyoqXG4gKiBUaGUgdXNlciBvYmplY3QgdGhhdCBpcyB1c2VkIGJ5IHRoZSBmcm9udGVuZCBpbiBpdHMgbG9naWMuXG4gKi9cbmV4cG9ydCBjbGFzcyBVc2VyIGltcGxlbWVudHMgSVVzZXIge1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyBpZDogc3RyaW5nLFxuICAgICAgICBwdWJsaWMgZW1haWw6IHN0cmluZyxcbiAgICAgICAgcHVibGljIGZpcnN0TmFtZTogc3RyaW5nLFxuICAgICAgICBwdWJsaWMgbGFzdE5hbWU6IHN0cmluZyxcbiAgICAgICAgcHVibGljIGF1dGhvcml0aWVzOiBBcnJheTxzdHJpbmc+LFxuICAgICAgICBwdWJsaWMgcm9sZXM6IEFycmF5PFByb2Nlc3NSb2xlPixcbiAgICAgICAgcHVibGljIGdyb3Vwcz86IEFycmF5PHN0cmluZz4sXG4gICAgICAgIHB1YmxpYyBuZXh0R3JvdXBzPzogQXJyYXk8c3RyaW5nPlxuICAgICkge1xuICAgIH1cblxuICAgIGdldCBmdWxsTmFtZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmlyc3ROYW1lICsgJyAnICsgdGhpcy5sYXN0TmFtZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTeW5vbnltIGZvciBgZmlyc3ROYW1lYC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmlyc3ROYW1lO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFN5bm9ueW0gZm9yIGBsYXN0TmFtZWAuXG4gICAgICovXG4gICAgcHVibGljIGdldCBzdXJuYW1lKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmxhc3ROYW1lO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgVXNlciBvYmplY3QgcmVwcmVzZW50cyBhbiBlbXB0eSB1c2VyLCBgZmFsc2VgIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgaXNFbXB0eSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaWQgPT09ICcnO1xuICAgIH1cbn1cbiJdfQ==
50
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25ldGdyaWYtY29tcG9uZW50cy1jb3JlL3NyYy9saWIvdXNlci9tb2RlbHMvdXNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFHQTs7R0FFRztBQUNILE1BQU0sT0FBTyxJQUFJO0lBRWIsWUFDVyxFQUFVLEVBQ1YsS0FBYSxFQUNiLFNBQWlCLEVBQ2pCLFFBQWdCLEVBQ2hCLFdBQTBCLEVBQzFCLEtBQXlCLEVBQ3pCLE1BQXNCLEVBQ3RCLFVBQTBCLEVBQzFCLFlBQW1CO1FBUm5CLE9BQUUsR0FBRixFQUFFLENBQVE7UUFDVixVQUFLLEdBQUwsS0FBSyxDQUFRO1FBQ2IsY0FBUyxHQUFULFNBQVMsQ0FBUTtRQUNqQixhQUFRLEdBQVIsUUFBUSxDQUFRO1FBQ2hCLGdCQUFXLEdBQVgsV0FBVyxDQUFlO1FBQzFCLFVBQUssR0FBTCxLQUFLLENBQW9CO1FBQ3pCLFdBQU0sR0FBTixNQUFNLENBQWdCO1FBQ3RCLGVBQVUsR0FBVixVQUFVLENBQWdCO1FBQzFCLGlCQUFZLEdBQVosWUFBWSxDQUFPO0lBRTlCLENBQUM7SUFFRCxJQUFJLFFBQVE7UUFDUixPQUFPLElBQUksQ0FBQyxTQUFTLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDaEQsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBVyxJQUFJO1FBQ1gsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQzFCLENBQUM7SUFFRDs7T0FFRztJQUNILElBQVcsT0FBTztRQUNkLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN6QixDQUFDO0lBRUQ7O09BRUc7SUFDSSxPQUFPO1FBQ1YsT0FBTyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRUQ7O09BRUc7SUFDSSxxQkFBcUI7UUFDeEIsT0FBTyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUM3RCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxlQUFlO1FBQ2xCLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUM7SUFDL0IsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtQcm9jZXNzUm9sZX0gZnJvbSAnLi4vLi4vcmVzb3VyY2VzL2ludGVyZmFjZS9wcm9jZXNzLXJvbGUnO1xuaW1wb3J0IHtJVXNlcn0gZnJvbSAnLi9pdXNlcic7XG5cbi8qKlxuICogVGhlIHVzZXIgb2JqZWN0IHRoYXQgaXMgdXNlZCBieSB0aGUgZnJvbnRlbmQgaW4gaXRzIGxvZ2ljLlxuICovXG5leHBvcnQgY2xhc3MgVXNlciBpbXBsZW1lbnRzIElVc2VyIHtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgaWQ6IHN0cmluZyxcbiAgICAgICAgcHVibGljIGVtYWlsOiBzdHJpbmcsXG4gICAgICAgIHB1YmxpYyBmaXJzdE5hbWU6IHN0cmluZyxcbiAgICAgICAgcHVibGljIGxhc3ROYW1lOiBzdHJpbmcsXG4gICAgICAgIHB1YmxpYyBhdXRob3JpdGllczogQXJyYXk8c3RyaW5nPixcbiAgICAgICAgcHVibGljIHJvbGVzOiBBcnJheTxQcm9jZXNzUm9sZT4sXG4gICAgICAgIHB1YmxpYyBncm91cHM/OiBBcnJheTxzdHJpbmc+LFxuICAgICAgICBwdWJsaWMgbmV4dEdyb3Vwcz86IEFycmF5PHN0cmluZz4sXG4gICAgICAgIHB1YmxpYyBpbXBlcnNvbmF0ZWQ/OiBVc2VyXG4gICAgKSB7XG4gICAgfVxuXG4gICAgZ2V0IGZ1bGxOYW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5maXJzdE5hbWUgKyAnICcgKyB0aGlzLmxhc3ROYW1lO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFN5bm9ueW0gZm9yIGBmaXJzdE5hbWVgLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5maXJzdE5hbWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU3lub255bSBmb3IgYGxhc3ROYW1lYC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHN1cm5hbWUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGFzdE5hbWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBVc2VyIG9iamVjdCByZXByZXNlbnRzIGFuIGVtcHR5IHVzZXIsIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIHB1YmxpYyBpc0VtcHR5KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5pZCA9PT0gJyc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybnMgc2VsZiBpZiBubyBpbXBlcnNvbmF0ZWQgdXNlciBpcyBwcmVzZW50LCBvciBpbXBlcnNvbmF0ZWQgdXNlciBvdGhlcndpc2VcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0U2VsZk9ySW1wZXJzb25hdGVkKCk6IFVzZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5pc0ltcGVyc29uYXRpbmcoKSA/IHRoaXMuaW1wZXJzb25hdGVkIDogdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyB0cnVlIGlmIHVzZXIgaXMgaW1wZXJzb25hdGluZyBhbm90aGVyIHVzZXJcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNJbXBlcnNvbmF0aW5nKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gISF0aGlzLmltcGVyc29uYXRlZDtcbiAgICB9XG59XG4iXX0=