@c8y/ngx-components 1021.62.9 → 1021.64.0

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 (99) hide show
  1. package/core/bottom-drawer/bottom-drawer-ref.d.ts +4 -0
  2. package/core/bottom-drawer/bottom-drawer-ref.d.ts.map +1 -1
  3. package/core/plugins/plugins.model.d.ts +1 -0
  4. package/core/plugins/plugins.model.d.ts.map +1 -1
  5. package/core/plugins/plugins.service.d.ts +5 -2
  6. package/core/plugins/plugins.service.d.ts.map +1 -1
  7. package/echart/services/echarts-options.service.d.ts +3 -1
  8. package/echart/services/echarts-options.service.d.ts.map +1 -1
  9. package/ecosystem/application-plugins/application-plugin-readme.component.d.ts +15 -0
  10. package/ecosystem/application-plugins/application-plugin-readme.component.d.ts.map +1 -0
  11. package/ecosystem/application-plugins/application-plugins.component.d.ts +4 -2
  12. package/ecosystem/application-plugins/application-plugins.component.d.ts.map +1 -1
  13. package/ecosystem/application-plugins/application-plugins.module.d.ts +4 -3
  14. package/ecosystem/application-plugins/application-plugins.module.d.ts.map +1 -1
  15. package/ecosystem/application-plugins/install-plugin.component.d.ts +8 -4
  16. package/ecosystem/application-plugins/install-plugin.component.d.ts.map +1 -1
  17. package/ecosystem/application-plugins/plugin-list.component.d.ts +10 -26
  18. package/ecosystem/application-plugins/plugin-list.component.d.ts.map +1 -1
  19. package/ecosystem/application-plugins/plugin-list.service.d.ts +27 -0
  20. package/ecosystem/application-plugins/plugin-list.service.d.ts.map +1 -0
  21. package/ecosystem/packages/package-details/package-details.component.d.ts +7 -9
  22. package/ecosystem/packages/package-details/package-details.component.d.ts.map +1 -1
  23. package/ecosystem/packages/package-versions/package-contents/contents-plugins/contents-plugins.component.d.ts +5 -1
  24. package/ecosystem/packages/package-versions/package-contents/contents-plugins/contents-plugins.component.d.ts.map +1 -1
  25. package/ecosystem/packages/package-versions/package-contents/packages-contents.component.d.ts +6 -3
  26. package/ecosystem/packages/package-versions/package-contents/packages-contents.component.d.ts.map +1 -1
  27. package/ecosystem/packages/package-versions/packages-versions.component.d.ts +9 -2
  28. package/ecosystem/packages/package-versions/packages-versions.component.d.ts.map +1 -1
  29. package/esm2022/alarms/alarm-details.component.mjs +3 -3
  30. package/esm2022/alarms/alarms-filter.component.mjs +3 -3
  31. package/esm2022/alarms/alarms-icon.component.mjs +3 -3
  32. package/esm2022/alarms/alarms-interval-refresh.component.mjs +3 -3
  33. package/esm2022/alarms/alarms-list.component.mjs +3 -3
  34. package/esm2022/alarms/alarms.component.mjs +3 -3
  35. package/esm2022/auth-configuration/sso-configuration/sso-configuration.component.mjs +3 -3
  36. package/esm2022/core/bottom-drawer/bottom-drawer-ref.mjs +9 -3
  37. package/esm2022/core/countdown-interval/countdown-interval.component.mjs +3 -3
  38. package/esm2022/core/plugins/plugins.model.mjs +1 -1
  39. package/esm2022/core/plugins/plugins.service.mjs +25 -5
  40. package/esm2022/echart/services/echarts-options.service.mjs +28 -12
  41. package/esm2022/ecosystem/application-plugins/application-plugin-readme.component.mjs +26 -0
  42. package/esm2022/ecosystem/application-plugins/application-plugins.component.mjs +26 -11
  43. package/esm2022/ecosystem/application-plugins/application-plugins.module.mjs +6 -3
  44. package/esm2022/ecosystem/application-plugins/install-plugin.component.mjs +21 -15
  45. package/esm2022/ecosystem/application-plugins/plugin-list-item.component.mjs +3 -3
  46. package/esm2022/ecosystem/application-plugins/plugin-list.component.mjs +26 -202
  47. package/esm2022/ecosystem/application-plugins/plugin-list.service.mjs +200 -0
  48. package/esm2022/ecosystem/application-properties/update-application-modal/update-application-modal.component.mjs +1 -1
  49. package/esm2022/ecosystem/packages/package-details/package-details.component.mjs +25 -44
  50. package/esm2022/ecosystem/packages/package-versions/package-contents/contents-plugins/contents-plugins.component.mjs +14 -4
  51. package/esm2022/ecosystem/packages/package-versions/package-contents/packages-contents.component.mjs +13 -6
  52. package/esm2022/ecosystem/packages/package-versions/packages-versions.component.mjs +22 -8
  53. package/esm2022/ecosystem/shared/list-filters/list-filters.component.mjs +3 -3
  54. package/esm2022/register-device/device-registration-view.component.mjs +39 -9
  55. package/esm2022/register-device/general/general-device-registration-button.component.mjs +13 -14
  56. package/esm2022/register-device/general/general-device-registration.component.mjs +19 -5
  57. package/esm2022/register-device/general/general-device-registration.service.mjs +30 -0
  58. package/esm2022/register-device/index.mjs +2 -1
  59. package/esm2022/widgets/implementations/alarms/alarm-list-widget-config/alarm-list-widget-config.component.mjs +3 -3
  60. package/fesm2022/c8y-ngx-components-alarms.mjs +12 -12
  61. package/fesm2022/c8y-ngx-components-alarms.mjs.map +1 -1
  62. package/fesm2022/c8y-ngx-components-auth-configuration.mjs +2 -2
  63. package/fesm2022/c8y-ngx-components-auth-configuration.mjs.map +1 -1
  64. package/fesm2022/c8y-ngx-components-echart.mjs +26 -11
  65. package/fesm2022/c8y-ngx-components-echart.mjs.map +1 -1
  66. package/fesm2022/c8y-ngx-components-ecosystem-application-plugins.mjs +205 -138
  67. package/fesm2022/c8y-ngx-components-ecosystem-application-plugins.mjs.map +1 -1
  68. package/fesm2022/c8y-ngx-components-ecosystem-shared.mjs +2 -2
  69. package/fesm2022/c8y-ngx-components-ecosystem-shared.mjs.map +1 -1
  70. package/fesm2022/c8y-ngx-components-ecosystem.mjs +257 -176
  71. package/fesm2022/c8y-ngx-components-ecosystem.mjs.map +1 -1
  72. package/fesm2022/c8y-ngx-components-register-device.mjs +86 -19
  73. package/fesm2022/c8y-ngx-components-register-device.mjs.map +1 -1
  74. package/fesm2022/c8y-ngx-components-widgets-implementations-alarms.mjs +2 -2
  75. package/fesm2022/c8y-ngx-components-widgets-implementations-alarms.mjs.map +1 -1
  76. package/fesm2022/c8y-ngx-components.mjs +33 -7
  77. package/fesm2022/c8y-ngx-components.mjs.map +1 -1
  78. package/locales/de.po +3 -0
  79. package/locales/es.po +3 -0
  80. package/locales/fr.po +3 -0
  81. package/locales/ja_JP.po +3 -0
  82. package/locales/ko.po +3 -0
  83. package/locales/locales.pot +36 -6
  84. package/locales/nl.po +3 -0
  85. package/locales/pl.po +3 -0
  86. package/locales/pt_BR.po +3 -0
  87. package/locales/zh_CN.po +3 -0
  88. package/locales/zh_TW.po +3 -0
  89. package/package.json +1 -1
  90. package/register-device/device-registration-view.component.d.ts +6 -1
  91. package/register-device/device-registration-view.component.d.ts.map +1 -1
  92. package/register-device/general/general-device-registration-button.component.d.ts +3 -3
  93. package/register-device/general/general-device-registration-button.component.d.ts.map +1 -1
  94. package/register-device/general/general-device-registration.component.d.ts +5 -0
  95. package/register-device/general/general-device-registration.component.d.ts.map +1 -1
  96. package/register-device/general/general-device-registration.service.d.ts +9 -0
  97. package/register-device/general/general-device-registration.service.d.ts.map +1 -0
  98. package/register-device/index.d.ts +1 -0
  99. package/register-device/index.d.ts.map +1 -1
@@ -322,14 +322,14 @@ export class AlarmDetailsComponent {
322
322
  return customProperties;
323
323
  }
324
324
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AlarmDetailsComponent, deps: [{ token: i1.AlarmDetailsService }, { token: i2.AlarmService }, { token: i3.AlertService }, { token: i3.AppStateService }, { token: i2.AuditService }, { token: i3.RelativeTimePipe }, { token: i4.Ng1SmartRulesUpgradeService, optional: true }, { token: i5.TranslateService }, { token: i2.InventoryService }, { token: i6.AlarmsViewService }, { token: i3.ColorService }, { token: i3.InterAppService }], target: i0.ɵɵFactoryTarget.Component }); }
325
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: AlarmDetailsComponent, selector: "c8y-alarm-details", inputs: { selectedAlarm: "selectedAlarm" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"d-flex row tight-grid flex-wrap a-i-stretch\">\n <div class=\"col-xs-12 col-md-6 d-flex p-b-8\">\n <div class=\"border-all fit-w d-flex\">\n <div class=\"p-8\">\n <i\n class=\"icon-24 text-gray-dark m-t-4 c8y-icon\"\n [c8yIcon]=\"selectedAlarm.status | AlarmStatusToIcon\"\n ></i>\n </div>\n <div class=\"p-t-8 p-b-8 p-r-8\">\n <p class=\"text-label-small m-b-0 m-r-8\">{{ 'Status' | translate }}</p>\n <p class=\"small\">{{ statusMessage }}</p>\n </div>\n </div>\n </div>\n <div class=\"col-xs-12 col-md-6 d-flex p-b-8\">\n <div class=\"border-all fit-w d-flex\">\n <div class=\"p-8\">\n <i\n class=\"icon-24 text-gray-dark m-t-4 stroked-icon status\"\n [c8yIcon]=\"selectedAlarm.severity | AlarmSeverityToIcon\"\n [ngClass]=\"selectedAlarm.severity?.toString() | lowercase\"\n ></i>\n </div>\n <div class=\"p-t-8 p-b-8 p-r-8\">\n <p class=\"text-label-small m-b-0 m-r-8\">{{ 'Severity' | translate }}</p>\n <p class=\"small\">{{ SEVERITY_LABELS[selectedAlarm.severity] | translate }}</p>\n </div>\n </div>\n </div>\n <div class=\"col-xs-12 col-md-6 d-flex p-b-8\">\n <div class=\"border-all fit-w d-flex\">\n <div class=\"p-8\">\n <i\n class=\"icon-24 text-gray-dark m-t-4 stroked-icon status\"\n c8yIcon=\"contactless-payment\"\n ></i>\n </div>\n <div class=\"p-t-8 p-b-8 p-r-8\">\n <p class=\"text-label-small m-b-0 m-r-8\">{{ 'Source' | translate }}</p>\n <p class=\"small\">\n <button\n class=\"btn-link text-muted p-0 m-r-8 text-left\"\n title=\"{{ selectedAlarm.source.name }}\"\n type=\"button\"\n routerLink=\"{{ selectedAlarmMO | assetLink }}\"\n >\n <small class=\"icon-flex\">\n <i c8yIcon=\"exchange\"></i>\n {{ selectedAlarm.source.name || selectedAlarm.source.id }}\n </small>\n </button>\n <ng-container *ngIf=\"showSourceNavigationLink$ | async\">\n <button\n class=\"btn-link p-0 text-left\"\n title=\"{{\n linkTitle\n | translate\n : { appName: userDeviceManagementApp$ | async | humanizeAppName | async }\n }}\"\n type=\"button\"\n (click)=\"goToAlarmSource(selectedAlarm.id)\"\n data-cy=\"alarm-details-device-management-link\"\n >\n {{ userDeviceManagementApp$ | async | humanizeAppName | async }}\n <i c8yIcon=\"external-link\"></i>\n </button>\n </ng-container>\n </p>\n </div>\n </div>\n </div>\n <div class=\"col-xs-12 col-md-6 d-flex p-b-8\">\n <div class=\"border-all fit-w d-flex\">\n <div class=\"p-8\">\n <span\n class=\"circle-icon-wrapper\"\n [ngStyle]=\"{ 'background-color': typeColor }\"\n >\n <i\n class=\"stroked-icon\"\n c8yIcon=\"bell\"\n ></i>\n </span>\n </div>\n <div class=\"p-t-8 p-b-8 p-r-8 min-width-0\">\n <p class=\"text-label-small m-b-0 m-r-8\">{{ 'Type' | translate }}</p>\n <p\n class=\"small text-truncate\"\n title=\"{{ selectedAlarm.type }}\"\n >\n <code>{{ selectedAlarm.type }}</code>\n </p>\n </div>\n </div>\n </div>\n\n <div class=\"col-xs-12 col-md-12 p-b-16\">\n <div class=\"border-all fit-w d-flex\">\n <div class=\"p-8\">\n <i\n class=\"icon-24 text-gray-dark m-t-4\"\n c8yIcon=\"calendar\"\n data-cy=\"c8y-alarm-details--last-updated-icon\"\n ></i>\n </div>\n <div class=\"p-t-8 p-b-0 p-r-8 flex-grow\">\n <div class=\"content-flex-50\">\n <div\n class=\"col-4 p-b-8\"\n *ngIf=\"selectedAlarm.count > 1\"\n >\n <p class=\"text-label-small m-b-0 m-r-8\">{{ 'Number of occurrences' | translate }}</p>\n <p>\n <span class=\"badge badge-info\">{{ selectedAlarm.count }}</span>\n </p>\n </div>\n <div\n class=\"col-4 p-b-8\"\n *ngIf=\"selectedAlarm.count > 1\"\n >\n <p class=\"text-label-small m-b-0 m-r-8\">{{ 'First occurrence' | translate }}</p>\n <p class=\"small\">\n {{ selectedAlarm.creationTime | c8yDate: 'medium' }}\n\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{\n 'Time in which the alarm was created. The time shown corresponds to the server\\'s time. Device time can be different from server time.'\n | translate\n }}\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n ></button>\n </p>\n </div>\n <div\n class=\"col-4 p-b-8\"\n data-cy=\"c8y-alarm-details--last-updated-wrapper\"\n >\n <p class=\"text-label-small m-b-0 m-r-8\">{{ 'Last occurrence' | translate }}</p>\n <p class=\"small\">\n {{ selectedAlarm.lastUpdated | c8yDate: 'medium' }}\n\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{\n 'Time in which the alarm was last updated. The time shown corresponds to the server\\'s time. Device time can be different from server time.'\n | translate\n }}\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n ></button>\n </p>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div\n class=\"col-xs-12 col-md-12 p-b-16\"\n *ngIf=\"customFragments\"\n >\n <div class=\"border-all fit-w d-flex\">\n <div class=\"p-8\">\n <i\n class=\"icon-24 text-gray-dark m-t-4\"\n c8yIcon=\"outgoing-data\"\n ></i>\n </div>\n <div\n class=\"p-t-8 p-b-0 p-r-8 flex-grow\"\n data-cy=\"alarm-details-custom-data\"\n >\n <p class=\"text-label-small m-b-4 m-r-8\">{{ 'Custom data' | translate }}</p>\n <pre><code>{{ customFragments | json }}</code></pre>\n </div>\n </div>\n </div>\n</div>\n\n<div class=\"d-flex flex-wrap gap-8\">\n <button\n class=\"btn btn-default btn-sm\"\n [title]=\"'Reload audit logs' | translate\"\n type=\"submit\"\n (click)=\"reloadAuditLog(true, true)\"\n >\n <i\n c8yIcon=\"refresh\"\n [ngClass]=\"{ 'icon-spin': isLoading }\"\n ></i>\n {{ 'Reload audit logs' | translate }}\n </button>\n\n <button\n class=\"btn btn-default btn-sm\"\n [title]=\"\n selectedAlarm.status !== ACKNOWLEDGED_STATUS_VALUE\n ? (ACKNOWLEDGE_LABEL | translate)\n : (REACTIVATE_LABEL | translate)\n \"\n type=\"submit\"\n (click)=\"\n onUpdateDetails(\n selectedAlarm.status !== ACKNOWLEDGED_STATUS_VALUE\n ? ACKNOWLEDGED_STATUS_VALUE\n : ACTIVE_STATUS_VALUE\n )\n \"\n [disabled]=\"selectedAlarm.status === CLEARED_STATUS_VALUE || isAlarmStatusChanging\"\n >\n <i\n [c8yIcon]=\"selectedAlarm.status !== ACKNOWLEDGED_STATUS_VALUE ? BELL_SLASH_ICON : BELL_ICON\"\n ></i>\n {{\n selectedAlarm.status !== ACKNOWLEDGED_STATUS_VALUE\n ? (ACKNOWLEDGE_LABEL | translate)\n : (REACTIVATE_LABEL | translate)\n }}\n </button>\n\n <button\n class=\"btn btn-default btn-sm\"\n [title]=\"'Create smart rule' | translate\"\n type=\"submit\"\n *ngIf=\"isCreateSmartRulesButtonAvailable\"\n (click)=\"createSmartRule()\"\n >\n <i c8yIcon=\"c8y-icon c8y-icon-smart-rules\"></i>\n {{ 'Create smart rule' | translate }}\n </button>\n <button\n class=\"btn btn-default btn-sm\"\n [title]=\"'Clear`alarm`' | translate\"\n type=\"submit\"\n (click)=\"onUpdateDetails(CLEARED_STATUS_VALUE)\"\n [disabled]=\"selectedAlarm.status === CLEARED_STATUS_VALUE\"\n >\n <i c8yIcon=\"c8y-alert-idle\"></i>\n {{ 'Clear`alarm`' | translate }}\n </button>\n\n <button\n class=\"btn btn-default btn-sm\"\n [title]=\"button.title | translate\"\n type=\"button\"\n *ngFor=\"let button of selectedAlarm | alarmDetailsButton: selectedAlarmMO | async\"\n [ngClass]=\"button.additionalButtonClasses\"\n (click)=\"detailsButtonAction(button, selectedAlarm)\"\n [disabled]=\"button.disabled\"\n >\n <i\n [c8yIcon]=\"button.icon\"\n [ngClass]=\"button.additionalIconClasses\"\n ></i>\n <span *ngIf=\"button.label\">{{ button.label | translate }}</span>\n </button>\n</div>\n\n<ng-template #noAuditLogAvailable>\n <div class=\"p-16\">\n <c8y-ui-empty-state\n [icon]=\"'archive'\"\n [title]=\"'No audit logs found.' | translate\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n </div>\n</ng-template>\n\n<div class=\"legend form-block\">{{ 'Audit logs' | translate }}</div>\n\n<ng-container *ngIf=\"isLoading || auditLog?.data.length; else noAuditLogAvailable\">\n <c8y-loading *ngIf=\"isLoading\"></c8y-loading>\n\n <c8y-list-group\n data-cy=\"c8y-alarms-details--audit-logs\"\n *ngIf=\"!isLoading\"\n >\n <c8y-li-timeline *c8yFor=\"let log of auditLog; loadMore: 'hidden'\">\n {{ log.creationTime | date: 'mediumDate' }}\n {{ log.creationTime | date: 'mediumTime' }}\n <c8y-li>\n <c8y-li-body>\n <p class=\"text-truncate-wrap separator-bottom p-b-4\">\n {{ log | auditChangesMessage }}\n </p>\n <div class=\"c8y-list__item__footer\">\n <span\n class=\"m-r-16 small\"\n *ngIf=\"log.user\"\n >\n <span class=\"text-label-small\">\n {{ 'by`user`' | translate }}\n </span>\n {{ log.user }}\n </span>\n <span class=\"small\">\n <span class=\"text-label-small\">\n {{ 'device time' | translate }}\n </span>\n {{ log.time | c8yDate: 'medium' }}\n </span>\n </div>\n </c8y-li-body>\n </c8y-li>\n </c8y-li-timeline>\n </c8y-list-group>\n</ng-container>\n", dependencies: [{ kind: "component", type: i3.EmptyStateComponent, selector: "c8y-ui-empty-state", inputs: ["icon", "title", "subtitle", "horizontal"] }, { kind: "directive", type: i3.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i3.ForOfDirective, selector: "[c8yFor]", inputs: ["c8yForOf", "c8yForLoadMore", "c8yForPipe", "c8yForNotFound", "c8yForMaxIterations", "c8yForLoadingTemplate", "c8yForLoadNextLabel", "c8yForLoadingLabel", "c8yForRealtime", "c8yForRealtimeOptions", "c8yForComparator", "c8yForEnableVirtualScroll", "c8yForVirtualScrollElementSize", "c8yForVirtualScrollStrategy", "c8yForVirtualScrollContainerHeight"], outputs: ["c8yForCount", "c8yForChange", "c8yForLoadMoreComponent"] }, { kind: "component", type: i3.LoadingComponent, selector: "c8y-loading", inputs: ["layout", "progress", "message"] }, { kind: "component", type: i3.ListGroupComponent, selector: "c8y-list-group" }, { kind: "component", type: i3.ListItemComponent, selector: "c8y-list-item, c8y-li", inputs: ["active", "highlighted", "emptyActions", "dense", "collapsed", "selectable"], outputs: ["collapsedChange"] }, { kind: "component", type: i3.ListItemBodyComponent, selector: "c8y-list-item-body, c8y-li-body", inputs: ["body"] }, { kind: "component", type: i3.ListItemTimelineComponent, selector: "c8y-list-item-timeline, c8y-li-timeline" }, { kind: "directive", type: i8.PopoverDirective, selector: "[popover]", inputs: ["adaptivePosition", "boundariesElement", "popover", "popoverContext", "popoverTitle", "placement", "outsideClick", "triggers", "container", "containerClass", "isOpen", "delay"], outputs: ["onShown", "onHidden"], exportAs: ["bs-popover"] }, { kind: "directive", type: i9.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "pipe", type: i7.AsyncPipe, name: "async" }, { kind: "pipe", type: i7.LowerCasePipe, name: "lowercase" }, { kind: "pipe", type: i7.JsonPipe, name: "json" }, { kind: "pipe", type: i7.DatePipe, name: "date" }, { kind: "pipe", type: i3.HumanizeAppNamePipe, name: "humanizeAppName" }, { kind: "pipe", type: i3.DatePipe, name: "c8yDate" }, { kind: "pipe", type: i3.AssetLinkPipe, name: "assetLink" }, { kind: "pipe", type: i5.TranslatePipe, name: "translate" }, { kind: "pipe", type: i10.AlarmDetailsButtonPipe, name: "alarmDetailsButton" }, { kind: "pipe", type: i11.AlarmSeverityToIconPipe, name: "AlarmSeverityToIcon" }, { kind: "pipe", type: i12.AlarmStatusToIconPipe, name: "AlarmStatusToIcon" }, { kind: "pipe", type: i13.AuditChangesMessagePipe, name: "auditChangesMessage" }] }); }
325
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: AlarmDetailsComponent, selector: "c8y-alarm-details", inputs: { selectedAlarm: "selectedAlarm" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"d-flex row tight-grid flex-wrap a-i-stretch\">\n <div class=\"col-xs-12 col-md-6 d-flex p-b-8\">\n <div\n class=\"border-all fit-w d-flex\"\n data-cy=\"c8y-alarm-details--status-section-wrapper\"\n >\n <div\n class=\"p-8\"\n data-cy=\"c8y-alarm-details--status-icon\"\n >\n <i\n class=\"icon-24 text-gray-dark m-t-4 c8y-icon\"\n [c8yIcon]=\"selectedAlarm.status | AlarmStatusToIcon\"\n ></i>\n </div>\n <div class=\"p-t-8 p-b-8 p-r-8\">\n <p class=\"text-label-small m-b-0 m-r-8\">{{ 'Status' | translate }}</p>\n <p class=\"small\">{{ statusMessage }}</p>\n </div>\n </div>\n </div>\n <div class=\"col-xs-12 col-md-6 d-flex p-b-8\">\n <div\n class=\"border-all fit-w d-flex\"\n data-cy=\"c8y-alarm-details--severity-section-wrapper\"\n >\n <div class=\"p-8\">\n <i\n class=\"icon-24 text-gray-dark m-t-4 stroked-icon status\"\n [c8yIcon]=\"selectedAlarm.severity | AlarmSeverityToIcon\"\n [ngClass]=\"selectedAlarm.severity?.toString() | lowercase\"\n ></i>\n </div>\n <div class=\"p-t-8 p-b-8 p-r-8\">\n <p class=\"text-label-small m-b-0 m-r-8\">{{ 'Severity' | translate }}</p>\n <p class=\"small\">{{ SEVERITY_LABELS[selectedAlarm.severity] | translate }}</p>\n </div>\n </div>\n </div>\n <div\n class=\"col-xs-12 col-md-6 d-flex p-b-8\"\n data-cy=\"c8y-alarm-details--source-wrapper\"\n >\n <div class=\"border-all fit-w d-flex\">\n <div class=\"p-8\">\n <i\n class=\"icon-24 text-gray-dark m-t-4 stroked-icon status\"\n c8yIcon=\"contactless-payment\"\n ></i>\n </div>\n <div class=\"p-t-8 p-b-8 p-r-8\">\n <p class=\"text-label-small m-b-0 m-r-8\">{{ 'Source' | translate }}</p>\n <p class=\"small\">\n <button\n class=\"btn-link text-muted p-0 m-r-8 text-left\"\n title=\"{{ selectedAlarm.source.name }}\"\n type=\"button\"\n routerLink=\"{{ selectedAlarmMO | assetLink }}\"\n >\n <small class=\"icon-flex\">\n <i c8yIcon=\"exchange\"></i>\n {{ selectedAlarm.source.name || selectedAlarm.source.id }}\n </small>\n </button>\n <ng-container *ngIf=\"showSourceNavigationLink$ | async\">\n <button\n class=\"btn-link p-0 text-left\"\n title=\"{{\n linkTitle\n | translate\n : { appName: userDeviceManagementApp$ | async | humanizeAppName | async }\n }}\"\n type=\"button\"\n (click)=\"goToAlarmSource(selectedAlarm.id)\"\n data-cy=\"alarm-details-device-management-link\"\n >\n {{ userDeviceManagementApp$ | async | humanizeAppName | async }}\n <i c8yIcon=\"external-link\"></i>\n </button>\n </ng-container>\n </p>\n </div>\n </div>\n </div>\n <div\n class=\"col-xs-12 col-md-6 d-flex p-b-8\"\n data-cy=\"c8y-alarm-details--severity-type-wrapper\"\n >\n <div class=\"border-all fit-w d-flex\">\n <div class=\"p-8\">\n <span\n class=\"circle-icon-wrapper\"\n [ngStyle]=\"{ 'background-color': typeColor }\"\n >\n <i\n class=\"stroked-icon\"\n c8yIcon=\"bell\"\n ></i>\n </span>\n </div>\n <div class=\"p-t-8 p-b-8 p-r-8 min-width-0\">\n <p class=\"text-label-small m-b-0 m-r-8\">{{ 'Type' | translate }}</p>\n <p\n class=\"small text-truncate\"\n title=\"{{ selectedAlarm.type }}\"\n >\n <code>{{ selectedAlarm.type }}</code>\n </p>\n </div>\n </div>\n </div>\n\n <div class=\"col-xs-12 col-md-12 p-b-16\">\n <div class=\"border-all fit-w d-flex\">\n <div class=\"p-8\">\n <i\n class=\"icon-24 text-gray-dark m-t-4\"\n data-cy=\"c8y-alarm-details--last-updated-icon\"\n c8yIcon=\"calendar\"\n data-cy=\"c8y-alarm-details--last-updated-icon\"\n ></i>\n </div>\n <div class=\"p-t-8 p-b-0 p-r-8 flex-grow\">\n <div class=\"content-flex-50\">\n <div\n class=\"col-4 p-b-8\"\n *ngIf=\"selectedAlarm.count > 1\"\n data-cy=\"c8y-alarm-details--number-of-occurrences-wrapper\"\n >\n <p class=\"text-label-small m-b-0 m-r-8\">{{ 'Number of occurrences' | translate }}</p>\n <p>\n <span data-cy=\"c8y-alarm-details--badge\" class=\"badge badge-info\">{{ selectedAlarm.count }}</span>\n </p>\n </div>\n <div\n class=\"col-4 p-b-8\"\n *ngIf=\"selectedAlarm.count > 1\"\n data-cy=\"c8y-alarm-details--first-occurrence-wrapper\"\n >\n <p class=\"text-label-small m-b-0 m-r-8\">{{ 'First occurrence' | translate }}</p>\n <p class=\"small\">\n {{ selectedAlarm.creationTime | c8yDate: 'medium' }}\n\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{\n 'Time in which the alarm was created. The time shown corresponds to the server\\'s time. Device time can be different from server time.'\n | translate\n }}\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n ></button>\n </p>\n </div>\n <div\n class=\"col-4 p-b-8\"\n data-cy=\"c8y-alarm-details--last-updated-wrapper\"\n >\n <p class=\"text-label-small m-b-0 m-r-8\">{{ 'Last occurrence' | translate }}</p>\n <p class=\"small\">\n {{ selectedAlarm.lastUpdated | c8yDate: 'medium' }}\n\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{\n 'Time in which the alarm was last updated. The time shown corresponds to the server\\'s time. Device time can be different from server time.'\n | translate\n }}\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n ></button>\n </p>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div\n class=\"col-xs-12 col-md-12 p-b-16\"\n data-cy=\"c8y-alarm-details--custom-fragments-wrapper\"\n *ngIf=\"customFragments\"\n >\n <div class=\"border-all fit-w d-flex\">\n <div class=\"p-8\">\n <i\n class=\"icon-24 text-gray-dark m-t-4\"\n c8yIcon=\"outgoing-data\"\n ></i>\n </div>\n <div\n class=\"p-t-8 p-b-0 p-r-8 flex-grow\"\n data-cy=\"alarm-details-custom-data\"\n >\n <p class=\"text-label-small m-b-4 m-r-8\">{{ 'Custom data' | translate }}</p>\n <pre><code>{{ customFragments | json }}</code></pre>\n </div>\n </div>\n </div>\n</div>\n\n<div class=\"d-flex flex-wrap gap-8\">\n <button\n class=\"btn btn-default btn-sm\"\n [title]=\"'Reload audit logs' | translate\"\n type=\"submit\"\n (click)=\"reloadAuditLog(true, true)\"\n data-cy=\"c8y-alarms-details--reload-audit-logs\"\n >\n <i\n c8yIcon=\"refresh\"\n [ngClass]=\"{ 'icon-spin': isLoading }\"\n ></i>\n {{ 'Reload audit logs' | translate }}\n </button>\n\n <button\n class=\"btn btn-default btn-sm\"\n [title]=\"\n selectedAlarm.status !== ACKNOWLEDGED_STATUS_VALUE\n ? (ACKNOWLEDGE_LABEL | translate)\n : (REACTIVATE_LABEL | translate)\n \"\n type=\"submit\"\n (click)=\"\n onUpdateDetails(\n selectedAlarm.status !== ACKNOWLEDGED_STATUS_VALUE\n ? ACKNOWLEDGED_STATUS_VALUE\n : ACTIVE_STATUS_VALUE\n )\n \"\n [disabled]=\"selectedAlarm.status === CLEARED_STATUS_VALUE || isAlarmStatusChanging\"\n >\n <i\n [c8yIcon]=\"selectedAlarm.status !== ACKNOWLEDGED_STATUS_VALUE ? BELL_SLASH_ICON : BELL_ICON\"\n ></i>\n {{\n selectedAlarm.status !== ACKNOWLEDGED_STATUS_VALUE\n ? (ACKNOWLEDGE_LABEL | translate)\n : (REACTIVATE_LABEL | translate)\n }}\n </button>\n\n <button\n class=\"btn btn-default btn-sm\"\n [title]=\"'Create smart rule' | translate\"\n type=\"submit\"\n *ngIf=\"isCreateSmartRulesButtonAvailable\"\n (click)=\"createSmartRule()\"\n data-cy=\"c8y-alarms-details--create-smart-rule\"\n >\n <i c8yIcon=\"c8y-icon c8y-icon-smart-rules\"></i>\n {{ 'Create smart rule' | translate }}\n </button>\n <button\n class=\"btn btn-default btn-sm\"\n [title]=\"'Clear`alarm`' | translate\"\n type=\"submit\"\n data-cy=\"c8y-alarm-details--clear-alarm\"\n (click)=\"onUpdateDetails(CLEARED_STATUS_VALUE)\"\n [disabled]=\"selectedAlarm.status === CLEARED_STATUS_VALUE\"\n >\n <i c8yIcon=\"c8y-alert-idle\"></i>\n {{ 'Clear`alarm`' | translate }}\n </button>\n\n <button\n class=\"btn btn-default btn-sm\"\n [title]=\"button.title | translate\"\n type=\"button\"\n *ngFor=\"let button of selectedAlarm | alarmDetailsButton: selectedAlarmMO | async\"\n [ngClass]=\"button.additionalButtonClasses\"\n (click)=\"detailsButtonAction(button, selectedAlarm)\"\n [disabled]=\"button.disabled\"\n >\n <i\n [c8yIcon]=\"button.icon\"\n [ngClass]=\"button.additionalIconClasses\"\n ></i>\n <span *ngIf=\"button.label\">{{ button.label | translate }}</span>\n </button>\n</div>\n\n<ng-template #noAuditLogAvailable>\n <div class=\"p-16\">\n <c8y-ui-empty-state\n [icon]=\"'archive'\"\n [title]=\"'No audit logs found.' | translate\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n </div>\n</ng-template>\n\n<div class=\"legend form-block\">{{ 'Audit logs' | translate }}</div>\n\n<ng-container *ngIf=\"isLoading || auditLog?.data.length; else noAuditLogAvailable\">\n <c8y-loading *ngIf=\"isLoading\"></c8y-loading>\n\n <c8y-list-group\n data-cy=\"c8y-alarms-details--audit-logs\"\n *ngIf=\"!isLoading\"\n >\n <c8y-li-timeline *c8yFor=\"let log of auditLog; loadMore: 'hidden'\">\n {{ log.creationTime | date: 'mediumDate' }}\n {{ log.creationTime | date: 'mediumTime' }}\n <c8y-li>\n <c8y-li-body>\n <p class=\"text-truncate-wrap separator-bottom p-b-4\">\n {{ log | auditChangesMessage }}\n </p>\n <div class=\"c8y-list__item__footer\">\n <span\n class=\"m-r-16 small\"\n *ngIf=\"log.user\"\n >\n <span class=\"text-label-small\">\n {{ 'by`user`' | translate }}\n </span>\n {{ log.user }}\n </span>\n <span class=\"small\">\n <span class=\"text-label-small\">\n {{ 'device time' | translate }}\n </span>\n {{ log.time | c8yDate: 'medium' }}\n </span>\n </div>\n </c8y-li-body>\n </c8y-li>\n </c8y-li-timeline>\n </c8y-list-group>\n</ng-container>\n", dependencies: [{ kind: "component", type: i3.EmptyStateComponent, selector: "c8y-ui-empty-state", inputs: ["icon", "title", "subtitle", "horizontal"] }, { kind: "directive", type: i3.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i3.ForOfDirective, selector: "[c8yFor]", inputs: ["c8yForOf", "c8yForLoadMore", "c8yForPipe", "c8yForNotFound", "c8yForMaxIterations", "c8yForLoadingTemplate", "c8yForLoadNextLabel", "c8yForLoadingLabel", "c8yForRealtime", "c8yForRealtimeOptions", "c8yForComparator", "c8yForEnableVirtualScroll", "c8yForVirtualScrollElementSize", "c8yForVirtualScrollStrategy", "c8yForVirtualScrollContainerHeight"], outputs: ["c8yForCount", "c8yForChange", "c8yForLoadMoreComponent"] }, { kind: "component", type: i3.LoadingComponent, selector: "c8y-loading", inputs: ["layout", "progress", "message"] }, { kind: "component", type: i3.ListGroupComponent, selector: "c8y-list-group" }, { kind: "component", type: i3.ListItemComponent, selector: "c8y-list-item, c8y-li", inputs: ["active", "highlighted", "emptyActions", "dense", "collapsed", "selectable"], outputs: ["collapsedChange"] }, { kind: "component", type: i3.ListItemBodyComponent, selector: "c8y-list-item-body, c8y-li-body", inputs: ["body"] }, { kind: "component", type: i3.ListItemTimelineComponent, selector: "c8y-list-item-timeline, c8y-li-timeline" }, { kind: "directive", type: i8.PopoverDirective, selector: "[popover]", inputs: ["adaptivePosition", "boundariesElement", "popover", "popoverContext", "popoverTitle", "placement", "outsideClick", "triggers", "container", "containerClass", "isOpen", "delay"], outputs: ["onShown", "onHidden"], exportAs: ["bs-popover"] }, { kind: "directive", type: i9.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "pipe", type: i7.AsyncPipe, name: "async" }, { kind: "pipe", type: i7.LowerCasePipe, name: "lowercase" }, { kind: "pipe", type: i7.JsonPipe, name: "json" }, { kind: "pipe", type: i7.DatePipe, name: "date" }, { kind: "pipe", type: i3.HumanizeAppNamePipe, name: "humanizeAppName" }, { kind: "pipe", type: i3.DatePipe, name: "c8yDate" }, { kind: "pipe", type: i3.AssetLinkPipe, name: "assetLink" }, { kind: "pipe", type: i5.TranslatePipe, name: "translate" }, { kind: "pipe", type: i10.AlarmDetailsButtonPipe, name: "alarmDetailsButton" }, { kind: "pipe", type: i11.AlarmSeverityToIconPipe, name: "AlarmSeverityToIcon" }, { kind: "pipe", type: i12.AlarmStatusToIconPipe, name: "AlarmStatusToIcon" }, { kind: "pipe", type: i13.AuditChangesMessagePipe, name: "auditChangesMessage" }] }); }
326
326
  }
327
327
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AlarmDetailsComponent, decorators: [{
328
328
  type: Component,
329
- args: [{ selector: 'c8y-alarm-details', template: "<div class=\"d-flex row tight-grid flex-wrap a-i-stretch\">\n <div class=\"col-xs-12 col-md-6 d-flex p-b-8\">\n <div class=\"border-all fit-w d-flex\">\n <div class=\"p-8\">\n <i\n class=\"icon-24 text-gray-dark m-t-4 c8y-icon\"\n [c8yIcon]=\"selectedAlarm.status | AlarmStatusToIcon\"\n ></i>\n </div>\n <div class=\"p-t-8 p-b-8 p-r-8\">\n <p class=\"text-label-small m-b-0 m-r-8\">{{ 'Status' | translate }}</p>\n <p class=\"small\">{{ statusMessage }}</p>\n </div>\n </div>\n </div>\n <div class=\"col-xs-12 col-md-6 d-flex p-b-8\">\n <div class=\"border-all fit-w d-flex\">\n <div class=\"p-8\">\n <i\n class=\"icon-24 text-gray-dark m-t-4 stroked-icon status\"\n [c8yIcon]=\"selectedAlarm.severity | AlarmSeverityToIcon\"\n [ngClass]=\"selectedAlarm.severity?.toString() | lowercase\"\n ></i>\n </div>\n <div class=\"p-t-8 p-b-8 p-r-8\">\n <p class=\"text-label-small m-b-0 m-r-8\">{{ 'Severity' | translate }}</p>\n <p class=\"small\">{{ SEVERITY_LABELS[selectedAlarm.severity] | translate }}</p>\n </div>\n </div>\n </div>\n <div class=\"col-xs-12 col-md-6 d-flex p-b-8\">\n <div class=\"border-all fit-w d-flex\">\n <div class=\"p-8\">\n <i\n class=\"icon-24 text-gray-dark m-t-4 stroked-icon status\"\n c8yIcon=\"contactless-payment\"\n ></i>\n </div>\n <div class=\"p-t-8 p-b-8 p-r-8\">\n <p class=\"text-label-small m-b-0 m-r-8\">{{ 'Source' | translate }}</p>\n <p class=\"small\">\n <button\n class=\"btn-link text-muted p-0 m-r-8 text-left\"\n title=\"{{ selectedAlarm.source.name }}\"\n type=\"button\"\n routerLink=\"{{ selectedAlarmMO | assetLink }}\"\n >\n <small class=\"icon-flex\">\n <i c8yIcon=\"exchange\"></i>\n {{ selectedAlarm.source.name || selectedAlarm.source.id }}\n </small>\n </button>\n <ng-container *ngIf=\"showSourceNavigationLink$ | async\">\n <button\n class=\"btn-link p-0 text-left\"\n title=\"{{\n linkTitle\n | translate\n : { appName: userDeviceManagementApp$ | async | humanizeAppName | async }\n }}\"\n type=\"button\"\n (click)=\"goToAlarmSource(selectedAlarm.id)\"\n data-cy=\"alarm-details-device-management-link\"\n >\n {{ userDeviceManagementApp$ | async | humanizeAppName | async }}\n <i c8yIcon=\"external-link\"></i>\n </button>\n </ng-container>\n </p>\n </div>\n </div>\n </div>\n <div class=\"col-xs-12 col-md-6 d-flex p-b-8\">\n <div class=\"border-all fit-w d-flex\">\n <div class=\"p-8\">\n <span\n class=\"circle-icon-wrapper\"\n [ngStyle]=\"{ 'background-color': typeColor }\"\n >\n <i\n class=\"stroked-icon\"\n c8yIcon=\"bell\"\n ></i>\n </span>\n </div>\n <div class=\"p-t-8 p-b-8 p-r-8 min-width-0\">\n <p class=\"text-label-small m-b-0 m-r-8\">{{ 'Type' | translate }}</p>\n <p\n class=\"small text-truncate\"\n title=\"{{ selectedAlarm.type }}\"\n >\n <code>{{ selectedAlarm.type }}</code>\n </p>\n </div>\n </div>\n </div>\n\n <div class=\"col-xs-12 col-md-12 p-b-16\">\n <div class=\"border-all fit-w d-flex\">\n <div class=\"p-8\">\n <i\n class=\"icon-24 text-gray-dark m-t-4\"\n c8yIcon=\"calendar\"\n data-cy=\"c8y-alarm-details--last-updated-icon\"\n ></i>\n </div>\n <div class=\"p-t-8 p-b-0 p-r-8 flex-grow\">\n <div class=\"content-flex-50\">\n <div\n class=\"col-4 p-b-8\"\n *ngIf=\"selectedAlarm.count > 1\"\n >\n <p class=\"text-label-small m-b-0 m-r-8\">{{ 'Number of occurrences' | translate }}</p>\n <p>\n <span class=\"badge badge-info\">{{ selectedAlarm.count }}</span>\n </p>\n </div>\n <div\n class=\"col-4 p-b-8\"\n *ngIf=\"selectedAlarm.count > 1\"\n >\n <p class=\"text-label-small m-b-0 m-r-8\">{{ 'First occurrence' | translate }}</p>\n <p class=\"small\">\n {{ selectedAlarm.creationTime | c8yDate: 'medium' }}\n\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{\n 'Time in which the alarm was created. The time shown corresponds to the server\\'s time. Device time can be different from server time.'\n | translate\n }}\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n ></button>\n </p>\n </div>\n <div\n class=\"col-4 p-b-8\"\n data-cy=\"c8y-alarm-details--last-updated-wrapper\"\n >\n <p class=\"text-label-small m-b-0 m-r-8\">{{ 'Last occurrence' | translate }}</p>\n <p class=\"small\">\n {{ selectedAlarm.lastUpdated | c8yDate: 'medium' }}\n\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{\n 'Time in which the alarm was last updated. The time shown corresponds to the server\\'s time. Device time can be different from server time.'\n | translate\n }}\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n ></button>\n </p>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div\n class=\"col-xs-12 col-md-12 p-b-16\"\n *ngIf=\"customFragments\"\n >\n <div class=\"border-all fit-w d-flex\">\n <div class=\"p-8\">\n <i\n class=\"icon-24 text-gray-dark m-t-4\"\n c8yIcon=\"outgoing-data\"\n ></i>\n </div>\n <div\n class=\"p-t-8 p-b-0 p-r-8 flex-grow\"\n data-cy=\"alarm-details-custom-data\"\n >\n <p class=\"text-label-small m-b-4 m-r-8\">{{ 'Custom data' | translate }}</p>\n <pre><code>{{ customFragments | json }}</code></pre>\n </div>\n </div>\n </div>\n</div>\n\n<div class=\"d-flex flex-wrap gap-8\">\n <button\n class=\"btn btn-default btn-sm\"\n [title]=\"'Reload audit logs' | translate\"\n type=\"submit\"\n (click)=\"reloadAuditLog(true, true)\"\n >\n <i\n c8yIcon=\"refresh\"\n [ngClass]=\"{ 'icon-spin': isLoading }\"\n ></i>\n {{ 'Reload audit logs' | translate }}\n </button>\n\n <button\n class=\"btn btn-default btn-sm\"\n [title]=\"\n selectedAlarm.status !== ACKNOWLEDGED_STATUS_VALUE\n ? (ACKNOWLEDGE_LABEL | translate)\n : (REACTIVATE_LABEL | translate)\n \"\n type=\"submit\"\n (click)=\"\n onUpdateDetails(\n selectedAlarm.status !== ACKNOWLEDGED_STATUS_VALUE\n ? ACKNOWLEDGED_STATUS_VALUE\n : ACTIVE_STATUS_VALUE\n )\n \"\n [disabled]=\"selectedAlarm.status === CLEARED_STATUS_VALUE || isAlarmStatusChanging\"\n >\n <i\n [c8yIcon]=\"selectedAlarm.status !== ACKNOWLEDGED_STATUS_VALUE ? BELL_SLASH_ICON : BELL_ICON\"\n ></i>\n {{\n selectedAlarm.status !== ACKNOWLEDGED_STATUS_VALUE\n ? (ACKNOWLEDGE_LABEL | translate)\n : (REACTIVATE_LABEL | translate)\n }}\n </button>\n\n <button\n class=\"btn btn-default btn-sm\"\n [title]=\"'Create smart rule' | translate\"\n type=\"submit\"\n *ngIf=\"isCreateSmartRulesButtonAvailable\"\n (click)=\"createSmartRule()\"\n >\n <i c8yIcon=\"c8y-icon c8y-icon-smart-rules\"></i>\n {{ 'Create smart rule' | translate }}\n </button>\n <button\n class=\"btn btn-default btn-sm\"\n [title]=\"'Clear`alarm`' | translate\"\n type=\"submit\"\n (click)=\"onUpdateDetails(CLEARED_STATUS_VALUE)\"\n [disabled]=\"selectedAlarm.status === CLEARED_STATUS_VALUE\"\n >\n <i c8yIcon=\"c8y-alert-idle\"></i>\n {{ 'Clear`alarm`' | translate }}\n </button>\n\n <button\n class=\"btn btn-default btn-sm\"\n [title]=\"button.title | translate\"\n type=\"button\"\n *ngFor=\"let button of selectedAlarm | alarmDetailsButton: selectedAlarmMO | async\"\n [ngClass]=\"button.additionalButtonClasses\"\n (click)=\"detailsButtonAction(button, selectedAlarm)\"\n [disabled]=\"button.disabled\"\n >\n <i\n [c8yIcon]=\"button.icon\"\n [ngClass]=\"button.additionalIconClasses\"\n ></i>\n <span *ngIf=\"button.label\">{{ button.label | translate }}</span>\n </button>\n</div>\n\n<ng-template #noAuditLogAvailable>\n <div class=\"p-16\">\n <c8y-ui-empty-state\n [icon]=\"'archive'\"\n [title]=\"'No audit logs found.' | translate\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n </div>\n</ng-template>\n\n<div class=\"legend form-block\">{{ 'Audit logs' | translate }}</div>\n\n<ng-container *ngIf=\"isLoading || auditLog?.data.length; else noAuditLogAvailable\">\n <c8y-loading *ngIf=\"isLoading\"></c8y-loading>\n\n <c8y-list-group\n data-cy=\"c8y-alarms-details--audit-logs\"\n *ngIf=\"!isLoading\"\n >\n <c8y-li-timeline *c8yFor=\"let log of auditLog; loadMore: 'hidden'\">\n {{ log.creationTime | date: 'mediumDate' }}\n {{ log.creationTime | date: 'mediumTime' }}\n <c8y-li>\n <c8y-li-body>\n <p class=\"text-truncate-wrap separator-bottom p-b-4\">\n {{ log | auditChangesMessage }}\n </p>\n <div class=\"c8y-list__item__footer\">\n <span\n class=\"m-r-16 small\"\n *ngIf=\"log.user\"\n >\n <span class=\"text-label-small\">\n {{ 'by`user`' | translate }}\n </span>\n {{ log.user }}\n </span>\n <span class=\"small\">\n <span class=\"text-label-small\">\n {{ 'device time' | translate }}\n </span>\n {{ log.time | c8yDate: 'medium' }}\n </span>\n </div>\n </c8y-li-body>\n </c8y-li>\n </c8y-li-timeline>\n </c8y-list-group>\n</ng-container>\n" }]
329
+ args: [{ selector: 'c8y-alarm-details', template: "<div class=\"d-flex row tight-grid flex-wrap a-i-stretch\">\n <div class=\"col-xs-12 col-md-6 d-flex p-b-8\">\n <div\n class=\"border-all fit-w d-flex\"\n data-cy=\"c8y-alarm-details--status-section-wrapper\"\n >\n <div\n class=\"p-8\"\n data-cy=\"c8y-alarm-details--status-icon\"\n >\n <i\n class=\"icon-24 text-gray-dark m-t-4 c8y-icon\"\n [c8yIcon]=\"selectedAlarm.status | AlarmStatusToIcon\"\n ></i>\n </div>\n <div class=\"p-t-8 p-b-8 p-r-8\">\n <p class=\"text-label-small m-b-0 m-r-8\">{{ 'Status' | translate }}</p>\n <p class=\"small\">{{ statusMessage }}</p>\n </div>\n </div>\n </div>\n <div class=\"col-xs-12 col-md-6 d-flex p-b-8\">\n <div\n class=\"border-all fit-w d-flex\"\n data-cy=\"c8y-alarm-details--severity-section-wrapper\"\n >\n <div class=\"p-8\">\n <i\n class=\"icon-24 text-gray-dark m-t-4 stroked-icon status\"\n [c8yIcon]=\"selectedAlarm.severity | AlarmSeverityToIcon\"\n [ngClass]=\"selectedAlarm.severity?.toString() | lowercase\"\n ></i>\n </div>\n <div class=\"p-t-8 p-b-8 p-r-8\">\n <p class=\"text-label-small m-b-0 m-r-8\">{{ 'Severity' | translate }}</p>\n <p class=\"small\">{{ SEVERITY_LABELS[selectedAlarm.severity] | translate }}</p>\n </div>\n </div>\n </div>\n <div\n class=\"col-xs-12 col-md-6 d-flex p-b-8\"\n data-cy=\"c8y-alarm-details--source-wrapper\"\n >\n <div class=\"border-all fit-w d-flex\">\n <div class=\"p-8\">\n <i\n class=\"icon-24 text-gray-dark m-t-4 stroked-icon status\"\n c8yIcon=\"contactless-payment\"\n ></i>\n </div>\n <div class=\"p-t-8 p-b-8 p-r-8\">\n <p class=\"text-label-small m-b-0 m-r-8\">{{ 'Source' | translate }}</p>\n <p class=\"small\">\n <button\n class=\"btn-link text-muted p-0 m-r-8 text-left\"\n title=\"{{ selectedAlarm.source.name }}\"\n type=\"button\"\n routerLink=\"{{ selectedAlarmMO | assetLink }}\"\n >\n <small class=\"icon-flex\">\n <i c8yIcon=\"exchange\"></i>\n {{ selectedAlarm.source.name || selectedAlarm.source.id }}\n </small>\n </button>\n <ng-container *ngIf=\"showSourceNavigationLink$ | async\">\n <button\n class=\"btn-link p-0 text-left\"\n title=\"{{\n linkTitle\n | translate\n : { appName: userDeviceManagementApp$ | async | humanizeAppName | async }\n }}\"\n type=\"button\"\n (click)=\"goToAlarmSource(selectedAlarm.id)\"\n data-cy=\"alarm-details-device-management-link\"\n >\n {{ userDeviceManagementApp$ | async | humanizeAppName | async }}\n <i c8yIcon=\"external-link\"></i>\n </button>\n </ng-container>\n </p>\n </div>\n </div>\n </div>\n <div\n class=\"col-xs-12 col-md-6 d-flex p-b-8\"\n data-cy=\"c8y-alarm-details--severity-type-wrapper\"\n >\n <div class=\"border-all fit-w d-flex\">\n <div class=\"p-8\">\n <span\n class=\"circle-icon-wrapper\"\n [ngStyle]=\"{ 'background-color': typeColor }\"\n >\n <i\n class=\"stroked-icon\"\n c8yIcon=\"bell\"\n ></i>\n </span>\n </div>\n <div class=\"p-t-8 p-b-8 p-r-8 min-width-0\">\n <p class=\"text-label-small m-b-0 m-r-8\">{{ 'Type' | translate }}</p>\n <p\n class=\"small text-truncate\"\n title=\"{{ selectedAlarm.type }}\"\n >\n <code>{{ selectedAlarm.type }}</code>\n </p>\n </div>\n </div>\n </div>\n\n <div class=\"col-xs-12 col-md-12 p-b-16\">\n <div class=\"border-all fit-w d-flex\">\n <div class=\"p-8\">\n <i\n class=\"icon-24 text-gray-dark m-t-4\"\n data-cy=\"c8y-alarm-details--last-updated-icon\"\n c8yIcon=\"calendar\"\n data-cy=\"c8y-alarm-details--last-updated-icon\"\n ></i>\n </div>\n <div class=\"p-t-8 p-b-0 p-r-8 flex-grow\">\n <div class=\"content-flex-50\">\n <div\n class=\"col-4 p-b-8\"\n *ngIf=\"selectedAlarm.count > 1\"\n data-cy=\"c8y-alarm-details--number-of-occurrences-wrapper\"\n >\n <p class=\"text-label-small m-b-0 m-r-8\">{{ 'Number of occurrences' | translate }}</p>\n <p>\n <span data-cy=\"c8y-alarm-details--badge\" class=\"badge badge-info\">{{ selectedAlarm.count }}</span>\n </p>\n </div>\n <div\n class=\"col-4 p-b-8\"\n *ngIf=\"selectedAlarm.count > 1\"\n data-cy=\"c8y-alarm-details--first-occurrence-wrapper\"\n >\n <p class=\"text-label-small m-b-0 m-r-8\">{{ 'First occurrence' | translate }}</p>\n <p class=\"small\">\n {{ selectedAlarm.creationTime | c8yDate: 'medium' }}\n\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{\n 'Time in which the alarm was created. The time shown corresponds to the server\\'s time. Device time can be different from server time.'\n | translate\n }}\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n ></button>\n </p>\n </div>\n <div\n class=\"col-4 p-b-8\"\n data-cy=\"c8y-alarm-details--last-updated-wrapper\"\n >\n <p class=\"text-label-small m-b-0 m-r-8\">{{ 'Last occurrence' | translate }}</p>\n <p class=\"small\">\n {{ selectedAlarm.lastUpdated | c8yDate: 'medium' }}\n\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{\n 'Time in which the alarm was last updated. The time shown corresponds to the server\\'s time. Device time can be different from server time.'\n | translate\n }}\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n ></button>\n </p>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div\n class=\"col-xs-12 col-md-12 p-b-16\"\n data-cy=\"c8y-alarm-details--custom-fragments-wrapper\"\n *ngIf=\"customFragments\"\n >\n <div class=\"border-all fit-w d-flex\">\n <div class=\"p-8\">\n <i\n class=\"icon-24 text-gray-dark m-t-4\"\n c8yIcon=\"outgoing-data\"\n ></i>\n </div>\n <div\n class=\"p-t-8 p-b-0 p-r-8 flex-grow\"\n data-cy=\"alarm-details-custom-data\"\n >\n <p class=\"text-label-small m-b-4 m-r-8\">{{ 'Custom data' | translate }}</p>\n <pre><code>{{ customFragments | json }}</code></pre>\n </div>\n </div>\n </div>\n</div>\n\n<div class=\"d-flex flex-wrap gap-8\">\n <button\n class=\"btn btn-default btn-sm\"\n [title]=\"'Reload audit logs' | translate\"\n type=\"submit\"\n (click)=\"reloadAuditLog(true, true)\"\n data-cy=\"c8y-alarms-details--reload-audit-logs\"\n >\n <i\n c8yIcon=\"refresh\"\n [ngClass]=\"{ 'icon-spin': isLoading }\"\n ></i>\n {{ 'Reload audit logs' | translate }}\n </button>\n\n <button\n class=\"btn btn-default btn-sm\"\n [title]=\"\n selectedAlarm.status !== ACKNOWLEDGED_STATUS_VALUE\n ? (ACKNOWLEDGE_LABEL | translate)\n : (REACTIVATE_LABEL | translate)\n \"\n type=\"submit\"\n (click)=\"\n onUpdateDetails(\n selectedAlarm.status !== ACKNOWLEDGED_STATUS_VALUE\n ? ACKNOWLEDGED_STATUS_VALUE\n : ACTIVE_STATUS_VALUE\n )\n \"\n [disabled]=\"selectedAlarm.status === CLEARED_STATUS_VALUE || isAlarmStatusChanging\"\n >\n <i\n [c8yIcon]=\"selectedAlarm.status !== ACKNOWLEDGED_STATUS_VALUE ? BELL_SLASH_ICON : BELL_ICON\"\n ></i>\n {{\n selectedAlarm.status !== ACKNOWLEDGED_STATUS_VALUE\n ? (ACKNOWLEDGE_LABEL | translate)\n : (REACTIVATE_LABEL | translate)\n }}\n </button>\n\n <button\n class=\"btn btn-default btn-sm\"\n [title]=\"'Create smart rule' | translate\"\n type=\"submit\"\n *ngIf=\"isCreateSmartRulesButtonAvailable\"\n (click)=\"createSmartRule()\"\n data-cy=\"c8y-alarms-details--create-smart-rule\"\n >\n <i c8yIcon=\"c8y-icon c8y-icon-smart-rules\"></i>\n {{ 'Create smart rule' | translate }}\n </button>\n <button\n class=\"btn btn-default btn-sm\"\n [title]=\"'Clear`alarm`' | translate\"\n type=\"submit\"\n data-cy=\"c8y-alarm-details--clear-alarm\"\n (click)=\"onUpdateDetails(CLEARED_STATUS_VALUE)\"\n [disabled]=\"selectedAlarm.status === CLEARED_STATUS_VALUE\"\n >\n <i c8yIcon=\"c8y-alert-idle\"></i>\n {{ 'Clear`alarm`' | translate }}\n </button>\n\n <button\n class=\"btn btn-default btn-sm\"\n [title]=\"button.title | translate\"\n type=\"button\"\n *ngFor=\"let button of selectedAlarm | alarmDetailsButton: selectedAlarmMO | async\"\n [ngClass]=\"button.additionalButtonClasses\"\n (click)=\"detailsButtonAction(button, selectedAlarm)\"\n [disabled]=\"button.disabled\"\n >\n <i\n [c8yIcon]=\"button.icon\"\n [ngClass]=\"button.additionalIconClasses\"\n ></i>\n <span *ngIf=\"button.label\">{{ button.label | translate }}</span>\n </button>\n</div>\n\n<ng-template #noAuditLogAvailable>\n <div class=\"p-16\">\n <c8y-ui-empty-state\n [icon]=\"'archive'\"\n [title]=\"'No audit logs found.' | translate\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n </div>\n</ng-template>\n\n<div class=\"legend form-block\">{{ 'Audit logs' | translate }}</div>\n\n<ng-container *ngIf=\"isLoading || auditLog?.data.length; else noAuditLogAvailable\">\n <c8y-loading *ngIf=\"isLoading\"></c8y-loading>\n\n <c8y-list-group\n data-cy=\"c8y-alarms-details--audit-logs\"\n *ngIf=\"!isLoading\"\n >\n <c8y-li-timeline *c8yFor=\"let log of auditLog; loadMore: 'hidden'\">\n {{ log.creationTime | date: 'mediumDate' }}\n {{ log.creationTime | date: 'mediumTime' }}\n <c8y-li>\n <c8y-li-body>\n <p class=\"text-truncate-wrap separator-bottom p-b-4\">\n {{ log | auditChangesMessage }}\n </p>\n <div class=\"c8y-list__item__footer\">\n <span\n class=\"m-r-16 small\"\n *ngIf=\"log.user\"\n >\n <span class=\"text-label-small\">\n {{ 'by`user`' | translate }}\n </span>\n {{ log.user }}\n </span>\n <span class=\"small\">\n <span class=\"text-label-small\">\n {{ 'device time' | translate }}\n </span>\n {{ log.time | c8yDate: 'medium' }}\n </span>\n </div>\n </c8y-li-body>\n </c8y-li>\n </c8y-li-timeline>\n </c8y-list-group>\n</ng-container>\n" }]
330
330
  }], ctorParameters: () => [{ type: i1.AlarmDetailsService }, { type: i2.AlarmService }, { type: i3.AlertService }, { type: i3.AppStateService }, { type: i2.AuditService }, { type: i3.RelativeTimePipe }, { type: i4.Ng1SmartRulesUpgradeService, decorators: [{
331
331
  type: Optional
332
332
  }] }, { type: i5.TranslateService }, { type: i2.InventoryService }, { type: i6.AlarmsViewService }, { type: i3.ColorService }, { type: i3.InterAppService }], propDecorators: { selectedAlarm: [{
333
333
  type: Input
334
334
  }] } });
335
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxhcm0tZGV0YWlscy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9hbGFybXMvYWxhcm0tZGV0YWlscy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi9hbGFybXMvYWxhcm0tZGV0YWlscy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBYSxRQUFRLEVBQWlCLE1BQU0sZUFBZSxDQUFDO0FBQ3JGLE9BQU8sRUFDTCxtQkFBbUIsRUFDbkIsV0FBVyxFQUNYLFlBQVksRUFFWixZQUFZLEVBTVosZ0JBQWdCLEVBQ2hCLGVBQWUsRUFDaEIsTUFBTSxhQUFhLENBQUM7QUFDckIsT0FBTyxFQUNMLFlBQVksRUFDWixlQUFlLEVBQ2YsWUFBWSxFQUNaLGdCQUFnQixFQUNoQixPQUFPLEVBRVAsZUFBZSxFQUNmLGFBQWEsRUFDZCxNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDdEMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDOUQsT0FBTyxFQUNMLHdCQUF3QixFQUN4QixpQkFBaUIsRUFHbEIsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNoRixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsY0FBYyxFQUFjLE1BQU0sTUFBTSxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7QUFNbEQsTUFBTSxPQUFPLHFCQUFxQjtJQW1FaEMsWUFDVSxtQkFBd0MsRUFDeEMsWUFBMEIsRUFDMUIsWUFBMEIsRUFDMUIsUUFBeUIsRUFDekIsWUFBMEIsRUFDMUIsWUFBOEIsRUFDbEIs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dEUsTUFBTTtRQUNWLENBQUM7SUFDSCxDQUFDO0lBRU8saUNBQWlDO1FBQ3ZDLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDckQsQ0FBQztJQUVPLGtCQUFrQixDQUFDLGFBQXFCO1FBQzlDLElBQUksZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO1FBQzVCLEtBQUssTUFBTSxHQUFHLElBQUksYUFBYSxFQUFFLENBQUM7WUFDaEMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNuRCxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztvQkFDdEIsZ0JBQWdCLEdBQUcsRUFBRSxDQUFDO2dCQUN4QixDQUFDO2dCQUNELGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxHQUFHLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM3QyxDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sZ0JBQWdCLENBQUM7SUFDMUIsQ0FBQzsrR0EvWVUscUJBQXFCO21HQUFyQixxQkFBcUIsMEhDMUNsQyxxNlVBNFRBOzs0RkRsUmEscUJBQXFCO2tCQUpqQyxTQUFTOytCQUNFLG1CQUFtQjs7MEJBNkUxQixRQUFRO2dNQXpFRixhQUFhO3NCQUFyQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT25DaGFuZ2VzLCBPcHRpb25hbCwgU2ltcGxlQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgQUxBUk1fU1RBVFVTX0xBQkVMUyxcbiAgQWxhcm1TdGF0dXMsXG4gIEFsYXJtU2VydmljZSxcbiAgQWxhcm1TdGF0dXNUeXBlLFxuICBBdWRpdFNlcnZpY2UsXG4gIElBbGFybSxcbiAgSUFwcGxpY2F0aW9uLFxuICBJQXVkaXRSZWNvcmQsXG4gIElNYW5hZ2VkT2JqZWN0LFxuICBJUmVzdWx0TGlzdCxcbiAgSW52ZW50b3J5U2VydmljZSxcbiAgU0VWRVJJVFlfTEFCRUxTXG59IGZyb20gJ0BjOHkvY2xpZW50JztcbmltcG9ydCB7XG4gIEFsZXJ0U2VydmljZSxcbiAgQXBwU3RhdGVTZXJ2aWNlLFxuICBDb2xvclNlcnZpY2UsXG4gIFJlbGF0aXZlVGltZVBpcGUsXG4gIGdldHRleHQsXG4gIFN1cHBvcnRlZEFwcEtleSxcbiAgSW50ZXJBcHBTZXJ2aWNlLFxuICBTdXBwb3J0ZWRBcHBzXG59IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMnO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgY2xvbmVEZWVwIH0gZnJvbSAnbG9kYXNoLWVzJztcbmltcG9ydCB7IEFsYXJtRGV0YWlsc1NlcnZpY2UgfSBmcm9tICcuL2FsYXJtLWRldGFpbHMuc2VydmljZSc7XG5pbXBvcnQge1xuICBBTEFSTV9ERUZBVUxUX1BST1BFUlRJRVMsXG4gIEFMQVJNX1NUQVRVU19JQ09OLFxuICBBbGFybURldGFpbHNCdXR0b24sXG4gIEN1c3RvbUZyYWdtZW50XG59IGZyb20gJy4vYWxhcm1zLm1vZGVsJztcbmltcG9ydCB7IE5nMVNtYXJ0UnVsZXNVcGdyYWRlU2VydmljZSB9IGZyb20gJy4vbmcxLXNtYXJ0LXJ1bGVzLXVwZ3JhZGUuc2VydmljZSc7XG5pbXBvcnQgeyBBbGFybXNWaWV3U2VydmljZSB9IGZyb20gJy4vYWxhcm1zLXZpZXcuc2VydmljZSc7XG5pbXBvcnQgeyBmaXJzdFZhbHVlRnJvbSwgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjOHktYWxhcm0tZGV0YWlscycsXG4gIHRlbXBsYXRlVXJsOiAnLi9hbGFybS1kZXRhaWxzLmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBBbGFybURldGFpbHNDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xuICBASW5wdXQoKSBzZWxlY3RlZEFsYXJtOiBJQWxhcm07XG5cbiAgcmVhZG9ubHkgQUNLTk9XTEVER0VEX1NUQVRVU19WQUxVRSA9IEFsYXJtU3RhdHVzLkFDS05PV0xFREdFRDtcbiAgcmVhZG9ubHkgQUNUSVZFX1NUQVRVU19WQUxVRSA9IEFsYXJtU3RhdHVzLkFDVElWRTtcbiAgcmVhZG9ubHkgQ0xFQVJFRF9TVEFUVVNfVkFMVUUgPSBBbGFybVN0YXR1cy5DTEVBUkVEO1xuICByZWFkb25seSBBQ0tOT1dMRURHRV9MQUJFTCA9IGdldHRleHQoJ0Fja25vd2xlZGdlJyk7XG4gIHJlYWRvbmx5IFJFQUNUSVZBVEVfTEFCRUwgPSBnZXR0ZXh0KCdSZWFjdGl2YXRlJyk7XG4gIHJlYWRvbmx5IFNFVkVSSVRZX0xBQkVMUyA9IFNFVkVSSVRZX0xBQkVMUztcbiAgcmVhZG9ubHkgQkVMTF9TTEFTSF9JQ09OID0gQUxBUk1fU1RBVFVTX0lDT04uQkVMTF9TTEFTSDtcbiAgcmVhZG9ubHkgQkVMTF9JQ09OID0gQUxBUk1fU1RBVFVTX0lDT04uQkVMTDtcblxuICAvKipcbiAgICogUmVwcmVzZW50cyBhIERldmljZSBNYW5hZ2VtZW50IGFwcGxpY2F0aW9uIHVzZWQgYnkgdGhlIHVzZXIuXG4gICAqIERldGVybWluZXMgdGhlIGFjY3VyYXRlIG5hbWUgYW5kIGNvbnRleHQgcGF0aCByZXF1aXJlZCBmb3IgbmF2aWdhdGluZyB0byBhbGFybXMgb2YgdGhlIGN1cnJlbnQgZGV2aWNlXG4gICAqL1xuICB1c2VyRGV2aWNlTWFuYWdlbWVudEFwcCQ6IE9ic2VydmFibGU8SUFwcGxpY2F0aW9uPjtcbiAgLyoqXG4gICAqIE1hbmFnZXMgdGhlIHZpc2liaWxpdHkgb2YgdGhlIG5hdmlnYXRpb24gbGluay5cbiAgICogSWYgc2V0IHRvIHRydWUsIHRoZSBsaW5rIGlzIHZpc2libGUsIG90aGVyd2lzZSwgaXQgcmVtYWlucyBoaWRkZW4uXG4gICAqL1xuICBzaG93U291cmNlTmF2aWdhdGlvbkxpbmskOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuICBkZXZpY2VNYW5hZ2VtZW50QXBwS2V5OiBTdXBwb3J0ZWRBcHBLZXkgPSBTdXBwb3J0ZWRBcHBzLmRldmljZW1hbmFnZW1lbnQ7XG4gIHJlYWRvbmx5IGxpbmtUaXRsZSA9IGdldHRleHQoJ09wZW4gaW4ge3sgYXBwTmFtZSB9fScpO1xuICAvKipcbiAgICogQ29udGFpbnMgYXVkaXQgbG9ncywgaW5jbHVkaW5nIHRoZSB2ZXJ5IGZpcnN0IGF1ZGl0IGxvZyByZWNvcmQgaW4gdGhlIGFsYXJtcycgaGlzdG9yeS5cbiAgICogVGhpcyBlbnN1cmVzIHRoYXQgdGhlIGhpc3RvcmljYWwgc3RhcnRpbmcgcG9pbnQgb2YgdGhlIGF1ZGl0IGxvZ3MgaXMgYWx3YXlzIGluY2x1ZGVkIGluIHRoZSBkYXRhIHNldC5cbiAgICogVXN1YWxseSBpdCdzIGFuICdBbGFybSBjcmVhdGVkJyBhdWRpdCBsb2cuXG4gICAqXG4gICAqIE9ubHkgdXNlZCB3aGVuIGF1ZGl0IGxvZ3MgZXhjZWVkIFBBR0VfU0laRS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgZXh0ZW5kZWRBdWRpdExvZ3M6IElSZXN1bHRMaXN0PElBdWRpdFJlY29yZD47XG4gIHByaXZhdGUgcmVhZG9ubHkgUEFHRV9TSVpFID0gMTAwO1xuXG4gIC8qKlxuICAgKiBQcmV2ZW50cyB0aGUgcGlwZWxpbmUgZnJvbSBmYWlsaW5nIGZvciBhIHR1dG9yaWFsIGFwcGxpY2F0aW9uXG4gICAqIGJlY2F1c2UgaXQncyBhIHB1cmUgQW5ndWxhciBhcHBsaWNhdGlvbiBhbmQgZG9lc24ndCBzdXBwb3J0IGFueVxuICAgKiBBbmd1bGFySlMgc2VydmljZXMuXG4gICAqL1xuICBpc0NyZWF0ZVNtYXJ0UnVsZXNCdXR0b25BdmFpbGFibGU6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBQcm9wZXJ0eSBjb250YWlucyBhIDEwMCAoc2VlIFBBR0VfU0laRSkgb2YgbW9zdCByZWNlbnQgYXVkaXQgbG9ncyByZWNvcmRzLlxuICAgKi9cbiAgYXVkaXRMb2c6IElSZXN1bHRMaXN0PElBdWRpdFJlY29yZD47XG5cbiAgaXNMb2FkaW5nOiBib29sZWFuO1xuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZW4gYWxhcm1zIHN0YXR1cyBjaGFuZ2Ugd2FzIHN0YXJ0ZWQgKEFja25vd2xlZGdlL1JlYWN0aXZhdGUpXG4gICAqL1xuICBpc0FsYXJtU3RhdHVzQ2hhbmdpbmcgPSBmYWxzZTtcbiAgLyoqXG4gICAqIFJlcHJlc2VudHMgYSB2YWx1ZSBmb3IgYSAnU3RhdHVzJyBzZWN0aW9uIGluIGRldGFpbHMuXG4gICAqL1xuICBzdGF0dXNNZXNzYWdlOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgY29sb3Igb2YgdGhlIGFsYXJtIHR5cGUuXG4gICAqL1xuICB0eXBlQ29sb3I6IHN0cmluZztcbiAgLyoqXG4gICAqIEN1c3RvbSBmcmFnbWVudHMgb2YgdGhlIHNlbGVjdGVkIGFsYXJtLiBJZiBub25lIGV4aXN0LCBudWxsIGlzIHJldHVybmVkLlxuICAgKi9cbiAgY3VzdG9tRnJhZ21lbnRzOiBDdXN0b21GcmFnbWVudCA9IG51bGw7XG5cbiAgc2VsZWN0ZWRBbGFybU1POiBJTWFuYWdlZE9iamVjdDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGFsYXJtRGV0YWlsc1NlcnZpY2U6IEFsYXJtRGV0YWlsc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBhbGFybVNlcnZpY2U6IEFsYXJtU2VydmljZSxcbiAgICBwcml2YXRlIGFsZXJ0U2VydmljZTogQWxlcnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgYXBwU3RhdGU6IEFwcFN0YXRlU2VydmljZSxcbiAgICBwcml2YXRlIGF1ZGl0U2VydmljZTogQXVkaXRTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVsYXRpdmVUaW1lOiBSZWxhdGl2ZVRpbWVQaXBlLFxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgbmcxU21hcnRSdWxlc1VwZ3JhZGVTZXJ2aWNlOiBOZzFTbWFydFJ1bGVzVXBncmFkZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSB0cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgaW52ZW50b3J5U2VydmljZTogSW52ZW50b3J5U2VydmljZSxcbiAgICBwcml2YXRlIGFsYXJtc1ZpZXdTZXJ2aWNlOiBBbGFybXNWaWV3U2VydmljZSxcbiAgICBwcml2YXRlIGNvbG9yU2VydmljZTogQ29sb3JTZXJ2aWNlLFxuICAgIHByaXZhdGUgaW50ZXJBcHBTZXJ2aWNlOiBJbnRlckFwcFNlcnZpY2VcbiAgKSB7fVxuXG4gIGFzeW5jIG5nT25Jbml0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGlzU21hcnRSdWxlc1NlcnZpY2VTdWJzY3JpYmVkID0gISEoYXdhaXQgZmlyc3RWYWx1ZUZyb20oXG4gICAgICB0aGlzLmludGVyQXBwU2VydmljZS5nZXRBcHAkKFN1cHBvcnRlZEFwcHMuc21hcnRydWxlcylcbiAgICApKTtcbiAgICBjb25zdCBoYXNBbnlSb2xlQWxsb3dpbmdUb0NyZWF0ZVNtYXJ0UnVsZSA9XG4gICAgICB0aGlzLmFsYXJtRGV0YWlsc1NlcnZpY2UuY2hlY2tJZkhhc0FueVJvbGVBbGxvd2luZ1RvQ3JlYXRlU21hcnRSdWxlKCk7XG4gICAgdGhpcy5pc0NyZWF0ZVNtYXJ0UnVsZXNCdXR0b25BdmFpbGFibGUgPVxuICAgICAgISF0aGlzLm5nMVNtYXJ0UnVsZXNVcGdyYWRlU2VydmljZSAmJlxuICAgICAgaXNTbWFydFJ1bGVzU2VydmljZVN1YnNjcmliZWQgJiZcbiAgICAgIGhhc0FueVJvbGVBbGxvd2luZ1RvQ3JlYXRlU21hcnRSdWxlO1xuICAgIHRoaXMudXNlckRldmljZU1hbmFnZW1lbnRBcHAkID0gdGhpcy5pbnRlckFwcFNlcnZpY2UuZ2V0QXBwJCh0aGlzLmRldmljZU1hbmFnZW1lbnRBcHBLZXkpO1xuICAgIHRoaXMuc2hvd1NvdXJjZU5hdmlnYXRpb25MaW5rJCA9IHRoaXMuaW50ZXJBcHBTZXJ2aWNlLnNob3VsZFNob3dBcHBMaW5rJChcbiAgICAgIHRoaXMuZGV2aWNlTWFuYWdlbWVudEFwcEtleVxuICAgICk7XG4gICAgdGhpcy50eXBlQ29sb3IgPSBhd2FpdCB0aGlzLmNvbG9yU2VydmljZS5nZW5lcmF0ZUNvbG9yKHRoaXMuc2VsZWN0ZWRBbGFybS50eXBlKTtcbiAgfVxuXG4gIGFzeW5jIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoY2hhbmdlcy5zZWxlY3RlZEFsYXJtICYmIGNoYW5nZXMuc2VsZWN0ZWRBbGFybS5jdXJyZW50VmFsdWUpIHtcbiAgICAgIGF3YWl0IHRoaXMucmVsb2FkQXVkaXRMb2codHJ1ZSwgdHJ1ZSk7XG4gICAgICBhd2FpdCB0aGlzLnVwZGF0ZVN0YXR1c01lc3NhZ2UoKTtcbiAgICAgIGNvbnN0IHsgZGF0YSB9ID0gYXdhaXQgdGhpcy5pbnZlbnRvcnlTZXJ2aWNlLmRldGFpbCh0aGlzLnNlbGVjdGVkQWxhcm0uc291cmNlLmlkKTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRBbGFybU1PID0gZGF0YTtcbiAgICAgIHRoaXMuY3VzdG9tRnJhZ21lbnRzID0gdGhpcy5nZXRDdXN0b21GcmFnbWVudHModGhpcy5zZWxlY3RlZEFsYXJtKTtcbiAgICB9XG4gIH1cblxuICBjcmVhdGVTbWFydFJ1bGUoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzQ3JlYXRlU21hcnRSdWxlc0J1dHRvbkF2YWlsYWJsZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLm5nMVNtYXJ0UnVsZXNVcGdyYWRlU2VydmljZS5hZGROZXdGb3JJbnB1dEFsYXJtQW5kT3V0cHV0VXNlcldpdGhVSShcbiAgICAgIHRoaXMuc2VsZWN0ZWRBbGFybSxcbiAgICAgIHRoaXMuYXBwU3RhdGUuY3VycmVudFVzZXIudmFsdWVcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIE5hdmlnYXRlcyB0byBhIHNwZWNpZmljIGFsYXJtIHNvdXJjZSBkZXZpY2UgYmFzZWQgb24gdGhlIHByb3ZpZGVkIHNvdXJjZS5cbiAgICpcbiAgICogQHBhcmFtIHNvdXJjZUlkIC0gVGhlIHNvdXJjZSBpZC5cbiAgICovXG4gIGFzeW5jIGdvVG9BbGFybVNvdXJjZShzb3VyY2VJZDogc3RyaW5nIHwgbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBkYXRhIH0gPSBhd2FpdCB0aGlzLmFsYXJtU2VydmljZS5kZXRhaWwoc291cmNlSWQpO1xuICAgIGF3YWl0IHRoaXMuaW50ZXJBcHBTZXJ2aWNlLm5hdmlnYXRlVG9BcHAoXG4gICAgICB0aGlzLmRldmljZU1hbmFnZW1lbnRBcHBLZXksXG4gICAgICBgIy9kZXZpY2UvJHtkYXRhLnNvdXJjZS5pZH0vYWxhcm1zYFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmVsb2FkcyBhdWRpdCBsb2cgZGF0YSBhc3luY2hyb25vdXNseS5cbiAgICpcbiAgICogVGhpcyBtZXRob2QgZmV0Y2hlcyBhdWRpdCByZWNvcmRzIHVzaW5nIGBnZXRBbGFybUF1ZGl0UmVjb3Jkc2AgYW5kIG9wdGlvbmFsbHkgdXBkYXRlcyB0aGUgYXVkaXQgbG9nc1xuICAgKiBzdGF0ZSBpbiB0aGUgY29tcG9uZW50IGJhc2VkIG9uIHRoZSBgaXNTZXRBdWRpdExvZ3NgIGZsYWcuIEl0IGhhbmRsZXMgdGhlIGxvYWRpbmcgc3RhdGUgYW5kIHBvdGVudGlhbFxuICAgKiBlcnJvcnMgZHVyaW5nIHRoZSBmZXRjaCBvcGVyYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSBpc1JldmVydCAtIEEgYm9vbGVhbiBmbGFnIGluZGljYXRpbmcgd2hldGhlciB0byByZXRyaWV2ZSBhIDEwMCAoc2VlIFBBR0VfU0laRSkgcmVjb3JkcyAodHJ1ZSlcbiAgICogICAgICAgICAgICAgICAgICAgb3Igb25seSByZWNvcmQsIHRoYXQgY2hyb25vbG9naWNhbGx5IHdpbGwgYmUgdGhlIG9sZGVzdCBvbmUgKGZhbHNlKS4gRGVmYXVsdHMgdG8gdHJ1ZS5cbiAgICogICAgICAgICAgICAgICAgICAgSWYgc2V0IHRvIGZhbHNlLCBpdCB3aWxsIHNldCBQQUdFX1NJWkUgdG8gMSBhbmQgdHJpZ2dlciBhIGxvZ2ljXG4gICAqICAgICAgICAgICAgICAgICAgIGNvbmNhdGVuYXRpbmcgYSBtb3N0IHJlY2VudCByZWNvcmQgd2l0aCB0aGUgdmVyeSBmaXJzdCBvbmUgdG9cbiAgICogICAgICAgICAgICAgICAgICAgY2FsY3VsYXRlIHRoZSBhbGFybSBkdXJhdGlvbiAoY2hhbmdlIHRvIENMRUFSRUQgc3RhdHVzKS5cbiAgICogICAgICAgICAgICAgICAgICAgSXQncyBwYXNzZWQgdG8gdGhlIGBnZXRBbGFybUF1ZGl0UmVjb3Jkc2AgbWV0aG9kLlxuICAgKiBAcGFyYW0gaXNTZXRBdWRpdExvZ3MgLSBBIGJvb2xlYW4gZmxhZyB0byBkZXRlcm1pbmUgaWYgdGhlIGZldGNoZWQgYXVkaXQgbG9ncyBzaG91bGQgYmUgc2V0IGluIHRoZSBjb21wb25lbnQgc3RhdGUuIERlZmF1bHRzIHRvIGBmYWxzZWAuXG4gICAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGEgbGlzdCBvZiBgSUF1ZGl0UmVjb3JkYCBvYmplY3RzLlxuICAgKi9cbiAgYXN5bmMgcmVsb2FkQXVkaXRMb2coXG4gICAgaXNSZXZlcnQgPSB0cnVlLFxuICAgIGlzU2V0QXVkaXRMb2dzID0gZmFsc2VcbiAgKTogUHJvbWlzZTxJUmVzdWx0TGlzdDxJQXVkaXRSZWNvcmQ+PiB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuaXNMb2FkaW5nID0gdHJ1ZTtcbiAgICAgIGNvbnN0IGF1ZGl0TG9ncyA9IGF3YWl0IHRoaXMuZ2V0QWxhcm1BdWRpdFJlY29yZHMoaXNSZXZlcnQpO1xuXG4gICAgICBpZiAoaXNTZXRBdWRpdExvZ3MpIHtcbiAgICAgICAgdGhpcy5zZXRBdWRpdExvZ3MoYXVkaXRMb2dzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGF1ZGl0TG9ncztcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5hbGVydFNlcnZpY2UuYWRkU2VydmVyRmFpbHVyZShlcnJvcik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgb25VcGRhdGVEZXRhaWxzKHN0YXR1czogQWxhcm1TdGF0dXNUeXBlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuaXNBbGFybVN0YXR1c0NoYW5naW5nID0gdHJ1ZTtcbiAgICAgIGF3YWl0IHRoaXMudXBkYXRlQWxhcm1TdGF0dXMoc3RhdHVzKTtcbiAgICAgIGF3YWl0IHRoaXMucmVsb2FkQXVkaXRMb2codHJ1ZSwgdHJ1ZSk7XG4gICAgICBhd2FpdCB0aGlzLnVwZGF0ZVN0YXR1c01lc3NhZ2UoKTtcbiAgICAgIHRoaXMudXBkYXRlTGFzdFVwZGF0ZWREYXRlKHRoaXMuYXVkaXRMb2cuZGF0YVswXSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLmFkZFNlcnZlckZhaWx1cmUoZXJyb3IpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmlzQWxhcm1TdGF0dXNDaGFuZ2luZyA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGRldGFpbHNCdXR0b25BY3Rpb24oYnV0dG9uOiBBbGFybURldGFpbHNCdXR0b24sIGFsYXJtOiBJQWxhcm0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCByZXN1bHQgPSBidXR0b24uYWN0aW9uKGFsYXJtKTtcbiAgICBsZXQgc2hvdWxkUmVsb2FkOiBib29sZWFuIHwgSUFsYXJtID0gZmFsc2U7XG4gICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgIHNob3VsZFJlbG9hZCA9IGF3YWl0IHJlc3VsdDtcbiAgICB9IGVsc2Uge1xuICAgICAgc2hvdWxkUmVsb2FkID0gcmVzdWx0O1xuICAgIH1cblxuICAgIGlmIChzaG91bGRSZWxvYWQpIHtcbiAgICAgIGxldCBhbGFybTogSUFsYXJtO1xuICAgICAgaWYgKHNob3VsZFJlbG9hZCA9PT0gdHJ1ZSkge1xuICAgICAgICBjb25zdCB7IGRhdGE6IHVwZGF0ZWRBbGFybSB9ID0gYXdhaXQgdGhpcy5hbGFybVNlcnZpY2UuZGV0YWlsKHRoaXMuc2VsZWN0ZWRBbGFybS5pZCk7XG4gICAgICAgIGFsYXJtID0gdXBkYXRlZEFsYXJtO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYWxhcm0gPSBzaG91bGRSZWxvYWQ7XG4gICAgICB9XG4gICAgICB0aGlzLmFsYXJtc1ZpZXdTZXJ2aWNlLnVwZGF0ZUFsYXJtTGlzdCgpO1xuXG4gICAgICBjb25zdCBwcmV2aW91c1ZhbHVlID0gdGhpcy5zZWxlY3RlZEFsYXJtO1xuICAgICAgdGhpcy5zZWxlY3RlZEFsYXJtID0gYWxhcm07XG4gICAgICB0aGlzLm5nT25DaGFuZ2VzKHtcbiAgICAgICAgc2VsZWN0ZWRBbGFybToge1xuICAgICAgICAgIGN1cnJlbnRWYWx1ZTogYWxhcm0sXG4gICAgICAgICAgcHJldmlvdXNWYWx1ZSxcbiAgICAgICAgICBmaXJzdENoYW5nZTogZmFsc2UsXG4gICAgICAgICAgaXNGaXJzdENoYW5nZTogKCkgPT4gZmFsc2VcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB1cGRhdGVBbGFybVN0YXR1cyhzdGF0dXM6IEFsYXJtU3RhdHVzVHlwZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBhcnRpYWxseVVwZGF0ZWRBbGFybTogUGFydGlhbDxJQWxhcm0+ID0geyBpZDogdGhpcy5zZWxlY3RlZEFsYXJtLmlkLCBzdGF0dXMgfTtcbiAgICBhd2FpdCB0aGlzLmFsYXJtU2VydmljZS51cGRhdGUocGFydGlhbGx5VXBkYXRlZEFsYXJtKTtcbiAgICBjb25zdCB0cmFuc2xhdGVkU3RhdHVzTGFiZWwgPSB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChBTEFSTV9TVEFUVVNfTEFCRUxTW3N0YXR1c10pO1xuICAgIHRoaXMuYWxlcnRTZXJ2aWNlLnN1Y2Nlc3MoXG4gICAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChnZXR0ZXh0KCdBbGFybSBzdGF0dXMgY2hhbmdlZCB0byB7eyBzdGF0dXMgfX0nKSwge1xuICAgICAgICBzdGF0dXM6IHRyYW5zbGF0ZWRTdGF0dXNMYWJlbC50b1VwcGVyQ2FzZSgpXG4gICAgICB9KVxuICAgICk7XG4gICAgdGhpcy5zZWxlY3RlZEFsYXJtLnN0YXR1cyA9IHN0YXR1cztcbiAgICB0aGlzLmFsYXJtc1ZpZXdTZXJ2aWNlLnVwZGF0ZUFsYXJtTGlzdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyB0aGUgYXVkaXQgbG9nIGFuZCBhcHBlbmRzIHRoZSBsYXN0IGF1ZGl0IHJlY29yZCB0byBpdC5cbiAgICpcbiAgICogVGhpcyBtZXRob2QgZmV0Y2hlcyB0aGUgZXhpc3RpbmcgYXVkaXQgbG9nIGRhdGEgYW5kIG1ha2VzIGEgZGVlcCBjb3B5IG9mIGl0LiBJdCB0aGVuXG4gICAqIHJldHJpZXZlcyB0aGUgbGFzdCBhdWRpdCByZWNvcmQgYW5kIGFwcGVuZHMgaXQgdG8gdGhlIGNvcGllZCBhdWRpdCBsb2cgZGF0YS4gVGhpcyBpc1xuICAgKiB1c2VmdWwgZm9yIHNjZW5hcmlvcyB3aGVyZSB0aGUgbW9zdCByZWNlbnQgYXVkaXQgcmVjb3JkIG5lZWRzIHRvIGJlIGluY2x1ZGVkIGluIHRoZVxuICAgKiBleGlzdGluZyBhdWRpdCBsb2cgZGF0YSAoY2FsY3VsYXRpbmcgdGhlIENMRUFSRUQgcGVyaW9kKS5cbiAgICpcbiAgICogQHJldHVybnMgQSBwcm9taXNlIG9mIGBJUmVzdWx0TGlzdDxJQXVkaXRSZWNvcmQ+YCwgd2hpY2ggaW5jbHVkZXMgdGhlXG4gICAqICAgICAgICAgIGV4aXN0aW5nIGF1ZGl0IGxvZyBkYXRhIGFsb25nIHdpdGggdGhlIGxhc3QgYXVkaXQgcmVjb3JkIGFwcGVuZGVkLlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBhdWRpdExvZ1dpdGhGaXJzdFJlY29yZCgpOiBQcm9taXNlPElSZXN1bHRMaXN0PElBdWRpdFJlY29yZD4+IHtcbiAgICBjb25zdCBleGlzdGluZ0RhdGEgPSB0aGlzLmF1ZGl0TG9nO1xuICAgIGNvbnN0IGNvcGllZEV4aXN0aW5nRGF0YSA9IGNsb25lRGVlcChleGlzdGluZ0RhdGEpO1xuXG4gICAgY29uc3QgbGFzdEF1ZGl0UmVjb3JkID0gYXdhaXQgdGhpcy5yZWxvYWRBdWRpdExvZyhmYWxzZSk7XG4gICAgY29uc3QgbGFzdFJlY29yZCA9IGxhc3RBdWRpdFJlY29yZC5kYXRhW2xhc3RBdWRpdFJlY29yZC5kYXRhLmxlbmd0aCAtIDFdO1xuICAgIGNvcGllZEV4aXN0aW5nRGF0YS5kYXRhLnB1c2gobGFzdFJlY29yZCk7XG4gICAgcmV0dXJuIGNvcGllZEV4aXN0aW5nRGF0YTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0QXVkaXRMb2dzKGF1ZGl0TG9nczogSVJlc3VsdExpc3Q8SUF1ZGl0UmVjb3JkPik6IHZvaWQge1xuICAgIHRoaXMuYXVkaXRMb2cgPSBhdWRpdExvZ3M7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUxhc3RVcGRhdGVkRGF0ZSh1cGRhdGVkQXVkaXRSZWNvcmRzOiBJQXVkaXRSZWNvcmQpOiB2b2lkIHtcbiAgICBpZiAoIXVwZGF0ZWRBdWRpdFJlY29yZHMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB7IGNyZWF0aW9uVGltZSB9ID0gdXBkYXRlZEF1ZGl0UmVjb3JkcztcbiAgICB0aGlzLnNlbGVjdGVkQWxhcm0ubGFzdFVwZGF0ZWQgPSBjcmVhdGlvblRpbWU7XG4gIH1cblxuICBwcml2YXRlIGdldEFjdGl2ZVN0YXR1c01lc3NhZ2UodGltZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoZ2V0dGV4dCgnQUNUSVZFYGFsYXJtYDogdHJpZ2dlcmVkIHt7YWxhcm1UaW1lRnJvbU5vd319JyksIHtcbiAgICAgIGFsYXJtVGltZUZyb21Ob3c6IHRoaXMucmVsYXRpdmVUaW1lLnRyYW5zZm9ybShuZXcgRGF0ZSh0aW1lKSlcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0QWNrbm93bGVkZ2VkU3RhdHVzTWVzc2FnZShzdGF0dXM6IEFsYXJtU3RhdHVzVHlwZSwgY2hhbmdlTG9nOiBJQXVkaXRSZWNvcmRbXSk6IHN0cmluZyB7XG4gICAgaWYgKGNoYW5nZUxvZy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChnZXR0ZXh0KCdBQ0tOT1dMRURHRURgYWxhcm1gJykpO1xuICAgIH1cblxuICAgIGNvbnN0IGFja25vd2xlZGdlZEJ5ID0gdGhpcy5hbGFybURldGFpbHNTZXJ2aWNlLmdldEFja25vd2xlZGdlZEJ5KHN0YXR1cywgY2hhbmdlTG9nKTtcbiAgICBjb25zdCBhY2tub3dsZWRnZVRpbWUgPSB0aGlzLmFsYXJtRGV0YWlsc1NlcnZpY2UuZ2V0QWNrbm93bGVkZ2VUaW1lKGNoYW5nZUxvZyk7XG5cbiAgICBpZiAoYWNrbm93bGVkZ2VkQnkpIHtcbiAgICAgIHJldHVybiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChcbiAgICAgICAgZ2V0dGV4dCgnQUNLTk9XTEVER0VEYGFsYXJtYCBieToge3thY2tCeX19IHt7YWNrVGltZUZyb21Ob3d9fScpLFxuICAgICAgICB7XG4gICAgICAgICAgYWNrQnk6IGFja25vd2xlZGdlZEJ5LFxuICAgICAgICAgIGFja1RpbWVGcm9tTm93OiB0aGlzLnJlbGF0aXZlVGltZS50cmFuc2Zvcm0obmV3IERhdGUoYWNrbm93bGVkZ2VUaW1lKSlcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoZ2V0dGV4dCgnQUNLTk9XTEVER0VEYGFsYXJtYCB7e2Fja1RpbWVGcm9tTm93fX0nKSwge1xuICAgICAgYWNrVGltZUZyb21Ob3c6IHRoaXMucmVsYXRpdmVUaW1lLnRyYW5zZm9ybShuZXcgRGF0ZShhY2tub3dsZWRnZVRpbWUpKVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRDbGVhcmVkU3RhdHVzTWVzc2FnZShhdWRpdExvZzogSUF1ZGl0UmVjb3JkW10pOiBzdHJpbmcge1xuICAgIGlmIChhdWRpdExvZy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChnZXR0ZXh0KCdDTEVBUkVEYGFsYXJtYCcpKTtcbiAgICB9XG5cbiAgICBjb25zdCBkaWZmZXJlbmNlSW5NcyA9IHRoaXMuY2FsY3VsYXRlQWxhcm1EdXJhdGlvbihhdWRpdExvZyk7XG5cbiAgICByZXR1cm4gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoXG4gICAgICBnZXR0ZXh0KCdDTEVBUkVEYGFsYXJtYDogd2FzIGFjdGl2ZSBmb3Ige3thbGFybUR1cmF0aW9ufX0nKSxcbiAgICAgIHtcbiAgICAgICAgYWxhcm1EdXJhdGlvbjogdGhpcy5yZWxhdGl2ZVRpbWUudHJhbnNmb3JtKGRpZmZlcmVuY2VJbk1zLCB0cnVlKVxuICAgICAgfVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlcyB0aGUgZHVyYXRpb24gb2YgYW4gYWxhcm0gYmFzZWQgb24gYXVkaXQgbG9nIHJlY29yZHMuXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIGNvbXB1dGVzIHRoZSBkdXJhdGlvbiBvZiBhbiBhbGFybSBieSBmaW5kaW5nIHRoZSBkaWZmZXJlbmNlXG4gICAqIGJldHdlZW4gdGhlIHN0YXJ0IGFuZCBlbmQgdGltZXMgb2YgdGhlIGFsYXJtLiBUaGUgc3RhcnQgdGltZSBpcyBkZXRlcm1pbmVkXG4gICAqIGZyb20gdGhlIGxhc3QgcmVjb3JkIGluIHRoZSBhdWRpdCBsb2csIHVzaW5nIHRoZSBmaXJzdCBhdmFpbGFibGUgdGltZSBmaWVsZFxuICAgKiAoYGZpcnN0T2NjdXJyZW5jZVRpbWVgLCBgdGltZWAsIG9yIGBjcmVhdGlvblRpbWVgKS4gVGhlIGVuZCB0aW1lIGlzIG9idGFpbmVkXG4gICAqIGZyb20gdGhlIGBhbGFybURldGFpbHNTZXJ2aWNlYC5cbiAgICpcbiAgICogQHBhcmFtIGF1ZGl0TG9nIC0gQW4gYXJyYXkgb2YgYElBdWRpdFJlY29yZGAgb2JqZWN0cyByZXByZXNlbnRpbmcgdGhlIGF1ZGl0IGxvZyByZWNvcmRzLlxuICAgKiBAcmV0dXJucyBUaGUgZHVyYXRpb24gb2YgdGhlIGFsYXJtIGluIG1pbGxpc2Vjb25kcywgb3IgYG51bGxgIGlmIHRoZSBlbmQgdGltZSBpcyBub3QgYXZhaWxhYmxlLlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBjYWxjdWxhdGVBbGFybUR1cmF0aW9uKGF1ZGl0TG9nOiBJQXVkaXRSZWNvcmRbXSk6IG51bWJlciB8IG51bGwge1xuICAgIGNvbnN0IGZpcnN0QWxhcm0gPSBhdWRpdExvZ1thdWRpdExvZy5sZW5ndGggLSAxXTtcbiAgICBjb25zdCBzdGFydFRpbWUgPSBmaXJzdEFsYXJtLmZpcnN0T2NjdXJyZW5jZVRpbWUgfHwgZmlyc3RBbGFybS50aW1lIHx8IGZpcnN0QWxhcm0uY3JlYXRpb25UaW1lO1xuICAgIGNvbnN0IGVuZFRpbWUgPSB0aGlzLmFsYXJtRGV0YWlsc1NlcnZpY2UuZ2V0RW5kVGltZShhdWRpdExvZyk7XG5cbiAgICBpZiAoIWVuZFRpbWUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHN0YXJ0VGltZVRvRGF0ZSA9IG5ldyBEYXRlKHN0YXJ0VGltZSk7XG4gICAgY29uc3QgZW5kVGltZVRvRGF0ZSA9IG5ldyBEYXRlKGVuZFRpbWUpO1xuXG4gICAgcmV0dXJuIGVuZFRpbWVUb0RhdGUuZ2V0VGltZSgpIC0gc3RhcnRUaW1lVG9EYXRlLmdldFRpbWUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgYSBsaXN0IG9mIGF1ZGl0IHJlY29yZHMgZm9yIGEgc2VsZWN0ZWQgYWxhcm0uXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIGZldGNoZXMgYXVkaXQgcmVjb3JkcyBiYXNlZCBvbiB0aGUgc3BlY2lmaWVkIHByb3BlcnRpZXMsIGluY2x1ZGluZ1xuICAgKiB0aGUgZGF0ZSwgcGFnZSBzaXplLCB3aGV0aGVyIHRvIHJldmVydCwgdGhlIHNvdXJjZSBhbGFybSBJRCwgYW5kIHdoZXRoZXIgdG8gaW5jbHVkZSB0b3RhbCBwYWdlcy5cbiAgICpcbiAgICogQHBhcmFtIGlzUmV2ZXJ0IC0gQSBib29sZWFuIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRvIHJldHJpZXZlIGEgMTAwIChzZWUgUEFHRV9TSVpFKSByZWNvcmRzICh0cnVlKVxuICAgKiAgICAgICAgICAgICAgICAgICBvciBvbmx5IHJlY29yZCwgdGhhdCBjaHJvbm9sb2dpY2FsbHkgd2lsbCBiZSB0aGUgb2xkZXN0IG9uZSAoZmFsc2UpLiBEZWZhdWx0cyB0byB0cnVlLlxuICAgKiAgICAgICAgICAgICAgICAgICBJZiBzZXQgdG8gZmFsc2UsIGl0IHdpbGwgc2V0IFBBR0VfU0laRSB0byAxIGFuZCB0cmlnZ2VyIGEgbG9naWNcbiAgICogICAgICAgICAgICAgICAgICAgY29uY2F0ZW5hdGluZyBhIG1vc3QgcmVjZW50IHJlY29yZCB3aXRoIHRoZSB2ZXJ5IGZpcnN0IG9uZSB0b1xuICAgKiAgICAgICAgICAgICAgICAgICBjYWxjdWxhdGUgdGhlIGFsYXJtIGR1cmF0aW9uIChjaGFuZ2UgdG8gQ0xFQVJFRCBzdGF0dXMpLlxuICAgKiBAcmV0dXJucyBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhbiBJUmVzdWx0TGlzdCBvZiBJQXVkaXRSZWNvcmQgb2JqZWN0cywgcmVwcmVzZW50aW5nIHRoZSBhdWRpdCByZWNvcmRzLlxuICAgKiBAYXN5bmNcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZ2V0QWxhcm1BdWRpdFJlY29yZHMoaXNSZXZlcnQgPSB0cnVlKTogUHJvbWlzZTxJUmVzdWx0TGlzdDxJQXVkaXRSZWNvcmQ+PiB7XG4gICAgY29uc3QgcHJvcGVydGllcyA9IHtcbiAgICAgIGRhdGVUbzogbmV3IERhdGUoRGF0ZS5ub3coKSkudG9JU09TdHJpbmcoKSxcbiAgICAgIHBhZ2VTaXplOiBpc1JldmVydCA/IHRoaXMuUEFHRV9TSVpFIDogMSxcbiAgICAgIHJldmVydDogaXNSZXZlcnQsXG4gICAgICBzb3VyY2U6IHRoaXMuc2VsZWN0ZWRBbGFybS5pZCxcbiAgICAgIHdpdGhUb3RhbFBhZ2VzOiB0cnVlXG4gICAgfTtcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmF1ZGl0U2VydmljZS5saXN0KHByb3BlcnRpZXMpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB1cGRhdGVTdGF0dXNNZXNzYWdlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHN3aXRjaCAodGhpcy5zZWxlY3RlZEFsYXJtLnN0YXR1cykge1xuICAgICAgY2FzZSB0aGlzLkFDVElWRV9TVEFUVVNfVkFMVUU6XG4gICAgICAgIHRoaXMuc3RhdHVzTWVzc2FnZSA9IHRoaXMuZ2V0QWN0aXZlU3RhdHVzTWVzc2FnZSh0aGlzLnNlbGVjdGVkQWxhcm0udGltZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSB0aGlzLkFDS05PV0xFREdFRF9TVEFUVVNfVkFMVUU6XG4gICAgICAgIHRoaXMuc3RhdHVzTWVzc2FnZSA9IHRoaXMuZ2V0QWNrbm93bGVkZ2VkU3RhdHVzTWVzc2FnZShcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkQWxhcm0uc3RhdHVzIGFzIHVua25vd24gYXMgQWxhcm1TdGF0dXNUeXBlLFxuICAgICAgICAgIHRoaXMuYXVkaXRMb2cuZGF0YVxuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgdGhpcy5DTEVBUkVEX1NUQVRVU19WQUxVRTpcbiAgICAgICAgaWYgKHRoaXMuaGFzUmVhY2hlZE9yRXhjZWVkZWRQYWdlU2l6ZUxpbWl0KCkpIHtcbiAgICAgICAgICB0aGlzLmV4dGVuZGVkQXVkaXRMb2dzID0gYXdhaXQgdGhpcy5hdWRpdExvZ1dpdGhGaXJzdFJlY29yZCgpO1xuICAgICAgICAgIHRoaXMuc3RhdHVzTWVzc2FnZSA9IHRoaXMuZ2V0Q2xlYXJlZFN0YXR1c01lc3NhZ2UodGhpcy5leHRlbmRlZEF1ZGl0TG9ncy5kYXRhKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zdGF0dXNNZXNzYWdlID0gdGhpcy5nZXRDbGVhcmVkU3RhdHVzTWVzc2FnZSh0aGlzLmF1ZGl0TG9nLmRhdGEpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhc1JlYWNoZWRPckV4Y2VlZGVkUGFnZVNpemVMaW1pdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5hdWRpdExvZy5kYXRhLmxlbmd0aCA+PSB0aGlzLlBBR0VfU0laRTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q3VzdG9tRnJhZ21lbnRzKHNlbGVjdGVkQWxhcm06IElBbGFybSk6IEN1c3RvbUZyYWdtZW50IHtcbiAgICBsZXQgY3VzdG9tUHJvcGVydGllcyA9IG51bGw7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gc2VsZWN0ZWRBbGFybSkge1xuICAgICAgaWYgKCFBTEFSTV9ERUZBVUxUX1BST1BFUlRJRVMuZmluZChrID0+IGsgPT09IGtleSkpIHtcbiAgICAgICAgaWYgKCFjdXN0b21Qcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgY3VzdG9tUHJvcGVydGllcyA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIGN1c3RvbVByb3BlcnRpZXNba2V5XSA9IHNlbGVjdGVkQWxhcm1ba2V5XTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY3VzdG9tUHJvcGVydGllcztcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImQtZmxleCByb3cgdGlnaHQtZ3JpZCBmbGV4LXdyYXAgYS1pLXN0cmV0Y2hcIj5cbiAgPGRpdiBjbGFzcz1cImNvbC14cy0xMiBjb2wtbWQtNiBkLWZsZXggcC1iLThcIj5cbiAgICA8ZGl2IGNsYXNzPVwiYm9yZGVyLWFsbCBmaXQtdyBkLWZsZXhcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJwLThcIj5cbiAgICAgICAgPGlcbiAgICAgICAgICBjbGFzcz1cImljb24tMjQgdGV4dC1ncmF5LWRhcmsgbS10LTQgYzh5LWljb25cIlxuICAgICAgICAgIFtjOHlJY29uXT1cInNlbGVjdGVkQWxhcm0uc3RhdHVzIHwgQWxhcm1TdGF0dXNUb0ljb25cIlxuICAgICAgICA+PC9pPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwicC10LTggcC1iLTggcC1yLThcIj5cbiAgICAgICAgPHAgY2xhc3M9XCJ0ZXh0LWxhYmVsLXNtYWxsIG0tYi0wIG0tci04XCI+e3sgJ1N0YXR1cycgfCB0cmFuc2xhdGUgfX08L3A+XG4gICAgICAgIDxwIGNsYXNzPVwic21hbGxcIj57eyBzdGF0dXNNZXNzYWdlIH19PC9wPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwiY29sLXhzLTEyIGNvbC1tZC02IGQtZmxleCBwLWItOFwiPlxuICAgIDxkaXYgY2xhc3M9XCJib3JkZXItYWxsIGZpdC13IGQtZmxleFwiPlxuICAgICAgPGRpdiBjbGFzcz1cInAtOFwiPlxuICAgICAgICA8aVxuICAgICAgICAgIGNsYXNzPVwiaWNvbi0yNCB0ZXh0LWdyYXktZGFyayBtLXQtNCBzdHJva2VkLWljb24gc3RhdHVzXCJcbiAgICAgICAgICBbYzh5SWNvbl09XCJzZWxlY3RlZEFsYXJtLnNldmVyaXR5IHwgQWxhcm1TZXZlcml0eVRvSWNvblwiXG4gICAgICAgICAgW25nQ2xhc3NdPVwic2VsZWN0ZWRBbGFybS5zZXZlcml0eT8udG9TdHJpbmcoKSB8IGxvd2VyY2FzZVwiXG4gICAgICAgID48L2k+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJwLXQtOCBwLWItOCBwLXItOFwiPlxuICAgICAgICA8cCBjbGFzcz1cInRleHQtbGFiZWwtc21hbGwgbS1iLTAgbS1yLThcIj57eyAnU2V2ZXJpdHknIHwgdHJhbnNsYXRlIH19PC9wPlxuICAgICAgICA8cCBjbGFzcz1cInNtYWxsXCI+e3sgU0VWRVJJVFlfTEFCRUxTW3NlbGVjdGVkQWxhcm0uc2V2ZXJpdHldIHwgdHJhbnNsYXRlIH19PC9wPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwiY29sLXhzLTEyIGNvbC1tZC02IGQtZmxleCBwLWItOFwiPlxuICAgIDxkaXYgY2xhc3M9XCJib3JkZXItYWxsIGZpdC13IGQtZmxleFwiPlxuICAgICAgPGRpdiBjbGFzcz1cInAtOFwiPlxuICAgICAgICA8aVxuICAgICAgICAgIGNsYXNzPVwiaWNvbi0yNCB0ZXh0LWdyYXktZGFyayBtLXQtNCBzdHJva2VkLWljb24gc3RhdHVzXCJcbiAgICAgICAgICBjOHlJY29uPVwiY29udGFjdGxlc3MtcGF5bWVudFwiXG4gICAgICAgID48L2k+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJwLXQtOCBwLWItOCBwLXItOFwiPlxuICAgICAgICA8cCBjbGFzcz1cInRleHQtbGFiZWwtc21hbGwgbS1iLTAgbS1yLThcIj57eyAnU291cmNlJyB8IHRyYW5zbGF0ZSB9fTwvcD5cbiAgICAgICAgPHAgY2xhc3M9XCJzbWFsbFwiPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIGNsYXNzPVwiYnRuLWxpbmsgdGV4dC1tdXRlZCBwLTAgbS1yLTggdGV4dC1sZWZ0XCJcbiAgICAgICAgICAgIHRpdGxlPVwie3sgc2VsZWN0ZWRBbGFybS5zb3VyY2UubmFtZSB9fVwiXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIHJvdXRlckxpbms9XCJ7eyBzZWxlY3RlZEFsYXJtTU8gfCBhc3NldExpbmsgfX1cIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cImljb24tZmxleFwiPlxuICAgICAgICAgICAgICA8aSBjOHlJY29uPVwiZXhjaGFuZ2VcIj48L2k+XG4gICAgICAgICAgICAgIHt7IHNlbGVjdGVkQWxhcm0uc291cmNlLm5hbWUgfHwgc2VsZWN0ZWRBbGFybS5zb3VyY2UuaWQgfX1cbiAgICAgICAgICAgIDwvc21hbGw+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNob3dTb3VyY2VOYXZpZ2F0aW9uTGluayQgfCBhc3luY1wiPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICBjbGFzcz1cImJ0bi1saW5rIHAtMCB0ZXh0LWxlZnRcIlxuICAgICAgICAgICAgICB0aXRsZT1cInt7XG4gICAgICAgICAgICAgICAgbGlua1RpdGxlXG4gICAgICAgICAgICAgICAgICB8IHRyYW5zbGF0ZVxuICAgICAgICAgICAgICAgICAgICA6IHsgYXBwTmFtZTogdXNlckRldmljZU1hbmFnZW1lbnRBcHAkIHwgYXN5bmMgfCBodW1hbml6ZUFwcE5hbWUgfCBhc3luYyB9XG4gICAgICAgICAgICAgIH19XCJcbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJnb1RvQWxhcm1Tb3VyY2Uoc2VsZWN0ZWRBbGFybS5pZClcIlxuICAgICAgICAgICAgICBkYXRhLWN5PVwiYWxhcm0tZGV0YWlscy1kZXZpY2UtbWFuYWdlbWVudC1saW5rXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAge3sgdXNlckRldmljZU1hbmFnZW1lbnRBcHAkIHwgYXN5bmMgfCBodW1hbml6ZUFwcE5hbWUgfCBhc3luYyB9fVxuICAgICAgICAgICAgICA8aSBjOHlJY29uPVwiZXh0ZXJuYWwtbGlua1wiPjwvaT5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L3A+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJjb2wteHMtMTIgY29sLW1kLTYgZC1mbGV4IHAtYi04XCI+XG4gICAgPGRpdiBjbGFzcz1cImJvcmRlci1hbGwgZml0LXcgZC1mbGV4XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwicC04XCI+XG4gICAgICAgIDxzcGFuXG4gICAgICAgICAgY2xhc3M9XCJjaXJjbGUtaWNvbi13cmFwcGVyXCJcbiAgICAgICAgICBbbmdTdHlsZV09XCJ7ICdiYWNrZ3JvdW5kLWNvbG9yJzogdHlwZUNvbG9yIH1cIlxuICAgICAgICA+XG4gICAgICAgICAgPGlcbiAgICAgICAgICAgIGNsYXNzPVwic3Ryb2tlZC1pY29uXCJcbiAgICAgICAgICAgIGM4eUljb249XCJiZWxsXCJcbiAgICAgICAgICA+PC9pPlxuICAgICAgICA8L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJwLXQtOCBwLWItOCBwLXItOCBtaW4td2lkdGgtMFwiPlxuICAgICAgICA8cCBjbGFzcz1cInRleHQtbGFiZWwtc21hbGwgbS1iLTAgbS1yLThcIj57eyAnVHlwZScgfCB0cmFuc2xhdGUgfX08L3A+XG4gICAgICAgIDxwXG4gICAgICAgICAgY2xhc3M9XCJzbWFsbCB0ZXh0LXRydW5jYXRlXCJcbiAgICAgICAgICB0aXRsZT1cInt7IHNlbGVjdGVkQWxhcm0udHlwZSB9fVwiXG4gICAgICAgID5cbiAgICAgICAgICA8Y29kZT57eyBzZWxlY3RlZEFsYXJtLnR5cGUgfX08L2NvZGU+XG4gICAgICAgIDwvcD5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8ZGl2IGNsYXNzPVwiY29sLXhzLTEyIGNvbC1tZC0xMiBwLWItMTZcIj5cbiAgICA8ZGl2IGNsYXNzPVwiYm9yZGVyLWFsbCBmaXQtdyBkLWZsZXhcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJwLThcIj5cbiAgICAgICAgPGlcbiAgICAgICAgICBjbGFzcz1cImljb24tMjQgdGV4dC1ncmF5LWRhcmsgbS10LTRcIlxuICAgICAgICAgIGM4eUljb249XCJjYWxlbmRhclwiXG4gICAgICAgICAgZGF0YS1jeT1cImM4eS1hbGFybS1kZXRhaWxzLS1sYXN0LXVwZGF0ZWQtaWNvblwiXG4gICAgICAgID48L2k+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJwLXQtOCBwLWItMCBwLXItOCBmbGV4LWdyb3dcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRlbnQtZmxleC01MFwiPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzPVwiY29sLTQgcC1iLThcIlxuICAgICAgICAgICAgKm5nSWY9XCJzZWxlY3RlZEFsYXJtLmNvdW50ID4gMVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHAgY2xhc3M9XCJ0ZXh0LWxhYmVsLXNtYWxsIG0tYi0wIG0tci04XCI+e3sgJ051bWJlciBvZiBvY2N1cnJlbmNlcycgfCB0cmFuc2xhdGUgfX08L3A+XG4gICAgICAgICAgICA8cD5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJiYWRnZSBiYWRnZS1pbmZvXCI+e3sgc2VsZWN0ZWRBbGFybS5jb3VudCB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cImNvbC00IHAtYi04XCJcbiAgICAgICAgICAgICpuZ0lmPVwic2VsZWN0ZWRBbGFybS5jb3VudCA+IDFcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxwIGNsYXNzPVwidGV4dC1sYWJlbC1zbWFsbCBtLWItMCBtLXItOFwiPnt7ICdGaXJzdCBvY2N1cnJlbmNlJyB8IHRyYW5zbGF0ZSB9fTwvcD5cbiAgICAgICAgICAgIDxwIGNsYXNzPVwic21hbGxcIj5cbiAgICAgICAgICAgICAge3sgc2VsZWN0ZWRBbGFybS5jcmVhdGlvblRpbWUgfCBjOHlEYXRlOiAnbWVkaXVtJyB9fVxuXG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBjbGFzcz1cImJ0bi1oZWxwIGJ0bi1oZWxwLS1zbVwiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInSGVscCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgIHBvcG92ZXI9XCJ7e1xuICAgICAgICAgICAgICAgICAgJ1RpbWUgaW4gd2hpY2ggdGhlIGFsYXJtIHdhcyBjcmVhdGVkLiBUaGUgdGltZSBzaG93biBjb3JyZXNwb25kcyB0byB0aGUgc2VydmVyXFwncyB0aW1lLiBEZXZpY2UgdGltZSBjYW4gYmUgZGlmZmVyZW50IGZyb20gc2VydmVyIHRpbWUuJ1xuICAgICAgICAgICAgICAgICAgICB8IHRyYW5zbGF0ZVxuICAgICAgICAgICAgICAgIH19XCJcbiAgICAgICAgICAgICAgICBwbGFjZW1lbnQ9XCJyaWdodFwiXG4gICAgICAgICAgICAgICAgdHJpZ2dlcnM9XCJmb2N1c1wiXG4gICAgICAgICAgICAgICAgY29udGFpbmVyPVwiYm9keVwiXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cImNvbC00IHAtYi04XCJcbiAgICAgICAgICAgIGRhdGEtY3k9XCJjOHktYWxhcm0tZGV0YWlscy0tbGFzdC11cGRhdGVkLXdyYXBwZXJcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxwIGNsYXNzPVwidGV4dC1sYWJlbC1zbWFsbCBtLWItMCBtLXItOFwiPnt7ICdMYXN0IG9jY3VycmVuY2UnIHwgdHJhbnNsYXRlIH19PC9wPlxuICAgICAgICAgICAgPHAgY2xhc3M9XCJzbWFsbFwiPlxuICAgICAgICAgICAgICB7eyBzZWxlY3RlZEFsYXJtLmxhc3RVcGRhdGVkIHwgYzh5RGF0ZTogJ21lZGl1bScgfX1cblxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJidG4taGVscCBidG4taGVscC0tc21cIlxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ0hlbHAnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICBwb3BvdmVyPVwie3tcbiAgICAgICAgICAgICAgICAgICdUaW1lIGluIHdoaWNoIHRoZSBhbGFybSB3YXMgbGFzdCB1cGRhdGVkLiBUaGUgdGltZSBzaG93biBjb3JyZXNwb25kcyB0byB0aGUgc2VydmVyXFwncyB0aW1lLiBEZXZpY2UgdGltZSBjYW4gYmUgZGlmZmVyZW50IGZyb20gc2VydmVyIHRpbWUuJ1xuICAgICAgICAgICAgICAgICAgICB8IHRyYW5zbGF0ZVxuICAgICAgICAgICAgICAgIH19XCJcbiAgICAgICAgICAgICAgICBwbGFjZW1lbnQ9XCJyaWdodFwiXG4gICAgICAgICAgICAgICAgdHJpZ2dlcnM9XCJmb2N1c1wiXG4gICAgICAgICAgICAgICAgY29udGFpbmVyPVwiYm9keVwiXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPGRpdlxuICAgIGNsYXNzPVwiY29sLXhzLTEyIGNvbC1tZC0xMiBwLWItMTZcIlxuICAgICpuZ0lmPVwiY3VzdG9tRnJhZ21lbnRzXCJcbiAgPlxuICAgIDxkaXYgY2xhc3M9XCJib3JkZXItYWxsIGZpdC13IGQtZmxleFwiPlxuICAgICAgPGRpdiBjbGFzcz1cInAtOFwiPlxuICAgICAgICA8aVxuICAgICAgICAgIGNsYXNzPVwiaWNvbi0yNCB0ZXh0LWdyYXktZGFyayBtLXQtNFwiXG4gICAgICAgICAgYzh5SWNvbj1cIm91dGdvaW5nLWRhdGFcIlxuICAgICAgICA+PC9pPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwicC10LTggcC1iLTAgcC1yLTggZmxleC1ncm93XCJcbiAgICAgICAgZGF0YS1jeT1cImFsYXJtLWRldGFpbHMtY3VzdG9tLWRhdGFcIlxuICAgICAgPlxuICAgICAgICA8cCBjbGFzcz1cInRleHQtbGFiZWwtc21hbGwgbS1iLTQgbS1yLThcIj57eyAnQ3VzdG9tIGRhdGEnIHwgdHJhbnNsYXRlIH19PC9wPlxuICAgICAgICA8cHJlPjxjb2RlPnt7IGN1c3RvbUZyYWdtZW50cyB8IGpzb24gfX08L2NvZGU+PC9wcmU+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cblxuPGRpdiBjbGFzcz1cImQtZmxleCBmbGV4LXdyYXAgZ2FwLThcIj5cbiAgPGJ1dHRvblxuICAgIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0IGJ0bi1zbVwiXG4gICAgW3RpdGxlXT1cIidSZWxvYWQgYXVkaXQgbG9ncycgfCB0cmFuc2xhdGVcIlxuICAgIHR5cGU9XCJzdWJtaXRcIlxuICAgIChjbGljayk9XCJyZWxvYWRBdWRpdExvZyh0cnVlLCB0cnVlKVwiXG4gID5cbiAgICA8aVxuICAgICAgYzh5SWNvbj1cInJlZnJlc2hcIlxuICAgICAgW25nQ2xhc3NdPVwieyAnaWNvbi1zcGluJzogaXNMb2FkaW5nIH1cIlxuICAgID48L2k+XG4gICAge3sgJ1JlbG9hZCBhdWRpdCBsb2dzJyB8IHRyYW5zbGF0ZSB9fVxuICA8L2J1dHRvbj5cblxuICA8YnV0dG9uXG4gICAgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHQgYnRuLXNtXCJcbiAgICBbdGl0bGVdPVwiXG4gICAgICBzZWxlY3RlZEFsYXJtLnN0YXR1cyAhPT0gQUNLTk9XTEVER0VEX1NUQVRVU19WQUxVRVxuICAgICAgICA/IChBQ0tOT1dMRURHRV9MQUJFTCB8IHRyYW5zbGF0ZSlcbiAgICAgICAgOiAoUkVBQ1RJVkFURV9MQUJFTCB8IHRyYW5zbGF0ZSlcbiAgICBcIlxuICAgIHR5cGU9XCJzdWJtaXRcIlxuICAgIChjbGljayk9XCJcbiAgICAgIG9uVXBkYXRlRGV0YWlscyhcbiAgICAgICAgc2VsZWN0ZWRBbGFybS5zdGF0dXMgIT09IEFDS05PV0xFREdFRF9TVEFUVVNfVkFMVUVcbiAgICAgICAgICA/IEFDS05PV0xFREdFRF9TVEFUVVNfVkFMVUVcbiAgICAgICAgICA6IEFDVElWRV9TVEFUVVNfVkFMVUVcbiAgICAgIClcbiAgICBcIlxuICAgIFtkaXNhYmxlZF09XCJzZWxlY3RlZEFsYXJtLnN0YXR1cyA9PT0gQ0xFQVJFRF9TVEFUVVNfVkFMVUUgfHwgaXNBbGFybVN0YXR1c0NoYW5naW5nXCJcbiAgPlxuICAgIDxpXG4gICAgICBbYzh5SWNvbl09XCJzZWxlY3RlZEFsYXJtLnN0YXR1cyAhPT0gQUNLTk9XTEVER0VEX1NUQVRVU19WQUxVRSA/IEJFTExfU0xBU0hfSUNPTiA6IEJFTExfSUNPTlwiXG4gICAgPjwvaT5cbiAgICB7e1xuICAgICAgc2VsZWN0ZWRBbGFybS5zdGF0dXMgIT09IEFDS05PV0xFREdFRF9TVEFUVVNfVkFMVUVcbiAgICAgICAgPyAoQUNLTk9XTEVER0VfTEFCRUwgfCB0cmFuc2xhdGUpXG4gICAgICAgIDogKFJFQUNUSVZBVEVfTEFCRUwgfCB0cmFuc2xhdGUpXG4gICAgfX1cbiAgPC9idXR0b24+XG5cbiAgPGJ1dHRvblxuICAgIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0IGJ0bi1zbVwiXG4gICAgW3RpdGxlXT1cIidDcmVhdGUgc21hcnQgcnVsZScgfCB0cmFuc2xhdGVcIlxuICAgIHR5cGU9XCJzdWJtaXRcIlxuICAgICpuZ0lmPVwiaXNDcmVhdGVTbWFydFJ1bGVzQnV0dG9uQXZhaWxhYmxlXCJcbiAgICAoY2xpY2spPVwiY3JlYXRlU21hcnRSdWxlKClcIlxuICA+XG4gICAgPGkgYzh5SWNvbj1cImM4eS1pY29uIGM4eS1pY29uLXNtYXJ0LXJ1bGVzXCI+PC9pPlxuICAgIHt7ICdDcmVhdGUgc21hcnQgcnVsZScgfCB0cmFuc2xhdGUgfX1cbiAgPC9idXR0b24+XG4gIDxidXR0b25cbiAgICBjbGFzcz1cImJ0biBidG4tZGVmYXVsdCBidG4tc21cIlxuICAgIFt0aXRsZV09XCInQ2xlYXJgYWxhcm1gJyB8IHRyYW5zbGF0ZVwiXG4gICAgdHlwZT1cInN1Ym1pdFwiXG4gICAgKGNsaWNrKT1cIm9uVXBkYXRlRGV0YWlscyhDTEVBUkVEX1NUQVRVU19WQUxVRSlcIlxuICAgIFtkaXNhYmxlZF09XCJzZWxlY3RlZEFsYXJtLnN0YXR1cyA9PT0gQ0xFQVJFRF9TVEFUVVNfVkFMVUVcIlxuICA+XG4gICAgPGkgYzh5SWNvbj1cImM4eS1hbGVydC1pZGxlXCI+PC9pPlxuICAgIHt7ICdDbGVhcmBhbGFybWAnIHwgdHJhbnNsYXRlIH19XG4gIDwvYnV0dG9uPlxuXG4gIDxidXR0b25cbiAgICBjbGFzcz1cImJ0biBidG4tZGVmYXVsdCBidG4tc21cIlxuICAgIFt0aXRsZV09XCJidXR0b24udGl0bGUgfCB0cmFuc2xhdGVcIlxuICAgIHR5cGU9XCJidXR0b25cIlxuICAgICpuZ0Zvcj1cImxldCBidXR0b24gb2Ygc2VsZWN0ZWRBbGFybSB8IGFsYXJtRGV0YWlsc0J1dHRvbjogc2VsZWN0ZWRBbGFybU1PIHwgYXN5bmNcIlxuICAgIFtuZ0NsYXNzXT1cImJ1dHRvbi5hZGRpdGlvbmFsQnV0dG9uQ2xhc3Nlc1wiXG4gICAgKGNsaWNrKT1cImRldGFpbHNCdXR0b25BY3Rpb24oYnV0dG9uLCBzZWxlY3RlZEFsYXJtKVwiXG4gICAgW2Rpc2FibGVkXT1cImJ1dHRvbi5kaXNhYmxlZFwiXG4gID5cbiAgICA8aVxuICAgICAgW2M4eUljb25dPVwiYnV0dG9uLmljb25cIlxuICAgICAgW25nQ2xhc3NdPVwiYnV0dG9uLmFkZGl0aW9uYWxJY29uQ2xhc3Nlc1wiXG4gICAgPjwvaT5cbiAgICA8c3BhbiAqbmdJZj1cImJ1dHRvbi5sYWJlbFwiPnt7IGJ1dHRvbi5sYWJlbCB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgPC9idXR0b24+XG48L2Rpdj5cblxuPG5nLXRlbXBsYXRlICNub0F1ZGl0TG9nQXZhaWxhYmxlPlxuICA8ZGl2IGNsYXNzPVwicC0xNlwiPlxuICAgIDxjOHktdWktZW1wdHktc3RhdGVcbiAgICAgIFtpY29uXT1cIidhcmNoaXZlJ1wiXG4gICAgICBbdGl0bGVdPVwiJ05vIGF1ZGl0IGxvZ3MgZm91bmQuJyB8IHRyYW5zbGF0ZVwiXG4gICAgICBbaG9yaXpvbnRhbF09XCJ0cnVlXCJcbiAgICA+PC9jOHktdWktZW1wdHktc3RhdGU+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPGRpdiBjbGFzcz1cImxlZ2VuZCBmb3JtLWJsb2NrXCI+e3sgJ0F1ZGl0IGxvZ3MnIHwgdHJhbnNsYXRlIH19PC9kaXY+XG5cbjxuZy1jb250YWluZXIgKm5nSWY9XCJpc0xvYWRpbmcgfHwgYXVkaXRMb2c/LmRhdGEubGVuZ3RoOyBlbHNlIG5vQXVkaXRMb2dBdmFpbGFibGVcIj5cbiAgPGM4eS1sb2FkaW5nICpuZ0lmPVwiaXNMb2FkaW5nXCI+PC9jOHktbG9hZGluZz5cblxuICA8Yzh5LWxpc3QtZ3JvdXBcbiAgICBkYXRhLWN5PVwiYzh5LWFsYXJtcy1kZXRhaWxzLS1hdWRpdC1sb2dzXCJcbiAgICAqbmdJZj1cIiFpc0xvYWRpbmdcIlxuICA+XG4gICAgPGM4eS1saS10aW1lbGluZSAqYzh5Rm9yPVwibGV0IGxvZyBvZiBhdWRpdExvZzsgbG9hZE1vcmU6ICdoaWRkZW4nXCI+XG4gICAgICB7eyBsb2cuY3JlYXRpb25UaW1lIHwgZGF0ZTogJ21lZGl1bURhdGUnIH19XG4gICAgICB7eyBsb2cuY3JlYXRpb25UaW1lIHwgZGF0ZTogJ21lZGl1bVRpbWUnIH19XG4gICAgICA8Yzh5LWxpPlxuICAgICAgICA8Yzh5LWxpLWJvZHk+XG4gICAgICAgICAgPHAgY2xhc3M9XCJ0ZXh0LXRydW5jYXRlLXdyYXAgc2VwYXJhdG9yLWJvdHRvbSBwLWItNFwiPlxuICAgICAgICAgICAge3sgbG9nIHwgYXVkaXRDaGFuZ2VzTWVzc2FnZSB9fVxuICAgICAgICAgIDwvcD5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYzh5LWxpc3RfX2l0ZW1fX2Zvb3RlclwiPlxuICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgY2xhc3M9XCJtLXItMTYgc21hbGxcIlxuICAgICAgICAgICAgICAqbmdJZj1cImxvZy51c2VyXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWxhYmVsLXNtYWxsXCI+XG4gICAgICAgICAgICAgICAge3sgJ2J5YHVzZXJgJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIHt7IGxvZy51c2VyIH19XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNtYWxsXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1sYWJlbC1zbWFsbFwiPlxuICAgICAgICAgICAgICAgIHt7ICdkZXZpY2UgdGltZScgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICB7eyBsb2cudGltZSB8IGM4eURhdGU6ICdtZWRpdW0nIH19XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvYzh5LWxpLWJvZHk+XG4gICAgICA8L2M4eS1saT5cbiAgICA8L2M4eS1saS10aW1lbGluZT5cbiAgPC9jOHktbGlzdC1ncm91cD5cbjwvbmctY29udGFpbmVyPlxuIl19
335
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxhcm0tZGV0YWlscy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9hbGFybXMvYWxhcm0tZGV0YWlscy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi9hbGFybXMvYWxhcm0tZGV0YWlscy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBYSxRQUFRLEVBQWlCLE1BQU0sZUFBZSxDQUFDO0FBQ3JGLE9BQU8sRUFDTCxtQkFBbUIsRUFDbkIsV0FBVyxFQUNYLFlBQVksRUFFWixZQUFZLEVBTVosZ0JBQWdCLEVBQ2hCLGVBQWUsRUFDaEIsTUFBTSxhQUFhLENBQUM7QUFDckIsT0FBTyxFQUNMLFlBQVksRUFDWixlQUFlLEVBQ2YsWUFBWSxFQUNaLGdCQUFnQixFQUNoQixPQUFPLEVBRVAsZUFBZSxFQUNmLGFBQWEsRUFDZCxNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDdEMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDOUQsT0FBTyxFQUNMLHdCQUF3QixFQUN4QixpQkFBaUIsRUFHbEIsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNoRixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsY0FBYyxFQUFjLE1BQU0sTUFBTSxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7QUFNbEQsTUFBTSxPQUFPLHFCQUFxQjtJQW1FaEMsWUFDVSxtQkFBd0MsRUFDeEMsWUFBMEIsRUFDMUIsWUFBMEIsRUFDMUIsUUFBeUIsRUFDekIsWUFBMEIsRUFDMUIsWUFBOEIsRUFDbEIs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dEUsTUFBTTtRQUNWLENBQUM7SUFDSCxDQUFDO0lBRU8saUNBQWlDO1FBQ3ZDLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDckQsQ0FBQztJQUVPLGtCQUFrQixDQUFDLGFBQXFCO1FBQzlDLElBQUksZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO1FBQzVCLEtBQUssTUFBTSxHQUFHLElBQUksYUFBYSxFQUFFLENBQUM7WUFDaEMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNuRCxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztvQkFDdEIsZ0JBQWdCLEdBQUcsRUFBRSxDQUFDO2dCQUN4QixDQUFDO2dCQUNELGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxHQUFHLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM3QyxDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sZ0JBQWdCLENBQUM7SUFDMUIsQ0FBQzsrR0EvWVUscUJBQXFCO21HQUFyQixxQkFBcUIsMEhDMUNsQywwc1dBa1ZBOzs0RkR4U2EscUJBQXFCO2tCQUpqQyxTQUFTOytCQUNFLG1CQUFtQjs7MEJBNkUxQixRQUFRO2dNQXpFRixhQUFhO3NCQUFyQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT25DaGFuZ2VzLCBPcHRpb25hbCwgU2ltcGxlQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgQUxBUk1fU1RBVFVTX0xBQkVMUyxcbiAgQWxhcm1TdGF0dXMsXG4gIEFsYXJtU2VydmljZSxcbiAgQWxhcm1TdGF0dXNUeXBlLFxuICBBdWRpdFNlcnZpY2UsXG4gIElBbGFybSxcbiAgSUFwcGxpY2F0aW9uLFxuICBJQXVkaXRSZWNvcmQsXG4gIElNYW5hZ2VkT2JqZWN0LFxuICBJUmVzdWx0TGlzdCxcbiAgSW52ZW50b3J5U2VydmljZSxcbiAgU0VWRVJJVFlfTEFCRUxTXG59IGZyb20gJ0BjOHkvY2xpZW50JztcbmltcG9ydCB7XG4gIEFsZXJ0U2VydmljZSxcbiAgQXBwU3RhdGVTZXJ2aWNlLFxuICBDb2xvclNlcnZpY2UsXG4gIFJlbGF0aXZlVGltZVBpcGUsXG4gIGdldHRleHQsXG4gIFN1cHBvcnRlZEFwcEtleSxcbiAgSW50ZXJBcHBTZXJ2aWNlLFxuICBTdXBwb3J0ZWRBcHBzXG59IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMnO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgY2xvbmVEZWVwIH0gZnJvbSAnbG9kYXNoLWVzJztcbmltcG9ydCB7IEFsYXJtRGV0YWlsc1NlcnZpY2UgfSBmcm9tICcuL2FsYXJtLWRldGFpbHMuc2VydmljZSc7XG5pbXBvcnQge1xuICBBTEFSTV9ERUZBVUxUX1BST1BFUlRJRVMsXG4gIEFMQVJNX1NUQVRVU19JQ09OLFxuICBBbGFybURldGFpbHNCdXR0b24sXG4gIEN1c3RvbUZyYWdtZW50XG59IGZyb20gJy4vYWxhcm1zLm1vZGVsJztcbmltcG9ydCB7IE5nMVNtYXJ0UnVsZXNVcGdyYWRlU2VydmljZSB9IGZyb20gJy4vbmcxLXNtYXJ0LXJ1bGVzLXVwZ3JhZGUuc2VydmljZSc7XG5pbXBvcnQgeyBBbGFybXNWaWV3U2VydmljZSB9IGZyb20gJy4vYWxhcm1zLXZpZXcuc2VydmljZSc7XG5pbXBvcnQgeyBmaXJzdFZhbHVlRnJvbSwgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjOHktYWxhcm0tZGV0YWlscycsXG4gIHRlbXBsYXRlVXJsOiAnLi9hbGFybS1kZXRhaWxzLmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBBbGFybURldGFpbHNDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xuICBASW5wdXQoKSBzZWxlY3RlZEFsYXJtOiBJQWxhcm07XG5cbiAgcmVhZG9ubHkgQUNLTk9XTEVER0VEX1NUQVRVU19WQUxVRSA9IEFsYXJtU3RhdHVzLkFDS05PV0xFREdFRDtcbiAgcmVhZG9ubHkgQUNUSVZFX1NUQVRVU19WQUxVRSA9IEFsYXJtU3RhdHVzLkFDVElWRTtcbiAgcmVhZG9ubHkgQ0xFQVJFRF9TVEFUVVNfVkFMVUUgPSBBbGFybVN0YXR1cy5DTEVBUkVEO1xuICByZWFkb25seSBBQ0tOT1dMRURHRV9MQUJFTCA9IGdldHRleHQoJ0Fja25vd2xlZGdlJyk7XG4gIHJlYWRvbmx5IFJFQUNUSVZBVEVfTEFCRUwgPSBnZXR0ZXh0KCdSZWFjdGl2YXRlJyk7XG4gIHJlYWRvbmx5IFNFVkVSSVRZX0xBQkVMUyA9IFNFVkVSSVRZX0xBQkVMUztcbiAgcmVhZG9ubHkgQkVMTF9TTEFTSF9JQ09OID0gQUxBUk1fU1RBVFVTX0lDT04uQkVMTF9TTEFTSDtcbiAgcmVhZG9ubHkgQkVMTF9JQ09OID0gQUxBUk1fU1RBVFVTX0lDT04uQkVMTDtcblxuICAvKipcbiAgICogUmVwcmVzZW50cyBhIERldmljZSBNYW5hZ2VtZW50IGFwcGxpY2F0aW9uIHVzZWQgYnkgdGhlIHVzZXIuXG4gICAqIERldGVybWluZXMgdGhlIGFjY3VyYXRlIG5hbWUgYW5kIGNvbnRleHQgcGF0aCByZXF1aXJlZCBmb3IgbmF2aWdhdGluZyB0byBhbGFybXMgb2YgdGhlIGN1cnJlbnQgZGV2aWNlXG4gICAqL1xuICB1c2VyRGV2aWNlTWFuYWdlbWVudEFwcCQ6IE9ic2VydmFibGU8SUFwcGxpY2F0aW9uPjtcbiAgLyoqXG4gICAqIE1hbmFnZXMgdGhlIHZpc2liaWxpdHkgb2YgdGhlIG5hdmlnYXRpb24gbGluay5cbiAgICogSWYgc2V0IHRvIHRydWUsIHRoZSBsaW5rIGlzIHZpc2libGUsIG90aGVyd2lzZSwgaXQgcmVtYWlucyBoaWRkZW4uXG4gICAqL1xuICBzaG93U291cmNlTmF2aWdhdGlvbkxpbmskOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuICBkZXZpY2VNYW5hZ2VtZW50QXBwS2V5OiBTdXBwb3J0ZWRBcHBLZXkgPSBTdXBwb3J0ZWRBcHBzLmRldmljZW1hbmFnZW1lbnQ7XG4gIHJlYWRvbmx5IGxpbmtUaXRsZSA9IGdldHRleHQoJ09wZW4gaW4ge3sgYXBwTmFtZSB9fScpO1xuICAvKipcbiAgICogQ29udGFpbnMgYXVkaXQgbG9ncywgaW5jbHVkaW5nIHRoZSB2ZXJ5IGZpcnN0IGF1ZGl0IGxvZyByZWNvcmQgaW4gdGhlIGFsYXJtcycgaGlzdG9yeS5cbiAgICogVGhpcyBlbnN1cmVzIHRoYXQgdGhlIGhpc3RvcmljYWwgc3RhcnRpbmcgcG9pbnQgb2YgdGhlIGF1ZGl0IGxvZ3MgaXMgYWx3YXlzIGluY2x1ZGVkIGluIHRoZSBkYXRhIHNldC5cbiAgICogVXN1YWxseSBpdCdzIGFuICdBbGFybSBjcmVhdGVkJyBhdWRpdCBsb2cuXG4gICAqXG4gICAqIE9ubHkgdXNlZCB3aGVuIGF1ZGl0IGxvZ3MgZXhjZWVkIFBBR0VfU0laRS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgZXh0ZW5kZWRBdWRpdExvZ3M6IElSZXN1bHRMaXN0PElBdWRpdFJlY29yZD47XG4gIHByaXZhdGUgcmVhZG9ubHkgUEFHRV9TSVpFID0gMTAwO1xuXG4gIC8qKlxuICAgKiBQcmV2ZW50cyB0aGUgcGlwZWxpbmUgZnJvbSBmYWlsaW5nIGZvciBhIHR1dG9yaWFsIGFwcGxpY2F0aW9uXG4gICAqIGJlY2F1c2UgaXQncyBhIHB1cmUgQW5ndWxhciBhcHBsaWNhdGlvbiBhbmQgZG9lc24ndCBzdXBwb3J0IGFueVxuICAgKiBBbmd1bGFySlMgc2VydmljZXMuXG4gICAqL1xuICBpc0NyZWF0ZVNtYXJ0UnVsZXNCdXR0b25BdmFpbGFibGU6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBQcm9wZXJ0eSBjb250YWlucyBhIDEwMCAoc2VlIFBBR0VfU0laRSkgb2YgbW9zdCByZWNlbnQgYXVkaXQgbG9ncyByZWNvcmRzLlxuICAgKi9cbiAgYXVkaXRMb2c6IElSZXN1bHRMaXN0PElBdWRpdFJlY29yZD47XG5cbiAgaXNMb2FkaW5nOiBib29sZWFuO1xuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZW4gYWxhcm1zIHN0YXR1cyBjaGFuZ2Ugd2FzIHN0YXJ0ZWQgKEFja25vd2xlZGdlL1JlYWN0aXZhdGUpXG4gICAqL1xuICBpc0FsYXJtU3RhdHVzQ2hhbmdpbmcgPSBmYWxzZTtcbiAgLyoqXG4gICAqIFJlcHJlc2VudHMgYSB2YWx1ZSBmb3IgYSAnU3RhdHVzJyBzZWN0aW9uIGluIGRldGFpbHMuXG4gICAqL1xuICBzdGF0dXNNZXNzYWdlOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgY29sb3Igb2YgdGhlIGFsYXJtIHR5cGUuXG4gICAqL1xuICB0eXBlQ29sb3I6IHN0cmluZztcbiAgLyoqXG4gICAqIEN1c3RvbSBmcmFnbWVudHMgb2YgdGhlIHNlbGVjdGVkIGFsYXJtLiBJZiBub25lIGV4aXN0LCBudWxsIGlzIHJldHVybmVkLlxuICAgKi9cbiAgY3VzdG9tRnJhZ21lbnRzOiBDdXN0b21GcmFnbWVudCA9IG51bGw7XG5cbiAgc2VsZWN0ZWRBbGFybU1POiBJTWFuYWdlZE9iamVjdDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGFsYXJtRGV0YWlsc1NlcnZpY2U6IEFsYXJtRGV0YWlsc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBhbGFybVNlcnZpY2U6IEFsYXJtU2VydmljZSxcbiAgICBwcml2YXRlIGFsZXJ0U2VydmljZTogQWxlcnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgYXBwU3RhdGU6IEFwcFN0YXRlU2VydmljZSxcbiAgICBwcml2YXRlIGF1ZGl0U2VydmljZTogQXVkaXRTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVsYXRpdmVUaW1lOiBSZWxhdGl2ZVRpbWVQaXBlLFxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgbmcxU21hcnRSdWxlc1VwZ3JhZGVTZXJ2aWNlOiBOZzFTbWFydFJ1bGVzVXBncmFkZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSB0cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgaW52ZW50b3J5U2VydmljZTogSW52ZW50b3J5U2VydmljZSxcbiAgICBwcml2YXRlIGFsYXJtc1ZpZXdTZXJ2aWNlOiBBbGFybXNWaWV3U2VydmljZSxcbiAgICBwcml2YXRlIGNvbG9yU2VydmljZTogQ29sb3JTZXJ2aWNlLFxuICAgIHByaXZhdGUgaW50ZXJBcHBTZXJ2aWNlOiBJbnRlckFwcFNlcnZpY2VcbiAgKSB7fVxuXG4gIGFzeW5jIG5nT25Jbml0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGlzU21hcnRSdWxlc1NlcnZpY2VTdWJzY3JpYmVkID0gISEoYXdhaXQgZmlyc3RWYWx1ZUZyb20oXG4gICAgICB0aGlzLmludGVyQXBwU2VydmljZS5nZXRBcHAkKFN1cHBvcnRlZEFwcHMuc21hcnRydWxlcylcbiAgICApKTtcbiAgICBjb25zdCBoYXNBbnlSb2xlQWxsb3dpbmdUb0NyZWF0ZVNtYXJ0UnVsZSA9XG4gICAgICB0aGlzLmFsYXJtRGV0YWlsc1NlcnZpY2UuY2hlY2tJZkhhc0FueVJvbGVBbGxvd2luZ1RvQ3JlYXRlU21hcnRSdWxlKCk7XG4gICAgdGhpcy5pc0NyZWF0ZVNtYXJ0UnVsZXNCdXR0b25BdmFpbGFibGUgPVxuICAgICAgISF0aGlzLm5nMVNtYXJ0UnVsZXNVcGdyYWRlU2VydmljZSAmJlxuICAgICAgaXNTbWFydFJ1bGVzU2VydmljZVN1YnNjcmliZWQgJiZcbiAgICAgIGhhc0FueVJvbGVBbGxvd2luZ1RvQ3JlYXRlU21hcnRSdWxlO1xuICAgIHRoaXMudXNlckRldmljZU1hbmFnZW1lbnRBcHAkID0gdGhpcy5pbnRlckFwcFNlcnZpY2UuZ2V0QXBwJCh0aGlzLmRldmljZU1hbmFnZW1lbnRBcHBLZXkpO1xuICAgIHRoaXMuc2hvd1NvdXJjZU5hdmlnYXRpb25MaW5rJCA9IHRoaXMuaW50ZXJBcHBTZXJ2aWNlLnNob3VsZFNob3dBcHBMaW5rJChcbiAgICAgIHRoaXMuZGV2aWNlTWFuYWdlbWVudEFwcEtleVxuICAgICk7XG4gICAgdGhpcy50eXBlQ29sb3IgPSBhd2FpdCB0aGlzLmNvbG9yU2VydmljZS5nZW5lcmF0ZUNvbG9yKHRoaXMuc2VsZWN0ZWRBbGFybS50eXBlKTtcbiAgfVxuXG4gIGFzeW5jIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoY2hhbmdlcy5zZWxlY3RlZEFsYXJtICYmIGNoYW5nZXMuc2VsZWN0ZWRBbGFybS5jdXJyZW50VmFsdWUpIHtcbiAgICAgIGF3YWl0IHRoaXMucmVsb2FkQXVkaXRMb2codHJ1ZSwgdHJ1ZSk7XG4gICAgICBhd2FpdCB0aGlzLnVwZGF0ZVN0YXR1c01lc3NhZ2UoKTtcbiAgICAgIGNvbnN0IHsgZGF0YSB9ID0gYXdhaXQgdGhpcy5pbnZlbnRvcnlTZXJ2aWNlLmRldGFpbCh0aGlzLnNlbGVjdGVkQWxhcm0uc291cmNlLmlkKTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRBbGFybU1PID0gZGF0YTtcbiAgICAgIHRoaXMuY3VzdG9tRnJhZ21lbnRzID0gdGhpcy5nZXRDdXN0b21GcmFnbWVudHModGhpcy5zZWxlY3RlZEFsYXJtKTtcbiAgICB9XG4gIH1cblxuICBjcmVhdGVTbWFydFJ1bGUoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzQ3JlYXRlU21hcnRSdWxlc0J1dHRvbkF2YWlsYWJsZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLm5nMVNtYXJ0UnVsZXNVcGdyYWRlU2VydmljZS5hZGROZXdGb3JJbnB1dEFsYXJtQW5kT3V0cHV0VXNlcldpdGhVSShcbiAgICAgIHRoaXMuc2VsZWN0ZWRBbGFybSxcbiAgICAgIHRoaXMuYXBwU3RhdGUuY3VycmVudFVzZXIudmFsdWVcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIE5hdmlnYXRlcyB0byBhIHNwZWNpZmljIGFsYXJtIHNvdXJjZSBkZXZpY2UgYmFzZWQgb24gdGhlIHByb3ZpZGVkIHNvdXJjZS5cbiAgICpcbiAgICogQHBhcmFtIHNvdXJjZUlkIC0gVGhlIHNvdXJjZSBpZC5cbiAgICovXG4gIGFzeW5jIGdvVG9BbGFybVNvdXJjZShzb3VyY2VJZDogc3RyaW5nIHwgbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBkYXRhIH0gPSBhd2FpdCB0aGlzLmFsYXJtU2VydmljZS5kZXRhaWwoc291cmNlSWQpO1xuICAgIGF3YWl0IHRoaXMuaW50ZXJBcHBTZXJ2aWNlLm5hdmlnYXRlVG9BcHAoXG4gICAgICB0aGlzLmRldmljZU1hbmFnZW1lbnRBcHBLZXksXG4gICAgICBgIy9kZXZpY2UvJHtkYXRhLnNvdXJjZS5pZH0vYWxhcm1zYFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmVsb2FkcyBhdWRpdCBsb2cgZGF0YSBhc3luY2hyb25vdXNseS5cbiAgICpcbiAgICogVGhpcyBtZXRob2QgZmV0Y2hlcyBhdWRpdCByZWNvcmRzIHVzaW5nIGBnZXRBbGFybUF1ZGl0UmVjb3Jkc2AgYW5kIG9wdGlvbmFsbHkgdXBkYXRlcyB0aGUgYXVkaXQgbG9nc1xuICAgKiBzdGF0ZSBpbiB0aGUgY29tcG9uZW50IGJhc2VkIG9uIHRoZSBgaXNTZXRBdWRpdExvZ3NgIGZsYWcuIEl0IGhhbmRsZXMgdGhlIGxvYWRpbmcgc3RhdGUgYW5kIHBvdGVudGlhbFxuICAgKiBlcnJvcnMgZHVyaW5nIHRoZSBmZXRjaCBvcGVyYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSBpc1JldmVydCAtIEEgYm9vbGVhbiBmbGFnIGluZGljYXRpbmcgd2hldGhlciB0byByZXRyaWV2ZSBhIDEwMCAoc2VlIFBBR0VfU0laRSkgcmVjb3JkcyAodHJ1ZSlcbiAgICogICAgICAgICAgICAgICAgICAgb3Igb25seSByZWNvcmQsIHRoYXQgY2hyb25vbG9naWNhbGx5IHdpbGwgYmUgdGhlIG9sZGVzdCBvbmUgKGZhbHNlKS4gRGVmYXVsdHMgdG8gdHJ1ZS5cbiAgICogICAgICAgICAgICAgICAgICAgSWYgc2V0IHRvIGZhbHNlLCBpdCB3aWxsIHNldCBQQUdFX1NJWkUgdG8gMSBhbmQgdHJpZ2dlciBhIGxvZ2ljXG4gICAqICAgICAgICAgICAgICAgICAgIGNvbmNhdGVuYXRpbmcgYSBtb3N0IHJlY2VudCByZWNvcmQgd2l0aCB0aGUgdmVyeSBmaXJzdCBvbmUgdG9cbiAgICogICAgICAgICAgICAgICAgICAgY2FsY3VsYXRlIHRoZSBhbGFybSBkdXJhdGlvbiAoY2hhbmdlIHRvIENMRUFSRUQgc3RhdHVzKS5cbiAgICogICAgICAgICAgICAgICAgICAgSXQncyBwYXNzZWQgdG8gdGhlIGBnZXRBbGFybUF1ZGl0UmVjb3Jkc2AgbWV0aG9kLlxuICAgKiBAcGFyYW0gaXNTZXRBdWRpdExvZ3MgLSBBIGJvb2xlYW4gZmxhZyB0byBkZXRlcm1pbmUgaWYgdGhlIGZldGNoZWQgYXVkaXQgbG9ncyBzaG91bGQgYmUgc2V0IGluIHRoZSBjb21wb25lbnQgc3RhdGUuIERlZmF1bHRzIHRvIGBmYWxzZWAuXG4gICAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGEgbGlzdCBvZiBgSUF1ZGl0UmVjb3JkYCBvYmplY3RzLlxuICAgKi9cbiAgYXN5bmMgcmVsb2FkQXVkaXRMb2coXG4gICAgaXNSZXZlcnQgPSB0cnVlLFxuICAgIGlzU2V0QXVkaXRMb2dzID0gZmFsc2VcbiAgKTogUHJvbWlzZTxJUmVzdWx0TGlzdDxJQXVkaXRSZWNvcmQ+PiB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuaXNMb2FkaW5nID0gdHJ1ZTtcbiAgICAgIGNvbnN0IGF1ZGl0TG9ncyA9IGF3YWl0IHRoaXMuZ2V0QWxhcm1BdWRpdFJlY29yZHMoaXNSZXZlcnQpO1xuXG4gICAgICBpZiAoaXNTZXRBdWRpdExvZ3MpIHtcbiAgICAgICAgdGhpcy5zZXRBdWRpdExvZ3MoYXVkaXRMb2dzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGF1ZGl0TG9ncztcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5hbGVydFNlcnZpY2UuYWRkU2VydmVyRmFpbHVyZShlcnJvcik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgb25VcGRhdGVEZXRhaWxzKHN0YXR1czogQWxhcm1TdGF0dXNUeXBlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuaXNBbGFybVN0YXR1c0NoYW5naW5nID0gdHJ1ZTtcbiAgICAgIGF3YWl0IHRoaXMudXBkYXRlQWxhcm1TdGF0dXMoc3RhdHVzKTtcbiAgICAgIGF3YWl0IHRoaXMucmVsb2FkQXVkaXRMb2codHJ1ZSwgdHJ1ZSk7XG4gICAgICBhd2FpdCB0aGlzLnVwZGF0ZVN0YXR1c01lc3NhZ2UoKTtcbiAgICAgIHRoaXMudXBkYXRlTGFzdFVwZGF0ZWREYXRlKHRoaXMuYXVkaXRMb2cuZGF0YVswXSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLmFkZFNlcnZlckZhaWx1cmUoZXJyb3IpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmlzQWxhcm1TdGF0dXNDaGFuZ2luZyA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGRldGFpbHNCdXR0b25BY3Rpb24oYnV0dG9uOiBBbGFybURldGFpbHNCdXR0b24sIGFsYXJtOiBJQWxhcm0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCByZXN1bHQgPSBidXR0b24uYWN0aW9uKGFsYXJtKTtcbiAgICBsZXQgc2hvdWxkUmVsb2FkOiBib29sZWFuIHwgSUFsYXJtID0gZmFsc2U7XG4gICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgIHNob3VsZFJlbG9hZCA9IGF3YWl0IHJlc3VsdDtcbiAgICB9IGVsc2Uge1xuICAgICAgc2hvdWxkUmVsb2FkID0gcmVzdWx0O1xuICAgIH1cblxuICAgIGlmIChzaG91bGRSZWxvYWQpIHtcbiAgICAgIGxldCBhbGFybTogSUFsYXJtO1xuICAgICAgaWYgKHNob3VsZFJlbG9hZCA9PT0gdHJ1ZSkge1xuICAgICAgICBjb25zdCB7IGRhdGE6IHVwZGF0ZWRBbGFybSB9ID0gYXdhaXQgdGhpcy5hbGFybVNlcnZpY2UuZGV0YWlsKHRoaXMuc2VsZWN0ZWRBbGFybS5pZCk7XG4gICAgICAgIGFsYXJtID0gdXBkYXRlZEFsYXJtO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYWxhcm0gPSBzaG91bGRSZWxvYWQ7XG4gICAgICB9XG4gICAgICB0aGlzLmFsYXJtc1ZpZXdTZXJ2aWNlLnVwZGF0ZUFsYXJtTGlzdCgpO1xuXG4gICAgICBjb25zdCBwcmV2aW91c1ZhbHVlID0gdGhpcy5zZWxlY3RlZEFsYXJtO1xuICAgICAgdGhpcy5zZWxlY3RlZEFsYXJtID0gYWxhcm07XG4gICAgICB0aGlzLm5nT25DaGFuZ2VzKHtcbiAgICAgICAgc2VsZWN0ZWRBbGFybToge1xuICAgICAgICAgIGN1cnJlbnRWYWx1ZTogYWxhcm0sXG4gICAgICAgICAgcHJldmlvdXNWYWx1ZSxcbiAgICAgICAgICBmaXJzdENoYW5nZTogZmFsc2UsXG4gICAgICAgICAgaXNGaXJzdENoYW5nZTogKCkgPT4gZmFsc2VcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB1cGRhdGVBbGFybVN0YXR1cyhzdGF0dXM6IEFsYXJtU3RhdHVzVHlwZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBhcnRpYWxseVVwZGF0ZWRBbGFybTogUGFydGlhbDxJQWxhcm0+ID0geyBpZDogdGhpcy5zZWxlY3RlZEFsYXJtLmlkLCBzdGF0dXMgfTtcbiAgICBhd2FpdCB0aGlzLmFsYXJtU2VydmljZS51cGRhdGUocGFydGlhbGx5VXBkYXRlZEFsYXJtKTtcbiAgICBjb25zdCB0cmFuc2xhdGVkU3RhdHVzTGFiZWwgPSB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChBTEFSTV9TVEFUVVNfTEFCRUxTW3N0YXR1c10pO1xuICAgIHRoaXMuYWxlcnRTZXJ2aWNlLnN1Y2Nlc3MoXG4gICAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChnZXR0ZXh0KCdBbGFybSBzdGF0dXMgY2hhbmdlZCB0byB7eyBzdGF0dXMgfX0nKSwge1xuICAgICAgICBzdGF0dXM6IHRyYW5zbGF0ZWRTdGF0dXNMYWJlbC50b1VwcGVyQ2FzZSgpXG4gICAgICB9KVxuICAgICk7XG4gICAgdGhpcy5zZWxlY3RlZEFsYXJtLnN0YXR1cyA9IHN0YXR1cztcbiAgICB0aGlzLmFsYXJtc1ZpZXdTZXJ2aWNlLnVwZGF0ZUFsYXJtTGlzdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyB0aGUgYXVkaXQgbG9nIGFuZCBhcHBlbmRzIHRoZSBsYXN0IGF1ZGl0IHJlY29yZCB0byBpdC5cbiAgICpcbiAgICogVGhpcyBtZXRob2QgZmV0Y2hlcyB0aGUgZXhpc3RpbmcgYXVkaXQgbG9nIGRhdGEgYW5kIG1ha2VzIGEgZGVlcCBjb3B5IG9mIGl0LiBJdCB0aGVuXG4gICAqIHJldHJpZXZlcyB0aGUgbGFzdCBhdWRpdCByZWNvcmQgYW5kIGFwcGVuZHMgaXQgdG8gdGhlIGNvcGllZCBhdWRpdCBsb2cgZGF0YS4gVGhpcyBpc1xuICAgKiB1c2VmdWwgZm9yIHNjZW5hcmlvcyB3aGVyZSB0aGUgbW9zdCByZWNlbnQgYXVkaXQgcmVjb3JkIG5lZWRzIHRvIGJlIGluY2x1ZGVkIGluIHRoZVxuICAgKiBleGlzdGluZyBhdWRpdCBsb2cgZGF0YSAoY2FsY3VsYXRpbmcgdGhlIENMRUFSRUQgcGVyaW9kKS5cbiAgICpcbiAgICogQHJldHVybnMgQSBwcm9taXNlIG9mIGBJUmVzdWx0TGlzdDxJQXVkaXRSZWNvcmQ+YCwgd2hpY2ggaW5jbHVkZXMgdGhlXG4gICAqICAgICAgICAgIGV4aXN0aW5nIGF1ZGl0IGxvZyBkYXRhIGFsb25nIHdpdGggdGhlIGxhc3QgYXVkaXQgcmVjb3JkIGFwcGVuZGVkLlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBhdWRpdExvZ1dpdGhGaXJzdFJlY29yZCgpOiBQcm9taXNlPElSZXN1bHRMaXN0PElBdWRpdFJlY29yZD4+IHtcbiAgICBjb25zdCBleGlzdGluZ0RhdGEgPSB0aGlzLmF1ZGl0TG9nO1xuICAgIGNvbnN0IGNvcGllZEV4aXN0aW5nRGF0YSA9IGNsb25lRGVlcChleGlzdGluZ0RhdGEpO1xuXG4gICAgY29uc3QgbGFzdEF1ZGl0UmVjb3JkID0gYXdhaXQgdGhpcy5yZWxvYWRBdWRpdExvZyhmYWxzZSk7XG4gICAgY29uc3QgbGFzdFJlY29yZCA9IGxhc3RBdWRpdFJlY29yZC5kYXRhW2xhc3RBdWRpdFJlY29yZC5kYXRhLmxlbmd0aCAtIDFdO1xuICAgIGNvcGllZEV4aXN0aW5nRGF0YS5kYXRhLnB1c2gobGFzdFJlY29yZCk7XG4gICAgcmV0dXJuIGNvcGllZEV4aXN0aW5nRGF0YTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0QXVkaXRMb2dzKGF1ZGl0TG9nczogSVJlc3VsdExpc3Q8SUF1ZGl0UmVjb3JkPik6IHZvaWQge1xuICAgIHRoaXMuYXVkaXRMb2cgPSBhdWRpdExvZ3M7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUxhc3RVcGRhdGVkRGF0ZSh1cGRhdGVkQXVkaXRSZWNvcmRzOiBJQXVkaXRSZWNvcmQpOiB2b2lkIHtcbiAgICBpZiAoIXVwZGF0ZWRBdWRpdFJlY29yZHMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB7IGNyZWF0aW9uVGltZSB9ID0gdXBkYXRlZEF1ZGl0UmVjb3JkcztcbiAgICB0aGlzLnNlbGVjdGVkQWxhcm0ubGFzdFVwZGF0ZWQgPSBjcmVhdGlvblRpbWU7XG4gIH1cblxuICBwcml2YXRlIGdldEFjdGl2ZVN0YXR1c01lc3NhZ2UodGltZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoZ2V0dGV4dCgnQUNUSVZFYGFsYXJtYDogdHJpZ2dlcmVkIHt7YWxhcm1UaW1lRnJvbU5vd319JyksIHtcbiAgICAgIGFsYXJtVGltZUZyb21Ob3c6IHRoaXMucmVsYXRpdmVUaW1lLnRyYW5zZm9ybShuZXcgRGF0ZSh0aW1lKSlcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0QWNrbm93bGVkZ2VkU3RhdHVzTWVzc2FnZShzdGF0dXM6IEFsYXJtU3RhdHVzVHlwZSwgY2hhbmdlTG9nOiBJQXVkaXRSZWNvcmRbXSk6IHN0cmluZyB7XG4gICAgaWYgKGNoYW5nZUxvZy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChnZXR0ZXh0KCdBQ0tOT1dMRURHRURgYWxhcm1gJykpO1xuICAgIH1cblxuICAgIGNvbnN0IGFja25vd2xlZGdlZEJ5ID0gdGhpcy5hbGFybURldGFpbHNTZXJ2aWNlLmdldEFja25vd2xlZGdlZEJ5KHN0YXR1cywgY2hhbmdlTG9nKTtcbiAgICBjb25zdCBhY2tub3dsZWRnZVRpbWUgPSB0aGlzLmFsYXJtRGV0YWlsc1NlcnZpY2UuZ2V0QWNrbm93bGVkZ2VUaW1lKGNoYW5nZUxvZyk7XG5cbiAgICBpZiAoYWNrbm93bGVkZ2VkQnkpIHtcbiAgICAgIHJldHVybiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChcbiAgICAgICAgZ2V0dGV4dCgnQUNLTk9XTEVER0VEYGFsYXJtYCBieToge3thY2tCeX19IHt7YWNrVGltZUZyb21Ob3d9fScpLFxuICAgICAgICB7XG4gICAgICAgICAgYWNrQnk6IGFja25vd2xlZGdlZEJ5LFxuICAgICAgICAgIGFja1RpbWVGcm9tTm93OiB0aGlzLnJlbGF0aXZlVGltZS50cmFuc2Zvcm0obmV3IERhdGUoYWNrbm93bGVkZ2VUaW1lKSlcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoZ2V0dGV4dCgnQUNLTk9XTEVER0VEYGFsYXJtYCB7e2Fja1RpbWVGcm9tTm93fX0nKSwge1xuICAgICAgYWNrVGltZUZyb21Ob3c6IHRoaXMucmVsYXRpdmVUaW1lLnRyYW5zZm9ybShuZXcgRGF0ZShhY2tub3dsZWRnZVRpbWUpKVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRDbGVhcmVkU3RhdHVzTWVzc2FnZShhdWRpdExvZzogSUF1ZGl0UmVjb3JkW10pOiBzdHJpbmcge1xuICAgIGlmIChhdWRpdExvZy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChnZXR0ZXh0KCdDTEVBUkVEYGFsYXJtYCcpKTtcbiAgICB9XG5cbiAgICBjb25zdCBkaWZmZXJlbmNlSW5NcyA9IHRoaXMuY2FsY3VsYXRlQWxhcm1EdXJhdGlvbihhdWRpdExvZyk7XG5cbiAgICByZXR1cm4gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoXG4gICAgICBnZXR0ZXh0KCdDTEVBUkVEYGFsYXJtYDogd2FzIGFjdGl2ZSBmb3Ige3thbGFybUR1cmF0aW9ufX0nKSxcbiAgICAgIHtcbiAgICAgICAgYWxhcm1EdXJhdGlvbjogdGhpcy5yZWxhdGl2ZVRpbWUudHJhbnNmb3JtKGRpZmZlcmVuY2VJbk1zLCB0cnVlKVxuICAgICAgfVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlcyB0aGUgZHVyYXRpb24gb2YgYW4gYWxhcm0gYmFzZWQgb24gYXVkaXQgbG9nIHJlY29yZHMuXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIGNvbXB1dGVzIHRoZSBkdXJhdGlvbiBvZiBhbiBhbGFybSBieSBmaW5kaW5nIHRoZSBkaWZmZXJlbmNlXG4gICAqIGJldHdlZW4gdGhlIHN0YXJ0IGFuZCBlbmQgdGltZXMgb2YgdGhlIGFsYXJtLiBUaGUgc3RhcnQgdGltZSBpcyBkZXRlcm1pbmVkXG4gICAqIGZyb20gdGhlIGxhc3QgcmVjb3JkIGluIHRoZSBhdWRpdCBsb2csIHVzaW5nIHRoZSBmaXJzdCBhdmFpbGFibGUgdGltZSBmaWVsZFxuICAgKiAoYGZpcnN0T2NjdXJyZW5jZVRpbWVgLCBgdGltZWAsIG9yIGBjcmVhdGlvblRpbWVgKS4gVGhlIGVuZCB0aW1lIGlzIG9idGFpbmVkXG4gICAqIGZyb20gdGhlIGBhbGFybURldGFpbHNTZXJ2aWNlYC5cbiAgICpcbiAgICogQHBhcmFtIGF1ZGl0TG9nIC0gQW4gYXJyYXkgb2YgYElBdWRpdFJlY29yZGAgb2JqZWN0cyByZXByZXNlbnRpbmcgdGhlIGF1ZGl0IGxvZyByZWNvcmRzLlxuICAgKiBAcmV0dXJucyBUaGUgZHVyYXRpb24gb2YgdGhlIGFsYXJtIGluIG1pbGxpc2Vjb25kcywgb3IgYG51bGxgIGlmIHRoZSBlbmQgdGltZSBpcyBub3QgYXZhaWxhYmxlLlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBjYWxjdWxhdGVBbGFybUR1cmF0aW9uKGF1ZGl0TG9nOiBJQXVkaXRSZWNvcmRbXSk6IG51bWJlciB8IG51bGwge1xuICAgIGNvbnN0IGZpcnN0QWxhcm0gPSBhdWRpdExvZ1thdWRpdExvZy5sZW5ndGggLSAxXTtcbiAgICBjb25zdCBzdGFydFRpbWUgPSBmaXJzdEFsYXJtLmZpcnN0T2NjdXJyZW5jZVRpbWUgfHwgZmlyc3RBbGFybS50aW1lIHx8IGZpcnN0QWxhcm0uY3JlYXRpb25UaW1lO1xuICAgIGNvbnN0IGVuZFRpbWUgPSB0aGlzLmFsYXJtRGV0YWlsc1NlcnZpY2UuZ2V0RW5kVGltZShhdWRpdExvZyk7XG5cbiAgICBpZiAoIWVuZFRpbWUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHN0YXJ0VGltZVRvRGF0ZSA9IG5ldyBEYXRlKHN0YXJ0VGltZSk7XG4gICAgY29uc3QgZW5kVGltZVRvRGF0ZSA9IG5ldyBEYXRlKGVuZFRpbWUpO1xuXG4gICAgcmV0dXJuIGVuZFRpbWVUb0RhdGUuZ2V0VGltZSgpIC0gc3RhcnRUaW1lVG9EYXRlLmdldFRpbWUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgYSBsaXN0IG9mIGF1ZGl0IHJlY29yZHMgZm9yIGEgc2VsZWN0ZWQgYWxhcm0uXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIGZldGNoZXMgYXVkaXQgcmVjb3JkcyBiYXNlZCBvbiB0aGUgc3BlY2lmaWVkIHByb3BlcnRpZXMsIGluY2x1ZGluZ1xuICAgKiB0aGUgZGF0ZSwgcGFnZSBzaXplLCB3aGV0aGVyIHRvIHJldmVydCwgdGhlIHNvdXJjZSBhbGFybSBJRCwgYW5kIHdoZXRoZXIgdG8gaW5jbHVkZSB0b3RhbCBwYWdlcy5cbiAgICpcbiAgICogQHBhcmFtIGlzUmV2ZXJ0IC0gQSBib29sZWFuIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRvIHJldHJpZXZlIGEgMTAwIChzZWUgUEFHRV9TSVpFKSByZWNvcmRzICh0cnVlKVxuICAgKiAgICAgICAgICAgICAgICAgICBvciBvbmx5IHJlY29yZCwgdGhhdCBjaHJvbm9sb2dpY2FsbHkgd2lsbCBiZSB0aGUgb2xkZXN0IG9uZSAoZmFsc2UpLiBEZWZhdWx0cyB0byB0cnVlLlxuICAgKiAgICAgICAgICAgICAgICAgICBJZiBzZXQgdG8gZmFsc2UsIGl0IHdpbGwgc2V0IFBBR0VfU0laRSB0byAxIGFuZCB0cmlnZ2VyIGEgbG9naWNcbiAgICogICAgICAgICAgICAgICAgICAgY29uY2F0ZW5hdGluZyBhIG1vc3QgcmVjZW50IHJlY29yZCB3aXRoIHRoZSB2ZXJ5IGZpcnN0IG9uZSB0b1xuICAgKiAgICAgICAgICAgICAgICAgICBjYWxjdWxhdGUgdGhlIGFsYXJtIGR1cmF0aW9uIChjaGFuZ2UgdG8gQ0xFQVJFRCBzdGF0dXMpLlxuICAgKiBAcmV0dXJucyBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhbiBJUmVzdWx0TGlzdCBvZiBJQXVkaXRSZWNvcmQgb2JqZWN0cywgcmVwcmVzZW50aW5nIHRoZSBhdWRpdCByZWNvcmRzLlxuICAgKiBAYXN5bmNcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZ2V0QWxhcm1BdWRpdFJlY29yZHMoaXNSZXZlcnQgPSB0cnVlKTogUHJvbWlzZTxJUmVzdWx0TGlzdDxJQXVkaXRSZWNvcmQ+PiB7XG4gICAgY29uc3QgcHJvcGVydGllcyA9IHtcbiAgICAgIGRhdGVUbzogbmV3IERhdGUoRGF0ZS5ub3coKSkudG9JU09TdHJpbmcoKSxcbiAgICAgIHBhZ2VTaXplOiBpc1JldmVydCA/IHRoaXMuUEFHRV9TSVpFIDogMSxcbiAgICAgIHJldmVydDogaXNSZXZlcnQsXG4gICAgICBzb3VyY2U6IHRoaXMuc2VsZWN0ZWRBbGFybS5pZCxcbiAgICAgIHdpdGhUb3RhbFBhZ2VzOiB0cnVlXG4gICAgfTtcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmF1ZGl0U2VydmljZS5saXN0KHByb3BlcnRpZXMpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB1cGRhdGVTdGF0dXNNZXNzYWdlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHN3aXRjaCAodGhpcy5zZWxlY3RlZEFsYXJtLnN0YXR1cykge1xuICAgICAgY2FzZSB0aGlzLkFDVElWRV9TVEFUVVNfVkFMVUU6XG4gICAgICAgIHRoaXMuc3RhdHVzTWVzc2FnZSA9IHRoaXMuZ2V0QWN0aXZlU3RhdHVzTWVzc2FnZSh0aGlzLnNlbGVjdGVkQWxhcm0udGltZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSB0aGlzLkFDS05PV0xFREdFRF9TVEFUVVNfVkFMVUU6XG4gICAgICAgIHRoaXMuc3RhdHVzTWVzc2FnZSA9IHRoaXMuZ2V0QWNrbm93bGVkZ2VkU3RhdHVzTWVzc2FnZShcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkQWxhcm0uc3RhdHVzIGFzIHVua25vd24gYXMgQWxhcm1TdGF0dXNUeXBlLFxuICAgICAgICAgIHRoaXMuYXVkaXRMb2cuZGF0YVxuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgdGhpcy5DTEVBUkVEX1NUQVRVU19WQUxVRTpcbiAgICAgICAgaWYgKHRoaXMuaGFzUmVhY2hlZE9yRXhjZWVkZWRQYWdlU2l6ZUxpbWl0KCkpIHtcbiAgICAgICAgICB0aGlzLmV4dGVuZGVkQXVkaXRMb2dzID0gYXdhaXQgdGhpcy5hdWRpdExvZ1dpdGhGaXJzdFJlY29yZCgpO1xuICAgICAgICAgIHRoaXMuc3RhdHVzTWVzc2FnZSA9IHRoaXMuZ2V0Q2xlYXJlZFN0YXR1c01lc3NhZ2UodGhpcy5leHRlbmRlZEF1ZGl0TG9ncy5kYXRhKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zdGF0dXNNZXNzYWdlID0gdGhpcy5nZXRDbGVhcmVkU3RhdHVzTWVzc2FnZSh0aGlzLmF1ZGl0TG9nLmRhdGEpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhc1JlYWNoZWRPckV4Y2VlZGVkUGFnZVNpemVMaW1pdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5hdWRpdExvZy5kYXRhLmxlbmd0aCA+PSB0aGlzLlBBR0VfU0laRTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q3VzdG9tRnJhZ21lbnRzKHNlbGVjdGVkQWxhcm06IElBbGFybSk6IEN1c3RvbUZyYWdtZW50IHtcbiAgICBsZXQgY3VzdG9tUHJvcGVydGllcyA9IG51bGw7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gc2VsZWN0ZWRBbGFybSkge1xuICAgICAgaWYgKCFBTEFSTV9ERUZBVUxUX1BST1BFUlRJRVMuZmluZChrID0+IGsgPT09IGtleSkpIHtcbiAgICAgICAgaWYgKCFjdXN0b21Qcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgY3VzdG9tUHJvcGVydGllcyA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIGN1c3RvbVByb3BlcnRpZXNba2V5XSA9IHNlbGVjdGVkQWxhcm1ba2V5XTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY3VzdG9tUHJvcGVydGllcztcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImQtZmxleCByb3cgdGlnaHQtZ3JpZCBmbGV4LXdyYXAgYS1pLXN0cmV0Y2hcIj5cbiAgPGRpdiBjbGFzcz1cImNvbC14cy0xMiBjb2wtbWQtNiBkLWZsZXggcC1iLThcIj5cbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cImJvcmRlci1hbGwgZml0LXcgZC1mbGV4XCJcbiAgICAgIGRhdGEtY3k9XCJjOHktYWxhcm0tZGV0YWlscy0tc3RhdHVzLXNlY3Rpb24td3JhcHBlclwiXG4gICAgPlxuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cInAtOFwiXG4gICAgICAgIGRhdGEtY3k9XCJjOHktYWxhcm0tZGV0YWlscy0tc3RhdHVzLWljb25cIlxuICAgICAgPlxuICAgICAgICA8aVxuICAgICAgICAgIGNsYXNzPVwiaWNvbi0yNCB0ZXh0LWdyYXktZGFyayBtLXQtNCBjOHktaWNvblwiXG4gICAgICAgICAgW2M4eUljb25dPVwic2VsZWN0ZWRBbGFybS5zdGF0dXMgfCBBbGFybVN0YXR1c1RvSWNvblwiXG4gICAgICAgID48L2k+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJwLXQtOCBwLWItOCBwLXItOFwiPlxuICAgICAgICA8cCBjbGFzcz1cInRleHQtbGFiZWwtc21hbGwgbS1iLTAgbS1yLThcIj57eyAnU3RhdHVzJyB8IHRyYW5zbGF0ZSB9fTwvcD5cbiAgICAgICAgPHAgY2xhc3M9XCJzbWFsbFwiPnt7IHN0YXR1c01lc3NhZ2UgfX08L3A+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJjb2wteHMtMTIgY29sLW1kLTYgZC1mbGV4IHAtYi04XCI+XG4gICAgPGRpdlxuICAgICAgY2xhc3M9XCJib3JkZXItYWxsIGZpdC13IGQtZmxleFwiXG4gICAgICBkYXRhLWN5PVwiYzh5LWFsYXJtLWRldGFpbHMtLXNldmVyaXR5LXNlY3Rpb24td3JhcHBlclwiXG4gICAgPlxuICAgICAgPGRpdiBjbGFzcz1cInAtOFwiPlxuICAgICAgICA8aVxuICAgICAgICAgIGNsYXNzPVwiaWNvbi0yNCB0ZXh0LWdyYXktZGFyayBtLXQtNCBzdHJva2VkLWljb24gc3RhdHVzXCJcbiAgICAgICAgICBbYzh5SWNvbl09XCJzZWxlY3RlZEFsYXJtLnNldmVyaXR5IHwgQWxhcm1TZXZlcml0eVRvSWNvblwiXG4gICAgICAgICAgW25nQ2xhc3NdPVwic2VsZWN0ZWRBbGFybS5zZXZlcml0eT8udG9TdHJpbmcoKSB8IGxvd2VyY2FzZVwiXG4gICAgICAgID48L2k+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJwLXQtOCBwLWItOCBwLXItOFwiPlxuICAgICAgICA8cCBjbGFzcz1cInRleHQtbGFiZWwtc21hbGwgbS1iLTAgbS1yLThcIj57eyAnU2V2ZXJpdHknIHwgdHJhbnNsYXRlIH19PC9wPlxuICAgICAgICA8cCBjbGFzcz1cInNtYWxsXCI+e3sgU0VWRVJJVFlfTEFCRUxTW3NlbGVjdGVkQWxhcm0uc2V2ZXJpdHldIHwgdHJhbnNsYXRlIH19PC9wPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICA8ZGl2XG4gICAgY2xhc3M9XCJjb2wteHMtMTIgY29sLW1kLTYgZC1mbGV4IHAtYi04XCJcbiAgICBkYXRhLWN5PVwiYzh5LWFsYXJtLWRldGFpbHMtLXNvdXJjZS13cmFwcGVyXCJcbiAgPlxuICAgIDxkaXYgY2xhc3M9XCJib3JkZXItYWxsIGZpdC13IGQtZmxleFwiPlxuICAgICAgPGRpdiBjbGFzcz1cInAtOFwiPlxuICAgICAgICA8aVxuICAgICAgICAgIGNsYXNzPVwiaWNvbi0yNCB0ZXh0LWdyYXktZGFyayBtLXQtNCBzdHJva2VkLWljb24gc3RhdHVzXCJcbiAgICAgICAgICBjOHlJY29uPVwiY29udGFjdGxlc3MtcGF5bWVudFwiXG4gICAgICAgID48L2k+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJwLXQtOCBwLWItOCBwLXItOFwiPlxuICAgICAgICA8cCBjbGFzcz1cInRleHQtbGFiZWwtc21hbGwgbS1iLTAgbS1yLThcIj57eyAnU291cmNlJyB8IHRyYW5zbGF0ZSB9fTwvcD5cbiAgICAgICAgPHAgY2xhc3M9XCJzbWFsbFwiPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIGNsYXNzPVwiYnRuLWxpbmsgdGV4dC1tdXRlZCBwLTAgbS1yLTggdGV4dC1sZWZ0XCJcbiAgICAgICAgICAgIHRpdGxlPVwie3sgc2VsZWN0ZWRBbGFybS5zb3VyY2UubmFtZSB9fVwiXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIHJvdXRlckxpbms9XCJ7eyBzZWxlY3RlZEFsYXJtTU8gfCBhc3NldExpbmsgfX1cIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cImljb24tZmxleFwiPlxuICAgICAgICAgICAgICA8aSBjOHlJY29uPVwiZXhjaGFuZ2VcIj48L2k+XG4gICAgICAgICAgICAgIHt7IHNlbGVjdGVkQWxhcm0uc291cmNlLm5hbWUgfHwgc2VsZWN0ZWRBbGFybS5zb3VyY2UuaWQgfX1cbiAgICAgICAgICAgIDwvc21hbGw+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNob3dTb3VyY2VOYXZpZ2F0aW9uTGluayQgfCBhc3luY1wiPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICBjbGFzcz1cImJ0bi1saW5rIHAtMCB0ZXh0LWxlZnRcIlxuICAgICAgICAgICAgICB0aXRsZT1cInt7XG4gICAgICAgICAgICAgICAgbGlua1RpdGxlXG4gICAgICAgICAgICAgICAgICB8IHRyYW5zbGF0ZVxuICAgICAgICAgICAgICAgICAgICA6IHsgYXBwTmFtZTogdXNlckRldmljZU1hbmFnZW1lbnRBcHAkIHwgYXN5bmMgfCBodW1hbml6ZUFwcE5hbWUgfCBhc3luYyB9XG4gICAgICAgICAgICAgIH19XCJcbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJnb1RvQWxhcm1Tb3VyY2Uoc2VsZWN0ZWRBbGFybS5pZClcIlxuICAgICAgICAgICAgICBkYXRhLWN5PVwiYWxhcm0tZGV0YWlscy1kZXZpY2UtbWFuYWdlbWVudC1saW5rXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAge3sgdXNlckRldmljZU1hbmFnZW1lbnRBcHAkIHwgYXN5bmMgfCBodW1hbml6ZUFwcE5hbWUgfCBhc3luYyB9fVxuICAgICAgICAgICAgICA8aSBjOHlJY29uPVwiZXh0ZXJuYWwtbGlua1wiPjwvaT5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L3A+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gIDxkaXZcbiAgICBjbGFzcz1cImNvbC14cy0xMiBjb2wtbWQtNiBkLWZsZXggcC1iLThcIlxuICAgIGRhdGEtY3k9XCJjOHktYWxhcm0tZGV0YWlscy0tc2V2ZXJpdHktdHlwZS13cmFwcGVyXCJcbiAgPlxuICAgIDxkaXYgY2xhc3M9XCJib3JkZXItYWxsIGZpdC13IGQtZmxleFwiPlxuICAgICAgPGRpdiBjbGFzcz1cInAtOFwiPlxuICAgICAgICA8c3BhblxuICAgICAgICAgIGNsYXNzPVwiY2lyY2xlLWljb24td3JhcHBlclwiXG4gICAgICAgICAgW25nU3R5bGVdPVwieyAnYmFja2dyb3VuZC1jb2xvcic6IHR5cGVDb2xvciB9XCJcbiAgICAgICAgPlxuICAgICAgICAgIDxpXG4gICAgICAgICAgICBjbGFzcz1cInN0cm9rZWQtaWNvblwiXG4gICAgICAgICAgICBjOHlJY29uPVwiYmVsbFwiXG4gICAgICAgICAgPjwvaT5cbiAgICAgICAgPC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwicC10LTggcC1iLTggcC1yLTggbWluLXdpZHRoLTBcIj5cbiAgICAgICAgPHAgY2xhc3M9XCJ0ZXh0LWxhYmVsLXNtYWxsIG0tYi0wIG0tci04XCI+e3sgJ1R5cGUnIHwgdHJhbnNsYXRlIH19PC9wPlxuICAgICAgICA8cFxuICAgICAgICAgIGNsYXNzPVwic21hbGwgdGV4dC10cnVuY2F0ZVwiXG4gICAgICAgICAgdGl0bGU9XCJ7eyBzZWxlY3RlZEFsYXJtLnR5cGUgfX1cIlxuICAgICAgICA+XG4gICAgICAgICAgPGNvZGU+e3sgc2VsZWN0ZWRBbGFybS50eXBlIH19PC9jb2RlPlxuICAgICAgICA8L3A+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPGRpdiBjbGFzcz1cImNvbC14cy0xMiBjb2wtbWQtMTIgcC1iLTE2XCI+XG4gICAgPGRpdiBjbGFzcz1cImJvcmRlci1hbGwgZml0LXcgZC1mbGV4XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwicC04XCI+XG4gICAgICAgIDxpXG4gICAgICAgICAgY2xhc3M9XCJpY29uLTI0IHRleHQtZ3JheS1kYXJrIG0tdC00XCJcbiAgICAgICAgICBkYXRhLWN5PVwiYzh5LWFsYXJtLWRldGFpbHMtLWxhc3QtdXBkYXRlZC1pY29uXCJcbiAgICAgICAgICBjOHlJY29uPVwiY2FsZW5kYXJcIlxuICAgICAgICAgIGRhdGEtY3k9XCJjOHktYWxhcm0tZGV0YWlscy0tbGFzdC11cGRhdGVkLWljb25cIlxuICAgICAgICA+PC9pPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwicC10LTggcC1iLTAgcC1yLTggZmxleC1ncm93XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb250ZW50LWZsZXgtNTBcIj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cImNvbC00IHAtYi04XCJcbiAgICAgICAgICAgICpuZ0lmPVwic2VsZWN0ZWRBbGFybS5jb3VudCA+IDFcIlxuICAgICAgICAgICAgZGF0YS1jeT1cImM4eS1hbGFybS1kZXRhaWxzLS1udW1iZXItb2Ytb2NjdXJyZW5jZXMtd3JhcHBlclwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHAgY2xhc3M9XCJ0ZXh0LWxhYmVsLXNtYWxsIG0tYi0wIG0tci04XCI+e3sgJ051bWJlciBvZiBvY2N1cnJlbmNlcycgfCB0cmFuc2xhdGUgfX08L3A+XG4gICAgICAgICAgICA8cD5cbiAgICAgICAgICAgICAgPHNwYW4gZGF0YS1jeT1cImM4eS1hbGFybS1kZXRhaWxzLS1iYWRnZVwiIGNsYXNzPVwiYmFkZ2UgYmFkZ2UtaW5mb1wiPnt7IHNlbGVjdGVkQWxhcm0uY291bnQgfX08L3NwYW4+XG4gICAgICAgICAgICA8L3A+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJjb2wtNCBwLWItOFwiXG4gICAgICAgICAgICAqbmdJZj1cInNlbGVjdGVkQWxhcm0uY291bnQgPiAxXCJcbiAgICAgICAgICAgIGRhdGEtY3k9XCJjOHktYWxhcm0tZGV0YWlscy0tZmlyc3Qtb2NjdXJyZW5jZS13cmFwcGVyXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8cCBjbGFzcz1cInRleHQtbGFiZWwtc21hbGwgbS1iLTAgbS1yLThcIj57eyAnRmlyc3Qgb2NjdXJyZW5jZScgfCB0cmFuc2xhdGUgfX08L3A+XG4gICAgICAgICAgICA8cCBjbGFzcz1cInNtYWxsXCI+XG4gICAgICAgICAgICAgIHt7IHNlbGVjdGVkQWxhcm0uY3JlYXRpb25UaW1lIHwgYzh5RGF0ZTogJ21lZGl1bScgfX1cblxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJidG4taGVscCBidG4taGVscC0tc21cIlxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ0hlbHAnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICBwb3BvdmVyPVwie3tcbiAgICAgICAgICAgICAgICAgICdUaW1lIGluIHdoaWNoIHRoZSBhbGFybSB3YXMgY3JlYXRlZC4gVGhlIHRpbWUgc2hvd24gY29ycmVzcG9uZHMgdG8gdGhlIHNlcnZlclxcJ3MgdGltZS4gRGV2aWNlIHRpbWUgY2FuIGJlIGRpZmZlcmVudCBmcm9tIHNlcnZlciB0aW1lLidcbiAgICAgICAgICAgICAgICAgICAgfCB0cmFuc2xhdGVcbiAgICAgICAgICAgICAgICB9fVwiXG4gICAgICAgICAgICAgICAgcGxhY2VtZW50PVwicmlnaHRcIlxuICAgICAgICAgICAgICAgIHRyaWdnZXJzPVwiZm9jdXNcIlxuICAgICAgICAgICAgICAgIGNvbnRhaW5lcj1cImJvZHlcIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgICAgICA8L3A+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJjb2wtNCBwLWItOFwiXG4gICAgICAgICAgICBkYXRhLWN5PVwiYzh5LWFsYXJtLWRldGFpbHMtLWxhc3QtdXBkYXRlZC13cmFwcGVyXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8cCBjbGFzcz1cInRleHQtbGFiZWwtc21hbGwgbS1iLTAgbS1yLThcIj57eyAnTGFzdCBvY2N1cnJlbmNlJyB8IHRyYW5zbGF0ZSB9fTwvcD5cbiAgICAgICAgICAgIDxwIGNsYXNzPVwic21hbGxcIj5cbiAgICAgICAgICAgICAge3sgc2VsZWN0ZWRBbGFybS5sYXN0VXBkYXRlZCB8IGM4eURhdGU6ICdtZWRpdW0nIH19XG5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuLWhlbHAgYnRuLWhlbHAtLXNtXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidIZWxwJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgcG9wb3Zlcj1cInt7XG4gICAgICAgICAgICAgICAgICAnVGltZSBpbiB3aGljaCB0aGUgYWxhcm0gd2FzIGxhc3QgdXBkYXRlZC4gVGhlIHRpbWUgc2hvd24gY29ycmVzcG9uZHMgdG8gdGhlIHNlcnZlclxcJ3MgdGltZS4gRGV2aWNlIHRpbWUgY2FuIGJlIGRpZmZlcmVudCBmcm9tIHNlcnZlciB0aW1lLidcbiAgICAgICAgICAgICAgICAgICAgfCB0cmFuc2xhdGVcbiAgICAgICAgICAgICAgICB9fVwiXG4gICAgICAgICAgICAgICAgcGxhY2VtZW50PVwicmlnaHRcIlxuICAgICAgICAgICAgICAgIHRyaWdnZXJzPVwiZm9jdXNcIlxuICAgICAgICAgICAgICAgIGNvbnRhaW5lcj1cImJvZHlcIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgICAgICA8L3A+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDxkaXZcbiAgICBjbGFzcz1cImNvbC14cy0xMiBjb2wtbWQtMTIgcC1iLTE2XCJcbiAgICBkYXRhLWN5PVwiYzh5LWFsYXJtLWRldGFpbHMtLWN1c3RvbS1mcmFnbWVudHMtd3JhcHBlclwiXG4gICAgKm5nSWY9XCJjdXN0b21GcmFnbWVudHNcIlxuICA+XG4gICAgPGRpdiBjbGFzcz1cImJvcmRlci1hbGwgZml0LXcgZC1mbGV4XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwicC04XCI+XG4gICAgICAgIDxpXG4gICAgICAgICAgY2xhc3M9XCJpY29uLTI0IHRleHQtZ3JheS1kYXJrIG0tdC00XCJcbiAgICAgICAgICBjOHlJY29uPVwib3V0Z29pbmctZGF0YVwiXG4gICAgICAgID48L2k+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJwLXQtOCBwLWItMCBwLXItOCBmbGV4LWdyb3dcIlxuICAgICAgICBkYXRhLWN5PVwiYWxhcm0tZGV0YWlscy1jdXN0b20tZGF0YVwiXG4gICAgICA+XG4gICAgICAgIDxwIGNsYXNzPVwidGV4dC1sYWJlbC1zbWFsbCBtLWItNCBtLXItOFwiPnt7ICdDdXN0b20gZGF0YScgfCB0cmFuc2xhdGUgfX08L3A+XG4gICAgICAgIDxwcmU+PGNvZGU+e3sgY3VzdG9tRnJhZ21lbnRzIHwganNvbiB9fTwvY29kZT48L3ByZT5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuXG48ZGl2IGNsYXNzPVwiZC1mbGV4IGZsZXgtd3JhcCBnYXAtOFwiPlxuICA8YnV0dG9uXG4gICAgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHQgYnRuLXNtXCJcbiAgICBbdGl0bGVdPVwiJ1JlbG9hZCBhdWRpdCBsb2dzJyB8IHRyYW5zbGF0ZVwiXG4gICAgdHlwZT1cInN1Ym1pdFwiXG4gICAgKGNsaWNrKT1cInJlbG9hZEF1ZGl0TG9nKHRydWUsIHRydWUpXCJcbiAgICBkYXRhLWN5PVwiYzh5LWFsYXJtcy1kZXRhaWxzLS1yZWxvYWQtYXVkaXQtbG9nc1wiXG4gID5cbiAgICA8aVxuICAgICAgYzh5SWNvbj1cInJlZnJlc2hcIlxuICAgICAgW25nQ2xhc3NdPVwieyAnaWNvbi1zcGluJzogaXNMb2FkaW5nIH1cIlxuICAgID48L2k+XG4gICAge3sgJ1JlbG9hZCBhdWRpdCBsb2dzJyB8IHRyYW5zbGF0ZSB9fVxuICA8L2J1dHRvbj5cblxuICA8YnV0dG9uXG4gICAgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHQgYnRuLXNtXCJcbiAgICBbdGl0bGVdPVwiXG4gICAgICBzZWxlY3RlZEFsYXJtLnN0YXR1cyAhPT0gQUNLTk9XTEVER0VEX1NUQVRVU19WQUxVRVxuICAgICAgICA/IChBQ0tOT1dMRURHRV9MQUJFTCB8IHRyYW5zbGF0ZSlcbiAgICAgICAgOiAoUkVBQ1RJVkFURV9MQUJFTCB8IHRyYW5zbGF0ZSlcbiAgICBcIlxuICAgIHR5cGU9XCJzdWJtaXRcIlxuICAgIChjbGljayk9XCJcbiAgICAgIG9uVXBkYXRlRGV0YWlscyhcbiAgICAgICAgc2VsZWN0ZWRBbGFybS5zdGF0dXMgIT09IEFDS05PV0xFREdFRF9TVEFUVVNfVkFMVUVcbiAgICAgICAgICA/IEFDS05PV0xFREdFRF9TVEFUVVNfVkFMVUVcbiAgICAgICAgICA6IEFDVElWRV9TVEFUVVNfVkFMVUVcbiAgICAgIClcbiAgICBcIlxuICAgIFtkaXNhYmxlZF09XCJzZWxlY3RlZEFsYXJtLnN0YXR1cyA9PT0gQ0xFQVJFRF9TVEFUVVNfVkFMVUUgfHwgaXNBbGFybVN0YXR1c0NoYW5naW5nXCJcbiAgPlxuICAgIDxpXG4gICAgICBbYzh5SWNvbl09XCJzZWxlY3RlZEFsYXJtLnN0YXR1cyAhPT0gQUNLTk9XTEVER0VEX1NUQVRVU19WQUxVRSA/IEJFTExfU0xBU0hfSUNPTiA6IEJFTExfSUNPTlwiXG4gICAgPjwvaT5cbiAgICB7e1xuICAgICAgc2VsZWN0ZWRBbGFybS5zdGF0dXMgIT09IEFDS05PV0xFREdFRF9TVEFUVVNfVkFMVUVcbiAgICAgICAgPyAoQUNLTk9XTEVER0VfTEFCRUwgfCB0cmFuc2xhdGUpXG4gICAgICAgIDogKFJFQUNUSVZBVEVfTEFCRUwgfCB0cmFuc2xhdGUpXG4gICAgfX1cbiAgPC9idXR0b24+XG5cbiAgPGJ1dHRvblxuICAgIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0IGJ0bi1zbVwiXG4gICAgW3RpdGxlXT1cIidDcmVhdGUgc21hcnQgcnVsZScgfCB0cmFuc2xhdGVcIlxuICAgIHR5cGU9XCJzdWJtaXRcIlxuICAgICpuZ0lmPVwiaXNDcmVhdGVTbWFydFJ1bGVzQnV0dG9uQXZhaWxhYmxlXCJcbiAgICAoY2xpY2spPVwiY3JlYXRlU21hcnRSdWxlKClcIlxuICAgIGRhdGEtY3k9XCJjOHktYWxhcm1zLWRldGFpbHMtLWNyZWF0ZS1zbWFydC1ydWxlXCJcbiAgPlxuICAgIDxpIGM4eUljb249XCJjOHktaWNvbiBjOHktaWNvbi1zbWFydC1ydWxlc1wiPjwvaT5cbiAgICB7eyAnQ3JlYXRlIHNtYXJ0IHJ1bGUnIHwgdHJhbnNsYXRlIH19XG4gIDwvYnV0dG9uPlxuICA8YnV0dG9uXG4gICAgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHQgYnRuLXNtXCJcbiAgICBbdGl0bGVdPVwiJ0NsZWFyYGFsYXJtYCcgfCB0cmFuc2xhdGVcIlxuICAgIHR5cGU9XCJzdWJtaXRcIlxuICAgIGRhdGEtY3k9XCJjOHktYWxhcm0tZGV0YWlscy0tY2xlYXItYWxhcm1cIlxuICAgIChjbGljayk9XCJvblVwZGF0ZURldGFpbHMoQ0xFQVJFRF9TVEFUVVNfVkFMVUUpXCJcbiAgICBbZGlzYWJsZWRdPVwic2VsZWN0ZWRBbGFybS5zdGF0dXMgPT09IENMRUFSRURfU1RBVFVTX1ZBTFVFXCJcbiAgPlxuICAgIDxpIGM4eUljb249XCJjOHktYWxlcnQtaWRsZVwiPjwvaT5cbiAgICB7eyAnQ2xlYXJgYWxhcm1gJyB8IHRyYW5zbGF0ZSB9fVxuICA8L2J1dHRvbj5cblxuICA8YnV0dG9uXG4gICAgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHQgYnRuLXNtXCJcbiAgICBbdGl0bGVdPVwiYnV0dG9uLnRpdGxlIHwgdHJhbnNsYXRlXCJcbiAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAqbmdGb3I9XCJsZXQgYnV0dG9uIG9mIHNlbGVjdGVkQWxhcm0gfCBhbGFybURldGFpbHNCdXR0b246IHNlbGVjdGVkQWxhcm1NTyB8IGFzeW5jXCJcbiAgICBbbmdDbGFzc109XCJidXR0b24uYWRkaXRpb25hbEJ1dHRvbkNsYXNzZXNcIlxuICAgIChjbGljayk9XCJkZXRhaWxzQnV0dG9uQWN0aW9uKGJ1dHRvbiwgc2VsZWN0ZWRBbGFybSlcIlxuICAgIFtkaXNhYmxlZF09XCJidXR0b24uZGlzYWJsZWRcIlxuICA+XG4gICAgPGlcbiAgICAgIFtjOHlJY29uXT1cImJ1dHRvbi5pY29uXCJcbiAgICAgIFtuZ0NsYXNzXT1cImJ1dHRvbi5hZGRpdGlvbmFsSWNvbkNsYXNzZXNcIlxuICAgID48L2k+XG4gICAgPHNwYW4gKm5nSWY9XCJidXR0b24ubGFiZWxcIj57eyBidXR0b24ubGFiZWwgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gIDwvYnV0dG9uPlxuPC9kaXY+XG5cbjxuZy10ZW1wbGF0ZSAjbm9BdWRpdExvZ0F2YWlsYWJsZT5cbiAgPGRpdiBjbGFzcz1cInAtMTZcIj5cbiAgICA8Yzh5LXVpLWVtcHR5LXN0YXRlXG4gICAgICBbaWNvbl09XCInYXJjaGl2ZSdcIlxuICAgICAgW3RpdGxlXT1cIidObyBhdWRpdCBsb2dzIGZvdW5kLicgfCB0cmFuc2xhdGVcIlxuICAgICAgW2hvcml6b250YWxdPVwidHJ1ZVwiXG4gICAgPjwvYzh5LXVpLWVtcHR5LXN0YXRlPlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxkaXYgY2xhc3M9XCJsZWdlbmQgZm9ybS1ibG9ja1wiPnt7ICdBdWRpdCBsb2dzJyB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxuXG48bmctY29udGFpbmVyICpuZ0lmPVwiaXNMb2FkaW5nIHx8IGF1ZGl0TG9nPy5kYXRhLmxlbmd0aDsgZWxzZSBub0F1ZGl0TG9nQXZhaWxhYmxlXCI+XG4gIDxjOHktbG9hZGluZyAqbmdJZj1cImlzTG9hZGluZ1wiPjwvYzh5LWxvYWRpbmc+XG5cbiAgPGM4eS1saXN0LWdyb3VwXG4gICAgZGF0YS1jeT1cImM4eS1hbGFybXMtZGV0YWlscy0tYXVkaXQtbG9nc1wiXG4gICAgKm5nSWY9XCIhaXNMb2FkaW5nXCJcbiAgPlxuICAgIDxjOHktbGktdGltZWxpbmUgKmM4eUZvcj1cImxldCBsb2cgb2YgYXVkaXRMb2c7IGxvYWRNb3JlOiAnaGlkZGVuJ1wiPlxuICAgICAge3sgbG9nLmNyZWF0aW9uVGltZSB8IGRhdGU6ICdtZWRpdW1EYXRlJyB9fVxuICAgICAge3sgbG9nLmNyZWF0aW9uVGltZSB8IGRhdGU6ICdtZWRpdW1UaW1lJyB9fVxuICAgICAgPGM4eS1saT5cbiAgICAgICAgPGM4eS1saS1ib2R5PlxuICAgICAgICAgIDxwIGNsYXNzPVwidGV4dC10cnVuY2F0ZS13cmFwIHNlcGFyYXRvci1ib3R0b20gcC1iLTRcIj5cbiAgICAgICAgICAgIHt7IGxvZyB8IGF1ZGl0Q2hhbmdlc01lc3NhZ2UgfX1cbiAgICAgICAgICA8L3A+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImM4eS1saXN0X19pdGVtX19mb290ZXJcIj5cbiAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgIGNsYXNzPVwibS1yLTE2IHNtYWxsXCJcbiAgICAgICAgICAgICAgKm5nSWY9XCJsb2cudXNlclwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1sYWJlbC1zbWFsbFwiPlxuICAgICAgICAgICAgICAgIHt7ICdieWB1c2VyYCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICB7eyBsb2cudXNlciB9fVxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzbWFsbFwiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtbGFiZWwtc21hbGxcIj5cbiAgICAgICAgICAgICAgICB7eyAnZGV2aWNlIHRpbWUnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAge3sgbG9nLnRpbWUgfCBjOHlEYXRlOiAnbWVkaXVtJyB9fVxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2M4eS1saS1ib2R5PlxuICAgICAgPC9jOHktbGk+XG4gICAgPC9jOHktbGktdGltZWxpbmU+XG4gIDwvYzh5LWxpc3QtZ3JvdXA+XG48L25nLWNvbnRhaW5lcj5cbiJdfQ==