@seniorsistemas/angular-components 19.9.7 → 19.9.8-develop-dbc2f1b4

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 (162) hide show
  1. package/card/lib/card/card.component.d.ts +6 -2
  2. package/country-phone-picker/lib/country-phone-picker/country-phone-picker.component.d.ts +0 -1
  3. package/dialog/lib/src/dialog/services/dialog.service.d.ts +2 -0
  4. package/esm2022/accordion/lib/accordion/components/accordion-panel/accordion-panel.component.mjs +3 -3
  5. package/esm2022/autocomplete/lib/autocomplete/autocomplete.component.mjs +8 -3
  6. package/esm2022/autocomplete/lib/autocomplete/components/autocomplete-chip/autocomplete-chip.component.mjs +4 -3
  7. package/esm2022/breadcrumb/lib/breadcrumb/breadcrumb.component.mjs +3 -3
  8. package/esm2022/breadcrumb/lib/dynamic-breadcrumb/dynamic-breadcrumb.component.mjs +4 -2
  9. package/esm2022/button/lib/button/button.component.mjs +3 -3
  10. package/esm2022/card/lib/card/card.component.mjs +13 -5
  11. package/esm2022/checkbox/lib/checkbox/checkbox.component.mjs +3 -3
  12. package/esm2022/checkbox-list/lib/checkbox-list/checkbox-list.component.mjs +3 -3
  13. package/esm2022/chips/lib/chips/chip-item/chip-item.component.mjs +3 -3
  14. package/esm2022/chips/lib/chips/chips/chips.component.mjs +3 -3
  15. package/esm2022/code-editor/lib/code-editor/infra/cores/codemirror-6/themes/sds-light/sds-light-style.mjs +3 -2
  16. package/esm2022/collapse-link/lib/collapse-link/collapse-link.component.mjs +3 -3
  17. package/esm2022/country-phone-picker/lib/country-phone-picker/country-phone-picker.component.mjs +14 -9
  18. package/esm2022/datepicker/lib/datepicker/datepicker.component.mjs +3 -3
  19. package/esm2022/dialog/lib/src/dialog/dialog.component.mjs +3 -3
  20. package/esm2022/dialog/lib/src/dialog/services/dialog.service.mjs +13 -1
  21. package/esm2022/drawer/lib/drawer/drawer.component.mjs +3 -3
  22. package/esm2022/dynamic-form/dynamic-form/components/lookup/lookup.component.mjs +3 -3
  23. package/esm2022/dynamic-form/dynamic-form/form-field/fields/bignumber/bignumber-field.component.mjs +3 -3
  24. package/esm2022/dynamic-form/dynamic-form/form-field/fields/currency/currency-field.component.mjs +6 -4
  25. package/esm2022/dynamic-form/dynamic-form/form-field/fields/number/number-field.component.mjs +3 -3
  26. package/esm2022/dynamic-form/dynamic-form/form-field/fields/password/password-field.component.mjs +3 -3
  27. package/esm2022/dynamic-form/dynamic-form/form-field/fields/text/text-field.component.mjs +3 -3
  28. package/esm2022/editor/lib/editor/editor.component.mjs +3 -3
  29. package/esm2022/editor/lib/editor/toolbar-button/editor-toolbar-button.component.mjs +3 -3
  30. package/esm2022/fieldset/lib/fieldset/fieldset.component.mjs +3 -3
  31. package/esm2022/file-picker/lib/file-picker/file-picker.component.mjs +3 -3
  32. package/esm2022/gantt/lib/gantt/components/gantt/bar.mjs +2 -1
  33. package/esm2022/gantt/lib/gantt/gantt.component.mjs +3 -3
  34. package/esm2022/global-search/lib/global-search/global-search.component.mjs +16 -25
  35. package/esm2022/grid-menu/lib/grid-menu/components/grid-menu-item/grid-menu-item.component.mjs +3 -3
  36. package/esm2022/input-text/lib/input-text/input-text.directive.mjs +3 -3
  37. package/esm2022/lib/locale/fallback.mjs +5 -2
  38. package/esm2022/navigation-button/lib/navigation-button/navigation-button.component.mjs +3 -3
  39. package/esm2022/object-card/lib/object-card/object-card.component.mjs +3 -3
  40. package/esm2022/paginator/lib/paginator/paginator.component.mjs +3 -3
  41. package/esm2022/pin-code-field/lib/pin-code-field/pin-code-field.component.mjs +3 -3
  42. package/esm2022/radio-button/lib/radio-button/radio-button.component.mjs +4 -10
  43. package/esm2022/rating-scale/lib/rating-scale/rating-scale.component.mjs +3 -3
  44. package/esm2022/select/lib/select/select.component.mjs +3 -3
  45. package/esm2022/select-button/lib/select-button/components/select-button-item/select-button-item.component.mjs +3 -3
  46. package/esm2022/shared/lib/accessibility/datepicker-no-period-tab.directive.mjs +6 -6
  47. package/esm2022/side-sheet/lib/side-sheet/side-sheet.component.mjs +3 -3
  48. package/esm2022/slider/lib/slider/slider.component.mjs +67 -65
  49. package/esm2022/slider/lib/slider/slider.module.mjs +2 -2
  50. package/esm2022/split-button/lib/split-button/split-button.component.mjs +3 -3
  51. package/esm2022/star-rating/star-rating/star-rating.component.mjs +3 -3
  52. package/esm2022/stepper/lib/stepper/stepper.component.mjs +3 -3
  53. package/esm2022/switch/lib/switch/switch.component.mjs +5 -19
  54. package/esm2022/tabs/lib/tabs/tabs.component.mjs +3 -3
  55. package/esm2022/text-area/lib/text-area/text-area.component.mjs +3 -3
  56. package/esm2022/thumbnail/lib/thumbnail/thumbnail.component.mjs +10 -3
  57. package/esm2022/thumbnails/lib/thumbnails/components/thumbnail-item/thumbnail-item.component.mjs +3 -3
  58. package/esm2022/tiered-menu/lib/tiered-menu/components/tiered-menu-item/tiered-menu-item.component.mjs +3 -3
  59. package/esm2022/tiered-menu/lib/tiered-menu/services/tiered-menu.global.service.mjs +4 -3
  60. package/esm2022/tile/lib/tile/tile.component.mjs +3 -3
  61. package/esm2022/tree/lib/tree/components/tree-node-item/tree-node-item.component.mjs +20 -3
  62. package/esm2022/workspace-switch/lib/workspace-switch/workspace-switch.component.mjs +3 -3
  63. package/fesm2022/seniorsistemas-angular-components-accordion.mjs +2 -2
  64. package/fesm2022/seniorsistemas-angular-components-accordion.mjs.map +1 -1
  65. package/fesm2022/seniorsistemas-angular-components-autocomplete.mjs +10 -5
  66. package/fesm2022/seniorsistemas-angular-components-autocomplete.mjs.map +1 -1
  67. package/fesm2022/seniorsistemas-angular-components-breadcrumb.mjs +5 -3
  68. package/fesm2022/seniorsistemas-angular-components-breadcrumb.mjs.map +1 -1
  69. package/fesm2022/seniorsistemas-angular-components-button.mjs +2 -2
  70. package/fesm2022/seniorsistemas-angular-components-button.mjs.map +1 -1
  71. package/fesm2022/seniorsistemas-angular-components-card.mjs +12 -4
  72. package/fesm2022/seniorsistemas-angular-components-card.mjs.map +1 -1
  73. package/fesm2022/seniorsistemas-angular-components-checkbox-list.mjs +2 -2
  74. package/fesm2022/seniorsistemas-angular-components-checkbox-list.mjs.map +1 -1
  75. package/fesm2022/seniorsistemas-angular-components-checkbox.mjs +2 -2
  76. package/fesm2022/seniorsistemas-angular-components-checkbox.mjs.map +1 -1
  77. package/fesm2022/seniorsistemas-angular-components-chips.mjs +4 -4
  78. package/fesm2022/seniorsistemas-angular-components-chips.mjs.map +1 -1
  79. package/fesm2022/seniorsistemas-angular-components-code-editor.mjs +2 -1
  80. package/fesm2022/seniorsistemas-angular-components-code-editor.mjs.map +1 -1
  81. package/fesm2022/seniorsistemas-angular-components-collapse-link.mjs +2 -2
  82. package/fesm2022/seniorsistemas-angular-components-collapse-link.mjs.map +1 -1
  83. package/fesm2022/seniorsistemas-angular-components-country-phone-picker.mjs +13 -8
  84. package/fesm2022/seniorsistemas-angular-components-country-phone-picker.mjs.map +1 -1
  85. package/fesm2022/seniorsistemas-angular-components-datepicker.mjs +2 -2
  86. package/fesm2022/seniorsistemas-angular-components-datepicker.mjs.map +1 -1
  87. package/fesm2022/seniorsistemas-angular-components-dialog.mjs +14 -2
  88. package/fesm2022/seniorsistemas-angular-components-dialog.mjs.map +1 -1
  89. package/fesm2022/seniorsistemas-angular-components-drawer.mjs +2 -2
  90. package/fesm2022/seniorsistemas-angular-components-drawer.mjs.map +1 -1
  91. package/fesm2022/seniorsistemas-angular-components-dynamic-form.mjs +13 -12
  92. package/fesm2022/seniorsistemas-angular-components-dynamic-form.mjs.map +1 -1
  93. package/fesm2022/seniorsistemas-angular-components-editor.mjs +4 -4
  94. package/fesm2022/seniorsistemas-angular-components-editor.mjs.map +1 -1
  95. package/fesm2022/seniorsistemas-angular-components-fieldset.mjs +2 -2
  96. package/fesm2022/seniorsistemas-angular-components-fieldset.mjs.map +1 -1
  97. package/fesm2022/seniorsistemas-angular-components-file-picker.mjs +2 -2
  98. package/fesm2022/seniorsistemas-angular-components-file-picker.mjs.map +1 -1
  99. package/fesm2022/seniorsistemas-angular-components-gantt.mjs +3 -2
  100. package/fesm2022/seniorsistemas-angular-components-gantt.mjs.map +1 -1
  101. package/fesm2022/seniorsistemas-angular-components-global-search.mjs +14 -23
  102. package/fesm2022/seniorsistemas-angular-components-global-search.mjs.map +1 -1
  103. package/fesm2022/seniorsistemas-angular-components-grid-menu.mjs +2 -2
  104. package/fesm2022/seniorsistemas-angular-components-grid-menu.mjs.map +1 -1
  105. package/fesm2022/seniorsistemas-angular-components-input-text.mjs +2 -2
  106. package/fesm2022/seniorsistemas-angular-components-input-text.mjs.map +1 -1
  107. package/fesm2022/seniorsistemas-angular-components-navigation-button.mjs +2 -2
  108. package/fesm2022/seniorsistemas-angular-components-navigation-button.mjs.map +1 -1
  109. package/fesm2022/seniorsistemas-angular-components-object-card.mjs +2 -2
  110. package/fesm2022/seniorsistemas-angular-components-object-card.mjs.map +1 -1
  111. package/fesm2022/seniorsistemas-angular-components-paginator.mjs +2 -2
  112. package/fesm2022/seniorsistemas-angular-components-paginator.mjs.map +1 -1
  113. package/fesm2022/seniorsistemas-angular-components-pin-code-field.mjs +2 -2
  114. package/fesm2022/seniorsistemas-angular-components-pin-code-field.mjs.map +1 -1
  115. package/fesm2022/seniorsistemas-angular-components-radio-button.mjs +3 -9
  116. package/fesm2022/seniorsistemas-angular-components-radio-button.mjs.map +1 -1
  117. package/fesm2022/seniorsistemas-angular-components-rating-scale.mjs +2 -2
  118. package/fesm2022/seniorsistemas-angular-components-rating-scale.mjs.map +1 -1
  119. package/fesm2022/seniorsistemas-angular-components-select-button.mjs +2 -2
  120. package/fesm2022/seniorsistemas-angular-components-select-button.mjs.map +1 -1
  121. package/fesm2022/seniorsistemas-angular-components-select.mjs +2 -2
  122. package/fesm2022/seniorsistemas-angular-components-select.mjs.map +1 -1
  123. package/fesm2022/seniorsistemas-angular-components-shared.mjs +5 -5
  124. package/fesm2022/seniorsistemas-angular-components-shared.mjs.map +1 -1
  125. package/fesm2022/seniorsistemas-angular-components-side-sheet.mjs +2 -2
  126. package/fesm2022/seniorsistemas-angular-components-side-sheet.mjs.map +1 -1
  127. package/fesm2022/seniorsistemas-angular-components-slider.mjs +67 -65
  128. package/fesm2022/seniorsistemas-angular-components-slider.mjs.map +1 -1
  129. package/fesm2022/seniorsistemas-angular-components-split-button.mjs +2 -2
  130. package/fesm2022/seniorsistemas-angular-components-split-button.mjs.map +1 -1
  131. package/fesm2022/seniorsistemas-angular-components-star-rating.mjs +2 -2
  132. package/fesm2022/seniorsistemas-angular-components-star-rating.mjs.map +1 -1
  133. package/fesm2022/seniorsistemas-angular-components-stepper.mjs +2 -2
  134. package/fesm2022/seniorsistemas-angular-components-stepper.mjs.map +1 -1
  135. package/fesm2022/seniorsistemas-angular-components-switch.mjs +4 -18
  136. package/fesm2022/seniorsistemas-angular-components-switch.mjs.map +1 -1
  137. package/fesm2022/seniorsistemas-angular-components-tabs.mjs +2 -2
  138. package/fesm2022/seniorsistemas-angular-components-tabs.mjs.map +1 -1
  139. package/fesm2022/seniorsistemas-angular-components-text-area.mjs +2 -2
  140. package/fesm2022/seniorsistemas-angular-components-text-area.mjs.map +1 -1
  141. package/fesm2022/seniorsistemas-angular-components-thumbnail.mjs +9 -2
  142. package/fesm2022/seniorsistemas-angular-components-thumbnail.mjs.map +1 -1
  143. package/fesm2022/seniorsistemas-angular-components-thumbnails.mjs +2 -2
  144. package/fesm2022/seniorsistemas-angular-components-thumbnails.mjs.map +1 -1
  145. package/fesm2022/seniorsistemas-angular-components-tiered-menu.mjs +5 -4
  146. package/fesm2022/seniorsistemas-angular-components-tiered-menu.mjs.map +1 -1
  147. package/fesm2022/seniorsistemas-angular-components-tile.mjs +2 -2
  148. package/fesm2022/seniorsistemas-angular-components-tile.mjs.map +1 -1
  149. package/fesm2022/seniorsistemas-angular-components-tree.mjs +20 -3
  150. package/fesm2022/seniorsistemas-angular-components-tree.mjs.map +1 -1
  151. package/fesm2022/seniorsistemas-angular-components-workspace-switch.mjs +2 -2
  152. package/fesm2022/seniorsistemas-angular-components-workspace-switch.mjs.map +1 -1
  153. package/fesm2022/seniorsistemas-angular-components.mjs +4 -1
  154. package/fesm2022/seniorsistemas-angular-components.mjs.map +1 -1
  155. package/global-search/lib/global-search/global-search.component.d.ts +7 -3
  156. package/package.json +1 -1
  157. package/radio-button/lib/radio-button/radio-button.component.d.ts +0 -1
  158. package/slider/lib/slider/slider.component.d.ts +25 -7
  159. package/styles.css +5 -0
  160. package/switch/lib/switch/switch.component.d.ts +0 -2
  161. package/thumbnail/lib/thumbnail/thumbnail.component.d.ts +1 -0
  162. package/tree/lib/tree/components/tree-node-item/tree-node-item.component.d.ts +4 -0
@@ -1436,7 +1436,7 @@ export class DatepickerComponent {
1436
1436
  useExisting: DatepickerComponent,
1437
1437
  multi: true,
1438
1438
  },
1439
- ], viewQueries: [{ propertyName: "popupPanel", first: true, predicate: ["popupPanel"], descendants: true, read: ElementRef, isSignal: true }, { propertyName: "increaseHourButton", first: true, predicate: ["increaseHourButton"], descendants: true, read: ElementRef, isSignal: true }, { propertyName: "iconButton", first: true, predicate: ["iconButton"], descendants: true, read: ElementRef, isSignal: true }, { propertyName: "triggerInput", first: true, predicate: ["triggerInput"], descendants: true, read: ElementRef, isSignal: true }], ngImport: i0, template: "<div\n cdkOverlayOrigin\n #trigger=\"cdkOverlayOrigin\"\n class=\"relative flex w-full items-center\"\n role=\"combobox\"\n aria-haspopup=\"grid\"\n [attr.aria-expanded]=\"isOpen()\"\n [attr.aria-controls]=\"popupId()\"\n>\n <input\n #triggerInput\n class=\"h-[35px] w-full rounded-small border border-solid border-grayscale-30 pl-3 text-sm outline-none transition-colors focus:border-primary\"\n [class.pr-10]=\"showIcon() && !showClear()\"\n [class.pr-16]=\"showIcon() && showClear()\"\n [class.pr-6]=\"!showIcon() && showClear()\"\n [class.bg-grayscale-0]=\"!disabled()\"\n [class.text-grayscale-90]=\"!disabled()\"\n [class.border-grayscale-20]=\"disabled()\"\n [class.bg-grayscale-5]=\"disabled()\"\n [class.text-grayscale-30]=\"disabled()\"\n [class.cursor-not-allowed]=\"disabled()\"\n [id]=\"inputId()\"\n [name]=\"name() ?? inputId()\"\n type=\"text\"\n [placeholder]=\"placeholder() ?? (placeholderKey() | translate)\"\n [disabled]=\"disabled()\"\n [readonly]=\"\n readonlyInput() ||\n mode() === 'range' ||\n mode() === 'year' ||\n isMultipleMode() ||\n (isSegmentModeCandidate() && isTouchDevice())\n \"\n [tabIndex]=\"tabindex() ?? null\"\n [autofocus]=\"autofocus()\"\n [(ngModel)]=\"inputDate\"\n (ngModelChange)=\"handleInputChange($event)\"\n (focus)=\"handleInputFocus($event)\"\n (blur)=\"handleInputBlur($event)\"\n (mousedown)=\"handleInputClick($event)\"\n (keydown)=\"handleTriggerKeydown($event)\"\n (input)=\"handleNativeInput($event)\"\n [attr.aria-invalid]=\"ngControl?.control?.invalid || null\"\n />\n\n @if (showClear() && inputDate) {\n <button\n type=\"button\"\n class=\"absolute flex h-[35px] w-6 items-center justify-center text-grayscale-60 transition-colors hover:text-grayscale-90\"\n [class.right-9]=\"showIcon()\"\n [class.right-0]=\"!showIcon()\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_clear' | translate\"\n (click)=\"clearValue($event)\"\n >\n <i\n class=\"fas fa-times text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n }\n\n @if (showIcon()) {\n <button\n #iconButton\n type=\"button\"\n class=\"absolute right-0 flex h-[35px] w-9 items-center justify-center border-l border-solid transition-colors\"\n [class.border-grayscale-20]=\"disabled()\"\n [class.text-grayscale-30]=\"disabled()\"\n [class.cursor-not-allowed]=\"disabled()\"\n [class.border-grayscale-30]=\"!disabled() && !isFocused()\"\n [class.border-primary]=\"isFocused() && !disabled()\"\n [class.text-grayscale-90]=\"!disabled()\"\n [class.hover:bg-grayscale-10]=\"!disabled()\"\n [disabled]=\"disabled()\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_open' | translate\"\n (click)=\"toggle()\"\n (keydown)=\"handleTriggerKeydown($event)\"\n >\n <i\n [class]=\"resolvedIcon()\"\n aria-hidden=\"true\"\n ></i>\n </button>\n }\n</div>\n\n<ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayOpen]=\"isOpen()\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n [cdkConnectedOverlayPositions]=\"positions\"\n (backdropClick)=\"handleBackdropClick($event)\"\n (overlayKeydown)=\"handleOverlayKeydown($event)\"\n (detach)=\"isOpen.set(false)\"\n>\n <div\n #popupPanel\n class=\"z-50 w-72 rounded-medium border border-solid border-grayscale-30 bg-grayscale-0 shadow-md\"\n role=\"dialog\"\n cdkTrapFocus\n [id]=\"popupId()\"\n [attr.aria-label]=\"dialogAriaLabelKey() | translate\"\n >\n @if (showCalendar()) {\n @if (pickerView() === 'calendar') {\n <!-- Cabe\u00E7alho de navega\u00E7\u00E3o mensal -->\n <div class=\"flex items-center justify-between border-b border-solid border-grayscale-30 px-3 py-2\">\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"prevDisabled()\"\n [attr.aria-disabled]=\"prevDisabled() ? 'true' : null\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_prev_month' | translate\"\n (click)=\"navigatePrev()\"\n >\n <i\n class=\"fas fa-chevron-left text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n\n <button\n type=\"button\"\n class=\"flex items-center gap-1 rounded-small px-2 py-1 text-sm font-medium text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_select_month_year' | translate\"\n (click)=\"switchToMonths()\"\n >\n {{ currentMonthKey() | translate }}&nbsp;{{ currentYear() }}\n <i\n class=\"fas fa-chevron-down text-[10px]\"\n aria-hidden=\"true\"\n ></i>\n </button>\n\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"nextDisabled()\"\n [attr.aria-disabled]=\"nextDisabled() ? 'true' : null\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_next_month' | translate\"\n (click)=\"navigateNext()\"\n >\n <i\n class=\"fas fa-chevron-right text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n\n <!-- Cabe\u00E7alhos dos dias da semana -->\n <div\n class=\"grid grid-cols-7 px-3 pt-2\"\n role=\"row\"\n >\n @for (dayKey of orderedWeekDayKeys(); track dayKey) {\n <div\n class=\"flex h-8 items-center justify-center text-xs font-medium text-grayscale-60\"\n role=\"columnheader\"\n [attr.aria-label]=\"dayKey | translate\"\n >\n {{ dayKey | translate }}\n </div>\n }\n </div>\n\n <!-- Grade do calend\u00E1rio -->\n <div\n class=\"grid grid-cols-7 px-3 pb-2\"\n role=\"grid\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_calendar_label'\n | translate: { month: (currentMonthKey() | translate), year: currentYear() }\n \"\n (keydown)=\"handleCalendarGridKeydown($event)\"\n >\n @for (week of calendarWeeks(); track $index) {\n <div\n role=\"row\"\n class=\"contents\"\n >\n @for (day of week; track day.date.toISOString()) {\n <button\n type=\"button\"\n role=\"gridcell\"\n class=\"flex h-8 w-8 items-center justify-center rounded-[50%] text-sm font-normal transition-colors\"\n [class.invisible]=\"!showOtherMonths() && !day.isCurrentMonth\"\n [attr.aria-label]=\"formatDayAriaLabel(day.date)\"\n [attr.aria-selected]=\"day.isSelected || day.isRangeStart || day.isRangeEnd || null\"\n [attr.aria-current]=\"day.isToday ? 'date' : null\"\n [attr.aria-disabled]=\"day.isDisabled ? 'true' : null\"\n [attr.aria-hidden]=\"!showOtherMonths() && !day.isCurrentMonth ? 'true' : null\"\n [attr.data-focus]=\"\n day.isSelected || day.isRangeStart || day.isRangeEnd\n ? 'selected'\n : day.isToday\n ? 'today'\n : null\n \"\n [disabled]=\"day.isDisabled\"\n [ngClass]=\"{\n 'bg-primary font-semibold text-grayscale-0':\n day.isSelected || day.isRangeStart || day.isRangeEnd,\n 'bg-grayscale-10 hover:bg-grayscale-20':\n day.isInRange && !day.isRangeStart && !day.isRangeEnd,\n 'text-grayscale-90 hover:bg-grayscale-10':\n !day.isSelected &&\n !day.isRangeStart &&\n !day.isRangeEnd &&\n !day.isDisabled &&\n day.isCurrentMonth,\n 'text-grayscale-60 hover:bg-grayscale-10':\n !day.isSelected &&\n !day.isRangeStart &&\n !day.isRangeEnd &&\n !day.isDisabled &&\n !day.isCurrentMonth,\n 'ring-2 ring-inset ring-primary':\n day.isToday && !day.isSelected && !day.isRangeStart && !day.isRangeEnd,\n 'cursor-not-allowed text-grayscale-30': day.isDisabled,\n }\"\n (mouseenter)=\"onDayHover(day.date)\"\n (mouseleave)=\"onDayHover(null)\"\n (click)=\"selectDate(day)\"\n >\n {{ day.dayOfMonth }}\n </button>\n }\n </div>\n }\n </div>\n }\n\n @if (pickerView() === 'years') {\n <!-- Cabe\u00E7alho de navega\u00E7\u00E3o por d\u00E9cada -->\n <div class=\"flex items-center justify-between border-b border-solid border-grayscale-30 px-3 py-2\">\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"prevDisabled()\"\n [attr.aria-disabled]=\"prevDisabled() ? 'true' : null\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_prev_decade' | translate\"\n (click)=\"navigatePrev()\"\n >\n <i\n class=\"fas fa-chevron-left text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n\n <span class=\"text-sm font-medium text-grayscale-90\"\n >{{ currentDecadeStart() }} \u2013 {{ currentDecadeStart() + 11 }}</span\n >\n\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"nextDisabled()\"\n [attr.aria-disabled]=\"nextDisabled() ? 'true' : null\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_next_decade' | translate\"\n (click)=\"navigateNext()\"\n >\n <i\n class=\"fas fa-chevron-right text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n\n <!-- Grade de anos -->\n <div\n class=\"grid grid-cols-3 gap-2 px-3 py-3\"\n role=\"grid\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_select_year' | translate\"\n >\n @for (row of yearsGrid(); track $index) {\n @for (year of row; track year) {\n <button\n type=\"button\"\n role=\"gridcell\"\n class=\"flex h-9 items-center justify-center rounded-small text-sm font-normal transition-colors\"\n [attr.aria-selected]=\"isYearSelected(year) || null\"\n [attr.aria-disabled]=\"isYearDisabled(year) ? 'true' : null\"\n [attr.aria-current]=\"isCurrentYear(year) ? 'date' : null\"\n [attr.data-focus]=\"\n isYearSelected(year) ? 'selected' : isCurrentYear(year) ? 'today' : null\n \"\n [disabled]=\"isYearDisabled(year)\"\n [ngClass]=\"{\n 'bg-primary font-semibold text-grayscale-0': isYearSelected(year),\n 'ring-2 ring-inset ring-primary':\n isCurrentYear(year) && !isYearSelected(year) && !isYearDisabled(year),\n 'text-grayscale-90 hover:bg-grayscale-10':\n !isYearSelected(year) && !isYearDisabled(year),\n 'cursor-not-allowed text-grayscale-30': isYearDisabled(year),\n }\"\n (click)=\"selectYear(year)\"\n >\n {{ year }}\n </button>\n }\n }\n </div>\n }\n\n @if (pickerView() === 'months') {\n <!-- Cabe\u00E7alho de navega\u00E7\u00E3o anual -->\n <div class=\"flex items-center justify-between border-b border-solid border-grayscale-30 px-3 py-2\">\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"prevDisabled()\"\n [attr.aria-disabled]=\"prevDisabled() ? 'true' : null\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_prev_year' | translate\"\n (click)=\"navigatePrev()\"\n >\n <i\n class=\"fas fa-chevron-left text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n\n <span class=\"text-sm font-medium text-grayscale-90\">{{ currentYear() }}</span>\n\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"nextDisabled()\"\n [attr.aria-disabled]=\"nextDisabled() ? 'true' : null\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_next_year' | translate\"\n (click)=\"navigateNext()\"\n >\n <i\n class=\"fas fa-chevron-right text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n\n <!-- Grade de meses -->\n <div\n class=\"grid grid-cols-3 gap-2 px-3 py-3\"\n role=\"grid\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_select_month' | translate\"\n >\n @for (row of monthsGrid(); track $index) {\n @for (month of row; track month.index) {\n <button\n type=\"button\"\n role=\"gridcell\"\n class=\"flex h-9 items-center justify-center rounded-small text-sm font-normal transition-colors\"\n [attr.aria-selected]=\"isMonthSelected(month.index) || null\"\n [attr.aria-disabled]=\"isMonthDisabled(month.index) ? 'true' : null\"\n [attr.data-focus]=\"isMonthSelected(month.index) ? 'selected' : null\"\n [disabled]=\"isMonthDisabled(month.index)\"\n [ngClass]=\"{\n 'bg-primary font-semibold text-grayscale-0': isMonthSelected(month.index),\n 'text-grayscale-90 hover:bg-grayscale-10':\n !isMonthSelected(month.index) && !isMonthDisabled(month.index),\n 'cursor-not-allowed text-grayscale-30': isMonthDisabled(month.index),\n }\"\n (click)=\"selectMonth(month.index)\"\n >\n {{ month.key | translate }}\n </button>\n }\n }\n </div>\n\n @if (mode() !== 'month') {\n <div class=\"border-t border-solid border-grayscale-30 px-3 py-2\">\n <button\n type=\"button\"\n class=\"flex items-center gap-2 rounded-small px-2 py-1 text-sm text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n (click)=\"backToCalendar()\"\n >\n <i\n class=\"fas fa-arrow-left\"\n aria-hidden=\"true\"\n ></i>\n {{ 'platform.angular_components.datepicker_back_to_calendar' | translate }}\n </button>\n </div>\n }\n }\n }\n\n <!-- Time picker -->\n @if (showTimePicker()) {\n <div\n class=\"flex items-center justify-center gap-3 px-4 py-3\"\n [class.border-t]=\"showCalendar()\"\n [class.border-solid]=\"showCalendar()\"\n [class.border-grayscale-30]=\"showCalendar()\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_select_time' | translate\"\n >\n <!-- Horas -->\n <div class=\"flex flex-col items-center gap-1\">\n <button\n #increaseHourButton\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_increment_hour' | translate\"\n (click)=\"incrementHours()\"\n >\n <i\n class=\"fas fa-chevron-up text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n <input\n type=\"text\"\n inputmode=\"numeric\"\n [attr.maxlength]=\"timeInputMaxLength\"\n class=\"h-9 w-12 rounded-small border border-solid border-grayscale-30 bg-grayscale-5 text-center text-base font-medium text-grayscale-90 outline-none focus:border-primary focus:outline-1 focus:outline-primary\"\n [value]=\"padTime(displayHours())\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_hour' | translate\"\n aria-live=\"polite\"\n pattern=\"[0-9]+\"\n (keydown)=\"handleHoursKeydown($event)\"\n (change)=\"handleHoursInput($event)\"\n />\n <button\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_decrement_hour' | translate\"\n (click)=\"decrementHours()\"\n >\n <i\n class=\"fas fa-chevron-down text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n\n <span\n class=\"text-xl font-bold text-grayscale-60\"\n aria-hidden=\"true\"\n >:</span\n >\n\n <!-- Minutos -->\n <div class=\"flex flex-col items-center gap-1\">\n <button\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_increment_minute' | translate\"\n (click)=\"incrementMinutes()\"\n >\n <i\n class=\"fas fa-chevron-up text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n <input\n type=\"text\"\n inputmode=\"numeric\"\n [attr.maxlength]=\"timeInputMaxLength\"\n class=\"h-9 w-12 rounded-small border border-solid border-grayscale-30 bg-grayscale-5 text-center text-base font-medium text-grayscale-90 outline-none focus:border-primary focus:outline-1 focus:outline-primary\"\n [value]=\"padTime(minutes())\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_minute' | translate\"\n aria-live=\"polite\"\n pattern=\"[0-9]+\"\n (keydown)=\"handleMinutesKeydown($event)\"\n (change)=\"handleMinutesInput($event)\"\n />\n <button\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_decrement_minute' | translate\"\n (click)=\"decrementMinutes()\"\n >\n <i\n class=\"fas fa-chevron-down text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n\n @if (showSeconds()) {\n <span\n class=\"text-xl font-bold text-grayscale-60\"\n aria-hidden=\"true\"\n >:</span\n >\n\n <!-- Segundos -->\n <div class=\"flex flex-col items-center gap-1\">\n <button\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_increment_second' | translate\"\n (click)=\"incrementSeconds()\"\n >\n <i\n class=\"fas fa-chevron-up text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n <input\n type=\"text\"\n inputmode=\"numeric\"\n [attr.maxlength]=\"timeInputMaxLength\"\n class=\"h-9 w-12 rounded-small border border-solid border-grayscale-30 bg-grayscale-5 text-center text-base font-medium text-grayscale-90 outline-none focus:border-primary focus:outline-1 focus:outline-primary\"\n [value]=\"padTime(seconds())\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_second' | translate\"\n aria-live=\"polite\"\n pattern=\"[0-9]+\"\n (keydown)=\"handleSecondsKeydown($event)\"\n (change)=\"handleSecondsInput($event)\"\n />\n <button\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_decrement_second' | translate\"\n (click)=\"decrementSeconds()\"\n >\n <i\n class=\"fas fa-chevron-down text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n }\n\n @if (is12HourFormat()) {\n <!-- Seletor AM/PM -->\n <button\n type=\"button\"\n class=\"flex h-9 w-12 items-center justify-center rounded-small border border-solid border-grayscale-30 bg-grayscale-5 text-base font-medium text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_toggle_meridiem' | translate\"\n aria-live=\"polite\"\n (click)=\"toggleAmPm()\"\n >\n {{ amPm() }}\n </button>\n }\n </div>\n }\n\n <!-- Rodap\u00E9 de a\u00E7\u00F5es -->\n @if (showButtonBar() || mode() === 'datetime' || mode() === 'time') {\n <div class=\"flex items-center justify-between border-t border-solid border-grayscale-30 px-3 py-2\">\n @if (showButtonBar()) {\n <div>\n @if (mode() === 'date' || mode() === 'datetime' || mode() === 'range') {\n <button\n type=\"button\"\n class=\"rounded-small px-2 py-1 text-sm text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n (click)=\"selectToday()\"\n >\n {{ 'platform.angular_components.datepicker_today' | translate }}\n </button>\n }\n </div>\n\n <div class=\"flex gap-2\">\n <button\n type=\"button\"\n class=\"rounded-small px-2 py-1 text-sm text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n (click)=\"clearValue($event)\"\n >\n {{ 'platform.angular_components.datepicker_clear' | translate }}\n </button>\n\n @if (mode() === 'datetime' || mode() === 'time') {\n <button\n type=\"button\"\n class=\"rounded-small bg-primary px-3 py-1 text-sm font-medium text-grayscale-0 transition-colors hover:opacity-90\"\n (click)=\"confirm()\"\n >\n {{ 'platform.angular_components.datepicker_confirm' | translate }}\n </button>\n }\n </div>\n } @else {\n <div></div>\n <div>\n @if (mode() === 'datetime' || mode() === 'time') {\n <button\n type=\"button\"\n class=\"rounded-small bg-primary px-3 py-1 text-sm font-medium text-grayscale-0 transition-colors hover:opacity-90\"\n (click)=\"confirm()\"\n >\n {{ 'platform.angular_components.datepicker_confirm' | translate }}\n </button>\n }\n </div>\n }\n </div>\n }\n </div>\n</ng-template>\n\n", styles: [":host{display:block;position:relative;width:100%}:host.ng-invalid.ng-dirty input{border-color:#c13018}:host.ng-invalid.ng-dirty input:focus{border-color:#c13018;outline-color:#c13018}:host.ng-invalid.ng-dirty button[type=button]{border-color:#c13018}:host.no-icon button[type=button]{display:none}:host.no-icon input{padding-right:.75rem}button[type=button]:focus-visible{outline:2px solid #428bca;outline-offset:1px;border-radius:inherit}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "directive", type: CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "directive", type: CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "directive", type: CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: ReactiveFormsModule }] });
1439
+ ], viewQueries: [{ propertyName: "popupPanel", first: true, predicate: ["popupPanel"], descendants: true, read: ElementRef, isSignal: true }, { propertyName: "increaseHourButton", first: true, predicate: ["increaseHourButton"], descendants: true, read: ElementRef, isSignal: true }, { propertyName: "iconButton", first: true, predicate: ["iconButton"], descendants: true, read: ElementRef, isSignal: true }, { propertyName: "triggerInput", first: true, predicate: ["triggerInput"], descendants: true, read: ElementRef, isSignal: true }], ngImport: i0, template: "<div\n cdkOverlayOrigin\n #trigger=\"cdkOverlayOrigin\"\n class=\"relative flex w-full items-center\"\n role=\"combobox\"\n aria-haspopup=\"grid\"\n [attr.aria-expanded]=\"isOpen()\"\n [attr.aria-controls]=\"popupId()\"\n>\n <input\n #triggerInput\n class=\"h-[35px] w-full rounded-small border border-solid border-grayscale-30 pl-3 text-sm outline-none transition-colors focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-[var(--s-focus-ring-color,#0090ff)]\"\n [class.pr-10]=\"showIcon() && !showClear()\"\n [class.pr-16]=\"showIcon() && showClear()\"\n [class.pr-6]=\"!showIcon() && showClear()\"\n [class.bg-grayscale-0]=\"!disabled()\"\n [class.text-grayscale-90]=\"!disabled()\"\n [class.border-grayscale-20]=\"disabled()\"\n [class.bg-grayscale-5]=\"disabled()\"\n [class.text-grayscale-30]=\"disabled()\"\n [class.cursor-not-allowed]=\"disabled()\"\n [id]=\"inputId()\"\n [name]=\"name() ?? inputId()\"\n type=\"text\"\n [placeholder]=\"placeholder() ?? (placeholderKey() | translate)\"\n [disabled]=\"disabled()\"\n [readonly]=\"\n readonlyInput() ||\n mode() === 'range' ||\n mode() === 'year' ||\n isMultipleMode() ||\n (isSegmentModeCandidate() && isTouchDevice())\n \"\n [tabIndex]=\"tabindex() ?? null\"\n [autofocus]=\"autofocus()\"\n [(ngModel)]=\"inputDate\"\n (ngModelChange)=\"handleInputChange($event)\"\n (focus)=\"handleInputFocus($event)\"\n (blur)=\"handleInputBlur($event)\"\n (mousedown)=\"handleInputClick($event)\"\n (keydown)=\"handleTriggerKeydown($event)\"\n (input)=\"handleNativeInput($event)\"\n [attr.aria-invalid]=\"ngControl?.control?.invalid || null\"\n />\n\n @if (showClear() && inputDate) {\n <button\n type=\"button\"\n class=\"absolute flex h-[35px] w-6 items-center justify-center text-grayscale-60 transition-colors hover:text-grayscale-90\"\n [class.right-9]=\"showIcon()\"\n [class.right-0]=\"!showIcon()\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_clear' | translate\"\n (click)=\"clearValue($event)\"\n >\n <i\n class=\"fas fa-times text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n }\n\n @if (showIcon()) {\n <button\n #iconButton\n type=\"button\"\n class=\"absolute right-0 flex h-[35px] w-9 items-center justify-center border-l border-solid transition-colors\"\n [class.border-grayscale-20]=\"disabled()\"\n [class.text-grayscale-30]=\"disabled()\"\n [class.cursor-not-allowed]=\"disabled()\"\n [class.border-grayscale-30]=\"!disabled() && !isFocused()\"\n [class.border-primary]=\"isFocused() && !disabled()\"\n [class.text-grayscale-90]=\"!disabled()\"\n [class.hover:bg-grayscale-10]=\"!disabled()\"\n [disabled]=\"disabled()\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_open' | translate\"\n (click)=\"toggle()\"\n (keydown)=\"handleTriggerKeydown($event)\"\n >\n <i\n [class]=\"resolvedIcon()\"\n aria-hidden=\"true\"\n ></i>\n </button>\n }\n</div>\n\n<ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayOpen]=\"isOpen()\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n [cdkConnectedOverlayPositions]=\"positions\"\n (backdropClick)=\"handleBackdropClick($event)\"\n (overlayKeydown)=\"handleOverlayKeydown($event)\"\n (detach)=\"isOpen.set(false)\"\n>\n <div\n #popupPanel\n class=\"z-50 w-72 rounded-medium border border-solid border-grayscale-30 bg-grayscale-0 shadow-md\"\n role=\"dialog\"\n cdkTrapFocus\n [id]=\"popupId()\"\n [attr.aria-label]=\"dialogAriaLabelKey() | translate\"\n >\n @if (showCalendar()) {\n @if (pickerView() === 'calendar') {\n <!-- Cabe\u00E7alho de navega\u00E7\u00E3o mensal -->\n <div class=\"flex items-center justify-between border-b border-solid border-grayscale-30 px-3 py-2\">\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"prevDisabled()\"\n [attr.aria-disabled]=\"prevDisabled() ? 'true' : null\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_prev_month' | translate\"\n (click)=\"navigatePrev()\"\n >\n <i\n class=\"fas fa-chevron-left text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n\n <button\n type=\"button\"\n class=\"flex items-center gap-1 rounded-small px-2 py-1 text-sm font-medium text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_select_month_year' | translate\"\n (click)=\"switchToMonths()\"\n >\n {{ currentMonthKey() | translate }}&nbsp;{{ currentYear() }}\n <i\n class=\"fas fa-chevron-down text-[10px]\"\n aria-hidden=\"true\"\n ></i>\n </button>\n\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"nextDisabled()\"\n [attr.aria-disabled]=\"nextDisabled() ? 'true' : null\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_next_month' | translate\"\n (click)=\"navigateNext()\"\n >\n <i\n class=\"fas fa-chevron-right text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n\n <!-- Cabe\u00E7alhos dos dias da semana -->\n <div\n class=\"grid grid-cols-7 px-3 pt-2\"\n role=\"row\"\n >\n @for (dayKey of orderedWeekDayKeys(); track dayKey) {\n <div\n class=\"flex h-8 items-center justify-center text-xs font-medium text-grayscale-60\"\n role=\"columnheader\"\n [attr.aria-label]=\"dayKey | translate\"\n >\n {{ dayKey | translate }}\n </div>\n }\n </div>\n\n <!-- Grade do calend\u00E1rio -->\n <div\n class=\"grid grid-cols-7 px-3 pb-2\"\n role=\"grid\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_calendar_label'\n | translate: { month: (currentMonthKey() | translate), year: currentYear() }\n \"\n (keydown)=\"handleCalendarGridKeydown($event)\"\n >\n @for (week of calendarWeeks(); track $index) {\n <div\n role=\"row\"\n class=\"contents\"\n >\n @for (day of week; track day.date.toISOString()) {\n <button\n type=\"button\"\n role=\"gridcell\"\n class=\"flex h-8 w-8 items-center justify-center rounded-[50%] text-sm font-normal transition-colors\"\n [class.invisible]=\"!showOtherMonths() && !day.isCurrentMonth\"\n [attr.aria-label]=\"formatDayAriaLabel(day.date)\"\n [attr.aria-selected]=\"day.isSelected || day.isRangeStart || day.isRangeEnd || null\"\n [attr.aria-current]=\"day.isToday ? 'date' : null\"\n [attr.aria-disabled]=\"day.isDisabled ? 'true' : null\"\n [attr.aria-hidden]=\"!showOtherMonths() && !day.isCurrentMonth ? 'true' : null\"\n [attr.data-focus]=\"\n day.isSelected || day.isRangeStart || day.isRangeEnd\n ? 'selected'\n : day.isToday\n ? 'today'\n : null\n \"\n [disabled]=\"day.isDisabled\"\n [ngClass]=\"{\n 'bg-primary font-semibold text-grayscale-0':\n day.isSelected || day.isRangeStart || day.isRangeEnd,\n 'bg-grayscale-10 hover:bg-grayscale-20':\n day.isInRange && !day.isRangeStart && !day.isRangeEnd,\n 'text-grayscale-90 hover:bg-grayscale-10':\n !day.isSelected &&\n !day.isRangeStart &&\n !day.isRangeEnd &&\n !day.isDisabled &&\n day.isCurrentMonth,\n 'text-grayscale-60 hover:bg-grayscale-10':\n !day.isSelected &&\n !day.isRangeStart &&\n !day.isRangeEnd &&\n !day.isDisabled &&\n !day.isCurrentMonth,\n 'ring-2 ring-inset ring-primary':\n day.isToday && !day.isSelected && !day.isRangeStart && !day.isRangeEnd,\n 'cursor-not-allowed text-grayscale-30': day.isDisabled,\n }\"\n (mouseenter)=\"onDayHover(day.date)\"\n (mouseleave)=\"onDayHover(null)\"\n (click)=\"selectDate(day)\"\n >\n {{ day.dayOfMonth }}\n </button>\n }\n </div>\n }\n </div>\n }\n\n @if (pickerView() === 'years') {\n <!-- Cabe\u00E7alho de navega\u00E7\u00E3o por d\u00E9cada -->\n <div class=\"flex items-center justify-between border-b border-solid border-grayscale-30 px-3 py-2\">\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"prevDisabled()\"\n [attr.aria-disabled]=\"prevDisabled() ? 'true' : null\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_prev_decade' | translate\"\n (click)=\"navigatePrev()\"\n >\n <i\n class=\"fas fa-chevron-left text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n\n <span class=\"text-sm font-medium text-grayscale-90\"\n >{{ currentDecadeStart() }} \u2013 {{ currentDecadeStart() + 11 }}</span\n >\n\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"nextDisabled()\"\n [attr.aria-disabled]=\"nextDisabled() ? 'true' : null\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_next_decade' | translate\"\n (click)=\"navigateNext()\"\n >\n <i\n class=\"fas fa-chevron-right text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n\n <!-- Grade de anos -->\n <div\n class=\"grid grid-cols-3 gap-2 px-3 py-3\"\n role=\"grid\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_select_year' | translate\"\n >\n @for (row of yearsGrid(); track $index) {\n @for (year of row; track year) {\n <button\n type=\"button\"\n role=\"gridcell\"\n class=\"flex h-9 items-center justify-center rounded-small text-sm font-normal transition-colors\"\n [attr.aria-selected]=\"isYearSelected(year) || null\"\n [attr.aria-disabled]=\"isYearDisabled(year) ? 'true' : null\"\n [attr.aria-current]=\"isCurrentYear(year) ? 'date' : null\"\n [attr.data-focus]=\"\n isYearSelected(year) ? 'selected' : isCurrentYear(year) ? 'today' : null\n \"\n [disabled]=\"isYearDisabled(year)\"\n [ngClass]=\"{\n 'bg-primary font-semibold text-grayscale-0': isYearSelected(year),\n 'ring-2 ring-inset ring-primary':\n isCurrentYear(year) && !isYearSelected(year) && !isYearDisabled(year),\n 'text-grayscale-90 hover:bg-grayscale-10':\n !isYearSelected(year) && !isYearDisabled(year),\n 'cursor-not-allowed text-grayscale-30': isYearDisabled(year),\n }\"\n (click)=\"selectYear(year)\"\n >\n {{ year }}\n </button>\n }\n }\n </div>\n }\n\n @if (pickerView() === 'months') {\n <!-- Cabe\u00E7alho de navega\u00E7\u00E3o anual -->\n <div class=\"flex items-center justify-between border-b border-solid border-grayscale-30 px-3 py-2\">\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"prevDisabled()\"\n [attr.aria-disabled]=\"prevDisabled() ? 'true' : null\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_prev_year' | translate\"\n (click)=\"navigatePrev()\"\n >\n <i\n class=\"fas fa-chevron-left text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n\n <span class=\"text-sm font-medium text-grayscale-90\">{{ currentYear() }}</span>\n\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"nextDisabled()\"\n [attr.aria-disabled]=\"nextDisabled() ? 'true' : null\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_next_year' | translate\"\n (click)=\"navigateNext()\"\n >\n <i\n class=\"fas fa-chevron-right text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n\n <!-- Grade de meses -->\n <div\n class=\"grid grid-cols-3 gap-2 px-3 py-3\"\n role=\"grid\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_select_month' | translate\"\n >\n @for (row of monthsGrid(); track $index) {\n @for (month of row; track month.index) {\n <button\n type=\"button\"\n role=\"gridcell\"\n class=\"flex h-9 items-center justify-center rounded-small text-sm font-normal transition-colors\"\n [attr.aria-selected]=\"isMonthSelected(month.index) || null\"\n [attr.aria-disabled]=\"isMonthDisabled(month.index) ? 'true' : null\"\n [attr.data-focus]=\"isMonthSelected(month.index) ? 'selected' : null\"\n [disabled]=\"isMonthDisabled(month.index)\"\n [ngClass]=\"{\n 'bg-primary font-semibold text-grayscale-0': isMonthSelected(month.index),\n 'text-grayscale-90 hover:bg-grayscale-10':\n !isMonthSelected(month.index) && !isMonthDisabled(month.index),\n 'cursor-not-allowed text-grayscale-30': isMonthDisabled(month.index),\n }\"\n (click)=\"selectMonth(month.index)\"\n >\n {{ month.key | translate }}\n </button>\n }\n }\n </div>\n\n @if (mode() !== 'month') {\n <div class=\"border-t border-solid border-grayscale-30 px-3 py-2\">\n <button\n type=\"button\"\n class=\"flex items-center gap-2 rounded-small px-2 py-1 text-sm text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n (click)=\"backToCalendar()\"\n >\n <i\n class=\"fas fa-arrow-left\"\n aria-hidden=\"true\"\n ></i>\n {{ 'platform.angular_components.datepicker_back_to_calendar' | translate }}\n </button>\n </div>\n }\n }\n }\n\n <!-- Time picker -->\n @if (showTimePicker()) {\n <div\n class=\"flex items-center justify-center gap-3 px-4 py-3\"\n [class.border-t]=\"showCalendar()\"\n [class.border-solid]=\"showCalendar()\"\n [class.border-grayscale-30]=\"showCalendar()\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_select_time' | translate\"\n >\n <!-- Horas -->\n <div class=\"flex flex-col items-center gap-1\">\n <button\n #increaseHourButton\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_increment_hour' | translate\"\n (click)=\"incrementHours()\"\n >\n <i\n class=\"fas fa-chevron-up text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n <input\n type=\"text\"\n inputmode=\"numeric\"\n [attr.maxlength]=\"timeInputMaxLength\"\n class=\"h-9 w-12 rounded-small border border-solid border-grayscale-30 bg-grayscale-5 text-center text-base font-medium text-grayscale-90 outline-none focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-[var(--s-focus-ring-color,#0090ff)]\"\n [value]=\"padTime(displayHours())\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_hour' | translate\"\n aria-live=\"polite\"\n pattern=\"[0-9]+\"\n (keydown)=\"handleHoursKeydown($event)\"\n (change)=\"handleHoursInput($event)\"\n />\n <button\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_decrement_hour' | translate\"\n (click)=\"decrementHours()\"\n >\n <i\n class=\"fas fa-chevron-down text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n\n <span\n class=\"text-xl font-bold text-grayscale-60\"\n aria-hidden=\"true\"\n >:</span\n >\n\n <!-- Minutos -->\n <div class=\"flex flex-col items-center gap-1\">\n <button\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_increment_minute' | translate\"\n (click)=\"incrementMinutes()\"\n >\n <i\n class=\"fas fa-chevron-up text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n <input\n type=\"text\"\n inputmode=\"numeric\"\n [attr.maxlength]=\"timeInputMaxLength\"\n class=\"h-9 w-12 rounded-small border border-solid border-grayscale-30 bg-grayscale-5 text-center text-base font-medium text-grayscale-90 outline-none focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-[var(--s-focus-ring-color,#0090ff)]\"\n [value]=\"padTime(minutes())\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_minute' | translate\"\n aria-live=\"polite\"\n pattern=\"[0-9]+\"\n (keydown)=\"handleMinutesKeydown($event)\"\n (change)=\"handleMinutesInput($event)\"\n />\n <button\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_decrement_minute' | translate\"\n (click)=\"decrementMinutes()\"\n >\n <i\n class=\"fas fa-chevron-down text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n\n @if (showSeconds()) {\n <span\n class=\"text-xl font-bold text-grayscale-60\"\n aria-hidden=\"true\"\n >:</span\n >\n\n <!-- Segundos -->\n <div class=\"flex flex-col items-center gap-1\">\n <button\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_increment_second' | translate\"\n (click)=\"incrementSeconds()\"\n >\n <i\n class=\"fas fa-chevron-up text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n <input\n type=\"text\"\n inputmode=\"numeric\"\n [attr.maxlength]=\"timeInputMaxLength\"\n class=\"h-9 w-12 rounded-small border border-solid border-grayscale-30 bg-grayscale-5 text-center text-base font-medium text-grayscale-90 outline-none focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-[var(--s-focus-ring-color,#0090ff)]\"\n [value]=\"padTime(seconds())\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_second' | translate\"\n aria-live=\"polite\"\n pattern=\"[0-9]+\"\n (keydown)=\"handleSecondsKeydown($event)\"\n (change)=\"handleSecondsInput($event)\"\n />\n <button\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_decrement_second' | translate\"\n (click)=\"decrementSeconds()\"\n >\n <i\n class=\"fas fa-chevron-down text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n }\n\n @if (is12HourFormat()) {\n <!-- Seletor AM/PM -->\n <button\n type=\"button\"\n class=\"flex h-9 w-12 items-center justify-center rounded-small border border-solid border-grayscale-30 bg-grayscale-5 text-base font-medium text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_toggle_meridiem' | translate\"\n aria-live=\"polite\"\n (click)=\"toggleAmPm()\"\n >\n {{ amPm() }}\n </button>\n }\n </div>\n }\n\n <!-- Rodap\u00E9 de a\u00E7\u00F5es -->\n @if (showButtonBar() || mode() === 'datetime' || mode() === 'time') {\n <div class=\"flex items-center justify-between border-t border-solid border-grayscale-30 px-3 py-2\">\n @if (showButtonBar()) {\n <div>\n @if (mode() === 'date' || mode() === 'datetime' || mode() === 'range') {\n <button\n type=\"button\"\n class=\"rounded-small px-2 py-1 text-sm text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n (click)=\"selectToday()\"\n >\n {{ 'platform.angular_components.datepicker_today' | translate }}\n </button>\n }\n </div>\n\n <div class=\"flex gap-2\">\n <button\n type=\"button\"\n class=\"rounded-small px-2 py-1 text-sm text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n (click)=\"clearValue($event)\"\n >\n {{ 'platform.angular_components.datepicker_clear' | translate }}\n </button>\n\n @if (mode() === 'datetime' || mode() === 'time') {\n <button\n type=\"button\"\n class=\"rounded-small bg-primary px-3 py-1 text-sm font-medium text-grayscale-0 transition-colors hover:opacity-90\"\n (click)=\"confirm()\"\n >\n {{ 'platform.angular_components.datepicker_confirm' | translate }}\n </button>\n }\n </div>\n } @else {\n <div></div>\n <div>\n @if (mode() === 'datetime' || mode() === 'time') {\n <button\n type=\"button\"\n class=\"rounded-small bg-primary px-3 py-1 text-sm font-medium text-grayscale-0 transition-colors hover:opacity-90\"\n (click)=\"confirm()\"\n >\n {{ 'platform.angular_components.datepicker_confirm' | translate }}\n </button>\n }\n </div>\n }\n </div>\n }\n </div>\n</ng-template>\n\n", styles: [":host{display:block;position:relative;width:100%}:host.ng-invalid.ng-dirty input{border-color:#c13018}:host.ng-invalid.ng-dirty input:focus{border-color:#c13018;outline-color:#c13018}:host.ng-invalid.ng-dirty button[type=button]{border-color:#c13018}:host.no-icon button[type=button]{display:none}:host.no-icon input{padding-right:.75rem}button[type=button]:focus-visible{outline:2px solid #428bca;outline-offset:1px;border-radius:inherit}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "directive", type: CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "directive", type: CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "directive", type: CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: ReactiveFormsModule }] });
1440
1440
  }
1441
1441
  __decorate([
1442
1442
  numericKeysOnly()
@@ -1470,6 +1470,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
1470
1470
  useExisting: DatepickerComponent,
1471
1471
  multi: true,
1472
1472
  },
1473
- ], template: "<div\n cdkOverlayOrigin\n #trigger=\"cdkOverlayOrigin\"\n class=\"relative flex w-full items-center\"\n role=\"combobox\"\n aria-haspopup=\"grid\"\n [attr.aria-expanded]=\"isOpen()\"\n [attr.aria-controls]=\"popupId()\"\n>\n <input\n #triggerInput\n class=\"h-[35px] w-full rounded-small border border-solid border-grayscale-30 pl-3 text-sm outline-none transition-colors focus:border-primary\"\n [class.pr-10]=\"showIcon() && !showClear()\"\n [class.pr-16]=\"showIcon() && showClear()\"\n [class.pr-6]=\"!showIcon() && showClear()\"\n [class.bg-grayscale-0]=\"!disabled()\"\n [class.text-grayscale-90]=\"!disabled()\"\n [class.border-grayscale-20]=\"disabled()\"\n [class.bg-grayscale-5]=\"disabled()\"\n [class.text-grayscale-30]=\"disabled()\"\n [class.cursor-not-allowed]=\"disabled()\"\n [id]=\"inputId()\"\n [name]=\"name() ?? inputId()\"\n type=\"text\"\n [placeholder]=\"placeholder() ?? (placeholderKey() | translate)\"\n [disabled]=\"disabled()\"\n [readonly]=\"\n readonlyInput() ||\n mode() === 'range' ||\n mode() === 'year' ||\n isMultipleMode() ||\n (isSegmentModeCandidate() && isTouchDevice())\n \"\n [tabIndex]=\"tabindex() ?? null\"\n [autofocus]=\"autofocus()\"\n [(ngModel)]=\"inputDate\"\n (ngModelChange)=\"handleInputChange($event)\"\n (focus)=\"handleInputFocus($event)\"\n (blur)=\"handleInputBlur($event)\"\n (mousedown)=\"handleInputClick($event)\"\n (keydown)=\"handleTriggerKeydown($event)\"\n (input)=\"handleNativeInput($event)\"\n [attr.aria-invalid]=\"ngControl?.control?.invalid || null\"\n />\n\n @if (showClear() && inputDate) {\n <button\n type=\"button\"\n class=\"absolute flex h-[35px] w-6 items-center justify-center text-grayscale-60 transition-colors hover:text-grayscale-90\"\n [class.right-9]=\"showIcon()\"\n [class.right-0]=\"!showIcon()\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_clear' | translate\"\n (click)=\"clearValue($event)\"\n >\n <i\n class=\"fas fa-times text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n }\n\n @if (showIcon()) {\n <button\n #iconButton\n type=\"button\"\n class=\"absolute right-0 flex h-[35px] w-9 items-center justify-center border-l border-solid transition-colors\"\n [class.border-grayscale-20]=\"disabled()\"\n [class.text-grayscale-30]=\"disabled()\"\n [class.cursor-not-allowed]=\"disabled()\"\n [class.border-grayscale-30]=\"!disabled() && !isFocused()\"\n [class.border-primary]=\"isFocused() && !disabled()\"\n [class.text-grayscale-90]=\"!disabled()\"\n [class.hover:bg-grayscale-10]=\"!disabled()\"\n [disabled]=\"disabled()\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_open' | translate\"\n (click)=\"toggle()\"\n (keydown)=\"handleTriggerKeydown($event)\"\n >\n <i\n [class]=\"resolvedIcon()\"\n aria-hidden=\"true\"\n ></i>\n </button>\n }\n</div>\n\n<ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayOpen]=\"isOpen()\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n [cdkConnectedOverlayPositions]=\"positions\"\n (backdropClick)=\"handleBackdropClick($event)\"\n (overlayKeydown)=\"handleOverlayKeydown($event)\"\n (detach)=\"isOpen.set(false)\"\n>\n <div\n #popupPanel\n class=\"z-50 w-72 rounded-medium border border-solid border-grayscale-30 bg-grayscale-0 shadow-md\"\n role=\"dialog\"\n cdkTrapFocus\n [id]=\"popupId()\"\n [attr.aria-label]=\"dialogAriaLabelKey() | translate\"\n >\n @if (showCalendar()) {\n @if (pickerView() === 'calendar') {\n <!-- Cabe\u00E7alho de navega\u00E7\u00E3o mensal -->\n <div class=\"flex items-center justify-between border-b border-solid border-grayscale-30 px-3 py-2\">\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"prevDisabled()\"\n [attr.aria-disabled]=\"prevDisabled() ? 'true' : null\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_prev_month' | translate\"\n (click)=\"navigatePrev()\"\n >\n <i\n class=\"fas fa-chevron-left text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n\n <button\n type=\"button\"\n class=\"flex items-center gap-1 rounded-small px-2 py-1 text-sm font-medium text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_select_month_year' | translate\"\n (click)=\"switchToMonths()\"\n >\n {{ currentMonthKey() | translate }}&nbsp;{{ currentYear() }}\n <i\n class=\"fas fa-chevron-down text-[10px]\"\n aria-hidden=\"true\"\n ></i>\n </button>\n\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"nextDisabled()\"\n [attr.aria-disabled]=\"nextDisabled() ? 'true' : null\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_next_month' | translate\"\n (click)=\"navigateNext()\"\n >\n <i\n class=\"fas fa-chevron-right text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n\n <!-- Cabe\u00E7alhos dos dias da semana -->\n <div\n class=\"grid grid-cols-7 px-3 pt-2\"\n role=\"row\"\n >\n @for (dayKey of orderedWeekDayKeys(); track dayKey) {\n <div\n class=\"flex h-8 items-center justify-center text-xs font-medium text-grayscale-60\"\n role=\"columnheader\"\n [attr.aria-label]=\"dayKey | translate\"\n >\n {{ dayKey | translate }}\n </div>\n }\n </div>\n\n <!-- Grade do calend\u00E1rio -->\n <div\n class=\"grid grid-cols-7 px-3 pb-2\"\n role=\"grid\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_calendar_label'\n | translate: { month: (currentMonthKey() | translate), year: currentYear() }\n \"\n (keydown)=\"handleCalendarGridKeydown($event)\"\n >\n @for (week of calendarWeeks(); track $index) {\n <div\n role=\"row\"\n class=\"contents\"\n >\n @for (day of week; track day.date.toISOString()) {\n <button\n type=\"button\"\n role=\"gridcell\"\n class=\"flex h-8 w-8 items-center justify-center rounded-[50%] text-sm font-normal transition-colors\"\n [class.invisible]=\"!showOtherMonths() && !day.isCurrentMonth\"\n [attr.aria-label]=\"formatDayAriaLabel(day.date)\"\n [attr.aria-selected]=\"day.isSelected || day.isRangeStart || day.isRangeEnd || null\"\n [attr.aria-current]=\"day.isToday ? 'date' : null\"\n [attr.aria-disabled]=\"day.isDisabled ? 'true' : null\"\n [attr.aria-hidden]=\"!showOtherMonths() && !day.isCurrentMonth ? 'true' : null\"\n [attr.data-focus]=\"\n day.isSelected || day.isRangeStart || day.isRangeEnd\n ? 'selected'\n : day.isToday\n ? 'today'\n : null\n \"\n [disabled]=\"day.isDisabled\"\n [ngClass]=\"{\n 'bg-primary font-semibold text-grayscale-0':\n day.isSelected || day.isRangeStart || day.isRangeEnd,\n 'bg-grayscale-10 hover:bg-grayscale-20':\n day.isInRange && !day.isRangeStart && !day.isRangeEnd,\n 'text-grayscale-90 hover:bg-grayscale-10':\n !day.isSelected &&\n !day.isRangeStart &&\n !day.isRangeEnd &&\n !day.isDisabled &&\n day.isCurrentMonth,\n 'text-grayscale-60 hover:bg-grayscale-10':\n !day.isSelected &&\n !day.isRangeStart &&\n !day.isRangeEnd &&\n !day.isDisabled &&\n !day.isCurrentMonth,\n 'ring-2 ring-inset ring-primary':\n day.isToday && !day.isSelected && !day.isRangeStart && !day.isRangeEnd,\n 'cursor-not-allowed text-grayscale-30': day.isDisabled,\n }\"\n (mouseenter)=\"onDayHover(day.date)\"\n (mouseleave)=\"onDayHover(null)\"\n (click)=\"selectDate(day)\"\n >\n {{ day.dayOfMonth }}\n </button>\n }\n </div>\n }\n </div>\n }\n\n @if (pickerView() === 'years') {\n <!-- Cabe\u00E7alho de navega\u00E7\u00E3o por d\u00E9cada -->\n <div class=\"flex items-center justify-between border-b border-solid border-grayscale-30 px-3 py-2\">\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"prevDisabled()\"\n [attr.aria-disabled]=\"prevDisabled() ? 'true' : null\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_prev_decade' | translate\"\n (click)=\"navigatePrev()\"\n >\n <i\n class=\"fas fa-chevron-left text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n\n <span class=\"text-sm font-medium text-grayscale-90\"\n >{{ currentDecadeStart() }} \u2013 {{ currentDecadeStart() + 11 }}</span\n >\n\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"nextDisabled()\"\n [attr.aria-disabled]=\"nextDisabled() ? 'true' : null\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_next_decade' | translate\"\n (click)=\"navigateNext()\"\n >\n <i\n class=\"fas fa-chevron-right text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n\n <!-- Grade de anos -->\n <div\n class=\"grid grid-cols-3 gap-2 px-3 py-3\"\n role=\"grid\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_select_year' | translate\"\n >\n @for (row of yearsGrid(); track $index) {\n @for (year of row; track year) {\n <button\n type=\"button\"\n role=\"gridcell\"\n class=\"flex h-9 items-center justify-center rounded-small text-sm font-normal transition-colors\"\n [attr.aria-selected]=\"isYearSelected(year) || null\"\n [attr.aria-disabled]=\"isYearDisabled(year) ? 'true' : null\"\n [attr.aria-current]=\"isCurrentYear(year) ? 'date' : null\"\n [attr.data-focus]=\"\n isYearSelected(year) ? 'selected' : isCurrentYear(year) ? 'today' : null\n \"\n [disabled]=\"isYearDisabled(year)\"\n [ngClass]=\"{\n 'bg-primary font-semibold text-grayscale-0': isYearSelected(year),\n 'ring-2 ring-inset ring-primary':\n isCurrentYear(year) && !isYearSelected(year) && !isYearDisabled(year),\n 'text-grayscale-90 hover:bg-grayscale-10':\n !isYearSelected(year) && !isYearDisabled(year),\n 'cursor-not-allowed text-grayscale-30': isYearDisabled(year),\n }\"\n (click)=\"selectYear(year)\"\n >\n {{ year }}\n </button>\n }\n }\n </div>\n }\n\n @if (pickerView() === 'months') {\n <!-- Cabe\u00E7alho de navega\u00E7\u00E3o anual -->\n <div class=\"flex items-center justify-between border-b border-solid border-grayscale-30 px-3 py-2\">\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"prevDisabled()\"\n [attr.aria-disabled]=\"prevDisabled() ? 'true' : null\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_prev_year' | translate\"\n (click)=\"navigatePrev()\"\n >\n <i\n class=\"fas fa-chevron-left text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n\n <span class=\"text-sm font-medium text-grayscale-90\">{{ currentYear() }}</span>\n\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"nextDisabled()\"\n [attr.aria-disabled]=\"nextDisabled() ? 'true' : null\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_next_year' | translate\"\n (click)=\"navigateNext()\"\n >\n <i\n class=\"fas fa-chevron-right text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n\n <!-- Grade de meses -->\n <div\n class=\"grid grid-cols-3 gap-2 px-3 py-3\"\n role=\"grid\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_select_month' | translate\"\n >\n @for (row of monthsGrid(); track $index) {\n @for (month of row; track month.index) {\n <button\n type=\"button\"\n role=\"gridcell\"\n class=\"flex h-9 items-center justify-center rounded-small text-sm font-normal transition-colors\"\n [attr.aria-selected]=\"isMonthSelected(month.index) || null\"\n [attr.aria-disabled]=\"isMonthDisabled(month.index) ? 'true' : null\"\n [attr.data-focus]=\"isMonthSelected(month.index) ? 'selected' : null\"\n [disabled]=\"isMonthDisabled(month.index)\"\n [ngClass]=\"{\n 'bg-primary font-semibold text-grayscale-0': isMonthSelected(month.index),\n 'text-grayscale-90 hover:bg-grayscale-10':\n !isMonthSelected(month.index) && !isMonthDisabled(month.index),\n 'cursor-not-allowed text-grayscale-30': isMonthDisabled(month.index),\n }\"\n (click)=\"selectMonth(month.index)\"\n >\n {{ month.key | translate }}\n </button>\n }\n }\n </div>\n\n @if (mode() !== 'month') {\n <div class=\"border-t border-solid border-grayscale-30 px-3 py-2\">\n <button\n type=\"button\"\n class=\"flex items-center gap-2 rounded-small px-2 py-1 text-sm text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n (click)=\"backToCalendar()\"\n >\n <i\n class=\"fas fa-arrow-left\"\n aria-hidden=\"true\"\n ></i>\n {{ 'platform.angular_components.datepicker_back_to_calendar' | translate }}\n </button>\n </div>\n }\n }\n }\n\n <!-- Time picker -->\n @if (showTimePicker()) {\n <div\n class=\"flex items-center justify-center gap-3 px-4 py-3\"\n [class.border-t]=\"showCalendar()\"\n [class.border-solid]=\"showCalendar()\"\n [class.border-grayscale-30]=\"showCalendar()\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_select_time' | translate\"\n >\n <!-- Horas -->\n <div class=\"flex flex-col items-center gap-1\">\n <button\n #increaseHourButton\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_increment_hour' | translate\"\n (click)=\"incrementHours()\"\n >\n <i\n class=\"fas fa-chevron-up text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n <input\n type=\"text\"\n inputmode=\"numeric\"\n [attr.maxlength]=\"timeInputMaxLength\"\n class=\"h-9 w-12 rounded-small border border-solid border-grayscale-30 bg-grayscale-5 text-center text-base font-medium text-grayscale-90 outline-none focus:border-primary focus:outline-1 focus:outline-primary\"\n [value]=\"padTime(displayHours())\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_hour' | translate\"\n aria-live=\"polite\"\n pattern=\"[0-9]+\"\n (keydown)=\"handleHoursKeydown($event)\"\n (change)=\"handleHoursInput($event)\"\n />\n <button\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_decrement_hour' | translate\"\n (click)=\"decrementHours()\"\n >\n <i\n class=\"fas fa-chevron-down text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n\n <span\n class=\"text-xl font-bold text-grayscale-60\"\n aria-hidden=\"true\"\n >:</span\n >\n\n <!-- Minutos -->\n <div class=\"flex flex-col items-center gap-1\">\n <button\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_increment_minute' | translate\"\n (click)=\"incrementMinutes()\"\n >\n <i\n class=\"fas fa-chevron-up text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n <input\n type=\"text\"\n inputmode=\"numeric\"\n [attr.maxlength]=\"timeInputMaxLength\"\n class=\"h-9 w-12 rounded-small border border-solid border-grayscale-30 bg-grayscale-5 text-center text-base font-medium text-grayscale-90 outline-none focus:border-primary focus:outline-1 focus:outline-primary\"\n [value]=\"padTime(minutes())\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_minute' | translate\"\n aria-live=\"polite\"\n pattern=\"[0-9]+\"\n (keydown)=\"handleMinutesKeydown($event)\"\n (change)=\"handleMinutesInput($event)\"\n />\n <button\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_decrement_minute' | translate\"\n (click)=\"decrementMinutes()\"\n >\n <i\n class=\"fas fa-chevron-down text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n\n @if (showSeconds()) {\n <span\n class=\"text-xl font-bold text-grayscale-60\"\n aria-hidden=\"true\"\n >:</span\n >\n\n <!-- Segundos -->\n <div class=\"flex flex-col items-center gap-1\">\n <button\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_increment_second' | translate\"\n (click)=\"incrementSeconds()\"\n >\n <i\n class=\"fas fa-chevron-up text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n <input\n type=\"text\"\n inputmode=\"numeric\"\n [attr.maxlength]=\"timeInputMaxLength\"\n class=\"h-9 w-12 rounded-small border border-solid border-grayscale-30 bg-grayscale-5 text-center text-base font-medium text-grayscale-90 outline-none focus:border-primary focus:outline-1 focus:outline-primary\"\n [value]=\"padTime(seconds())\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_second' | translate\"\n aria-live=\"polite\"\n pattern=\"[0-9]+\"\n (keydown)=\"handleSecondsKeydown($event)\"\n (change)=\"handleSecondsInput($event)\"\n />\n <button\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_decrement_second' | translate\"\n (click)=\"decrementSeconds()\"\n >\n <i\n class=\"fas fa-chevron-down text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n }\n\n @if (is12HourFormat()) {\n <!-- Seletor AM/PM -->\n <button\n type=\"button\"\n class=\"flex h-9 w-12 items-center justify-center rounded-small border border-solid border-grayscale-30 bg-grayscale-5 text-base font-medium text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_toggle_meridiem' | translate\"\n aria-live=\"polite\"\n (click)=\"toggleAmPm()\"\n >\n {{ amPm() }}\n </button>\n }\n </div>\n }\n\n <!-- Rodap\u00E9 de a\u00E7\u00F5es -->\n @if (showButtonBar() || mode() === 'datetime' || mode() === 'time') {\n <div class=\"flex items-center justify-between border-t border-solid border-grayscale-30 px-3 py-2\">\n @if (showButtonBar()) {\n <div>\n @if (mode() === 'date' || mode() === 'datetime' || mode() === 'range') {\n <button\n type=\"button\"\n class=\"rounded-small px-2 py-1 text-sm text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n (click)=\"selectToday()\"\n >\n {{ 'platform.angular_components.datepicker_today' | translate }}\n </button>\n }\n </div>\n\n <div class=\"flex gap-2\">\n <button\n type=\"button\"\n class=\"rounded-small px-2 py-1 text-sm text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n (click)=\"clearValue($event)\"\n >\n {{ 'platform.angular_components.datepicker_clear' | translate }}\n </button>\n\n @if (mode() === 'datetime' || mode() === 'time') {\n <button\n type=\"button\"\n class=\"rounded-small bg-primary px-3 py-1 text-sm font-medium text-grayscale-0 transition-colors hover:opacity-90\"\n (click)=\"confirm()\"\n >\n {{ 'platform.angular_components.datepicker_confirm' | translate }}\n </button>\n }\n </div>\n } @else {\n <div></div>\n <div>\n @if (mode() === 'datetime' || mode() === 'time') {\n <button\n type=\"button\"\n class=\"rounded-small bg-primary px-3 py-1 text-sm font-medium text-grayscale-0 transition-colors hover:opacity-90\"\n (click)=\"confirm()\"\n >\n {{ 'platform.angular_components.datepicker_confirm' | translate }}\n </button>\n }\n </div>\n }\n </div>\n }\n </div>\n</ng-template>\n\n", styles: [":host{display:block;position:relative;width:100%}:host.ng-invalid.ng-dirty input{border-color:#c13018}:host.ng-invalid.ng-dirty input:focus{border-color:#c13018;outline-color:#c13018}:host.ng-invalid.ng-dirty button[type=button]{border-color:#c13018}:host.no-icon button[type=button]{display:none}:host.no-icon input{padding-right:.75rem}button[type=button]:focus-visible{outline:2px solid #428bca;outline-offset:1px;border-radius:inherit}\n"] }]
1473
+ ], template: "<div\n cdkOverlayOrigin\n #trigger=\"cdkOverlayOrigin\"\n class=\"relative flex w-full items-center\"\n role=\"combobox\"\n aria-haspopup=\"grid\"\n [attr.aria-expanded]=\"isOpen()\"\n [attr.aria-controls]=\"popupId()\"\n>\n <input\n #triggerInput\n class=\"h-[35px] w-full rounded-small border border-solid border-grayscale-30 pl-3 text-sm outline-none transition-colors focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-[var(--s-focus-ring-color,#0090ff)]\"\n [class.pr-10]=\"showIcon() && !showClear()\"\n [class.pr-16]=\"showIcon() && showClear()\"\n [class.pr-6]=\"!showIcon() && showClear()\"\n [class.bg-grayscale-0]=\"!disabled()\"\n [class.text-grayscale-90]=\"!disabled()\"\n [class.border-grayscale-20]=\"disabled()\"\n [class.bg-grayscale-5]=\"disabled()\"\n [class.text-grayscale-30]=\"disabled()\"\n [class.cursor-not-allowed]=\"disabled()\"\n [id]=\"inputId()\"\n [name]=\"name() ?? inputId()\"\n type=\"text\"\n [placeholder]=\"placeholder() ?? (placeholderKey() | translate)\"\n [disabled]=\"disabled()\"\n [readonly]=\"\n readonlyInput() ||\n mode() === 'range' ||\n mode() === 'year' ||\n isMultipleMode() ||\n (isSegmentModeCandidate() && isTouchDevice())\n \"\n [tabIndex]=\"tabindex() ?? null\"\n [autofocus]=\"autofocus()\"\n [(ngModel)]=\"inputDate\"\n (ngModelChange)=\"handleInputChange($event)\"\n (focus)=\"handleInputFocus($event)\"\n (blur)=\"handleInputBlur($event)\"\n (mousedown)=\"handleInputClick($event)\"\n (keydown)=\"handleTriggerKeydown($event)\"\n (input)=\"handleNativeInput($event)\"\n [attr.aria-invalid]=\"ngControl?.control?.invalid || null\"\n />\n\n @if (showClear() && inputDate) {\n <button\n type=\"button\"\n class=\"absolute flex h-[35px] w-6 items-center justify-center text-grayscale-60 transition-colors hover:text-grayscale-90\"\n [class.right-9]=\"showIcon()\"\n [class.right-0]=\"!showIcon()\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_clear' | translate\"\n (click)=\"clearValue($event)\"\n >\n <i\n class=\"fas fa-times text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n }\n\n @if (showIcon()) {\n <button\n #iconButton\n type=\"button\"\n class=\"absolute right-0 flex h-[35px] w-9 items-center justify-center border-l border-solid transition-colors\"\n [class.border-grayscale-20]=\"disabled()\"\n [class.text-grayscale-30]=\"disabled()\"\n [class.cursor-not-allowed]=\"disabled()\"\n [class.border-grayscale-30]=\"!disabled() && !isFocused()\"\n [class.border-primary]=\"isFocused() && !disabled()\"\n [class.text-grayscale-90]=\"!disabled()\"\n [class.hover:bg-grayscale-10]=\"!disabled()\"\n [disabled]=\"disabled()\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_open' | translate\"\n (click)=\"toggle()\"\n (keydown)=\"handleTriggerKeydown($event)\"\n >\n <i\n [class]=\"resolvedIcon()\"\n aria-hidden=\"true\"\n ></i>\n </button>\n }\n</div>\n\n<ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayOpen]=\"isOpen()\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n [cdkConnectedOverlayPositions]=\"positions\"\n (backdropClick)=\"handleBackdropClick($event)\"\n (overlayKeydown)=\"handleOverlayKeydown($event)\"\n (detach)=\"isOpen.set(false)\"\n>\n <div\n #popupPanel\n class=\"z-50 w-72 rounded-medium border border-solid border-grayscale-30 bg-grayscale-0 shadow-md\"\n role=\"dialog\"\n cdkTrapFocus\n [id]=\"popupId()\"\n [attr.aria-label]=\"dialogAriaLabelKey() | translate\"\n >\n @if (showCalendar()) {\n @if (pickerView() === 'calendar') {\n <!-- Cabe\u00E7alho de navega\u00E7\u00E3o mensal -->\n <div class=\"flex items-center justify-between border-b border-solid border-grayscale-30 px-3 py-2\">\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"prevDisabled()\"\n [attr.aria-disabled]=\"prevDisabled() ? 'true' : null\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_prev_month' | translate\"\n (click)=\"navigatePrev()\"\n >\n <i\n class=\"fas fa-chevron-left text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n\n <button\n type=\"button\"\n class=\"flex items-center gap-1 rounded-small px-2 py-1 text-sm font-medium text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_select_month_year' | translate\"\n (click)=\"switchToMonths()\"\n >\n {{ currentMonthKey() | translate }}&nbsp;{{ currentYear() }}\n <i\n class=\"fas fa-chevron-down text-[10px]\"\n aria-hidden=\"true\"\n ></i>\n </button>\n\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"nextDisabled()\"\n [attr.aria-disabled]=\"nextDisabled() ? 'true' : null\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_next_month' | translate\"\n (click)=\"navigateNext()\"\n >\n <i\n class=\"fas fa-chevron-right text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n\n <!-- Cabe\u00E7alhos dos dias da semana -->\n <div\n class=\"grid grid-cols-7 px-3 pt-2\"\n role=\"row\"\n >\n @for (dayKey of orderedWeekDayKeys(); track dayKey) {\n <div\n class=\"flex h-8 items-center justify-center text-xs font-medium text-grayscale-60\"\n role=\"columnheader\"\n [attr.aria-label]=\"dayKey | translate\"\n >\n {{ dayKey | translate }}\n </div>\n }\n </div>\n\n <!-- Grade do calend\u00E1rio -->\n <div\n class=\"grid grid-cols-7 px-3 pb-2\"\n role=\"grid\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_calendar_label'\n | translate: { month: (currentMonthKey() | translate), year: currentYear() }\n \"\n (keydown)=\"handleCalendarGridKeydown($event)\"\n >\n @for (week of calendarWeeks(); track $index) {\n <div\n role=\"row\"\n class=\"contents\"\n >\n @for (day of week; track day.date.toISOString()) {\n <button\n type=\"button\"\n role=\"gridcell\"\n class=\"flex h-8 w-8 items-center justify-center rounded-[50%] text-sm font-normal transition-colors\"\n [class.invisible]=\"!showOtherMonths() && !day.isCurrentMonth\"\n [attr.aria-label]=\"formatDayAriaLabel(day.date)\"\n [attr.aria-selected]=\"day.isSelected || day.isRangeStart || day.isRangeEnd || null\"\n [attr.aria-current]=\"day.isToday ? 'date' : null\"\n [attr.aria-disabled]=\"day.isDisabled ? 'true' : null\"\n [attr.aria-hidden]=\"!showOtherMonths() && !day.isCurrentMonth ? 'true' : null\"\n [attr.data-focus]=\"\n day.isSelected || day.isRangeStart || day.isRangeEnd\n ? 'selected'\n : day.isToday\n ? 'today'\n : null\n \"\n [disabled]=\"day.isDisabled\"\n [ngClass]=\"{\n 'bg-primary font-semibold text-grayscale-0':\n day.isSelected || day.isRangeStart || day.isRangeEnd,\n 'bg-grayscale-10 hover:bg-grayscale-20':\n day.isInRange && !day.isRangeStart && !day.isRangeEnd,\n 'text-grayscale-90 hover:bg-grayscale-10':\n !day.isSelected &&\n !day.isRangeStart &&\n !day.isRangeEnd &&\n !day.isDisabled &&\n day.isCurrentMonth,\n 'text-grayscale-60 hover:bg-grayscale-10':\n !day.isSelected &&\n !day.isRangeStart &&\n !day.isRangeEnd &&\n !day.isDisabled &&\n !day.isCurrentMonth,\n 'ring-2 ring-inset ring-primary':\n day.isToday && !day.isSelected && !day.isRangeStart && !day.isRangeEnd,\n 'cursor-not-allowed text-grayscale-30': day.isDisabled,\n }\"\n (mouseenter)=\"onDayHover(day.date)\"\n (mouseleave)=\"onDayHover(null)\"\n (click)=\"selectDate(day)\"\n >\n {{ day.dayOfMonth }}\n </button>\n }\n </div>\n }\n </div>\n }\n\n @if (pickerView() === 'years') {\n <!-- Cabe\u00E7alho de navega\u00E7\u00E3o por d\u00E9cada -->\n <div class=\"flex items-center justify-between border-b border-solid border-grayscale-30 px-3 py-2\">\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"prevDisabled()\"\n [attr.aria-disabled]=\"prevDisabled() ? 'true' : null\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_prev_decade' | translate\"\n (click)=\"navigatePrev()\"\n >\n <i\n class=\"fas fa-chevron-left text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n\n <span class=\"text-sm font-medium text-grayscale-90\"\n >{{ currentDecadeStart() }} \u2013 {{ currentDecadeStart() + 11 }}</span\n >\n\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"nextDisabled()\"\n [attr.aria-disabled]=\"nextDisabled() ? 'true' : null\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_next_decade' | translate\"\n (click)=\"navigateNext()\"\n >\n <i\n class=\"fas fa-chevron-right text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n\n <!-- Grade de anos -->\n <div\n class=\"grid grid-cols-3 gap-2 px-3 py-3\"\n role=\"grid\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_select_year' | translate\"\n >\n @for (row of yearsGrid(); track $index) {\n @for (year of row; track year) {\n <button\n type=\"button\"\n role=\"gridcell\"\n class=\"flex h-9 items-center justify-center rounded-small text-sm font-normal transition-colors\"\n [attr.aria-selected]=\"isYearSelected(year) || null\"\n [attr.aria-disabled]=\"isYearDisabled(year) ? 'true' : null\"\n [attr.aria-current]=\"isCurrentYear(year) ? 'date' : null\"\n [attr.data-focus]=\"\n isYearSelected(year) ? 'selected' : isCurrentYear(year) ? 'today' : null\n \"\n [disabled]=\"isYearDisabled(year)\"\n [ngClass]=\"{\n 'bg-primary font-semibold text-grayscale-0': isYearSelected(year),\n 'ring-2 ring-inset ring-primary':\n isCurrentYear(year) && !isYearSelected(year) && !isYearDisabled(year),\n 'text-grayscale-90 hover:bg-grayscale-10':\n !isYearSelected(year) && !isYearDisabled(year),\n 'cursor-not-allowed text-grayscale-30': isYearDisabled(year),\n }\"\n (click)=\"selectYear(year)\"\n >\n {{ year }}\n </button>\n }\n }\n </div>\n }\n\n @if (pickerView() === 'months') {\n <!-- Cabe\u00E7alho de navega\u00E7\u00E3o anual -->\n <div class=\"flex items-center justify-between border-b border-solid border-grayscale-30 px-3 py-2\">\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"prevDisabled()\"\n [attr.aria-disabled]=\"prevDisabled() ? 'true' : null\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_prev_year' | translate\"\n (click)=\"navigatePrev()\"\n >\n <i\n class=\"fas fa-chevron-left text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n\n <span class=\"text-sm font-medium text-grayscale-90\">{{ currentYear() }}</span>\n\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"nextDisabled()\"\n [attr.aria-disabled]=\"nextDisabled() ? 'true' : null\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_next_year' | translate\"\n (click)=\"navigateNext()\"\n >\n <i\n class=\"fas fa-chevron-right text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n\n <!-- Grade de meses -->\n <div\n class=\"grid grid-cols-3 gap-2 px-3 py-3\"\n role=\"grid\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_select_month' | translate\"\n >\n @for (row of monthsGrid(); track $index) {\n @for (month of row; track month.index) {\n <button\n type=\"button\"\n role=\"gridcell\"\n class=\"flex h-9 items-center justify-center rounded-small text-sm font-normal transition-colors\"\n [attr.aria-selected]=\"isMonthSelected(month.index) || null\"\n [attr.aria-disabled]=\"isMonthDisabled(month.index) ? 'true' : null\"\n [attr.data-focus]=\"isMonthSelected(month.index) ? 'selected' : null\"\n [disabled]=\"isMonthDisabled(month.index)\"\n [ngClass]=\"{\n 'bg-primary font-semibold text-grayscale-0': isMonthSelected(month.index),\n 'text-grayscale-90 hover:bg-grayscale-10':\n !isMonthSelected(month.index) && !isMonthDisabled(month.index),\n 'cursor-not-allowed text-grayscale-30': isMonthDisabled(month.index),\n }\"\n (click)=\"selectMonth(month.index)\"\n >\n {{ month.key | translate }}\n </button>\n }\n }\n </div>\n\n @if (mode() !== 'month') {\n <div class=\"border-t border-solid border-grayscale-30 px-3 py-2\">\n <button\n type=\"button\"\n class=\"flex items-center gap-2 rounded-small px-2 py-1 text-sm text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n (click)=\"backToCalendar()\"\n >\n <i\n class=\"fas fa-arrow-left\"\n aria-hidden=\"true\"\n ></i>\n {{ 'platform.angular_components.datepicker_back_to_calendar' | translate }}\n </button>\n </div>\n }\n }\n }\n\n <!-- Time picker -->\n @if (showTimePicker()) {\n <div\n class=\"flex items-center justify-center gap-3 px-4 py-3\"\n [class.border-t]=\"showCalendar()\"\n [class.border-solid]=\"showCalendar()\"\n [class.border-grayscale-30]=\"showCalendar()\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_select_time' | translate\"\n >\n <!-- Horas -->\n <div class=\"flex flex-col items-center gap-1\">\n <button\n #increaseHourButton\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_increment_hour' | translate\"\n (click)=\"incrementHours()\"\n >\n <i\n class=\"fas fa-chevron-up text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n <input\n type=\"text\"\n inputmode=\"numeric\"\n [attr.maxlength]=\"timeInputMaxLength\"\n class=\"h-9 w-12 rounded-small border border-solid border-grayscale-30 bg-grayscale-5 text-center text-base font-medium text-grayscale-90 outline-none focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-[var(--s-focus-ring-color,#0090ff)]\"\n [value]=\"padTime(displayHours())\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_hour' | translate\"\n aria-live=\"polite\"\n pattern=\"[0-9]+\"\n (keydown)=\"handleHoursKeydown($event)\"\n (change)=\"handleHoursInput($event)\"\n />\n <button\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_decrement_hour' | translate\"\n (click)=\"decrementHours()\"\n >\n <i\n class=\"fas fa-chevron-down text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n\n <span\n class=\"text-xl font-bold text-grayscale-60\"\n aria-hidden=\"true\"\n >:</span\n >\n\n <!-- Minutos -->\n <div class=\"flex flex-col items-center gap-1\">\n <button\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_increment_minute' | translate\"\n (click)=\"incrementMinutes()\"\n >\n <i\n class=\"fas fa-chevron-up text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n <input\n type=\"text\"\n inputmode=\"numeric\"\n [attr.maxlength]=\"timeInputMaxLength\"\n class=\"h-9 w-12 rounded-small border border-solid border-grayscale-30 bg-grayscale-5 text-center text-base font-medium text-grayscale-90 outline-none focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-[var(--s-focus-ring-color,#0090ff)]\"\n [value]=\"padTime(minutes())\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_minute' | translate\"\n aria-live=\"polite\"\n pattern=\"[0-9]+\"\n (keydown)=\"handleMinutesKeydown($event)\"\n (change)=\"handleMinutesInput($event)\"\n />\n <button\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_decrement_minute' | translate\"\n (click)=\"decrementMinutes()\"\n >\n <i\n class=\"fas fa-chevron-down text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n\n @if (showSeconds()) {\n <span\n class=\"text-xl font-bold text-grayscale-60\"\n aria-hidden=\"true\"\n >:</span\n >\n\n <!-- Segundos -->\n <div class=\"flex flex-col items-center gap-1\">\n <button\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_increment_second' | translate\"\n (click)=\"incrementSeconds()\"\n >\n <i\n class=\"fas fa-chevron-up text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n <input\n type=\"text\"\n inputmode=\"numeric\"\n [attr.maxlength]=\"timeInputMaxLength\"\n class=\"h-9 w-12 rounded-small border border-solid border-grayscale-30 bg-grayscale-5 text-center text-base font-medium text-grayscale-90 outline-none focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-[var(--s-focus-ring-color,#0090ff)]\"\n [value]=\"padTime(seconds())\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_second' | translate\"\n aria-live=\"polite\"\n pattern=\"[0-9]+\"\n (keydown)=\"handleSecondsKeydown($event)\"\n (change)=\"handleSecondsInput($event)\"\n />\n <button\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_decrement_second' | translate\"\n (click)=\"decrementSeconds()\"\n >\n <i\n class=\"fas fa-chevron-down text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n }\n\n @if (is12HourFormat()) {\n <!-- Seletor AM/PM -->\n <button\n type=\"button\"\n class=\"flex h-9 w-12 items-center justify-center rounded-small border border-solid border-grayscale-30 bg-grayscale-5 text-base font-medium text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_toggle_meridiem' | translate\"\n aria-live=\"polite\"\n (click)=\"toggleAmPm()\"\n >\n {{ amPm() }}\n </button>\n }\n </div>\n }\n\n <!-- Rodap\u00E9 de a\u00E7\u00F5es -->\n @if (showButtonBar() || mode() === 'datetime' || mode() === 'time') {\n <div class=\"flex items-center justify-between border-t border-solid border-grayscale-30 px-3 py-2\">\n @if (showButtonBar()) {\n <div>\n @if (mode() === 'date' || mode() === 'datetime' || mode() === 'range') {\n <button\n type=\"button\"\n class=\"rounded-small px-2 py-1 text-sm text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n (click)=\"selectToday()\"\n >\n {{ 'platform.angular_components.datepicker_today' | translate }}\n </button>\n }\n </div>\n\n <div class=\"flex gap-2\">\n <button\n type=\"button\"\n class=\"rounded-small px-2 py-1 text-sm text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n (click)=\"clearValue($event)\"\n >\n {{ 'platform.angular_components.datepicker_clear' | translate }}\n </button>\n\n @if (mode() === 'datetime' || mode() === 'time') {\n <button\n type=\"button\"\n class=\"rounded-small bg-primary px-3 py-1 text-sm font-medium text-grayscale-0 transition-colors hover:opacity-90\"\n (click)=\"confirm()\"\n >\n {{ 'platform.angular_components.datepicker_confirm' | translate }}\n </button>\n }\n </div>\n } @else {\n <div></div>\n <div>\n @if (mode() === 'datetime' || mode() === 'time') {\n <button\n type=\"button\"\n class=\"rounded-small bg-primary px-3 py-1 text-sm font-medium text-grayscale-0 transition-colors hover:opacity-90\"\n (click)=\"confirm()\"\n >\n {{ 'platform.angular_components.datepicker_confirm' | translate }}\n </button>\n }\n </div>\n }\n </div>\n }\n </div>\n</ng-template>\n\n", styles: [":host{display:block;position:relative;width:100%}:host.ng-invalid.ng-dirty input{border-color:#c13018}:host.ng-invalid.ng-dirty input:focus{border-color:#c13018;outline-color:#c13018}:host.ng-invalid.ng-dirty button[type=button]{border-color:#c13018}:host.no-icon button[type=button]{display:none}:host.no-icon input{padding-right:.75rem}button[type=button]:focus-visible{outline:2px solid #428bca;outline-offset:1px;border-radius:inherit}\n"] }]
1474
1474
  }], ctorParameters: () => [], propDecorators: { handleHoursKeydown: [], handleMinutesKeydown: [], handleSecondsKeydown: [] } });
1475
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXBpY2tlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLWNvbXBvbmVudHMvZGF0ZXBpY2tlci9zcmMvbGliL2RhdGVwaWNrZXIvZGF0ZXBpY2tlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLWNvbXBvbmVudHMvZGF0ZXBpY2tlci9zcmMvbGliL2RhdGVwaWNrZXIvZGF0ZXBpY2tlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxnQkFBZ0IsRUFBcUIsTUFBTSxzQkFBc0IsQ0FBQztBQUNoRyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxFQUNILGVBQWUsRUFDZixTQUFTLEVBQ1QsUUFBUSxFQUNSLFVBQVUsRUFDVixVQUFVLEVBQ1YsTUFBTSxFQUNOLFFBQVEsRUFDUixLQUFLLEVBQ0wsS0FBSyxFQUVMLE1BQU0sRUFDTixNQUFNLEVBQ04sU0FBUyxHQUNaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2hFLE9BQU8sRUFHSCxXQUFXLEVBQ1gsYUFBYSxFQUNiLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsbUJBQW1CLEVBR25CLFVBQVUsR0FDYixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBRSxlQUFlLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN4RSxPQUFPLEVBQUUsaUJBQWlCLEVBQXVCLE1BQU0sc0JBQXNCLENBQUM7QUFDOUUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLE1BQU0s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ZDt3QkFDRDs0QkFDSSxPQUFPLEVBQUUsYUFBYTs0QkFDdEIsV0FBVyxxQkFBcUI7NEJBQ2hDLEtBQUssRUFBRSxJQUFJO3lCQUNkO3FCQUNKO3dEQTJ5Q1Msa0JBQWtCLE1BV2xCLG9CQUFvQixNQVdwQixvQkFBb0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDZGtUcmFwRm9jdXMgfSBmcm9tICdAYW5ndWxhci9jZGsvYTExeSc7XG5pbXBvcnQgeyBDZGtDb25uZWN0ZWRPdmVybGF5LCBDZGtPdmVybGF5T3JpZ2luLCBDb25uZWN0ZWRQb3NpdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcbmltcG9ydCB7IE5nQ2xhc3MgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgICBhZnRlck5leHRSZW5kZXIsXG4gICAgQ29tcG9uZW50LFxuICAgIGNvbXB1dGVkLFxuICAgIERlc3Ryb3lSZWYsXG4gICAgRWxlbWVudFJlZixcbiAgICBpbmplY3QsXG4gICAgSW5qZWN0b3IsXG4gICAgaW5wdXQsXG4gICAgbW9kZWwsXG4gICAgT25Jbml0LFxuICAgIG91dHB1dCxcbiAgICBzaWduYWwsXG4gICAgdmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7XG4gICAgQWJzdHJhY3RDb250cm9sLFxuICAgIENvbnRyb2xWYWx1ZUFjY2Vzc29yLFxuICAgIEZvcm1zTW9kdWxlLFxuICAgIE5HX1ZBTElEQVRPUlMsXG4gICAgTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgTmdDb250cm9sLFxuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgVmFsaWRhdGlvbkVycm9ycyxcbiAgICBWYWxpZGF0b3IsXG4gICAgVmFsaWRhdG9ycyxcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlLCBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBEYXRlU2VnbWVudEVuZ2luZSwgU2VnbWVudEVuZ2luZUNvbmZpZyB9IGZyb20gJy4vZGF0ZS1zZWdtZW50LWlucHV0JztcbmltcG9ydCB7IGZvcm1hdFZhbHVlRm9ySW5wdXQsIGlzU2FtZURheSwgcGFyc2VJbnB1dCwgc3RyaXBUaW1lIH0gZnJvbSAnLi9kYXRlLnV0aWxzJztcbmltcG9ydCB0eXBlIHsgQ2FsZW5kYXJEYXksIERhdGVQaWNrZXJNb2RlLCBEYXRlUmFuZ2UgfSBmcm9tICcuL21vZGVscyc7XG5cbnR5cGUgRGF0ZXBpY2tlclZhbHVlID0gRGF0ZSB8IERhdGVSYW5nZSB8IERhdGVbXSB8IG51bGw7XG50eXBlIFBpY2tlclZpZXcgPSAnY2FsZW5kYXInIHwgJ21vbnRocycgfCAneWVhcnMnO1xuXG5mdW5jdGlvbiBudW1lcmljS2V5c09ubHkoKTogTWV0aG9kRGVjb3JhdG9yIHtcbiAgICByZXR1cm4gKF90YXJnZXQsIF9rZXksIGRlc2NyaXB0b3I6IFByb3BlcnR5RGVzY3JpcHRvcikgPT4ge1xuICAgICAgICBjb25zdCBvcmlnaW5hbDogKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiB2b2lkID0gZGVzY3JpcHRvci52YWx1ZTtcbiAgICAgICAgZGVzY3JpcHRvci52YWx1ZSA9IGZ1bmN0aW9uICh0aGlzOiB1bmtub3duLCBldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICAgICAgY29uc3QgaXNWYWxpZEtleSA9XG4gICAgICAgICAgICAgICAgWydBcnJvd1VwJywgJ0Fycm93RG93bicsICdCYWNrc3BhY2UnLCAnRGVsZXRlJywgJ1RhYiddLmluY2x1ZGVzKGV2ZW50LmtleSkgfHwgL15cXGQkLy50ZXN0KGV2ZW50LmtleSk7XG4gICAgICAgICAgICBpZiAoIWlzVmFsaWRLZXkpIHtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBvcmlnaW5hbC5jYWxsKHRoaXMsIGV2ZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3I7XG4gICAgfTtcbn1cblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdzLWRhdGVwaWNrZXInLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaW1wb3J0czogW1xuICAgICAgICBOZ0NsYXNzLFxuICAgICAgICBUcmFuc2xhdGVNb2R1bGUsXG4gICAgICAgIENka1RyYXBGb2N1cyxcbiAgICAgICAgQ2RrT3ZlcmxheU9yaWdpbixcbiAgICAgICAgQ2RrQ29ubmVjdGVkT3ZlcmxheSxcbiAgICAgICAgRm9ybXNNb2R1bGUsXG4gICAgICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgXSxcbiAgICB0ZW1wbGF0ZVVybDogJy4vZGF0ZXBpY2tlci5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVzOiBbXG4gICAgICAgIGBcbiAgICAgICAgICAgIDpob3N0IHtcbiAgICAgICAgICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICAgICAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICA6aG9zdC5uZy1pbnZhbGlkLm5nLWRpcnR5IGlucHV0IHtcbiAgICAgICAgICAgICAgICBib3JkZXItY29sb3I6ICNjMTMwMTg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICA6aG9zdC5uZy1pbnZhbGlkLm5nLWRpcnR5IGlucHV0OmZvY3VzIHtcbiAgICAgICAgICAgICAgICBib3JkZXItY29sb3I6ICNjMTMwMTg7XG4gICAgICAgICAgICAgICAgb3V0bGluZS1jb2xvcjogI2MxMzAxODtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDpob3N0Lm5nLWludmFsaWQubmctZGlydHkgYnV0dG9uW3R5cGU9J2J1dHRvbiddIHtcbiAgICAgICAgICAgICAgICBib3JkZXItY29sb3I6ICNjMTMwMTg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICA6aG9zdC5uby1pY29uIGJ1dHRvblt0eXBlPSdidXR0b24nXSB7XG4gICAgICAgICAgICAgICAgZGlzcGxheTogbm9uZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDpob3N0Lm5vLWljb24gaW5wdXQge1xuICAgICAgICAgICAgICAgIHBhZGRpbmctcmlnaHQ6IDAuNzVyZW07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBidXR0b25bdHlwZT0nYnV0dG9uJ106Zm9jdXMtdmlzaWJsZSB7XG4gICAgICAgICAgICAgICAgb3V0bGluZTogMnB4IHNvbGlkICM0MjhiY2E7XG4gICAgICAgICAgICAgICAgb3V0bGluZS1vZmZzZXQ6IDFweDtcbiAgICAgICAgICAgICAgICBib3JkZXItcmFkaXVzOiBpbmhlcml0O1xuICAgICAgICAgICAgfVxuICAgICAgICBgLFxuICAgIF0sXG4gICAgaG9zdDoge1xuICAgICAgICAnW2NsYXNzLm5vLWljb25dJzogJyFzaG93SWNvbigpJyxcbiAgICB9LFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBEYXRlcGlja2VyQ29tcG9uZW50LFxuICAgICAgICAgICAgbXVsdGk6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIHByb3ZpZGU6IE5HX1ZBTElEQVRPUlMsXG4gICAgICAgICAgICB1c2VFeGlzdGluZzogRGF0ZXBpY2tlckNvbXBvbmVudCxcbiAgICAgICAgICAgIG11bHRpOiB0cnVlLFxuICAgICAgICB9LFxuICAgIF0sXG59KVxuZXhwb3J0IGNsYXNzIERhdGVwaWNrZXJDb21wb25lbnQgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciwgVmFsaWRhdG9yLCBPbkluaXQge1xuICAgIHByaXZhdGUgc3RhdGljIGlkQ291bnRlciA9IDA7XG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgREFZU19JTl9XRUVLID0gNztcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBNT05USFNfSU5fWUVBUiA9IDEyO1xuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IE1PTlRIU19QRVJfUk9XID0gMztcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBZRUFSU19QRVJfR1JJRCA9IDEyO1xuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFlFQVJTX1BFUl9ST1cgPSAzO1xuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IERFRkFVTFRfTUlOVVRFX1NURVAgPSA1O1xuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IE1BWF9IT1VSUyA9IDI0O1xuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IE1BWF9NSU5VVEVTID0gNjA7XG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgSE9VUlNfUEVSX01FUklESUVNID0gMTI7XG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgRE9VQkxFX0NMSUNLX1RIUkVTSE9MRF9NUyA9IDQwMDtcblxuICAgIHByaXZhdGUgc3RhdGljIG5leHRJZCgpOiBzdHJpbmcge1xuICAgICAgICBEYXRlcGlja2VyQ29tcG9uZW50LmlkQ291bnRlcisrO1xuICAgICAgICByZXR1cm4gYHMtZGF0ZXBpY2tlci0ke0RhdGVwaWNrZXJDb21wb25lbnQuaWRDb3VudGVyfWA7XG4gICAgfVxuXG4gICAgLy8g4pSA4pSAIElucHV0cyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAgIC8qKiBIVE1MIGBpZGAgYXBsaWNhZG8gYW8gZWxlbWVudG8gYDxpbnB1dD5gLiBBdXRvLWdlcmFkbyBxdWFuZG8gb21pdGlkby4gKi9cbiAgICByZWFkb25seSBpbnB1dElkID0gaW5wdXQ8c3RyaW5nPihEYXRlcGlja2VyQ29tcG9uZW50Lm5leHRJZCgpKTtcblxuICAgIC8qKiBBdHJpYnV0byBgbmFtZWAgZG8gYDxpbnB1dD5gIG5hdGl2by4gKi9cbiAgICByZWFkb25seSBuYW1lID0gaW5wdXQ8c3RyaW5nPigpO1xuXG4gICAgLyoqIFRleHRvIGV4aWJpZG8gcXVhbmRvIG5lbmh1bSB2YWxvciBlc3TDoSBzZWxlY2lvbmFkby4gKi9cbiAgICByZWFkb25seSBwbGFjZWhvbGRlciA9IGlucHV0PHN0cmluZz4oKTtcblxuICAgIC8qKlxuICAgICAqIE1vZG8gZGUgc2VsZcOnw6NvIGRvIGNvbXBvbmVudGUuXG4gICAgICogLSBgJ2RhdGUnYCDigJQgc2VsZcOnw6NvIGRlIGRhdGEgw7puaWNhIChwYWRyw6NvKVxuICAgICAqIC0gYCdtb250aCdgIOKAlCBzZWxlw6fDo28gZGUgbcOqcy9hbm9cbiAgICAgKiAtIGAnZGF0ZXRpbWUnYCDigJQgZGF0YSBjb20gaG9yYSAocmVxdWVyIGNvbmZpcm1hw6fDo28pXG4gICAgICogLSBgJ3RpbWUnYCDigJQgYXBlbmFzIHNlbGXDp8OjbyBkZSBob3JhXG4gICAgICogLSBgJ3JhbmdlJ2Ag4oCUIGludGVydmFsbyBlbnRyZSBkdWFzIGRhdGFzXG4gICAgICovXG4gICAgcmVhZG9ubHkgbW9kZSA9IGlucHV0PERhdGVQaWNrZXJNb2RlPignZGF0ZScpO1xuXG4gICAgLyoqXG4gICAgICogTW9kbyBkZSBzZWxlw6fDo28gcXVhbmRvIGBtb2RlYCDDqSBgJ2RhdGUnYC5cbiAgICAgKiAtIGAnc2luZ2xlJ2Ag4oCUIHNlbGXDp8OjbyBkZSB1bWEgw7puaWNhIGRhdGEgKHBhZHLDo28pXG4gICAgICogLSBgJ211bHRpcGxlJ2Ag4oCUIHNlbGXDp8OjbyBkZSBtw7psdGlwbGFzIGRhdGFzIGF2dWxzYXNcbiAgICAgKi9cbiAgICByZWFkb25seSBzZWxlY3Rpb25Nb2RlID0gaW5wdXQ8J3NpbmdsZScgfCAnbXVsdGlwbGUnPignc2luZ2xlJyk7XG5cbiAgICAvKiogU2VwYXJhZG9yIGV4aWJpZG8gZW50cmUgYXMgZGF0YXMgbm8gbW9kbyBgc2VsZWN0aW9uTW9kZSA9ICdtdWx0aXBsZSdgLiAqL1xuICAgIHJlYWRvbmx5IG11bHRpcGxlU2VwYXJhdG9yID0gaW5wdXQ8c3RyaW5nPignLCAnKTtcblxuICAgIC8qKiBRdWFuZG8gYHRydWVgLCBleGliZSBvIGJvdMOjbyBkZSDDrWNvbmUgYW8gbGFkbyBkbyBjYW1wby4gKi9cbiAgICByZWFkb25seSBzaG93SWNvbiA9IGlucHV0PGJvb2xlYW4+KHRydWUpO1xuXG4gICAgLyoqXG4gICAgICogQ2xhc3NlIGRvIMOtY29uZSBleGliaWRvIG5vIGJvdMOjbyBkbyBjYW1wby5cbiAgICAgKiBRdWFuZG8gYG1vZGVgIMOpIGAndGltZSdgLCBvIHBhZHLDo28gbXVkYSBhdXRvbWF0aWNhbWVudGUgcGFyYSBgJ2ZhcyBmYS1jbG9jaydgLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGljb24gPSBpbnB1dDxzdHJpbmc+KCdmYXMgZmEtY2FsZW5kYXInKTtcblxuICAgIC8qKiBEYXRhIG3DrW5pbWEgc2VsZWNpb27DoXZlbC4gRGlhcy9tZXNlcyBhbnRlcmlvcmVzIGZpY2FtIGRlc2FiaWxpdGFkb3MuICovXG4gICAgcmVhZG9ubHkgbWluID0gaW5wdXQ8RGF0ZSB8IG51bGw+KG51bGwpO1xuXG4gICAgLyoqIERhdGEgbcOheGltYSBzZWxlY2lvbsOhdmVsLiBEaWFzL21lc2VzIHBvc3RlcmlvcmVzIGZpY2FtIGRlc2FiaWxpdGFkb3MuICovXG4gICAgcmVhZG9ubHkgbWF4ID0gaW5wdXQ8RGF0ZSB8IG51bGw+KG51bGwpO1xuXG4gICAgLyoqIERhdGEgZXhpYmlkYSBhbyBhYnJpciBvIGNhbGVuZMOhcmlvIHF1YW5kbyBuZW5odW1hIGRhdGEgZXN0w6Egc2VsZWNpb25hZGEuICovXG4gICAgcmVhZG9ubHkgZGVmYXVsdERhdGUgPSBpbnB1dDxEYXRlIHwgbnVsbD4obnVsbCk7XG5cbiAgICAvKipcbiAgICAgKiBGb3JtYXRvIGRlIGV4aWJpw6fDo28gZGEgZGF0YSBubyBjYW1wby4gUXVhbmRvIG9taXRpZG8sIMOpIHJlc29sdmlkbyBhIHBhcnRpciBkb1xuICAgICAqIGxvY2FsZSBhdGl2byAoY2hhdmUgYHBsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlX2Zvcm1hdGApLCBjb20gZmFsbGJhY2sgcGFyYSBgZGQvTU0veXl5eWAuXG4gICAgICovXG4gICAgcmVhZG9ubHkgZGF0ZUZvcm1hdCA9IGlucHV0PHN0cmluZyB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcblxuICAgIC8qKlxuICAgICAqIEZvcm1hdG8gZGUgZXhpYmnDp8OjbyBkYXMgaG9yYXM6IGAnMTInYCBvdSBgJzI0J2AuIFF1YW5kbyBvbWl0aWRvLCDDqSByZXNvbHZpZG8gYSBwYXJ0aXJcbiAgICAgKiBkbyBsb2NhbGUgYXRpdm8gKGNoYXZlIGBwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuaG91cl9mb3JtYXRgKSwgY29tIGZhbGxiYWNrIHBhcmEgYCcyNCdgLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGhvdXJGb3JtYXQgPSBpbnB1dDwnMTInIHwgJzI0JyB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcblxuICAgIC8qKiBJbmNyZW1lbnRvIGVtIG1pbnV0b3MgYW8gdXNhciBhcyBzZXRhcyBkbyB0aW1lIHBpY2tlci4gKi9cbiAgICByZWFkb25seSBtaW51dGVTdGVwID0gaW5wdXQ8bnVtYmVyPihEYXRlcGlja2VyQ29tcG9uZW50LkRFRkFVTFRfTUlOVVRFX1NURVApO1xuXG4gICAgLyoqIFF1YW5kbyBgdHJ1ZWAsIGV4aWJlIG8gY2FtcG8gZGUgc2VndW5kb3Mgbm8gdGltZSBwaWNrZXIuICovXG4gICAgcmVhZG9ubHkgc2hvd1NlY29uZHMgPSBpbnB1dDxib29sZWFuPihmYWxzZSk7XG5cbiAgICAvKiogU2VwYXJhZG9yIGV4aWJpZG8gZW50cmUgYXMgZGF0YXMgbm8gbW9kbyBgJ3JhbmdlJ2AuICovXG4gICAgcmVhZG9ubHkgcmFuZ2VTZXBhcmF0b3IgPSBpbnB1dDxzdHJpbmc+KCcg4oCUICcpO1xuXG4gICAgLyoqIEFicmUgbyBwYWluZWwgYW8gZm9jYXIgbyBpbnB1dDsgZm9jbyBwZXJtYW5lY2Ugbm8gaW5wdXQsIG7Do28gcHVsYSBwYXJhIG8gZHJvcGRvd24uICovXG4gICAgcmVhZG9ubHkgc2hvd09uRm9jdXMgPSBpbnB1dDxib29sZWFuPih0cnVlKTtcblxuICAgIC8qKiBJbXBlZGUgZGlnaXRhw6fDo28gbWFudWFsOyB2YWxvciBzw7MgcG9kZSBzZXIgc2VsZWNpb25hZG8gcGVsbyBjYWxlbmTDoXJpby4gKi9cbiAgICByZWFkb25seSByZWFkb25seUlucHV0ID0gaW5wdXQ8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gICAgLyoqIFByaW1laXJvIGRpYSBkYSBzZW1hbmEgKDAgPSBkb21pbmdvLCAxID0gc2VndW5kYS1mZWlyYSwgLi4uLCA2ID0gc8OhYmFkbykuICovXG4gICAgcmVhZG9ubHkgZmlyc3REYXlPZldlZWsgPSBpbnB1dDxudW1iZXI+KDApO1xuXG4gICAgLyoqIEV4aWJlL29jdWx0YSBhIGJhcnJhIGRlIGJvdMO1ZXMgSG9qZSBlIExpbXBhciBubyByb2RhcMOpLiAqL1xuICAgIHJlYWRvbmx5IHNob3dCdXR0b25CYXIgPSBpbnB1dDxib29sZWFuPih0cnVlKTtcblxuICAgIC8qKiBFeGliZSDDrWNvbmUgZGUgbGltcGFyIGlubGluZSBubyBjYW1wbyBkZSBpbnB1dC4gKi9cbiAgICByZWFkb25seSBzaG93Q2xlYXIgPSBpbnB1dDxib29sZWFuPihmYWxzZSk7XG5cbiAgICAvKiogRXhpYmUgZGlhcyBkZSBtZXNlcyBhZGphY2VudGVzIG5hIGdyYWRlIGRvIGNhbGVuZMOhcmlvLiAqL1xuICAgIHJlYWRvbmx5IHNob3dPdGhlck1vbnRocyA9IGlucHV0PGJvb2xlYW4+KHRydWUpO1xuXG4gICAgLyoqIFBlcm1pdGUgc2VsZWNpb25hciBkaWFzIGRlIG1lc2VzIGFkamFjZW50ZXMgbmEgZ3JhZGUgZG8gY2FsZW5kw6FyaW8uICovXG4gICAgcmVhZG9ubHkgc2VsZWN0T3RoZXJNb250aHMgPSBpbnB1dDxib29sZWFuPihmYWxzZSk7XG5cbiAgICAvKiogRmVjaGEgbyBwYWluZWwgYXDDs3Mgc2VsZWNpb25hciB1bWEgZGF0YSBubyBtb2RvIGBkYXRldGltZWAuICovXG4gICAgcmVhZG9ubHkgaGlkZU9uRGF0ZVRpbWVTZWxlY3QgPSBpbnB1dDxib29sZWFuPihmYWxzZSk7XG5cbiAgICAvKiogSW5jcmVtZW50byBkZSBob3JhcyBubyB0aW1lIHBpY2tlci4gKi9cbiAgICByZWFkb25seSBzdGVwSG91ciA9IGlucHV0PG51bWJlcj4oMSk7XG5cbiAgICAvKiogSW5jcmVtZW50byBkZSBzZWd1bmRvcyBubyB0aW1lIHBpY2tlci4gKi9cbiAgICByZWFkb25seSBzdGVwU2Vjb25kID0gaW5wdXQ8bnVtYmVyPigxKTtcblxuICAgIC8qKiDDjW5kaWNlIGRlIHRhYiBkbyBjYW1wbyBkZSBpbnB1dC4gKi9cbiAgICByZWFkb25seSB0YWJpbmRleCA9IGlucHV0PG51bWJlcj4oKTtcblxuICAgIC8qKiBGb2NhIGF1dG9tYXRpY2FtZW50ZSBvIGNhbXBvIGFvIGNhcnJlZ2FyIG8gY29tcG9uZW50ZS4gKi9cbiAgICByZWFkb25seSBhdXRvZm9jdXMgPSBpbnB1dDxib29sZWFuPihmYWxzZSk7XG5cbiAgICAvKiogRGF0YXMgZXNwZWPDrWZpY2FzIGRlc2FiaWxpdGFkYXMgbm8gY2FsZW5kw6FyaW8uICovXG4gICAgcmVhZG9ubHkgZGlzYWJsZWREYXRlcyA9IGlucHV0PERhdGVbXT4oW10pO1xuXG4gICAgLyoqIERpYXMgZGEgc2VtYW5hIGRlc2FiaWxpdGFkb3MgKDAgPSBkb21pbmdvLCAuLi4sIDYgPSBzw6FiYWRvKS4gKi9cbiAgICByZWFkb25seSBkaXNhYmxlZERheXMgPSBpbnB1dDxudW1iZXJbXT4oW10pO1xuXG4gICAgLy8g4pSA4pSAIFR3by13YXkgbW9kZWxzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gICAgLyoqIEVzdGFkbyBkZXNhYmlsaXRhZG8gZG8gY29tcG9uZW50ZS4gKi9cbiAgICByZWFkb25seSBkaXNhYmxlZCA9IG1vZGVsPGJvb2xlYW4+KGZhbHNlKTtcblxuICAgIC8vIOKUgOKUgCBPdXRwdXRzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gICAgLyoqIEVtaXRpZG8gcXVhbmRvIG8gY2FtcG8gcGVyZGUgbyBmb2NvLiAqL1xuICAgIHJlYWRvbmx5IGJsdXJyZWQgPSBvdXRwdXQ8RXZlbnQ+KCk7XG5cbiAgICAvKiogRW1pdGlkbyBxdWFuZG8gbyBjYW1wbyByZWNlYmUgbyBmb2NvLiAqL1xuICAgIHJlYWRvbmx5IGZvY3VzZWQgPSBvdXRwdXQ8RXZlbnQ+KCk7XG5cbiAgICAvKiogRW1pdGlkbyBhbyBzZWxlY2lvbmFyIHVtYSBkYXRhLCBtw6pzLCBob3LDoXJpbyBvdSBpbnRlcnZhbG8uICovXG4gICAgcmVhZG9ubHkgc2VsZWN0ZWQgPSBvdXRwdXQ8RGF0ZXBpY2tlclZhbHVlPigpO1xuXG4gICAgLyoqIEVtaXRpZG8gcXVhbmRvIG8gcGFpbmVsIGRvIGNhbGVuZMOhcmlvIGZlY2hhLiBFbWl0ZSBvIGVsZW1lbnRvIGRvIHBhaW5lbC4gKi9cbiAgICByZWFkb25seSBjbG9zZWQgPSBvdXRwdXQ8SFRNTEVsZW1lbnQ+KCk7XG5cbiAgICAvKiogRW1pdGlkbyBhbyBjbGljYXIgbm8gYm90w6NvIFwiSG9qZVwiLiAqL1xuICAgIHJlYWRvbmx5IHRvZGF5Q2xpY2sgPSBvdXRwdXQ8RGF0ZT4oKTtcblxuICAgIC8qKiBFbWl0aWRvIGFvIGNsaWNhciBubyBib3TDo28gXCJMaW1wYXJcIiBvdSBubyDDrWNvbmUgZGUgbGltcGFyIGlubGluZS4gKi9cbiAgICByZWFkb25seSBjbGVhckNsaWNrID0gb3V0cHV0PE1vdXNlRXZlbnQ+KCk7XG5cbiAgICAvKiogRW1pdGlkbyBxdWFuZG8gbyBtw6pzIHZpc3VhbGl6YWRvIG11ZGEuICovXG4gICAgcmVhZG9ubHkgbW9udGhDaGFuZ2UgPSBvdXRwdXQ8eyBtb250aDogbnVtYmVyOyB5ZWFyOiBudW1iZXIgfT4oKTtcblxuICAgIC8qKiBFbWl0aWRvIHF1YW5kbyBvIGFubyB2aXN1YWxpemFkbyBtdWRhLiAqL1xuICAgIHJlYWRvbmx5IHllYXJDaGFuZ2UgPSBvdXRwdXQ8eyBtb250aDogbnVtYmVyOyB5ZWFyOiBudW1iZXIgfT4oKTtcblxuICAgIC8qKiBFbWl0aWRvIHF1YW5kbyBvIHBhaW5lbCBkbyBjYWxlbmTDoXJpbyBhYnJlLiAqL1xuICAgIHJlYWRvbmx5IHNob3cgPSBvdXRwdXQ8dm9pZD4oKTtcblxuICAgIC8qKiBFbWl0aWRvIHF1YW5kbyBvIHVzdcOhcmlvIGRpZ2l0YSBtYW51YWxtZW50ZSBubyBjYW1wby4gKi9cbiAgICByZWFkb25seSB2YWx1ZUlucHV0ID0gb3V0cHV0PEV2ZW50PigpO1xuXG4gICAgLy8g4pSA4pSAIEludGVybmFsIHN0YXRlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IG1heEhvdXJzID0gRGF0ZXBpY2tlckNvbXBvbmVudC5NQVhfSE9VUlM7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IG1heE1pbnV0ZXMgPSBEYXRlcGlja2VyQ29tcG9uZW50Lk1BWF9NSU5VVEVTO1xuICAgIHByb3RlY3RlZCByZWFkb25seSB0aW1lSW5wdXRNYXhMZW5ndGggPSAyO1xuXG4gICAgcHJvdGVjdGVkIGlucHV0RGF0ZSA9ICcnO1xuXG4gICAgcHJvdGVjdGVkIG5nQ29udHJvbDogTmdDb250cm9sIHwgbnVsbCA9IG51bGw7XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgdmFsdWUgPSBzaWduYWw8RGF0ZSB8IG51bGw+KG51bGwpO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBpc09wZW4gPSBzaWduYWwoZmFsc2UpO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBpc0ZvY3VzZWQgPSBzaWduYWwoZmFsc2UpO1xuICAgIHByb3RlY3RlZCByZWFkb25seSB2aWV3RGF0ZSA9IHNpZ25hbChuZXcgRGF0ZSgpKTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgcGlja2VyVmlldyA9IHNpZ25hbDxQaWNrZXJWaWV3PignY2FsZW5kYXInKTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgaG91cnMgPSBzaWduYWwoMCk7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IG1pbnV0ZXMgPSBzaWduYWwoMCk7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHNlY29uZHMgPSBzaWduYWwoMCk7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHJhbmdlVmFsdWUgPSBzaWduYWw8RGF0ZVJhbmdlIHwgbnVsbD4obnVsbCk7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IG11bHRpcGxlVmFsdWVzID0gc2lnbmFsPERhdGVbXT4oW10pO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBwZW5kaW5nUmFuZ2VTdGFydCA9IHNpZ25hbDxEYXRlIHwgbnVsbD4obnVsbCk7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGhvdmVyRGF0ZSA9IHNpZ25hbDxEYXRlIHwgbnVsbD4obnVsbCk7XG4gICAgcHJpdmF0ZSBfaGFzRm9ybWF0RXJyb3IgPSBmYWxzZTtcbiAgICBwcml2YXRlIG9uVmFsaWRhdG9yQ2hhbmdlOiAoKSA9PiB2b2lkID0gKCkgPT4ge307XG4gICAgcHJpdmF0ZSBfb25DaGFuZ2U6ICh2YWx1ZTogRGF0ZXBpY2tlclZhbHVlKSA9PiB2b2lkID0gKCkgPT4ge307XG4gICAgcHJpdmF0ZSBfb25Ub3VjaGVkOiAoKSA9PiB2b2lkID0gKCkgPT4ge307XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IHBvcHVwUGFuZWwgPSB2aWV3Q2hpbGQoJ3BvcHVwUGFuZWwnLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBpbmNyZWFzZUhvdXJCdXR0b24gPSB2aWV3Q2hpbGQoJ2luY3JlYXNlSG91ckJ1dHRvbicsIHsgcmVhZDogRWxlbWVudFJlZiB9KTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGljb25CdXR0b24gPSB2aWV3Q2hpbGQoJ2ljb25CdXR0b24nLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSk7XG4gICAgcHJpdmF0ZSByZWFkb25seSB0cmlnZ2VySW5wdXQgPSB2aWV3Q2hpbGQucmVxdWlyZWQoJ3RyaWdnZXJJbnB1dCcsIHsgcmVhZDogRWxlbWVudFJlZiB9KTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGluamVjdG9yID0gaW5qZWN0KEluamVjdG9yKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGhvc3RFbGVtZW50ID0gaW5qZWN0KEVsZW1lbnRSZWYpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgdHJhbnNsYXRlU2VydmljZSA9IGluamVjdChUcmFuc2xhdGVTZXJ2aWNlKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IGN1cnJlbnRMYW5nID0gc2lnbmFsKHRoaXMudHJhbnNsYXRlU2VydmljZS5jdXJyZW50TGFuZyk7XG5cbiAgICAvKiogUmVmbGV0ZSBgKHBvaW50ZXI6IGNvYXJzZSlgIOKAlCBkaXNwb3NpdGl2b3MgdG91Y2ggcHJlZmVyZW0gbyBwb3B1cCBkbyBjYWxlbmTDoXJpbyBhbyB0ZWNsYWRvLiAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSBpc1RvdWNoRGV2aWNlID0gc2lnbmFsKFxuICAgICAgICB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygd2luZG93Lm1hdGNoTWVkaWEgPT09ICdmdW5jdGlvbidcbiAgICAgICAgICAgID8gd2luZG93Lm1hdGNoTWVkaWEoJyhwb2ludGVyOiBjb2Fyc2UpJykubWF0Y2hlc1xuICAgICAgICAgICAgOiBmYWxzZSxcbiAgICApO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBzZWdtZW50RW5naW5lID0gbmV3IERhdGVTZWdtZW50RW5naW5lKCk7XG4gICAgcHJpdmF0ZSBsYXN0U2VnbWVudENvbmZpZzogU2VnbWVudEVuZ2luZUNvbmZpZyB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgbWVhc3VyZUNhbnZhcz86IEhUTUxDYW52YXNFbGVtZW50O1xuICAgIC8qKiBJbmNyZW1lbnRhZG8gYSBjYWRhIG11dGHDp8OjbyBkbyB1c3XDoXJpbyDigJQgaW52YWxpZGEgY2FsbGJhY2tzIGRlIGNsaXF1ZS9mb2NvIGFkaWFkb3MgcXVlIGZpY2FyYW0gb2Jzb2xldG9zLiAqL1xuICAgIHByaXZhdGUgaW50ZXJhY3Rpb25HZW5lcmF0aW9uID0gMDtcbiAgICAvKiogYHRpbWVTdGFtcGAgZG8gw7psdGltbyBtb3VzZWRvd24gbm8gaW5wdXQgc2VnbWVudGFkbyDigJQgdXNhZG8gcHJhIGRldGVjdGFyIGR1cGxvIGNsaXF1ZSBuYSBtw6NvLiAqL1xuICAgIHByaXZhdGUgbGFzdE1vdXNlRG93bkF0ID0gMDtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2Uub25MYW5nQ2hhbmdlLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpLnN1YnNjcmliZSgoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudExhbmcuc2V0KGV2ZW50LmxhbmcpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHdpbmRvdy5tYXRjaE1lZGlhID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjb25zdCBtZWRpYVF1ZXJ5ID0gd2luZG93Lm1hdGNoTWVkaWEoJyhwb2ludGVyOiBjb2Fyc2UpJyk7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGVQb2ludGVyQ2hhbmdlID0gKGV2ZW50OiBNZWRpYVF1ZXJ5TGlzdEV2ZW50KTogdm9pZCA9PiB0aGlzLmlzVG91Y2hEZXZpY2Uuc2V0KGV2ZW50Lm1hdGNoZXMpO1xuICAgICAgICAgICAgbWVkaWFRdWVyeS5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBoYW5kbGVQb2ludGVyQ2hhbmdlKTtcbiAgICAgICAgICAgIHRoaXMuZGVzdHJveVJlZi5vbkRlc3Ryb3koKCkgPT4gbWVkaWFRdWVyeS5yZW1vdmVFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBoYW5kbGVQb2ludGVyQ2hhbmdlKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyDilIDilIAgQ29tcHV0ZWQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgcmVzb2x2ZWRJY29uID0gY29tcHV0ZWQoKCkgPT4gKHRoaXMubW9kZSgpID09PSAndGltZScgPyAnZmFzIGZhLWNsb2NrJyA6IHRoaXMuaWNvbigpKSk7XG5cbiAgICAvKiogYGRhdGVGb3JtYXRgIGV4cGzDrWNpdG8gb3UgcmVzb2x2aWRvIGEgcGFydGlyIGRvIGxvY2FsZSBhdGl2byAoZmFsbGJhY2sgYGRkL01NL3l5eXlgKS4gKi9cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgcmVzb2x2ZWREYXRlRm9ybWF0ID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICB0aGlzLmN1cnJlbnRMYW5nKCk7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICB0aGlzLmRhdGVGb3JtYXQoKSA/P1xuICAgICAgICAgICAgdGhpcy5yZXNvbHZlVHJhbnNsYXRlZE9yRGVmYXVsdCgncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVfZm9ybWF0JywgJ2RkL01NL3l5eXknKVxuICAgICAgICApO1xuICAgIH0pO1xuXG4gICAgLyoqIGBob3VyRm9ybWF0YCBleHBsw61jaXRvIG91IHJlc29sdmlkbyBhIHBhcnRpciBkbyBsb2NhbGUgYXRpdm8gKGZhbGxiYWNrIGAnMjQnYCkuICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHJlc29sdmVkSG91ckZvcm1hdCA9IGNvbXB1dGVkPCcxMicgfCAnMjQnPigoKSA9PiB7XG4gICAgICAgIHRoaXMuY3VycmVudExhbmcoKTtcbiAgICAgICAgY29uc3QgZXhwbGljaXQgPSB0aGlzLmhvdXJGb3JtYXQoKTtcbiAgICAgICAgaWYgKGV4cGxpY2l0KSByZXR1cm4gZXhwbGljaXQ7XG4gICAgICAgIGNvbnN0IHRyYW5zbGF0ZWQgPSB0aGlzLnJlc29sdmVUcmFuc2xhdGVkT3JEZWZhdWx0KCdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuaG91cl9mb3JtYXQnLCAnMjQnKTtcbiAgICAgICAgcmV0dXJuIHRyYW5zbGF0ZWQgPT09ICcxMicgPyAnMTInIDogJzI0JztcbiAgICB9KTtcblxuICAgIC8qKiBNb2RvcyBjdWpvIGZvcm1hdG8gZGUgZXhpYmnDp8OjbyDDqSByZXNvbHZpZG8gcGVsYSBlbmdpbmUgZGUgc2VnbWVudG9zIChpbmRlcGVuZGVudGUgZGUgdG91Y2gvcmVhZG9ubHkpLiAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSBpc1NlZ21lbnRNb2RlQ2FuZGlkYXRlID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5pc011bHRpcGxlTW9kZSgpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGNvbnN0IG1vZGUgPSB0aGlzLm1vZGUoKTtcbiAgICAgICAgcmV0dXJuIG1vZGUgPT09ICdkYXRlJyB8fCBtb2RlID09PSAnbW9udGgnIHx8IG1vZGUgPT09ICd0aW1lJyB8fCBtb2RlID09PSAnZGF0ZXRpbWUnO1xuICAgIH0pO1xuXG4gICAgLyoqIEludGVyYXRpdmlkYWRlIGRlIGRpZ2l0YcOnw6NvIHBvciBzZWdtZW50byDigJQgZGVzbGlnYWRhIGVtIHRvdWNoIG91IHF1YW5kbyBgcmVhZG9ubHlJbnB1dGAgw6kgdXNhZG8uICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGlzU2VnbWVudGVkTW9kZSA9IGNvbXB1dGVkKFxuICAgICAgICAoKSA9PiB0aGlzLmlzU2VnbWVudE1vZGVDYW5kaWRhdGUoKSAmJiAhdGhpcy5pc1RvdWNoRGV2aWNlKCkgJiYgIXRoaXMucmVhZG9ubHlJbnB1dCgpLFxuICAgICk7XG5cbiAgICAvKiogSW5kaWNhIHNlIG8gdGltZSBwaWNrZXIgZGV2ZSB1c2FyIG8gZm9ybWF0byBkZSAxMiBob3JhcyBjb20gc2VsZXRvciBBTS9QTS4gKi9cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgaXMxMkhvdXJGb3JtYXQgPSBjb21wdXRlZCgoKSA9PiB0aGlzLnJlc29sdmVkSG91ckZvcm1hdCgpID09PSAnMTInKTtcblxuICAgIC8qKiBIb3JhIGV4aWJpZGEgbm8gdGltZSBwaWNrZXI6IDHigJMxMiBubyBmb3JtYXRvIDEyaCwgMOKAkzIzIG5vIGZvcm1hdG8gMjRoLiAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSBkaXNwbGF5SG91cnMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5pczEySG91ckZvcm1hdCgpKSByZXR1cm4gdGhpcy5ob3VycygpO1xuICAgICAgICBjb25zdCBoMTIgPSB0aGlzLmhvdXJzKCkgJSBEYXRlcGlja2VyQ29tcG9uZW50LkhPVVJTX1BFUl9NRVJJRElFTTtcbiAgICAgICAgcmV0dXJuIGgxMiA9PT0gMCA/IERhdGVwaWNrZXJDb21wb25lbnQuSE9VUlNfUEVSX01FUklESUVNIDogaDEyO1xuICAgIH0pO1xuXG4gICAgLyoqIE1lcmlkaWFubyBhdHVhbCBkZXJpdmFkbyBkYSBob3JhIGludGVybmEgKDDigJMyMykuICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGFtUG0gPSBjb21wdXRlZDwnQU0nIHwgJ1BNJz4oKCkgPT5cbiAgICAgICAgdGhpcy5ob3VycygpIDwgRGF0ZXBpY2tlckNvbXBvbmVudC5IT1VSU19QRVJfTUVSSURJRU0gPyAnQU0nIDogJ1BNJyxcbiAgICApO1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHBvc2l0aW9uczogQ29ubmVjdGVkUG9zaXRpb25bXSA9IFtcbiAgICAgICAgeyBvcmlnaW5YOiAnc3RhcnQnLCBvcmlnaW5ZOiAnYm90dG9tJywgb3ZlcmxheVg6ICdzdGFydCcsIG92ZXJsYXlZOiAndG9wJywgb2Zmc2V0WTogNCB9LFxuICAgICAgICB7IG9yaWdpblg6ICdzdGFydCcsIG9yaWdpblk6ICd0b3AnLCBvdmVybGF5WDogJ3N0YXJ0Jywgb3ZlcmxheVk6ICdib3R0b20nLCBvZmZzZXRZOiAtNCB9LFxuICAgIF07XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgcG9wdXBJZCA9IGNvbXB1dGVkKCgpID0+IGAke3RoaXMuaW5wdXRJZCgpfS1wb3B1cGApO1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGN1cnJlbnRNb250aEluZGV4ID0gY29tcHV0ZWQoKCkgPT4gdGhpcy52aWV3RGF0ZSgpLmdldE1vbnRoKCkpO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBjdXJyZW50WWVhciA9IGNvbXB1dGVkKCgpID0+IHRoaXMudmlld0RhdGUoKS5nZXRGdWxsWWVhcigpKTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgY3VycmVudE1vbnRoS2V5ID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5tb250aEtleXNbdGhpcy5jdXJyZW50TW9udGhJbmRleCgpXSk7XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2hvd0NhbGVuZGFyID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5tb2RlKCkgIT09ICd0aW1lJyk7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHNob3dUaW1lUGlja2VyID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5tb2RlKCkgPT09ICdkYXRldGltZScgfHwgdGhpcy5tb2RlKCkgPT09ICd0aW1lJyk7XG5cbiAgICAvKiogU2VsZcOnw6NvIG3Dumx0aXBsYSBhdGl2YTogYXBlbmFzIG5vIG1vZG8gYGRhdGVgIGNvbSBgc2VsZWN0aW9uTW9kZSA9ICdtdWx0aXBsZSdgLiAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSBpc011bHRpcGxlTW9kZSA9IGNvbXB1dGVkKCgpID0+IHRoaXMuc2VsZWN0aW9uTW9kZSgpID09PSAnbXVsdGlwbGUnICYmIHRoaXMubW9kZSgpID09PSAnZGF0ZScpO1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IG9yZGVyZWRXZWVrRGF5S2V5cyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSB0aGlzLmZpcnN0RGF5T2ZXZWVrKCk7XG4gICAgICAgIHJldHVybiBbLi4udGhpcy53ZWVrRGF5S2V5cy5zbGljZShzdGFydCksIC4uLnRoaXMud2Vla0RheUtleXMuc2xpY2UoMCwgc3RhcnQpXTtcbiAgICB9KTtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSBkaWFsb2dBcmlhTGFiZWxLZXkgPSBjb21wdXRlZCgoKSA9PlxuICAgICAgICB0aGlzLm1vZGUoKSA9PT0gJ3JhbmdlJ1xuICAgICAgICAgICAgPyAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfc2VsZWN0X3JhbmdlJ1xuICAgICAgICAgICAgOiAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfc2VsZWN0X2RhdGUnLFxuICAgICk7XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgcGxhY2Vob2xkZXJLZXkgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IG1vZGUgPSB0aGlzLm1vZGUoKTtcbiAgICAgICAgcmV0dXJuIGBwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9wbGFjZWhvbGRlcl8ke21vZGV9YDtcbiAgICB9KTtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSBlZmZlY3RpdmVSYW5nZSA9IGNvbXB1dGVkKCgpOiB7IHN0YXJ0OiBEYXRlIHwgbnVsbDsgZW5kOiBEYXRlIHwgbnVsbCB9ID0+IHtcbiAgICAgICAgY29uc3QgcGVuZGluZyA9IHRoaXMucGVuZGluZ1JhbmdlU3RhcnQoKTtcbiAgICAgICAgY29uc3QgaG92ZXIgPSB0aGlzLmhvdmVyRGF0ZSgpO1xuICAgICAgICBpZiAocGVuZGluZykge1xuICAgICAgICAgICAgaWYgKGhvdmVyKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgW3N0YXJ0LCBlbmRdID0gcGVuZGluZy5nZXRUaW1lKCkgPD0gaG92ZXIuZ2V0VGltZSgpID8gW3BlbmRpbmcsIGhvdmVyXSA6IFtob3ZlciwgcGVuZGluZ107XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgc3RhcnQsIGVuZCB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHsgc3RhcnQ6IHBlbmRpbmcsIGVuZDogbnVsbCB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnJhbmdlVmFsdWUoKSA/PyB7IHN0YXJ0OiBudWxsLCBlbmQ6IG51bGwgfTtcbiAgICB9KTtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSBjYWxlbmRhcldlZWtzID0gY29tcHV0ZWQoKCk6IENhbGVuZGFyRGF5W11bXSA9PiB7XG4gICAgICAgIGNvbnN0IHllYXIgPSB0aGlzLmN1cnJlbnRZZWFyKCk7XG4gICAgICAgIGNvbnN0IG1vbnRoID0gdGhpcy5jdXJyZW50TW9udGhJbmRleCgpO1xuICAgICAgICBjb25zdCB0b2RheSA9IG5ldyBEYXRlKCk7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkID0gdGhpcy52YWx1ZSgpO1xuICAgICAgICBjb25zdCByYW5nZSA9IHRoaXMuZWZmZWN0aXZlUmFuZ2UoKTtcbiAgICAgICAgY29uc3QgcmFuZ2VTdGFydFRpbWUgPSByYW5nZS5zdGFydCA/IHN0cmlwVGltZShyYW5nZS5zdGFydCkgOiBudWxsO1xuICAgICAgICBjb25zdCByYW5nZUVuZFRpbWUgPSByYW5nZS5lbmQgPyBzdHJpcFRpbWUocmFuZ2UuZW5kKSA6IG51bGw7XG5cbiAgICAgICAgY29uc3QgZmlyc3REYXlPZk1vbnRoID0gbmV3IERhdGUoeWVhciwgbW9udGgsIDEpO1xuICAgICAgICBjb25zdCBzdGFydFdlZWtEYXkgPSBmaXJzdERheU9mTW9udGguZ2V0RGF5KCk7XG4gICAgICAgIGNvbnN0IGFkanVzdGVkU3RhcnREYXkgPSAoc3RhcnRXZWVrRGF5IC0gdGhpcy5maXJzdERheU9mV2VlaygpICsgNykgJSA3O1xuICAgICAgICBjb25zdCBkYXlzSW5Nb250aCA9IG5ldyBEYXRlKHllYXIsIG1vbnRoICsgMSwgMCkuZ2V0RGF0ZSgpO1xuICAgICAgICBjb25zdCBkYXlzSW5QcmV2TW9udGggPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCwgMCkuZ2V0RGF0ZSgpO1xuXG4gICAgICAgIGNvbnN0IGFsbERheXM6IENhbGVuZGFyRGF5W10gPSBbXTtcblxuICAgICAgICBmb3IgKGxldCBpID0gYWRqdXN0ZWRTdGFydERheSAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoeWVhciwgbW9udGggLSAxLCBkYXlzSW5QcmV2TW9udGggLSBpKTtcbiAgICAgICAgICAgIGFsbERheXMucHVzaCh0aGlzLmJ1aWxkQ2FsZW5kYXJEYXkoZGF0ZSwgZmFsc2UsIHRvZGF5LCBzZWxlY3RlZCwgcmFuZ2UsIHJhbmdlU3RhcnRUaW1lLCByYW5nZUVuZFRpbWUpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGQgPSAxOyBkIDw9IGRheXNJbk1vbnRoOyBkKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCwgZCk7XG4gICAgICAgICAgICBhbGxEYXlzLnB1c2godGhpcy5idWlsZENhbGVuZGFyRGF5KGRhdGUsIHRydWUsIHRvZGF5LCBzZWxlY3RlZCwgcmFuZ2UsIHJhbmdlU3RhcnRUaW1lLCByYW5nZUVuZFRpbWUpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRvdGFsQ2VsbHMgPVxuICAgICAgICAgICAgTWF0aC5jZWlsKGFsbERheXMubGVuZ3RoIC8gRGF0ZXBpY2tlckNvbXBvbmVudC5EQVlTX0lOX1dFRUspICogRGF0ZXBpY2tlckNvbXBvbmVudC5EQVlTX0lOX1dFRUs7XG4gICAgICAgIGxldCBuZXh0RGF5ID0gMTtcbiAgICAgICAgd2hpbGUgKGFsbERheXMubGVuZ3RoIDwgdG90YWxDZWxscykge1xuICAgICAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHllYXIsIG1vbnRoICsgMSwgbmV4dERheSk7XG4gICAgICAgICAgICBuZXh0RGF5Kys7XG4gICAgICAgICAgICBhbGxEYXlzLnB1c2godGhpcy5idWlsZENhbGVuZGFyRGF5KGRhdGUsIGZhbHNlLCB0b2RheSwgc2VsZWN0ZWQsIHJhbmdlLCByYW5nZVN0YXJ0VGltZSwgcmFuZ2VFbmRUaW1lKSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB3ZWVrczogQ2FsZW5kYXJEYXlbXVtdID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYWxsRGF5cy5sZW5ndGg7IGkgKz0gRGF0ZXBpY2tlckNvbXBvbmVudC5EQVlTX0lOX1dFRUspIHtcbiAgICAgICAgICAgIHdlZWtzLnB1c2goYWxsRGF5cy5zbGljZShpLCBpICsgRGF0ZXBpY2tlckNvbXBvbmVudC5EQVlTX0lOX1dFRUspKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd2Vla3M7XG4gICAgfSk7XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgbW9udGhzR3JpZCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgY29uc3Qgcm93czogeyBrZXk6IHN0cmluZzsgaW5kZXg6IG51bWJlciB9W11bXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IERhdGVwaWNrZXJDb21wb25lbnQuTU9OVEhTX0lOX1lFQVI7IGkgKz0gRGF0ZXBpY2tlckNvbXBvbmVudC5NT05USFNfUEVSX1JPVykge1xuICAgICAgICAgICAgcm93cy5wdXNoKFtcbiAgICAgICAgICAgICAgICB7IGtleTogdGhpcy5tb250aEtleXNbaV0sIGluZGV4OiBpIH0sXG4gICAgICAgICAgICAgICAgeyBrZXk6IHRoaXMubW9udGhLZXlzW2kgKyAxXSwgaW5kZXg6IGkgKyAxIH0sXG4gICAgICAgICAgICAgICAgeyBrZXk6IHRoaXMubW9udGhLZXlzW2kgKyAyXSwgaW5kZXg6IGkgKyAyIH0sXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcm93cztcbiAgICB9KTtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSBjdXJyZW50RGVjYWRlU3RhcnQgPSBjb21wdXRlZCgoKSA9PiBNYXRoLmZsb29yKHRoaXMuY3VycmVudFllYXIoKSAvIDEwKSAqIDEwKTtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSB5ZWFyc0dyaWQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5jdXJyZW50RGVjYWRlU3RhcnQoKTtcbiAgICAgICAgY29uc3Qgcm93czogbnVtYmVyW11bXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IERhdGVwaWNrZXJDb21wb25lbnQuWUVBUlNfUEVSX0dSSUQ7IGkgKz0gRGF0ZXBpY2tlckNvbXBvbmVudC5ZRUFSU19QRVJfUk9XKSB7XG4gICAgICAgICAgICByb3dzLnB1c2goW3N0YXJ0ICsgaSwgc3RhcnQgKyBpICsgMSwgc3RhcnQgKyBpICsgMl0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByb3dzO1xuICAgIH0pO1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHByZXZEaXNhYmxlZCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgY29uc3QgbWluID0gdGhpcy5taW4oKTtcbiAgICAgICAgaWYgKCFtaW4pIHJldHVybiBmYWxzZTtcbiAgICAgICAgY29uc3QgdmlldyA9IHRoaXMudmlld0RhdGUoKTtcbiAgICAgICAgaWYgKHRoaXMucGlja2VyVmlldygpID09PSAneWVhcnMnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50RGVjYWRlU3RhcnQoKSA8PSBtaW4uZ2V0RnVsbFllYXIoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5waWNrZXJWaWV3KCkgPT09ICdtb250aHMnKSB7XG4gICAgICAgICAgICByZXR1cm4gdmlldy5nZXRGdWxsWWVhcigpIDw9IG1pbi5nZXRGdWxsWWVhcigpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICB2aWV3LmdldEZ1bGxZZWFyKCkgPCBtaW4uZ2V0RnVsbFllYXIoKSB8fFxuICAgICAgICAgICAgKHZpZXcuZ2V0RnVsbFllYXIoKSA9PT0gbWluLmdldEZ1bGxZZWFyKCkgJiYgdmlldy5nZXRNb250aCgpIDw9IG1pbi5nZXRNb250aCgpKVxuICAgICAgICApO1xuICAgIH0pO1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IG5leHREaXNhYmxlZCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgY29uc3QgbWF4ID0gdGhpcy5tYXgoKTtcbiAgICAgICAgaWYgKCFtYXgpIHJldHVybiBmYWxzZTtcbiAgICAgICAgY29uc3QgdmlldyA9IHRoaXMudmlld0RhdGUoKTtcbiAgICAgICAgaWYgKHRoaXMucGlja2VyVmlldygpID09PSAneWVhcnMnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50RGVjYWRlU3RhcnQoKSArIERhdGVwaWNrZXJDb21wb25lbnQuWUVBUlNfUEVSX0dSSUQgLSAxID49IG1heC5nZXRGdWxsWWVhcigpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnBpY2tlclZpZXcoKSA9PT0gJ21vbnRocycpIHtcbiAgICAgICAgICAgIHJldHVybiB2aWV3LmdldEZ1bGxZZWFyKCkgPj0gbWF4LmdldEZ1bGxZZWFyKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHZpZXcuZ2V0RnVsbFllYXIoKSA+IG1heC5nZXRGdWxsWWVhcigpIHx8XG4gICAgICAgICAgICAodmlldy5nZXRGdWxsWWVhcigpID09PSBtYXguZ2V0RnVsbFllYXIoKSAmJiB2aWV3LmdldE1vbnRoKCkgPj0gbWF4LmdldE1vbnRoKCkpXG4gICAgICAgICk7XG4gICAgfSk7XG5cbiAgICAvLyDilIDilIAgVHJhbnNsYXRpb24ga2V5cyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAgIHByb3RlY3RlZCByZWFkb25seSB3ZWVrRGF5S2V5cyA9IFtcbiAgICAgICAgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX2RheV9zdW4nLFxuICAgICAgICAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfZGF5X21vbicsXG4gICAgICAgICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9kYXlfdHVlJyxcbiAgICAgICAgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX2RheV93ZWQnLFxuICAgICAgICAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfZGF5X3RodScsXG4gICAgICAgICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9kYXlfZnJpJyxcbiAgICAgICAgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX2RheV9zYXQnLFxuICAgIF07XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgbW9udGhLZXlzID0gW1xuICAgICAgICAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfbW9udGhfamFuJyxcbiAgICAgICAgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX21vbnRoX2ZlYicsXG4gICAgICAgICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9tb250aF9tYXInLFxuICAgICAgICAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfbW9udGhfYXByJyxcbiAgICAgICAgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX21vbnRoX21heScsXG4gICAgICAgICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9tb250aF9qdW4nLFxuICAgICAgICAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfbW9udGhfanVsJyxcbiAgICAgICAgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX21vbnRoX2F1ZycsXG4gICAgICAgICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9tb250aF9zZXAnLFxuICAgICAgICAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfbW9udGhfb2N0JyxcbiAgICAgICAgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX21vbnRoX25vdicsXG4gICAgICAgICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9tb250aF9kZWMnLFxuICAgIF07XG5cbiAgICAvLyDilIDilIAgTGlmZWN5Y2xlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gICAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLm5nQ29udHJvbCA9IHRoaXMuaW5qZWN0b3IuZ2V0KE5nQ29udHJvbCwgbnVsbCwgeyBzZWxmOiB0cnVlLCBvcHRpb25hbDogdHJ1ZSB9KTtcbiAgICAgICAgYWZ0ZXJOZXh0UmVuZGVyKFxuICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGQgPSB0aGlzLmRlZmF1bHREYXRlKCk7XG4gICAgICAgICAgICAgICAgaWYgKGQgJiYgIXRoaXMudmFsdWUoKSAmJiAhdGhpcy5yYW5nZVZhbHVlKCkgJiYgdGhpcy5tdWx0aXBsZVZhbHVlcygpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbHVlLnNldChkKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXREaXNwbGF5Rm9yKGQpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnZpZXdEYXRlLnNldChuZXcgRGF0ZShkLmdldEZ1bGxZZWFyKCksIGQuZ2V0TW9udGgoKSwgMSkpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9vbkNoYW5nZShkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgeyBpbmplY3RvcjogdGhpcy5pbmplY3RvciB9LFxuICAgICAgICApO1xuICAgIH1cbiAgICAvLyDilIDilIAgQ29udHJvbFZhbHVlQWNjZXNzb3Ig4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgICBwdWJsaWMgd3JpdGVWYWx1ZSh2YWx1ZTogRGF0ZXBpY2tlclZhbHVlKTogdm9pZCB7XG4gICAgICAgIGlmICghdmFsdWUgfHwgKEFycmF5LmlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmxlbmd0aCA9PT0gMCkpIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWUuc2V0KG51bGwpO1xuICAgICAgICAgICAgdGhpcy5yYW5nZVZhbHVlLnNldChudWxsKTtcbiAgICAgICAgICAgIHRoaXMubXVsdGlwbGVWYWx1ZXMuc2V0KFtdKTtcbiAgICAgICAgICAgIHRoaXMuc2V0RGlzcGxheUZvcihudWxsKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHNvcnRlZCA9IFsuLi52YWx1ZV0uc29ydCgoYSwgYikgPT4gYS5nZXRUaW1lKCkgLSBiLmdldFRpbWUoKSk7XG4gICAgICAgICAgICB0aGlzLm11bHRpcGxlVmFsdWVzLnNldChzb3J0ZWQpO1xuICAgICAgICAgICAgdGhpcy5pbnB1dERhdGUgPSB0aGlzLmZvcm1hdEZvckRpc3BsYXkoc29ydGVkKTtcbiAgICAgICAgICAgIGNvbnN0IGZpcnN0ID0gc29ydGVkWzBdO1xuICAgICAgICAgICAgdGhpcy52aWV3RGF0ZS5zZXQobmV3IERhdGUoZmlyc3QuZ2V0RnVsbFllYXIoKSwgZmlyc3QuZ2V0TW9udGgoKSwgMSkpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmlzRGF0ZVJhbmdlKHZhbHVlKSkge1xuICAgICAgICAgICAgdGhpcy5yYW5nZVZhbHVlLnNldCh2YWx1ZSk7XG4gICAgICAgICAgICB0aGlzLmlucHV0RGF0ZSA9IHRoaXMuZm9ybWF0Rm9yRGlzcGxheSh2YWx1ZSk7XG4gICAgICAgICAgICBpZiAodmFsdWUuc3RhcnQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnZpZXdEYXRlLnNldChuZXcgRGF0ZSh2YWx1ZS5zdGFydC5nZXRGdWxsWWVhcigpLCB2YWx1ZS5zdGFydC5nZXRNb250aCgpLCAxKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy52YWx1ZS5zZXQodmFsdWUgYXMgRGF0ZSk7XG4gICAgICAgIGNvbnN0IGQgPSB2YWx1ZSBhcyBEYXRlO1xuICAgICAgICB0aGlzLnNldERpc3BsYXlGb3IoZCk7XG4gICAgICAgIHRoaXMudmlld0RhdGUuc2V0KG5ldyBEYXRlKGQuZ2V0RnVsbFllYXIoKSwgZC5nZXRNb250aCgpLCAxKSk7XG4gICAgICAgIHRoaXMuaG91cnMuc2V0KGQuZ2V0SG91cnMoKSk7XG4gICAgICAgIHRoaXMubWludXRlcy5zZXQoZC5nZXRNaW51dGVzKCkpO1xuICAgICAgICB0aGlzLnNlY29uZHMuc2V0KGQuZ2V0U2Vjb25kcygpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVnaXN0ZXJPbkNoYW5nZShmbjogKHZhbHVlOiBEYXRlcGlja2VyVmFsdWUpID0+IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fb25DaGFuZ2UgPSBmbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVnaXN0ZXJPblRvdWNoZWQoZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fb25Ub3VjaGVkID0gZm47XG4gICAgfVxuXG4gICAgcHVibGljIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICB0aGlzLmRpc2FibGVkLnNldChpc0Rpc2FibGVkKTtcbiAgICB9XG5cbiAgICAvLyDilIDilIAgVmFsaWRhdG9yIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gICAgcHVibGljIHZhbGlkYXRlKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsIHtcbiAgICAgICAgbGV0IHZhbHVlOiBEYXRlcGlja2VyVmFsdWU7XG4gICAgICAgIGlmICh0aGlzLmlzTXVsdGlwbGVNb2RlKCkpIHtcbiAgICAgICAgICAgIHZhbHVlID0gdGhpcy5tdWx0aXBsZVZhbHVlcygpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMubW9kZSgpID09PSAncmFuZ2UnKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IHRoaXMucmFuZ2VWYWx1ZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFsdWUgPSB0aGlzLnZhbHVlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuY29tcHV0ZVZhbGlkYXRpb25FcnJvcnModmFsdWUsIGNvbnRyb2wpO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWdpc3Rlck9uVmFsaWRhdG9yQ2hhbmdlKGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgICAgIHRoaXMub25WYWxpZGF0b3JDaGFuZ2UgPSBmbjtcbiAgICB9XG5cbiAgICAvLyDilIDilIAgUHVibGljIGFjdGlvbnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgICBwcm90ZWN0ZWQgb3BlbigpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWQoKSkgcmV0dXJuO1xuICAgICAgICB0aGlzLmlzT3Blbi5zZXQodHJ1ZSk7XG4gICAgICAgIHRoaXMucHJlcGFyZU9wZW5WaWV3KCk7XG4gICAgICAgIHRoaXMuc2hvdy5lbWl0KCk7XG4gICAgICAgIGlmICh0aGlzLm1vZGUoKSA9PT0gJ3RpbWUnKSB7XG4gICAgICAgICAgICBhZnRlck5leHRSZW5kZXIoKCkgPT4gdGhpcy5pbmNyZWFzZUhvdXJCdXR0b24oKT8ubmF0aXZlRWxlbWVudC5mb2N1cygpLCB7IGluamVjdG9yOiB0aGlzLmluamVjdG9yIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5mb2N1c0Jlc3RDYWxlbmRhclRhcmdldCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEFicmUgbyBwYWluZWwgc2VtIHRyYW5zZmVyaXIgbyBmb2NvIHBhcmEgbyBkcm9wZG93biAodXNhZG8gcGVsbyBzaG93T25Gb2N1cykuICovXG4gICAgcHJpdmF0ZSBvcGVuT25Gb2N1cygpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWQoKSB8fCB0aGlzLmlzT3BlbigpKSByZXR1cm47XG4gICAgICAgIHRoaXMuaXNPcGVuLnNldCh0cnVlKTtcbiAgICAgICAgdGhpcy5wcmVwYXJlT3BlblZpZXcoKTtcbiAgICAgICAgdGhpcy5zaG93LmVtaXQoKTtcbiAgICAgICAgLy8gRm9jbyBwZXJtYW5lY2Ugbm8gaW5wdXQg4oCUIG7Do28gY2hhbWEgZm9jdXNCZXN0Q2FsZW5kYXJUYXJnZXQoKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlZmluZSBhIHZpZXcgaW5pY2lhbCBkbyBwYWluZWwgZSBwb3NpY2lvbmEgbyBjYWxlbmTDoXJpbyBubyBgZGVmYXVsdERhdGVgXG4gICAgICogcXVhbmRvIG5lbmh1bSB2YWxvciBlc3TDoSBzZWxlY2lvbmFkby5cbiAgICAgKi9cbiAgICBwcml2YXRlIHByZXBhcmVPcGVuVmlldygpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZGVmYXVsdERhdGUgPSB0aGlzLmRlZmF1bHREYXRlKCk7XG4gICAgICAgIGlmIChkZWZhdWx0RGF0ZSAmJiAhdGhpcy52YWx1ZSgpICYmICF0aGlzLnJhbmdlVmFsdWUoKSkge1xuICAgICAgICAgICAgdGhpcy52aWV3RGF0ZS5zZXQobmV3IERhdGUoZGVmYXVsdERhdGUuZ2V0RnVsbFllYXIoKSwgZGVmYXVsdERhdGUuZ2V0TW9udGgoKSwgMSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm1vZGUoKSA9PT0gJ21vbnRoJykge1xuICAgICAgICAgICAgdGhpcy5waWNrZXJWaWV3LnNldCgnbW9udGhzJyk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5tb2RlKCkgPT09ICd5ZWFyJykge1xuICAgICAgICAgICAgdGhpcy5waWNrZXJWaWV3LnNldCgneWVhcnMnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucGlja2VyVmlldy5zZXQoJ2NhbGVuZGFyJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGZvY3VzQmVzdENhbGVuZGFyVGFyZ2V0KCk6IHZvaWQge1xuICAgICAgICBhZnRlck5leHRSZW5kZXIoXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFuZWwgPSB0aGlzLnBvcHVwUGFuZWwoKT8ubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBpZiAoIXBhbmVsKSByZXR1cm47XG4gICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID1cbiAgICAgICAgICAgICAgICAgICAgcGFuZWwucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oJ1tkYXRhLWZvY3VzPVwic2VsZWN0ZWRcIl0nKSA/P1xuICAgICAgICAgICAgICAgICAgICBwYW5lbC5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PignW2RhdGEtZm9jdXM9XCJ0b2RheVwiXScpID8/XG4gICAgICAgICAgICAgICAgICAgIHBhbmVsLnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KCdidXR0b246bm90KFtkaXNhYmxlZF0pJyk7XG4gICAgICAgICAgICAgICAgdGFyZ2V0Py5mb2N1cygpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHsgaW5qZWN0b3I6IHRoaXMuaW5qZWN0b3IgfSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgY2xvc2VQYW5lbCgpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcGFuZWwgPSAodGhpcy5wb3B1cFBhbmVsKCk/Lm5hdGl2ZUVsZW1lbnQgPz8gdGhpcy5ob3N0RWxlbWVudC5uYXRpdmVFbGVtZW50KSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgdGhpcy5pc09wZW4uc2V0KGZhbHNlKTtcbiAgICAgICAgdGhpcy5wZW5kaW5nUmFuZ2VTdGFydC5zZXQobnVsbCk7XG4gICAgICAgIHRoaXMuaG92ZXJEYXRlLnNldChudWxsKTtcbiAgICAgICAgdGhpcy5fb25Ub3VjaGVkKCk7XG4gICAgICAgIHRoaXMuY2xvc2VkLmVtaXQocGFuZWwpO1xuXG4gICAgICAgIGFmdGVyTmV4dFJlbmRlcihcbiAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmljb25CdXR0b24oKT8ubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHsgaW5qZWN0b3I6IHRoaXMuaW5qZWN0b3IgfSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPIGJhY2tkcm9wIGRvIENESyBPdmVybGF5IGNvYnJlIGEgdGVsYSBpbnRlaXJhLCBpbmNsdWluZG8gbyBwcsOzcHJpbyB0cmlnZ2VyIOKAlCBjbGljYXIgbm9cbiAgICAgKiBpbnB1dCBvdSBub3MgYm90w7VlcyBkbyB0cmlnZ2VyIGVucXVhbnRvIG8gcGFpbmVsIGrDoSBlc3TDoSBhYmVydG8gdGFtYsOpbSBkaXNwYXJhXG4gICAgICogYGJhY2tkcm9wQ2xpY2tgIChvIHByw7NwcmlvIGA8aW5wdXQ+YCBudW5jYSByZWNlYmUgbyBgY2xpY2tgIG5lc3NlIGNhc28sIGVudMOjb1xuICAgICAqIGBoYW5kbGVJbnB1dENsaWNrYCBudW5jYSBkaXNwYXJhKS4gU2VtIGVzdGUgZmlsdHJvLCBjbGljYXIgbm8gaW5wdXQgcGFyYSB0cm9jYXIgZGVcbiAgICAgKiBzZWdtZW50byBmZWNoYXJpYSBvIHBhaW5lbCBlIHJvdWJhcmlhIG8gZm9jbyBwYXJhIG8gYm90w6NvIGRvIMOtY29uZSAodmlhIGBjbG9zZVBhbmVsYCkuXG4gICAgICogUXVhbmRvIG8gY2xpcXVlIGNhaXUgZXNwZWNpZmljYW1lbnRlIHNvYnJlIG8gYDxpbnB1dD5gLCByZWFwbGljYW1vcyBhIG1lc21hIGzDs2dpY2EgZGVcbiAgICAgKiByZXBvc2ljaW9uYW1lbnRvIGRlIHNlZ21lbnRvIHF1ZSBgaGFuZGxlSW5wdXRDbGlja2AgZmFyaWEsIGVtIHZleiBkZSBzw7MgaWdub3JhciBvIGNsaXF1ZS5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgaGFuZGxlQmFja2Ryb3BDbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgICAgICAvLyBgZXZlbnQudGFyZ2V0YCBkZSB1bSBiYWNrZHJvcENsaWNrIGRvIENESyBPdmVybGF5IMOpIHNlbXByZSBvIHByw7NwcmlvIDxkaXY+IGRvXG4gICAgICAgIC8vIGJhY2tkcm9wLCBudW5jYSBvIGVsZW1lbnRvIHJlYWxtZW50ZSBjbGljYWRvIOKAlCBlbnTDo28gY2hlY2FyIGAuY29udGFpbnMoZXZlbnQudGFyZ2V0KWBcbiAgICAgICAgLy8gbnVuY2EgZnVuY2lvbmEuIEVtIHZleiBkaXNzbywgY29tcGFyYW1vcyBhIGNvb3JkZW5hZGEgcmVhbCBkbyBjbGlxdWUgKHF1ZSBvXG4gICAgICAgIC8vIE1vdXNlRXZlbnQgc2VtcHJlIGNhcnJlZ2EgY29ycmV0YW1lbnRlKSBjb250cmEgb3MgcmV0w6JuZ3Vsb3MgZG9zIGVsZW1lbnRvcyBkbyB0cmlnZ2VyLlxuICAgICAgICBjb25zdCBpbnB1dEVsID0gdGhpcy50cmlnZ2VySW5wdXQoKT8ubmF0aXZlRWxlbWVudCBhcyBIVE1MSW5wdXRFbGVtZW50IHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAoaW5wdXRFbCAmJiB0aGlzLmlzU2VnbWVudGVkTW9kZSgpKSB7XG4gICAgICAgICAgICBjb25zdCBpbnB1dFJlY3QgPSBpbnB1dEVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgY29uc3QgY2xpY2tlZE9uSW5wdXQgPVxuICAgICAgICAgICAgICAgIGV2ZW50LmNsaWVudFggPj0gaW5wdXRSZWN0LmxlZnQgJiZcbiAgICAgICAgICAgICAgICBldmVudC5jbGllbnRYIDw9IGlucHV0UmVjdC5yaWdodCAmJlxuICAgICAgICAgICAgICAgIGV2ZW50LmNsaWVudFkgPj0gaW5wdXRSZWN0LnRvcCAmJlxuICAgICAgICAgICAgICAgIGV2ZW50LmNsaWVudFkgPD0gaW5wdXRSZWN0LmJvdHRvbTtcbiAgICAgICAgICAgIGlmIChjbGlja2VkT25JbnB1dCkge1xuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlU2VnbWVudFBvaW50ZXJEb3duKGlucHV0RWwsIGV2ZW50LmNsaWVudFgsIGV2ZW50LnRpbWVTdGFtcCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlY3QgPSB0aGlzLmhvc3RFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIGNvbnN0IGNsaWNrZWRPblRyaWdnZXIgPVxuICAgICAgICAgICAgZXZlbnQuY2xpZW50WCA+PSByZWN0LmxlZnQgJiZcbiAgICAgICAgICAgIGV2ZW50LmNsaWVudFggPD0gcmVjdC5yaWdodCAmJlxuICAgICAgICAgICAgZXZlbnQuY2xpZW50WSA+PSByZWN0LnRvcCAmJlxuICAgICAgICAgICAgZXZlbnQuY2xpZW50WSA8PSByZWN0LmJvdHRvbTtcbiAgICAgICAgaWYgKGNsaWNrZWRPblRyaWdnZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNsb3NlUGFuZWwoKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgdG9nZ2xlKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5pc09wZW4oKSkge1xuICAgICAgICAgICAgdGhpcy5jbG9zZVBhbmVsKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm9wZW4oKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBoYW5kbGVPdmVybGF5S2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAoZXZlbnQua2V5ID09PSAnRXNjYXBlJykge1xuICAgICAgICAgICAgdGhpcy5jbG9zZVBhbmVsKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgaGFuZGxlSW5wdXRDbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuaXNTZWdtZW50ZWRNb2RlKCkgfHwgIShldmVudC50YXJnZXQgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50KSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIEJvdW5kIHRvIGBtb3VzZWRvd25gLCBuw6NvIGBjbGlja2AgKHZlamEgbyBjb21lbnTDoXJpbyBlbSBgYXBwbHlTZWdtZW50Q2xpY2tgKS4gT1xuICAgICAgICAvLyBjb21wb3J0YW1lbnRvIG5hdGl2byBwYWRyw6NvIGRvIGJyb3dzZXIgcHJhIG1vdXNlZG93biBudW0gYDxpbnB1dD5gIGRlIHRleHRvIMOpXG4gICAgICAgIC8vIHBvc2ljaW9uYXIgbyBjYXJldC9pbmljaWFyIHNlbGXDp8OjbyBkZSB0ZXh0byBuYSBjb29yZGVuYWRhIGRvIGNsaXF1ZSDigJQgaXNzbyByb2RhXG4gICAgICAgIC8vICpkZXBvaXMqIGRvcyBub3Nzb3MgbGlzdGVuZXJzIGUgc29icmVzY3JldmVyaWEgbyBgc2V0U2VsZWN0aW9uUmFuZ2VgIGRvIHNlZ21lbnRvXG4gICAgICAgIC8vIGFwbGljYWRvIGxvZ28gYWJhaXhvLiBgcHJldmVudERlZmF1bHQoKWAgZXZpdGEgZXNzYSBjb3JyaWRhLlxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLmhhbmRsZVNlZ21lbnRQb2ludGVyRG93bihldmVudC50YXJnZXQsIGV2ZW50LmNsaWVudFgsIGV2ZW50LnRpbWVTdGFtcCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUG9udG8gZGUgZW50cmFkYSDDum5pY28gcHJvIGNsaXF1ZSBubyBpbnB1dCBzZWdtZW50YWRvIOKAlCBjaGFtYWRvIHRhbnRvIHBvclxuICAgICAqIGBoYW5kbGVJbnB1dENsaWNrYCAobW91c2Vkb3duIGRpcmV0byBubyBgPGlucHV0PmAsIG8gcHJpbWVpcm8gY2xpcXVlLCBhbnRlcyBkbyBiYWNrZHJvcFxuICAgICAqIGV4aXN0aXIpIHF1YW50byBwb3IgYGhhbmRsZUJhY2tkcm9wQ2xpY2tgIChjbGlxdWVzIHNlZ3VpbnRlcywgasOhIGNvbSBvIHBhaW5lbCBhYmVydG8gZSBvXG4gICAgICogYmFja2Ryb3AgY29icmluZG8gbyBpbnB1dCkuIFByZWNpc2Egc2VyIMO6bmljbyBwb3JxdWUgb3MgZG9pcyBjbGlxdWVzIGRlIHVtIGR1cGxvIGNsaXF1ZVxuICAgICAqIHJlYWwgY29zdHVtYW0gY2hlZ2FyIHBvciBjYW1pbmhvcyBESUZFUkVOVEVTIOKAlCBvIHByaW1laXJvIHZpYSBtb3VzZWRvd24gbm8gaW5wdXQsIG9cbiAgICAgKiBzZWd1bmRvIHZpYSBiYWNrZHJvcENsaWNrIOKAlCBlbnTDo28gcmFzdHJlYXIgbyB0aW1lc3RhbXAgZG8gXCLDumx0aW1vIGNsaXF1ZVwiIHNlcGFyYWRhbWVudGVcbiAgICAgKiBlbSBjYWRhIGhhbmRsZXIgbnVuY2EgZGV0ZWN0YXJpYSB1bSBkdXBsbyBjbGlxdWUgZGUgdmVyZGFkZS4gTmVtIGBkYmxjbGlja2AgbmVtXG4gICAgICogYGV2ZW50LmRldGFpbGAgc8OjbyBjb25macOhdmVpcyBhcXVpIChkZXBlbmRlbSBkYSBjb250YWdlbS90YXJnZXRpbmcgaW50ZXJuYSBkZSBjbGlxdWVzIGRvXG4gICAgICogYnJvd3NlciwgcXVlIG5vc3NhcyBtYW5pcHVsYcOnw7VlcyBkZSBmb2NvL3NlbGXDp8OjbyBwYXJlY2VtIGF0cmFwYWxoYXIg4oCUIG9ic2VydmFkb1xuICAgICAqIGVtcGlyaWNhbWVudGU6IGBldmVudC5kZXRhaWxgIGZpY2Egc2VtcHJlIDEpLCBkYcOtIGEgZGV0ZWPDp8OjbyBtYW51YWwgcG9yIHRpbWVzdGFtcC5cbiAgICAgKi9cbiAgICBwcml2YXRlIGhhbmRsZVNlZ21lbnRQb2ludGVyRG93bihpbnB1dDogSFRNTElucHV0RWxlbWVudCwgY2xpZW50WDogbnVtYmVyLCB0aW1lU3RhbXA6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBjb25zdCBpc0RvdWJsZUNsaWNrID0gdGltZVN0YW1wIC0gdGhpcy5sYXN0TW91c2VEb3duQXQgPCBEYXRlcGlja2VyQ29tcG9uZW50LkRPVUJMRV9DTElDS19USFJFU0hPTERfTVM7XG4gICAgICAgIHRoaXMubGFzdE1vdXNlRG93bkF0ID0gdGltZVN0YW1wO1xuICAgICAgICBpZiAoaXNEb3VibGVDbGljaykge1xuICAgICAgICAgICAgdGhpcy5sYXN0TW91c2VEb3duQXQgPSAwOyAvLyBldml0YSBxdWUgdW0gdGVyY2Vpcm8gY2xpcXVlIGVuY2FkZWllIGVtIG91dHJvIFwiZHVwbG9cIlxuICAgICAgICAgICAgdGhpcy5zZWxlY3RXaG9sZUZpZWxkKGlucHV0KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFwcGx5U2VnbWVudENsaWNrKGlucHV0LCBjbGllbnRYKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZWxlY2lvbmEgbyBzZWdtZW50byBzb2IgYSBjb29yZGVuYWRhIGBjbGllbnRYYCBkZSB1bSBjbGlxdWUgbm8gaW5wdXQgc2VnbWVudGFkby5cbiAgICAgKiBDb21wYXJ0aWxoYWRvIHBvciBgaGFuZGxlSW5wdXRDbGlja2AgKG1vdXNlZG93biByZWFsIG5vIGA8aW5wdXQ+YCDigJQgdXNhbW9zIGBtb3VzZWRvd25gXG4gICAgICogZW0gdmV6IGRlIGBjbGlja2AgcG9ycXVlIG8gYGZvY3VzYC9gb3Blbk9uRm9jdXNgIGRpc3BhcmFkbyBubyBtZWlvIGRvIGdlc3RvIHBvZGUgbW9udGFyXG4gICAgICogbyBiYWNrZHJvcCBkbyBDREsgT3ZlcmxheSBlbWJhaXhvIGRvIGN1cnNvciBhbnRlcyBkbyBgbW91c2V1cGAsIGZhemVuZG8gbyBicm93c2VyIHJlc29sdmVyXG4gICAgICogbyBgY2xpY2tgIHBybyBhbmNlc3RyYWwgY29tdW0gZW50cmUgbyBhbHZvIGRvIG1vdXNlZG93biBlIG8gZG8gbW91c2V1cCDigJQgbmEgcHLDoXRpY2EsXG4gICAgICogYDxib2R5PmAg4oCUIGVtIHZleiBkbyBgPGlucHV0PmAgb3UgZG8gYmFja2Ryb3ApIGUgYGhhbmRsZUJhY2tkcm9wQ2xpY2tgIChjbGlxdWUgbm8gdHJpZ2dlclxuICAgICAqIGNvbSBvIHBhaW5lbCBqw6EgYWJlcnRvIGVtIHJlZ2ltZSBlc3TDoXZlbCwgaW50ZXJjZXB0YWRvIHBlbG8gYmFja2Ryb3AgZG8gQ0RLIE92ZXJsYXkpLlxuICAgICAqL1xuICAgIHByaXZhdGUgYXBwbHlTZWdtZW50Q2xpY2soaW5wdXQ6IEhUTUxJbnB1dEVsZW1lbnQsIGNsaWVudFg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICB0aGlzLmVuc3VyZVNlZ21lbnRFbmdpbmVDb25maWd1cmVkKCk7XG4gICAgICAgIC8vIENhbGN1bGEgbyBzZWdtZW50byBhIHBhcnRpciBkYSBjb29yZGVuYWRhIGRvIGNsaXF1ZSAoY2xpZW50WCksIG7Do28gZGVcbiAgICAgICAgLy8gYGlucHV0LnNlbGVjdGlvblN0YXJ0YCDigJQgbyBicm93c2VyIGFqdXN0YSBhIHBvc2nDp8OjbyBkbyBjYXJldCBkZSBmb3JtYSBhc3PDrW5jcm9uYVxuICAgICAgICAvLyBhcMOzcyBvIGNsaXF1ZSAob2JzZXJ2YWRvIGVtcGlyaWNhbWVudGUsIGVzcGVjaWFsbWVudGUgbmEgdHJhbnNpw6fDo28gZGUgZm9jbyksIGVudMOjb1xuICAgICAgICAvLyBsZXIgYHNlbGVjdGlvblN0YXJ0YCBuZXNzZSBtb21lbnRvIMOpIHVtYSBmb250ZSBuw6NvIGNvbmZpw6F2ZWwuIGBjbGllbnRYYCDDqSBzw61uY3Jvbm9cbiAgICAgICAgLy8gZSBpbWVkaWF0bywgc2VtIGVzc2EgY29ycmlkYS5cbiAgICAgICAgY29uc3QgY2hhckluZGV4ID0gdGhpcy5jbGlja0NsaWVudFhUb0NoYXJJbmRleChpbnB1dCwgY2xpZW50WCk7XG4gICAgICAgIGNvbnN0IGdlbmVyYXRpb24gPSArK3RoaXMuaW50ZXJhY3Rpb25HZW5lcmF0aW9uO1xuICAgICAgICAvLyBGb2NhIGUgc2VsZWNpb25hIG8gc2VnbWVudG8ganVudG9zLCBlIHJlYXBsaWNhIG9zIGRvaXMgYWxndW1hcyB2ZXplcyBsb2dvIGVtIHNlZ3VpZGEg4oCUXG4gICAgICAgIC8vIG8gYnJvd3Nlci9DREsgT3ZlcmxheSBwb2RlIG1leGVyIG5vIGZvY28gZGUgZm9ybWEgYXNzw61uY3JvbmEgZGVwb2lzIGRvIGNsaXF1ZSAoYmx1clxuICAgICAgICAvLyBuYXRpdm8gZG8gYmFja2Ryb3AsIGNka1RyYXBGb2N1cyBkbyBwYWluZWwsIGV0Yy4pOyBlbSB2ZXogZGUgdGVudGFyIHByZXZlci9ldml0YXIgY2FkYVxuICAgICAgICAvLyBjYXVzYSwgc2ltcGxlc21lbnRlIHZlbmNlbW9zIHJlYWZpcm1hbmRvIGZvY28rc2VsZcOnw6NvIHBvciBjaW1hLlxuICAgICAgICBjb25zdCBmb2N1c0FuZFNlbGVjdCA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgICAgIGlmIChnZW5lcmF0aW9uICE9PSB0aGlzLmludGVyYWN0aW9uR2VuZXJhdGlvbikgcmV0dXJuO1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLnNlZ21lbnRFbmdpbmUuc2VsZWN0U2VnbWVudEF0KGNoYXJJbmRleCk7XG4gICAgICAgICAgICB0aGlzLnNlZ21lbnRFbmdpbmUuc2VsZWN0U2VnbWVudChpbmRleCk7XG4gICAgICAgICAgICBpbnB1dC5mb2N1cygpO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RBY3RpdmVTZWdtZW50UmFuZ2UoaW5wdXQpO1xuICAgICAgICB9O1xuICAgICAgICBmb2N1c0FuZFNlbGVjdCgpO1xuICAgICAgICBzZXRUaW1lb3V0KGZvY3VzQW5kU2VsZWN0LCAwKTtcbiAgICAgICAgc2V0VGltZW91dChmb2N1c0FuZFNlbGVjdCwgNTApO1xuICAgIH1cblxuICAgIC8qKiBEdXBsbyBjbGlxdWUgc2VsZWNpb25hIG8gaW5wdXQgaW50ZWlybyAodG9kb3Mgb3Mgc2VnbWVudG9zKSwgY29tbyBudW0gYDxpbnB1dD5gIGRlIHRleHRvIGNvbXVtLiAqL1xuICAgIHByb3RlY3RlZCBoYW5kbGVJbnB1dERibENsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5pc1NlZ21lbnRlZE1vZGUoKSB8fCAhKGV2ZW50LnRhcmdldCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQpKSByZXR1cm47XG4gICAgICAgIHRoaXMuc2VsZWN0V2hvbGVGaWVsZChldmVudC50YXJnZXQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlbGVjaW9uYSB0b2RvcyBvcyBzZWdtZW50b3MgZG8gaW5wdXQgKHVzYWRvIHRhbnRvIHBlbG8gZHVwbG8gY2xpcXVlIGRldGVjdGFkbyBuYSBtw6NvIGVtXG4gICAgICogYGhhbmRsZVNlZ21lbnRQb2ludGVyRG93bmAgcXVhbnRvIHBvciBgaGFuZGxlSW5wdXREYmxDbGlja2AsIG1hbnRpZG8gY29tbyBjYW1pbmhvIGRpcmV0b1xuICAgICAqIHByYSBxdWVtIGRpc3BhcmEgdW0gYGRibGNsaWNrYCBkZSB2ZXJkYWRlLCBleC46IGFjZXNzaWJpbGlkYWRlL3Rlc3RlcykuXG4gICAgICovXG4gICAgcHJpdmF0ZSBzZWxlY3RXaG9sZUZpZWxkKGlucHV0OiBIVE1MSW5wdXRFbGVtZW50KTogdm9pZCB7XG4gICAgICAgIHRoaXMuZW5zdXJlU2VnbWVudEVuZ2luZUNvbmZpZ3VyZWQoKTtcbiAgICAgICAgLy8gR2FyYW50ZSB1bSBzZWdtZW50byBhdGl2byAqYW50ZXMqIGRlIGZvY2FyOiBzZSBvIENESyBPdmVybGF5IHRpdmVyIHJvdWJhZG8gbyBmb2NvIGRlXG4gICAgICAgIC8vIGZvcm1hIGFzc8OtbmNyb25hIChibHVyKSBlbnRyZSBvcyBjbGlxdWVzIHF1ZSBjb21ww7VlbSBvIGR1cGxvIGNsaXF1ZSwgbyBgaW5wdXQuZm9jdXMoKWBcbiAgICAgICAgLy8gYWJhaXhvIGRpc3BhcmEgdW0gZXZlbnRvIGBmb2N1c2AgZ2VudcOtbm8sIGUgaGFuZGxlSW5wdXRGb2N1cyBzw7MgZXZpdGEgYWdlbmRhciBzdWEgcHLDs3ByaWFcbiAgICAgICAgLy8gcmVhcGxpY2HDp8OjbyBjb25jb3JyZW50ZSAocXVlIHNvYnJlc2NyZXZlcmlhIG5vc3NhIHNlbGXDp8OjbyBkbyBjYW1wbyBpbnRlaXJvIG1haXMgdGFyZGUpXG4gICAgICAgIC8vIHF1YW5kbyBlbmNvbnRyYSBgZ2V0QWN0aXZlSW5kZXgoKSAhPT0gbnVsbGAg4oCUIG8gbWVzbW8gbW90aXZvIHBlbG8gcXVhbCBoYW5kbGVJbnB1dENsaWNrXG4gICAgICAgIC8vIHNlbXByZSBjaGFtYSBgc2VnbWVudEVuZ2luZS5zZWxlY3RTZWdtZW50KGluZGV4KWAgYW50ZXMgZGUgYGlucHV0LmZvY3VzKClgLlxuICAgICAgICBpZiAodGhpcy5zZWdtZW50RW5naW5lLmdldEFjdGl2ZUluZGV4KCkgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuc2VnbWVudEVuZ2luZS5zZWxlY3RGaXJzdFNlZ21lbnQoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBnZW5lcmF0aW9uID0gKyt0aGlzLmludGVyYWN0aW9uR2VuZXJhdGlvbjtcbiAgICAgICAgLy8gTWVzbW8gcGFkcsOjbyBkZWZlbnNpdm8gZGUgaGFuZGxlSW5wdXRDbGljazogbyBjbGlxdWUgcXVlIGZlY2hhIG8gZHVwbG8gY2xpcXVlIGrDoSByb2RvdVxuICAgICAgICAvLyBoYW5kbGVJbnB1dENsaWNrIChzZWxlY2lvbmFuZG8gc8OzIHVtIHNlZ21lbnRvKSBlIHBvZGUgdGVyIGFnZW5kYWRvIHN1YXMgcHLDs3ByaWFzXG4gICAgICAgIC8vIHJlYXBsaWNhw6fDtWVzIGFkaWFkYXMg4oCUIGEgZ2VyYcOnw6NvIHJlY8OpbS1pbmNyZW1lbnRhZGEgYXMgaW52YWxpZGEsIGVudMOjbyBzw7MgYSBzZWxlw6fDo28gZG9cbiAgICAgICAgLy8gY2FtcG8gaW50ZWlybyBzb2JyZXZpdmUuXG4gICAgICAgIGNvbnN0IGZvY3VzQW5kU2VsZWN0QWxsID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgaWYgKGdlbmVyYXRpb24gIT09IHRoaXMuaW50ZXJhY3Rpb25HZW5lcmF0aW9uKSByZXR1cm47XG4gICAgICAgICAgICBpbnB1dC5mb2N1cygpO1xuICAgICAgICAgICAgaW5wdXQuc2V0U2VsZWN0aW9uUmFuZ2UoMCwgaW5wdXQudmFsdWUubGVuZ3RoKTtcbiAgICAgICAgfTtcbiAgICAgICAgZm9jdXNBbmRTZWxlY3RBbGwoKTtcbiAgICAgICAgc2V0VGltZW91dChmb2N1c0FuZFNlbGVjdEFsbCwgMCk7XG4gICAgICAgIHNldFRpbWVvdXQoZm9jdXNBbmRTZWxlY3RBbGwsIDUwKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgaGFuZGxlSW5wdXRGb2N1cyhldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pc0ZvY3VzZWQuc2V0KHRydWUpO1xuICAgICAgICB0aGlzLmZvY3VzZWQuZW1pdChldmVudCk7XG4gICAgICAgIGlmICh0aGlzLmlzU2VnbWVudGVkTW9kZSgpICYmIGV2ZW50LnRhcmdldCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMuZW5zdXJlU2VnbWVudEVuZ2luZUNvbmZpZ3VyZWQoKTtcbiAgICAgICAgICAgIGNvbnN0IGlucHV0ID0gZXZlbnQudGFyZ2V0O1xuICAgICAgICAgICAgaWYgKGlucHV0LnZhbHVlID09PSAnJykge1xuICAgICAgICAgICAgICAgIGlucHV0LnZhbHVlID0gdGhpcy5zZWdtZW50RW5naW5lLmdldERpc3BsYXlTdHJpbmcoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLnNlZ21lbnRFbmdpbmUuZ2V0QWN0aXZlSW5kZXgoKSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIC8vIEZvY28gXCJnZW51w61ub1wiIChUYWIgYSBwYXJ0aXIgZGUgb3V0cm8gY2FtcG8sIG91IHByaW1laXJvIGZvY28gbm8gY2FtcG8pIOKAlFxuICAgICAgICAgICAgICAgIC8vIG5lbmh1bSBzZWdtZW50byBhdGl2byBhaW5kYSwgZW50w6NvIHNlbGVjaW9uYSBvIHByaW1laXJvLlxuICAgICAgICAgICAgICAgIGNvbnN0IGdlbmVyYXRpb24gPSArK3RoaXMuaW50ZXJhY3Rpb25HZW5lcmF0aW9uO1xuICAgICAgICAgICAgICAgIHRoaXMuc2VnbWVudEVuZ2luZS5zZWxlY3RGaXJzdFNlZ21lbnQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdEFjdGl2ZVNlZ21lbnRSYW5nZShpbnB1dCk7XG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChnZW5lcmF0aW9uICE9PSB0aGlzLmludGVyYWN0aW9uR2VuZXJhdGlvbikgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zZWdtZW50RW5naW5lLmdldEFjdGl2ZUluZGV4KCkgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0QWN0aXZlU2VnbWVudFJhbmdlKGlucHV0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIDApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBKw6EgZXhpc3RlIHVtIHNlZ21lbnRvIGF0aXZvIOKAlCBwb3IgZXhlbXBsbywgaGFuZGxlSW5wdXRDbGljayBhY2Fib3UgZGVcbiAgICAgICAgICAgICAgICAvLyBkZWZpbmktbG8gZSBlc3TDoSByZWZvY2FuZG8gbyBpbnB1dCBwcm9ncmFtYXRpY2FtZW50ZSBhcMOzcyB1bSBibHVyIGVzcMO6cmlvLlxuICAgICAgICAgICAgICAgIC8vIE7Do28gcmVpbmljaWEgcGFyYSBvIHByaW1laXJvIHNlZ21lbnRvOyBzw7MgZ2FyYW50ZSBxdWUgYSBzZWxlw6fDo28gdmlzdWFsIGJhdGFcbiAgICAgICAgICAgICAgICAvLyBjb20gbyBlc3RhZG8gYXR1YWwuXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RBY3RpdmVTZWdtZW50UmFuZ2UoaW5wdXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnNob3dPbkZvY3VzKCkpIHtcbiAgICAgICAgICAgIHRoaXMub3Blbk9uRm9jdXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBNYXBlaWEgYSBjb29yZGVuYWRhIFggKHZpZXdwb3J0KSBkZSB1bSBjbGlxdWUgcGFyYSBvIMOtbmRpY2UgZGUgY2FyYWN0ZXJlIG1haXMgcHLDs3hpbW8gbm8gdmFsb3IgZXhpYmlkby4gKi9cbiAgICBwcml2YXRlIGNsaWNrQ2xpZW50WFRvQ2hhckluZGV4KGlucHV0OiBIVE1MSW5wdXRFbGVtZW50LCBjbGllbnRYOiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICBjb25zdCBzdHlsZSA9IGdldENvbXB1dGVkU3R5bGUoaW5wdXQpO1xuICAgICAgICBjb25zdCBjYW52YXMgPSAodGhpcy5tZWFzdXJlQ2FudmFzID8/PSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKSk7XG4gICAgICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgICAgICBpZiAoIWN0eCkgcmV0dXJuIDA7XG4gICAgICAgIGN0eC5mb250ID0gYCR7c3R5bGUuZm9udFN0eWxlfSAke3N0eWxlLmZvbnRXZWlnaHR9ICR7c3R5bGUuZm9udFNpemV9ICR7c3R5bGUuZm9udEZhbWlseX1gO1xuICAgICAgICBjb25zdCByZWN0ID0gaW5wdXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIGNvbnN0IHBhZGRpbmdMZWZ0ID0gcGFyc2VGbG9hdChzdHlsZS5wYWRkaW5nTGVmdCkgfHwgMDtcbiAgICAgICAgY29uc3QgbG9jYWxYID0gY2xpZW50WCAtIHJlY3QubGVmdCAtIHBhZGRpbmdMZWZ0ICsgaW5wdXQuc2Nyb2xsTGVmdDtcbiAgICAgICAgY29uc3QgdGV4dCA9IGlucHV0LnZhbHVlO1xuICAgICAgICBsZXQgYmVzdEluZGV4ID0gMDtcbiAgICAgICAgbGV0IGJlc3REaXN0YW5jZSA9IEluZmluaXR5O1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8PSB0ZXh0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBkaXN0YW5jZSA9IE1hdGguYWJzKGN0eC5tZWFzdXJlVGV4dCh0ZXh0LnNsaWNlKDAsIGkpKS53aWR0aCAtIGxvY2FsWCk7XG4gICAgICAgICAgICBpZiAoZGlzdGFuY2UgPCBiZXN0RGlzdGFuY2UpIHtcbiAgICAgICAgICAgICAgICBiZXN0RGlzdGFuY2UgPSBkaXN0YW5jZTtcbiAgICAgICAgICAgICAgICBiZXN0SW5kZXggPSBpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBiZXN0SW5kZXg7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGhhbmRsZU5hdGl2ZUlucHV0KGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgICAgICB0aGlzLnZhbHVlSW5wdXQuZW1pdChldmVudCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGhhbmRsZUlucHV0Qmx1cihldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pc0ZvY3VzZWQuc2V0KGZhbHNlKTtcbiAgICAgICAgdGhpcy5ibHVycmVkLmVtaXQoZXZlbnQpO1xuICAgICAgICBjb25zdCBpbnB1dCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgICAgICBjb25zdCB3YXNTZWdtZW50ZWQgPSB0aGlzLmlzU2VnbWVudGVkTW9kZSgpO1xuICAgICAgICBpZiAod2FzU2VnbWVudGVkKSB7XG4gICAgICAgICAgICB0aGlzLmVuc3VyZVNlZ21lbnRFbmdpbmVDb25maWd1cmVkKCk7XG4gICAgICAgICAgICB0aGlzLnNlZ21lbnRFbmdpbmUuZGVhY3RpdmF0ZSgpO1xuICAgICAgICAgICAgdGhpcy5jb21taXRTZWdtZW50ZWRWYWx1ZUlmQ29tcGxldGUoKTtcbiAgICAgICAgICAgIHRoaXMuaW5wdXREYXRlID0gdGhpcy5zZWdtZW50RW5naW5lLmlzRW1wdHkoKSA/ICcnIDogdGhpcy5zZWdtZW50RW5naW5lLmdldERpc3BsYXlTdHJpbmcoKTtcbiAgICAgICAgICAgIGlucHV0LnZhbHVlID0gdGhpcy5pbnB1dERhdGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpbnB1dC52YWx1ZT8udHJpbSgpKSB7XG4gICAgICAgICAgICB0aGlzLm9uVmFsaWRhdG9yQ2hhbmdlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaXNPcGVuKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlbGF0ZWRUYXJnZXQgPSAoZXZlbnQgYXMgRm9jdXNFdmVudCkucmVsYXRlZFRhcmdldCBhcyBIVE1MRWxlbWVudCB8IG51bGw7XG4gICAgICAgICAgICBjb25zdCBwYW5lbCA9IHRoaXMucG9wdXBQYW5lbCgpPy5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgLy8gRW0gbW9kbyBzZWdtZW50YWRvLCB1bSBibHVyIHNlbSBgcmVsYXRlZFRhcmdldGAgbm9ybWFsbWVudGUgbsOjbyDDqSB1bWEgc2HDrWRhIHJlYWxcbiAgICAgICAgICAgIC8vIGRlIGZvY28g4oCUIMOpIG8gYmFja2Ryb3AgdHJhbnNwYXJlbnRlIGRvIHByw7NwcmlvIHBvcHVwIChuw6NvIGZvY8OhdmVsKSBpbnRlcmNlcHRhbmRvXG4gICAgICAgICAgICAvLyB1bSBjbGlxdWUgbm8gdHJpZ2dlciBwYXJhIHRyb2NhciBkZSBzZWdtZW50by4gTsOjbyByZWRpcmVjaW9uYSBvIGZvY28gcHJvIHBhaW5lbFxuICAgICAgICAgICAgLy8gbmVzc2UgY2FzbzsgZGVpeGEgaGFuZGxlSW5wdXRDbGljay9oYW5kbGVJbnB1dEZvY3VzIHJlc29sdmVyZW0gKGVsZXMgcmVmb2NhbSBvXG4gICAgICAgICAgICAvLyBpbnB1dCBlIHJlYXBsaWNhbSBvIHNlZ21lbnRvIGNvcnJldG8gbG9nbyBlbSBzZWd1aWRhKS5cbiAgICAgICAgICAgIGNvbnN0IGxvb2tzTGlrZU93blRyaWdnZXJDbGljayA9IHdhc1NlZ21lbnRlZCAmJiAhcmVsYXRlZFRhcmdldDtcbiAgICAgICAgICAgIGlmICghbG9va3NMaWtlT3duVHJpZ2dlckNsaWNrICYmICghcmVsYXRlZFRhcmdldCB8fCAhcGFuZWw/LmNvbnRhaW5zKHJlbGF0ZWRUYXJnZXQpKSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm1vZGUoKSA9PT0gJ3RpbWUnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5jcmVhc2VIb3VyQnV0dG9uKCk/Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgcGFuZWw/LnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KCdbZGF0YS1mb2N1cz1cInNlbGVjdGVkXCJdJykgPz9cbiAgICAgICAgICAgICAgICAgICAgICAgIHBhbmVsPy5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PignW2RhdGEtZm9jdXM9XCJ0b2RheVwiXScpID8/XG4gICAgICAgICAgICAgICAgICAgICAgICBwYW5lbD8ucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oJ2J1dHRvbjpub3QoW2Rpc2FibGVkXSknKTtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0Py5mb2N1cygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBoYW5kbGVJbnB1dENoYW5nZShyYXc6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5pc1NlZ21lbnRNb2RlQ2FuZGlkYXRlKCkpIHJldHVybjtcbiAgICAgICAgaWYgKCFyYXc/LnRyaW0oKSkge1xuICAgICAgICAgICAgdGhpcy52YWx1ZS5zZXQobnVsbCk7XG4gICAgICAgICAgICB0aGlzLnJhbmdlVmFsdWUuc2V0KG51bGwpO1xuICAgICAgICAgICAgdGhpcy5faGFzRm9ybWF0RXJyb3IgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMub25WYWxpZGF0b3JDaGFuZ2UoKTtcbiAgICAgICAgICAgIHRoaXMuX29uQ2hhbmdlKG51bGwpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlSW5wdXQodGhpcy5tb2RlKCksIHJhdywgdGhpcy5yYW5nZVNlcGFyYXRvcigpKTtcbiAgICAgICAgaWYgKHBhcnNlZCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5faGFzRm9ybWF0RXJyb3IgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5vblZhbGlkYXRvckNoYW5nZSgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2hhc0Zvcm1hdEVycm9yID0gZmFsc2U7XG4gICAgICAgIHRoaXMub25WYWxpZGF0b3JDaGFuZ2UoKTtcbiAgICAgICAgaWYgKHRoaXMuaXNEYXRlUmFuZ2UocGFyc2VkKSkge1xuICAgICAgICAgICAgdGhpcy5yYW5nZVZhbHVlLnNldChwYXJzZWQpO1xuICAgICAgICAgICAgdGhpcy5fb25DaGFuZ2UocGFyc2VkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGQgPSBwYXJzZWQgYXMgRGF0ZTtcbiAgICAgICAgICAgIHRoaXMudmFsdWUuc2V0KGQpO1xuICAgICAgICAgICAgdGhpcy52aWV3RGF0ZS5zZXQobmV3IERhdGUoZC5nZXRGdWxsWWVhcigpLCBkLmdldE1vbnRoKCksIDEpKTtcbiAgICAgICAgICAgIHRoaXMuaG91cnMuc2V0KGQuZ2V0SG91cnMoKSk7XG4gICAgICAgICAgICB0aGlzLm1pbnV0ZXMuc2V0KGQuZ2V0TWludXRlcygpKTtcbiAgICAgICAgICAgIHRoaXMuX29uQ2hhbmdlKGQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGhhbmRsZVRyaWdnZXJLZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmlzU2VnbWVudGVkTW9kZSgpICYmIGV2ZW50LnRhcmdldCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlU2VnbWVudGVkS2V5ZG93bihldmVudCwgZXZlbnQudGFyZ2V0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXZlbnQua2V5ID09PSAnRW50ZXInIHx8IGV2ZW50LmtleSA9PT0gJyAnKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdGhpcy5vcGVuKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogVGVjbGFzIHF1ZSBkZXZlbSBwYXNzYXIgZGlyZXRvIHBhcmEgbyBicm93c2VyIHNlbSBpbnNlcmlyL2FsdGVyYXIgbmFkYSBubyBjYW1wby4gKi9cbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBTRUdNRU5URURfUEFTU1RIUk9VR0hfS0VZUyA9IFsnSG9tZScsICdFbmQnLCAnU2hpZnQnLCAnQ2Fwc0xvY2snLCAnRXNjYXBlJywgJ0VudGVyJywgJyAnXTtcblxuICAgIC8qKiBEaWdpdGHDp8OjbyBwb3Igc2VnbWVudG8gKGRpYS9tw6pzL2Fuby9ob3JhL21pbnV0by9zZWd1bmRvL2FtcG0pIG5vIGlucHV0IGRvIHRyaWdnZXIuICovXG4gICAgcHJpdmF0ZSBoYW5kbGVTZWdtZW50ZWRLZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50LCBpbnB1dDogSFRNTElucHV0RWxlbWVudCk6IHZvaWQge1xuICAgICAgICB0aGlzLmVuc3VyZVNlZ21lbnRFbmdpbmVDb25maWd1cmVkKCk7XG4gICAgICAgIGNvbnN0IHsga2V5LCBjdHJsS2V5LCBtZXRhS2V5LCBhbHRLZXksIHNoaWZ0S2V5IH0gPSBldmVudDtcbiAgICAgICAgaWYgKGN0cmxLZXkgfHwgbWV0YUtleSB8fCBhbHRLZXkgfHwga2V5LnN0YXJ0c1dpdGgoJ0YnKSkgcmV0dXJuO1xuICAgICAgICBpZiAoRGF0ZXBpY2tlckNvbXBvbmVudC5TRUdNRU5URURfUEFTU1RIUk9VR0hfS0VZUy5pbmNsdWRlcyhrZXkpKSByZXR1cm47XG4gICAgICAgIHRoaXMuaW50ZXJhY3Rpb25HZW5lcmF0aW9uKys7XG5cbiAgICAgICAgaWYgKGtleSA9PT0gJ1RhYicpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuc2VnbWVudEVuZ2luZS5tb3ZlVG9BZGphY2VudFNlZ21lbnQoc2hpZnRLZXkgPyAtMSA6IDEpO1xuICAgICAgICAgICAgdGhpcy5zeW5jU2VnbWVudGVkSW5wdXQoaW5wdXQpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gJ21vdmVkJykge1xuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoa2V5ID09PSAnQXJyb3dMZWZ0JyB8fCBrZXkgPT09ICdBcnJvd1JpZ2h0Jykge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIC8vIEFvIGNvbnRyw6FyaW8gZG8gVGFiLCBzZXRhIG5vIHByaW1laXJvL8O6bHRpbW8gc2VnbWVudG8gbsOjbyBkZXZlIHNhaXIgZG8gY2FtcG8gbmVtXG4gICAgICAgICAgICAvLyBkZXNhdGl2YXIgYSBzZWxlw6fDo28g4oCUIGBtb3ZlVG9BZGphY2VudFNlZ21lbnRgIHplcmEgYGFjdGl2ZUluZGV4YCBhbyBiYXRlciBubyBsaW1pdGVcbiAgICAgICAgICAgIC8vIChjb21wb3J0YW1lbnRvIGNlcnRvIHBybyBUYWIgZXNjYXBhciBkbyBjYW1wbyksIGVudMOjbyBuYSBib3JkYSBhIGdlbnRlIHJlc2VsZWNpb25hXG4gICAgICAgICAgICAvLyBvIHNlZ21lbnRvIHF1ZSBqw6EgZXN0YXZhIGF0aXZvLCBpbWl0YW5kbyBvIGA8aW5wdXQgdHlwZT1cImRhdGVcIj5gIG5hdGl2byAoYSBzZXRhIHNvbWVcbiAgICAgICAgICAgIC8vIG5vIGxpbWl0ZSwgbsOjbyBuYXZlZ2EgcHJhIGZvcmEpLlxuICAgICAgICAgICAgY29uc3QgYmVmb3JlID0gdGhpcy5zZWdtZW50RW5naW5lLmdldEFjdGl2ZUluZGV4KCk7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLnNlZ21lbnRFbmdpbmUubW92ZVRvQWRqYWNlbnRTZWdtZW50KGtleSA9PT0gJ0Fycm93TGVmdCcgPyAtMSA6IDEpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gJ2JvdW5kYXJ5JyAmJiBiZWZvcmUgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlZ21lbnRFbmdpbmUuc2VsZWN0U2VnbWVudChiZWZvcmUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zeW5jU2VnbWVudGVkSW5wdXQoaW5wdXQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGtleSA9PT0gJ0Fycm93VXAnIHx8IGtleSA9PT0gJ0Fycm93RG93bicpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLnNlZ21lbnRFbmdpbmUuaW5jcmVtZW50QWN0aXZlU2VnbWVudChrZXkgPT09ICdBcnJvd1VwJyA/IDEgOiAtMSk7XG4gICAgICAgICAgICB0aGlzLnN5bmNTZWdtZW50ZWRJbnB1dChpbnB1dCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoa2V5ID09PSAnQmFja3NwYWNlJyB8fCBrZXkgPT09ICdEZWxldGUnKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgY29uc3QgaXNXaG9sZUZpZWxkU2VsZWN0ZWQgPSBpbnB1dC5zZWxlY3Rpb25TdGFydCA9PT0gMCAmJiBpbnB1dC5zZWxlY3Rpb25FbmQgPT09IGlucHV0LnZhbHVlLmxlbmd0aDtcbiAgICAgICAgICAgIGlmIChpc1dob2xlRmllbGRTZWxlY3RlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VnbWVudEVuZ2luZS5jbGVhckFsbCgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlZ21lbnRFbmdpbmUuY2xlYXJBY3RpdmVTZWdtZW50KGtleSA9PT0gJ0JhY2tzcGFjZScgPyAnYmFja3NwYWNlJyA6ICdkZWxldGUnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc3luY1NlZ21lbnRlZElucHV0KGlucHV0KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgvXlswLTldJC8udGVzdChrZXkpKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdGhpcy5zZWdtZW50RW5naW5lLnR5cGVEaWdpdChrZXkpO1xuICAgICAgICAgICAgdGhpcy5zeW5jU2VnbWVudGVkSW5wdXQoaW5wdXQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuc2VnbWVudEVuZ2luZS5hY3RpdmVLaW5kKCkgPT09ICdhbXBtJyAmJiAvXlthcEFQXSQvLnRlc3Qoa2V5KSkge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHRoaXMuc2VnbWVudEVuZ2luZS5zZXRBbVBtKGtleS50b0xvd2VyQ2FzZSgpID09PSAnYScgPyAwIDogMSk7XG4gICAgICAgICAgICB0aGlzLnN5bmNTZWdtZW50ZWRJbnB1dChpbnB1dCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBRdWFscXVlciBvdXRyYSB0ZWNsYSBpbXByaW3DrXZlbCAobGV0cmFzLCBzw61tYm9sb3MpIG7Do28gw6kgaW5zZXJpZGEgbm8gY2FtcG8uXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuXG4gICAgLyoqIFNpbmNyb25pemEgbyBET00gY29tIG8gZXN0YWRvIGF0dWFsIGRhIGVuZ2luZSAodmFsb3IgKyBzZWxlw6fDo28gZG8gc2VnbWVudG8gYXRpdm8pIGFww7NzIHVtYSBtdXRhw6fDo28uICovXG4gICAgcHJpdmF0ZSBzeW5jU2VnbWVudGVkSW5wdXQoaW5wdXQ6IEhUTUxJbnB1dEVsZW1lbnQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pbnB1dERhdGUgPSB0aGlzLnNlZ21lbnRFbmdpbmUuZ2V0RGlzcGxheVN0cmluZygpO1xuICAgICAgICBpbnB1dC52YWx1ZSA9IHRoaXMuaW5wdXREYXRlO1xuICAgICAgICB0aGlzLnNlbGVjdEFjdGl2ZVNlZ21lbnRSYW5nZShpbnB1dCk7XG4gICAgICAgIGlucHV0LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCdpbnB1dCcsIHsgYnViYmxlczogdHJ1ZSB9KSk7XG4gICAgICAgIHRoaXMuY29tbWl0U2VnbWVudGVkVmFsdWVJZkNvbXBsZXRlKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZWxlY3RBY3RpdmVTZWdtZW50UmFuZ2UoaW5wdXQ6IEhUTUxJbnB1dEVsZW1lbnQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLnNlZ21lbnRFbmdpbmUuZ2V0QWN0aXZlSW5kZXgoKTtcbiAgICAgICAgaWYgKGluZGV4ID09PSBudWxsKSByZXR1cm47XG4gICAgICAgIGNvbnN0IFtzdGFydCwgZW5kXSA9IHRoaXMuc2VnbWVudEVuZ2luZS5nZXRTZWdtZW50UmFuZ2UoaW5kZXgpO1xuICAgICAgICBpbnB1dC5zZXRTZWxlY3Rpb25SYW5nZShzdGFydCwgZW5kKTtcbiAgICB9XG5cbiAgICAvKiogUHJvcGFnYSBvIHZhbG9yIGRhIGVuZ2luZSBwYXJhIG8gbW9kZWxvIChDVkEpIGFzc2ltIHF1ZSB0b2RvcyBvcyBzZWdtZW50b3MgZXN0aXZlcmVtIGNvbXBsZXRvcy4gKi9cbiAgICBwcml2YXRlIGNvbW1pdFNlZ21lbnRlZFZhbHVlSWZDb21wbGV0ZSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLnNlZ21lbnRFbmdpbmUuaXNDb21wbGV0ZSgpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy52YWx1ZSgpICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy52YWx1ZS5zZXQobnVsbCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fb25DaGFuZ2UobnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYmFzZSA9XG4gICAgICAgICAgICB0aGlzLnZhbHVlKCkgPz9cbiAgICAgICAgICAgIG5ldyBEYXRlKFxuICAgICAgICAgICAgICAgIG5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKSxcbiAgICAgICAgICAgICAgICBuZXcgRGF0ZSgpLmdldE1vbnRoKCksXG4gICAgICAgICAgICAgICAgbmV3IERhdGUoKS5nZXREYXRlKCksXG4gICAgICAgICAgICAgICAgdGhpcy5ob3VycygpLFxuICAgICAgICAgICAgICAgIHRoaXMubWludXRlcygpLFxuICAgICAgICAgICAgICAgIHRoaXMuc2hvd1NlY29uZHMoKSA/IHRoaXMuc2Vjb25kcygpIDogMCxcbiAgICAgICAgICAgICk7XG4gICAgICAgIGNvbnN0IGRhdGUgPSB0aGlzLnNlZ21lbnRFbmdpbmUudG9EYXRlKGJhc2UpO1xuICAgICAgICBpZiAoIWRhdGUpIHJldHVybjtcbiAgICAgICAgdGhpcy52YWx1ZS5zZXQoZGF0ZSk7XG4gICAgICAgIGlmICh0aGlzLnNob3dDYWxlbmRhcigpKSB7XG4gICAgICAgICAgICB0aGlzLnZpZXdEYXRlLnNldChuZXcgRGF0ZShkYXRlLmdldEZ1bGxZZWFyKCksIGRhdGUuZ2V0TW9udGgoKSwgMSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnNob3dUaW1lUGlja2VyKCkpIHtcbiAgICAgICAgICAgIHRoaXMuaG91cnMuc2V0KGRhdGUuZ2V0SG91cnMoKSk7XG4gICAgICAgICAgICB0aGlzLm1pbnV0ZXMuc2V0KGRhdGUuZ2V0TWludXRlcygpKTtcbiAgICAgICAgICAgIHRoaXMuc2Vjb25kcy5zZXQoZGF0ZS5nZXRTZWNvbmRzKCkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX29uQ2hhbmdlKGRhdGUpO1xuICAgIH1cblxuICAgIC8vIOKUgOKUgCBOYXZpZ2F0aW9uIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gICAgcHJvdGVjdGVkIG5hdmlnYXRlUHJldigpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgdmlldyA9IHRoaXMudmlld0RhdGUoKTtcbiAgICAgICAgaWYgKHRoaXMucGlja2VyVmlldygpID09PSAneWVhcnMnKSB7XG4gICAgICAgICAgICB0aGlzLnZpZXdEYXRlLnNldChuZXcgRGF0ZSh2aWV3LmdldEZ1bGxZZWFyKCkgLSAxMCwgdmlldy5nZXRNb250aCgpLCAxKSk7XG4gICAgICAgICAgICB0aGlzLnllYXJDaGFuZ2UuZW1pdCh7IG1vbnRoOiB2aWV3LmdldE1vbnRoKCksIHllYXI6IHZpZXcuZ2V0RnVsbFllYXIoKSAtIDEwIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMucGlja2VyVmlldygpID09PSAnbW9udGhzJykge1xuICAgICAgICAgICAgdGhpcy52aWV3RGF0ZS5zZXQobmV3IERhdGUodmlldy5nZXRGdWxsWWVhcigpIC0gMSwgdmlldy5nZXRNb250aCgpLCAxKSk7XG4gICAgICAgICAgICB0aGlzLnllYXJDaGFuZ2UuZW1pdCh7IG1vbnRoOiB2aWV3LmdldE1vbnRoKCksIHllYXI6IHZpZXcuZ2V0RnVsbFllYXIoKSAtIDEgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBuZXdEYXRlID0gbmV3IERhdGUodmlldy5nZXRGdWxsWWVhcigpLCB2aWV3LmdldE1vbnRoKCkgLSAxLCAxKTtcbiAgICAgICAgICAgIHRoaXMudmlld0RhdGUuc2V0KG5ld0RhdGUpO1xuICAgICAgICAgICAgdGhpcy5tb250aENoYW5nZS5lbWl0KHsgbW9udGg6IG5ld0RhdGUuZ2V0TW9udGgoKSwgeWVhcjogbmV3RGF0ZS5nZXRGdWxsWWVhcigpIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIG5hdmlnYXRlTmV4dCgpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgdmlldyA9IHRoaXMudmlld0RhdGUoKTtcbiAgICAgICAgaWYgKHRoaXMucGlja2VyVmlldygpID09PSAneWVhcnMnKSB7XG4gICAgICAgICAgICB0aGlzLnZpZXdEYXRlLnNldChuZXcgRGF0ZSh2aWV3LmdldEZ1bGxZZWFyKCkgKyAxMCwgdmlldy5nZXRNb250aCgpLCAxKSk7XG4gICAgICAgICAgICB0aGlzLnllYXJDaGFuZ2UuZW1pdCh7IG1vbnRoOiB2aWV3LmdldE1vbnRoKCksIHllYXI6IHZpZXcuZ2V0RnVsbFllYXIoKSArIDEwIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMucGlja2VyVmlldygpID09PSAnbW9udGhzJykge1xuICAgICAgICAgICAgdGhpcy52aWV3RGF0ZS5zZXQobmV3IERhdGUodmlldy5nZXRGdWxsWWVhcigpICsgMSwgdmlldy5nZXRNb250aCgpLCAxKSk7XG4gICAgICAgICAgICB0aGlzLnllYXJDaGFuZ2UuZW1pdCh7IG1vbnRoOiB2aWV3LmdldE1vbnRoKCksIHllYXI6IHZpZXcuZ2V0RnVsbFllYXIoKSArIDEgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBuZXdEYXRlID0gbmV3IERhdGUodmlldy5nZXRGdWxsWWVhcigpLCB2aWV3LmdldE1vbnRoKCkgKyAxLCAxKTtcbiAgICAgICAgICAgIHRoaXMudmlld0RhdGUuc2V0KG5ld0RhdGUpO1xuICAgICAgICAgICAgdGhpcy5tb250aENoYW5nZS5lbWl0KHsgbW9udGg6IG5ld0RhdGUuZ2V0TW9udGgoKSwgeWVhcjogbmV3RGF0ZS5nZXRGdWxsWWVhcigpIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGhhbmRsZUNhbGVuZGFyR3JpZEtleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgQVJST1dTID0gWydBcnJvd0xlZnQnLCAnQXJyb3dSaWdodCcsICdBcnJvd1VwJywgJ0Fycm93RG93biddO1xuICAgICAgICBpZiAoIUFSUk9XUy5pbmNsdWRlcyhldmVudC5rZXkpKSByZXR1cm47XG5cbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICBjb25zdCBncmlkID0gZXZlbnQuY3VycmVudFRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgY29uc3QgYnV0dG9ucyA9IEFycmF5LmZyb20oZ3JpZC5xdWVyeVNlbGVjdG9yQWxsPEhUTUxCdXR0b25FbGVtZW50PignYnV0dG9uW3JvbGU9XCJncmlkY2VsbFwiXScpKTtcbiAgICAgICAgY29uc3QgY3VycmVudElkeCA9IGJ1dHRvbnMuaW5kZXhPZihldmVudC50YXJnZXQgYXMgSFRNTEJ1dHRvbkVsZW1lbnQpO1xuICAgICAgICBpZiAoY3VycmVudElkeCA9PT0gLTEpIHJldHVybjtcblxuICAgICAgICBsZXQgZGVsdGEgPSAwO1xuICAgICAgICBpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dSaWdodCcpIGRlbHRhID0gMTtcbiAgICAgICAgZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dMZWZ0JykgZGVsdGEgPSAtMTtcbiAgICAgICAgZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dEb3duJykgZGVsdGEgPSBEYXRlcGlja2VyQ29tcG9uZW50LkRBWVNfSU5fV0VFSztcbiAgICAgICAgZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dVcCcpIGRlbHRhID0gLURhdGVwaWNrZXJDb21wb25lbnQuREFZU19JTl9XRUVLO1xuXG4gICAgICAgIGNvbnN0IG5leHRJZHggPSBjdXJyZW50SWR4ICsgZGVsdGE7XG5cbiAgICAgICAgaWYgKG5leHRJZHggPCAwKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcmV2RGlzYWJsZWQoKSkgcmV0dXJuO1xuICAgICAgICAgICAgdGhpcy5uYXZpZ2F0ZVByZXYoKTtcbiAgICAgICAgICAgIGFmdGVyTmV4dFJlbmRlcihcbiAgICAgICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhbmVsID0gdGhpcy5wb3B1cFBhbmVsKCk/Lm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJ0bnMgPSBBcnJheS5mcm9tKFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFuZWw/LnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEJ1dHRvbkVsZW1lbnQ+KCdidXR0b25bcm9sZT1cImdyaWRjZWxsXCJdJykgPz8gW10sXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldElkeCA9IE1hdGgubWF4KDAsIGJ0bnMubGVuZ3RoICsgbmV4dElkeCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9XG4gICAgICAgICAgICAgICAgICAgICAgICBEYXRlcGlja2VyQ29tcG9uZW50LmZpbmRFbmFibGVkKGJ0bnMsIHRhcmdldElkeCwgLTEpID8/XG4gICAgICAgICAgICAgICAgICAgICAgICBEYXRlcGlja2VyQ29tcG9uZW50LmZpbmRFbmFibGVkKGJ0bnMsIHRhcmdldElkeCwgMSk7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldD8uZm9jdXMoKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHsgaW5qZWN0b3I6IHRoaXMuaW5qZWN0b3IgfSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobmV4dElkeCA+PSBidXR0b25zLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKHRoaXMubmV4dERpc2FibGVkKCkpIHJldHVybjtcbiAgICAgICAgICAgIHRoaXMubmF2aWdhdGVOZXh0KCk7XG4gICAgICAgICAgICBhZnRlck5leHRSZW5kZXIoXG4gICAgICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYW5lbCA9IHRoaXMucG9wdXBQYW5lbCgpPy5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBidG5zID0gQXJyYXkuZnJvbShcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhbmVsPy5xdWVyeVNlbGVjdG9yQWxsPEhUTUxCdXR0b25FbGVtZW50PignYnV0dG9uW3JvbGU9XCJncmlkY2VsbFwiXScpID8/IFtdLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXRJZHggPSBNYXRoLm1pbihuZXh0SWR4IC0gYnV0dG9ucy5sZW5ndGgsIGJ0bnMubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9XG4gICAgICAgICAgICAgICAgICAgICAgICBEYXRlcGlja2VyQ29tcG9uZW50LmZpbmRFbmFibGVkKGJ0bnMsIHRhcmdldElkeCwgMSkgPz9cbiAgICAgICAgICAgICAgICAgICAgICAgIERhdGVwaWNrZXJDb21wb25lbnQuZmluZEVuYWJsZWQoYnRucywgdGFyZ2V0SWR4LCAtMSk7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldD8uZm9jdXMoKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHsgaW5qZWN0b3I6IHRoaXMuaW5qZWN0b3IgfSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWJ1dHRvbnNbbmV4dElkeF0/LmRpc2FibGVkKSB7XG4gICAgICAgICAgICBidXR0b25zW25leHRJZHhdLmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBmaW5kRW5hYmxlZChcbiAgICAgICAgYnV0dG9uczogSFRNTEJ1dHRvbkVsZW1lbnRbXSxcbiAgICAgICAgc3RhcnRJZHg6IG51bWJlcixcbiAgICAgICAgZGlyZWN0aW9uOiAxIHwgLTEsXG4gICAgKTogSFRNTEJ1dHRvbkVsZW1lbnQgfCBudWxsIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0SWR4OyBpID49IDAgJiYgaSA8IGJ1dHRvbnMubGVuZ3RoOyBpICs9IGRpcmVjdGlvbikge1xuICAgICAgICAgICAgaWYgKCFidXR0b25zW2ldLmRpc2FibGVkKSByZXR1cm4gYnV0dG9uc1tpXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgc3dpdGNoVG9Nb250aHMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMucGlja2VyVmlldy5zZXQoJ21vbnRocycpO1xuICAgICAgICB0aGlzLmZvY3VzQmVzdENhbGVuZGFyVGFyZ2V0KCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGJhY2tUb0NhbGVuZGFyKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnBpY2tlclZpZXcuc2V0KCdjYWxlbmRhcicpO1xuICAgICAgICB0aGlzLmZvY3VzQmVzdENhbGVuZGFyVGFyZ2V0KCk7XG4gICAgfVxuXG4gICAgLy8g4pSA4pSAIFNlbGVjdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAgIHByb3RlY3RlZCBzZWxlY3REYXRlKGRheTogQ2FsZW5kYXJEYXkpOiB2b2lkIHtcbiAgICAgICAgaWYgKGRheS5pc0Rpc2FibGVkKSByZXR1cm47XG4gICAgICAgIGlmICh0aGlzLmlzTXVsdGlwbGVNb2RlKCkpIHtcbiAgICAgICAgICAgIHRoaXMudG9nZ2xlTXVsdGlwbGVEYXRlKGRheS5kYXRlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5tb2RlKCkgPT09ICdyYW5nZScpIHtcbiAgICAgICAgICAgIGNvbnN0IHBlbmRpbmcgPSB0aGlzLnBlbmRpbmdSYW5nZVN0YXJ0KCk7XG4gICAgICAgICAgICBpZiAoIXBlbmRpbmcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBlbmRpbmdSYW5nZVN0YXJ0LnNldChkYXkuZGF0ZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IFtzdGFydCwgZW5kXSA9XG4gICAgICAgICAgICAgICAgICAgIHBlbmRpbmcuZ2V0VGltZSgpIDw9IGRheS5kYXRlLmdldFRpbWUoKSA/IFtwZW5kaW5nLCBkYXkuZGF0ZV0gOiBbZGF5LmRhdGUsIHBlbmRpbmddO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJhbmdlOiBEYXRlUmFuZ2UgPSB7IHN0YXJ0LCBlbmQgfTtcbiAgICAgICAgICAgICAgICB0aGlzLnJhbmdlVmFsdWUuc2V0KHJhbmdlKTtcbiAgICAgICAgICAgICAgICB0aGlzLmlucHV0RGF0ZSA9IHRoaXMuZm9ybWF0Rm9yRGlzcGxheShyYW5nZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fb25DaGFuZ2UocmFuZ2UpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWQuZW1pdChyYW5nZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5jbG9zZVBhbmVsKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbmV3RGF0ZSA9IG5ldyBEYXRlKFxuICAgICAgICAgICAgZGF5LmRhdGUuZ2V0RnVsbFllYXIoKSxcbiAgICAgICAgICAgIGRheS5kYXRlLmdldE1vbnRoKCksXG4gICAgICAgICAgICBkYXkuZGF0ZS5nZXREYXRlKCksXG4gICAgICAgICAgICB0aGlzLmhvdXJzKCksXG4gICAgICAgICAgICB0aGlzLm1pbnV0ZXMoKSxcbiAgICAgICAgICAgIHRoaXMuc2hvd1NlY29uZHMoKSA/IHRoaXMuc2Vjb25kcygpIDogMCxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy52YWx1ZS5zZXQobmV3RGF0ZSk7XG4gICAgICAgIGlmICh0aGlzLm1vZGUoKSA9PT0gJ2RhdGUnKSB7XG4gICAgICAgICAgICB0aGlzLnNldERpc3BsYXlGb3IobmV3RGF0ZSk7XG4gICAgICAgICAgICB0aGlzLl9vbkNoYW5nZShuZXdEYXRlKTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWQuZW1pdChuZXdEYXRlKTtcbiAgICAgICAgICAgIHRoaXMuY2xvc2VQYW5lbCgpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMubW9kZSgpID09PSAnZGF0ZXRpbWUnKSB7XG4gICAgICAgICAgICB0aGlzLnNldERpc3BsYXlGb3IobmV3RGF0ZSk7XG4gICAgICAgICAgICB0aGlzLl9vbkNoYW5nZShuZXdEYXRlKTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWQuZW1pdChuZXdEYXRlKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmhpZGVPbkRhdGVUaW1lU2VsZWN0KCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNsb3NlUGFuZWwoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBBZGljaW9uYS9yZW1vdmUgdW1hIGRhdGEgZGEgc2VsZcOnw6NvIG3Dumx0aXBsYS4gTyBwYWluZWwgcGVybWFuZWNlIGFiZXJ0by4gKi9cbiAgICBwcml2YXRlIHRvZ2dsZU11bHRpcGxlRGF0ZShkYXRlOiBEYXRlKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBuZXcgRGF0ZShkYXRlLmdldEZ1bGxZZWFyKCksIGRhdGUuZ2V0TW9udGgoKSwgZGF0ZS5nZXREYXRlKCkpO1xuICAgICAgICBjb25zdCBleGlzdGluZyA9IHRoaXMubXVsdGlwbGVWYWx1ZXMoKTtcbiAgICAgICAgY29uc3QgaW5kZXggPSBleGlzdGluZy5maW5kSW5kZXgoKGQpID0+IGlzU2FtZURheShkLCBub3JtYWxpemVkKSk7XG4gICAgICAgIGNvbnN0IG5leHQgPVxuICAgICAgICAgICAgaW5kZXggPj0gMFxuICAgICAgICAgICAgICAgID8gZXhpc3RpbmcuZmlsdGVyKChfLCBpKSA9PiBpICE9PSBpbmRleClcbiAgICAgICAgICAgICAgICA6IFsuLi5leGlzdGluZywgbm9ybWFsaXplZF0uc29ydCgoYSwgYikgPT4gYS5nZXRUaW1lKCkgLSBiLmdldFRpbWUoKSk7XG4gICAgICAgIHRoaXMubXVsdGlwbGVWYWx1ZXMuc2V0KG5leHQpO1xuICAgICAgICB0aGlzLmlucHV0RGF0ZSA9IHRoaXMuZm9ybWF0Rm9yRGlzcGxheShuZXh0KTtcbiAgICAgICAgY29uc3QgZW1pdFZhbHVlID0gbmV4dC5sZW5ndGggPyBuZXh0IDogbnVsbDtcbiAgICAgICAgdGhpcy5vblZhbGlkYXRvckNoYW5nZSgpO1xuICAgICAgICB0aGlzLl9vbkNoYW5nZShlbWl0VmFsdWUpO1xuICAgICAgICB0aGlzLnNlbGVjdGVkLmVtaXQoZW1pdFZhbHVlKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgc2VsZWN0WWVhcih5ZWFyOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuaXNZZWFyRGlzYWJsZWQoeWVhcikpIHJldHVybjtcbiAgICAgICAgY29uc3QgbmV3RGF0ZSA9IG5ldyBEYXRlKHllYXIsIDAsIDEpO1xuICAgICAgICB0aGlzLnZhbHVlLnNldChuZXdEYXRlKTtcbiAgICAgICAgdGhpcy5pbnB1dERhdGUgPSB0aGlzLmZvcm1hdEZvckRpc3BsYXkobmV3RGF0ZSk7XG4gICAgICAgIHRoaXMuX29uQ2hhbmdlKG5ld0RhdGUpO1xuICAgICAgICB0aGlzLnNlbGVjdGVkLmVtaXQobmV3RGF0ZSk7XG4gICAgICAgIHRoaXMuY2xvc2VQYW5lbCgpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBzZWxlY3RNb250aChtb250aEluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuaXNNb250aERpc2FibGVkKG1vbnRoSW5kZXgpKSByZXR1cm47XG4gICAgICAgIGNvbnN0IHllYXIgPSB0aGlzLmN1cnJlbnRZZWFyKCk7XG4gICAgICAgIGNvbnN0IG5ld1ZpZXdEYXRlID0gbmV3IERhdGUoeWVhciwgbW9udGhJbmRleCwgMSk7XG4gICAgICAgIGlmICh0aGlzLm1vZGUoKSA9PT0gJ21vbnRoJykge1xuICAgICAgICAgICAgdGhpcy52YWx1ZS5zZXQobmV3Vmlld0RhdGUpO1xuICAgICAgICAgICAgdGhpcy5zZXREaXNwbGF5Rm9yKG5ld1ZpZXdEYXRlKTtcbiAgICAgICAgICAgIHRoaXMuX29uQ2hhbmdlKG5ld1ZpZXdEYXRlKTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWQuZW1pdChuZXdWaWV3RGF0ZSk7XG4gICAgICAgICAgICB0aGlzLmNsb3NlUGFuZWwoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudmlld0RhdGUuc2V0KG5ld1ZpZXdEYXRlKTtcbiAgICAgICAgICAgIHRoaXMucGlja2VyVmlldy5zZXQoJ2NhbGVuZGFyJyk7XG4gICAgICAgICAgICB0aGlzLmZvY3VzQmVzdENhbGVuZGFyVGFyZ2V0KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgc2VsZWN0VG9kYXkoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHRvZGF5ID0gbmV3IERhdGUoKTtcbiAgICAgICAgaWYgKCF0aGlzLmlzRGF0ZURpc2FibGVkKHRvZGF5KSkge1xuICAgICAgICAgICAgY29uc3QgY2FsRGF5OiBDYWxlbmRhckRheSA9IHtcbiAgICAgICAgICAgICAgICBkYXRlOiB0b2RheSxcbiAgICAgICAgICAgICAgICBkYXlPZk1vbnRoOiB0b2RheS5nZXREYXRlKCksXG4gICAgICAgICAgICAgICAgaXNDdXJyZW50TW9udGg6IHRydWUsXG4gICAgICAgICAgICAgICAgaXNUb2RheTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBpc1NlbGVjdGVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBpc0Rpc2FibGVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBpc1JhbmdlU3RhcnQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGlzUmFuZ2VFbmQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGlzSW5SYW5nZTogZmFsc2UsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5zZWxlY3REYXRlKGNhbERheSk7XG4gICAgICAgICAgICB0aGlzLnRvZGF5Q2xpY2suZW1pdCh0b2RheSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgY2xlYXJWYWx1ZShldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgICAgICB0aGlzLnZhbHVlLnNldChudWxsKTtcbiAgICAgICAgdGhpcy5ob3Vycy5zZXQoMCk7XG4gICAgICAgIHRoaXMubWludXRlcy5zZXQoMCk7XG4gICAgICAgIHRoaXMuc2Vjb25kcy5zZXQoMCk7XG4gICAgICAgIHRoaXMucmFuZ2VWYWx1ZS5zZXQobnVsbCk7XG4gICAgICAgIHRoaXMubXVsdGlwbGVWYWx1ZXMuc2V0KFtdKTtcbiAgICAgICAgdGhpcy5wZW5kaW5nUmFuZ2VTdGFydC5zZXQobnVsbCk7XG4gICAgICAgIHRoaXMuc2V0RGlzcGxheUZvcihudWxsKTtcbiAgICAgICAgdGhpcy5fb25DaGFuZ2UobnVsbCk7XG4gICAgICAgIHRoaXMuY2xlYXJDbGljay5lbWl0KGV2ZW50KTtcbiAgICAgICAgdGhpcy5jbG9zZVBhbmVsKCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGNvbmZpcm0oKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLnZhbHVlKCkgPz8gbmV3IERhdGUoKTtcbiAgICAgICAgY29uc3QgY29uZmlybWVkID0gbmV3IERhdGUoXG4gICAgICAgICAgICBjdXJyZW50LmdldEZ1bGxZZWFyKCksXG4gICAgICAgICAgICBjdXJyZW50LmdldE1vbnRoKCksXG4gICAgICAgICAgICBjdXJyZW50LmdldERhdGUoKSxcbiAgICAgICAgICAgIHRoaXMuaG91cnMoKSxcbiAgICAgICAgICAgIHRoaXMubWludXRlcygpLFxuICAgICAgICAgICAgdGhpcy5zaG93U2Vjb25kcygpID8gdGhpcy5zZWNvbmRzKCkgOiAwLFxuICAgICAgICApO1xuICAgICAgICB0aGlzLnZhbHVlLnNldChjb25maXJtZWQpO1xuICAgICAgICB0aGlzLnNldERpc3BsYXlGb3IoY29uZmlybWVkKTtcbiAgICAgICAgdGhpcy5fb25DaGFuZ2UoY29uZmlybWVkKTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZC5lbWl0KGNvbmZpcm1lZCk7XG4gICAgICAgIHRoaXMuY2xvc2VQYW5lbCgpO1xuICAgIH1cblxuICAgIC8vIOKUgOKUgCBUaW1lIHBpY2tlciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAgIHByb3RlY3RlZCBpbmNyZW1lbnRIb3VycygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5ob3Vycy5zZXQoKHRoaXMuaG91cnMoKSArIHRoaXMuc3RlcEhvdXIoKSkgJSB0aGlzLm1heEhvdXJzKTtcbiAgICAgICAgdGhpcy5zeW5jVGltZVRvVmFsdWUoKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZGVjcmVtZW50SG91cnMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaG91cnMuc2V0KCh0aGlzLmhvdXJzKCkgLSB0aGlzLnN0ZXBIb3VyKCkgKyB0aGlzLm1heEhvdXJzKSAlIHRoaXMubWF4SG91cnMpO1xuICAgICAgICB0aGlzLnN5bmNUaW1lVG9WYWx1ZSgpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBpbmNyZW1lbnRNaW51dGVzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLm1pbnV0ZXMuc2V0KCh0aGlzLm1pbnV0ZXMoKSArIHRoaXMubWludXRlU3RlcCgpKSAlIHRoaXMubWF4TWludXRlcyk7XG4gICAgICAgIHRoaXMuc3luY1RpbWVUb1ZhbHVlKCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGRlY3JlbWVudE1pbnV0ZXMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMubWludXRlcy5zZXQoKHRoaXMubWludXRlcygpIC0gdGhpcy5taW51dGVTdGVwKCkgKyB0aGlzLm1heE1pbnV0ZXMpICUgdGhpcy5tYXhNaW51dGVzKTtcbiAgICAgICAgdGhpcy5zeW5jVGltZVRvVmFsdWUoKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgaW5jcmVtZW50U2Vjb25kcygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZWNvbmRzLnNldCgodGhpcy5zZWNvbmRzKCkgKyB0aGlzLnN0ZXBTZWNvbmQoKSkgJSA2MCk7XG4gICAgICAgIHRoaXMuc3luY1RpbWVUb1ZhbHVlKCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGRlY3JlbWVudFNlY29uZHMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2Vjb25kcy5zZXQoKHRoaXMuc2Vjb25kcygpIC0gdGhpcy5zdGVwU2Vjb25kKCkgKyA2MCkgJSA2MCk7XG4gICAgICAgIHRoaXMuc3luY1RpbWVUb1ZhbHVlKCk7XG4gICAgfVxuXG4gICAgQG51bWVyaWNLZXlzT25seSgpXG4gICAgcHJvdGVjdGVkIGhhbmRsZUhvdXJzS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dVcCcpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLmluY3JlbWVudEhvdXJzKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dEb3duJykge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHRoaXMuZGVjcmVtZW50SG91cnMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIEBudW1lcmljS2V5c09ubHkoKVxuICAgIHByb3RlY3RlZCBoYW5kbGVNaW51dGVzS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dVcCcpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLmluY3JlbWVudE1pbnV0ZXMoKTtcbiAgICAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09ICdBcnJvd0Rvd24nKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdGhpcy5kZWNyZW1lbnRNaW51dGVzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBAbnVtZXJpY0tleXNPbmx5KClcbiAgICBwcm90ZWN0ZWQgaGFuZGxlU2Vjb25kc0tleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gJ0Fycm93VXAnKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdGhpcy5pbmNyZW1lbnRTZWNvbmRzKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dEb3duJykge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHRoaXMuZGVjcmVtZW50U2Vjb25kcygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGhhbmRsZUhvdXJzSW5wdXQoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHJhdyA9IChldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkudmFsdWU7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlSW50KHJhdywgMTApO1xuICAgICAgICBpZiAoaXNOYU4ocGFyc2VkKSkgcmV0dXJuO1xuICAgICAgICBpZiAodGhpcy5pczEySG91ckZvcm1hdCgpKSB7XG4gICAgICAgICAgICBjb25zdCBoYWxmID0gRGF0ZXBpY2tlckNvbXBvbmVudC5IT1VSU19QRVJfTUVSSURJRU07XG4gICAgICAgICAgICBjb25zdCBoMTIgPSBNYXRoLm1pbihoYWxmLCBNYXRoLm1heCgxLCBwYXJzZWQpKTtcbiAgICAgICAgICAgIGNvbnN0IGJhc2UgPSBoMTIgJSBoYWxmO1xuICAgICAgICAgICAgdGhpcy5ob3Vycy5zZXQodGhpcy5hbVBtKCkgPT09ICdQTScgPyBiYXNlICsgaGFsZiA6IGJhc2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5ob3Vycy5zZXQoTWF0aC5taW4odGhpcy5tYXhIb3VycyAtIDEsIE1hdGgubWF4KDAsIHBhcnNlZCkpKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnN5bmNUaW1lVG9WYWx1ZSgpO1xuICAgIH1cblxuICAgIC8qKiBBbHRlcm5hIGVudHJlIEFNIGUgUE0gc29tYW5kby9zdWJ0cmFpbmRvIDEyIGhvcmFzIGRhIGhvcmEgaW50ZXJuYS4gKi9cbiAgICBwcm90ZWN0ZWQgdG9nZ2xlQW1QbSgpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaGFsZiA9IERhdGVwaWNrZXJDb21wb25lbnQuSE9VUlNfUEVSX01FUklESUVNO1xuICAgICAgICB0aGlzLmhvdXJzLnNldCh0aGlzLmhvdXJzKCkgPCBoYWxmID8gdGhpcy5ob3VycygpICsgaGFsZiA6IHRoaXMuaG91cnMoKSAtIGhhbGYpO1xuICAgICAgICB0aGlzLnN5bmNUaW1lVG9WYWx1ZSgpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBoYW5kbGVNaW51dGVzSW5wdXQoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHJhdyA9IChldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkudmFsdWU7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlSW50KHJhdywgMTApO1xuICAgICAgICBpZiAoIWlzTmFOKHBhcnNlZCkpIHtcbiAgICAgICAgICAgIHRoaXMubWludXRlcy5zZXQoTWF0aC5taW4odGhpcy5tYXhNaW51dGVzIC0gMSwgTWF0aC5tYXgoMCwgcGFyc2VkKSkpO1xuICAgICAgICAgICAgdGhpcy5zeW5jVGltZVRvVmFsdWUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBoYW5kbGVTZWNvbmRzSW5wdXQoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHJhdyA9IChldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkudmFsdWU7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlSW50KHJhdywgMTApO1xuICAgICAgICBpZiAoIWlzTmFOKHBhcnNlZCkpIHtcbiAgICAgICAgICAgIHRoaXMuc2Vjb25kcy5zZXQoTWF0aC5taW4oNTksIE1hdGgubWF4KDAsIHBhcnNlZCkpKTtcbiAgICAgICAgICAgIHRoaXMuc3luY1RpbWVUb1ZhbHVlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgb25EYXlIb3ZlcihkYXRlOiBEYXRlIHwgbnVsbCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5tb2RlKCkgPT09ICdyYW5nZScpIHtcbiAgICAgICAgICAgIHRoaXMuaG92ZXJEYXRlLnNldChkYXRlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIOKUgOKUgCBIZWxwZXJzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gICAgcHJvdGVjdGVkIGlzRGF0ZURpc2FibGVkKGRhdGU6IERhdGUpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgbWluID0gdGhpcy5taW4oKTtcbiAgICAgICAgY29uc3QgbWF4ID0gdGhpcy5tYXgoKTtcbiAgICAgICAgaWYgKG1pbiAmJiBzdHJpcFRpbWUoZGF0ZSkgPCBzdHJpcFRpbWUobWluKSkgcmV0dXJuIHRydWU7XG4gICAgICAgIGlmIChtYXggJiYgc3RyaXBUaW1lKGRhdGUpID4gc3RyaXBUaW1lKG1heCkpIHJldHVybiB0cnVlO1xuICAgICAgICBjb25zdCBkaXNhYmxlZERheXMgPSB0aGlzLmRpc2FibGVkRGF5cygpO1xuICAgICAgICBpZiAoZGlzYWJsZWREYXlzLmxlbmd0aCAmJiBkaXNhYmxlZERheXMuaW5jbHVkZXMoZGF0ZS5nZXREYXkoKSkpIHJldHVybiB0cnVlO1xuICAgICAgICBjb25zdCBkaXNhYmxlZERhdGVzID0gdGhpcy5kaXNhYmxlZERhdGVzKCk7XG4gICAgICAgIGlmIChkaXNhYmxlZERhdGVzLmxlbmd0aCAmJiBkaXNhYmxlZERhdGVzLnNvbWUoKGQpID0+IGlzU2FtZURheShkLCBkYXRlKSkpIHJldHVybiB0cnVlO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGlzWWVhclNlbGVjdGVkKHllYXI6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMudmFsdWUoKTtcbiAgICAgICAgcmV0dXJuICEhc2VsZWN0ZWQgJiYgc2VsZWN0ZWQuZ2V0RnVsbFllYXIoKSA9PT0geWVhcjtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgaXNZZWFyRGlzYWJsZWQoeWVhcjogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IG1pbiA9IHRoaXMubWluKCk7XG4gICAgICAgIGNvbnN0IG1heCA9IHRoaXMubWF4KCk7XG4gICAgICAgIGlmIChtaW4gJiYgeWVhciA8IG1pbi5nZXRGdWxsWWVhcigpKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgaWYgKG1heCAmJiB5ZWFyID4gbWF4LmdldEZ1bGxZZWFyKCkpIHJldHVybiB0cnVlO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGlzQ3VycmVudFllYXIoeWVhcjogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB5ZWFyID09PSBuZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGlzTW9udGhTZWxlY3RlZChtb250aEluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWQgPSB0aGlzLnZhbHVlKCk7XG4gICAgICAgIHJldHVybiAhIXNlbGVjdGVkICYmIHNlbGVjdGVkLmdldE1vbnRoKCkgPT09IG1vbnRoSW5kZXggJiYgc2VsZWN0ZWQuZ2V0RnVsbFllYXIoKSA9PT0gdGhpcy5jdXJyZW50WWVhcigpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBpc01vbnRoRGlzYWJsZWQobW9udGhJbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHllYXIgPSB0aGlzLmN1cnJlbnRZZWFyKCk7XG4gICAgICAgIGNvbnN0IG1pbiA9IHRoaXMubWluKCk7XG4gICAgICAgIGNvbnN0IG1heCA9IHRoaXMubWF4KCk7XG4gICAgICAgIGlmIChtaW4gJiYgKHllYXIgPCBtaW4uZ2V0RnVsbFllYXIoKSB8fCAoeWVhciA9PT0gbWluLmdldEZ1bGxZZWFyKCkgJiYgbW9udGhJbmRleCA8IG1pbi5nZXRNb250aCgpKSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtYXggJiYgKHllYXIgPiBtYXguZ2V0RnVsbFllYXIoKSB8fCAoeWVhciA9PT0gbWF4LmdldEZ1bGxZZWFyKCkgJiYgbW9udGhJbmRleCA+IG1heC5nZXRNb250aCgpKSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcGFkVGltZSh2YWx1ZTogbnVtYmVyKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIFN0cmluZyh2YWx1ZSkucGFkU3RhcnQoMiwgJzAnKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZm9ybWF0RGF5QXJpYUxhYmVsKGRhdGU6IERhdGUpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gZGF0ZS50b0xvY2FsZURhdGVTdHJpbmcodGhpcy5jdXJyZW50TGFuZygpLCB7XG4gICAgICAgICAgICB3ZWVrZGF5OiAnbG9uZycsXG4gICAgICAgICAgICB5ZWFyOiAnbnVtZXJpYycsXG4gICAgICAgICAgICBtb250aDogJ2xvbmcnLFxuICAgICAgICAgICAgZGF5OiAnbnVtZXJpYycsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKiBGb3JtYXRhIG8gdmFsb3IgcGFyYSBleGliacOnw6NvIG5vIGlucHV0LCBhcGxpY2FuZG8gcmFuZ2VTZXBhcmF0b3IsIGRhdGVGb3JtYXQgZSBtdWx0aXBsZVNlcGFyYXRvci4gKi9cbiAgICBwcml2YXRlIGZvcm1hdEZvckRpc3BsYXkodmFsdWU6IERhdGUgfCBEYXRlUmFuZ2UgfCBEYXRlW10gfCBudWxsKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGZvcm1hdFZhbHVlRm9ySW5wdXQoXG4gICAgICAgICAgICB0aGlzLm1vZGUoKSxcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgdGhpcy5yYW5nZVNlcGFyYXRvcigpLFxuICAgICAgICAgICAgdGhpcy5yZXNvbHZlZERhdGVGb3JtYXQoKSxcbiAgICAgICAgICAgIHRoaXMubXVsdGlwbGVTZXBhcmF0b3IoKSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBdHVhbGl6YSBgaW5wdXREYXRlYCBhIHBhcnRpciBkZSB1bSB2YWxvciDDum5pY28sIHJvdGVhbmRvIHBlbGEgZW5naW5lIGRlIHNlZ21lbnRvc1xuICAgICAqIChkYXRlL21vbnRoL3RpbWUvZGF0ZXRpbWUpIG91IHBlbG8gZm9ybWF0YWRvciBsZWdhZG8gKHJhbmdlL3llYXIvbXVsdGlwbGUpLlxuICAgICAqL1xuICAgIHByaXZhdGUgc2V0RGlzcGxheUZvcih2YWx1ZTogRGF0ZSB8IG51bGwpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuaXNTZWdtZW50TW9kZUNhbmRpZGF0ZSgpKSB7XG4gICAgICAgICAgICB0aGlzLmVuc3VyZVNlZ21lbnRFbmdpbmVDb25maWd1cmVkKCk7XG4gICAgICAgICAgICB0aGlzLnNlZ21lbnRFbmdpbmUubG9hZEZyb21EYXRlKHZhbHVlKTtcbiAgICAgICAgICAgIHRoaXMuaW5wdXREYXRlID0gdmFsdWUgPyB0aGlzLnNlZ21lbnRFbmdpbmUuZ2V0RGlzcGxheVN0cmluZygpIDogJyc7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbnB1dERhdGUgPSB0aGlzLmZvcm1hdEZvckRpc3BsYXkodmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIChSZSljb25maWd1cmEgYSBlbmdpbmUgZGUgc2VnbWVudG9zIHF1YW5kbyBgbW9kZWAvYGRhdGVGb3JtYXRgL2Bob3VyRm9ybWF0YC9gc2hvd1NlY29uZHNgXG4gICAgICogbXVkYXJhbSBkZXNkZSBhIMO6bHRpbWEgY2hhbWFkYSwgcmVjYXJyZWdhbmRvIG8gdmFsb3IgYXR1YWwuIENoYW1hZG8gZGUgZm9ybWEgc8OtbmNyb25hIGFcbiAgICAgKiBwYXJ0aXIgZGUgdG9kbyBwb250byBkZSBlbnRyYWRhIHF1ZSB1c2EgYSBlbmdpbmUg4oCUIG7Do28gZGVwZW5kZSBkZSB1bSBgZWZmZWN0KClgIChxdWUgc8OzXG4gICAgICogcm9kYSBlbSB1bSBjaWNsbyBkZSBjaGFuZ2UgZGV0ZWN0aW9uLCB0YXJkZSBkZW1haXMgcGFyYSBsZWl0dXJhcy9lc2NyaXRhcyBpbWVkaWF0YXMpLlxuICAgICAqL1xuICAgIHByaXZhdGUgZW5zdXJlU2VnbWVudEVuZ2luZUNvbmZpZ3VyZWQoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG1vZGUgPSB0aGlzLm1vZGUoKTtcbiAgICAgICAgaWYgKG1vZGUgIT09ICdkYXRlJyAmJiBtb2RlICE9PSAnbW9udGgnICYmIG1vZGUgIT09ICd0aW1lJyAmJiBtb2RlICE9PSAnZGF0ZXRpbWUnKSByZXR1cm47XG4gICAgICAgIGNvbnN0IGNvbmZpZzogU2VnbWVudEVuZ2luZUNvbmZpZyA9IHtcbiAgICAgICAgICAgIG1vZGUsXG4gICAgICAgICAgICBkYXRlRm9ybWF0OiB0aGlzLnJlc29sdmVkRGF0ZUZvcm1hdCgpLFxuICAgICAgICAgICAgaG91ckZvcm1hdDogdGhpcy5yZXNvbHZlZEhvdXJGb3JtYXQoKSxcbiAgICAgICAgICAgIHNob3dTZWNvbmRzOiB0aGlzLnNob3dTZWNvbmRzKCksXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGxhc3QgPSB0aGlzLmxhc3RTZWdtZW50Q29uZmlnO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICBsYXN0ICYmXG4gICAgICAgICAgICBsYXN0Lm1vZGUgPT09IGNvbmZpZy5tb2RlICYmXG4gICAgICAgICAgICBsYXN0LmRhdGVGb3JtYXQgPT09IGNvbmZpZy5kYXRlRm9ybWF0ICYmXG4gICAgICAgICAgICBsYXN0LmhvdXJGb3JtYXQgPT09IGNvbmZpZy5ob3VyRm9ybWF0ICYmXG4gICAgICAgICAgICBsYXN0LnNob3dTZWNvbmRzID09PSBjb25maWcuc2hvd1NlY29uZHNcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5sYXN0U2VnbWVudENvbmZpZyA9IGNvbmZpZztcbiAgICAgICAgdGhpcy5zZWdtZW50RW5naW5lLmNvbmZpZ3VyZShjb25maWcpO1xuICAgICAgICB0aGlzLnNlZ21lbnRFbmdpbmUubG9hZEZyb21EYXRlKHRoaXMudmFsdWUoKSk7XG4gICAgfVxuXG4gICAgLyoqIFJldG9ybmEgYSB0cmFkdcOnw6NvIGRlIGBrZXlgLCBvdSBgZmFsbGJhY2tgIHF1YW5kbyBhIGNoYXZlIG7Do28gZXN0w6EgdHJhZHV6aWRhIChuZ3gtdHJhbnNsYXRlIHJldG9ybmEgYSBwcsOzcHJpYSBjaGF2ZSkuICovXG4gICAgcHJpdmF0ZSByZXNvbHZlVHJhbnNsYXRlZE9yRGVmYXVsdChrZXk6IHN0cmluZywgZmFsbGJhY2s6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IHRyYW5zbGF0ZWQgPSB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChrZXkpO1xuICAgICAgICBpZiAodHlwZW9mIHRyYW5zbGF0ZWQgIT09ICdzdHJpbmcnIHx8ICF0cmFuc2xhdGVkIHx8IHRyYW5zbGF0ZWQgPT09IGtleSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbGxiYWNrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cmFuc2xhdGVkO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3luY1RpbWVUb1ZhbHVlKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBkYXRlID0gdGhpcy52YWx1ZSgpID8/IG5ldyBEYXRlKCk7XG4gICAgICAgIGNvbnN0IG5ld0RhdGUgPSBuZXcgRGF0ZShcbiAgICAgICAgICAgIGRhdGUuZ2V0RnVsbFllYXIoKSxcbiAgICAgICAgICAgIGRhdGUuZ2V0TW9udGgoKSxcbiAgICAgICAgICAgIGRhdGUuZ2V0RGF0ZSgpLFxuICAgICAgICAgICAgdGhpcy5ob3VycygpLFxuICAgICAgICAgICAgdGhpcy5taW51dGVzKCksXG4gICAgICAgICAgICB0aGlzLnNob3dTZWNvbmRzKCkgPyB0aGlzLnNlY29uZHMoKSA6IDAsXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMudmFsdWUuc2V0KG5ld0RhdGUpO1xuICAgICAgICB0aGlzLnNldERpc3BsYXlGb3IobmV3RGF0ZSk7XG4gICAgICAgIGlmICh0aGlzLm1vZGUoKSA9PT0gJ3RpbWUnKSB7XG4gICAgICAgICAgICB0aGlzLl9vbkNoYW5nZShuZXdEYXRlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYnVpbGRDYWxlbmRhckRheShcbiAgICAgICAgZGF0ZTogRGF0ZSxcbiAgICAgICAgaXNDdXJyZW50TW9udGg6IGJvb2xlYW4sXG4gICAgICAgIHRvZGF5OiBEYXRlLFxuICAgICAgICBzZWxlY3RlZDogRGF0ZSB8IG51bGwsXG4gICAgICAgIHJhbmdlOiB7IHN0YXJ0OiBEYXRlIHwgbnVsbDsgZW5kOiBEYXRlIHwgbnVsbCB9LFxuICAgICAgICByYW5nZVN0YXJ0VGltZTogbnVtYmVyIHwgbnVsbCxcbiAgICAgICAgcmFuZ2VFbmRUaW1lOiBudW1iZXIgfCBudWxsLFxuICAgICk6IENhbGVuZGFyRGF5IHtcbiAgICAgICAgY29uc3QgaXNSYW5nZVN0YXJ0ID0gcmFuZ2Uuc3RhcnQgPyBpc1NhbWVEYXkoZGF0ZSwgcmFuZ2Uuc3RhcnQpIDogZmFsc2U7XG4gICAgICAgIGNvbnN0IGlzUmFuZ2VFbmQgPSByYW5nZS5lbmQgPyBpc1NhbWVEYXkoZGF0ZSwgcmFuZ2UuZW5kKSA6IGZhbHNlO1xuICAgICAgICBjb25zdCBkYXRlVGltZSA9IHN0cmlwVGltZShkYXRlKTtcbiAgICAgICAgY29uc3QgaXNJblJhbmdlID1cbiAgICAgICAgICAgIHJhbmdlU3RhcnRUaW1lICE9PSBudWxsICYmIHJhbmdlRW5kVGltZSAhPT0gbnVsbFxuICAgICAgICAgICAgICAgID8gZGF0ZVRpbWUgPiByYW5nZVN0YXJ0VGltZSAmJiBkYXRlVGltZSA8IHJhbmdlRW5kVGltZVxuICAgICAgICAgICAgICAgIDogZmFsc2U7XG4gICAgICAgIGNvbnN0IGlzU2VsZWN0ZWQgPSB0aGlzLmlzTXVsdGlwbGVNb2RlKClcbiAgICAgICAgICAgID8gdGhpcy5tdWx0aXBsZVZhbHVlcygpLnNvbWUoKGQpID0+IGlzU2FtZURheShkLCBkYXRlKSlcbiAgICAgICAgICAgIDogc2VsZWN0ZWRcbiAgICAgICAgICAgICAgPyBpc1NhbWVEYXkoZGF0ZSwgc2VsZWN0ZWQpXG4gICAgICAgICAgICAgIDogZmFsc2U7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkYXlPZk1vbnRoOiBkYXRlLmdldERhdGUoKSxcbiAgICAgICAgICAgIGlzVG9kYXk6IGlzU2FtZURheShkYXRlLCB0b2RheSksXG4gICAgICAgICAgICBpc1NlbGVjdGVkLFxuICAgICAgICAgICAgaXNEaXNhYmxlZDogdGhpcy5pc0RhdGVEaXNhYmxlZChkYXRlKSB8fCAoIWlzQ3VycmVudE1vbnRoICYmICF0aGlzLnNlbGVjdE90aGVyTW9udGhzKCkpLFxuICAgICAgICAgICAgZGF0ZSxcbiAgICAgICAgICAgIGlzQ3VycmVudE1vbnRoLFxuICAgICAgICAgICAgaXNSYW5nZVN0YXJ0LFxuICAgICAgICAgICAgaXNSYW5nZUVuZCxcbiAgICAgICAgICAgIGlzSW5SYW5nZSxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNvbXB1dGVWYWxpZGF0aW9uRXJyb3JzKHZhbHVlOiBEYXRlcGlja2VyVmFsdWUsIGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsIHtcbiAgICAgICAgaWYgKHRoaXMuX2hhc0Zvcm1hdEVycm9yKSByZXR1cm4geyBpbnZhbGlkRm9ybWF0OiB0cnVlIH07XG4gICAgICAgIGlmICghdmFsdWUgfHwgKEFycmF5LmlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmxlbmd0aCA9PT0gMCkpIHJldHVybiBWYWxpZGF0b3JzLm51bGxWYWxpZGF0b3IoY29udHJvbCk7XG4gICAgICAgIGNvbnN0IG1pbiA9IHRoaXMubWluKCk7XG4gICAgICAgIGNvbnN0IG1heCA9IHRoaXMubWF4KCk7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBkIG9mIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKG1pbiAmJiBzdHJpcFRpbWUoZCkgPCBzdHJpcFRpbWUobWluKSkgcmV0dXJuIHsgbWluOiB7IG1pbiwgYWN0dWFsOiBkIH0gfTtcbiAgICAgICAgICAgICAgICBpZiAobWF4ICYmIHN0cmlwVGltZShkKSA+IHN0cmlwVGltZShtYXgpKSByZXR1cm4geyBtYXg6IHsgbWF4LCBhY3R1YWw6IGQgfSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFZhbGlkYXRvcnMubnVsbFZhbGlkYXRvcihjb250cm9sKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pc0RhdGVSYW5nZSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZS5zdGFydCAmJiBtaW4gJiYgc3RyaXBUaW1lKHZhbHVlLnN0YXJ0KSA8IHN0cmlwVGltZShtaW4pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgbWluOiB7IG1pbiwgYWN0dWFsOiB2YWx1ZS5zdGFydCB9IH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodmFsdWUuZW5kICYmIG1heCAmJiBzdHJpcFRpbWUodmFsdWUuZW5kKSA+IHN0cmlwVGltZShtYXgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgbWF4OiB7IG1heCwgYWN0dWFsOiB2YWx1ZS5lbmQgfSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFZhbGlkYXRvcnMubnVsbFZhbGlkYXRvcihjb250cm9sKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkID0gdmFsdWUgYXMgRGF0ZTtcbiAgICAgICAgaWYgKHRoaXMubW9kZSgpID09PSAneWVhcicpIHtcbiAgICAgICAgICAgIGlmIChtaW4gJiYgZC5nZXRGdWxsWWVhcigpIDwgbWluLmdldEZ1bGxZZWFyKCkpIHJldHVybiB7IG1pbjogeyBtaW4sIGFjdHVhbDogZCB9IH07XG4gICAgICAgICAgICBpZiAobWF4ICYmIGQuZ2V0RnVsbFllYXIoKSA+IG1heC5nZXRGdWxsWWVhcigpKSByZXR1cm4geyBtYXg6IHsgbWF4LCBhY3R1YWw6IGQgfSB9O1xuICAgICAgICAgICAgcmV0dXJuIFZhbGlkYXRvcnMubnVsbFZhbGlkYXRvcihjb250cm9sKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWluICYmIHN0cmlwVGltZShkKSA8IHN0cmlwVGltZShtaW4pKSByZXR1cm4geyBtaW46IHsgbWluLCBhY3R1YWw6IGQgfSB9O1xuICAgICAgICBpZiAobWF4ICYmIHN0cmlwVGltZShkKSA+IHN0cmlwVGltZShtYXgpKSByZXR1cm4geyBtYXg6IHsgbWF4LCBhY3R1YWw6IGQgfSB9O1xuICAgICAgICByZXR1cm4gVmFsaWRhdG9ycy5udWxsVmFsaWRhdG9yKGNvbnRyb2wpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNEYXRlUmFuZ2UodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBEYXRlUmFuZ2Uge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCAmJiAnc3RhcnQnIGluIHZhbHVlICYmICdlbmQnIGluIHZhbHVlO1xuICAgIH1cbn1cblxuIiwiPGRpdlxuICAgIGNka092ZXJsYXlPcmlnaW5cbiAgICAjdHJpZ2dlcj1cImNka092ZXJsYXlPcmlnaW5cIlxuICAgIGNsYXNzPVwicmVsYXRpdmUgZmxleCB3LWZ1bGwgaXRlbXMtY2VudGVyXCJcbiAgICByb2xlPVwiY29tYm9ib3hcIlxuICAgIGFyaWEtaGFzcG9wdXA9XCJncmlkXCJcbiAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cImlzT3BlbigpXCJcbiAgICBbYXR0ci5hcmlhLWNvbnRyb2xzXT1cInBvcHVwSWQoKVwiXG4+XG4gICAgPGlucHV0XG4gICAgICAgICN0cmlnZ2VySW5wdXRcbiAgICAgICAgY2xhc3M9XCJoLVszNXB4XSB3LWZ1bGwgcm91bmRlZC1zbWFsbCBib3JkZXIgYm9yZGVyLXNvbGlkIGJvcmRlci1ncmF5c2NhbGUtMzAgcGwtMyB0ZXh0LXNtIG91dGxpbmUtbm9uZSB0cmFuc2l0aW9uLWNvbG9ycyBmb2N1czpib3JkZXItcHJpbWFyeVwiXG4gICAgICAgIFtjbGFzcy5wci0xMF09XCJzaG93SWNvbigpICYmICFzaG93Q2xlYXIoKVwiXG4gICAgICAgIFtjbGFzcy5wci0xNl09XCJzaG93SWNvbigpICYmIHNob3dDbGVhcigpXCJcbiAgICAgICAgW2NsYXNzLnByLTZdPVwiIXNob3dJY29uKCkgJiYgc2hvd0NsZWFyKClcIlxuICAgICAgICBbY2xhc3MuYmctZ3JheXNjYWxlLTBdPVwiIWRpc2FibGVkKClcIlxuICAgICAgICBbY2xhc3MudGV4dC1ncmF5c2NhbGUtOTBdPVwiIWRpc2FibGVkKClcIlxuICAgICAgICBbY2xhc3MuYm9yZGVyLWdyYXlzY2FsZS0yMF09XCJkaXNhYmxlZCgpXCJcbiAgICAgICAgW2NsYXNzLmJnLWdyYXlzY2FsZS01XT1cImRpc2FibGVkKClcIlxuICAgICAgICBbY2xhc3MudGV4dC1ncmF5c2NhbGUtMzBdPVwiZGlzYWJsZWQoKVwiXG4gICAgICAgIFtjbGFzcy5jdXJzb3Itbm90LWFsbG93ZWRdPVwiZGlzYWJsZWQoKVwiXG4gICAgICAgIFtpZF09XCJpbnB1dElkKClcIlxuICAgICAgICBbbmFtZV09XCJuYW1lKCkgPz8gaW5wdXRJZCgpXCJcbiAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXIoKSA/PyAocGxhY2Vob2xkZXJLZXkoKSB8IHRyYW5zbGF0ZSlcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWQoKVwiXG4gICAgICAgIFtyZWFkb25seV09XCJcbiAgICAgICAgICAgIHJlYWRvbmx5SW5wdXQoKSB8fFxuICAgICAgICAgICAgbW9kZSgpID09PSAncmFuZ2UnIHx8XG4gICAgICAgICAgICBtb2RlKCkgPT09ICd5ZWFyJyB8fFxuICAgICAgICAgICAgaXNNdWx0aXBsZU1vZGUoKSB8fFxuICAgICAgICAgICAgKGlzU2VnbWVudE1vZGVDYW5kaWRhdGUoKSAmJiBpc1RvdWNoRGV2aWNlKCkpXG4gICAgICAgIFwiXG4gICAgICAgIFt0YWJJbmRleF09XCJ0YWJpbmRleCgpID8/IG51bGxcIlxuICAgICAgICBbYXV0b2ZvY3VzXT1cImF1dG9mb2N1cygpXCJcbiAgICAgICAgWyhuZ01vZGVsKV09XCJpbnB1dERhdGVcIlxuICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJoYW5kbGVJbnB1dENoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgKGZvY3VzKT1cImhhbmRsZUlucHV0Rm9jdXMoJGV2ZW50KVwiXG4gICAgICAgIChibHVyKT1cImhhbmRsZUlucHV0Qmx1cigkZXZlbnQpXCJcbiAgICAgICAgKG1vdXNlZG93bik9XCJoYW5kbGVJbnB1dENsaWNrKCRldmVudClcIlxuICAgICAgICAoa2V5ZG93bik9XCJoYW5kbGVUcmlnZ2VyS2V5ZG93bigkZXZlbnQpXCJcbiAgICAgICAgKGlucHV0KT1cImhhbmRsZU5hdGl2ZUlucHV0KCRldmVudClcIlxuICAgICAgICBbYXR0ci5hcmlhLWludmFsaWRdPVwibmdDb250cm9sPy5jb250cm9sPy5pbnZhbGlkIHx8IG51bGxcIlxuICAgIC8+XG5cbiAgICBAaWYgKHNob3dDbGVhcigpICYmIGlucHV0RGF0ZSkge1xuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwiYWJzb2x1dGUgZmxleCBoLVszNXB4XSB3LTYgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHRleHQtZ3JheXNjYWxlLTYwIHRyYW5zaXRpb24tY29sb3JzIGhvdmVyOnRleHQtZ3JheXNjYWxlLTkwXCJcbiAgICAgICAgICAgIFtjbGFzcy5yaWdodC05XT1cInNob3dJY29uKClcIlxuICAgICAgICAgICAgW2NsYXNzLnJpZ2h0LTBdPVwiIXNob3dJY29uKClcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfY2xlYXInIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgIChjbGljayk9XCJjbGVhclZhbHVlKCRldmVudClcIlxuICAgICAgICA+XG4gICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZmFzIGZhLXRpbWVzIHRleHQteHNcIlxuICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICA+PC9pPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICB9XG5cbiAgICBAaWYgKHNob3dJY29uKCkpIHtcbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgI2ljb25CdXR0b25cbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3M9XCJhYnNvbHV0ZSByaWdodC0wIGZsZXggaC1bMzVweF0gdy05IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBib3JkZXItbCBib3JkZXItc29saWQgdHJhbnNpdGlvbi1jb2xvcnNcIlxuICAgICAgICAgICAgW2NsYXNzLmJvcmRlci1ncmF5c2NhbGUtMjBdPVwiZGlzYWJsZWQoKVwiXG4gICAgICAgICAgICBbY2xhc3MudGV4dC1ncmF5c2NhbGUtMzBdPVwiZGlzYWJsZWQoKVwiXG4gICAgICAgICAgICBbY2xhc3MuY3Vyc29yLW5vdC1hbGxvd2VkXT1cImRpc2FibGVkKClcIlxuICAgICAgICAgICAgW2NsYXNzLmJvcmRlci1ncmF5c2NhbGUtMzBdPVwiIWRpc2FibGVkKCkgJiYgIWlzRm9jdXNlZCgpXCJcbiAgICAgICAgICAgIFtjbGFzcy5ib3JkZXItcHJpbWFyeV09XCJpc0ZvY3VzZWQoKSAmJiAhZGlzYWJsZWQoKVwiXG4gICAgICAgICAgICBbY2xhc3MudGV4dC1ncmF5c2NhbGUtOTBdPVwiIWRpc2FibGVkKClcIlxuICAgICAgICAgICAgW2NsYXNzLmhvdmVyOmJnLWdyYXlzY2FsZS0xMF09XCIhZGlzYWJsZWQoKVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWQoKVwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9vcGVuJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlKClcIlxuICAgICAgICAgICAgKGtleWRvd24pPVwiaGFuZGxlVHJpZ2dlcktleWRvd24oJGV2ZW50KVwiXG4gICAgICAgID5cbiAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgW2NsYXNzXT1cInJlc29sdmVkSWNvbigpXCJcbiAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgPC9idXR0b24+XG4gICAgfVxuPC9kaXY+XG5cbjxuZy10ZW1wbGF0ZVxuICAgIGNka0Nvbm5lY3RlZE92ZXJsYXlcbiAgICBbY2RrQ29ubmVjdGVkT3ZlcmxheU9yaWdpbl09XCJ0cmlnZ2VyXCJcbiAgICBbY2RrQ29ubmVjdGVkT3ZlcmxheU9wZW5dPVwiaXNPcGVuKClcIlxuICAgIFtjZGtDb25uZWN0ZWRPdmVybGF5SGFzQmFja2Ryb3BdPVwidHJ1ZVwiXG4gICAgY2RrQ29ubmVjdGVkT3ZlcmxheUJhY2tkcm9wQ2xhc3M9XCJjZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcFwiXG4gICAgW2Nka0Nvbm5lY3RlZE92ZXJsYXlQb3NpdGlvbnNdPVwicG9zaXRpb25zXCJcbiAgICAoYmFja2Ryb3BDbGljayk9XCJoYW5kbGVCYWNrZHJvcENsaWNrKCRldmVudClcIlxuICAgIChvdmVybGF5S2V5ZG93bik9XCJoYW5kbGVPdmVybGF5S2V5ZG93bigkZXZlbnQpXCJcbiAgICAoZGV0YWNoKT1cImlzT3Blbi5zZXQoZmFsc2UpXCJcbj5cbiAgICA8ZGl2XG4gICAgICAgICNwb3B1cFBhbmVsXG4gICAgICAgIGNsYXNzPVwiei01MCB3LTcyIHJvdW5kZWQtbWVkaXVtIGJvcmRlciBib3JkZXItc29saWQgYm9yZGVyLWdyYXlzY2FsZS0zMCBiZy1ncmF5c2NhbGUtMCBzaGFkb3ctbWRcIlxuICAgICAgICByb2xlPVwiZGlhbG9nXCJcbiAgICAgICAgY2RrVHJhcEZvY3VzXG4gICAgICAgIFtpZF09XCJwb3B1cElkKClcIlxuICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImRpYWxvZ0FyaWFMYWJlbEtleSgpIHwgdHJhbnNsYXRlXCJcbiAgICA+XG4gICAgICAgIEBpZiAoc2hvd0NhbGVuZGFyKCkpIHtcbiAgICAgICAgICAgIEBpZiAocGlja2VyVmlldygpID09PSAnY2FsZW5kYXInKSB7XG4gICAgICAgICAgICAgICAgPCEtLSBDYWJlw6dhbGhvIGRlIG5hdmVnYcOnw6NvIG1lbnNhbCAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIGJvcmRlci1iIGJvcmRlci1zb2xpZCBib3JkZXItZ3JheXNjYWxlLTMwIHB4LTMgcHktMlwiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBoLTcgdy03IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciByb3VuZGVkLXNtYWxsIHRleHQtZ3JheXNjYWxlLTkwIHRyYW5zaXRpb24tY29sb3JzIGhvdmVyOmJnLWdyYXlzY2FsZS0xMCBkaXNhYmxlZDpjdXJzb3Itbm90LWFsbG93ZWQgZGlzYWJsZWQ6dGV4dC1ncmF5c2NhbGUtMzBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cInByZXZEaXNhYmxlZCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtZGlzYWJsZWRdPVwicHJldkRpc2FibGVkKCkgPyAndHJ1ZScgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX3ByZXZfbW9udGgnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJuYXZpZ2F0ZVByZXYoKVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmYXMgZmEtY2hldnJvbi1sZWZ0IHRleHQteHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTEgcm91bmRlZC1zbWFsbCBweC0yIHB5LTEgdGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LWdyYXlzY2FsZS05MCB0cmFuc2l0aW9uLWNvbG9ycyBob3ZlcjpiZy1ncmF5c2NhbGUtMTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfc2VsZWN0X21vbnRoX3llYXInIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzd2l0Y2hUb01vbnRocygpXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgY3VycmVudE1vbnRoS2V5KCkgfCB0cmFuc2xhdGUgfX0mbmJzcDt7eyBjdXJyZW50WWVhcigpIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmFzIGZhLWNoZXZyb24tZG93biB0ZXh0LVsxMHB4XVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGgtNyB3LTcgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHJvdW5kZWQtc21hbGwgdGV4dC1ncmF5c2NhbGUtOTAgdHJhbnNpdGlvbi1jb2xvcnMgaG92ZXI6YmctZ3JheXNjYWxlLTEwIGRpc2FibGVkOmN1cnNvci1ub3QtYWxsb3dlZCBkaXNhYmxlZDp0ZXh0LWdyYXlzY2FsZS0zMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwibmV4dERpc2FibGVkKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1kaXNhYmxlZF09XCJuZXh0RGlzYWJsZWQoKSA/ICd0cnVlJyA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfbmV4dF9tb250aCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm5hdmlnYXRlTmV4dCgpXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZhcyBmYS1jaGV2cm9uLXJpZ2h0IHRleHQteHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDwhLS0gQ2FiZcOnYWxob3MgZG9zIGRpYXMgZGEgc2VtYW5hIC0tPlxuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJncmlkIGdyaWQtY29scy03IHB4LTMgcHQtMlwiXG4gICAgICAgICAgICAgICAgICAgIHJvbGU9XCJyb3dcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgQGZvciAoZGF5S2V5IG9mIG9yZGVyZWRXZWVrRGF5S2V5cygpOyB0cmFjayBkYXlLZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggaC04IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciB0ZXh0LXhzIGZvbnQtbWVkaXVtIHRleHQtZ3JheXNjYWxlLTYwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2xlPVwiY29sdW1uaGVhZGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImRheUtleSB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZGF5S2V5IHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPCEtLSBHcmFkZSBkbyBjYWxlbmTDoXJpbyAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZ3JpZCBncmlkLWNvbHMtNyBweC0zIHBiLTJcIlxuICAgICAgICAgICAgICAgICAgICByb2xlPVwiZ3JpZFwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfY2FsZW5kYXJfbGFiZWwnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0cmFuc2xhdGU6IHsgbW9udGg6IChjdXJyZW50TW9udGhLZXkoKSB8IHRyYW5zbGF0ZSksIHllYXI6IGN1cnJlbnRZZWFyKCkgfVxuICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bik9XCJoYW5kbGVDYWxlbmRhckdyaWRLZXlkb3duKCRldmVudClcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgQGZvciAod2VlayBvZiBjYWxlbmRhcldlZWtzKCk7IHRyYWNrICRpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvbGU9XCJyb3dcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY29udGVudHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBmb3IgKGRheSBvZiB3ZWVrOyB0cmFjayBkYXkuZGF0ZS50b0lTT1N0cmluZygpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sZT1cImdyaWRjZWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBoLTggdy04IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciByb3VuZGVkLVs1MCVdIHRleHQtc20gZm9udC1ub3JtYWwgdHJhbnNpdGlvbi1jb2xvcnNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmludmlzaWJsZV09XCIhc2hvd090aGVyTW9udGhzKCkgJiYgIWRheS5pc0N1cnJlbnRNb250aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImZvcm1hdERheUFyaWFMYWJlbChkYXkuZGF0ZSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1zZWxlY3RlZF09XCJkYXkuaXNTZWxlY3RlZCB8fCBkYXkuaXNSYW5nZVN0YXJ0IHx8IGRheS5pc1JhbmdlRW5kIHx8IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1jdXJyZW50XT1cImRheS5pc1RvZGF5ID8gJ2RhdGUnIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cImRheS5pc0Rpc2FibGVkID8gJ3RydWUnIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWhpZGRlbl09XCIhc2hvd090aGVyTW9udGhzKCkgJiYgIWRheS5pc0N1cnJlbnRNb250aCA/ICd0cnVlJyA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS1mb2N1c109XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXkuaXNTZWxlY3RlZCB8fCBkYXkuaXNSYW5nZVN0YXJ0IHx8IGRheS5pc1JhbmdlRW5kXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJ3NlbGVjdGVkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGRheS5pc1RvZGF5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAndG9kYXknXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBudWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRheS5pc0Rpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYmctcHJpbWFyeSBmb250LXNlbWlib2xkIHRleHQtZ3JheXNjYWxlLTAnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXkuaXNTZWxlY3RlZCB8fCBkYXkuaXNSYW5nZVN0YXJ0IHx8IGRheS5pc1JhbmdlRW5kLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiZy1ncmF5c2NhbGUtMTAgaG92ZXI6YmctZ3JheXNjYWxlLTIwJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF5LmlzSW5SYW5nZSAmJiAhZGF5LmlzUmFuZ2VTdGFydCAmJiAhZGF5LmlzUmFuZ2VFbmQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RleHQtZ3JheXNjYWxlLTkwIGhvdmVyOmJnLWdyYXlzY2FsZS0xMCc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFkYXkuaXNTZWxlY3RlZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhZGF5LmlzUmFuZ2VTdGFydCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhZGF5LmlzUmFuZ2VFbmQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWRheS5pc0Rpc2FibGVkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRheS5pc0N1cnJlbnRNb250aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGV4dC1ncmF5c2NhbGUtNjAgaG92ZXI6YmctZ3JheXNjYWxlLTEwJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWRheS5pc1NlbGVjdGVkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFkYXkuaXNSYW5nZVN0YXJ0ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFkYXkuaXNSYW5nZUVuZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhZGF5LmlzRGlzYWJsZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWRheS5pc0N1cnJlbnRNb250aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncmluZy0yIHJpbmctaW5zZXQgcmluZy1wcmltYXJ5JzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF5LmlzVG9kYXkgJiYgIWRheS5pc1NlbGVjdGVkICYmICFkYXkuaXNSYW5nZVN0YXJ0ICYmICFkYXkuaXNSYW5nZUVuZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY3Vyc29yLW5vdC1hbGxvd2VkIHRleHQtZ3JheXNjYWxlLTMwJzogZGF5LmlzRGlzYWJsZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtb3VzZWVudGVyKT1cIm9uRGF5SG92ZXIoZGF5LmRhdGUpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtb3VzZWxlYXZlKT1cIm9uRGF5SG92ZXIobnVsbClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdERhdGUoZGF5KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGRheS5kYXlPZk1vbnRoIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIEBpZiAocGlja2VyVmlldygpID09PSAneWVhcnMnKSB7XG4gICAgICAgICAgICAgICAgPCEtLSBDYWJlw6dhbGhvIGRlIG5hdmVnYcOnw6NvIHBvciBkw6ljYWRhIC0tPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gYm9yZGVyLWIgYm9yZGVyLXNvbGlkIGJvcmRlci1ncmF5c2NhbGUtMzAgcHgtMyBweS0yXCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGgtNyB3LTcgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHJvdW5kZWQtc21hbGwgdGV4dC1ncmF5c2NhbGUtOTAgdHJhbnNpdGlvbi1jb2xvcnMgaG92ZXI6YmctZ3JheXNjYWxlLTEwIGRpc2FibGVkOmN1cnNvci1ub3QtYWxsb3dlZCBkaXNhYmxlZDp0ZXh0LWdyYXlzY2FsZS0zMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwicHJldkRpc2FibGVkKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1kaXNhYmxlZF09XCJwcmV2RGlzYWJsZWQoKSA/ICd0cnVlJyA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfcHJldl9kZWNhZGUnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJuYXZpZ2F0ZVByZXYoKVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmYXMgZmEtY2hldnJvbi1sZWZ0IHRleHQteHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtc20gZm9udC1tZWRpdW0gdGV4dC1ncmF5c2NhbGUtOTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPnt7IGN1cnJlbnREZWNhZGVTdGFydCgpIH19IOKAkyB7eyBjdXJyZW50RGVjYWRlU3RhcnQoKSArIDExIH19PC9zcGFuXG4gICAgICAgICAgICAgICAgICAgID5cblxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBoLTcgdy03IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciByb3VuZGVkLXNtYWxsIHRleHQtZ3JheXNjYWxlLTkwIHRyYW5zaXRpb24tY29sb3JzIGhvdmVyOmJnLWdyYXlzY2FsZS0xMCBkaXNhYmxlZDpjdXJzb3Itbm90LWFsbG93ZWQgZGlzYWJsZWQ6dGV4dC1ncmF5c2NhbGUtMzBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIm5leHREaXNhYmxlZCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtZGlzYWJsZWRdPVwibmV4dERpc2FibGVkKCkgPyAndHJ1ZScgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX25leHRfZGVjYWRlJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwibmF2aWdhdGVOZXh0KClcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmFzIGZhLWNoZXZyb24tcmlnaHQgdGV4dC14c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPCEtLSBHcmFkZSBkZSBhbm9zIC0tPlxuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJncmlkIGdyaWQtY29scy0zIGdhcC0yIHB4LTMgcHktM1wiXG4gICAgICAgICAgICAgICAgICAgIHJvbGU9XCJncmlkXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfc2VsZWN0X3llYXInIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIEBmb3IgKHJvdyBvZiB5ZWFyc0dyaWQoKTsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBAZm9yICh5ZWFyIG9mIHJvdzsgdHJhY2sgeWVhcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvbGU9XCJncmlkY2VsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBoLTkgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHJvdW5kZWQtc21hbGwgdGV4dC1zbSBmb250LW5vcm1hbCB0cmFuc2l0aW9uLWNvbG9yc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtc2VsZWN0ZWRdPVwiaXNZZWFyU2VsZWN0ZWQoeWVhcikgfHwgbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtZGlzYWJsZWRdPVwiaXNZZWFyRGlzYWJsZWQoeWVhcikgPyAndHJ1ZScgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1jdXJyZW50XT1cImlzQ3VycmVudFllYXIoeWVhcikgPyAnZGF0ZScgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS1mb2N1c109XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzWWVhclNlbGVjdGVkKHllYXIpID8gJ3NlbGVjdGVkJyA6IGlzQ3VycmVudFllYXIoeWVhcikgPyAndG9kYXknIDogbnVsbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNZZWFyRGlzYWJsZWQoeWVhcilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYmctcHJpbWFyeSBmb250LXNlbWlib2xkIHRleHQtZ3JheXNjYWxlLTAnOiBpc1llYXJTZWxlY3RlZCh5ZWFyKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyaW5nLTIgcmluZy1pbnNldCByaW5nLXByaW1hcnknOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQ3VycmVudFllYXIoeWVhcikgJiYgIWlzWWVhclNlbGVjdGVkKHllYXIpICYmICFpc1llYXJEaXNhYmxlZCh5ZWFyKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXh0LWdyYXlzY2FsZS05MCBob3ZlcjpiZy1ncmF5c2NhbGUtMTAnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFpc1llYXJTZWxlY3RlZCh5ZWFyKSAmJiAhaXNZZWFyRGlzYWJsZWQoeWVhciksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY3Vyc29yLW5vdC1hbGxvd2VkIHRleHQtZ3JheXNjYWxlLTMwJzogaXNZZWFyRGlzYWJsZWQoeWVhciksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0WWVhcih5ZWFyKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyB5ZWFyIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgQGlmIChwaWNrZXJWaWV3KCkgPT09ICdtb250aHMnKSB7XG4gICAgICAgICAgICAgICAgPCEtLSBDYWJlw6dhbGhvIGRlIG5hdmVnYcOnw6NvIGFudWFsIC0tPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gYm9yZGVyLWIgYm9yZGVyLXNvbGlkIGJvcmRlci1ncmF5c2NhbGUtMzAgcHgtMyBweS0yXCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGgtNyB3LTcgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHJvdW5kZWQtc21hbGwgdGV4dC1ncmF5c2NhbGUtOTAgdHJhbnNpdGlvbi1jb2xvcnMgaG92ZXI6YmctZ3JheXNjYWxlLTEwIGRpc2FibGVkOmN1cnNvci1ub3QtYWxsb3dlZCBkaXNhYmxlZDp0ZXh0LWdyYXlzY2FsZS0zMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwicHJldkRpc2FibGVkKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1kaXNhYmxlZF09XCJwcmV2RGlzYWJsZWQoKSA/ICd0cnVlJyA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfcHJldl95ZWFyJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwibmF2aWdhdGVQcmV2KClcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmFzIGZhLWNoZXZyb24tbGVmdCB0ZXh0LXhzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LXNtIGZvbnQtbWVkaXVtIHRleHQtZ3JheXNjYWxlLTkwXCI+e3sgY3VycmVudFllYXIoKSB9fTwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBoLTcgdy03IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciByb3VuZGVkLXNtYWxsIHRleHQtZ3JheXNjYWxlLTkwIHRyYW5zaXRpb24tY29sb3JzIGhvdmVyOmJnLWdyYXlzY2FsZS0xMCBkaXNhYmxlZDpjdXJzb3Itbm90LWFsbG93ZWQgZGlzYWJsZWQ6dGV4dC1ncmF5c2NhbGUtMzBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIm5leHREaXNhYmxlZCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtZGlzYWJsZWRdPVwibmV4dERpc2FibGVkKCkgPyAndHJ1ZScgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX25leHRfeWVhcicgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm5hdmlnYXRlTmV4dCgpXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZhcyBmYS1jaGV2cm9uLXJpZ2h0IHRleHQteHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDwhLS0gR3JhZGUgZGUgbWVzZXMgLS0+XG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImdyaWQgZ3JpZC1jb2xzLTMgZ2FwLTIgcHgtMyBweS0zXCJcbiAgICAgICAgICAgICAgICAgICAgcm9sZT1cImdyaWRcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9zZWxlY3RfbW9udGgnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIEBmb3IgKHJvdyBvZiBtb250aHNHcmlkKCk7IHRyYWNrICRpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgQGZvciAobW9udGggb2Ygcm93OyB0cmFjayBtb250aC5pbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvbGU9XCJncmlkY2VsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBoLTkgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHJvdW5kZWQtc21hbGwgdGV4dC1zbSBmb250LW5vcm1hbCB0cmFuc2l0aW9uLWNvbG9yc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtc2VsZWN0ZWRdPVwiaXNNb250aFNlbGVjdGVkKG1vbnRoLmluZGV4KSB8fCBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1kaXNhYmxlZF09XCJpc01vbnRoRGlzYWJsZWQobW9udGguaW5kZXgpID8gJ3RydWUnIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtZm9jdXNdPVwiaXNNb250aFNlbGVjdGVkKG1vbnRoLmluZGV4KSA/ICdzZWxlY3RlZCcgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzTW9udGhEaXNhYmxlZChtb250aC5pbmRleClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYmctcHJpbWFyeSBmb250LXNlbWlib2xkIHRleHQtZ3JheXNjYWxlLTAnOiBpc01vbnRoU2VsZWN0ZWQobW9udGguaW5kZXgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RleHQtZ3JheXNjYWxlLTkwIGhvdmVyOmJnLWdyYXlzY2FsZS0xMCc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWlzTW9udGhTZWxlY3RlZChtb250aC5pbmRleCkgJiYgIWlzTW9udGhEaXNhYmxlZChtb250aC5pbmRleCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY3Vyc29yLW5vdC1hbGxvd2VkIHRleHQtZ3JheXNjYWxlLTMwJzogaXNNb250aERpc2FibGVkKG1vbnRoLmluZGV4KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RNb250aChtb250aC5pbmRleClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgbW9udGgua2V5IHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIEBpZiAobW9kZSgpICE9PSAnbW9udGgnKSB7XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3JkZXItdCBib3JkZXItc29saWQgYm9yZGVyLWdyYXlzY2FsZS0zMCBweC0zIHB5LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0yIHJvdW5kZWQtc21hbGwgcHgtMiBweS0xIHRleHQtc20gdGV4dC1ncmF5c2NhbGUtOTAgdHJhbnNpdGlvbi1jb2xvcnMgaG92ZXI6YmctZ3JheXNjYWxlLTEwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYmFja1RvQ2FsZW5kYXIoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmYXMgZmEtYXJyb3ctbGVmdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfYmFja190b19jYWxlbmRhcicgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICA8IS0tIFRpbWUgcGlja2VyIC0tPlxuICAgICAgICBAaWYgKHNob3dUaW1lUGlja2VyKCkpIHtcbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIGdhcC0zIHB4LTQgcHktM1wiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmJvcmRlci10XT1cInNob3dDYWxlbmRhcigpXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuYm9yZGVyLXNvbGlkXT1cInNob3dDYWxlbmRhcigpXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuYm9yZGVyLWdyYXlzY2FsZS0zMF09XCJzaG93Q2FsZW5kYXIoKVwiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfc2VsZWN0X3RpbWUnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8IS0tIEhvcmFzIC0tPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGl0ZW1zLWNlbnRlciBnYXAtMVwiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAjaW5jcmVhc2VIb3VyQnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBoLTYgdy02IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciByb3VuZGVkLXNtYWxsIHRleHQtZ3JheXNjYWxlLTkwIHRyYW5zaXRpb24tY29sb3JzIGhvdmVyOmJnLWdyYXlzY2FsZS0xMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9pbmNyZW1lbnRfaG91cicgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImluY3JlbWVudEhvdXJzKClcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmFzIGZhLWNoZXZyb24tdXAgdGV4dC14c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0bW9kZT1cIm51bWVyaWNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIubWF4bGVuZ3RoXT1cInRpbWVJbnB1dE1heExlbmd0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImgtOSB3LTEyIHJvdW5kZWQtc21hbGwgYm9yZGVyIGJvcmRlci1zb2xpZCBib3JkZXItZ3JheXNjYWxlLTMwIGJnLWdyYXlzY2FsZS01IHRleHQtY2VudGVyIHRleHQtYmFzZSBmb250LW1lZGl1bSB0ZXh0LWdyYXlzY2FsZS05MCBvdXRsaW5lLW5vbmUgZm9jdXM6Ym9yZGVyLXByaW1hcnkgZm9jdXM6b3V0bGluZS0xIGZvY3VzOm91dGxpbmUtcHJpbWFyeVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwicGFkVGltZShkaXNwbGF5SG91cnMoKSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfaG91cicgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1saXZlPVwicG9saXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm49XCJbMC05XStcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwiaGFuZGxlSG91cnNLZXlkb3duKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJoYW5kbGVIb3Vyc0lucHV0KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBoLTYgdy02IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciByb3VuZGVkLXNtYWxsIHRleHQtZ3JheXNjYWxlLTkwIHRyYW5zaXRpb24tY29sb3JzIGhvdmVyOmJnLWdyYXlzY2FsZS0xMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9kZWNyZW1lbnRfaG91cicgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImRlY3JlbWVudEhvdXJzKClcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmFzIGZhLWNoZXZyb24tZG93biB0ZXh0LXhzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRleHQteGwgZm9udC1ib2xkIHRleHQtZ3JheXNjYWxlLTYwXCJcbiAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgPjo8L3NwYW5cbiAgICAgICAgICAgICAgICA+XG5cbiAgICAgICAgICAgICAgICA8IS0tIE1pbnV0b3MgLS0+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgaXRlbXMtY2VudGVyIGdhcC0xXCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGgtNiB3LTYgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHJvdW5kZWQtc21hbGwgdGV4dC1ncmF5c2NhbGUtOTAgdHJhbnNpdGlvbi1jb2xvcnMgaG92ZXI6YmctZ3JheXNjYWxlLTEwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX2luY3JlbWVudF9taW51dGUnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJpbmNyZW1lbnRNaW51dGVzKClcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmFzIGZhLWNoZXZyb24tdXAgdGV4dC14c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0bW9kZT1cIm51bWVyaWNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIubWF4bGVuZ3RoXT1cInRpbWVJbnB1dE1heExlbmd0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImgtOSB3LTEyIHJvdW5kZWQtc21hbGwgYm9yZGVyIGJvcmRlci1zb2xpZCBib3JkZXItZ3JheXNjYWxlLTMwIGJnLWdyYXlzY2FsZS01IHRleHQtY2VudGVyIHRleHQtYmFzZSBmb250LW1lZGl1bSB0ZXh0LWdyYXlzY2FsZS05MCBvdXRsaW5lLW5vbmUgZm9jdXM6Ym9yZGVyLXByaW1hcnkgZm9jdXM6b3V0bGluZS0xIGZvY3VzOm91dGxpbmUtcHJpbWFyeVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwicGFkVGltZShtaW51dGVzKCkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX21pbnV0ZScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1saXZlPVwicG9saXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm49XCJbMC05XStcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwiaGFuZGxlTWludXRlc0tleWRvd24oJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cImhhbmRsZU1pbnV0ZXNJbnB1dCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggaC02IHctNiBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcm91bmRlZC1zbWFsbCB0ZXh0LWdyYXlzY2FsZS05MCB0cmFuc2l0aW9uLWNvbG9ycyBob3ZlcjpiZy1ncmF5c2NhbGUtMTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfZGVjcmVtZW50X21pbnV0ZScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImRlY3JlbWVudE1pbnV0ZXMoKVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmYXMgZmEtY2hldnJvbi1kb3duIHRleHQteHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIEBpZiAoc2hvd1NlY29uZHMoKSkge1xuICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LXhsIGZvbnQtYm9sZCB0ZXh0LWdyYXlzY2FsZS02MFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPjo8L3NwYW5cbiAgICAgICAgICAgICAgICAgICAgPlxuXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gU2VndW5kb3MgLS0+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGl0ZW1zLWNlbnRlciBnYXAtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBoLTYgdy02IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciByb3VuZGVkLXNtYWxsIHRleHQtZ3JheXNjYWxlLTkwIHRyYW5zaXRpb24tY29sb3JzIGhvdmVyOmJnLWdyYXlzY2FsZS0xMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfaW5jcmVtZW50X3NlY29uZCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJpbmNyZW1lbnRTZWNvbmRzKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmFzIGZhLWNoZXZyb24tdXAgdGV4dC14c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0bW9kZT1cIm51bWVyaWNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLm1heGxlbmd0aF09XCJ0aW1lSW5wdXRNYXhMZW5ndGhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaC05IHctMTIgcm91bmRlZC1zbWFsbCBib3JkZXIgYm9yZGVyLXNvbGlkIGJvcmRlci1ncmF5c2NhbGUtMzAgYmctZ3JheXNjYWxlLTUgdGV4dC1jZW50ZXIgdGV4dC1iYXNlIGZvbnQtbWVkaXVtIHRleHQtZ3JheXNjYWxlLTkwIG91dGxpbmUtbm9uZSBmb2N1czpib3JkZXItcHJpbWFyeSBmb2N1czpvdXRsaW5lLTEgZm9jdXM6b3V0bGluZS1wcmltYXJ5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwicGFkVGltZShzZWNvbmRzKCkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9zZWNvbmQnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWxpdmU9XCJwb2xpdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm49XCJbMC05XStcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duKT1cImhhbmRsZVNlY29uZHNLZXlkb3duKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwiaGFuZGxlU2Vjb25kc0lucHV0KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggaC02IHctNiBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcm91bmRlZC1zbWFsbCB0ZXh0LWdyYXlzY2FsZS05MCB0cmFuc2l0aW9uLWNvbG9ycyBob3ZlcjpiZy1ncmF5c2NhbGUtMTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX2RlY3JlbWVudF9zZWNvbmQnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGVjcmVtZW50U2Vjb25kcygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZhcyBmYS1jaGV2cm9uLWRvd24gdGV4dC14c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBAaWYgKGlzMTJIb3VyRm9ybWF0KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBTZWxldG9yIEFNL1BNIC0tPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBoLTkgdy0xMiBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcm91bmRlZC1zbWFsbCBib3JkZXIgYm9yZGVyLXNvbGlkIGJvcmRlci1ncmF5c2NhbGUtMzAgYmctZ3JheXNjYWxlLTUgdGV4dC1iYXNlIGZvbnQtbWVkaXVtIHRleHQtZ3JheXNjYWxlLTkwIHRyYW5zaXRpb24tY29sb3JzIGhvdmVyOmJnLWdyYXlzY2FsZS0xMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl90b2dnbGVfbWVyaWRpZW0nIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtbGl2ZT1cInBvbGl0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlQW1QbSgpXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgYW1QbSgpIH19XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG5cbiAgICAgICAgPCEtLSBSb2RhcMOpIGRlIGHDp8O1ZXMgLS0+XG4gICAgICAgIEBpZiAoc2hvd0J1dHRvbkJhcigpIHx8IG1vZGUoKSA9PT0gJ2RhdGV0aW1lJyB8fCBtb2RlKCkgPT09ICd0aW1lJykge1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBib3JkZXItdCBib3JkZXItc29saWQgYm9yZGVyLWdyYXlzY2FsZS0zMCBweC0zIHB5LTJcIj5cbiAgICAgICAgICAgICAgICBAaWYgKHNob3dCdXR0b25CYXIoKSkge1xuICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChtb2RlKCkgPT09ICdkYXRlJyB8fCBtb2RlKCkgPT09ICdkYXRldGltZScgfHwgbW9kZSgpID09PSAncmFuZ2UnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJyb3VuZGVkLXNtYWxsIHB4LTIgcHktMSB0ZXh0LXNtIHRleHQtZ3JheXNjYWxlLTkwIHRyYW5zaXRpb24tY29sb3JzIGhvdmVyOmJnLWdyYXlzY2FsZS0xMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RUb2RheSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7ICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl90b2RheScgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZ2FwLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInJvdW5kZWQtc21hbGwgcHgtMiBweS0xIHRleHQtc20gdGV4dC1ncmF5c2NhbGUtOTAgdHJhbnNpdGlvbi1jb2xvcnMgaG92ZXI6YmctZ3JheXNjYWxlLTEwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2xlYXJWYWx1ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfY2xlYXInIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChtb2RlKCkgPT09ICdkYXRldGltZScgfHwgbW9kZSgpID09PSAndGltZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInJvdW5kZWQtc21hbGwgYmctcHJpbWFyeSBweC0zIHB5LTEgdGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LWdyYXlzY2FsZS0wIHRyYW5zaXRpb24tY29sb3JzIGhvdmVyOm9wYWNpdHktOTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY29uZmlybSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7ICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9jb25maXJtJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgPGRpdj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAobW9kZSgpID09PSAnZGF0ZXRpbWUnIHx8IG1vZGUoKSA9PT0gJ3RpbWUnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJyb3VuZGVkLXNtYWxsIGJnLXByaW1hcnkgcHgtMyBweS0xIHRleHQtc20gZm9udC1tZWRpdW0gdGV4dC1ncmF5c2NhbGUtMCB0cmFuc2l0aW9uLWNvbG9ycyBob3ZlcjpvcGFjaXR5LTkwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNvbmZpcm0oKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfY29uZmlybScgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbiJdfQ==
1475
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXBpY2tlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLWNvbXBvbmVudHMvZGF0ZXBpY2tlci9zcmMvbGliL2RhdGVwaWNrZXIvZGF0ZXBpY2tlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLWNvbXBvbmVudHMvZGF0ZXBpY2tlci9zcmMvbGliL2RhdGVwaWNrZXIvZGF0ZXBpY2tlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxnQkFBZ0IsRUFBcUIsTUFBTSxzQkFBc0IsQ0FBQztBQUNoRyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxFQUNILGVBQWUsRUFDZixTQUFTLEVBQ1QsUUFBUSxFQUNSLFVBQVUsRUFDVixVQUFVLEVBQ1YsTUFBTSxFQUNOLFFBQVEsRUFDUixLQUFLLEVBQ0wsS0FBSyxFQUVMLE1BQU0sRUFDTixNQUFNLEVBQ04sU0FBUyxHQUNaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2hFLE9BQU8sRUFHSCxXQUFXLEVBQ1gsYUFBYSxFQUNiLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsbUJBQW1CLEVBR25CLFVBQVUsR0FDYixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBRSxlQUFlLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN4RSxPQUFPLEVBQUUsaUJBQWlCLEVBQXVCLE1BQU0sc0JBQXNCLENBQUM7QUFDOUUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLE1BQU0s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ZDt3QkFDRDs0QkFDSSxPQUFPLEVBQUUsYUFBYTs0QkFDdEIsV0FBVyxxQkFBcUI7NEJBQ2hDLEtBQUssRUFBRSxJQUFJO3lCQUNkO3FCQUNKO3dEQTJ5Q1Msa0JBQWtCLE1BV2xCLG9CQUFvQixNQVdwQixvQkFBb0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDZGtUcmFwRm9jdXMgfSBmcm9tICdAYW5ndWxhci9jZGsvYTExeSc7XG5pbXBvcnQgeyBDZGtDb25uZWN0ZWRPdmVybGF5LCBDZGtPdmVybGF5T3JpZ2luLCBDb25uZWN0ZWRQb3NpdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcbmltcG9ydCB7IE5nQ2xhc3MgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgICBhZnRlck5leHRSZW5kZXIsXG4gICAgQ29tcG9uZW50LFxuICAgIGNvbXB1dGVkLFxuICAgIERlc3Ryb3lSZWYsXG4gICAgRWxlbWVudFJlZixcbiAgICBpbmplY3QsXG4gICAgSW5qZWN0b3IsXG4gICAgaW5wdXQsXG4gICAgbW9kZWwsXG4gICAgT25Jbml0LFxuICAgIG91dHB1dCxcbiAgICBzaWduYWwsXG4gICAgdmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7XG4gICAgQWJzdHJhY3RDb250cm9sLFxuICAgIENvbnRyb2xWYWx1ZUFjY2Vzc29yLFxuICAgIEZvcm1zTW9kdWxlLFxuICAgIE5HX1ZBTElEQVRPUlMsXG4gICAgTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgTmdDb250cm9sLFxuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgVmFsaWRhdGlvbkVycm9ycyxcbiAgICBWYWxpZGF0b3IsXG4gICAgVmFsaWRhdG9ycyxcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlLCBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBEYXRlU2VnbWVudEVuZ2luZSwgU2VnbWVudEVuZ2luZUNvbmZpZyB9IGZyb20gJy4vZGF0ZS1zZWdtZW50LWlucHV0JztcbmltcG9ydCB7IGZvcm1hdFZhbHVlRm9ySW5wdXQsIGlzU2FtZURheSwgcGFyc2VJbnB1dCwgc3RyaXBUaW1lIH0gZnJvbSAnLi9kYXRlLnV0aWxzJztcbmltcG9ydCB0eXBlIHsgQ2FsZW5kYXJEYXksIERhdGVQaWNrZXJNb2RlLCBEYXRlUmFuZ2UgfSBmcm9tICcuL21vZGVscyc7XG5cbnR5cGUgRGF0ZXBpY2tlclZhbHVlID0gRGF0ZSB8IERhdGVSYW5nZSB8IERhdGVbXSB8IG51bGw7XG50eXBlIFBpY2tlclZpZXcgPSAnY2FsZW5kYXInIHwgJ21vbnRocycgfCAneWVhcnMnO1xuXG5mdW5jdGlvbiBudW1lcmljS2V5c09ubHkoKTogTWV0aG9kRGVjb3JhdG9yIHtcbiAgICByZXR1cm4gKF90YXJnZXQsIF9rZXksIGRlc2NyaXB0b3I6IFByb3BlcnR5RGVzY3JpcHRvcikgPT4ge1xuICAgICAgICBjb25zdCBvcmlnaW5hbDogKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiB2b2lkID0gZGVzY3JpcHRvci52YWx1ZTtcbiAgICAgICAgZGVzY3JpcHRvci52YWx1ZSA9IGZ1bmN0aW9uICh0aGlzOiB1bmtub3duLCBldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICAgICAgY29uc3QgaXNWYWxpZEtleSA9XG4gICAgICAgICAgICAgICAgWydBcnJvd1VwJywgJ0Fycm93RG93bicsICdCYWNrc3BhY2UnLCAnRGVsZXRlJywgJ1RhYiddLmluY2x1ZGVzKGV2ZW50LmtleSkgfHwgL15cXGQkLy50ZXN0KGV2ZW50LmtleSk7XG4gICAgICAgICAgICBpZiAoIWlzVmFsaWRLZXkpIHtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBvcmlnaW5hbC5jYWxsKHRoaXMsIGV2ZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3I7XG4gICAgfTtcbn1cblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdzLWRhdGVwaWNrZXInLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaW1wb3J0czogW1xuICAgICAgICBOZ0NsYXNzLFxuICAgICAgICBUcmFuc2xhdGVNb2R1bGUsXG4gICAgICAgIENka1RyYXBGb2N1cyxcbiAgICAgICAgQ2RrT3ZlcmxheU9yaWdpbixcbiAgICAgICAgQ2RrQ29ubmVjdGVkT3ZlcmxheSxcbiAgICAgICAgRm9ybXNNb2R1bGUsXG4gICAgICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgXSxcbiAgICB0ZW1wbGF0ZVVybDogJy4vZGF0ZXBpY2tlci5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVzOiBbXG4gICAgICAgIGBcbiAgICAgICAgICAgIDpob3N0IHtcbiAgICAgICAgICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICAgICAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICA6aG9zdC5uZy1pbnZhbGlkLm5nLWRpcnR5IGlucHV0IHtcbiAgICAgICAgICAgICAgICBib3JkZXItY29sb3I6ICNjMTMwMTg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICA6aG9zdC5uZy1pbnZhbGlkLm5nLWRpcnR5IGlucHV0OmZvY3VzIHtcbiAgICAgICAgICAgICAgICBib3JkZXItY29sb3I6ICNjMTMwMTg7XG4gICAgICAgICAgICAgICAgb3V0bGluZS1jb2xvcjogI2MxMzAxODtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDpob3N0Lm5nLWludmFsaWQubmctZGlydHkgYnV0dG9uW3R5cGU9J2J1dHRvbiddIHtcbiAgICAgICAgICAgICAgICBib3JkZXItY29sb3I6ICNjMTMwMTg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICA6aG9zdC5uby1pY29uIGJ1dHRvblt0eXBlPSdidXR0b24nXSB7XG4gICAgICAgICAgICAgICAgZGlzcGxheTogbm9uZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDpob3N0Lm5vLWljb24gaW5wdXQge1xuICAgICAgICAgICAgICAgIHBhZGRpbmctcmlnaHQ6IDAuNzVyZW07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBidXR0b25bdHlwZT0nYnV0dG9uJ106Zm9jdXMtdmlzaWJsZSB7XG4gICAgICAgICAgICAgICAgb3V0bGluZTogMnB4IHNvbGlkICM0MjhiY2E7XG4gICAgICAgICAgICAgICAgb3V0bGluZS1vZmZzZXQ6IDFweDtcbiAgICAgICAgICAgICAgICBib3JkZXItcmFkaXVzOiBpbmhlcml0O1xuICAgICAgICAgICAgfVxuICAgICAgICBgLFxuICAgIF0sXG4gICAgaG9zdDoge1xuICAgICAgICAnW2NsYXNzLm5vLWljb25dJzogJyFzaG93SWNvbigpJyxcbiAgICB9LFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBEYXRlcGlja2VyQ29tcG9uZW50LFxuICAgICAgICAgICAgbXVsdGk6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIHByb3ZpZGU6IE5HX1ZBTElEQVRPUlMsXG4gICAgICAgICAgICB1c2VFeGlzdGluZzogRGF0ZXBpY2tlckNvbXBvbmVudCxcbiAgICAgICAgICAgIG11bHRpOiB0cnVlLFxuICAgICAgICB9LFxuICAgIF0sXG59KVxuZXhwb3J0IGNsYXNzIERhdGVwaWNrZXJDb21wb25lbnQgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciwgVmFsaWRhdG9yLCBPbkluaXQge1xuICAgIHByaXZhdGUgc3RhdGljIGlkQ291bnRlciA9IDA7XG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgREFZU19JTl9XRUVLID0gNztcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBNT05USFNfSU5fWUVBUiA9IDEyO1xuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IE1PTlRIU19QRVJfUk9XID0gMztcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBZRUFSU19QRVJfR1JJRCA9IDEyO1xuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFlFQVJTX1BFUl9ST1cgPSAzO1xuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IERFRkFVTFRfTUlOVVRFX1NURVAgPSA1O1xuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IE1BWF9IT1VSUyA9IDI0O1xuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IE1BWF9NSU5VVEVTID0gNjA7XG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgSE9VUlNfUEVSX01FUklESUVNID0gMTI7XG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgRE9VQkxFX0NMSUNLX1RIUkVTSE9MRF9NUyA9IDQwMDtcblxuICAgIHByaXZhdGUgc3RhdGljIG5leHRJZCgpOiBzdHJpbmcge1xuICAgICAgICBEYXRlcGlja2VyQ29tcG9uZW50LmlkQ291bnRlcisrO1xuICAgICAgICByZXR1cm4gYHMtZGF0ZXBpY2tlci0ke0RhdGVwaWNrZXJDb21wb25lbnQuaWRDb3VudGVyfWA7XG4gICAgfVxuXG4gICAgLy8g4pSA4pSAIElucHV0cyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAgIC8qKiBIVE1MIGBpZGAgYXBsaWNhZG8gYW8gZWxlbWVudG8gYDxpbnB1dD5gLiBBdXRvLWdlcmFkbyBxdWFuZG8gb21pdGlkby4gKi9cbiAgICByZWFkb25seSBpbnB1dElkID0gaW5wdXQ8c3RyaW5nPihEYXRlcGlja2VyQ29tcG9uZW50Lm5leHRJZCgpKTtcblxuICAgIC8qKiBBdHJpYnV0byBgbmFtZWAgZG8gYDxpbnB1dD5gIG5hdGl2by4gKi9cbiAgICByZWFkb25seSBuYW1lID0gaW5wdXQ8c3RyaW5nPigpO1xuXG4gICAgLyoqIFRleHRvIGV4aWJpZG8gcXVhbmRvIG5lbmh1bSB2YWxvciBlc3TDoSBzZWxlY2lvbmFkby4gKi9cbiAgICByZWFkb25seSBwbGFjZWhvbGRlciA9IGlucHV0PHN0cmluZz4oKTtcblxuICAgIC8qKlxuICAgICAqIE1vZG8gZGUgc2VsZcOnw6NvIGRvIGNvbXBvbmVudGUuXG4gICAgICogLSBgJ2RhdGUnYCDigJQgc2VsZcOnw6NvIGRlIGRhdGEgw7puaWNhIChwYWRyw6NvKVxuICAgICAqIC0gYCdtb250aCdgIOKAlCBzZWxlw6fDo28gZGUgbcOqcy9hbm9cbiAgICAgKiAtIGAnZGF0ZXRpbWUnYCDigJQgZGF0YSBjb20gaG9yYSAocmVxdWVyIGNvbmZpcm1hw6fDo28pXG4gICAgICogLSBgJ3RpbWUnYCDigJQgYXBlbmFzIHNlbGXDp8OjbyBkZSBob3JhXG4gICAgICogLSBgJ3JhbmdlJ2Ag4oCUIGludGVydmFsbyBlbnRyZSBkdWFzIGRhdGFzXG4gICAgICovXG4gICAgcmVhZG9ubHkgbW9kZSA9IGlucHV0PERhdGVQaWNrZXJNb2RlPignZGF0ZScpO1xuXG4gICAgLyoqXG4gICAgICogTW9kbyBkZSBzZWxlw6fDo28gcXVhbmRvIGBtb2RlYCDDqSBgJ2RhdGUnYC5cbiAgICAgKiAtIGAnc2luZ2xlJ2Ag4oCUIHNlbGXDp8OjbyBkZSB1bWEgw7puaWNhIGRhdGEgKHBhZHLDo28pXG4gICAgICogLSBgJ211bHRpcGxlJ2Ag4oCUIHNlbGXDp8OjbyBkZSBtw7psdGlwbGFzIGRhdGFzIGF2dWxzYXNcbiAgICAgKi9cbiAgICByZWFkb25seSBzZWxlY3Rpb25Nb2RlID0gaW5wdXQ8J3NpbmdsZScgfCAnbXVsdGlwbGUnPignc2luZ2xlJyk7XG5cbiAgICAvKiogU2VwYXJhZG9yIGV4aWJpZG8gZW50cmUgYXMgZGF0YXMgbm8gbW9kbyBgc2VsZWN0aW9uTW9kZSA9ICdtdWx0aXBsZSdgLiAqL1xuICAgIHJlYWRvbmx5IG11bHRpcGxlU2VwYXJhdG9yID0gaW5wdXQ8c3RyaW5nPignLCAnKTtcblxuICAgIC8qKiBRdWFuZG8gYHRydWVgLCBleGliZSBvIGJvdMOjbyBkZSDDrWNvbmUgYW8gbGFkbyBkbyBjYW1wby4gKi9cbiAgICByZWFkb25seSBzaG93SWNvbiA9IGlucHV0PGJvb2xlYW4+KHRydWUpO1xuXG4gICAgLyoqXG4gICAgICogQ2xhc3NlIGRvIMOtY29uZSBleGliaWRvIG5vIGJvdMOjbyBkbyBjYW1wby5cbiAgICAgKiBRdWFuZG8gYG1vZGVgIMOpIGAndGltZSdgLCBvIHBhZHLDo28gbXVkYSBhdXRvbWF0aWNhbWVudGUgcGFyYSBgJ2ZhcyBmYS1jbG9jaydgLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGljb24gPSBpbnB1dDxzdHJpbmc+KCdmYXMgZmEtY2FsZW5kYXInKTtcblxuICAgIC8qKiBEYXRhIG3DrW5pbWEgc2VsZWNpb27DoXZlbC4gRGlhcy9tZXNlcyBhbnRlcmlvcmVzIGZpY2FtIGRlc2FiaWxpdGFkb3MuICovXG4gICAgcmVhZG9ubHkgbWluID0gaW5wdXQ8RGF0ZSB8IG51bGw+KG51bGwpO1xuXG4gICAgLyoqIERhdGEgbcOheGltYSBzZWxlY2lvbsOhdmVsLiBEaWFzL21lc2VzIHBvc3RlcmlvcmVzIGZpY2FtIGRlc2FiaWxpdGFkb3MuICovXG4gICAgcmVhZG9ubHkgbWF4ID0gaW5wdXQ8RGF0ZSB8IG51bGw+KG51bGwpO1xuXG4gICAgLyoqIERhdGEgZXhpYmlkYSBhbyBhYnJpciBvIGNhbGVuZMOhcmlvIHF1YW5kbyBuZW5odW1hIGRhdGEgZXN0w6Egc2VsZWNpb25hZGEuICovXG4gICAgcmVhZG9ubHkgZGVmYXVsdERhdGUgPSBpbnB1dDxEYXRlIHwgbnVsbD4obnVsbCk7XG5cbiAgICAvKipcbiAgICAgKiBGb3JtYXRvIGRlIGV4aWJpw6fDo28gZGEgZGF0YSBubyBjYW1wby4gUXVhbmRvIG9taXRpZG8sIMOpIHJlc29sdmlkbyBhIHBhcnRpciBkb1xuICAgICAqIGxvY2FsZSBhdGl2byAoY2hhdmUgYHBsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlX2Zvcm1hdGApLCBjb20gZmFsbGJhY2sgcGFyYSBgZGQvTU0veXl5eWAuXG4gICAgICovXG4gICAgcmVhZG9ubHkgZGF0ZUZvcm1hdCA9IGlucHV0PHN0cmluZyB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcblxuICAgIC8qKlxuICAgICAqIEZvcm1hdG8gZGUgZXhpYmnDp8OjbyBkYXMgaG9yYXM6IGAnMTInYCBvdSBgJzI0J2AuIFF1YW5kbyBvbWl0aWRvLCDDqSByZXNvbHZpZG8gYSBwYXJ0aXJcbiAgICAgKiBkbyBsb2NhbGUgYXRpdm8gKGNoYXZlIGBwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuaG91cl9mb3JtYXRgKSwgY29tIGZhbGxiYWNrIHBhcmEgYCcyNCdgLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGhvdXJGb3JtYXQgPSBpbnB1dDwnMTInIHwgJzI0JyB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcblxuICAgIC8qKiBJbmNyZW1lbnRvIGVtIG1pbnV0b3MgYW8gdXNhciBhcyBzZXRhcyBkbyB0aW1lIHBpY2tlci4gKi9cbiAgICByZWFkb25seSBtaW51dGVTdGVwID0gaW5wdXQ8bnVtYmVyPihEYXRlcGlja2VyQ29tcG9uZW50LkRFRkFVTFRfTUlOVVRFX1NURVApO1xuXG4gICAgLyoqIFF1YW5kbyBgdHJ1ZWAsIGV4aWJlIG8gY2FtcG8gZGUgc2VndW5kb3Mgbm8gdGltZSBwaWNrZXIuICovXG4gICAgcmVhZG9ubHkgc2hvd1NlY29uZHMgPSBpbnB1dDxib29sZWFuPihmYWxzZSk7XG5cbiAgICAvKiogU2VwYXJhZG9yIGV4aWJpZG8gZW50cmUgYXMgZGF0YXMgbm8gbW9kbyBgJ3JhbmdlJ2AuICovXG4gICAgcmVhZG9ubHkgcmFuZ2VTZXBhcmF0b3IgPSBpbnB1dDxzdHJpbmc+KCcg4oCUICcpO1xuXG4gICAgLyoqIEFicmUgbyBwYWluZWwgYW8gZm9jYXIgbyBpbnB1dDsgZm9jbyBwZXJtYW5lY2Ugbm8gaW5wdXQsIG7Do28gcHVsYSBwYXJhIG8gZHJvcGRvd24uICovXG4gICAgcmVhZG9ubHkgc2hvd09uRm9jdXMgPSBpbnB1dDxib29sZWFuPih0cnVlKTtcblxuICAgIC8qKiBJbXBlZGUgZGlnaXRhw6fDo28gbWFudWFsOyB2YWxvciBzw7MgcG9kZSBzZXIgc2VsZWNpb25hZG8gcGVsbyBjYWxlbmTDoXJpby4gKi9cbiAgICByZWFkb25seSByZWFkb25seUlucHV0ID0gaW5wdXQ8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gICAgLyoqIFByaW1laXJvIGRpYSBkYSBzZW1hbmEgKDAgPSBkb21pbmdvLCAxID0gc2VndW5kYS1mZWlyYSwgLi4uLCA2ID0gc8OhYmFkbykuICovXG4gICAgcmVhZG9ubHkgZmlyc3REYXlPZldlZWsgPSBpbnB1dDxudW1iZXI+KDApO1xuXG4gICAgLyoqIEV4aWJlL29jdWx0YSBhIGJhcnJhIGRlIGJvdMO1ZXMgSG9qZSBlIExpbXBhciBubyByb2RhcMOpLiAqL1xuICAgIHJlYWRvbmx5IHNob3dCdXR0b25CYXIgPSBpbnB1dDxib29sZWFuPih0cnVlKTtcblxuICAgIC8qKiBFeGliZSDDrWNvbmUgZGUgbGltcGFyIGlubGluZSBubyBjYW1wbyBkZSBpbnB1dC4gKi9cbiAgICByZWFkb25seSBzaG93Q2xlYXIgPSBpbnB1dDxib29sZWFuPihmYWxzZSk7XG5cbiAgICAvKiogRXhpYmUgZGlhcyBkZSBtZXNlcyBhZGphY2VudGVzIG5hIGdyYWRlIGRvIGNhbGVuZMOhcmlvLiAqL1xuICAgIHJlYWRvbmx5IHNob3dPdGhlck1vbnRocyA9IGlucHV0PGJvb2xlYW4+KHRydWUpO1xuXG4gICAgLyoqIFBlcm1pdGUgc2VsZWNpb25hciBkaWFzIGRlIG1lc2VzIGFkamFjZW50ZXMgbmEgZ3JhZGUgZG8gY2FsZW5kw6FyaW8uICovXG4gICAgcmVhZG9ubHkgc2VsZWN0T3RoZXJNb250aHMgPSBpbnB1dDxib29sZWFuPihmYWxzZSk7XG5cbiAgICAvKiogRmVjaGEgbyBwYWluZWwgYXDDs3Mgc2VsZWNpb25hciB1bWEgZGF0YSBubyBtb2RvIGBkYXRldGltZWAuICovXG4gICAgcmVhZG9ubHkgaGlkZU9uRGF0ZVRpbWVTZWxlY3QgPSBpbnB1dDxib29sZWFuPihmYWxzZSk7XG5cbiAgICAvKiogSW5jcmVtZW50byBkZSBob3JhcyBubyB0aW1lIHBpY2tlci4gKi9cbiAgICByZWFkb25seSBzdGVwSG91ciA9IGlucHV0PG51bWJlcj4oMSk7XG5cbiAgICAvKiogSW5jcmVtZW50byBkZSBzZWd1bmRvcyBubyB0aW1lIHBpY2tlci4gKi9cbiAgICByZWFkb25seSBzdGVwU2Vjb25kID0gaW5wdXQ8bnVtYmVyPigxKTtcblxuICAgIC8qKiDDjW5kaWNlIGRlIHRhYiBkbyBjYW1wbyBkZSBpbnB1dC4gKi9cbiAgICByZWFkb25seSB0YWJpbmRleCA9IGlucHV0PG51bWJlcj4oKTtcblxuICAgIC8qKiBGb2NhIGF1dG9tYXRpY2FtZW50ZSBvIGNhbXBvIGFvIGNhcnJlZ2FyIG8gY29tcG9uZW50ZS4gKi9cbiAgICByZWFkb25seSBhdXRvZm9jdXMgPSBpbnB1dDxib29sZWFuPihmYWxzZSk7XG5cbiAgICAvKiogRGF0YXMgZXNwZWPDrWZpY2FzIGRlc2FiaWxpdGFkYXMgbm8gY2FsZW5kw6FyaW8uICovXG4gICAgcmVhZG9ubHkgZGlzYWJsZWREYXRlcyA9IGlucHV0PERhdGVbXT4oW10pO1xuXG4gICAgLyoqIERpYXMgZGEgc2VtYW5hIGRlc2FiaWxpdGFkb3MgKDAgPSBkb21pbmdvLCAuLi4sIDYgPSBzw6FiYWRvKS4gKi9cbiAgICByZWFkb25seSBkaXNhYmxlZERheXMgPSBpbnB1dDxudW1iZXJbXT4oW10pO1xuXG4gICAgLy8g4pSA4pSAIFR3by13YXkgbW9kZWxzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gICAgLyoqIEVzdGFkbyBkZXNhYmlsaXRhZG8gZG8gY29tcG9uZW50ZS4gKi9cbiAgICByZWFkb25seSBkaXNhYmxlZCA9IG1vZGVsPGJvb2xlYW4+KGZhbHNlKTtcblxuICAgIC8vIOKUgOKUgCBPdXRwdXRzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gICAgLyoqIEVtaXRpZG8gcXVhbmRvIG8gY2FtcG8gcGVyZGUgbyBmb2NvLiAqL1xuICAgIHJlYWRvbmx5IGJsdXJyZWQgPSBvdXRwdXQ8RXZlbnQ+KCk7XG5cbiAgICAvKiogRW1pdGlkbyBxdWFuZG8gbyBjYW1wbyByZWNlYmUgbyBmb2NvLiAqL1xuICAgIHJlYWRvbmx5IGZvY3VzZWQgPSBvdXRwdXQ8RXZlbnQ+KCk7XG5cbiAgICAvKiogRW1pdGlkbyBhbyBzZWxlY2lvbmFyIHVtYSBkYXRhLCBtw6pzLCBob3LDoXJpbyBvdSBpbnRlcnZhbG8uICovXG4gICAgcmVhZG9ubHkgc2VsZWN0ZWQgPSBvdXRwdXQ8RGF0ZXBpY2tlclZhbHVlPigpO1xuXG4gICAgLyoqIEVtaXRpZG8gcXVhbmRvIG8gcGFpbmVsIGRvIGNhbGVuZMOhcmlvIGZlY2hhLiBFbWl0ZSBvIGVsZW1lbnRvIGRvIHBhaW5lbC4gKi9cbiAgICByZWFkb25seSBjbG9zZWQgPSBvdXRwdXQ8SFRNTEVsZW1lbnQ+KCk7XG5cbiAgICAvKiogRW1pdGlkbyBhbyBjbGljYXIgbm8gYm90w6NvIFwiSG9qZVwiLiAqL1xuICAgIHJlYWRvbmx5IHRvZGF5Q2xpY2sgPSBvdXRwdXQ8RGF0ZT4oKTtcblxuICAgIC8qKiBFbWl0aWRvIGFvIGNsaWNhciBubyBib3TDo28gXCJMaW1wYXJcIiBvdSBubyDDrWNvbmUgZGUgbGltcGFyIGlubGluZS4gKi9cbiAgICByZWFkb25seSBjbGVhckNsaWNrID0gb3V0cHV0PE1vdXNlRXZlbnQ+KCk7XG5cbiAgICAvKiogRW1pdGlkbyBxdWFuZG8gbyBtw6pzIHZpc3VhbGl6YWRvIG11ZGEuICovXG4gICAgcmVhZG9ubHkgbW9udGhDaGFuZ2UgPSBvdXRwdXQ8eyBtb250aDogbnVtYmVyOyB5ZWFyOiBudW1iZXIgfT4oKTtcblxuICAgIC8qKiBFbWl0aWRvIHF1YW5kbyBvIGFubyB2aXN1YWxpemFkbyBtdWRhLiAqL1xuICAgIHJlYWRvbmx5IHllYXJDaGFuZ2UgPSBvdXRwdXQ8eyBtb250aDogbnVtYmVyOyB5ZWFyOiBudW1iZXIgfT4oKTtcblxuICAgIC8qKiBFbWl0aWRvIHF1YW5kbyBvIHBhaW5lbCBkbyBjYWxlbmTDoXJpbyBhYnJlLiAqL1xuICAgIHJlYWRvbmx5IHNob3cgPSBvdXRwdXQ8dm9pZD4oKTtcblxuICAgIC8qKiBFbWl0aWRvIHF1YW5kbyBvIHVzdcOhcmlvIGRpZ2l0YSBtYW51YWxtZW50ZSBubyBjYW1wby4gKi9cbiAgICByZWFkb25seSB2YWx1ZUlucHV0ID0gb3V0cHV0PEV2ZW50PigpO1xuXG4gICAgLy8g4pSA4pSAIEludGVybmFsIHN0YXRlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IG1heEhvdXJzID0gRGF0ZXBpY2tlckNvbXBvbmVudC5NQVhfSE9VUlM7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IG1heE1pbnV0ZXMgPSBEYXRlcGlja2VyQ29tcG9uZW50Lk1BWF9NSU5VVEVTO1xuICAgIHByb3RlY3RlZCByZWFkb25seSB0aW1lSW5wdXRNYXhMZW5ndGggPSAyO1xuXG4gICAgcHJvdGVjdGVkIGlucHV0RGF0ZSA9ICcnO1xuXG4gICAgcHJvdGVjdGVkIG5nQ29udHJvbDogTmdDb250cm9sIHwgbnVsbCA9IG51bGw7XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgdmFsdWUgPSBzaWduYWw8RGF0ZSB8IG51bGw+KG51bGwpO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBpc09wZW4gPSBzaWduYWwoZmFsc2UpO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBpc0ZvY3VzZWQgPSBzaWduYWwoZmFsc2UpO1xuICAgIHByb3RlY3RlZCByZWFkb25seSB2aWV3RGF0ZSA9IHNpZ25hbChuZXcgRGF0ZSgpKTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgcGlja2VyVmlldyA9IHNpZ25hbDxQaWNrZXJWaWV3PignY2FsZW5kYXInKTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgaG91cnMgPSBzaWduYWwoMCk7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IG1pbnV0ZXMgPSBzaWduYWwoMCk7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHNlY29uZHMgPSBzaWduYWwoMCk7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHJhbmdlVmFsdWUgPSBzaWduYWw8RGF0ZVJhbmdlIHwgbnVsbD4obnVsbCk7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IG11bHRpcGxlVmFsdWVzID0gc2lnbmFsPERhdGVbXT4oW10pO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBwZW5kaW5nUmFuZ2VTdGFydCA9IHNpZ25hbDxEYXRlIHwgbnVsbD4obnVsbCk7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGhvdmVyRGF0ZSA9IHNpZ25hbDxEYXRlIHwgbnVsbD4obnVsbCk7XG4gICAgcHJpdmF0ZSBfaGFzRm9ybWF0RXJyb3IgPSBmYWxzZTtcbiAgICBwcml2YXRlIG9uVmFsaWRhdG9yQ2hhbmdlOiAoKSA9PiB2b2lkID0gKCkgPT4ge307XG4gICAgcHJpdmF0ZSBfb25DaGFuZ2U6ICh2YWx1ZTogRGF0ZXBpY2tlclZhbHVlKSA9PiB2b2lkID0gKCkgPT4ge307XG4gICAgcHJpdmF0ZSBfb25Ub3VjaGVkOiAoKSA9PiB2b2lkID0gKCkgPT4ge307XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IHBvcHVwUGFuZWwgPSB2aWV3Q2hpbGQoJ3BvcHVwUGFuZWwnLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBpbmNyZWFzZUhvdXJCdXR0b24gPSB2aWV3Q2hpbGQoJ2luY3JlYXNlSG91ckJ1dHRvbicsIHsgcmVhZDogRWxlbWVudFJlZiB9KTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGljb25CdXR0b24gPSB2aWV3Q2hpbGQoJ2ljb25CdXR0b24nLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSk7XG4gICAgcHJpdmF0ZSByZWFkb25seSB0cmlnZ2VySW5wdXQgPSB2aWV3Q2hpbGQucmVxdWlyZWQoJ3RyaWdnZXJJbnB1dCcsIHsgcmVhZDogRWxlbWVudFJlZiB9KTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGluamVjdG9yID0gaW5qZWN0KEluamVjdG9yKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGhvc3RFbGVtZW50ID0gaW5qZWN0KEVsZW1lbnRSZWYpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgdHJhbnNsYXRlU2VydmljZSA9IGluamVjdChUcmFuc2xhdGVTZXJ2aWNlKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IGN1cnJlbnRMYW5nID0gc2lnbmFsKHRoaXMudHJhbnNsYXRlU2VydmljZS5jdXJyZW50TGFuZyk7XG5cbiAgICAvKiogUmVmbGV0ZSBgKHBvaW50ZXI6IGNvYXJzZSlgIOKAlCBkaXNwb3NpdGl2b3MgdG91Y2ggcHJlZmVyZW0gbyBwb3B1cCBkbyBjYWxlbmTDoXJpbyBhbyB0ZWNsYWRvLiAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSBpc1RvdWNoRGV2aWNlID0gc2lnbmFsKFxuICAgICAgICB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygd2luZG93Lm1hdGNoTWVkaWEgPT09ICdmdW5jdGlvbidcbiAgICAgICAgICAgID8gd2luZG93Lm1hdGNoTWVkaWEoJyhwb2ludGVyOiBjb2Fyc2UpJykubWF0Y2hlc1xuICAgICAgICAgICAgOiBmYWxzZSxcbiAgICApO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBzZWdtZW50RW5naW5lID0gbmV3IERhdGVTZWdtZW50RW5naW5lKCk7XG4gICAgcHJpdmF0ZSBsYXN0U2VnbWVudENvbmZpZzogU2VnbWVudEVuZ2luZUNvbmZpZyB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgbWVhc3VyZUNhbnZhcz86IEhUTUxDYW52YXNFbGVtZW50O1xuICAgIC8qKiBJbmNyZW1lbnRhZG8gYSBjYWRhIG11dGHDp8OjbyBkbyB1c3XDoXJpbyDigJQgaW52YWxpZGEgY2FsbGJhY2tzIGRlIGNsaXF1ZS9mb2NvIGFkaWFkb3MgcXVlIGZpY2FyYW0gb2Jzb2xldG9zLiAqL1xuICAgIHByaXZhdGUgaW50ZXJhY3Rpb25HZW5lcmF0aW9uID0gMDtcbiAgICAvKiogYHRpbWVTdGFtcGAgZG8gw7psdGltbyBtb3VzZWRvd24gbm8gaW5wdXQgc2VnbWVudGFkbyDigJQgdXNhZG8gcHJhIGRldGVjdGFyIGR1cGxvIGNsaXF1ZSBuYSBtw6NvLiAqL1xuICAgIHByaXZhdGUgbGFzdE1vdXNlRG93bkF0ID0gMDtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2Uub25MYW5nQ2hhbmdlLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpLnN1YnNjcmliZSgoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudExhbmcuc2V0KGV2ZW50LmxhbmcpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHdpbmRvdy5tYXRjaE1lZGlhID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjb25zdCBtZWRpYVF1ZXJ5ID0gd2luZG93Lm1hdGNoTWVkaWEoJyhwb2ludGVyOiBjb2Fyc2UpJyk7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGVQb2ludGVyQ2hhbmdlID0gKGV2ZW50OiBNZWRpYVF1ZXJ5TGlzdEV2ZW50KTogdm9pZCA9PiB0aGlzLmlzVG91Y2hEZXZpY2Uuc2V0KGV2ZW50Lm1hdGNoZXMpO1xuICAgICAgICAgICAgbWVkaWFRdWVyeS5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBoYW5kbGVQb2ludGVyQ2hhbmdlKTtcbiAgICAgICAgICAgIHRoaXMuZGVzdHJveVJlZi5vbkRlc3Ryb3koKCkgPT4gbWVkaWFRdWVyeS5yZW1vdmVFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBoYW5kbGVQb2ludGVyQ2hhbmdlKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyDilIDilIAgQ29tcHV0ZWQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgcmVzb2x2ZWRJY29uID0gY29tcHV0ZWQoKCkgPT4gKHRoaXMubW9kZSgpID09PSAndGltZScgPyAnZmFzIGZhLWNsb2NrJyA6IHRoaXMuaWNvbigpKSk7XG5cbiAgICAvKiogYGRhdGVGb3JtYXRgIGV4cGzDrWNpdG8gb3UgcmVzb2x2aWRvIGEgcGFydGlyIGRvIGxvY2FsZSBhdGl2byAoZmFsbGJhY2sgYGRkL01NL3l5eXlgKS4gKi9cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgcmVzb2x2ZWREYXRlRm9ybWF0ID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICB0aGlzLmN1cnJlbnRMYW5nKCk7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICB0aGlzLmRhdGVGb3JtYXQoKSA/P1xuICAgICAgICAgICAgdGhpcy5yZXNvbHZlVHJhbnNsYXRlZE9yRGVmYXVsdCgncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVfZm9ybWF0JywgJ2RkL01NL3l5eXknKVxuICAgICAgICApO1xuICAgIH0pO1xuXG4gICAgLyoqIGBob3VyRm9ybWF0YCBleHBsw61jaXRvIG91IHJlc29sdmlkbyBhIHBhcnRpciBkbyBsb2NhbGUgYXRpdm8gKGZhbGxiYWNrIGAnMjQnYCkuICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHJlc29sdmVkSG91ckZvcm1hdCA9IGNvbXB1dGVkPCcxMicgfCAnMjQnPigoKSA9PiB7XG4gICAgICAgIHRoaXMuY3VycmVudExhbmcoKTtcbiAgICAgICAgY29uc3QgZXhwbGljaXQgPSB0aGlzLmhvdXJGb3JtYXQoKTtcbiAgICAgICAgaWYgKGV4cGxpY2l0KSByZXR1cm4gZXhwbGljaXQ7XG4gICAgICAgIGNvbnN0IHRyYW5zbGF0ZWQgPSB0aGlzLnJlc29sdmVUcmFuc2xhdGVkT3JEZWZhdWx0KCdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuaG91cl9mb3JtYXQnLCAnMjQnKTtcbiAgICAgICAgcmV0dXJuIHRyYW5zbGF0ZWQgPT09ICcxMicgPyAnMTInIDogJzI0JztcbiAgICB9KTtcblxuICAgIC8qKiBNb2RvcyBjdWpvIGZvcm1hdG8gZGUgZXhpYmnDp8OjbyDDqSByZXNvbHZpZG8gcGVsYSBlbmdpbmUgZGUgc2VnbWVudG9zIChpbmRlcGVuZGVudGUgZGUgdG91Y2gvcmVhZG9ubHkpLiAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSBpc1NlZ21lbnRNb2RlQ2FuZGlkYXRlID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5pc011bHRpcGxlTW9kZSgpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGNvbnN0IG1vZGUgPSB0aGlzLm1vZGUoKTtcbiAgICAgICAgcmV0dXJuIG1vZGUgPT09ICdkYXRlJyB8fCBtb2RlID09PSAnbW9udGgnIHx8IG1vZGUgPT09ICd0aW1lJyB8fCBtb2RlID09PSAnZGF0ZXRpbWUnO1xuICAgIH0pO1xuXG4gICAgLyoqIEludGVyYXRpdmlkYWRlIGRlIGRpZ2l0YcOnw6NvIHBvciBzZWdtZW50byDigJQgZGVzbGlnYWRhIGVtIHRvdWNoIG91IHF1YW5kbyBgcmVhZG9ubHlJbnB1dGAgw6kgdXNhZG8uICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGlzU2VnbWVudGVkTW9kZSA9IGNvbXB1dGVkKFxuICAgICAgICAoKSA9PiB0aGlzLmlzU2VnbWVudE1vZGVDYW5kaWRhdGUoKSAmJiAhdGhpcy5pc1RvdWNoRGV2aWNlKCkgJiYgIXRoaXMucmVhZG9ubHlJbnB1dCgpLFxuICAgICk7XG5cbiAgICAvKiogSW5kaWNhIHNlIG8gdGltZSBwaWNrZXIgZGV2ZSB1c2FyIG8gZm9ybWF0byBkZSAxMiBob3JhcyBjb20gc2VsZXRvciBBTS9QTS4gKi9cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgaXMxMkhvdXJGb3JtYXQgPSBjb21wdXRlZCgoKSA9PiB0aGlzLnJlc29sdmVkSG91ckZvcm1hdCgpID09PSAnMTInKTtcblxuICAgIC8qKiBIb3JhIGV4aWJpZGEgbm8gdGltZSBwaWNrZXI6IDHigJMxMiBubyBmb3JtYXRvIDEyaCwgMOKAkzIzIG5vIGZvcm1hdG8gMjRoLiAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSBkaXNwbGF5SG91cnMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5pczEySG91ckZvcm1hdCgpKSByZXR1cm4gdGhpcy5ob3VycygpO1xuICAgICAgICBjb25zdCBoMTIgPSB0aGlzLmhvdXJzKCkgJSBEYXRlcGlja2VyQ29tcG9uZW50LkhPVVJTX1BFUl9NRVJJRElFTTtcbiAgICAgICAgcmV0dXJuIGgxMiA9PT0gMCA/IERhdGVwaWNrZXJDb21wb25lbnQuSE9VUlNfUEVSX01FUklESUVNIDogaDEyO1xuICAgIH0pO1xuXG4gICAgLyoqIE1lcmlkaWFubyBhdHVhbCBkZXJpdmFkbyBkYSBob3JhIGludGVybmEgKDDigJMyMykuICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGFtUG0gPSBjb21wdXRlZDwnQU0nIHwgJ1BNJz4oKCkgPT5cbiAgICAgICAgdGhpcy5ob3VycygpIDwgRGF0ZXBpY2tlckNvbXBvbmVudC5IT1VSU19QRVJfTUVSSURJRU0gPyAnQU0nIDogJ1BNJyxcbiAgICApO1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHBvc2l0aW9uczogQ29ubmVjdGVkUG9zaXRpb25bXSA9IFtcbiAgICAgICAgeyBvcmlnaW5YOiAnc3RhcnQnLCBvcmlnaW5ZOiAnYm90dG9tJywgb3ZlcmxheVg6ICdzdGFydCcsIG92ZXJsYXlZOiAndG9wJywgb2Zmc2V0WTogNCB9LFxuICAgICAgICB7IG9yaWdpblg6ICdzdGFydCcsIG9yaWdpblk6ICd0b3AnLCBvdmVybGF5WDogJ3N0YXJ0Jywgb3ZlcmxheVk6ICdib3R0b20nLCBvZmZzZXRZOiAtNCB9LFxuICAgIF07XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgcG9wdXBJZCA9IGNvbXB1dGVkKCgpID0+IGAke3RoaXMuaW5wdXRJZCgpfS1wb3B1cGApO1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGN1cnJlbnRNb250aEluZGV4ID0gY29tcHV0ZWQoKCkgPT4gdGhpcy52aWV3RGF0ZSgpLmdldE1vbnRoKCkpO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBjdXJyZW50WWVhciA9IGNvbXB1dGVkKCgpID0+IHRoaXMudmlld0RhdGUoKS5nZXRGdWxsWWVhcigpKTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgY3VycmVudE1vbnRoS2V5ID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5tb250aEtleXNbdGhpcy5jdXJyZW50TW9udGhJbmRleCgpXSk7XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2hvd0NhbGVuZGFyID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5tb2RlKCkgIT09ICd0aW1lJyk7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHNob3dUaW1lUGlja2VyID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5tb2RlKCkgPT09ICdkYXRldGltZScgfHwgdGhpcy5tb2RlKCkgPT09ICd0aW1lJyk7XG5cbiAgICAvKiogU2VsZcOnw6NvIG3Dumx0aXBsYSBhdGl2YTogYXBlbmFzIG5vIG1vZG8gYGRhdGVgIGNvbSBgc2VsZWN0aW9uTW9kZSA9ICdtdWx0aXBsZSdgLiAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSBpc011bHRpcGxlTW9kZSA9IGNvbXB1dGVkKCgpID0+IHRoaXMuc2VsZWN0aW9uTW9kZSgpID09PSAnbXVsdGlwbGUnICYmIHRoaXMubW9kZSgpID09PSAnZGF0ZScpO1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IG9yZGVyZWRXZWVrRGF5S2V5cyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSB0aGlzLmZpcnN0RGF5T2ZXZWVrKCk7XG4gICAgICAgIHJldHVybiBbLi4udGhpcy53ZWVrRGF5S2V5cy5zbGljZShzdGFydCksIC4uLnRoaXMud2Vla0RheUtleXMuc2xpY2UoMCwgc3RhcnQpXTtcbiAgICB9KTtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSBkaWFsb2dBcmlhTGFiZWxLZXkgPSBjb21wdXRlZCgoKSA9PlxuICAgICAgICB0aGlzLm1vZGUoKSA9PT0gJ3JhbmdlJ1xuICAgICAgICAgICAgPyAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfc2VsZWN0X3JhbmdlJ1xuICAgICAgICAgICAgOiAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfc2VsZWN0X2RhdGUnLFxuICAgICk7XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgcGxhY2Vob2xkZXJLZXkgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IG1vZGUgPSB0aGlzLm1vZGUoKTtcbiAgICAgICAgcmV0dXJuIGBwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9wbGFjZWhvbGRlcl8ke21vZGV9YDtcbiAgICB9KTtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSBlZmZlY3RpdmVSYW5nZSA9IGNvbXB1dGVkKCgpOiB7IHN0YXJ0OiBEYXRlIHwgbnVsbDsgZW5kOiBEYXRlIHwgbnVsbCB9ID0+IHtcbiAgICAgICAgY29uc3QgcGVuZGluZyA9IHRoaXMucGVuZGluZ1JhbmdlU3RhcnQoKTtcbiAgICAgICAgY29uc3QgaG92ZXIgPSB0aGlzLmhvdmVyRGF0ZSgpO1xuICAgICAgICBpZiAocGVuZGluZykge1xuICAgICAgICAgICAgaWYgKGhvdmVyKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgW3N0YXJ0LCBlbmRdID0gcGVuZGluZy5nZXRUaW1lKCkgPD0gaG92ZXIuZ2V0VGltZSgpID8gW3BlbmRpbmcsIGhvdmVyXSA6IFtob3ZlciwgcGVuZGluZ107XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgc3RhcnQsIGVuZCB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHsgc3RhcnQ6IHBlbmRpbmcsIGVuZDogbnVsbCB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnJhbmdlVmFsdWUoKSA/PyB7IHN0YXJ0OiBudWxsLCBlbmQ6IG51bGwgfTtcbiAgICB9KTtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSBjYWxlbmRhcldlZWtzID0gY29tcHV0ZWQoKCk6IENhbGVuZGFyRGF5W11bXSA9PiB7XG4gICAgICAgIGNvbnN0IHllYXIgPSB0aGlzLmN1cnJlbnRZZWFyKCk7XG4gICAgICAgIGNvbnN0IG1vbnRoID0gdGhpcy5jdXJyZW50TW9udGhJbmRleCgpO1xuICAgICAgICBjb25zdCB0b2RheSA9IG5ldyBEYXRlKCk7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkID0gdGhpcy52YWx1ZSgpO1xuICAgICAgICBjb25zdCByYW5nZSA9IHRoaXMuZWZmZWN0aXZlUmFuZ2UoKTtcbiAgICAgICAgY29uc3QgcmFuZ2VTdGFydFRpbWUgPSByYW5nZS5zdGFydCA/IHN0cmlwVGltZShyYW5nZS5zdGFydCkgOiBudWxsO1xuICAgICAgICBjb25zdCByYW5nZUVuZFRpbWUgPSByYW5nZS5lbmQgPyBzdHJpcFRpbWUocmFuZ2UuZW5kKSA6IG51bGw7XG5cbiAgICAgICAgY29uc3QgZmlyc3REYXlPZk1vbnRoID0gbmV3IERhdGUoeWVhciwgbW9udGgsIDEpO1xuICAgICAgICBjb25zdCBzdGFydFdlZWtEYXkgPSBmaXJzdERheU9mTW9udGguZ2V0RGF5KCk7XG4gICAgICAgIGNvbnN0IGFkanVzdGVkU3RhcnREYXkgPSAoc3RhcnRXZWVrRGF5IC0gdGhpcy5maXJzdERheU9mV2VlaygpICsgNykgJSA3O1xuICAgICAgICBjb25zdCBkYXlzSW5Nb250aCA9IG5ldyBEYXRlKHllYXIsIG1vbnRoICsgMSwgMCkuZ2V0RGF0ZSgpO1xuICAgICAgICBjb25zdCBkYXlzSW5QcmV2TW9udGggPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCwgMCkuZ2V0RGF0ZSgpO1xuXG4gICAgICAgIGNvbnN0IGFsbERheXM6IENhbGVuZGFyRGF5W10gPSBbXTtcblxuICAgICAgICBmb3IgKGxldCBpID0gYWRqdXN0ZWRTdGFydERheSAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoeWVhciwgbW9udGggLSAxLCBkYXlzSW5QcmV2TW9udGggLSBpKTtcbiAgICAgICAgICAgIGFsbERheXMucHVzaCh0aGlzLmJ1aWxkQ2FsZW5kYXJEYXkoZGF0ZSwgZmFsc2UsIHRvZGF5LCBzZWxlY3RlZCwgcmFuZ2UsIHJhbmdlU3RhcnRUaW1lLCByYW5nZUVuZFRpbWUpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGQgPSAxOyBkIDw9IGRheXNJbk1vbnRoOyBkKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCwgZCk7XG4gICAgICAgICAgICBhbGxEYXlzLnB1c2godGhpcy5idWlsZENhbGVuZGFyRGF5KGRhdGUsIHRydWUsIHRvZGF5LCBzZWxlY3RlZCwgcmFuZ2UsIHJhbmdlU3RhcnRUaW1lLCByYW5nZUVuZFRpbWUpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRvdGFsQ2VsbHMgPVxuICAgICAgICAgICAgTWF0aC5jZWlsKGFsbERheXMubGVuZ3RoIC8gRGF0ZXBpY2tlckNvbXBvbmVudC5EQVlTX0lOX1dFRUspICogRGF0ZXBpY2tlckNvbXBvbmVudC5EQVlTX0lOX1dFRUs7XG4gICAgICAgIGxldCBuZXh0RGF5ID0gMTtcbiAgICAgICAgd2hpbGUgKGFsbERheXMubGVuZ3RoIDwgdG90YWxDZWxscykge1xuICAgICAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHllYXIsIG1vbnRoICsgMSwgbmV4dERheSk7XG4gICAgICAgICAgICBuZXh0RGF5Kys7XG4gICAgICAgICAgICBhbGxEYXlzLnB1c2godGhpcy5idWlsZENhbGVuZGFyRGF5KGRhdGUsIGZhbHNlLCB0b2RheSwgc2VsZWN0ZWQsIHJhbmdlLCByYW5nZVN0YXJ0VGltZSwgcmFuZ2VFbmRUaW1lKSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB3ZWVrczogQ2FsZW5kYXJEYXlbXVtdID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYWxsRGF5cy5sZW5ndGg7IGkgKz0gRGF0ZXBpY2tlckNvbXBvbmVudC5EQVlTX0lOX1dFRUspIHtcbiAgICAgICAgICAgIHdlZWtzLnB1c2goYWxsRGF5cy5zbGljZShpLCBpICsgRGF0ZXBpY2tlckNvbXBvbmVudC5EQVlTX0lOX1dFRUspKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd2Vla3M7XG4gICAgfSk7XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgbW9udGhzR3JpZCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgY29uc3Qgcm93czogeyBrZXk6IHN0cmluZzsgaW5kZXg6IG51bWJlciB9W11bXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IERhdGVwaWNrZXJDb21wb25lbnQuTU9OVEhTX0lOX1lFQVI7IGkgKz0gRGF0ZXBpY2tlckNvbXBvbmVudC5NT05USFNfUEVSX1JPVykge1xuICAgICAgICAgICAgcm93cy5wdXNoKFtcbiAgICAgICAgICAgICAgICB7IGtleTogdGhpcy5tb250aEtleXNbaV0sIGluZGV4OiBpIH0sXG4gICAgICAgICAgICAgICAgeyBrZXk6IHRoaXMubW9udGhLZXlzW2kgKyAxXSwgaW5kZXg6IGkgKyAxIH0sXG4gICAgICAgICAgICAgICAgeyBrZXk6IHRoaXMubW9udGhLZXlzW2kgKyAyXSwgaW5kZXg6IGkgKyAyIH0sXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcm93cztcbiAgICB9KTtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSBjdXJyZW50RGVjYWRlU3RhcnQgPSBjb21wdXRlZCgoKSA9PiBNYXRoLmZsb29yKHRoaXMuY3VycmVudFllYXIoKSAvIDEwKSAqIDEwKTtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSB5ZWFyc0dyaWQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5jdXJyZW50RGVjYWRlU3RhcnQoKTtcbiAgICAgICAgY29uc3Qgcm93czogbnVtYmVyW11bXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IERhdGVwaWNrZXJDb21wb25lbnQuWUVBUlNfUEVSX0dSSUQ7IGkgKz0gRGF0ZXBpY2tlckNvbXBvbmVudC5ZRUFSU19QRVJfUk9XKSB7XG4gICAgICAgICAgICByb3dzLnB1c2goW3N0YXJ0ICsgaSwgc3RhcnQgKyBpICsgMSwgc3RhcnQgKyBpICsgMl0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByb3dzO1xuICAgIH0pO1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHByZXZEaXNhYmxlZCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgY29uc3QgbWluID0gdGhpcy5taW4oKTtcbiAgICAgICAgaWYgKCFtaW4pIHJldHVybiBmYWxzZTtcbiAgICAgICAgY29uc3QgdmlldyA9IHRoaXMudmlld0RhdGUoKTtcbiAgICAgICAgaWYgKHRoaXMucGlja2VyVmlldygpID09PSAneWVhcnMnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50RGVjYWRlU3RhcnQoKSA8PSBtaW4uZ2V0RnVsbFllYXIoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5waWNrZXJWaWV3KCkgPT09ICdtb250aHMnKSB7XG4gICAgICAgICAgICByZXR1cm4gdmlldy5nZXRGdWxsWWVhcigpIDw9IG1pbi5nZXRGdWxsWWVhcigpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICB2aWV3LmdldEZ1bGxZZWFyKCkgPCBtaW4uZ2V0RnVsbFllYXIoKSB8fFxuICAgICAgICAgICAgKHZpZXcuZ2V0RnVsbFllYXIoKSA9PT0gbWluLmdldEZ1bGxZZWFyKCkgJiYgdmlldy5nZXRNb250aCgpIDw9IG1pbi5nZXRNb250aCgpKVxuICAgICAgICApO1xuICAgIH0pO1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IG5leHREaXNhYmxlZCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgY29uc3QgbWF4ID0gdGhpcy5tYXgoKTtcbiAgICAgICAgaWYgKCFtYXgpIHJldHVybiBmYWxzZTtcbiAgICAgICAgY29uc3QgdmlldyA9IHRoaXMudmlld0RhdGUoKTtcbiAgICAgICAgaWYgKHRoaXMucGlja2VyVmlldygpID09PSAneWVhcnMnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50RGVjYWRlU3RhcnQoKSArIERhdGVwaWNrZXJDb21wb25lbnQuWUVBUlNfUEVSX0dSSUQgLSAxID49IG1heC5nZXRGdWxsWWVhcigpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnBpY2tlclZpZXcoKSA9PT0gJ21vbnRocycpIHtcbiAgICAgICAgICAgIHJldHVybiB2aWV3LmdldEZ1bGxZZWFyKCkgPj0gbWF4LmdldEZ1bGxZZWFyKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHZpZXcuZ2V0RnVsbFllYXIoKSA+IG1heC5nZXRGdWxsWWVhcigpIHx8XG4gICAgICAgICAgICAodmlldy5nZXRGdWxsWWVhcigpID09PSBtYXguZ2V0RnVsbFllYXIoKSAmJiB2aWV3LmdldE1vbnRoKCkgPj0gbWF4LmdldE1vbnRoKCkpXG4gICAgICAgICk7XG4gICAgfSk7XG5cbiAgICAvLyDilIDilIAgVHJhbnNsYXRpb24ga2V5cyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAgIHByb3RlY3RlZCByZWFkb25seSB3ZWVrRGF5S2V5cyA9IFtcbiAgICAgICAgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX2RheV9zdW4nLFxuICAgICAgICAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfZGF5X21vbicsXG4gICAgICAgICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9kYXlfdHVlJyxcbiAgICAgICAgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX2RheV93ZWQnLFxuICAgICAgICAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfZGF5X3RodScsXG4gICAgICAgICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9kYXlfZnJpJyxcbiAgICAgICAgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX2RheV9zYXQnLFxuICAgIF07XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgbW9udGhLZXlzID0gW1xuICAgICAgICAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfbW9udGhfamFuJyxcbiAgICAgICAgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX21vbnRoX2ZlYicsXG4gICAgICAgICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9tb250aF9tYXInLFxuICAgICAgICAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfbW9udGhfYXByJyxcbiAgICAgICAgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX21vbnRoX21heScsXG4gICAgICAgICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9tb250aF9qdW4nLFxuICAgICAgICAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfbW9udGhfanVsJyxcbiAgICAgICAgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX21vbnRoX2F1ZycsXG4gICAgICAgICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9tb250aF9zZXAnLFxuICAgICAgICAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfbW9udGhfb2N0JyxcbiAgICAgICAgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX21vbnRoX25vdicsXG4gICAgICAgICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9tb250aF9kZWMnLFxuICAgIF07XG5cbiAgICAvLyDilIDilIAgTGlmZWN5Y2xlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gICAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLm5nQ29udHJvbCA9IHRoaXMuaW5qZWN0b3IuZ2V0KE5nQ29udHJvbCwgbnVsbCwgeyBzZWxmOiB0cnVlLCBvcHRpb25hbDogdHJ1ZSB9KTtcbiAgICAgICAgYWZ0ZXJOZXh0UmVuZGVyKFxuICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGQgPSB0aGlzLmRlZmF1bHREYXRlKCk7XG4gICAgICAgICAgICAgICAgaWYgKGQgJiYgIXRoaXMudmFsdWUoKSAmJiAhdGhpcy5yYW5nZVZhbHVlKCkgJiYgdGhpcy5tdWx0aXBsZVZhbHVlcygpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbHVlLnNldChkKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXREaXNwbGF5Rm9yKGQpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnZpZXdEYXRlLnNldChuZXcgRGF0ZShkLmdldEZ1bGxZZWFyKCksIGQuZ2V0TW9udGgoKSwgMSkpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9vbkNoYW5nZShkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgeyBpbmplY3RvcjogdGhpcy5pbmplY3RvciB9LFxuICAgICAgICApO1xuICAgIH1cbiAgICAvLyDilIDilIAgQ29udHJvbFZhbHVlQWNjZXNzb3Ig4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgICBwdWJsaWMgd3JpdGVWYWx1ZSh2YWx1ZTogRGF0ZXBpY2tlclZhbHVlKTogdm9pZCB7XG4gICAgICAgIGlmICghdmFsdWUgfHwgKEFycmF5LmlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmxlbmd0aCA9PT0gMCkpIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWUuc2V0KG51bGwpO1xuICAgICAgICAgICAgdGhpcy5yYW5nZVZhbHVlLnNldChudWxsKTtcbiAgICAgICAgICAgIHRoaXMubXVsdGlwbGVWYWx1ZXMuc2V0KFtdKTtcbiAgICAgICAgICAgIHRoaXMuc2V0RGlzcGxheUZvcihudWxsKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHNvcnRlZCA9IFsuLi52YWx1ZV0uc29ydCgoYSwgYikgPT4gYS5nZXRUaW1lKCkgLSBiLmdldFRpbWUoKSk7XG4gICAgICAgICAgICB0aGlzLm11bHRpcGxlVmFsdWVzLnNldChzb3J0ZWQpO1xuICAgICAgICAgICAgdGhpcy5pbnB1dERhdGUgPSB0aGlzLmZvcm1hdEZvckRpc3BsYXkoc29ydGVkKTtcbiAgICAgICAgICAgIGNvbnN0IGZpcnN0ID0gc29ydGVkWzBdO1xuICAgICAgICAgICAgdGhpcy52aWV3RGF0ZS5zZXQobmV3IERhdGUoZmlyc3QuZ2V0RnVsbFllYXIoKSwgZmlyc3QuZ2V0TW9udGgoKSwgMSkpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmlzRGF0ZVJhbmdlKHZhbHVlKSkge1xuICAgICAgICAgICAgdGhpcy5yYW5nZVZhbHVlLnNldCh2YWx1ZSk7XG4gICAgICAgICAgICB0aGlzLmlucHV0RGF0ZSA9IHRoaXMuZm9ybWF0Rm9yRGlzcGxheSh2YWx1ZSk7XG4gICAgICAgICAgICBpZiAodmFsdWUuc3RhcnQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnZpZXdEYXRlLnNldChuZXcgRGF0ZSh2YWx1ZS5zdGFydC5nZXRGdWxsWWVhcigpLCB2YWx1ZS5zdGFydC5nZXRNb250aCgpLCAxKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy52YWx1ZS5zZXQodmFsdWUgYXMgRGF0ZSk7XG4gICAgICAgIGNvbnN0IGQgPSB2YWx1ZSBhcyBEYXRlO1xuICAgICAgICB0aGlzLnNldERpc3BsYXlGb3IoZCk7XG4gICAgICAgIHRoaXMudmlld0RhdGUuc2V0KG5ldyBEYXRlKGQuZ2V0RnVsbFllYXIoKSwgZC5nZXRNb250aCgpLCAxKSk7XG4gICAgICAgIHRoaXMuaG91cnMuc2V0KGQuZ2V0SG91cnMoKSk7XG4gICAgICAgIHRoaXMubWludXRlcy5zZXQoZC5nZXRNaW51dGVzKCkpO1xuICAgICAgICB0aGlzLnNlY29uZHMuc2V0KGQuZ2V0U2Vjb25kcygpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVnaXN0ZXJPbkNoYW5nZShmbjogKHZhbHVlOiBEYXRlcGlja2VyVmFsdWUpID0+IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fb25DaGFuZ2UgPSBmbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVnaXN0ZXJPblRvdWNoZWQoZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fb25Ub3VjaGVkID0gZm47XG4gICAgfVxuXG4gICAgcHVibGljIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICB0aGlzLmRpc2FibGVkLnNldChpc0Rpc2FibGVkKTtcbiAgICB9XG5cbiAgICAvLyDilIDilIAgVmFsaWRhdG9yIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gICAgcHVibGljIHZhbGlkYXRlKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsIHtcbiAgICAgICAgbGV0IHZhbHVlOiBEYXRlcGlja2VyVmFsdWU7XG4gICAgICAgIGlmICh0aGlzLmlzTXVsdGlwbGVNb2RlKCkpIHtcbiAgICAgICAgICAgIHZhbHVlID0gdGhpcy5tdWx0aXBsZVZhbHVlcygpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMubW9kZSgpID09PSAncmFuZ2UnKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IHRoaXMucmFuZ2VWYWx1ZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFsdWUgPSB0aGlzLnZhbHVlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuY29tcHV0ZVZhbGlkYXRpb25FcnJvcnModmFsdWUsIGNvbnRyb2wpO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWdpc3Rlck9uVmFsaWRhdG9yQ2hhbmdlKGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgICAgIHRoaXMub25WYWxpZGF0b3JDaGFuZ2UgPSBmbjtcbiAgICB9XG5cbiAgICAvLyDilIDilIAgUHVibGljIGFjdGlvbnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgICBwcm90ZWN0ZWQgb3BlbigpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWQoKSkgcmV0dXJuO1xuICAgICAgICB0aGlzLmlzT3Blbi5zZXQodHJ1ZSk7XG4gICAgICAgIHRoaXMucHJlcGFyZU9wZW5WaWV3KCk7XG4gICAgICAgIHRoaXMuc2hvdy5lbWl0KCk7XG4gICAgICAgIGlmICh0aGlzLm1vZGUoKSA9PT0gJ3RpbWUnKSB7XG4gICAgICAgICAgICBhZnRlck5leHRSZW5kZXIoKCkgPT4gdGhpcy5pbmNyZWFzZUhvdXJCdXR0b24oKT8ubmF0aXZlRWxlbWVudC5mb2N1cygpLCB7IGluamVjdG9yOiB0aGlzLmluamVjdG9yIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5mb2N1c0Jlc3RDYWxlbmRhclRhcmdldCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEFicmUgbyBwYWluZWwgc2VtIHRyYW5zZmVyaXIgbyBmb2NvIHBhcmEgbyBkcm9wZG93biAodXNhZG8gcGVsbyBzaG93T25Gb2N1cykuICovXG4gICAgcHJpdmF0ZSBvcGVuT25Gb2N1cygpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWQoKSB8fCB0aGlzLmlzT3BlbigpKSByZXR1cm47XG4gICAgICAgIHRoaXMuaXNPcGVuLnNldCh0cnVlKTtcbiAgICAgICAgdGhpcy5wcmVwYXJlT3BlblZpZXcoKTtcbiAgICAgICAgdGhpcy5zaG93LmVtaXQoKTtcbiAgICAgICAgLy8gRm9jbyBwZXJtYW5lY2Ugbm8gaW5wdXQg4oCUIG7Do28gY2hhbWEgZm9jdXNCZXN0Q2FsZW5kYXJUYXJnZXQoKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlZmluZSBhIHZpZXcgaW5pY2lhbCBkbyBwYWluZWwgZSBwb3NpY2lvbmEgbyBjYWxlbmTDoXJpbyBubyBgZGVmYXVsdERhdGVgXG4gICAgICogcXVhbmRvIG5lbmh1bSB2YWxvciBlc3TDoSBzZWxlY2lvbmFkby5cbiAgICAgKi9cbiAgICBwcml2YXRlIHByZXBhcmVPcGVuVmlldygpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZGVmYXVsdERhdGUgPSB0aGlzLmRlZmF1bHREYXRlKCk7XG4gICAgICAgIGlmIChkZWZhdWx0RGF0ZSAmJiAhdGhpcy52YWx1ZSgpICYmICF0aGlzLnJhbmdlVmFsdWUoKSkge1xuICAgICAgICAgICAgdGhpcy52aWV3RGF0ZS5zZXQobmV3IERhdGUoZGVmYXVsdERhdGUuZ2V0RnVsbFllYXIoKSwgZGVmYXVsdERhdGUuZ2V0TW9udGgoKSwgMSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm1vZGUoKSA9PT0gJ21vbnRoJykge1xuICAgICAgICAgICAgdGhpcy5waWNrZXJWaWV3LnNldCgnbW9udGhzJyk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5tb2RlKCkgPT09ICd5ZWFyJykge1xuICAgICAgICAgICAgdGhpcy5waWNrZXJWaWV3LnNldCgneWVhcnMnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucGlja2VyVmlldy5zZXQoJ2NhbGVuZGFyJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGZvY3VzQmVzdENhbGVuZGFyVGFyZ2V0KCk6IHZvaWQge1xuICAgICAgICBhZnRlck5leHRSZW5kZXIoXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFuZWwgPSB0aGlzLnBvcHVwUGFuZWwoKT8ubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBpZiAoIXBhbmVsKSByZXR1cm47XG4gICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID1cbiAgICAgICAgICAgICAgICAgICAgcGFuZWwucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oJ1tkYXRhLWZvY3VzPVwic2VsZWN0ZWRcIl0nKSA/P1xuICAgICAgICAgICAgICAgICAgICBwYW5lbC5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PignW2RhdGEtZm9jdXM9XCJ0b2RheVwiXScpID8/XG4gICAgICAgICAgICAgICAgICAgIHBhbmVsLnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KCdidXR0b246bm90KFtkaXNhYmxlZF0pJyk7XG4gICAgICAgICAgICAgICAgdGFyZ2V0Py5mb2N1cygpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHsgaW5qZWN0b3I6IHRoaXMuaW5qZWN0b3IgfSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgY2xvc2VQYW5lbCgpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcGFuZWwgPSAodGhpcy5wb3B1cFBhbmVsKCk/Lm5hdGl2ZUVsZW1lbnQgPz8gdGhpcy5ob3N0RWxlbWVudC5uYXRpdmVFbGVtZW50KSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgdGhpcy5pc09wZW4uc2V0KGZhbHNlKTtcbiAgICAgICAgdGhpcy5wZW5kaW5nUmFuZ2VTdGFydC5zZXQobnVsbCk7XG4gICAgICAgIHRoaXMuaG92ZXJEYXRlLnNldChudWxsKTtcbiAgICAgICAgdGhpcy5fb25Ub3VjaGVkKCk7XG4gICAgICAgIHRoaXMuY2xvc2VkLmVtaXQocGFuZWwpO1xuXG4gICAgICAgIGFmdGVyTmV4dFJlbmRlcihcbiAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmljb25CdXR0b24oKT8ubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHsgaW5qZWN0b3I6IHRoaXMuaW5qZWN0b3IgfSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPIGJhY2tkcm9wIGRvIENESyBPdmVybGF5IGNvYnJlIGEgdGVsYSBpbnRlaXJhLCBpbmNsdWluZG8gbyBwcsOzcHJpbyB0cmlnZ2VyIOKAlCBjbGljYXIgbm9cbiAgICAgKiBpbnB1dCBvdSBub3MgYm90w7VlcyBkbyB0cmlnZ2VyIGVucXVhbnRvIG8gcGFpbmVsIGrDoSBlc3TDoSBhYmVydG8gdGFtYsOpbSBkaXNwYXJhXG4gICAgICogYGJhY2tkcm9wQ2xpY2tgIChvIHByw7NwcmlvIGA8aW5wdXQ+YCBudW5jYSByZWNlYmUgbyBgY2xpY2tgIG5lc3NlIGNhc28sIGVudMOjb1xuICAgICAqIGBoYW5kbGVJbnB1dENsaWNrYCBudW5jYSBkaXNwYXJhKS4gU2VtIGVzdGUgZmlsdHJvLCBjbGljYXIgbm8gaW5wdXQgcGFyYSB0cm9jYXIgZGVcbiAgICAgKiBzZWdtZW50byBmZWNoYXJpYSBvIHBhaW5lbCBlIHJvdWJhcmlhIG8gZm9jbyBwYXJhIG8gYm90w6NvIGRvIMOtY29uZSAodmlhIGBjbG9zZVBhbmVsYCkuXG4gICAgICogUXVhbmRvIG8gY2xpcXVlIGNhaXUgZXNwZWNpZmljYW1lbnRlIHNvYnJlIG8gYDxpbnB1dD5gLCByZWFwbGljYW1vcyBhIG1lc21hIGzDs2dpY2EgZGVcbiAgICAgKiByZXBvc2ljaW9uYW1lbnRvIGRlIHNlZ21lbnRvIHF1ZSBgaGFuZGxlSW5wdXRDbGlja2AgZmFyaWEsIGVtIHZleiBkZSBzw7MgaWdub3JhciBvIGNsaXF1ZS5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgaGFuZGxlQmFja2Ryb3BDbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgICAgICAvLyBgZXZlbnQudGFyZ2V0YCBkZSB1bSBiYWNrZHJvcENsaWNrIGRvIENESyBPdmVybGF5IMOpIHNlbXByZSBvIHByw7NwcmlvIDxkaXY+IGRvXG4gICAgICAgIC8vIGJhY2tkcm9wLCBudW5jYSBvIGVsZW1lbnRvIHJlYWxtZW50ZSBjbGljYWRvIOKAlCBlbnTDo28gY2hlY2FyIGAuY29udGFpbnMoZXZlbnQudGFyZ2V0KWBcbiAgICAgICAgLy8gbnVuY2EgZnVuY2lvbmEuIEVtIHZleiBkaXNzbywgY29tcGFyYW1vcyBhIGNvb3JkZW5hZGEgcmVhbCBkbyBjbGlxdWUgKHF1ZSBvXG4gICAgICAgIC8vIE1vdXNlRXZlbnQgc2VtcHJlIGNhcnJlZ2EgY29ycmV0YW1lbnRlKSBjb250cmEgb3MgcmV0w6JuZ3Vsb3MgZG9zIGVsZW1lbnRvcyBkbyB0cmlnZ2VyLlxuICAgICAgICBjb25zdCBpbnB1dEVsID0gdGhpcy50cmlnZ2VySW5wdXQoKT8ubmF0aXZlRWxlbWVudCBhcyBIVE1MSW5wdXRFbGVtZW50IHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAoaW5wdXRFbCAmJiB0aGlzLmlzU2VnbWVudGVkTW9kZSgpKSB7XG4gICAgICAgICAgICBjb25zdCBpbnB1dFJlY3QgPSBpbnB1dEVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgY29uc3QgY2xpY2tlZE9uSW5wdXQgPVxuICAgICAgICAgICAgICAgIGV2ZW50LmNsaWVudFggPj0gaW5wdXRSZWN0LmxlZnQgJiZcbiAgICAgICAgICAgICAgICBldmVudC5jbGllbnRYIDw9IGlucHV0UmVjdC5yaWdodCAmJlxuICAgICAgICAgICAgICAgIGV2ZW50LmNsaWVudFkgPj0gaW5wdXRSZWN0LnRvcCAmJlxuICAgICAgICAgICAgICAgIGV2ZW50LmNsaWVudFkgPD0gaW5wdXRSZWN0LmJvdHRvbTtcbiAgICAgICAgICAgIGlmIChjbGlja2VkT25JbnB1dCkge1xuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlU2VnbWVudFBvaW50ZXJEb3duKGlucHV0RWwsIGV2ZW50LmNsaWVudFgsIGV2ZW50LnRpbWVTdGFtcCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlY3QgPSB0aGlzLmhvc3RFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIGNvbnN0IGNsaWNrZWRPblRyaWdnZXIgPVxuICAgICAgICAgICAgZXZlbnQuY2xpZW50WCA+PSByZWN0LmxlZnQgJiZcbiAgICAgICAgICAgIGV2ZW50LmNsaWVudFggPD0gcmVjdC5yaWdodCAmJlxuICAgICAgICAgICAgZXZlbnQuY2xpZW50WSA+PSByZWN0LnRvcCAmJlxuICAgICAgICAgICAgZXZlbnQuY2xpZW50WSA8PSByZWN0LmJvdHRvbTtcbiAgICAgICAgaWYgKGNsaWNrZWRPblRyaWdnZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNsb3NlUGFuZWwoKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgdG9nZ2xlKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5pc09wZW4oKSkge1xuICAgICAgICAgICAgdGhpcy5jbG9zZVBhbmVsKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm9wZW4oKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBoYW5kbGVPdmVybGF5S2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAoZXZlbnQua2V5ID09PSAnRXNjYXBlJykge1xuICAgICAgICAgICAgdGhpcy5jbG9zZVBhbmVsKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgaGFuZGxlSW5wdXRDbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuaXNTZWdtZW50ZWRNb2RlKCkgfHwgIShldmVudC50YXJnZXQgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50KSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIEJvdW5kIHRvIGBtb3VzZWRvd25gLCBuw6NvIGBjbGlja2AgKHZlamEgbyBjb21lbnTDoXJpbyBlbSBgYXBwbHlTZWdtZW50Q2xpY2tgKS4gT1xuICAgICAgICAvLyBjb21wb3J0YW1lbnRvIG5hdGl2byBwYWRyw6NvIGRvIGJyb3dzZXIgcHJhIG1vdXNlZG93biBudW0gYDxpbnB1dD5gIGRlIHRleHRvIMOpXG4gICAgICAgIC8vIHBvc2ljaW9uYXIgbyBjYXJldC9pbmljaWFyIHNlbGXDp8OjbyBkZSB0ZXh0byBuYSBjb29yZGVuYWRhIGRvIGNsaXF1ZSDigJQgaXNzbyByb2RhXG4gICAgICAgIC8vICpkZXBvaXMqIGRvcyBub3Nzb3MgbGlzdGVuZXJzIGUgc29icmVzY3JldmVyaWEgbyBgc2V0U2VsZWN0aW9uUmFuZ2VgIGRvIHNlZ21lbnRvXG4gICAgICAgIC8vIGFwbGljYWRvIGxvZ28gYWJhaXhvLiBgcHJldmVudERlZmF1bHQoKWAgZXZpdGEgZXNzYSBjb3JyaWRhLlxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLmhhbmRsZVNlZ21lbnRQb2ludGVyRG93bihldmVudC50YXJnZXQsIGV2ZW50LmNsaWVudFgsIGV2ZW50LnRpbWVTdGFtcCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUG9udG8gZGUgZW50cmFkYSDDum5pY28gcHJvIGNsaXF1ZSBubyBpbnB1dCBzZWdtZW50YWRvIOKAlCBjaGFtYWRvIHRhbnRvIHBvclxuICAgICAqIGBoYW5kbGVJbnB1dENsaWNrYCAobW91c2Vkb3duIGRpcmV0byBubyBgPGlucHV0PmAsIG8gcHJpbWVpcm8gY2xpcXVlLCBhbnRlcyBkbyBiYWNrZHJvcFxuICAgICAqIGV4aXN0aXIpIHF1YW50byBwb3IgYGhhbmRsZUJhY2tkcm9wQ2xpY2tgIChjbGlxdWVzIHNlZ3VpbnRlcywgasOhIGNvbSBvIHBhaW5lbCBhYmVydG8gZSBvXG4gICAgICogYmFja2Ryb3AgY29icmluZG8gbyBpbnB1dCkuIFByZWNpc2Egc2VyIMO6bmljbyBwb3JxdWUgb3MgZG9pcyBjbGlxdWVzIGRlIHVtIGR1cGxvIGNsaXF1ZVxuICAgICAqIHJlYWwgY29zdHVtYW0gY2hlZ2FyIHBvciBjYW1pbmhvcyBESUZFUkVOVEVTIOKAlCBvIHByaW1laXJvIHZpYSBtb3VzZWRvd24gbm8gaW5wdXQsIG9cbiAgICAgKiBzZWd1bmRvIHZpYSBiYWNrZHJvcENsaWNrIOKAlCBlbnTDo28gcmFzdHJlYXIgbyB0aW1lc3RhbXAgZG8gXCLDumx0aW1vIGNsaXF1ZVwiIHNlcGFyYWRhbWVudGVcbiAgICAgKiBlbSBjYWRhIGhhbmRsZXIgbnVuY2EgZGV0ZWN0YXJpYSB1bSBkdXBsbyBjbGlxdWUgZGUgdmVyZGFkZS4gTmVtIGBkYmxjbGlja2AgbmVtXG4gICAgICogYGV2ZW50LmRldGFpbGAgc8OjbyBjb25macOhdmVpcyBhcXVpIChkZXBlbmRlbSBkYSBjb250YWdlbS90YXJnZXRpbmcgaW50ZXJuYSBkZSBjbGlxdWVzIGRvXG4gICAgICogYnJvd3NlciwgcXVlIG5vc3NhcyBtYW5pcHVsYcOnw7VlcyBkZSBmb2NvL3NlbGXDp8OjbyBwYXJlY2VtIGF0cmFwYWxoYXIg4oCUIG9ic2VydmFkb1xuICAgICAqIGVtcGlyaWNhbWVudGU6IGBldmVudC5kZXRhaWxgIGZpY2Egc2VtcHJlIDEpLCBkYcOtIGEgZGV0ZWPDp8OjbyBtYW51YWwgcG9yIHRpbWVzdGFtcC5cbiAgICAgKi9cbiAgICBwcml2YXRlIGhhbmRsZVNlZ21lbnRQb2ludGVyRG93bihpbnB1dDogSFRNTElucHV0RWxlbWVudCwgY2xpZW50WDogbnVtYmVyLCB0aW1lU3RhbXA6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBjb25zdCBpc0RvdWJsZUNsaWNrID0gdGltZVN0YW1wIC0gdGhpcy5sYXN0TW91c2VEb3duQXQgPCBEYXRlcGlja2VyQ29tcG9uZW50LkRPVUJMRV9DTElDS19USFJFU0hPTERfTVM7XG4gICAgICAgIHRoaXMubGFzdE1vdXNlRG93bkF0ID0gdGltZVN0YW1wO1xuICAgICAgICBpZiAoaXNEb3VibGVDbGljaykge1xuICAgICAgICAgICAgdGhpcy5sYXN0TW91c2VEb3duQXQgPSAwOyAvLyBldml0YSBxdWUgdW0gdGVyY2Vpcm8gY2xpcXVlIGVuY2FkZWllIGVtIG91dHJvIFwiZHVwbG9cIlxuICAgICAgICAgICAgdGhpcy5zZWxlY3RXaG9sZUZpZWxkKGlucHV0KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFwcGx5U2VnbWVudENsaWNrKGlucHV0LCBjbGllbnRYKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZWxlY2lvbmEgbyBzZWdtZW50byBzb2IgYSBjb29yZGVuYWRhIGBjbGllbnRYYCBkZSB1bSBjbGlxdWUgbm8gaW5wdXQgc2VnbWVudGFkby5cbiAgICAgKiBDb21wYXJ0aWxoYWRvIHBvciBgaGFuZGxlSW5wdXRDbGlja2AgKG1vdXNlZG93biByZWFsIG5vIGA8aW5wdXQ+YCDigJQgdXNhbW9zIGBtb3VzZWRvd25gXG4gICAgICogZW0gdmV6IGRlIGBjbGlja2AgcG9ycXVlIG8gYGZvY3VzYC9gb3Blbk9uRm9jdXNgIGRpc3BhcmFkbyBubyBtZWlvIGRvIGdlc3RvIHBvZGUgbW9udGFyXG4gICAgICogbyBiYWNrZHJvcCBkbyBDREsgT3ZlcmxheSBlbWJhaXhvIGRvIGN1cnNvciBhbnRlcyBkbyBgbW91c2V1cGAsIGZhemVuZG8gbyBicm93c2VyIHJlc29sdmVyXG4gICAgICogbyBgY2xpY2tgIHBybyBhbmNlc3RyYWwgY29tdW0gZW50cmUgbyBhbHZvIGRvIG1vdXNlZG93biBlIG8gZG8gbW91c2V1cCDigJQgbmEgcHLDoXRpY2EsXG4gICAgICogYDxib2R5PmAg4oCUIGVtIHZleiBkbyBgPGlucHV0PmAgb3UgZG8gYmFja2Ryb3ApIGUgYGhhbmRsZUJhY2tkcm9wQ2xpY2tgIChjbGlxdWUgbm8gdHJpZ2dlclxuICAgICAqIGNvbSBvIHBhaW5lbCBqw6EgYWJlcnRvIGVtIHJlZ2ltZSBlc3TDoXZlbCwgaW50ZXJjZXB0YWRvIHBlbG8gYmFja2Ryb3AgZG8gQ0RLIE92ZXJsYXkpLlxuICAgICAqL1xuICAgIHByaXZhdGUgYXBwbHlTZWdtZW50Q2xpY2soaW5wdXQ6IEhUTUxJbnB1dEVsZW1lbnQsIGNsaWVudFg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICB0aGlzLmVuc3VyZVNlZ21lbnRFbmdpbmVDb25maWd1cmVkKCk7XG4gICAgICAgIC8vIENhbGN1bGEgbyBzZWdtZW50byBhIHBhcnRpciBkYSBjb29yZGVuYWRhIGRvIGNsaXF1ZSAoY2xpZW50WCksIG7Do28gZGVcbiAgICAgICAgLy8gYGlucHV0LnNlbGVjdGlvblN0YXJ0YCDigJQgbyBicm93c2VyIGFqdXN0YSBhIHBvc2nDp8OjbyBkbyBjYXJldCBkZSBmb3JtYSBhc3PDrW5jcm9uYVxuICAgICAgICAvLyBhcMOzcyBvIGNsaXF1ZSAob2JzZXJ2YWRvIGVtcGlyaWNhbWVudGUsIGVzcGVjaWFsbWVudGUgbmEgdHJhbnNpw6fDo28gZGUgZm9jbyksIGVudMOjb1xuICAgICAgICAvLyBsZXIgYHNlbGVjdGlvblN0YXJ0YCBuZXNzZSBtb21lbnRvIMOpIHVtYSBmb250ZSBuw6NvIGNvbmZpw6F2ZWwuIGBjbGllbnRYYCDDqSBzw61uY3Jvbm9cbiAgICAgICAgLy8gZSBpbWVkaWF0bywgc2VtIGVzc2EgY29ycmlkYS5cbiAgICAgICAgY29uc3QgY2hhckluZGV4ID0gdGhpcy5jbGlja0NsaWVudFhUb0NoYXJJbmRleChpbnB1dCwgY2xpZW50WCk7XG4gICAgICAgIGNvbnN0IGdlbmVyYXRpb24gPSArK3RoaXMuaW50ZXJhY3Rpb25HZW5lcmF0aW9uO1xuICAgICAgICAvLyBGb2NhIGUgc2VsZWNpb25hIG8gc2VnbWVudG8ganVudG9zLCBlIHJlYXBsaWNhIG9zIGRvaXMgYWxndW1hcyB2ZXplcyBsb2dvIGVtIHNlZ3VpZGEg4oCUXG4gICAgICAgIC8vIG8gYnJvd3Nlci9DREsgT3ZlcmxheSBwb2RlIG1leGVyIG5vIGZvY28gZGUgZm9ybWEgYXNzw61uY3JvbmEgZGVwb2lzIGRvIGNsaXF1ZSAoYmx1clxuICAgICAgICAvLyBuYXRpdm8gZG8gYmFja2Ryb3AsIGNka1RyYXBGb2N1cyBkbyBwYWluZWwsIGV0Yy4pOyBlbSB2ZXogZGUgdGVudGFyIHByZXZlci9ldml0YXIgY2FkYVxuICAgICAgICAvLyBjYXVzYSwgc2ltcGxlc21lbnRlIHZlbmNlbW9zIHJlYWZpcm1hbmRvIGZvY28rc2VsZcOnw6NvIHBvciBjaW1hLlxuICAgICAgICBjb25zdCBmb2N1c0FuZFNlbGVjdCA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgICAgIGlmIChnZW5lcmF0aW9uICE9PSB0aGlzLmludGVyYWN0aW9uR2VuZXJhdGlvbikgcmV0dXJuO1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLnNlZ21lbnRFbmdpbmUuc2VsZWN0U2VnbWVudEF0KGNoYXJJbmRleCk7XG4gICAgICAgICAgICB0aGlzLnNlZ21lbnRFbmdpbmUuc2VsZWN0U2VnbWVudChpbmRleCk7XG4gICAgICAgICAgICBpbnB1dC5mb2N1cygpO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RBY3RpdmVTZWdtZW50UmFuZ2UoaW5wdXQpO1xuICAgICAgICB9O1xuICAgICAgICBmb2N1c0FuZFNlbGVjdCgpO1xuICAgICAgICBzZXRUaW1lb3V0KGZvY3VzQW5kU2VsZWN0LCAwKTtcbiAgICAgICAgc2V0VGltZW91dChmb2N1c0FuZFNlbGVjdCwgNTApO1xuICAgIH1cblxuICAgIC8qKiBEdXBsbyBjbGlxdWUgc2VsZWNpb25hIG8gaW5wdXQgaW50ZWlybyAodG9kb3Mgb3Mgc2VnbWVudG9zKSwgY29tbyBudW0gYDxpbnB1dD5gIGRlIHRleHRvIGNvbXVtLiAqL1xuICAgIHByb3RlY3RlZCBoYW5kbGVJbnB1dERibENsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5pc1NlZ21lbnRlZE1vZGUoKSB8fCAhKGV2ZW50LnRhcmdldCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQpKSByZXR1cm47XG4gICAgICAgIHRoaXMuc2VsZWN0V2hvbGVGaWVsZChldmVudC50YXJnZXQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlbGVjaW9uYSB0b2RvcyBvcyBzZWdtZW50b3MgZG8gaW5wdXQgKHVzYWRvIHRhbnRvIHBlbG8gZHVwbG8gY2xpcXVlIGRldGVjdGFkbyBuYSBtw6NvIGVtXG4gICAgICogYGhhbmRsZVNlZ21lbnRQb2ludGVyRG93bmAgcXVhbnRvIHBvciBgaGFuZGxlSW5wdXREYmxDbGlja2AsIG1hbnRpZG8gY29tbyBjYW1pbmhvIGRpcmV0b1xuICAgICAqIHByYSBxdWVtIGRpc3BhcmEgdW0gYGRibGNsaWNrYCBkZSB2ZXJkYWRlLCBleC46IGFjZXNzaWJpbGlkYWRlL3Rlc3RlcykuXG4gICAgICovXG4gICAgcHJpdmF0ZSBzZWxlY3RXaG9sZUZpZWxkKGlucHV0OiBIVE1MSW5wdXRFbGVtZW50KTogdm9pZCB7XG4gICAgICAgIHRoaXMuZW5zdXJlU2VnbWVudEVuZ2luZUNvbmZpZ3VyZWQoKTtcbiAgICAgICAgLy8gR2FyYW50ZSB1bSBzZWdtZW50byBhdGl2byAqYW50ZXMqIGRlIGZvY2FyOiBzZSBvIENESyBPdmVybGF5IHRpdmVyIHJvdWJhZG8gbyBmb2NvIGRlXG4gICAgICAgIC8vIGZvcm1hIGFzc8OtbmNyb25hIChibHVyKSBlbnRyZSBvcyBjbGlxdWVzIHF1ZSBjb21ww7VlbSBvIGR1cGxvIGNsaXF1ZSwgbyBgaW5wdXQuZm9jdXMoKWBcbiAgICAgICAgLy8gYWJhaXhvIGRpc3BhcmEgdW0gZXZlbnRvIGBmb2N1c2AgZ2VudcOtbm8sIGUgaGFuZGxlSW5wdXRGb2N1cyBzw7MgZXZpdGEgYWdlbmRhciBzdWEgcHLDs3ByaWFcbiAgICAgICAgLy8gcmVhcGxpY2HDp8OjbyBjb25jb3JyZW50ZSAocXVlIHNvYnJlc2NyZXZlcmlhIG5vc3NhIHNlbGXDp8OjbyBkbyBjYW1wbyBpbnRlaXJvIG1haXMgdGFyZGUpXG4gICAgICAgIC8vIHF1YW5kbyBlbmNvbnRyYSBgZ2V0QWN0aXZlSW5kZXgoKSAhPT0gbnVsbGAg4oCUIG8gbWVzbW8gbW90aXZvIHBlbG8gcXVhbCBoYW5kbGVJbnB1dENsaWNrXG4gICAgICAgIC8vIHNlbXByZSBjaGFtYSBgc2VnbWVudEVuZ2luZS5zZWxlY3RTZWdtZW50KGluZGV4KWAgYW50ZXMgZGUgYGlucHV0LmZvY3VzKClgLlxuICAgICAgICBpZiAodGhpcy5zZWdtZW50RW5naW5lLmdldEFjdGl2ZUluZGV4KCkgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuc2VnbWVudEVuZ2luZS5zZWxlY3RGaXJzdFNlZ21lbnQoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBnZW5lcmF0aW9uID0gKyt0aGlzLmludGVyYWN0aW9uR2VuZXJhdGlvbjtcbiAgICAgICAgLy8gTWVzbW8gcGFkcsOjbyBkZWZlbnNpdm8gZGUgaGFuZGxlSW5wdXRDbGljazogbyBjbGlxdWUgcXVlIGZlY2hhIG8gZHVwbG8gY2xpcXVlIGrDoSByb2RvdVxuICAgICAgICAvLyBoYW5kbGVJbnB1dENsaWNrIChzZWxlY2lvbmFuZG8gc8OzIHVtIHNlZ21lbnRvKSBlIHBvZGUgdGVyIGFnZW5kYWRvIHN1YXMgcHLDs3ByaWFzXG4gICAgICAgIC8vIHJlYXBsaWNhw6fDtWVzIGFkaWFkYXMg4oCUIGEgZ2VyYcOnw6NvIHJlY8OpbS1pbmNyZW1lbnRhZGEgYXMgaW52YWxpZGEsIGVudMOjbyBzw7MgYSBzZWxlw6fDo28gZG9cbiAgICAgICAgLy8gY2FtcG8gaW50ZWlybyBzb2JyZXZpdmUuXG4gICAgICAgIGNvbnN0IGZvY3VzQW5kU2VsZWN0QWxsID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgaWYgKGdlbmVyYXRpb24gIT09IHRoaXMuaW50ZXJhY3Rpb25HZW5lcmF0aW9uKSByZXR1cm47XG4gICAgICAgICAgICBpbnB1dC5mb2N1cygpO1xuICAgICAgICAgICAgaW5wdXQuc2V0U2VsZWN0aW9uUmFuZ2UoMCwgaW5wdXQudmFsdWUubGVuZ3RoKTtcbiAgICAgICAgfTtcbiAgICAgICAgZm9jdXNBbmRTZWxlY3RBbGwoKTtcbiAgICAgICAgc2V0VGltZW91dChmb2N1c0FuZFNlbGVjdEFsbCwgMCk7XG4gICAgICAgIHNldFRpbWVvdXQoZm9jdXNBbmRTZWxlY3RBbGwsIDUwKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgaGFuZGxlSW5wdXRGb2N1cyhldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pc0ZvY3VzZWQuc2V0KHRydWUpO1xuICAgICAgICB0aGlzLmZvY3VzZWQuZW1pdChldmVudCk7XG4gICAgICAgIGlmICh0aGlzLmlzU2VnbWVudGVkTW9kZSgpICYmIGV2ZW50LnRhcmdldCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMuZW5zdXJlU2VnbWVudEVuZ2luZUNvbmZpZ3VyZWQoKTtcbiAgICAgICAgICAgIGNvbnN0IGlucHV0ID0gZXZlbnQudGFyZ2V0O1xuICAgICAgICAgICAgaWYgKGlucHV0LnZhbHVlID09PSAnJykge1xuICAgICAgICAgICAgICAgIGlucHV0LnZhbHVlID0gdGhpcy5zZWdtZW50RW5naW5lLmdldERpc3BsYXlTdHJpbmcoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLnNlZ21lbnRFbmdpbmUuZ2V0QWN0aXZlSW5kZXgoKSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIC8vIEZvY28gXCJnZW51w61ub1wiIChUYWIgYSBwYXJ0aXIgZGUgb3V0cm8gY2FtcG8sIG91IHByaW1laXJvIGZvY28gbm8gY2FtcG8pIOKAlFxuICAgICAgICAgICAgICAgIC8vIG5lbmh1bSBzZWdtZW50byBhdGl2byBhaW5kYSwgZW50w6NvIHNlbGVjaW9uYSBvIHByaW1laXJvLlxuICAgICAgICAgICAgICAgIGNvbnN0IGdlbmVyYXRpb24gPSArK3RoaXMuaW50ZXJhY3Rpb25HZW5lcmF0aW9uO1xuICAgICAgICAgICAgICAgIHRoaXMuc2VnbWVudEVuZ2luZS5zZWxlY3RGaXJzdFNlZ21lbnQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdEFjdGl2ZVNlZ21lbnRSYW5nZShpbnB1dCk7XG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChnZW5lcmF0aW9uICE9PSB0aGlzLmludGVyYWN0aW9uR2VuZXJhdGlvbikgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zZWdtZW50RW5naW5lLmdldEFjdGl2ZUluZGV4KCkgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0QWN0aXZlU2VnbWVudFJhbmdlKGlucHV0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIDApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBKw6EgZXhpc3RlIHVtIHNlZ21lbnRvIGF0aXZvIOKAlCBwb3IgZXhlbXBsbywgaGFuZGxlSW5wdXRDbGljayBhY2Fib3UgZGVcbiAgICAgICAgICAgICAgICAvLyBkZWZpbmktbG8gZSBlc3TDoSByZWZvY2FuZG8gbyBpbnB1dCBwcm9ncmFtYXRpY2FtZW50ZSBhcMOzcyB1bSBibHVyIGVzcMO6cmlvLlxuICAgICAgICAgICAgICAgIC8vIE7Do28gcmVpbmljaWEgcGFyYSBvIHByaW1laXJvIHNlZ21lbnRvOyBzw7MgZ2FyYW50ZSBxdWUgYSBzZWxlw6fDo28gdmlzdWFsIGJhdGFcbiAgICAgICAgICAgICAgICAvLyBjb20gbyBlc3RhZG8gYXR1YWwuXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RBY3RpdmVTZWdtZW50UmFuZ2UoaW5wdXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnNob3dPbkZvY3VzKCkpIHtcbiAgICAgICAgICAgIHRoaXMub3Blbk9uRm9jdXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBNYXBlaWEgYSBjb29yZGVuYWRhIFggKHZpZXdwb3J0KSBkZSB1bSBjbGlxdWUgcGFyYSBvIMOtbmRpY2UgZGUgY2FyYWN0ZXJlIG1haXMgcHLDs3hpbW8gbm8gdmFsb3IgZXhpYmlkby4gKi9cbiAgICBwcml2YXRlIGNsaWNrQ2xpZW50WFRvQ2hhckluZGV4KGlucHV0OiBIVE1MSW5wdXRFbGVtZW50LCBjbGllbnRYOiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICBjb25zdCBzdHlsZSA9IGdldENvbXB1dGVkU3R5bGUoaW5wdXQpO1xuICAgICAgICBjb25zdCBjYW52YXMgPSAodGhpcy5tZWFzdXJlQ2FudmFzID8/PSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKSk7XG4gICAgICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgICAgICBpZiAoIWN0eCkgcmV0dXJuIDA7XG4gICAgICAgIGN0eC5mb250ID0gYCR7c3R5bGUuZm9udFN0eWxlfSAke3N0eWxlLmZvbnRXZWlnaHR9ICR7c3R5bGUuZm9udFNpemV9ICR7c3R5bGUuZm9udEZhbWlseX1gO1xuICAgICAgICBjb25zdCByZWN0ID0gaW5wdXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIGNvbnN0IHBhZGRpbmdMZWZ0ID0gcGFyc2VGbG9hdChzdHlsZS5wYWRkaW5nTGVmdCkgfHwgMDtcbiAgICAgICAgY29uc3QgbG9jYWxYID0gY2xpZW50WCAtIHJlY3QubGVmdCAtIHBhZGRpbmdMZWZ0ICsgaW5wdXQuc2Nyb2xsTGVmdDtcbiAgICAgICAgY29uc3QgdGV4dCA9IGlucHV0LnZhbHVlO1xuICAgICAgICBsZXQgYmVzdEluZGV4ID0gMDtcbiAgICAgICAgbGV0IGJlc3REaXN0YW5jZSA9IEluZmluaXR5O1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8PSB0ZXh0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBkaXN0YW5jZSA9IE1hdGguYWJzKGN0eC5tZWFzdXJlVGV4dCh0ZXh0LnNsaWNlKDAsIGkpKS53aWR0aCAtIGxvY2FsWCk7XG4gICAgICAgICAgICBpZiAoZGlzdGFuY2UgPCBiZXN0RGlzdGFuY2UpIHtcbiAgICAgICAgICAgICAgICBiZXN0RGlzdGFuY2UgPSBkaXN0YW5jZTtcbiAgICAgICAgICAgICAgICBiZXN0SW5kZXggPSBpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBiZXN0SW5kZXg7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGhhbmRsZU5hdGl2ZUlucHV0KGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgICAgICB0aGlzLnZhbHVlSW5wdXQuZW1pdChldmVudCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGhhbmRsZUlucHV0Qmx1cihldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pc0ZvY3VzZWQuc2V0KGZhbHNlKTtcbiAgICAgICAgdGhpcy5ibHVycmVkLmVtaXQoZXZlbnQpO1xuICAgICAgICBjb25zdCBpbnB1dCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgICAgICBjb25zdCB3YXNTZWdtZW50ZWQgPSB0aGlzLmlzU2VnbWVudGVkTW9kZSgpO1xuICAgICAgICBpZiAod2FzU2VnbWVudGVkKSB7XG4gICAgICAgICAgICB0aGlzLmVuc3VyZVNlZ21lbnRFbmdpbmVDb25maWd1cmVkKCk7XG4gICAgICAgICAgICB0aGlzLnNlZ21lbnRFbmdpbmUuZGVhY3RpdmF0ZSgpO1xuICAgICAgICAgICAgdGhpcy5jb21taXRTZWdtZW50ZWRWYWx1ZUlmQ29tcGxldGUoKTtcbiAgICAgICAgICAgIHRoaXMuaW5wdXREYXRlID0gdGhpcy5zZWdtZW50RW5naW5lLmlzRW1wdHkoKSA/ICcnIDogdGhpcy5zZWdtZW50RW5naW5lLmdldERpc3BsYXlTdHJpbmcoKTtcbiAgICAgICAgICAgIGlucHV0LnZhbHVlID0gdGhpcy5pbnB1dERhdGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpbnB1dC52YWx1ZT8udHJpbSgpKSB7XG4gICAgICAgICAgICB0aGlzLm9uVmFsaWRhdG9yQ2hhbmdlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaXNPcGVuKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlbGF0ZWRUYXJnZXQgPSAoZXZlbnQgYXMgRm9jdXNFdmVudCkucmVsYXRlZFRhcmdldCBhcyBIVE1MRWxlbWVudCB8IG51bGw7XG4gICAgICAgICAgICBjb25zdCBwYW5lbCA9IHRoaXMucG9wdXBQYW5lbCgpPy5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgLy8gRW0gbW9kbyBzZWdtZW50YWRvLCB1bSBibHVyIHNlbSBgcmVsYXRlZFRhcmdldGAgbm9ybWFsbWVudGUgbsOjbyDDqSB1bWEgc2HDrWRhIHJlYWxcbiAgICAgICAgICAgIC8vIGRlIGZvY28g4oCUIMOpIG8gYmFja2Ryb3AgdHJhbnNwYXJlbnRlIGRvIHByw7NwcmlvIHBvcHVwIChuw6NvIGZvY8OhdmVsKSBpbnRlcmNlcHRhbmRvXG4gICAgICAgICAgICAvLyB1bSBjbGlxdWUgbm8gdHJpZ2dlciBwYXJhIHRyb2NhciBkZSBzZWdtZW50by4gTsOjbyByZWRpcmVjaW9uYSBvIGZvY28gcHJvIHBhaW5lbFxuICAgICAgICAgICAgLy8gbmVzc2UgY2FzbzsgZGVpeGEgaGFuZGxlSW5wdXRDbGljay9oYW5kbGVJbnB1dEZvY3VzIHJlc29sdmVyZW0gKGVsZXMgcmVmb2NhbSBvXG4gICAgICAgICAgICAvLyBpbnB1dCBlIHJlYXBsaWNhbSBvIHNlZ21lbnRvIGNvcnJldG8gbG9nbyBlbSBzZWd1aWRhKS5cbiAgICAgICAgICAgIGNvbnN0IGxvb2tzTGlrZU93blRyaWdnZXJDbGljayA9IHdhc1NlZ21lbnRlZCAmJiAhcmVsYXRlZFRhcmdldDtcbiAgICAgICAgICAgIGlmICghbG9va3NMaWtlT3duVHJpZ2dlckNsaWNrICYmICghcmVsYXRlZFRhcmdldCB8fCAhcGFuZWw/LmNvbnRhaW5zKHJlbGF0ZWRUYXJnZXQpKSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm1vZGUoKSA9PT0gJ3RpbWUnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5jcmVhc2VIb3VyQnV0dG9uKCk/Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgcGFuZWw/LnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KCdbZGF0YS1mb2N1cz1cInNlbGVjdGVkXCJdJykgPz9cbiAgICAgICAgICAgICAgICAgICAgICAgIHBhbmVsPy5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PignW2RhdGEtZm9jdXM9XCJ0b2RheVwiXScpID8/XG4gICAgICAgICAgICAgICAgICAgICAgICBwYW5lbD8ucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oJ2J1dHRvbjpub3QoW2Rpc2FibGVkXSknKTtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0Py5mb2N1cygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBoYW5kbGVJbnB1dENoYW5nZShyYXc6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5pc1NlZ21lbnRNb2RlQ2FuZGlkYXRlKCkpIHJldHVybjtcbiAgICAgICAgaWYgKCFyYXc/LnRyaW0oKSkge1xuICAgICAgICAgICAgdGhpcy52YWx1ZS5zZXQobnVsbCk7XG4gICAgICAgICAgICB0aGlzLnJhbmdlVmFsdWUuc2V0KG51bGwpO1xuICAgICAgICAgICAgdGhpcy5faGFzRm9ybWF0RXJyb3IgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMub25WYWxpZGF0b3JDaGFuZ2UoKTtcbiAgICAgICAgICAgIHRoaXMuX29uQ2hhbmdlKG51bGwpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlSW5wdXQodGhpcy5tb2RlKCksIHJhdywgdGhpcy5yYW5nZVNlcGFyYXRvcigpKTtcbiAgICAgICAgaWYgKHBhcnNlZCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5faGFzRm9ybWF0RXJyb3IgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5vblZhbGlkYXRvckNoYW5nZSgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2hhc0Zvcm1hdEVycm9yID0gZmFsc2U7XG4gICAgICAgIHRoaXMub25WYWxpZGF0b3JDaGFuZ2UoKTtcbiAgICAgICAgaWYgKHRoaXMuaXNEYXRlUmFuZ2UocGFyc2VkKSkge1xuICAgICAgICAgICAgdGhpcy5yYW5nZVZhbHVlLnNldChwYXJzZWQpO1xuICAgICAgICAgICAgdGhpcy5fb25DaGFuZ2UocGFyc2VkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGQgPSBwYXJzZWQgYXMgRGF0ZTtcbiAgICAgICAgICAgIHRoaXMudmFsdWUuc2V0KGQpO1xuICAgICAgICAgICAgdGhpcy52aWV3RGF0ZS5zZXQobmV3IERhdGUoZC5nZXRGdWxsWWVhcigpLCBkLmdldE1vbnRoKCksIDEpKTtcbiAgICAgICAgICAgIHRoaXMuaG91cnMuc2V0KGQuZ2V0SG91cnMoKSk7XG4gICAgICAgICAgICB0aGlzLm1pbnV0ZXMuc2V0KGQuZ2V0TWludXRlcygpKTtcbiAgICAgICAgICAgIHRoaXMuX29uQ2hhbmdlKGQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGhhbmRsZVRyaWdnZXJLZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmlzU2VnbWVudGVkTW9kZSgpICYmIGV2ZW50LnRhcmdldCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlU2VnbWVudGVkS2V5ZG93bihldmVudCwgZXZlbnQudGFyZ2V0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXZlbnQua2V5ID09PSAnRW50ZXInIHx8IGV2ZW50LmtleSA9PT0gJyAnKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdGhpcy5vcGVuKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogVGVjbGFzIHF1ZSBkZXZlbSBwYXNzYXIgZGlyZXRvIHBhcmEgbyBicm93c2VyIHNlbSBpbnNlcmlyL2FsdGVyYXIgbmFkYSBubyBjYW1wby4gKi9cbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBTRUdNRU5URURfUEFTU1RIUk9VR0hfS0VZUyA9IFsnSG9tZScsICdFbmQnLCAnU2hpZnQnLCAnQ2Fwc0xvY2snLCAnRXNjYXBlJywgJ0VudGVyJywgJyAnXTtcblxuICAgIC8qKiBEaWdpdGHDp8OjbyBwb3Igc2VnbWVudG8gKGRpYS9tw6pzL2Fuby9ob3JhL21pbnV0by9zZWd1bmRvL2FtcG0pIG5vIGlucHV0IGRvIHRyaWdnZXIuICovXG4gICAgcHJpdmF0ZSBoYW5kbGVTZWdtZW50ZWRLZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50LCBpbnB1dDogSFRNTElucHV0RWxlbWVudCk6IHZvaWQge1xuICAgICAgICB0aGlzLmVuc3VyZVNlZ21lbnRFbmdpbmVDb25maWd1cmVkKCk7XG4gICAgICAgIGNvbnN0IHsga2V5LCBjdHJsS2V5LCBtZXRhS2V5LCBhbHRLZXksIHNoaWZ0S2V5IH0gPSBldmVudDtcbiAgICAgICAgaWYgKGN0cmxLZXkgfHwgbWV0YUtleSB8fCBhbHRLZXkgfHwga2V5LnN0YXJ0c1dpdGgoJ0YnKSkgcmV0dXJuO1xuICAgICAgICBpZiAoRGF0ZXBpY2tlckNvbXBvbmVudC5TRUdNRU5URURfUEFTU1RIUk9VR0hfS0VZUy5pbmNsdWRlcyhrZXkpKSByZXR1cm47XG4gICAgICAgIHRoaXMuaW50ZXJhY3Rpb25HZW5lcmF0aW9uKys7XG5cbiAgICAgICAgaWYgKGtleSA9PT0gJ1RhYicpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuc2VnbWVudEVuZ2luZS5tb3ZlVG9BZGphY2VudFNlZ21lbnQoc2hpZnRLZXkgPyAtMSA6IDEpO1xuICAgICAgICAgICAgdGhpcy5zeW5jU2VnbWVudGVkSW5wdXQoaW5wdXQpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gJ21vdmVkJykge1xuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoa2V5ID09PSAnQXJyb3dMZWZ0JyB8fCBrZXkgPT09ICdBcnJvd1JpZ2h0Jykge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIC8vIEFvIGNvbnRyw6FyaW8gZG8gVGFiLCBzZXRhIG5vIHByaW1laXJvL8O6bHRpbW8gc2VnbWVudG8gbsOjbyBkZXZlIHNhaXIgZG8gY2FtcG8gbmVtXG4gICAgICAgICAgICAvLyBkZXNhdGl2YXIgYSBzZWxlw6fDo28g4oCUIGBtb3ZlVG9BZGphY2VudFNlZ21lbnRgIHplcmEgYGFjdGl2ZUluZGV4YCBhbyBiYXRlciBubyBsaW1pdGVcbiAgICAgICAgICAgIC8vIChjb21wb3J0YW1lbnRvIGNlcnRvIHBybyBUYWIgZXNjYXBhciBkbyBjYW1wbyksIGVudMOjbyBuYSBib3JkYSBhIGdlbnRlIHJlc2VsZWNpb25hXG4gICAgICAgICAgICAvLyBvIHNlZ21lbnRvIHF1ZSBqw6EgZXN0YXZhIGF0aXZvLCBpbWl0YW5kbyBvIGA8aW5wdXQgdHlwZT1cImRhdGVcIj5gIG5hdGl2byAoYSBzZXRhIHNvbWVcbiAgICAgICAgICAgIC8vIG5vIGxpbWl0ZSwgbsOjbyBuYXZlZ2EgcHJhIGZvcmEpLlxuICAgICAgICAgICAgY29uc3QgYmVmb3JlID0gdGhpcy5zZWdtZW50RW5naW5lLmdldEFjdGl2ZUluZGV4KCk7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLnNlZ21lbnRFbmdpbmUubW92ZVRvQWRqYWNlbnRTZWdtZW50KGtleSA9PT0gJ0Fycm93TGVmdCcgPyAtMSA6IDEpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gJ2JvdW5kYXJ5JyAmJiBiZWZvcmUgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlZ21lbnRFbmdpbmUuc2VsZWN0U2VnbWVudChiZWZvcmUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zeW5jU2VnbWVudGVkSW5wdXQoaW5wdXQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGtleSA9PT0gJ0Fycm93VXAnIHx8IGtleSA9PT0gJ0Fycm93RG93bicpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLnNlZ21lbnRFbmdpbmUuaW5jcmVtZW50QWN0aXZlU2VnbWVudChrZXkgPT09ICdBcnJvd1VwJyA/IDEgOiAtMSk7XG4gICAgICAgICAgICB0aGlzLnN5bmNTZWdtZW50ZWRJbnB1dChpbnB1dCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoa2V5ID09PSAnQmFja3NwYWNlJyB8fCBrZXkgPT09ICdEZWxldGUnKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgY29uc3QgaXNXaG9sZUZpZWxkU2VsZWN0ZWQgPSBpbnB1dC5zZWxlY3Rpb25TdGFydCA9PT0gMCAmJiBpbnB1dC5zZWxlY3Rpb25FbmQgPT09IGlucHV0LnZhbHVlLmxlbmd0aDtcbiAgICAgICAgICAgIGlmIChpc1dob2xlRmllbGRTZWxlY3RlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VnbWVudEVuZ2luZS5jbGVhckFsbCgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlZ21lbnRFbmdpbmUuY2xlYXJBY3RpdmVTZWdtZW50KGtleSA9PT0gJ0JhY2tzcGFjZScgPyAnYmFja3NwYWNlJyA6ICdkZWxldGUnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc3luY1NlZ21lbnRlZElucHV0KGlucHV0KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgvXlswLTldJC8udGVzdChrZXkpKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdGhpcy5zZWdtZW50RW5naW5lLnR5cGVEaWdpdChrZXkpO1xuICAgICAgICAgICAgdGhpcy5zeW5jU2VnbWVudGVkSW5wdXQoaW5wdXQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuc2VnbWVudEVuZ2luZS5hY3RpdmVLaW5kKCkgPT09ICdhbXBtJyAmJiAvXlthcEFQXSQvLnRlc3Qoa2V5KSkge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHRoaXMuc2VnbWVudEVuZ2luZS5zZXRBbVBtKGtleS50b0xvd2VyQ2FzZSgpID09PSAnYScgPyAwIDogMSk7XG4gICAgICAgICAgICB0aGlzLnN5bmNTZWdtZW50ZWRJbnB1dChpbnB1dCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBRdWFscXVlciBvdXRyYSB0ZWNsYSBpbXByaW3DrXZlbCAobGV0cmFzLCBzw61tYm9sb3MpIG7Do28gw6kgaW5zZXJpZGEgbm8gY2FtcG8uXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuXG4gICAgLyoqIFNpbmNyb25pemEgbyBET00gY29tIG8gZXN0YWRvIGF0dWFsIGRhIGVuZ2luZSAodmFsb3IgKyBzZWxlw6fDo28gZG8gc2VnbWVudG8gYXRpdm8pIGFww7NzIHVtYSBtdXRhw6fDo28uICovXG4gICAgcHJpdmF0ZSBzeW5jU2VnbWVudGVkSW5wdXQoaW5wdXQ6IEhUTUxJbnB1dEVsZW1lbnQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pbnB1dERhdGUgPSB0aGlzLnNlZ21lbnRFbmdpbmUuZ2V0RGlzcGxheVN0cmluZygpO1xuICAgICAgICBpbnB1dC52YWx1ZSA9IHRoaXMuaW5wdXREYXRlO1xuICAgICAgICB0aGlzLnNlbGVjdEFjdGl2ZVNlZ21lbnRSYW5nZShpbnB1dCk7XG4gICAgICAgIGlucHV0LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCdpbnB1dCcsIHsgYnViYmxlczogdHJ1ZSB9KSk7XG4gICAgICAgIHRoaXMuY29tbWl0U2VnbWVudGVkVmFsdWVJZkNvbXBsZXRlKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZWxlY3RBY3RpdmVTZWdtZW50UmFuZ2UoaW5wdXQ6IEhUTUxJbnB1dEVsZW1lbnQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLnNlZ21lbnRFbmdpbmUuZ2V0QWN0aXZlSW5kZXgoKTtcbiAgICAgICAgaWYgKGluZGV4ID09PSBudWxsKSByZXR1cm47XG4gICAgICAgIGNvbnN0IFtzdGFydCwgZW5kXSA9IHRoaXMuc2VnbWVudEVuZ2luZS5nZXRTZWdtZW50UmFuZ2UoaW5kZXgpO1xuICAgICAgICBpbnB1dC5zZXRTZWxlY3Rpb25SYW5nZShzdGFydCwgZW5kKTtcbiAgICB9XG5cbiAgICAvKiogUHJvcGFnYSBvIHZhbG9yIGRhIGVuZ2luZSBwYXJhIG8gbW9kZWxvIChDVkEpIGFzc2ltIHF1ZSB0b2RvcyBvcyBzZWdtZW50b3MgZXN0aXZlcmVtIGNvbXBsZXRvcy4gKi9cbiAgICBwcml2YXRlIGNvbW1pdFNlZ21lbnRlZFZhbHVlSWZDb21wbGV0ZSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLnNlZ21lbnRFbmdpbmUuaXNDb21wbGV0ZSgpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy52YWx1ZSgpICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy52YWx1ZS5zZXQobnVsbCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fb25DaGFuZ2UobnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYmFzZSA9XG4gICAgICAgICAgICB0aGlzLnZhbHVlKCkgPz9cbiAgICAgICAgICAgIG5ldyBEYXRlKFxuICAgICAgICAgICAgICAgIG5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKSxcbiAgICAgICAgICAgICAgICBuZXcgRGF0ZSgpLmdldE1vbnRoKCksXG4gICAgICAgICAgICAgICAgbmV3IERhdGUoKS5nZXREYXRlKCksXG4gICAgICAgICAgICAgICAgdGhpcy5ob3VycygpLFxuICAgICAgICAgICAgICAgIHRoaXMubWludXRlcygpLFxuICAgICAgICAgICAgICAgIHRoaXMuc2hvd1NlY29uZHMoKSA/IHRoaXMuc2Vjb25kcygpIDogMCxcbiAgICAgICAgICAgICk7XG4gICAgICAgIGNvbnN0IGRhdGUgPSB0aGlzLnNlZ21lbnRFbmdpbmUudG9EYXRlKGJhc2UpO1xuICAgICAgICBpZiAoIWRhdGUpIHJldHVybjtcbiAgICAgICAgdGhpcy52YWx1ZS5zZXQoZGF0ZSk7XG4gICAgICAgIGlmICh0aGlzLnNob3dDYWxlbmRhcigpKSB7XG4gICAgICAgICAgICB0aGlzLnZpZXdEYXRlLnNldChuZXcgRGF0ZShkYXRlLmdldEZ1bGxZZWFyKCksIGRhdGUuZ2V0TW9udGgoKSwgMSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnNob3dUaW1lUGlja2VyKCkpIHtcbiAgICAgICAgICAgIHRoaXMuaG91cnMuc2V0KGRhdGUuZ2V0SG91cnMoKSk7XG4gICAgICAgICAgICB0aGlzLm1pbnV0ZXMuc2V0KGRhdGUuZ2V0TWludXRlcygpKTtcbiAgICAgICAgICAgIHRoaXMuc2Vjb25kcy5zZXQoZGF0ZS5nZXRTZWNvbmRzKCkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX29uQ2hhbmdlKGRhdGUpO1xuICAgIH1cblxuICAgIC8vIOKUgOKUgCBOYXZpZ2F0aW9uIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gICAgcHJvdGVjdGVkIG5hdmlnYXRlUHJldigpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgdmlldyA9IHRoaXMudmlld0RhdGUoKTtcbiAgICAgICAgaWYgKHRoaXMucGlja2VyVmlldygpID09PSAneWVhcnMnKSB7XG4gICAgICAgICAgICB0aGlzLnZpZXdEYXRlLnNldChuZXcgRGF0ZSh2aWV3LmdldEZ1bGxZZWFyKCkgLSAxMCwgdmlldy5nZXRNb250aCgpLCAxKSk7XG4gICAgICAgICAgICB0aGlzLnllYXJDaGFuZ2UuZW1pdCh7IG1vbnRoOiB2aWV3LmdldE1vbnRoKCksIHllYXI6IHZpZXcuZ2V0RnVsbFllYXIoKSAtIDEwIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMucGlja2VyVmlldygpID09PSAnbW9udGhzJykge1xuICAgICAgICAgICAgdGhpcy52aWV3RGF0ZS5zZXQobmV3IERhdGUodmlldy5nZXRGdWxsWWVhcigpIC0gMSwgdmlldy5nZXRNb250aCgpLCAxKSk7XG4gICAgICAgICAgICB0aGlzLnllYXJDaGFuZ2UuZW1pdCh7IG1vbnRoOiB2aWV3LmdldE1vbnRoKCksIHllYXI6IHZpZXcuZ2V0RnVsbFllYXIoKSAtIDEgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBuZXdEYXRlID0gbmV3IERhdGUodmlldy5nZXRGdWxsWWVhcigpLCB2aWV3LmdldE1vbnRoKCkgLSAxLCAxKTtcbiAgICAgICAgICAgIHRoaXMudmlld0RhdGUuc2V0KG5ld0RhdGUpO1xuICAgICAgICAgICAgdGhpcy5tb250aENoYW5nZS5lbWl0KHsgbW9udGg6IG5ld0RhdGUuZ2V0TW9udGgoKSwgeWVhcjogbmV3RGF0ZS5nZXRGdWxsWWVhcigpIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIG5hdmlnYXRlTmV4dCgpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgdmlldyA9IHRoaXMudmlld0RhdGUoKTtcbiAgICAgICAgaWYgKHRoaXMucGlja2VyVmlldygpID09PSAneWVhcnMnKSB7XG4gICAgICAgICAgICB0aGlzLnZpZXdEYXRlLnNldChuZXcgRGF0ZSh2aWV3LmdldEZ1bGxZZWFyKCkgKyAxMCwgdmlldy5nZXRNb250aCgpLCAxKSk7XG4gICAgICAgICAgICB0aGlzLnllYXJDaGFuZ2UuZW1pdCh7IG1vbnRoOiB2aWV3LmdldE1vbnRoKCksIHllYXI6IHZpZXcuZ2V0RnVsbFllYXIoKSArIDEwIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMucGlja2VyVmlldygpID09PSAnbW9udGhzJykge1xuICAgICAgICAgICAgdGhpcy52aWV3RGF0ZS5zZXQobmV3IERhdGUodmlldy5nZXRGdWxsWWVhcigpICsgMSwgdmlldy5nZXRNb250aCgpLCAxKSk7XG4gICAgICAgICAgICB0aGlzLnllYXJDaGFuZ2UuZW1pdCh7IG1vbnRoOiB2aWV3LmdldE1vbnRoKCksIHllYXI6IHZpZXcuZ2V0RnVsbFllYXIoKSArIDEgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBuZXdEYXRlID0gbmV3IERhdGUodmlldy5nZXRGdWxsWWVhcigpLCB2aWV3LmdldE1vbnRoKCkgKyAxLCAxKTtcbiAgICAgICAgICAgIHRoaXMudmlld0RhdGUuc2V0KG5ld0RhdGUpO1xuICAgICAgICAgICAgdGhpcy5tb250aENoYW5nZS5lbWl0KHsgbW9udGg6IG5ld0RhdGUuZ2V0TW9udGgoKSwgeWVhcjogbmV3RGF0ZS5nZXRGdWxsWWVhcigpIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGhhbmRsZUNhbGVuZGFyR3JpZEtleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgQVJST1dTID0gWydBcnJvd0xlZnQnLCAnQXJyb3dSaWdodCcsICdBcnJvd1VwJywgJ0Fycm93RG93biddO1xuICAgICAgICBpZiAoIUFSUk9XUy5pbmNsdWRlcyhldmVudC5rZXkpKSByZXR1cm47XG5cbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICBjb25zdCBncmlkID0gZXZlbnQuY3VycmVudFRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgY29uc3QgYnV0dG9ucyA9IEFycmF5LmZyb20oZ3JpZC5xdWVyeVNlbGVjdG9yQWxsPEhUTUxCdXR0b25FbGVtZW50PignYnV0dG9uW3JvbGU9XCJncmlkY2VsbFwiXScpKTtcbiAgICAgICAgY29uc3QgY3VycmVudElkeCA9IGJ1dHRvbnMuaW5kZXhPZihldmVudC50YXJnZXQgYXMgSFRNTEJ1dHRvbkVsZW1lbnQpO1xuICAgICAgICBpZiAoY3VycmVudElkeCA9PT0gLTEpIHJldHVybjtcblxuICAgICAgICBsZXQgZGVsdGEgPSAwO1xuICAgICAgICBpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dSaWdodCcpIGRlbHRhID0gMTtcbiAgICAgICAgZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dMZWZ0JykgZGVsdGEgPSAtMTtcbiAgICAgICAgZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dEb3duJykgZGVsdGEgPSBEYXRlcGlja2VyQ29tcG9uZW50LkRBWVNfSU5fV0VFSztcbiAgICAgICAgZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dVcCcpIGRlbHRhID0gLURhdGVwaWNrZXJDb21wb25lbnQuREFZU19JTl9XRUVLO1xuXG4gICAgICAgIGNvbnN0IG5leHRJZHggPSBjdXJyZW50SWR4ICsgZGVsdGE7XG5cbiAgICAgICAgaWYgKG5leHRJZHggPCAwKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcmV2RGlzYWJsZWQoKSkgcmV0dXJuO1xuICAgICAgICAgICAgdGhpcy5uYXZpZ2F0ZVByZXYoKTtcbiAgICAgICAgICAgIGFmdGVyTmV4dFJlbmRlcihcbiAgICAgICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhbmVsID0gdGhpcy5wb3B1cFBhbmVsKCk/Lm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJ0bnMgPSBBcnJheS5mcm9tKFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFuZWw/LnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEJ1dHRvbkVsZW1lbnQ+KCdidXR0b25bcm9sZT1cImdyaWRjZWxsXCJdJykgPz8gW10sXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldElkeCA9IE1hdGgubWF4KDAsIGJ0bnMubGVuZ3RoICsgbmV4dElkeCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9XG4gICAgICAgICAgICAgICAgICAgICAgICBEYXRlcGlja2VyQ29tcG9uZW50LmZpbmRFbmFibGVkKGJ0bnMsIHRhcmdldElkeCwgLTEpID8/XG4gICAgICAgICAgICAgICAgICAgICAgICBEYXRlcGlja2VyQ29tcG9uZW50LmZpbmRFbmFibGVkKGJ0bnMsIHRhcmdldElkeCwgMSk7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldD8uZm9jdXMoKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHsgaW5qZWN0b3I6IHRoaXMuaW5qZWN0b3IgfSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobmV4dElkeCA+PSBidXR0b25zLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKHRoaXMubmV4dERpc2FibGVkKCkpIHJldHVybjtcbiAgICAgICAgICAgIHRoaXMubmF2aWdhdGVOZXh0KCk7XG4gICAgICAgICAgICBhZnRlck5leHRSZW5kZXIoXG4gICAgICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYW5lbCA9IHRoaXMucG9wdXBQYW5lbCgpPy5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBidG5zID0gQXJyYXkuZnJvbShcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhbmVsPy5xdWVyeVNlbGVjdG9yQWxsPEhUTUxCdXR0b25FbGVtZW50PignYnV0dG9uW3JvbGU9XCJncmlkY2VsbFwiXScpID8/IFtdLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXRJZHggPSBNYXRoLm1pbihuZXh0SWR4IC0gYnV0dG9ucy5sZW5ndGgsIGJ0bnMubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9XG4gICAgICAgICAgICAgICAgICAgICAgICBEYXRlcGlja2VyQ29tcG9uZW50LmZpbmRFbmFibGVkKGJ0bnMsIHRhcmdldElkeCwgMSkgPz9cbiAgICAgICAgICAgICAgICAgICAgICAgIERhdGVwaWNrZXJDb21wb25lbnQuZmluZEVuYWJsZWQoYnRucywgdGFyZ2V0SWR4LCAtMSk7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldD8uZm9jdXMoKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHsgaW5qZWN0b3I6IHRoaXMuaW5qZWN0b3IgfSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWJ1dHRvbnNbbmV4dElkeF0/LmRpc2FibGVkKSB7XG4gICAgICAgICAgICBidXR0b25zW25leHRJZHhdLmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBmaW5kRW5hYmxlZChcbiAgICAgICAgYnV0dG9uczogSFRNTEJ1dHRvbkVsZW1lbnRbXSxcbiAgICAgICAgc3RhcnRJZHg6IG51bWJlcixcbiAgICAgICAgZGlyZWN0aW9uOiAxIHwgLTEsXG4gICAgKTogSFRNTEJ1dHRvbkVsZW1lbnQgfCBudWxsIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0SWR4OyBpID49IDAgJiYgaSA8IGJ1dHRvbnMubGVuZ3RoOyBpICs9IGRpcmVjdGlvbikge1xuICAgICAgICAgICAgaWYgKCFidXR0b25zW2ldLmRpc2FibGVkKSByZXR1cm4gYnV0dG9uc1tpXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgc3dpdGNoVG9Nb250aHMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMucGlja2VyVmlldy5zZXQoJ21vbnRocycpO1xuICAgICAgICB0aGlzLmZvY3VzQmVzdENhbGVuZGFyVGFyZ2V0KCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGJhY2tUb0NhbGVuZGFyKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnBpY2tlclZpZXcuc2V0KCdjYWxlbmRhcicpO1xuICAgICAgICB0aGlzLmZvY3VzQmVzdENhbGVuZGFyVGFyZ2V0KCk7XG4gICAgfVxuXG4gICAgLy8g4pSA4pSAIFNlbGVjdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAgIHByb3RlY3RlZCBzZWxlY3REYXRlKGRheTogQ2FsZW5kYXJEYXkpOiB2b2lkIHtcbiAgICAgICAgaWYgKGRheS5pc0Rpc2FibGVkKSByZXR1cm47XG4gICAgICAgIGlmICh0aGlzLmlzTXVsdGlwbGVNb2RlKCkpIHtcbiAgICAgICAgICAgIHRoaXMudG9nZ2xlTXVsdGlwbGVEYXRlKGRheS5kYXRlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5tb2RlKCkgPT09ICdyYW5nZScpIHtcbiAgICAgICAgICAgIGNvbnN0IHBlbmRpbmcgPSB0aGlzLnBlbmRpbmdSYW5nZVN0YXJ0KCk7XG4gICAgICAgICAgICBpZiAoIXBlbmRpbmcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBlbmRpbmdSYW5nZVN0YXJ0LnNldChkYXkuZGF0ZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IFtzdGFydCwgZW5kXSA9XG4gICAgICAgICAgICAgICAgICAgIHBlbmRpbmcuZ2V0VGltZSgpIDw9IGRheS5kYXRlLmdldFRpbWUoKSA/IFtwZW5kaW5nLCBkYXkuZGF0ZV0gOiBbZGF5LmRhdGUsIHBlbmRpbmddO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJhbmdlOiBEYXRlUmFuZ2UgPSB7IHN0YXJ0LCBlbmQgfTtcbiAgICAgICAgICAgICAgICB0aGlzLnJhbmdlVmFsdWUuc2V0KHJhbmdlKTtcbiAgICAgICAgICAgICAgICB0aGlzLmlucHV0RGF0ZSA9IHRoaXMuZm9ybWF0Rm9yRGlzcGxheShyYW5nZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fb25DaGFuZ2UocmFuZ2UpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWQuZW1pdChyYW5nZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5jbG9zZVBhbmVsKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbmV3RGF0ZSA9IG5ldyBEYXRlKFxuICAgICAgICAgICAgZGF5LmRhdGUuZ2V0RnVsbFllYXIoKSxcbiAgICAgICAgICAgIGRheS5kYXRlLmdldE1vbnRoKCksXG4gICAgICAgICAgICBkYXkuZGF0ZS5nZXREYXRlKCksXG4gICAgICAgICAgICB0aGlzLmhvdXJzKCksXG4gICAgICAgICAgICB0aGlzLm1pbnV0ZXMoKSxcbiAgICAgICAgICAgIHRoaXMuc2hvd1NlY29uZHMoKSA/IHRoaXMuc2Vjb25kcygpIDogMCxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy52YWx1ZS5zZXQobmV3RGF0ZSk7XG4gICAgICAgIGlmICh0aGlzLm1vZGUoKSA9PT0gJ2RhdGUnKSB7XG4gICAgICAgICAgICB0aGlzLnNldERpc3BsYXlGb3IobmV3RGF0ZSk7XG4gICAgICAgICAgICB0aGlzLl9vbkNoYW5nZShuZXdEYXRlKTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWQuZW1pdChuZXdEYXRlKTtcbiAgICAgICAgICAgIHRoaXMuY2xvc2VQYW5lbCgpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMubW9kZSgpID09PSAnZGF0ZXRpbWUnKSB7XG4gICAgICAgICAgICB0aGlzLnNldERpc3BsYXlGb3IobmV3RGF0ZSk7XG4gICAgICAgICAgICB0aGlzLl9vbkNoYW5nZShuZXdEYXRlKTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWQuZW1pdChuZXdEYXRlKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmhpZGVPbkRhdGVUaW1lU2VsZWN0KCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNsb3NlUGFuZWwoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBBZGljaW9uYS9yZW1vdmUgdW1hIGRhdGEgZGEgc2VsZcOnw6NvIG3Dumx0aXBsYS4gTyBwYWluZWwgcGVybWFuZWNlIGFiZXJ0by4gKi9cbiAgICBwcml2YXRlIHRvZ2dsZU11bHRpcGxlRGF0ZShkYXRlOiBEYXRlKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBuZXcgRGF0ZShkYXRlLmdldEZ1bGxZZWFyKCksIGRhdGUuZ2V0TW9udGgoKSwgZGF0ZS5nZXREYXRlKCkpO1xuICAgICAgICBjb25zdCBleGlzdGluZyA9IHRoaXMubXVsdGlwbGVWYWx1ZXMoKTtcbiAgICAgICAgY29uc3QgaW5kZXggPSBleGlzdGluZy5maW5kSW5kZXgoKGQpID0+IGlzU2FtZURheShkLCBub3JtYWxpemVkKSk7XG4gICAgICAgIGNvbnN0IG5leHQgPVxuICAgICAgICAgICAgaW5kZXggPj0gMFxuICAgICAgICAgICAgICAgID8gZXhpc3RpbmcuZmlsdGVyKChfLCBpKSA9PiBpICE9PSBpbmRleClcbiAgICAgICAgICAgICAgICA6IFsuLi5leGlzdGluZywgbm9ybWFsaXplZF0uc29ydCgoYSwgYikgPT4gYS5nZXRUaW1lKCkgLSBiLmdldFRpbWUoKSk7XG4gICAgICAgIHRoaXMubXVsdGlwbGVWYWx1ZXMuc2V0KG5leHQpO1xuICAgICAgICB0aGlzLmlucHV0RGF0ZSA9IHRoaXMuZm9ybWF0Rm9yRGlzcGxheShuZXh0KTtcbiAgICAgICAgY29uc3QgZW1pdFZhbHVlID0gbmV4dC5sZW5ndGggPyBuZXh0IDogbnVsbDtcbiAgICAgICAgdGhpcy5vblZhbGlkYXRvckNoYW5nZSgpO1xuICAgICAgICB0aGlzLl9vbkNoYW5nZShlbWl0VmFsdWUpO1xuICAgICAgICB0aGlzLnNlbGVjdGVkLmVtaXQoZW1pdFZhbHVlKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgc2VsZWN0WWVhcih5ZWFyOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuaXNZZWFyRGlzYWJsZWQoeWVhcikpIHJldHVybjtcbiAgICAgICAgY29uc3QgbmV3RGF0ZSA9IG5ldyBEYXRlKHllYXIsIDAsIDEpO1xuICAgICAgICB0aGlzLnZhbHVlLnNldChuZXdEYXRlKTtcbiAgICAgICAgdGhpcy5pbnB1dERhdGUgPSB0aGlzLmZvcm1hdEZvckRpc3BsYXkobmV3RGF0ZSk7XG4gICAgICAgIHRoaXMuX29uQ2hhbmdlKG5ld0RhdGUpO1xuICAgICAgICB0aGlzLnNlbGVjdGVkLmVtaXQobmV3RGF0ZSk7XG4gICAgICAgIHRoaXMuY2xvc2VQYW5lbCgpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBzZWxlY3RNb250aChtb250aEluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuaXNNb250aERpc2FibGVkKG1vbnRoSW5kZXgpKSByZXR1cm47XG4gICAgICAgIGNvbnN0IHllYXIgPSB0aGlzLmN1cnJlbnRZZWFyKCk7XG4gICAgICAgIGNvbnN0IG5ld1ZpZXdEYXRlID0gbmV3IERhdGUoeWVhciwgbW9udGhJbmRleCwgMSk7XG4gICAgICAgIGlmICh0aGlzLm1vZGUoKSA9PT0gJ21vbnRoJykge1xuICAgICAgICAgICAgdGhpcy52YWx1ZS5zZXQobmV3Vmlld0RhdGUpO1xuICAgICAgICAgICAgdGhpcy5zZXREaXNwbGF5Rm9yKG5ld1ZpZXdEYXRlKTtcbiAgICAgICAgICAgIHRoaXMuX29uQ2hhbmdlKG5ld1ZpZXdEYXRlKTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWQuZW1pdChuZXdWaWV3RGF0ZSk7XG4gICAgICAgICAgICB0aGlzLmNsb3NlUGFuZWwoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudmlld0RhdGUuc2V0KG5ld1ZpZXdEYXRlKTtcbiAgICAgICAgICAgIHRoaXMucGlja2VyVmlldy5zZXQoJ2NhbGVuZGFyJyk7XG4gICAgICAgICAgICB0aGlzLmZvY3VzQmVzdENhbGVuZGFyVGFyZ2V0KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgc2VsZWN0VG9kYXkoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHRvZGF5ID0gbmV3IERhdGUoKTtcbiAgICAgICAgaWYgKCF0aGlzLmlzRGF0ZURpc2FibGVkKHRvZGF5KSkge1xuICAgICAgICAgICAgY29uc3QgY2FsRGF5OiBDYWxlbmRhckRheSA9IHtcbiAgICAgICAgICAgICAgICBkYXRlOiB0b2RheSxcbiAgICAgICAgICAgICAgICBkYXlPZk1vbnRoOiB0b2RheS5nZXREYXRlKCksXG4gICAgICAgICAgICAgICAgaXNDdXJyZW50TW9udGg6IHRydWUsXG4gICAgICAgICAgICAgICAgaXNUb2RheTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBpc1NlbGVjdGVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBpc0Rpc2FibGVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBpc1JhbmdlU3RhcnQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGlzUmFuZ2VFbmQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGlzSW5SYW5nZTogZmFsc2UsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5zZWxlY3REYXRlKGNhbERheSk7XG4gICAgICAgICAgICB0aGlzLnRvZGF5Q2xpY2suZW1pdCh0b2RheSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgY2xlYXJWYWx1ZShldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgICAgICB0aGlzLnZhbHVlLnNldChudWxsKTtcbiAgICAgICAgdGhpcy5ob3Vycy5zZXQoMCk7XG4gICAgICAgIHRoaXMubWludXRlcy5zZXQoMCk7XG4gICAgICAgIHRoaXMuc2Vjb25kcy5zZXQoMCk7XG4gICAgICAgIHRoaXMucmFuZ2VWYWx1ZS5zZXQobnVsbCk7XG4gICAgICAgIHRoaXMubXVsdGlwbGVWYWx1ZXMuc2V0KFtdKTtcbiAgICAgICAgdGhpcy5wZW5kaW5nUmFuZ2VTdGFydC5zZXQobnVsbCk7XG4gICAgICAgIHRoaXMuc2V0RGlzcGxheUZvcihudWxsKTtcbiAgICAgICAgdGhpcy5fb25DaGFuZ2UobnVsbCk7XG4gICAgICAgIHRoaXMuY2xlYXJDbGljay5lbWl0KGV2ZW50KTtcbiAgICAgICAgdGhpcy5jbG9zZVBhbmVsKCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGNvbmZpcm0oKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLnZhbHVlKCkgPz8gbmV3IERhdGUoKTtcbiAgICAgICAgY29uc3QgY29uZmlybWVkID0gbmV3IERhdGUoXG4gICAgICAgICAgICBjdXJyZW50LmdldEZ1bGxZZWFyKCksXG4gICAgICAgICAgICBjdXJyZW50LmdldE1vbnRoKCksXG4gICAgICAgICAgICBjdXJyZW50LmdldERhdGUoKSxcbiAgICAgICAgICAgIHRoaXMuaG91cnMoKSxcbiAgICAgICAgICAgIHRoaXMubWludXRlcygpLFxuICAgICAgICAgICAgdGhpcy5zaG93U2Vjb25kcygpID8gdGhpcy5zZWNvbmRzKCkgOiAwLFxuICAgICAgICApO1xuICAgICAgICB0aGlzLnZhbHVlLnNldChjb25maXJtZWQpO1xuICAgICAgICB0aGlzLnNldERpc3BsYXlGb3IoY29uZmlybWVkKTtcbiAgICAgICAgdGhpcy5fb25DaGFuZ2UoY29uZmlybWVkKTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZC5lbWl0KGNvbmZpcm1lZCk7XG4gICAgICAgIHRoaXMuY2xvc2VQYW5lbCgpO1xuICAgIH1cblxuICAgIC8vIOKUgOKUgCBUaW1lIHBpY2tlciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAgIHByb3RlY3RlZCBpbmNyZW1lbnRIb3VycygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5ob3Vycy5zZXQoKHRoaXMuaG91cnMoKSArIHRoaXMuc3RlcEhvdXIoKSkgJSB0aGlzLm1heEhvdXJzKTtcbiAgICAgICAgdGhpcy5zeW5jVGltZVRvVmFsdWUoKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZGVjcmVtZW50SG91cnMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaG91cnMuc2V0KCh0aGlzLmhvdXJzKCkgLSB0aGlzLnN0ZXBIb3VyKCkgKyB0aGlzLm1heEhvdXJzKSAlIHRoaXMubWF4SG91cnMpO1xuICAgICAgICB0aGlzLnN5bmNUaW1lVG9WYWx1ZSgpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBpbmNyZW1lbnRNaW51dGVzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLm1pbnV0ZXMuc2V0KCh0aGlzLm1pbnV0ZXMoKSArIHRoaXMubWludXRlU3RlcCgpKSAlIHRoaXMubWF4TWludXRlcyk7XG4gICAgICAgIHRoaXMuc3luY1RpbWVUb1ZhbHVlKCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGRlY3JlbWVudE1pbnV0ZXMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMubWludXRlcy5zZXQoKHRoaXMubWludXRlcygpIC0gdGhpcy5taW51dGVTdGVwKCkgKyB0aGlzLm1heE1pbnV0ZXMpICUgdGhpcy5tYXhNaW51dGVzKTtcbiAgICAgICAgdGhpcy5zeW5jVGltZVRvVmFsdWUoKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgaW5jcmVtZW50U2Vjb25kcygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZWNvbmRzLnNldCgodGhpcy5zZWNvbmRzKCkgKyB0aGlzLnN0ZXBTZWNvbmQoKSkgJSA2MCk7XG4gICAgICAgIHRoaXMuc3luY1RpbWVUb1ZhbHVlKCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGRlY3JlbWVudFNlY29uZHMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2Vjb25kcy5zZXQoKHRoaXMuc2Vjb25kcygpIC0gdGhpcy5zdGVwU2Vjb25kKCkgKyA2MCkgJSA2MCk7XG4gICAgICAgIHRoaXMuc3luY1RpbWVUb1ZhbHVlKCk7XG4gICAgfVxuXG4gICAgQG51bWVyaWNLZXlzT25seSgpXG4gICAgcHJvdGVjdGVkIGhhbmRsZUhvdXJzS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dVcCcpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLmluY3JlbWVudEhvdXJzKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dEb3duJykge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHRoaXMuZGVjcmVtZW50SG91cnMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIEBudW1lcmljS2V5c09ubHkoKVxuICAgIHByb3RlY3RlZCBoYW5kbGVNaW51dGVzS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dVcCcpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLmluY3JlbWVudE1pbnV0ZXMoKTtcbiAgICAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09ICdBcnJvd0Rvd24nKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdGhpcy5kZWNyZW1lbnRNaW51dGVzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBAbnVtZXJpY0tleXNPbmx5KClcbiAgICBwcm90ZWN0ZWQgaGFuZGxlU2Vjb25kc0tleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gJ0Fycm93VXAnKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdGhpcy5pbmNyZW1lbnRTZWNvbmRzKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dEb3duJykge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHRoaXMuZGVjcmVtZW50U2Vjb25kcygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGhhbmRsZUhvdXJzSW5wdXQoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHJhdyA9IChldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkudmFsdWU7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlSW50KHJhdywgMTApO1xuICAgICAgICBpZiAoaXNOYU4ocGFyc2VkKSkgcmV0dXJuO1xuICAgICAgICBpZiAodGhpcy5pczEySG91ckZvcm1hdCgpKSB7XG4gICAgICAgICAgICBjb25zdCBoYWxmID0gRGF0ZXBpY2tlckNvbXBvbmVudC5IT1VSU19QRVJfTUVSSURJRU07XG4gICAgICAgICAgICBjb25zdCBoMTIgPSBNYXRoLm1pbihoYWxmLCBNYXRoLm1heCgxLCBwYXJzZWQpKTtcbiAgICAgICAgICAgIGNvbnN0IGJhc2UgPSBoMTIgJSBoYWxmO1xuICAgICAgICAgICAgdGhpcy5ob3Vycy5zZXQodGhpcy5hbVBtKCkgPT09ICdQTScgPyBiYXNlICsgaGFsZiA6IGJhc2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5ob3Vycy5zZXQoTWF0aC5taW4odGhpcy5tYXhIb3VycyAtIDEsIE1hdGgubWF4KDAsIHBhcnNlZCkpKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnN5bmNUaW1lVG9WYWx1ZSgpO1xuICAgIH1cblxuICAgIC8qKiBBbHRlcm5hIGVudHJlIEFNIGUgUE0gc29tYW5kby9zdWJ0cmFpbmRvIDEyIGhvcmFzIGRhIGhvcmEgaW50ZXJuYS4gKi9cbiAgICBwcm90ZWN0ZWQgdG9nZ2xlQW1QbSgpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaGFsZiA9IERhdGVwaWNrZXJDb21wb25lbnQuSE9VUlNfUEVSX01FUklESUVNO1xuICAgICAgICB0aGlzLmhvdXJzLnNldCh0aGlzLmhvdXJzKCkgPCBoYWxmID8gdGhpcy5ob3VycygpICsgaGFsZiA6IHRoaXMuaG91cnMoKSAtIGhhbGYpO1xuICAgICAgICB0aGlzLnN5bmNUaW1lVG9WYWx1ZSgpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBoYW5kbGVNaW51dGVzSW5wdXQoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHJhdyA9IChldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkudmFsdWU7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlSW50KHJhdywgMTApO1xuICAgICAgICBpZiAoIWlzTmFOKHBhcnNlZCkpIHtcbiAgICAgICAgICAgIHRoaXMubWludXRlcy5zZXQoTWF0aC5taW4odGhpcy5tYXhNaW51dGVzIC0gMSwgTWF0aC5tYXgoMCwgcGFyc2VkKSkpO1xuICAgICAgICAgICAgdGhpcy5zeW5jVGltZVRvVmFsdWUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBoYW5kbGVTZWNvbmRzSW5wdXQoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHJhdyA9IChldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkudmFsdWU7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlSW50KHJhdywgMTApO1xuICAgICAgICBpZiAoIWlzTmFOKHBhcnNlZCkpIHtcbiAgICAgICAgICAgIHRoaXMuc2Vjb25kcy5zZXQoTWF0aC5taW4oNTksIE1hdGgubWF4KDAsIHBhcnNlZCkpKTtcbiAgICAgICAgICAgIHRoaXMuc3luY1RpbWVUb1ZhbHVlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgb25EYXlIb3ZlcihkYXRlOiBEYXRlIHwgbnVsbCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5tb2RlKCkgPT09ICdyYW5nZScpIHtcbiAgICAgICAgICAgIHRoaXMuaG92ZXJEYXRlLnNldChkYXRlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIOKUgOKUgCBIZWxwZXJzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gICAgcHJvdGVjdGVkIGlzRGF0ZURpc2FibGVkKGRhdGU6IERhdGUpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgbWluID0gdGhpcy5taW4oKTtcbiAgICAgICAgY29uc3QgbWF4ID0gdGhpcy5tYXgoKTtcbiAgICAgICAgaWYgKG1pbiAmJiBzdHJpcFRpbWUoZGF0ZSkgPCBzdHJpcFRpbWUobWluKSkgcmV0dXJuIHRydWU7XG4gICAgICAgIGlmIChtYXggJiYgc3RyaXBUaW1lKGRhdGUpID4gc3RyaXBUaW1lKG1heCkpIHJldHVybiB0cnVlO1xuICAgICAgICBjb25zdCBkaXNhYmxlZERheXMgPSB0aGlzLmRpc2FibGVkRGF5cygpO1xuICAgICAgICBpZiAoZGlzYWJsZWREYXlzLmxlbmd0aCAmJiBkaXNhYmxlZERheXMuaW5jbHVkZXMoZGF0ZS5nZXREYXkoKSkpIHJldHVybiB0cnVlO1xuICAgICAgICBjb25zdCBkaXNhYmxlZERhdGVzID0gdGhpcy5kaXNhYmxlZERhdGVzKCk7XG4gICAgICAgIGlmIChkaXNhYmxlZERhdGVzLmxlbmd0aCAmJiBkaXNhYmxlZERhdGVzLnNvbWUoKGQpID0+IGlzU2FtZURheShkLCBkYXRlKSkpIHJldHVybiB0cnVlO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGlzWWVhclNlbGVjdGVkKHllYXI6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMudmFsdWUoKTtcbiAgICAgICAgcmV0dXJuICEhc2VsZWN0ZWQgJiYgc2VsZWN0ZWQuZ2V0RnVsbFllYXIoKSA9PT0geWVhcjtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgaXNZZWFyRGlzYWJsZWQoeWVhcjogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IG1pbiA9IHRoaXMubWluKCk7XG4gICAgICAgIGNvbnN0IG1heCA9IHRoaXMubWF4KCk7XG4gICAgICAgIGlmIChtaW4gJiYgeWVhciA8IG1pbi5nZXRGdWxsWWVhcigpKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgaWYgKG1heCAmJiB5ZWFyID4gbWF4LmdldEZ1bGxZZWFyKCkpIHJldHVybiB0cnVlO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGlzQ3VycmVudFllYXIoeWVhcjogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB5ZWFyID09PSBuZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGlzTW9udGhTZWxlY3RlZChtb250aEluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWQgPSB0aGlzLnZhbHVlKCk7XG4gICAgICAgIHJldHVybiAhIXNlbGVjdGVkICYmIHNlbGVjdGVkLmdldE1vbnRoKCkgPT09IG1vbnRoSW5kZXggJiYgc2VsZWN0ZWQuZ2V0RnVsbFllYXIoKSA9PT0gdGhpcy5jdXJyZW50WWVhcigpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBpc01vbnRoRGlzYWJsZWQobW9udGhJbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHllYXIgPSB0aGlzLmN1cnJlbnRZZWFyKCk7XG4gICAgICAgIGNvbnN0IG1pbiA9IHRoaXMubWluKCk7XG4gICAgICAgIGNvbnN0IG1heCA9IHRoaXMubWF4KCk7XG4gICAgICAgIGlmIChtaW4gJiYgKHllYXIgPCBtaW4uZ2V0RnVsbFllYXIoKSB8fCAoeWVhciA9PT0gbWluLmdldEZ1bGxZZWFyKCkgJiYgbW9udGhJbmRleCA8IG1pbi5nZXRNb250aCgpKSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtYXggJiYgKHllYXIgPiBtYXguZ2V0RnVsbFllYXIoKSB8fCAoeWVhciA9PT0gbWF4LmdldEZ1bGxZZWFyKCkgJiYgbW9udGhJbmRleCA+IG1heC5nZXRNb250aCgpKSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcGFkVGltZSh2YWx1ZTogbnVtYmVyKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIFN0cmluZyh2YWx1ZSkucGFkU3RhcnQoMiwgJzAnKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZm9ybWF0RGF5QXJpYUxhYmVsKGRhdGU6IERhdGUpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gZGF0ZS50b0xvY2FsZURhdGVTdHJpbmcodGhpcy5jdXJyZW50TGFuZygpLCB7XG4gICAgICAgICAgICB3ZWVrZGF5OiAnbG9uZycsXG4gICAgICAgICAgICB5ZWFyOiAnbnVtZXJpYycsXG4gICAgICAgICAgICBtb250aDogJ2xvbmcnLFxuICAgICAgICAgICAgZGF5OiAnbnVtZXJpYycsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKiBGb3JtYXRhIG8gdmFsb3IgcGFyYSBleGliacOnw6NvIG5vIGlucHV0LCBhcGxpY2FuZG8gcmFuZ2VTZXBhcmF0b3IsIGRhdGVGb3JtYXQgZSBtdWx0aXBsZVNlcGFyYXRvci4gKi9cbiAgICBwcml2YXRlIGZvcm1hdEZvckRpc3BsYXkodmFsdWU6IERhdGUgfCBEYXRlUmFuZ2UgfCBEYXRlW10gfCBudWxsKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGZvcm1hdFZhbHVlRm9ySW5wdXQoXG4gICAgICAgICAgICB0aGlzLm1vZGUoKSxcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgdGhpcy5yYW5nZVNlcGFyYXRvcigpLFxuICAgICAgICAgICAgdGhpcy5yZXNvbHZlZERhdGVGb3JtYXQoKSxcbiAgICAgICAgICAgIHRoaXMubXVsdGlwbGVTZXBhcmF0b3IoKSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBdHVhbGl6YSBgaW5wdXREYXRlYCBhIHBhcnRpciBkZSB1bSB2YWxvciDDum5pY28sIHJvdGVhbmRvIHBlbGEgZW5naW5lIGRlIHNlZ21lbnRvc1xuICAgICAqIChkYXRlL21vbnRoL3RpbWUvZGF0ZXRpbWUpIG91IHBlbG8gZm9ybWF0YWRvciBsZWdhZG8gKHJhbmdlL3llYXIvbXVsdGlwbGUpLlxuICAgICAqL1xuICAgIHByaXZhdGUgc2V0RGlzcGxheUZvcih2YWx1ZTogRGF0ZSB8IG51bGwpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuaXNTZWdtZW50TW9kZUNhbmRpZGF0ZSgpKSB7XG4gICAgICAgICAgICB0aGlzLmVuc3VyZVNlZ21lbnRFbmdpbmVDb25maWd1cmVkKCk7XG4gICAgICAgICAgICB0aGlzLnNlZ21lbnRFbmdpbmUubG9hZEZyb21EYXRlKHZhbHVlKTtcbiAgICAgICAgICAgIHRoaXMuaW5wdXREYXRlID0gdmFsdWUgPyB0aGlzLnNlZ21lbnRFbmdpbmUuZ2V0RGlzcGxheVN0cmluZygpIDogJyc7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbnB1dERhdGUgPSB0aGlzLmZvcm1hdEZvckRpc3BsYXkodmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIChSZSljb25maWd1cmEgYSBlbmdpbmUgZGUgc2VnbWVudG9zIHF1YW5kbyBgbW9kZWAvYGRhdGVGb3JtYXRgL2Bob3VyRm9ybWF0YC9gc2hvd1NlY29uZHNgXG4gICAgICogbXVkYXJhbSBkZXNkZSBhIMO6bHRpbWEgY2hhbWFkYSwgcmVjYXJyZWdhbmRvIG8gdmFsb3IgYXR1YWwuIENoYW1hZG8gZGUgZm9ybWEgc8OtbmNyb25hIGFcbiAgICAgKiBwYXJ0aXIgZGUgdG9kbyBwb250byBkZSBlbnRyYWRhIHF1ZSB1c2EgYSBlbmdpbmUg4oCUIG7Do28gZGVwZW5kZSBkZSB1bSBgZWZmZWN0KClgIChxdWUgc8OzXG4gICAgICogcm9kYSBlbSB1bSBjaWNsbyBkZSBjaGFuZ2UgZGV0ZWN0aW9uLCB0YXJkZSBkZW1haXMgcGFyYSBsZWl0dXJhcy9lc2NyaXRhcyBpbWVkaWF0YXMpLlxuICAgICAqL1xuICAgIHByaXZhdGUgZW5zdXJlU2VnbWVudEVuZ2luZUNvbmZpZ3VyZWQoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG1vZGUgPSB0aGlzLm1vZGUoKTtcbiAgICAgICAgaWYgKG1vZGUgIT09ICdkYXRlJyAmJiBtb2RlICE9PSAnbW9udGgnICYmIG1vZGUgIT09ICd0aW1lJyAmJiBtb2RlICE9PSAnZGF0ZXRpbWUnKSByZXR1cm47XG4gICAgICAgIGNvbnN0IGNvbmZpZzogU2VnbWVudEVuZ2luZUNvbmZpZyA9IHtcbiAgICAgICAgICAgIG1vZGUsXG4gICAgICAgICAgICBkYXRlRm9ybWF0OiB0aGlzLnJlc29sdmVkRGF0ZUZvcm1hdCgpLFxuICAgICAgICAgICAgaG91ckZvcm1hdDogdGhpcy5yZXNvbHZlZEhvdXJGb3JtYXQoKSxcbiAgICAgICAgICAgIHNob3dTZWNvbmRzOiB0aGlzLnNob3dTZWNvbmRzKCksXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGxhc3QgPSB0aGlzLmxhc3RTZWdtZW50Q29uZmlnO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICBsYXN0ICYmXG4gICAgICAgICAgICBsYXN0Lm1vZGUgPT09IGNvbmZpZy5tb2RlICYmXG4gICAgICAgICAgICBsYXN0LmRhdGVGb3JtYXQgPT09IGNvbmZpZy5kYXRlRm9ybWF0ICYmXG4gICAgICAgICAgICBsYXN0LmhvdXJGb3JtYXQgPT09IGNvbmZpZy5ob3VyRm9ybWF0ICYmXG4gICAgICAgICAgICBsYXN0LnNob3dTZWNvbmRzID09PSBjb25maWcuc2hvd1NlY29uZHNcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5sYXN0U2VnbWVudENvbmZpZyA9IGNvbmZpZztcbiAgICAgICAgdGhpcy5zZWdtZW50RW5naW5lLmNvbmZpZ3VyZShjb25maWcpO1xuICAgICAgICB0aGlzLnNlZ21lbnRFbmdpbmUubG9hZEZyb21EYXRlKHRoaXMudmFsdWUoKSk7XG4gICAgfVxuXG4gICAgLyoqIFJldG9ybmEgYSB0cmFkdcOnw6NvIGRlIGBrZXlgLCBvdSBgZmFsbGJhY2tgIHF1YW5kbyBhIGNoYXZlIG7Do28gZXN0w6EgdHJhZHV6aWRhIChuZ3gtdHJhbnNsYXRlIHJldG9ybmEgYSBwcsOzcHJpYSBjaGF2ZSkuICovXG4gICAgcHJpdmF0ZSByZXNvbHZlVHJhbnNsYXRlZE9yRGVmYXVsdChrZXk6IHN0cmluZywgZmFsbGJhY2s6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IHRyYW5zbGF0ZWQgPSB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChrZXkpO1xuICAgICAgICBpZiAodHlwZW9mIHRyYW5zbGF0ZWQgIT09ICdzdHJpbmcnIHx8ICF0cmFuc2xhdGVkIHx8IHRyYW5zbGF0ZWQgPT09IGtleSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbGxiYWNrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cmFuc2xhdGVkO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3luY1RpbWVUb1ZhbHVlKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBkYXRlID0gdGhpcy52YWx1ZSgpID8/IG5ldyBEYXRlKCk7XG4gICAgICAgIGNvbnN0IG5ld0RhdGUgPSBuZXcgRGF0ZShcbiAgICAgICAgICAgIGRhdGUuZ2V0RnVsbFllYXIoKSxcbiAgICAgICAgICAgIGRhdGUuZ2V0TW9udGgoKSxcbiAgICAgICAgICAgIGRhdGUuZ2V0RGF0ZSgpLFxuICAgICAgICAgICAgdGhpcy5ob3VycygpLFxuICAgICAgICAgICAgdGhpcy5taW51dGVzKCksXG4gICAgICAgICAgICB0aGlzLnNob3dTZWNvbmRzKCkgPyB0aGlzLnNlY29uZHMoKSA6IDAsXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMudmFsdWUuc2V0KG5ld0RhdGUpO1xuICAgICAgICB0aGlzLnNldERpc3BsYXlGb3IobmV3RGF0ZSk7XG4gICAgICAgIGlmICh0aGlzLm1vZGUoKSA9PT0gJ3RpbWUnKSB7XG4gICAgICAgICAgICB0aGlzLl9vbkNoYW5nZShuZXdEYXRlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYnVpbGRDYWxlbmRhckRheShcbiAgICAgICAgZGF0ZTogRGF0ZSxcbiAgICAgICAgaXNDdXJyZW50TW9udGg6IGJvb2xlYW4sXG4gICAgICAgIHRvZGF5OiBEYXRlLFxuICAgICAgICBzZWxlY3RlZDogRGF0ZSB8IG51bGwsXG4gICAgICAgIHJhbmdlOiB7IHN0YXJ0OiBEYXRlIHwgbnVsbDsgZW5kOiBEYXRlIHwgbnVsbCB9LFxuICAgICAgICByYW5nZVN0YXJ0VGltZTogbnVtYmVyIHwgbnVsbCxcbiAgICAgICAgcmFuZ2VFbmRUaW1lOiBudW1iZXIgfCBudWxsLFxuICAgICk6IENhbGVuZGFyRGF5IHtcbiAgICAgICAgY29uc3QgaXNSYW5nZVN0YXJ0ID0gcmFuZ2Uuc3RhcnQgPyBpc1NhbWVEYXkoZGF0ZSwgcmFuZ2Uuc3RhcnQpIDogZmFsc2U7XG4gICAgICAgIGNvbnN0IGlzUmFuZ2VFbmQgPSByYW5nZS5lbmQgPyBpc1NhbWVEYXkoZGF0ZSwgcmFuZ2UuZW5kKSA6IGZhbHNlO1xuICAgICAgICBjb25zdCBkYXRlVGltZSA9IHN0cmlwVGltZShkYXRlKTtcbiAgICAgICAgY29uc3QgaXNJblJhbmdlID1cbiAgICAgICAgICAgIHJhbmdlU3RhcnRUaW1lICE9PSBudWxsICYmIHJhbmdlRW5kVGltZSAhPT0gbnVsbFxuICAgICAgICAgICAgICAgID8gZGF0ZVRpbWUgPiByYW5nZVN0YXJ0VGltZSAmJiBkYXRlVGltZSA8IHJhbmdlRW5kVGltZVxuICAgICAgICAgICAgICAgIDogZmFsc2U7XG4gICAgICAgIGNvbnN0IGlzU2VsZWN0ZWQgPSB0aGlzLmlzTXVsdGlwbGVNb2RlKClcbiAgICAgICAgICAgID8gdGhpcy5tdWx0aXBsZVZhbHVlcygpLnNvbWUoKGQpID0+IGlzU2FtZURheShkLCBkYXRlKSlcbiAgICAgICAgICAgIDogc2VsZWN0ZWRcbiAgICAgICAgICAgICAgPyBpc1NhbWVEYXkoZGF0ZSwgc2VsZWN0ZWQpXG4gICAgICAgICAgICAgIDogZmFsc2U7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkYXlPZk1vbnRoOiBkYXRlLmdldERhdGUoKSxcbiAgICAgICAgICAgIGlzVG9kYXk6IGlzU2FtZURheShkYXRlLCB0b2RheSksXG4gICAgICAgICAgICBpc1NlbGVjdGVkLFxuICAgICAgICAgICAgaXNEaXNhYmxlZDogdGhpcy5pc0RhdGVEaXNhYmxlZChkYXRlKSB8fCAoIWlzQ3VycmVudE1vbnRoICYmICF0aGlzLnNlbGVjdE90aGVyTW9udGhzKCkpLFxuICAgICAgICAgICAgZGF0ZSxcbiAgICAgICAgICAgIGlzQ3VycmVudE1vbnRoLFxuICAgICAgICAgICAgaXNSYW5nZVN0YXJ0LFxuICAgICAgICAgICAgaXNSYW5nZUVuZCxcbiAgICAgICAgICAgIGlzSW5SYW5nZSxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNvbXB1dGVWYWxpZGF0aW9uRXJyb3JzKHZhbHVlOiBEYXRlcGlja2VyVmFsdWUsIGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsIHtcbiAgICAgICAgaWYgKHRoaXMuX2hhc0Zvcm1hdEVycm9yKSByZXR1cm4geyBpbnZhbGlkRm9ybWF0OiB0cnVlIH07XG4gICAgICAgIGlmICghdmFsdWUgfHwgKEFycmF5LmlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmxlbmd0aCA9PT0gMCkpIHJldHVybiBWYWxpZGF0b3JzLm51bGxWYWxpZGF0b3IoY29udHJvbCk7XG4gICAgICAgIGNvbnN0IG1pbiA9IHRoaXMubWluKCk7XG4gICAgICAgIGNvbnN0IG1heCA9IHRoaXMubWF4KCk7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBkIG9mIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKG1pbiAmJiBzdHJpcFRpbWUoZCkgPCBzdHJpcFRpbWUobWluKSkgcmV0dXJuIHsgbWluOiB7IG1pbiwgYWN0dWFsOiBkIH0gfTtcbiAgICAgICAgICAgICAgICBpZiAobWF4ICYmIHN0cmlwVGltZShkKSA+IHN0cmlwVGltZShtYXgpKSByZXR1cm4geyBtYXg6IHsgbWF4LCBhY3R1YWw6IGQgfSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFZhbGlkYXRvcnMubnVsbFZhbGlkYXRvcihjb250cm9sKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pc0RhdGVSYW5nZSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZS5zdGFydCAmJiBtaW4gJiYgc3RyaXBUaW1lKHZhbHVlLnN0YXJ0KSA8IHN0cmlwVGltZShtaW4pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgbWluOiB7IG1pbiwgYWN0dWFsOiB2YWx1ZS5zdGFydCB9IH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodmFsdWUuZW5kICYmIG1heCAmJiBzdHJpcFRpbWUodmFsdWUuZW5kKSA+IHN0cmlwVGltZShtYXgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgbWF4OiB7IG1heCwgYWN0dWFsOiB2YWx1ZS5lbmQgfSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFZhbGlkYXRvcnMubnVsbFZhbGlkYXRvcihjb250cm9sKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkID0gdmFsdWUgYXMgRGF0ZTtcbiAgICAgICAgaWYgKHRoaXMubW9kZSgpID09PSAneWVhcicpIHtcbiAgICAgICAgICAgIGlmIChtaW4gJiYgZC5nZXRGdWxsWWVhcigpIDwgbWluLmdldEZ1bGxZZWFyKCkpIHJldHVybiB7IG1pbjogeyBtaW4sIGFjdHVhbDogZCB9IH07XG4gICAgICAgICAgICBpZiAobWF4ICYmIGQuZ2V0RnVsbFllYXIoKSA+IG1heC5nZXRGdWxsWWVhcigpKSByZXR1cm4geyBtYXg6IHsgbWF4LCBhY3R1YWw6IGQgfSB9O1xuICAgICAgICAgICAgcmV0dXJuIFZhbGlkYXRvcnMubnVsbFZhbGlkYXRvcihjb250cm9sKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWluICYmIHN0cmlwVGltZShkKSA8IHN0cmlwVGltZShtaW4pKSByZXR1cm4geyBtaW46IHsgbWluLCBhY3R1YWw6IGQgfSB9O1xuICAgICAgICBpZiAobWF4ICYmIHN0cmlwVGltZShkKSA+IHN0cmlwVGltZShtYXgpKSByZXR1cm4geyBtYXg6IHsgbWF4LCBhY3R1YWw6IGQgfSB9O1xuICAgICAgICByZXR1cm4gVmFsaWRhdG9ycy5udWxsVmFsaWRhdG9yKGNvbnRyb2wpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNEYXRlUmFuZ2UodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBEYXRlUmFuZ2Uge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCAmJiAnc3RhcnQnIGluIHZhbHVlICYmICdlbmQnIGluIHZhbHVlO1xuICAgIH1cbn1cblxuIiwiPGRpdlxuICAgIGNka092ZXJsYXlPcmlnaW5cbiAgICAjdHJpZ2dlcj1cImNka092ZXJsYXlPcmlnaW5cIlxuICAgIGNsYXNzPVwicmVsYXRpdmUgZmxleCB3LWZ1bGwgaXRlbXMtY2VudGVyXCJcbiAgICByb2xlPVwiY29tYm9ib3hcIlxuICAgIGFyaWEtaGFzcG9wdXA9XCJncmlkXCJcbiAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cImlzT3BlbigpXCJcbiAgICBbYXR0ci5hcmlhLWNvbnRyb2xzXT1cInBvcHVwSWQoKVwiXG4+XG4gICAgPGlucHV0XG4gICAgICAgICN0cmlnZ2VySW5wdXRcbiAgICAgICAgY2xhc3M9XCJoLVszNXB4XSB3LWZ1bGwgcm91bmRlZC1zbWFsbCBib3JkZXIgYm9yZGVyLXNvbGlkIGJvcmRlci1ncmF5c2NhbGUtMzAgcGwtMyB0ZXh0LXNtIG91dGxpbmUtbm9uZSB0cmFuc2l0aW9uLWNvbG9ycyBmb2N1cy12aXNpYmxlOm91dGxpbmUgZm9jdXMtdmlzaWJsZTpvdXRsaW5lLTIgZm9jdXMtdmlzaWJsZTpvdXRsaW5lLW9mZnNldC1bLTJweF0gZm9jdXMtdmlzaWJsZTpvdXRsaW5lLVt2YXIoLS1zLWZvY3VzLXJpbmctY29sb3IsIzAwOTBmZildXCJcbiAgICAgICAgW2NsYXNzLnByLTEwXT1cInNob3dJY29uKCkgJiYgIXNob3dDbGVhcigpXCJcbiAgICAgICAgW2NsYXNzLnByLTE2XT1cInNob3dJY29uKCkgJiYgc2hvd0NsZWFyKClcIlxuICAgICAgICBbY2xhc3MucHItNl09XCIhc2hvd0ljb24oKSAmJiBzaG93Q2xlYXIoKVwiXG4gICAgICAgIFtjbGFzcy5iZy1ncmF5c2NhbGUtMF09XCIhZGlzYWJsZWQoKVwiXG4gICAgICAgIFtjbGFzcy50ZXh0LWdyYXlzY2FsZS05MF09XCIhZGlzYWJsZWQoKVwiXG4gICAgICAgIFtjbGFzcy5ib3JkZXItZ3JheXNjYWxlLTIwXT1cImRpc2FibGVkKClcIlxuICAgICAgICBbY2xhc3MuYmctZ3JheXNjYWxlLTVdPVwiZGlzYWJsZWQoKVwiXG4gICAgICAgIFtjbGFzcy50ZXh0LWdyYXlzY2FsZS0zMF09XCJkaXNhYmxlZCgpXCJcbiAgICAgICAgW2NsYXNzLmN1cnNvci1ub3QtYWxsb3dlZF09XCJkaXNhYmxlZCgpXCJcbiAgICAgICAgW2lkXT1cImlucHV0SWQoKVwiXG4gICAgICAgIFtuYW1lXT1cIm5hbWUoKSA/PyBpbnB1dElkKClcIlxuICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgIFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlcigpID8/IChwbGFjZWhvbGRlcktleSgpIHwgdHJhbnNsYXRlKVwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZCgpXCJcbiAgICAgICAgW3JlYWRvbmx5XT1cIlxuICAgICAgICAgICAgcmVhZG9ubHlJbnB1dCgpIHx8XG4gICAgICAgICAgICBtb2RlKCkgPT09ICdyYW5nZScgfHxcbiAgICAgICAgICAgIG1vZGUoKSA9PT0gJ3llYXInIHx8XG4gICAgICAgICAgICBpc011bHRpcGxlTW9kZSgpIHx8XG4gICAgICAgICAgICAoaXNTZWdtZW50TW9kZUNhbmRpZGF0ZSgpICYmIGlzVG91Y2hEZXZpY2UoKSlcbiAgICAgICAgXCJcbiAgICAgICAgW3RhYkluZGV4XT1cInRhYmluZGV4KCkgPz8gbnVsbFwiXG4gICAgICAgIFthdXRvZm9jdXNdPVwiYXV0b2ZvY3VzKClcIlxuICAgICAgICBbKG5nTW9kZWwpXT1cImlucHV0RGF0ZVwiXG4gICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImhhbmRsZUlucHV0Q2hhbmdlKCRldmVudClcIlxuICAgICAgICAoZm9jdXMpPVwiaGFuZGxlSW5wdXRGb2N1cygkZXZlbnQpXCJcbiAgICAgICAgKGJsdXIpPVwiaGFuZGxlSW5wdXRCbHVyKCRldmVudClcIlxuICAgICAgICAobW91c2Vkb3duKT1cImhhbmRsZUlucHV0Q2xpY2soJGV2ZW50KVwiXG4gICAgICAgIChrZXlkb3duKT1cImhhbmRsZVRyaWdnZXJLZXlkb3duKCRldmVudClcIlxuICAgICAgICAoaW5wdXQpPVwiaGFuZGxlTmF0aXZlSW5wdXQoJGV2ZW50KVwiXG4gICAgICAgIFthdHRyLmFyaWEtaW52YWxpZF09XCJuZ0NvbnRyb2w/LmNvbnRyb2w/LmludmFsaWQgfHwgbnVsbFwiXG4gICAgLz5cblxuICAgIEBpZiAoc2hvd0NsZWFyKCkgJiYgaW5wdXREYXRlKSB7XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3M9XCJhYnNvbHV0ZSBmbGV4IGgtWzM1cHhdIHctNiBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgdGV4dC1ncmF5c2NhbGUtNjAgdHJhbnNpdGlvbi1jb2xvcnMgaG92ZXI6dGV4dC1ncmF5c2NhbGUtOTBcIlxuICAgICAgICAgICAgW2NsYXNzLnJpZ2h0LTldPVwic2hvd0ljb24oKVwiXG4gICAgICAgICAgICBbY2xhc3MucmlnaHQtMF09XCIhc2hvd0ljb24oKVwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9jbGVhcicgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgKGNsaWNrKT1cImNsZWFyVmFsdWUoJGV2ZW50KVwiXG4gICAgICAgID5cbiAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmYXMgZmEtdGltZXMgdGV4dC14c1wiXG4gICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgID48L2k+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgIH1cblxuICAgIEBpZiAoc2hvd0ljb24oKSkge1xuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAjaWNvbkJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cImFic29sdXRlIHJpZ2h0LTAgZmxleCBoLVszNXB4XSB3LTkgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIGJvcmRlci1sIGJvcmRlci1zb2xpZCB0cmFuc2l0aW9uLWNvbG9yc1wiXG4gICAgICAgICAgICBbY2xhc3MuYm9yZGVyLWdyYXlzY2FsZS0yMF09XCJkaXNhYmxlZCgpXCJcbiAgICAgICAgICAgIFtjbGFzcy50ZXh0LWdyYXlzY2FsZS0zMF09XCJkaXNhYmxlZCgpXCJcbiAgICAgICAgICAgIFtjbGFzcy5jdXJzb3Itbm90LWFsbG93ZWRdPVwiZGlzYWJsZWQoKVwiXG4gICAgICAgICAgICBbY2xhc3MuYm9yZGVyLWdyYXlzY2FsZS0zMF09XCIhZGlzYWJsZWQoKSAmJiAhaXNGb2N1c2VkKClcIlxuICAgICAgICAgICAgW2NsYXNzLmJvcmRlci1wcmltYXJ5XT1cImlzRm9jdXNlZCgpICYmICFkaXNhYmxlZCgpXCJcbiAgICAgICAgICAgIFtjbGFzcy50ZXh0LWdyYXlzY2FsZS05MF09XCIhZGlzYWJsZWQoKVwiXG4gICAgICAgICAgICBbY2xhc3MuaG92ZXI6YmctZ3JheXNjYWxlLTEwXT1cIiFkaXNhYmxlZCgpXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZCgpXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX29wZW4nIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGUoKVwiXG4gICAgICAgICAgICAoa2V5ZG93bik9XCJoYW5kbGVUcmlnZ2VyS2V5ZG93bigkZXZlbnQpXCJcbiAgICAgICAgPlxuICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICBbY2xhc3NdPVwicmVzb2x2ZWRJY29uKClcIlxuICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICA+PC9pPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICB9XG48L2Rpdj5cblxuPG5nLXRlbXBsYXRlXG4gICAgY2RrQ29ubmVjdGVkT3ZlcmxheVxuICAgIFtjZGtDb25uZWN0ZWRPdmVybGF5T3JpZ2luXT1cInRyaWdnZXJcIlxuICAgIFtjZGtDb25uZWN0ZWRPdmVybGF5T3Blbl09XCJpc09wZW4oKVwiXG4gICAgW2Nka0Nvbm5lY3RlZE92ZXJsYXlIYXNCYWNrZHJvcF09XCJ0cnVlXCJcbiAgICBjZGtDb25uZWN0ZWRPdmVybGF5QmFja2Ryb3BDbGFzcz1cImNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wXCJcbiAgICBbY2RrQ29ubmVjdGVkT3ZlcmxheVBvc2l0aW9uc109XCJwb3NpdGlvbnNcIlxuICAgIChiYWNrZHJvcENsaWNrKT1cImhhbmRsZUJhY2tkcm9wQ2xpY2soJGV2ZW50KVwiXG4gICAgKG92ZXJsYXlLZXlkb3duKT1cImhhbmRsZU92ZXJsYXlLZXlkb3duKCRldmVudClcIlxuICAgIChkZXRhY2gpPVwiaXNPcGVuLnNldChmYWxzZSlcIlxuPlxuICAgIDxkaXZcbiAgICAgICAgI3BvcHVwUGFuZWxcbiAgICAgICAgY2xhc3M9XCJ6LTUwIHctNzIgcm91bmRlZC1tZWRpdW0gYm9yZGVyIGJvcmRlci1zb2xpZCBib3JkZXItZ3JheXNjYWxlLTMwIGJnLWdyYXlzY2FsZS0wIHNoYWRvdy1tZFwiXG4gICAgICAgIHJvbGU9XCJkaWFsb2dcIlxuICAgICAgICBjZGtUcmFwRm9jdXNcbiAgICAgICAgW2lkXT1cInBvcHVwSWQoKVwiXG4gICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiZGlhbG9nQXJpYUxhYmVsS2V5KCkgfCB0cmFuc2xhdGVcIlxuICAgID5cbiAgICAgICAgQGlmIChzaG93Q2FsZW5kYXIoKSkge1xuICAgICAgICAgICAgQGlmIChwaWNrZXJWaWV3KCkgPT09ICdjYWxlbmRhcicpIHtcbiAgICAgICAgICAgICAgICA8IS0tIENhYmXDp2FsaG8gZGUgbmF2ZWdhw6fDo28gbWVuc2FsIC0tPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gYm9yZGVyLWIgYm9yZGVyLXNvbGlkIGJvcmRlci1ncmF5c2NhbGUtMzAgcHgtMyBweS0yXCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGgtNyB3LTcgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHJvdW5kZWQtc21hbGwgdGV4dC1ncmF5c2NhbGUtOTAgdHJhbnNpdGlvbi1jb2xvcnMgaG92ZXI6YmctZ3JheXNjYWxlLTEwIGRpc2FibGVkOmN1cnNvci1ub3QtYWxsb3dlZCBkaXNhYmxlZDp0ZXh0LWdyYXlzY2FsZS0zMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwicHJldkRpc2FibGVkKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1kaXNhYmxlZF09XCJwcmV2RGlzYWJsZWQoKSA/ICd0cnVlJyA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfcHJldl9tb250aCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm5hdmlnYXRlUHJldigpXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZhcyBmYS1jaGV2cm9uLWxlZnQgdGV4dC14c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMSByb3VuZGVkLXNtYWxsIHB4LTIgcHktMSB0ZXh0LXNtIGZvbnQtbWVkaXVtIHRleHQtZ3JheXNjYWxlLTkwIHRyYW5zaXRpb24tY29sb3JzIGhvdmVyOmJnLWdyYXlzY2FsZS0xMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9zZWxlY3RfbW9udGhfeWVhcicgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInN3aXRjaFRvTW9udGhzKClcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBjdXJyZW50TW9udGhLZXkoKSB8IHRyYW5zbGF0ZSB9fSZuYnNwO3t7IGN1cnJlbnRZZWFyKCkgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmYXMgZmEtY2hldnJvbi1kb3duIHRleHQtWzEwcHhdXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggaC03IHctNyBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcm91bmRlZC1zbWFsbCB0ZXh0LWdyYXlzY2FsZS05MCB0cmFuc2l0aW9uLWNvbG9ycyBob3ZlcjpiZy1ncmF5c2NhbGUtMTAgZGlzYWJsZWQ6Y3Vyc29yLW5vdC1hbGxvd2VkIGRpc2FibGVkOnRleHQtZ3JheXNjYWxlLTMwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJuZXh0RGlzYWJsZWQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cIm5leHREaXNhYmxlZCgpID8gJ3RydWUnIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9uZXh0X21vbnRoJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwibmF2aWdhdGVOZXh0KClcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmFzIGZhLWNoZXZyb24tcmlnaHQgdGV4dC14c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPCEtLSBDYWJlw6dhbGhvcyBkb3MgZGlhcyBkYSBzZW1hbmEgLS0+XG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImdyaWQgZ3JpZC1jb2xzLTcgcHgtMyBwdC0yXCJcbiAgICAgICAgICAgICAgICAgICAgcm9sZT1cInJvd1wiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICBAZm9yIChkYXlLZXkgb2Ygb3JkZXJlZFdlZWtEYXlLZXlzKCk7IHRyYWNrIGRheUtleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBoLTggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHRleHQteHMgZm9udC1tZWRpdW0gdGV4dC1ncmF5c2NhbGUtNjBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvbGU9XCJjb2x1bW5oZWFkZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiZGF5S2V5IHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBkYXlLZXkgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8IS0tIEdyYWRlIGRvIGNhbGVuZMOhcmlvIC0tPlxuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJncmlkIGdyaWQtY29scy03IHB4LTMgcGItMlwiXG4gICAgICAgICAgICAgICAgICAgIHJvbGU9XCJncmlkXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9jYWxlbmRhcl9sYWJlbCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRyYW5zbGF0ZTogeyBtb250aDogKGN1cnJlbnRNb250aEtleSgpIHwgdHJhbnNsYXRlKSwgeWVhcjogY3VycmVudFllYXIoKSB9XG4gICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgIChrZXlkb3duKT1cImhhbmRsZUNhbGVuZGFyR3JpZEtleWRvd24oJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICBAZm9yICh3ZWVrIG9mIGNhbGVuZGFyV2Vla3MoKTsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sZT1cInJvd1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjb250ZW50c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQGZvciAoZGF5IG9mIHdlZWs7IHRyYWNrIGRheS5kYXRlLnRvSVNPU3RyaW5nKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2xlPVwiZ3JpZGNlbGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGgtOCB3LTggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHJvdW5kZWQtWzUwJV0gdGV4dC1zbSBmb250LW5vcm1hbCB0cmFuc2l0aW9uLWNvbG9yc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuaW52aXNpYmxlXT1cIiFzaG93T3RoZXJNb250aHMoKSAmJiAhZGF5LmlzQ3VycmVudE1vbnRoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiZm9ybWF0RGF5QXJpYUxhYmVsKGRheS5kYXRlKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLXNlbGVjdGVkXT1cImRheS5pc1NlbGVjdGVkIHx8IGRheS5pc1JhbmdlU3RhcnQgfHwgZGF5LmlzUmFuZ2VFbmQgfHwgbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWN1cnJlbnRdPVwiZGF5LmlzVG9kYXkgPyAnZGF0ZScgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtZGlzYWJsZWRdPVwiZGF5LmlzRGlzYWJsZWQgPyAndHJ1ZScgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtaGlkZGVuXT1cIiFzaG93T3RoZXJNb250aHMoKSAmJiAhZGF5LmlzQ3VycmVudE1vbnRoID8gJ3RydWUnIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLWZvY3VzXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRheS5pc1NlbGVjdGVkIHx8IGRheS5pc1JhbmdlU3RhcnQgfHwgZGF5LmlzUmFuZ2VFbmRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnc2VsZWN0ZWQnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZGF5LmlzVG9kYXlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICd0b2RheSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG51bGxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGF5LmlzRGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiZy1wcmltYXJ5IGZvbnQtc2VtaWJvbGQgdGV4dC1ncmF5c2NhbGUtMCc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRheS5pc1NlbGVjdGVkIHx8IGRheS5pc1JhbmdlU3RhcnQgfHwgZGF5LmlzUmFuZ2VFbmQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2JnLWdyYXlzY2FsZS0xMCBob3ZlcjpiZy1ncmF5c2NhbGUtMjAnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXkuaXNJblJhbmdlICYmICFkYXkuaXNSYW5nZVN0YXJ0ICYmICFkYXkuaXNSYW5nZUVuZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGV4dC1ncmF5c2NhbGUtOTAgaG92ZXI6YmctZ3JheXNjYWxlLTEwJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWRheS5pc1NlbGVjdGVkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFkYXkuaXNSYW5nZVN0YXJ0ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFkYXkuaXNSYW5nZUVuZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhZGF5LmlzRGlzYWJsZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF5LmlzQ3VycmVudE1vbnRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXh0LWdyYXlzY2FsZS02MCBob3ZlcjpiZy1ncmF5c2NhbGUtMTAnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhZGF5LmlzU2VsZWN0ZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWRheS5pc1JhbmdlU3RhcnQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWRheS5pc1JhbmdlRW5kICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFkYXkuaXNEaXNhYmxlZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhZGF5LmlzQ3VycmVudE1vbnRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyaW5nLTIgcmluZy1pbnNldCByaW5nLXByaW1hcnknOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXkuaXNUb2RheSAmJiAhZGF5LmlzU2VsZWN0ZWQgJiYgIWRheS5pc1JhbmdlU3RhcnQgJiYgIWRheS5pc1JhbmdlRW5kLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjdXJzb3Itbm90LWFsbG93ZWQgdGV4dC1ncmF5c2NhbGUtMzAnOiBkYXkuaXNEaXNhYmxlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1vdXNlZW50ZXIpPVwib25EYXlIb3ZlcihkYXkuZGF0ZSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1vdXNlbGVhdmUpPVwib25EYXlIb3ZlcihudWxsKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0RGF0ZShkYXkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZGF5LmRheU9mTW9udGggfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgQGlmIChwaWNrZXJWaWV3KCkgPT09ICd5ZWFycycpIHtcbiAgICAgICAgICAgICAgICA8IS0tIENhYmXDp2FsaG8gZGUgbmF2ZWdhw6fDo28gcG9yIGTDqWNhZGEgLS0+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBib3JkZXItYiBib3JkZXItc29saWQgYm9yZGVyLWdyYXlzY2FsZS0zMCBweC0zIHB5LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggaC03IHctNyBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcm91bmRlZC1zbWFsbCB0ZXh0LWdyYXlzY2FsZS05MCB0cmFuc2l0aW9uLWNvbG9ycyBob3ZlcjpiZy1ncmF5c2NhbGUtMTAgZGlzYWJsZWQ6Y3Vyc29yLW5vdC1hbGxvd2VkIGRpc2FibGVkOnRleHQtZ3JheXNjYWxlLTMwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJwcmV2RGlzYWJsZWQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cInByZXZEaXNhYmxlZCgpID8gJ3RydWUnIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9wcmV2X2RlY2FkZScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm5hdmlnYXRlUHJldigpXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZhcyBmYS1jaGV2cm9uLWxlZnQgdGV4dC14c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LWdyYXlzY2FsZS05MFwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+e3sgY3VycmVudERlY2FkZVN0YXJ0KCkgfX0g4oCTIHt7IGN1cnJlbnREZWNhZGVTdGFydCgpICsgMTEgfX08L3NwYW5cbiAgICAgICAgICAgICAgICAgICAgPlxuXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGgtNyB3LTcgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHJvdW5kZWQtc21hbGwgdGV4dC1ncmF5c2NhbGUtOTAgdHJhbnNpdGlvbi1jb2xvcnMgaG92ZXI6YmctZ3JheXNjYWxlLTEwIGRpc2FibGVkOmN1cnNvci1ub3QtYWxsb3dlZCBkaXNhYmxlZDp0ZXh0LWdyYXlzY2FsZS0zMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwibmV4dERpc2FibGVkKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1kaXNhYmxlZF09XCJuZXh0RGlzYWJsZWQoKSA/ICd0cnVlJyA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfbmV4dF9kZWNhZGUnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJuYXZpZ2F0ZU5leHQoKVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmYXMgZmEtY2hldnJvbi1yaWdodCB0ZXh0LXhzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8IS0tIEdyYWRlIGRlIGFub3MgLS0+XG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImdyaWQgZ3JpZC1jb2xzLTMgZ2FwLTIgcHgtMyBweS0zXCJcbiAgICAgICAgICAgICAgICAgICAgcm9sZT1cImdyaWRcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9zZWxlY3RfeWVhcicgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgQGZvciAocm93IG9mIHllYXJzR3JpZCgpOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIEBmb3IgKHllYXIgb2Ygcm93OyB0cmFjayB5ZWFyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sZT1cImdyaWRjZWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGgtOSBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcm91bmRlZC1zbWFsbCB0ZXh0LXNtIGZvbnQtbm9ybWFsIHRyYW5zaXRpb24tY29sb3JzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1zZWxlY3RlZF09XCJpc1llYXJTZWxlY3RlZCh5ZWFyKSB8fCBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1kaXNhYmxlZF09XCJpc1llYXJEaXNhYmxlZCh5ZWFyKSA/ICd0cnVlJyA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWN1cnJlbnRdPVwiaXNDdXJyZW50WWVhcih5ZWFyKSA/ICdkYXRlJyA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLWZvY3VzXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNZZWFyU2VsZWN0ZWQoeWVhcikgPyAnc2VsZWN0ZWQnIDogaXNDdXJyZW50WWVhcih5ZWFyKSA/ICd0b2RheScgOiBudWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc1llYXJEaXNhYmxlZCh5ZWFyKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiZy1wcmltYXJ5IGZvbnQtc2VtaWJvbGQgdGV4dC1ncmF5c2NhbGUtMCc6IGlzWWVhclNlbGVjdGVkKHllYXIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JpbmctMiByaW5nLWluc2V0IHJpbmctcHJpbWFyeSc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNDdXJyZW50WWVhcih5ZWFyKSAmJiAhaXNZZWFyU2VsZWN0ZWQoeWVhcikgJiYgIWlzWWVhckRpc2FibGVkKHllYXIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RleHQtZ3JheXNjYWxlLTkwIGhvdmVyOmJnLWdyYXlzY2FsZS0xMCc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWlzWWVhclNlbGVjdGVkKHllYXIpICYmICFpc1llYXJEaXNhYmxlZCh5ZWFyKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjdXJzb3Itbm90LWFsbG93ZWQgdGV4dC1ncmF5c2NhbGUtMzAnOiBpc1llYXJEaXNhYmxlZCh5ZWFyKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RZZWFyKHllYXIpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHllYXIgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBAaWYgKHBpY2tlclZpZXcoKSA9PT0gJ21vbnRocycpIHtcbiAgICAgICAgICAgICAgICA8IS0tIENhYmXDp2FsaG8gZGUgbmF2ZWdhw6fDo28gYW51YWwgLS0+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBib3JkZXItYiBib3JkZXItc29saWQgYm9yZGVyLWdyYXlzY2FsZS0zMCBweC0zIHB5LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggaC03IHctNyBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcm91bmRlZC1zbWFsbCB0ZXh0LWdyYXlzY2FsZS05MCB0cmFuc2l0aW9uLWNvbG9ycyBob3ZlcjpiZy1ncmF5c2NhbGUtMTAgZGlzYWJsZWQ6Y3Vyc29yLW5vdC1hbGxvd2VkIGRpc2FibGVkOnRleHQtZ3JheXNjYWxlLTMwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJwcmV2RGlzYWJsZWQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cInByZXZEaXNhYmxlZCgpID8gJ3RydWUnIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9wcmV2X3llYXInIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJuYXZpZ2F0ZVByZXYoKVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmYXMgZmEtY2hldnJvbi1sZWZ0IHRleHQteHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtc20gZm9udC1tZWRpdW0gdGV4dC1ncmF5c2NhbGUtOTBcIj57eyBjdXJyZW50WWVhcigpIH19PC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGgtNyB3LTcgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHJvdW5kZWQtc21hbGwgdGV4dC1ncmF5c2NhbGUtOTAgdHJhbnNpdGlvbi1jb2xvcnMgaG92ZXI6YmctZ3JheXNjYWxlLTEwIGRpc2FibGVkOmN1cnNvci1ub3QtYWxsb3dlZCBkaXNhYmxlZDp0ZXh0LWdyYXlzY2FsZS0zMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwibmV4dERpc2FibGVkKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1kaXNhYmxlZF09XCJuZXh0RGlzYWJsZWQoKSA/ICd0cnVlJyA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfbmV4dF95ZWFyJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwibmF2aWdhdGVOZXh0KClcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmFzIGZhLWNoZXZyb24tcmlnaHQgdGV4dC14c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPCEtLSBHcmFkZSBkZSBtZXNlcyAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZ3JpZCBncmlkLWNvbHMtMyBnYXAtMiBweC0zIHB5LTNcIlxuICAgICAgICAgICAgICAgICAgICByb2xlPVwiZ3JpZFwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX3NlbGVjdF9tb250aCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgQGZvciAocm93IG9mIG1vbnRoc0dyaWQoKTsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBAZm9yIChtb250aCBvZiByb3c7IHRyYWNrIG1vbnRoLmluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sZT1cImdyaWRjZWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGgtOSBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcm91bmRlZC1zbWFsbCB0ZXh0LXNtIGZvbnQtbm9ybWFsIHRyYW5zaXRpb24tY29sb3JzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1zZWxlY3RlZF09XCJpc01vbnRoU2VsZWN0ZWQobW9udGguaW5kZXgpIHx8IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cImlzTW9udGhEaXNhYmxlZChtb250aC5pbmRleCkgPyAndHJ1ZScgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS1mb2N1c109XCJpc01vbnRoU2VsZWN0ZWQobW9udGguaW5kZXgpID8gJ3NlbGVjdGVkJyA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNNb250aERpc2FibGVkKG1vbnRoLmluZGV4KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiZy1wcmltYXJ5IGZvbnQtc2VtaWJvbGQgdGV4dC1ncmF5c2NhbGUtMCc6IGlzTW9udGhTZWxlY3RlZChtb250aC5pbmRleCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGV4dC1ncmF5c2NhbGUtOTAgaG92ZXI6YmctZ3JheXNjYWxlLTEwJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhaXNNb250aFNlbGVjdGVkKG1vbnRoLmluZGV4KSAmJiAhaXNNb250aERpc2FibGVkKG1vbnRoLmluZGV4KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjdXJzb3Itbm90LWFsbG93ZWQgdGV4dC1ncmF5c2NhbGUtMzAnOiBpc01vbnRoRGlzYWJsZWQobW9udGguaW5kZXgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdE1vbnRoKG1vbnRoLmluZGV4KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBtb250aC5rZXkgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgQGlmIChtb2RlKCkgIT09ICdtb250aCcpIHtcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJvcmRlci10IGJvcmRlci1zb2xpZCBib3JkZXItZ3JheXNjYWxlLTMwIHB4LTMgcHktMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTIgcm91bmRlZC1zbWFsbCBweC0yIHB5LTEgdGV4dC1zbSB0ZXh0LWdyYXlzY2FsZS05MCB0cmFuc2l0aW9uLWNvbG9ycyBob3ZlcjpiZy1ncmF5c2NhbGUtMTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJiYWNrVG9DYWxlbmRhcigpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZhcyBmYS1hcnJvdy1sZWZ0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7ICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9iYWNrX3RvX2NhbGVuZGFyJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIDwhLS0gVGltZSBwaWNrZXIgLS0+XG4gICAgICAgIEBpZiAoc2hvd1RpbWVQaWNrZXIoKSkge1xuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgZ2FwLTMgcHgtNCBweS0zXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuYm9yZGVyLXRdPVwic2hvd0NhbGVuZGFyKClcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5ib3JkZXItc29saWRdPVwic2hvd0NhbGVuZGFyKClcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5ib3JkZXItZ3JheXNjYWxlLTMwXT1cInNob3dDYWxlbmRhcigpXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9zZWxlY3RfdGltZScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDwhLS0gSG9yYXMgLS0+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgaXRlbXMtY2VudGVyIGdhcC0xXCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICNpbmNyZWFzZUhvdXJCdXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGgtNiB3LTYgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHJvdW5kZWQtc21hbGwgdGV4dC1ncmF5c2NhbGUtOTAgdHJhbnNpdGlvbi1jb2xvcnMgaG92ZXI6YmctZ3JheXNjYWxlLTEwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX2luY3JlbWVudF9ob3VyJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiaW5jcmVtZW50SG91cnMoKVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmYXMgZmEtY2hldnJvbi11cCB0ZXh0LXhzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRtb2RlPVwibnVtZXJpY1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5tYXhsZW5ndGhdPVwidGltZUlucHV0TWF4TGVuZ3RoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaC05IHctMTIgcm91bmRlZC1zbWFsbCBib3JkZXIgYm9yZGVyLXNvbGlkIGJvcmRlci1ncmF5c2NhbGUtMzAgYmctZ3JheXNjYWxlLTUgdGV4dC1jZW50ZXIgdGV4dC1iYXNlIGZvbnQtbWVkaXVtIHRleHQtZ3JheXNjYWxlLTkwIG91dGxpbmUtbm9uZSBmb2N1cy12aXNpYmxlOm91dGxpbmUgZm9jdXMtdmlzaWJsZTpvdXRsaW5lLTIgZm9jdXMtdmlzaWJsZTpvdXRsaW5lLW9mZnNldC1bLTJweF0gZm9jdXMtdmlzaWJsZTpvdXRsaW5lLVt2YXIoLS1zLWZvY3VzLXJpbmctY29sb3IsIzAwOTBmZildXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJwYWRUaW1lKGRpc3BsYXlIb3VycygpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9ob3VyJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWxpdmU9XCJwb2xpdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybj1cIlswLTldK1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bik9XCJoYW5kbGVIb3Vyc0tleWRvd24oJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cImhhbmRsZUhvdXJzSW5wdXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGgtNiB3LTYgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHJvdW5kZWQtc21hbGwgdGV4dC1ncmF5c2NhbGUtOTAgdHJhbnNpdGlvbi1jb2xvcnMgaG92ZXI6YmctZ3JheXNjYWxlLTEwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX2RlY3JlbWVudF9ob3VyJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGVjcmVtZW50SG91cnMoKVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmYXMgZmEtY2hldnJvbi1kb3duIHRleHQteHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGV4dC14bCBmb250LWJvbGQgdGV4dC1ncmF5c2NhbGUtNjBcIlxuICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICA+Ojwvc3BhblxuICAgICAgICAgICAgICAgID5cblxuICAgICAgICAgICAgICAgIDwhLS0gTWludXRvcyAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBpdGVtcy1jZW50ZXIgZ2FwLTFcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggaC02IHctNiBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcm91bmRlZC1zbWFsbCB0ZXh0LWdyYXlzY2FsZS05MCB0cmFuc2l0aW9uLWNvbG9ycyBob3ZlcjpiZy1ncmF5c2NhbGUtMTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfaW5jcmVtZW50X21pbnV0ZScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImluY3JlbWVudE1pbnV0ZXMoKVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmYXMgZmEtY2hldnJvbi11cCB0ZXh0LXhzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRtb2RlPVwibnVtZXJpY1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5tYXhsZW5ndGhdPVwidGltZUlucHV0TWF4TGVuZ3RoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaC05IHctMTIgcm91bmRlZC1zbWFsbCBib3JkZXIgYm9yZGVyLXNvbGlkIGJvcmRlci1ncmF5c2NhbGUtMzAgYmctZ3JheXNjYWxlLTUgdGV4dC1jZW50ZXIgdGV4dC1iYXNlIGZvbnQtbWVkaXVtIHRleHQtZ3JheXNjYWxlLTkwIG91dGxpbmUtbm9uZSBmb2N1cy12aXNpYmxlOm91dGxpbmUgZm9jdXMtdmlzaWJsZTpvdXRsaW5lLTIgZm9jdXMtdmlzaWJsZTpvdXRsaW5lLW9mZnNldC1bLTJweF0gZm9jdXMtdmlzaWJsZTpvdXRsaW5lLVt2YXIoLS1zLWZvY3VzLXJpbmctY29sb3IsIzAwOTBmZildXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJwYWRUaW1lKG1pbnV0ZXMoKSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfbWludXRlJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWxpdmU9XCJwb2xpdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybj1cIlswLTldK1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bik9XCJoYW5kbGVNaW51dGVzS2V5ZG93bigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwiaGFuZGxlTWludXRlc0lucHV0KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBoLTYgdy02IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciByb3VuZGVkLXNtYWxsIHRleHQtZ3JheXNjYWxlLTkwIHRyYW5zaXRpb24tY29sb3JzIGhvdmVyOmJnLWdyYXlzY2FsZS0xMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9kZWNyZW1lbnRfbWludXRlJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGVjcmVtZW50TWludXRlcygpXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZhcyBmYS1jaGV2cm9uLWRvd24gdGV4dC14c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgQGlmIChzaG93U2Vjb25kcygpKSB7XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRleHQteGwgZm9udC1ib2xkIHRleHQtZ3JheXNjYWxlLTYwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+Ojwvc3BhblxuICAgICAgICAgICAgICAgICAgICA+XG5cbiAgICAgICAgICAgICAgICAgICAgPCEtLSBTZWd1bmRvcyAtLT5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgaXRlbXMtY2VudGVyIGdhcC0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGgtNiB3LTYgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHJvdW5kZWQtc21hbGwgdGV4dC1ncmF5c2NhbGUtOTAgdHJhbnNpdGlvbi1jb2xvcnMgaG92ZXI6YmctZ3JheXNjYWxlLTEwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9pbmNyZW1lbnRfc2Vjb25kJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImluY3JlbWVudFNlY29uZHMoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmYXMgZmEtY2hldnJvbi11cCB0ZXh0LXhzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRtb2RlPVwibnVtZXJpY1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIubWF4bGVuZ3RoXT1cInRpbWVJbnB1dE1heExlbmd0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJoLTkgdy0xMiByb3VuZGVkLXNtYWxsIGJvcmRlciBib3JkZXItc29saWQgYm9yZGVyLWdyYXlzY2FsZS0zMCBiZy1ncmF5c2NhbGUtNSB0ZXh0LWNlbnRlciB0ZXh0LWJhc2UgZm9udC1tZWRpdW0gdGV4dC1ncmF5c2NhbGUtOTAgb3V0bGluZS1ub25lIGZvY3VzLXZpc2libGU6b3V0bGluZSBmb2N1cy12aXNpYmxlOm91dGxpbmUtMiBmb2N1cy12aXNpYmxlOm91dGxpbmUtb2Zmc2V0LVstMnB4XSBmb2N1cy12aXNpYmxlOm91dGxpbmUtW3ZhcigtLXMtZm9jdXMtcmluZy1jb2xvciwjMDA5MGZmKV1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJwYWRUaW1lKHNlY29uZHMoKSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX3NlY29uZCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtbGl2ZT1cInBvbGl0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybj1cIlswLTldK1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwiaGFuZGxlU2Vjb25kc0tleWRvd24oJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJoYW5kbGVTZWNvbmRzSW5wdXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBoLTYgdy02IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciByb3VuZGVkLXNtYWxsIHRleHQtZ3JheXNjYWxlLTkwIHRyYW5zaXRpb24tY29sb3JzIGhvdmVyOmJnLWdyYXlzY2FsZS0xMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfZGVjcmVtZW50X3NlY29uZCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJkZWNyZW1lbnRTZWNvbmRzKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmFzIGZhLWNoZXZyb24tZG93biB0ZXh0LXhzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIEBpZiAoaXMxMkhvdXJGb3JtYXQoKSkge1xuICAgICAgICAgICAgICAgICAgICA8IS0tIFNlbGV0b3IgQU0vUE0gLS0+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGgtOSB3LTEyIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciByb3VuZGVkLXNtYWxsIGJvcmRlciBib3JkZXItc29saWQgYm9yZGVyLWdyYXlzY2FsZS0zMCBiZy1ncmF5c2NhbGUtNSB0ZXh0LWJhc2UgZm9udC1tZWRpdW0gdGV4dC1ncmF5c2NhbGUtOTAgdHJhbnNpdGlvbi1jb2xvcnMgaG92ZXI6YmctZ3JheXNjYWxlLTEwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX3RvZ2dsZV9tZXJpZGllbScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1saXZlPVwicG9saXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVBbVBtKClcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBhbVBtKCkgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cblxuICAgICAgICA8IS0tIFJvZGFww6kgZGUgYcOnw7VlcyAtLT5cbiAgICAgICAgQGlmIChzaG93QnV0dG9uQmFyKCkgfHwgbW9kZSgpID09PSAnZGF0ZXRpbWUnIHx8IG1vZGUoKSA9PT0gJ3RpbWUnKSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIGJvcmRlci10IGJvcmRlci1zb2xpZCBib3JkZXItZ3JheXNjYWxlLTMwIHB4LTMgcHktMlwiPlxuICAgICAgICAgICAgICAgIEBpZiAoc2hvd0J1dHRvbkJhcigpKSB7XG4gICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYgKG1vZGUoKSA9PT0gJ2RhdGUnIHx8IG1vZGUoKSA9PT0gJ2RhdGV0aW1lJyB8fCBtb2RlKCkgPT09ICdyYW5nZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInJvdW5kZWQtc21hbGwgcHgtMiBweS0xIHRleHQtc20gdGV4dC1ncmF5c2NhbGUtOTAgdHJhbnNpdGlvbi1jb2xvcnMgaG92ZXI6YmctZ3JheXNjYWxlLTEwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdFRvZGF5KClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX3RvZGF5JyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBnYXAtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicm91bmRlZC1zbWFsbCBweC0yIHB5LTEgdGV4dC1zbSB0ZXh0LWdyYXlzY2FsZS05MCB0cmFuc2l0aW9uLWNvbG9ycyBob3ZlcjpiZy1ncmF5c2NhbGUtMTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjbGVhclZhbHVlKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7ICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9jbGVhcicgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYgKG1vZGUoKSA9PT0gJ2RhdGV0aW1lJyB8fCBtb2RlKCkgPT09ICd0aW1lJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicm91bmRlZC1zbWFsbCBiZy1wcmltYXJ5IHB4LTMgcHktMSB0ZXh0LXNtIGZvbnQtbWVkaXVtIHRleHQtZ3JheXNjYWxlLTAgdHJhbnNpdGlvbi1jb2xvcnMgaG92ZXI6b3BhY2l0eS05MFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjb25maXJtKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX2NvbmZpcm0nIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICA8ZGl2PjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChtb2RlKCkgPT09ICdkYXRldGltZScgfHwgbW9kZSgpID09PSAndGltZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInJvdW5kZWQtc21hbGwgYmctcHJpbWFyeSBweC0zIHB5LTEgdGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LWdyYXlzY2FsZS0wIHRyYW5zaXRpb24tY29sb3JzIGhvdmVyOm9wYWNpdHktOTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY29uZmlybSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7ICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9jb25maXJtJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuIl19