@c8y/ngx-components 1019.2.4 → 1019.2.9

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 (170) hide show
  1. package/NOTICES +26 -0
  2. package/core/common/forOf.directive.d.ts +10 -1
  3. package/core/common/forOf.directive.d.ts.map +1 -1
  4. package/core/common/geo.service.d.ts +9 -0
  5. package/core/common/geo.service.d.ts.map +1 -0
  6. package/core/common/index.d.ts +1 -0
  7. package/core/common/index.d.ts.map +1 -1
  8. package/core/common/load-more.component.d.ts +1 -0
  9. package/core/common/load-more.component.d.ts.map +1 -1
  10. package/core/core.module.d.ts +50 -49
  11. package/core/core.module.d.ts.map +1 -1
  12. package/core/index.d.ts +1 -0
  13. package/core/index.d.ts.map +1 -1
  14. package/core/realtime/realtime-button.component.d.ts +5 -2
  15. package/core/realtime/realtime-button.component.d.ts.map +1 -1
  16. package/core/router/context-route.service.d.ts +6 -5
  17. package/core/router/context-route.service.d.ts.map +1 -1
  18. package/core/time-interval/index.d.ts +3 -0
  19. package/core/time-interval/index.d.ts.map +1 -0
  20. package/core/time-interval/time-interval.component.d.ts +26 -0
  21. package/core/time-interval/time-interval.component.d.ts.map +1 -0
  22. package/core/time-interval/time-interval.model.d.ts +33 -0
  23. package/core/time-interval/time-interval.model.d.ts.map +1 -0
  24. package/esm2022/context-dashboard/report-dashboard/report-dashboard-list.component.mjs +1 -1
  25. package/esm2022/core/audit-log/audit-log.component.mjs +1 -1
  26. package/esm2022/core/bootstrap/bootstrap.component.mjs +3 -3
  27. package/esm2022/core/common/forOf.directive.mjs +18 -2
  28. package/esm2022/core/common/geo.service.mjs +30 -0
  29. package/esm2022/core/common/index.mjs +2 -1
  30. package/esm2022/core/common/load-more.component.mjs +5 -2
  31. package/esm2022/core/core.module.mjs +11 -7
  32. package/esm2022/core/dynamic-forms/typeahead/typeahead.type.component.mjs +1 -1
  33. package/esm2022/core/index.mjs +2 -1
  34. package/esm2022/core/realtime/realtime-button.component.mjs +10 -4
  35. package/esm2022/core/router/context-route.service.mjs +10 -4
  36. package/esm2022/core/search/search-input.component.mjs +1 -1
  37. package/esm2022/core/time-interval/index.mjs +3 -0
  38. package/esm2022/core/time-interval/time-interval.component.mjs +85 -0
  39. package/esm2022/core/time-interval/time-interval.model.mjs +54 -0
  40. package/esm2022/datapoint-library/list/datapoint-library-list.component.mjs +2 -2
  41. package/esm2022/datapoint-selector/datapoint-selector-list-item/datapoint-selector-list-item.component.mjs +1 -1
  42. package/esm2022/device-profile/device-profile-list.component.mjs +1 -1
  43. package/esm2022/device-profile/device-tab-profile/device-tab-profile.component.mjs +1 -1
  44. package/esm2022/device-shell/shell/shell.component.mjs +1 -1
  45. package/esm2022/diagnostics/diagnostics.component.mjs +1 -1
  46. package/esm2022/ecosystem/applications/install-from-package/install-from-package.component.mjs +1 -1
  47. package/esm2022/ecosystem/shared/package-version-select/package-version-select.component.mjs +1 -1
  48. package/esm2022/location/location.component.mjs +1 -1
  49. package/esm2022/map/cluster-map.component.mjs +7 -7
  50. package/esm2022/map/map.component.mjs +92 -36
  51. package/esm2022/map/map.model.mjs +3 -2
  52. package/esm2022/operations/bulk-operations-list/bulk-operations-list.component.mjs +1 -1
  53. package/esm2022/operations/bulk-single-operations-list/single-operations-list.component.mjs +1 -1
  54. package/esm2022/operations/operations-list/operations-list.component.mjs +1 -1
  55. package/esm2022/operations/operations-timeline/operations-timeline.component.mjs +1 -1
  56. package/esm2022/operations/stepper-bulk-type-configuration/stepper-bulk-type-configuration.component.mjs +1 -1
  57. package/esm2022/operations/stepper-bulk-type-device-profile/select-device-profile-step.component.mjs +1 -1
  58. package/esm2022/operations/stepper-bulk-type-firmware/select-firmware.component.mjs +1 -1
  59. package/esm2022/operations/stepper-bulk-type-firmware/version-or-patch.component.mjs +1 -1
  60. package/esm2022/operations/stepper-bulk-type-software/select-software-step.component.mjs +1 -1
  61. package/esm2022/protocol-lpwan/lpwan-set-connections.component.mjs +1 -1
  62. package/esm2022/protocol-lpwan/lpwan-set-device-protocol.component.mjs +1 -1
  63. package/esm2022/repository/configuration/list/configuration-detail.component.mjs +1 -1
  64. package/esm2022/repository/configuration/list/configuration-list.component.mjs +1 -1
  65. package/esm2022/repository/firmware/list/add-firmware-modal.component.mjs +1 -1
  66. package/esm2022/repository/firmware/list/add-firmware-patch-modal.component.mjs +1 -1
  67. package/esm2022/repository/firmware/list/firmware-details.component.mjs +1 -1
  68. package/esm2022/repository/firmware/list/firmware-list.component.mjs +1 -1
  69. package/esm2022/repository/shared/software-type/software-type.component.mjs +1 -1
  70. package/esm2022/repository/software/device-tab/device-software-list.component.mjs +1 -1
  71. package/esm2022/repository/software/list/add-software-modal.component.mjs +1 -1
  72. package/esm2022/repository/software/list/columns/software-type.filtering-form-renderer.component.mjs +1 -1
  73. package/esm2022/repository/software/list/software-details.component.mjs +1 -1
  74. package/esm2022/sub-assets/location/asset-location.component.mjs +1 -1
  75. package/esm2022/tracking/c8y-ngx-components-tracking.mjs +5 -0
  76. package/esm2022/tracking/index.mjs +6 -0
  77. package/esm2022/tracking/tracking-marker-popup.component.mjs +34 -0
  78. package/esm2022/tracking/tracking-tab.guard.mjs +25 -0
  79. package/esm2022/tracking/tracking.component.mjs +92 -0
  80. package/esm2022/tracking/tracking.feature.mjs +16 -0
  81. package/esm2022/tracking/tracking.service.mjs +124 -0
  82. package/esm2022/trusted-certificates/crl/crl-settings.component.mjs +5 -5
  83. package/esm2022/trusted-certificates/list/trusted-certificate-list.component.mjs +1 -1
  84. package/esm2022/widgets/implementations/map/map-widget-config.component.mjs +2 -2
  85. package/fesm2022/c8y-ngx-components-context-dashboard.mjs +1 -1
  86. package/fesm2022/c8y-ngx-components-context-dashboard.mjs.map +1 -1
  87. package/fesm2022/c8y-ngx-components-datapoint-library-list.mjs +1 -1
  88. package/fesm2022/c8y-ngx-components-datapoint-library-list.mjs.map +1 -1
  89. package/fesm2022/c8y-ngx-components-datapoint-selector.mjs +1 -1
  90. package/fesm2022/c8y-ngx-components-datapoint-selector.mjs.map +1 -1
  91. package/fesm2022/c8y-ngx-components-device-profile.mjs +2 -2
  92. package/fesm2022/c8y-ngx-components-device-profile.mjs.map +1 -1
  93. package/fesm2022/c8y-ngx-components-device-shell.mjs +1 -1
  94. package/fesm2022/c8y-ngx-components-device-shell.mjs.map +1 -1
  95. package/fesm2022/c8y-ngx-components-diagnostics.mjs +1 -1
  96. package/fesm2022/c8y-ngx-components-diagnostics.mjs.map +1 -1
  97. package/fesm2022/c8y-ngx-components-ecosystem-shared.mjs +1 -1
  98. package/fesm2022/c8y-ngx-components-ecosystem-shared.mjs.map +1 -1
  99. package/fesm2022/c8y-ngx-components-ecosystem.mjs +1 -1
  100. package/fesm2022/c8y-ngx-components-ecosystem.mjs.map +1 -1
  101. package/fesm2022/c8y-ngx-components-location.mjs +1 -1
  102. package/fesm2022/c8y-ngx-components-location.mjs.map +1 -1
  103. package/fesm2022/c8y-ngx-components-map.mjs +95 -38
  104. package/fesm2022/c8y-ngx-components-map.mjs.map +1 -1
  105. package/fesm2022/c8y-ngx-components-operations-bulk-operations-list.mjs +1 -1
  106. package/fesm2022/c8y-ngx-components-operations-bulk-operations-list.mjs.map +1 -1
  107. package/fesm2022/c8y-ngx-components-operations-bulk-single-operations-list.mjs +1 -1
  108. package/fesm2022/c8y-ngx-components-operations-bulk-single-operations-list.mjs.map +1 -1
  109. package/fesm2022/c8y-ngx-components-operations-operations-list.mjs +1 -1
  110. package/fesm2022/c8y-ngx-components-operations-operations-list.mjs.map +1 -1
  111. package/fesm2022/c8y-ngx-components-operations-operations-timeline.mjs +1 -1
  112. package/fesm2022/c8y-ngx-components-operations-operations-timeline.mjs.map +1 -1
  113. package/fesm2022/c8y-ngx-components-operations-stepper-bulk-type-configuration.mjs +1 -1
  114. package/fesm2022/c8y-ngx-components-operations-stepper-bulk-type-configuration.mjs.map +1 -1
  115. package/fesm2022/c8y-ngx-components-operations-stepper-bulk-type-device-profile.mjs +1 -1
  116. package/fesm2022/c8y-ngx-components-operations-stepper-bulk-type-device-profile.mjs.map +1 -1
  117. package/fesm2022/c8y-ngx-components-operations-stepper-bulk-type-firmware.mjs +2 -2
  118. package/fesm2022/c8y-ngx-components-operations-stepper-bulk-type-firmware.mjs.map +1 -1
  119. package/fesm2022/c8y-ngx-components-operations-stepper-bulk-type-software.mjs +1 -1
  120. package/fesm2022/c8y-ngx-components-operations-stepper-bulk-type-software.mjs.map +1 -1
  121. package/fesm2022/c8y-ngx-components-protocol-lpwan.mjs +2 -2
  122. package/fesm2022/c8y-ngx-components-protocol-lpwan.mjs.map +1 -1
  123. package/fesm2022/c8y-ngx-components-repository-configuration.mjs +2 -2
  124. package/fesm2022/c8y-ngx-components-repository-configuration.mjs.map +1 -1
  125. package/fesm2022/c8y-ngx-components-repository-firmware.mjs +4 -4
  126. package/fesm2022/c8y-ngx-components-repository-firmware.mjs.map +1 -1
  127. package/fesm2022/c8y-ngx-components-repository-shared.mjs +1 -1
  128. package/fesm2022/c8y-ngx-components-repository-shared.mjs.map +1 -1
  129. package/fesm2022/c8y-ngx-components-repository-software.mjs +4 -4
  130. package/fesm2022/c8y-ngx-components-repository-software.mjs.map +1 -1
  131. package/fesm2022/c8y-ngx-components-sub-assets.mjs +1 -1
  132. package/fesm2022/c8y-ngx-components-sub-assets.mjs.map +1 -1
  133. package/fesm2022/c8y-ngx-components-tracking.mjs +271 -0
  134. package/fesm2022/c8y-ngx-components-tracking.mjs.map +1 -0
  135. package/fesm2022/c8y-ngx-components-trusted-certificates.mjs +5 -5
  136. package/fesm2022/c8y-ngx-components-trusted-certificates.mjs.map +1 -1
  137. package/fesm2022/c8y-ngx-components-widgets-implementations-map.mjs +1 -1
  138. package/fesm2022/c8y-ngx-components-widgets-implementations-map.mjs.map +1 -1
  139. package/fesm2022/c8y-ngx-components.mjs +204 -16
  140. package/fesm2022/c8y-ngx-components.mjs.map +1 -1
  141. package/locales/de.po +158 -83
  142. package/locales/en.po +6 -0
  143. package/locales/es.po +361 -205
  144. package/locales/fr.po +342 -186
  145. package/locales/locales.pot +40 -7
  146. package/locales/nl.po +326 -170
  147. package/locales/pl.po +60 -59
  148. package/locales/pt_BR.po +342 -186
  149. package/map/cluster-map.component.d.ts +3 -3
  150. package/map/cluster-map.component.d.ts.map +1 -1
  151. package/map/map.component.d.ts +17 -7
  152. package/map/map.component.d.ts.map +1 -1
  153. package/map/map.model.d.ts +14 -6
  154. package/map/map.model.d.ts.map +1 -1
  155. package/package.json +1 -1
  156. package/tracking/c8y-ngx-components-tracking.d.ts.map +1 -0
  157. package/tracking/index.d.ts +6 -0
  158. package/tracking/index.d.ts.map +1 -0
  159. package/tracking/tracking-marker-popup.component.d.ts +17 -0
  160. package/tracking/tracking-marker-popup.component.d.ts.map +1 -0
  161. package/tracking/tracking-tab.guard.d.ts +12 -0
  162. package/tracking/tracking-tab.guard.d.ts.map +1 -0
  163. package/tracking/tracking.component.d.ts +33 -0
  164. package/tracking/tracking.component.d.ts.map +1 -0
  165. package/tracking/tracking.feature.d.ts +3 -0
  166. package/tracking/tracking.feature.d.ts.map +1 -0
  167. package/tracking/tracking.service.d.ts +38 -0
  168. package/tracking/tracking.service.d.ts.map +1 -0
  169. package/trusted-certificates/crl/crl-settings.component.d.ts +1 -1
  170. package/trusted-certificates/crl/crl-settings.component.d.ts.map +1 -1
@@ -20,7 +20,7 @@ export class CrlSettingsComponent {
20
20
  this.droppedFiles = [];
21
21
  this.today = new Date();
22
22
  this.MANUAL_ENTRY_POPOVER = gettext('In this section, you can override or add individual entries to the Certificate Revocation List. Providing the serial number is mandatory. In case the revocation date is not set, it will be configured to the current date.');
23
- this.FILE_UPLOAD_POPOVER = gettext('In this section, you can upload a file containing a revocation list for certificates. The file must be in CSV format, and it should include the serial number and revocation date. If the revocation date is empty, it will be set to the current date.');
23
+ this.FILE_UPLOAD_POPOVER = gettext('In this section, you can upload a file with the list of certificates to be revoked. The file must be in CSV format, and it should include the serial number and revocation date. If the revocation date is empty, it will be set to the current date.');
24
24
  }
25
25
  async downloadCrl() {
26
26
  let arrayBuffer;
@@ -74,9 +74,9 @@ export class CrlSettingsComponent {
74
74
  const isOverrideManualEntries = !this.isListEmpty && this.isFileDropped;
75
75
  const status = isOverrideManualEntries ? Status.DANGER : Status.WARNING;
76
76
  const body = isOverrideManualEntries
77
- ? gettext('You are about to update certificate revocation list. The CRL file content will override manual entries. Do you want to proceed?')
78
- : gettext('You are about to update certificate revocation list. Do you want to proceed?');
79
- await this.modalService.confirm(gettext('Update certificate revocation list'), body, status, {
77
+ ? gettext('You are about to update the Certificate Revocation List. The CRL file content will override manual entries. Do you want to proceed?')
78
+ : gettext('You are about to update the Certificate Revocation List. Do you want to proceed?');
79
+ await this.modalService.confirm(gettext('Update the Certificate Revocation List'), body, status, {
80
80
  ok: gettext('Update')
81
81
  });
82
82
  }
@@ -106,4 +106,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
106
106
  type: Component,
107
107
  args: [{ selector: 'c8y-crl-settings', template: "<c8y-title>{{ 'Trusted certificates' | translate }}</c8y-title>\n\n<c8y-breadcrumb>\n <c8y-breadcrumb-item\n icon=\"c8y-management\"\n label=\"{{ 'Management' | translate }}\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n icon=\"certificate\"\n label=\"{{ 'Trusted certificates' | translate }}\"\n ></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<c8y-crl-check-settings></c8y-crl-check-settings>\n\n<!-- #TODO uncomment when available in documentation -->\n<!-- <c8y-help src=\"/users-guide/device-management/#TODO\"></c8y-help> -->\n\n<form\n class=\"card card--fullpage\"\n #crlManualForm=\"ngForm\"\n novalidate\n>\n <div class=\"card-header separator\">\n <div class=\"card-title\">\n {{ 'CRL offline setup' | translate }}\n </div>\n </div>\n <div class=\"inner-scroll\">\n <div class=\"card-block\">\n <div\n class=\"legend form-block\"\n >\n {{ 'Manual' | translate }}\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ MANUAL_ENTRY_POPOVER | translate }}\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n ></button>\n </div>\n\n <div\n class=\"row tight-grid\"\n *ngFor=\"let certificateRevocation of crls; index as index; last as isLast\"\n >\n <div class=\"col-sm-5\">\n <c8y-form-group>\n <label\n [for]=\"'serialNumber' + index\"\n translate\n >\n Serial number\n </label>\n <input\n class=\"form-control\"\n required\n [name]=\"'serialNumber' + index\"\n [id]=\"'serialNumber' + index\"\n [(ngModel)]=\"certificateRevocation.serialNumberInHex\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: '8ab34fe5476' }\"\n c8yDefaultValidation=\"colonedHexNumber\"\n />\n </c8y-form-group>\n </div>\n <div class=\"col-sm-5\">\n <c8y-form-group class=\"datepicker\">\n <label [for]=\"'validTillPicker' + index\">\n {{ 'Valid till' | translate }}\n </label>\n <input\n class=\"form-control\"\n [attr.aria-label]=\"'Date to' | translate\"\n placeholder=\"{{ 'Date to' | translate }}\"\n [name]=\"'validTillPicker' + index\"\n [id]=\"'validTillPicker' + index\"\n [(ngModel)]=\"certificateRevocation.revocationDate\"\n [bsConfig]=\"{ customTodayClass: 'today' }\"\n bsDatepicker\n [maxDate]=\"today\"\n />\n </c8y-form-group>\n </div>\n <div class=\"col-sm-2\">\n <c8y-form-group>\n <div class=\"p-t-24\">\n <button\n *ngIf=\"crls.length > 1\"\n class=\"btn btn-link hidden-xs hidden-sm\"\n title=\"{{ 'Remove' | translate }}\"\n type=\"button\"\n (click)=\"removeCertificateRevocation(certificateRevocation)\"\n >\n <i\n class=\"text-danger\"\n c8yIcon=\"minus-circle\"\n ></i>\n </button>\n <button\n class=\"btn btn-link hidden-xs hidden-sm\"\n title=\"{{ 'Add' | translate }}\"\n type=\"button\"\n (click)=\"addCertificateRevocation()\"\n *ngIf=\"isLast\"\n >\n <i\n class=\"text-primary\"\n c8yIcon=\"plus-circle\"\n ></i>\n </button>\n\n <button\n *ngIf=\"crls.length > 1\"\n class=\"btn btn-danger btn-block btn-sm visible-xs visible-sm\"\n title=\"{{ 'Remove' | translate }}\"\n type=\"button\"\n (click)=\"removeCertificateRevocation(certificateRevocation)\"\n >\n <i c8yIcon=\"minus-circle\"></i>\n {{ 'Remove' | translate }}\n </button>\n <button\n class=\"btn btn-primary btn-block btn-sm visible-xs visible-sm\"\n title=\"{{ 'Add' | translate }}\"\n type=\"button\"\n (click)=\"addCertificateRevocation()\"\n *ngIf=\"isLast\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Add' | translate }}\n </button>\n </div>\n </c8y-form-group>\n </div>\n </div>\n <div class=\"legend form-block center\">\n {{ 'or' | translate }}\n </div>\n <div\n class=\"legend form-block\"\n >\n {{ 'File upload' | translate }}\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ FILE_UPLOAD_POPOVER | translate }}\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n ></button>\n </div>\n\n <c8y-drop-area\n class=\"drop-area-sm\"\n [title]=\"'Upload CRL file (.csv format)' | translate\"\n name=\"uploadCrlDropArea\"\n [(ngModel)]=\"droppedFiles\"\n [message]=\"'Upload CRL file (.csv format)' | translate\"\n [loadingMessage]=\"'Uploading\u2026' | translate\"\n [accept]=\"'.csv'\"\n [maxAllowedFiles]=\"1\"\n ></c8y-drop-area>\n <p class=\"help-block has-info text-muted m-t-4\">\n {{ 'CRL file content will override manual entries.' | translate }}\n </p>\n\n <button\n class=\"btn btn-sm btn-default m-t-16\"\n title=\"{{ 'Download template' | translate }}\"\n type=\"button\"\n (click)=\"downloadCrlTemplate()\"\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"template\"\n ></i>\n {{ 'Download template' | translate }}\n </button>\n </div>\n </div>\n <div class=\"card-footer separator\">\n <button\n class=\"btn btn-default\"\n title=\"{{ 'Download CRL file' | translate }}\"\n type=\"button\"\n (click)=\"downloadCrl()\"\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"download\"\n ></i>\n {{ 'Download CRL file' | translate }}\n </button>\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Save' | translate }}\"\n type=\"submit\"\n (click)=\"save()\"\n [disabled]=\"!(crlManualForm.form.valid || isListEmpty) || (isListEmpty && !isFileDropped)\"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n</form>\n" }]
108
108
  }], ctorParameters: function () { return [{ type: i1.CrlService }, { type: i2.AlertService }, { type: i2.ModalService }]; } });
109
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JsLXNldHRpbmdzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3RydXN0ZWQtY2VydGlmaWNhdGVzL2NybC9jcmwtc2V0dGluZ3MuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vdHJ1c3RlZC1jZXJ0aWZpY2F0ZXMvY3JsL2NybC1zZXR0aW5ncy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQzFDLE9BQU8sRUFBRSxVQUFVLEVBQTBCLE1BQU0sYUFBYSxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxZQUFZLEVBQWUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUMvRixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sWUFBWSxDQUFDOzs7Ozs7Ozs7QUFNcEMsTUFBTSxPQUFPLG9CQUFvQjtJQWEvQixZQUNVLFVBQXNCLEVBQ3RCLFlBQTBCLEVBQzFCLFlBQTBCO1FBRjFCLGVBQVUsR0FBVixVQUFVLENBQVk7UUFDdEIsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIsaUJBQVksR0FBWixZQUFZLENBQWM7UUFmcEMsU0FBSSxHQUE2QixDQUFDLElBQUksQ0FBQyw2QkFBNkIsRUFBRSxDQUFDLENBQUM7UUFDeEUsaUJBQVksR0FBa0IsRUFBRSxDQUFDO1FBQ2pDLFVBQUssR0FBUyxJQUFJLElBQUksRUFBRSxDQUFDO1FBRXpCLHlCQUFvQixHQUFHLE9BQU8sQ0FDNUIsOE5BQThOLENBQy9OLENBQUM7UUFFRix3QkFBbUIsR0FBRyxPQUFPLENBQzNCLHlQQUF5UCxDQUMxUCxDQUFDO0lBTUMsQ0FBQztJQUVKLEtBQUssQ0FBQyxXQUFXO1FBQ2YsSUFBSSxXQUF3QixDQUFDO1FBQzdCLElB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RUFBRTtZQUMzRixFQUFFLEVBQUUsT0FBTyxDQUFDLFFBQVEsQ0FBQztTQUN0QixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sY0FBYztRQUNwQixJQUFJLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLDZCQUE2QixFQUFFLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBRU8sS0FBSyxDQUFDLFFBQVE7UUFDcEIsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDckIsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDN0M7SUFDSCxDQUFDO0lBRU8sS0FBSyxDQUFDLGFBQWE7UUFDekIsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQ3RCLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNoRTtJQUNILENBQUM7SUFFTyw2QkFBNkI7UUFDbkMsT0FBTztZQUNMLGlCQUFpQixFQUFFLEVBQUU7U0FDdEIsQ0FBQztJQUNKLENBQUM7K0dBM0dVLG9CQUFvQjttR0FBcEIsb0JBQW9CLHdEQ1ZqQywyc05BZ05BOzs0RkR0TWEsb0JBQW9CO2tCQUpoQyxTQUFTOytCQUNFLGtCQUFrQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgaXNFbXB0eSwgcHVsbCB9IGZyb20gJ2xvZGFzaC1lcyc7XG5pbXBvcnQgeyBDcmxTZXJ2aWNlLCBJQ2VydGlmaWNhdGVSZXZvY2F0aW9uIH0gZnJvbSAnQGM4eS9jbGllbnQnO1xuaW1wb3J0IHsgQWxlcnRTZXJ2aWNlLCBEcm9wcGVkRmlsZSwgZ2V0dGV4dCwgTW9kYWxTZXJ2aWNlLCBTdGF0dXMgfSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzJztcbmltcG9ydCB7IHNhdmVBcyB9IGZyb20gJ2ZpbGUtc2F2ZXInO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjOHktY3JsLXNldHRpbmdzJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2NybC1zZXR0aW5ncy5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgQ3JsU2V0dGluZ3NDb21wb25lbnQge1xuICBjcmxzOiBJQ2VydGlmaWNhdGVSZXZvY2F0aW9uW10gPSBbdGhpcy5nZXRFbXB0eUNlcnRpZmljYXRlUmV2b2NhdGlvbigpXTtcbiAgZHJvcHBlZEZpbGVzOiBEcm9wcGVkRmlsZVtdID0gW107XG4gIHRvZGF5OiBEYXRlID0gbmV3IERhdGUoKTtcblxuICBNQU5VQUxfRU5UUllfUE9QT1ZFUiA9IGdldHRleHQoXG4gICAgJ0luIHRoaXMgc2VjdGlvbiwgeW91IGNhbiBvdmVycmlkZSBvciBhZGQgaW5kaXZpZHVhbCBlbnRyaWVzIHRvIHRoZSBDZXJ0aWZpY2F0ZSBSZXZvY2F0aW9uIExpc3QuIFByb3ZpZGluZyB0aGUgc2VyaWFsIG51bWJlciBpcyBtYW5kYXRvcnkuIEluIGNhc2UgdGhlIHJldm9jYXRpb24gZGF0ZSBpcyBub3Qgc2V0LCBpdCB3aWxsIGJlIGNvbmZpZ3VyZWQgdG8gdGhlIGN1cnJlbnQgZGF0ZS4nXG4gICk7XG5cbiAgRklMRV9VUExPQURfUE9QT1ZFUiA9IGdldHRleHQoXG4gICAgJ0luIHRoaXMgc2VjdGlvbiwgeW91IGNhbiB1cGxvYWQgYSBmaWxlIGNvbnRhaW5pbmcgYSByZXZvY2F0aW9uIGxpc3QgZm9yIGNlcnRpZmljYXRlcy4gVGhlIGZpbGUgbXVzdCBiZSBpbiBDU1YgZm9ybWF0LCBhbmQgaXQgc2hvdWxkIGluY2x1ZGUgdGhlIHNlcmlhbCBudW1iZXIgYW5kIHJldm9jYXRpb24gZGF0ZS4gSWYgdGhlIHJldm9jYXRpb24gZGF0ZSBpcyBlbXB0eSwgaXQgd2lsbCBiZSBzZXQgdG8gdGhlIGN1cnJlbnQgZGF0ZS4nXG4gICk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBjcmxTZXJ2aWNlOiBDcmxTZXJ2aWNlLFxuICAgIHByaXZhdGUgYWxlcnRTZXJ2aWNlOiBBbGVydFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBtb2RhbFNlcnZpY2U6IE1vZGFsU2VydmljZVxuICApIHt9XG5cbiAgYXN5bmMgZG93bmxvYWRDcmwoKSB7XG4gICAgbGV0IGFycmF5QnVmZmVyOiBBcnJheUJ1ZmZlcjtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5jcmxTZXJ2aWNlLmRvd25sb2FkQ3JsRmlsZSgpO1xuICAgICAgYXJyYXlCdWZmZXIgPSBhd2FpdCByZXMuYXJyYXlCdWZmZXIoKTtcbiAgICAgIGNvbnN0IGZpbGVCaW5hcnkgPSBuZXcgRmlsZShbYXJyYXlCdWZmZXJdLCAnY3VtdWxvY2l0eS5jcmwnLCB7XG4gICAgICAgIHR5cGU6ICdhcHBsaWNhdGlvbi9wa2l4LWNybCdcbiAgICAgIH0pO1xuICAgICAgc2F2ZUFzKGZpbGVCaW5hcnkpO1xuICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICB0aGlzLmFsZXJ0U2VydmljZS5hZGRTZXJ2ZXJGYWlsdXJlKGV4KTtcbiAgICB9XG4gIH1cblxuICBkb3dubG9hZENybFRlbXBsYXRlKCkge1xuICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbYFNFUklBTE5PLERBVEVcXG5TRVJJQUxfTk8xLCR7bmV3IERhdGUoKS50b0lTT1N0cmluZygpfWBdLCB7XG4gICAgICB0eXBlOiAndGV4dC9jc3Y7Y2hhcnNldD11dGYtODsnXG4gICAgfSk7XG4gICAgY29uc3QgZmlsZU5hbWUgPSAnY3JsLXRlbXBsYXRlJztcbiAgICBzYXZlQXMoYmxvYiwgYCR7ZmlsZU5hbWV9LmNzdmApO1xuICB9XG5cbiAgYWRkQ2VydGlmaWNhdGVSZXZvY2F0aW9uKCkge1xuICAgIHRoaXMuY3Jscy5wdXNoKHRoaXMuZ2V0RW1wdHlDZXJ0aWZpY2F0ZVJldm9jYXRpb24oKSk7XG4gIH1cblxuICByZW1vdmVDZXJ0aWZpY2F0ZVJldm9jYXRpb24oY2VydGlmaWNhdGVSZXZvY2F0aW9uKSB7XG4gICAgcHVsbCh0aGlzLmNybHMsIGNlcnRpZmljYXRlUmV2b2NhdGlvbik7XG4gICAgaWYgKHRoaXMuY3Jscy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuYWRkQ2VydGlmaWNhdGVSZXZvY2F0aW9uKCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgc2F2ZSgpIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5jb25maXJtKCk7XG4gICAgICBhd2FpdCB0aGlzLnNhdmVDcmxzKCk7XG4gICAgICBhd2FpdCB0aGlzLnVwbG9hZENybEZpbGUoKTtcbiAgICAgIGF3YWl0IHRoaXMuY2xlYXJTYXZlZERhdGEoKTtcbiAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLnN1Y2Nlc3MoZ2V0dGV4dCgnQ1JMIHNhdmVkLicpKTtcbiAgICB9IGNhdGNoIChlcikge1xuICAgICAgdGhpcy5hbGVydFNlcnZpY2UuYWRkU2VydmVyRmFpbHVyZShlcik7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGlzTGlzdEVtcHR5KCkge1xuICAgIHJldHVybiB0aGlzLmNybHMubGVuZ3RoID09PSAxICYmIGlzRW1wdHkodGhpcy5jcmxzWzBdLnNlcmlhbE51bWJlckluSGV4KTtcbiAgfVxuXG4gIGdldCBpc0ZpbGVEcm9wcGVkKCkge1xuICAgIHJldHVybiAhISh0aGlzLmRyb3BwZWRGaWxlcyAmJiB0aGlzLmRyb3BwZWRGaWxlc1swXSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNvbmZpcm0oKSB7XG4gICAgY29uc3QgaXNPdmVycmlkZU1hbnVhbEVudHJpZXMgPSAhdGhpcy5pc0xpc3RFbXB0eSAmJiB0aGlzLmlzRmlsZURyb3BwZWQ7XG4gICAgY29uc3Qgc3RhdHVzID0gaXNPdmVycmlkZU1hbnVhbEVudHJpZXMgPyBTdGF0dXMuREFOR0VSIDogU3RhdHVzLldBUk5JTkc7XG4gICAgY29uc3QgYm9keSA9IGlzT3ZlcnJpZGVNYW51YWxFbnRyaWVzXG4gICAgICA/IGdldHRleHQoXG4gICAgICAgICAgJ1lvdSBhcmUgYWJvdXQgdG8gdXBkYXRlIGNlcnRpZmljYXRlIHJldm9jYXRpb24gbGlzdC4gVGhlIENSTCBmaWxlIGNvbnRlbnQgd2lsbCBvdmVycmlkZSBtYW51YWwgZW50cmllcy4gRG8geW91IHdhbnQgdG8gcHJvY2VlZD8nXG4gICAgICAgIClcbiAgICAgIDogZ2V0dGV4dCgnWW91IGFyZSBhYm91dCB0byB1cGRhdGUgY2VydGlmaWNhdGUgcmV2b2NhdGlvbiBsaXN0LiBEbyB5b3Ugd2FudCB0byBwcm9jZWVkPycpO1xuXG4gICAgYXdhaXQgdGhpcy5tb2RhbFNlcnZpY2UuY29uZmlybShnZXR0ZXh0KCdVcGRhdGUgY2VydGlmaWNhdGUgcmV2b2NhdGlvbiBsaXN0JyksIGJvZHksIHN0YXR1cywge1xuICAgICAgb2s6IGdldHRleHQoJ1VwZGF0ZScpXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNsZWFyU2F2ZWREYXRhKCkge1xuICAgIHRoaXMuZHJvcHBlZEZpbGVzID0gW107XG4gICAgdGhpcy5jcmxzID0gW3RoaXMuZ2V0RW1wdHlDZXJ0aWZpY2F0ZVJldm9jYXRpb24oKV07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNhdmVDcmxzKCkge1xuICAgIGlmICghdGhpcy5pc0xpc3RFbXB0eSkge1xuICAgICAgYXdhaXQgdGhpcy5jcmxTZXJ2aWNlLnVwbG9hZENybHModGhpcy5jcmxzKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHVwbG9hZENybEZpbGUoKSB7XG4gICAgaWYgKHRoaXMuaXNGaWxlRHJvcHBlZCkge1xuICAgICAgYXdhaXQgdGhpcy5jcmxTZXJ2aWNlLnVwbG9hZENybEZpbGUodGhpcy5kcm9wcGVkRmlsZXNbMF0uZmlsZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRFbXB0eUNlcnRpZmljYXRlUmV2b2NhdGlvbigpOiBJQ2VydGlmaWNhdGVSZXZvY2F0aW9uIHtcbiAgICByZXR1cm4ge1xuICAgICAgc2VyaWFsTnVtYmVySW5IZXg6ICcnXG4gICAgfTtcbiAgfVxufVxuIiwiPGM4eS10aXRsZT57eyAnVHJ1c3RlZCBjZXJ0aWZpY2F0ZXMnIHwgdHJhbnNsYXRlIH19PC9jOHktdGl0bGU+XG5cbjxjOHktYnJlYWRjcnVtYj5cbiAgPGM4eS1icmVhZGNydW1iLWl0ZW1cbiAgICBpY29uPVwiYzh5LW1hbmFnZW1lbnRcIlxuICAgIGxhYmVsPVwie3sgJ01hbmFnZW1lbnQnIHwgdHJhbnNsYXRlIH19XCJcbiAgPjwvYzh5LWJyZWFkY3J1bWItaXRlbT5cbiAgPGM4eS1icmVhZGNydW1iLWl0ZW1cbiAgICBpY29uPVwiY2VydGlmaWNhdGVcIlxuICAgIGxhYmVsPVwie3sgJ1RydXN0ZWQgY2VydGlmaWNhdGVzJyB8IHRyYW5zbGF0ZSB9fVwiXG4gID48L2M4eS1icmVhZGNydW1iLWl0ZW0+XG48L2M4eS1icmVhZGNydW1iPlxuXG48Yzh5LWNybC1jaGVjay1zZXR0aW5ncz48L2M4eS1jcmwtY2hlY2stc2V0dGluZ3M+XG5cbjwhLS0gI1RPRE8gdW5jb21tZW50IHdoZW4gYXZhaWxhYmxlIGluIGRvY3VtZW50YXRpb24gIC0tPlxuPCEtLSA8Yzh5LWhlbHAgc3JjPVwiL3VzZXJzLWd1aWRlL2RldmljZS1tYW5hZ2VtZW50LyNUT0RPXCI+PC9jOHktaGVscD4gLS0+XG5cbjxmb3JtXG4gIGNsYXNzPVwiY2FyZCBjYXJkLS1mdWxscGFnZVwiXG4gICNjcmxNYW51YWxGb3JtPVwibmdGb3JtXCJcbiAgbm92YWxpZGF0ZVxuPlxuICA8ZGl2IGNsYXNzPVwiY2FyZC1oZWFkZXIgc2VwYXJhdG9yXCI+XG4gICAgPGRpdiBjbGFzcz1cImNhcmQtdGl0bGVcIj5cbiAgICAgIHt7ICdDUkwgb2ZmbGluZSBzZXR1cCcgfCB0cmFuc2xhdGUgfX1cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJpbm5lci1zY3JvbGxcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ibG9ja1wiPlxuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cImxlZ2VuZCBmb3JtLWJsb2NrXCJcbiAgICAgID5cbiAgICAgICAge3sgJ01hbnVhbCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIGNsYXNzPVwiYnRuLWhlbHAgYnRuLWhlbHAtLXNtXCJcbiAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidIZWxwJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgcG9wb3Zlcj1cInt7IE1BTlVBTF9FTlRSWV9QT1BPVkVSIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICBwbGFjZW1lbnQ9XCJyaWdodFwiXG4gICAgICAgICAgdHJpZ2dlcnM9XCJmb2N1c1wiXG4gICAgICAgICAgY29udGFpbmVyPVwiYm9keVwiXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgID48L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwicm93IHRpZ2h0LWdyaWRcIlxuICAgICAgICAqbmdGb3I9XCJsZXQgY2VydGlmaWNhdGVSZXZvY2F0aW9uIG9mIGNybHM7IGluZGV4IGFzIGluZGV4OyBsYXN0IGFzIGlzTGFzdFwiXG4gICAgICA+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tNVwiPlxuICAgICAgICAgIDxjOHktZm9ybS1ncm91cD5cbiAgICAgICAgICAgIDxsYWJlbFxuICAgICAgICAgICAgICBbZm9yXT1cIidzZXJpYWxOdW1iZXInICsgaW5kZXhcIlxuICAgICAgICAgICAgICB0cmFuc2xhdGVcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgU2VyaWFsIG51bWJlclxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICAgIHJlcXVpcmVkXG4gICAgICAgICAgICAgIFtuYW1lXT1cIidzZXJpYWxOdW1iZXInICsgaW5kZXhcIlxuICAgICAgICAgICAgICBbaWRdPVwiJ3NlcmlhbE51bWJlcicgKyBpbmRleFwiXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiY2VydGlmaWNhdGVSZXZvY2F0aW9uLnNlcmlhbE51bWJlckluSGV4XCJcbiAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidlLmcuIHt7IGV4YW1wbGUgfX0nIHwgdHJhbnNsYXRlOiB7IGV4YW1wbGU6ICc4YWIzNGZlNTQ3NicgfVwiXG4gICAgICAgICAgICAgIGM4eURlZmF1bHRWYWxpZGF0aW9uPVwiY29sb25lZEhleE51bWJlclwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvYzh5LWZvcm0tZ3JvdXA+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTVcIj5cbiAgICAgICAgICA8Yzh5LWZvcm0tZ3JvdXAgY2xhc3M9XCJkYXRlcGlja2VyXCI+XG4gICAgICAgICAgICA8bGFiZWwgW2Zvcl09XCIndmFsaWRUaWxsUGlja2VyJyArIGluZGV4XCI+XG4gICAgICAgICAgICAgIHt7ICdWYWxpZCB0aWxsJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ0RhdGUgdG8nIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7eyAnRGF0ZSB0bycgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICBbbmFtZV09XCIndmFsaWRUaWxsUGlja2VyJyArIGluZGV4XCJcbiAgICAgICAgICAgICAgW2lkXT1cIid2YWxpZFRpbGxQaWNrZXInICsgaW5kZXhcIlxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImNlcnRpZmljYXRlUmV2b2NhdGlvbi5yZXZvY2F0aW9uRGF0ZVwiXG4gICAgICAgICAgICAgIFtic0NvbmZpZ109XCJ7IGN1c3RvbVRvZGF5Q2xhc3M6ICd0b2RheScgfVwiXG4gICAgICAgICAgICAgIGJzRGF0ZXBpY2tlclxuICAgICAgICAgICAgICBbbWF4RGF0ZV09XCJ0b2RheVwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvYzh5LWZvcm0tZ3JvdXA+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTJcIj5cbiAgICAgICAgICA8Yzh5LWZvcm0tZ3JvdXA+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC10LTI0XCI+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAqbmdJZj1cImNybHMubGVuZ3RoID4gMVwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLWxpbmsgaGlkZGVuLXhzIGhpZGRlbi1zbVwiXG4gICAgICAgICAgICAgICAgdGl0bGU9XCJ7eyAnUmVtb3ZlJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZUNlcnRpZmljYXRlUmV2b2NhdGlvbihjZXJ0aWZpY2F0ZVJldm9jYXRpb24pXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cInRleHQtZGFuZ2VyXCJcbiAgICAgICAgICAgICAgICAgIGM4eUljb249XCJtaW51cy1jaXJjbGVcIlxuICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLWxpbmsgaGlkZGVuLXhzIGhpZGRlbi1zbVwiXG4gICAgICAgICAgICAgICAgdGl0bGU9XCJ7eyAnQWRkJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZENlcnRpZmljYXRlUmV2b2NhdGlvbigpXCJcbiAgICAgICAgICAgICAgICAqbmdJZj1cImlzTGFzdFwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LXByaW1hcnlcIlxuICAgICAgICAgICAgICAgICAgYzh5SWNvbj1cInBsdXMtY2lyY2xlXCJcbiAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJjcmxzLmxlbmd0aCA+IDFcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1kYW5nZXIgYnRuLWJsb2NrIGJ0bi1zbSB2aXNpYmxlLXhzIHZpc2libGUtc21cIlxuICAgICAgICAgICAgICAgIHRpdGxlPVwie3sgJ1JlbW92ZScgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJyZW1vdmVDZXJ0aWZpY2F0ZVJldm9jYXRpb24oY2VydGlmaWNhdGVSZXZvY2F0aW9uKVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8aSBjOHlJY29uPVwibWludXMtY2lyY2xlXCI+PC9pPlxuICAgICAgICAgICAgICAgIHt7ICdSZW1vdmUnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgYnRuLWJsb2NrIGJ0bi1zbSB2aXNpYmxlLXhzIHZpc2libGUtc21cIlxuICAgICAgICAgICAgICAgIHRpdGxlPVwie3sgJ0FkZCcgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJhZGRDZXJ0aWZpY2F0ZVJldm9jYXRpb24oKVwiXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJpc0xhc3RcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGkgYzh5SWNvbj1cInBsdXMtY2lyY2xlXCI+PC9pPlxuICAgICAgICAgICAgICAgIHt7ICdBZGQnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9jOHktZm9ybS1ncm91cD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJsZWdlbmQgZm9ybS1ibG9jayBjZW50ZXJcIj5cbiAgICAgICAge3sgJ29yJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwibGVnZW5kIGZvcm0tYmxvY2tcIlxuICAgICAgPlxuICAgICAgICB7eyAnRmlsZSB1cGxvYWQnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICBjbGFzcz1cImJ0bi1oZWxwIGJ0bi1oZWxwLS1zbVwiXG4gICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInSGVscCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgIHBvcG92ZXI9XCJ7eyBGSUxFX1VQTE9BRF9QT1BPVkVSIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICBwbGFjZW1lbnQ9XCJyaWdodFwiXG4gICAgICAgICAgdHJpZ2dlcnM9XCJmb2N1c1wiXG4gICAgICAgICAgY29udGFpbmVyPVwiYm9keVwiXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgID48L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8Yzh5LWRyb3AtYXJlYVxuICAgICAgICBjbGFzcz1cImRyb3AtYXJlYS1zbVwiXG4gICAgICAgIFt0aXRsZV09XCInVXBsb2FkIENSTCBmaWxlICguY3N2IGZvcm1hdCknIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgbmFtZT1cInVwbG9hZENybERyb3BBcmVhXCJcbiAgICAgICAgWyhuZ01vZGVsKV09XCJkcm9wcGVkRmlsZXNcIlxuICAgICAgICBbbWVzc2FnZV09XCInVXBsb2FkIENSTCBmaWxlICguY3N2IGZvcm1hdCknIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgW2xvYWRpbmdNZXNzYWdlXT1cIidVcGxvYWRpbmfigKYnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgW2FjY2VwdF09XCInLmNzdidcIlxuICAgICAgICBbbWF4QWxsb3dlZEZpbGVzXT1cIjFcIlxuICAgICAgPjwvYzh5LWRyb3AtYXJlYT5cbiAgICAgIDxwIGNsYXNzPVwiaGVscC1ibG9jayBoYXMtaW5mbyB0ZXh0LW11dGVkIG0tdC00XCI+XG4gICAgICAgIHt7ICdDUkwgZmlsZSBjb250ZW50IHdpbGwgb3ZlcnJpZGUgbWFudWFsIGVudHJpZXMuJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgPC9wPlxuXG4gICAgICA8YnV0dG9uXG4gICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tZGVmYXVsdCBtLXQtMTZcIlxuICAgICAgICB0aXRsZT1cInt7ICdEb3dubG9hZCB0ZW1wbGF0ZScgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgKGNsaWNrKT1cImRvd25sb2FkQ3JsVGVtcGxhdGUoKVwiXG4gICAgICA+XG4gICAgICAgIDxpXG4gICAgICAgICAgY2xhc3M9XCJtLXItNFwiXG4gICAgICAgICAgYzh5SWNvbj1cInRlbXBsYXRlXCJcbiAgICAgICAgPjwvaT5cbiAgICAgICAge3sgJ0Rvd25sb2FkIHRlbXBsYXRlJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwiY2FyZC1mb290ZXIgc2VwYXJhdG9yXCI+XG4gICAgPGJ1dHRvblxuICAgICAgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHRcIlxuICAgICAgdGl0bGU9XCJ7eyAnRG93bmxvYWQgQ1JMIGZpbGUnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgKGNsaWNrKT1cImRvd25sb2FkQ3JsKClcIlxuICAgID5cbiAgICAgIDxpXG4gICAgICAgIGNsYXNzPVwibS1yLTRcIlxuICAgICAgICBjOHlJY29uPVwiZG93bmxvYWRcIlxuICAgICAgPjwvaT5cbiAgICAgIHt7ICdEb3dubG9hZCBDUkwgZmlsZScgfCB0cmFuc2xhdGUgfX1cbiAgICA8L2J1dHRvbj5cbiAgICA8YnV0dG9uXG4gICAgICBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiXG4gICAgICB0aXRsZT1cInt7ICdTYXZlJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICB0eXBlPVwic3VibWl0XCJcbiAgICAgIChjbGljayk9XCJzYXZlKClcIlxuICAgICAgW2Rpc2FibGVkXT1cIiEoY3JsTWFudWFsRm9ybS5mb3JtLnZhbGlkIHx8IGlzTGlzdEVtcHR5KSB8fCAoaXNMaXN0RW1wdHkgJiYgIWlzRmlsZURyb3BwZWQpXCJcbiAgICA+XG4gICAgICB7eyAnU2F2ZScgfCB0cmFuc2xhdGUgfX1cbiAgICA8L2J1dHRvbj5cbiAgPC9kaXY+XG48L2Zvcm0+XG4iXX0=
109
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JsLXNldHRpbmdzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3RydXN0ZWQtY2VydGlmaWNhdGVzL2NybC9jcmwtc2V0dGluZ3MuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vdHJ1c3RlZC1jZXJ0aWZpY2F0ZXMvY3JsL2NybC1zZXR0aW5ncy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQzFDLE9BQU8sRUFBRSxVQUFVLEVBQTBCLE1BQU0sYUFBYSxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxZQUFZLEVBQWUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUMvRixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sWUFBWSxDQUFDOzs7Ozs7Ozs7QUFNcEMsTUFBTSxPQUFPLG9CQUFvQjtJQWEvQixZQUNVLFVBQXNCLEVBQ3RCLFlBQTBCLEVBQzFCLFlBQTBCO1FBRjFCLGVBQVUsR0FBVixVQUFVLENBQVk7UUFDdEIsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIsaUJBQVksR0FBWixZQUFZLENBQWM7UUFmcEMsU0FBSSxHQUE2QixDQUFDLElBQUksQ0FBQyw2QkFBNkIsRUFBRSxDQUFDLENBQUM7UUFDeEUsaUJBQVksR0FBa0IsRUFBRSxDQUFDO1FBQ2pDLFVBQUssR0FBUyxJQUFJLElBQUksRUFBRSxDQUFDO1FBRXpCLHlCQUFvQixHQUFHLE9BQU8sQ0FDNUIsOE5BQThOLENBQy9OLENBQUM7UUFFRix3QkFBbUIsR0FBRyxPQUFPLENBQzNCLHVQQUF1UCxDQUN4UCxDQUFDO0lBTUMsQ0FBQztJQUVKLEtBQUssQ0FBQyxXQUFXO1FBQ2YsSUFBSSxXQUF3QixDQUFDO1FBQzdCLElB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TSxFQUNOO1lBQ0UsRUFBRSxFQUFFLE9BQU8sQ0FBQyxRQUFRLENBQUM7U0FDdEIsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUVPLGNBQWM7UUFDcEIsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyw2QkFBNkIsRUFBRSxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUVPLEtBQUssQ0FBQyxRQUFRO1FBQ3BCLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ3JCLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQzdDO0lBQ0gsQ0FBQztJQUVPLEtBQUssQ0FBQyxhQUFhO1FBQ3pCLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUN0QixNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDaEU7SUFDSCxDQUFDO0lBRU8sNkJBQTZCO1FBQ25DLE9BQU87WUFDTCxpQkFBaUIsRUFBRSxFQUFFO1NBQ3RCLENBQUM7SUFDSixDQUFDOytHQWhIVSxvQkFBb0I7bUdBQXBCLG9CQUFvQix3RENWakMsMnNOQWdOQTs7NEZEdE1hLG9CQUFvQjtrQkFKaEMsU0FBUzsrQkFDRSxrQkFBa0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGlzRW1wdHksIHB1bGwgfSBmcm9tICdsb2Rhc2gtZXMnO1xuaW1wb3J0IHsgQ3JsU2VydmljZSwgSUNlcnRpZmljYXRlUmV2b2NhdGlvbiB9IGZyb20gJ0BjOHkvY2xpZW50JztcbmltcG9ydCB7IEFsZXJ0U2VydmljZSwgRHJvcHBlZEZpbGUsIGdldHRleHQsIE1vZGFsU2VydmljZSwgU3RhdHVzIH0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cyc7XG5pbXBvcnQgeyBzYXZlQXMgfSBmcm9tICdmaWxlLXNhdmVyJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYzh5LWNybC1zZXR0aW5ncycsXG4gIHRlbXBsYXRlVXJsOiAnLi9jcmwtc2V0dGluZ3MuY29tcG9uZW50Lmh0bWwnXG59KVxuZXhwb3J0IGNsYXNzIENybFNldHRpbmdzQ29tcG9uZW50IHtcbiAgY3JsczogSUNlcnRpZmljYXRlUmV2b2NhdGlvbltdID0gW3RoaXMuZ2V0RW1wdHlDZXJ0aWZpY2F0ZVJldm9jYXRpb24oKV07XG4gIGRyb3BwZWRGaWxlczogRHJvcHBlZEZpbGVbXSA9IFtdO1xuICB0b2RheTogRGF0ZSA9IG5ldyBEYXRlKCk7XG5cbiAgTUFOVUFMX0VOVFJZX1BPUE9WRVIgPSBnZXR0ZXh0KFxuICAgICdJbiB0aGlzIHNlY3Rpb24sIHlvdSBjYW4gb3ZlcnJpZGUgb3IgYWRkIGluZGl2aWR1YWwgZW50cmllcyB0byB0aGUgQ2VydGlmaWNhdGUgUmV2b2NhdGlvbiBMaXN0LiBQcm92aWRpbmcgdGhlIHNlcmlhbCBudW1iZXIgaXMgbWFuZGF0b3J5LiBJbiBjYXNlIHRoZSByZXZvY2F0aW9uIGRhdGUgaXMgbm90IHNldCwgaXQgd2lsbCBiZSBjb25maWd1cmVkIHRvIHRoZSBjdXJyZW50IGRhdGUuJ1xuICApO1xuXG4gIEZJTEVfVVBMT0FEX1BPUE9WRVIgPSBnZXR0ZXh0KFxuICAgICdJbiB0aGlzIHNlY3Rpb24sIHlvdSBjYW4gdXBsb2FkIGEgZmlsZSB3aXRoIHRoZSBsaXN0IG9mIGNlcnRpZmljYXRlcyB0byBiZSByZXZva2VkLiBUaGUgZmlsZSBtdXN0IGJlIGluIENTViBmb3JtYXQsIGFuZCBpdCBzaG91bGQgaW5jbHVkZSB0aGUgc2VyaWFsIG51bWJlciBhbmQgcmV2b2NhdGlvbiBkYXRlLiBJZiB0aGUgcmV2b2NhdGlvbiBkYXRlIGlzIGVtcHR5LCBpdCB3aWxsIGJlIHNldCB0byB0aGUgY3VycmVudCBkYXRlLidcbiAgKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGNybFNlcnZpY2U6IENybFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBhbGVydFNlcnZpY2U6IEFsZXJ0U2VydmljZSxcbiAgICBwcml2YXRlIG1vZGFsU2VydmljZTogTW9kYWxTZXJ2aWNlXG4gICkge31cblxuICBhc3luYyBkb3dubG9hZENybCgpIHtcbiAgICBsZXQgYXJyYXlCdWZmZXI6IEFycmF5QnVmZmVyO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmNybFNlcnZpY2UuZG93bmxvYWRDcmxGaWxlKCk7XG4gICAgICBhcnJheUJ1ZmZlciA9IGF3YWl0IHJlcy5hcnJheUJ1ZmZlcigpO1xuICAgICAgY29uc3QgZmlsZUJpbmFyeSA9IG5ldyBGaWxlKFthcnJheUJ1ZmZlcl0sICdjdW11bG9jaXR5LmNybCcsIHtcbiAgICAgICAgdHlwZTogJ2FwcGxpY2F0aW9uL3BraXgtY3JsJ1xuICAgICAgfSk7XG4gICAgICBzYXZlQXMoZmlsZUJpbmFyeSk7XG4gICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLmFkZFNlcnZlckZhaWx1cmUoZXgpO1xuICAgIH1cbiAgfVxuXG4gIGRvd25sb2FkQ3JsVGVtcGxhdGUoKSB7XG4gICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtgU0VSSUFMTk8sREFURVxcblNFUklBTF9OTzEsJHtuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCl9YF0sIHtcbiAgICAgIHR5cGU6ICd0ZXh0L2NzdjtjaGFyc2V0PXV0Zi04OydcbiAgICB9KTtcbiAgICBjb25zdCBmaWxlTmFtZSA9ICdjcmwtdGVtcGxhdGUnO1xuICAgIHNhdmVBcyhibG9iLCBgJHtmaWxlTmFtZX0uY3N2YCk7XG4gIH1cblxuICBhZGRDZXJ0aWZpY2F0ZVJldm9jYXRpb24oKSB7XG4gICAgdGhpcy5jcmxzLnB1c2godGhpcy5nZXRFbXB0eUNlcnRpZmljYXRlUmV2b2NhdGlvbigpKTtcbiAgfVxuXG4gIHJlbW92ZUNlcnRpZmljYXRlUmV2b2NhdGlvbihjZXJ0aWZpY2F0ZVJldm9jYXRpb24pIHtcbiAgICBwdWxsKHRoaXMuY3JscywgY2VydGlmaWNhdGVSZXZvY2F0aW9uKTtcbiAgICBpZiAodGhpcy5jcmxzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5hZGRDZXJ0aWZpY2F0ZVJldm9jYXRpb24oKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBzYXZlKCkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmNvbmZpcm0oKTtcbiAgICAgIGF3YWl0IHRoaXMuc2F2ZUNybHMoKTtcbiAgICAgIGF3YWl0IHRoaXMudXBsb2FkQ3JsRmlsZSgpO1xuICAgICAgYXdhaXQgdGhpcy5jbGVhclNhdmVkRGF0YSgpO1xuICAgICAgdGhpcy5hbGVydFNlcnZpY2Uuc3VjY2VzcyhnZXR0ZXh0KCdDUkwgc2F2ZWQuJykpO1xuICAgIH0gY2F0Y2ggKGVyKSB7XG4gICAgICB0aGlzLmFsZXJ0U2VydmljZS5hZGRTZXJ2ZXJGYWlsdXJlKGVyKTtcbiAgICB9XG4gIH1cblxuICBnZXQgaXNMaXN0RW1wdHkoKSB7XG4gICAgcmV0dXJuIHRoaXMuY3Jscy5sZW5ndGggPT09IDEgJiYgaXNFbXB0eSh0aGlzLmNybHNbMF0uc2VyaWFsTnVtYmVySW5IZXgpO1xuICB9XG5cbiAgZ2V0IGlzRmlsZURyb3BwZWQoKSB7XG4gICAgcmV0dXJuICEhKHRoaXMuZHJvcHBlZEZpbGVzICYmIHRoaXMuZHJvcHBlZEZpbGVzWzBdKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY29uZmlybSgpIHtcbiAgICBjb25zdCBpc092ZXJyaWRlTWFudWFsRW50cmllcyA9ICF0aGlzLmlzTGlzdEVtcHR5ICYmIHRoaXMuaXNGaWxlRHJvcHBlZDtcbiAgICBjb25zdCBzdGF0dXMgPSBpc092ZXJyaWRlTWFudWFsRW50cmllcyA/IFN0YXR1cy5EQU5HRVIgOiBTdGF0dXMuV0FSTklORztcbiAgICBjb25zdCBib2R5ID0gaXNPdmVycmlkZU1hbnVhbEVudHJpZXNcbiAgICAgID8gZ2V0dGV4dChcbiAgICAgICAgICAnWW91IGFyZSBhYm91dCB0byB1cGRhdGUgdGhlIENlcnRpZmljYXRlIFJldm9jYXRpb24gTGlzdC4gVGhlIENSTCBmaWxlIGNvbnRlbnQgd2lsbCBvdmVycmlkZSBtYW51YWwgZW50cmllcy4gRG8geW91IHdhbnQgdG8gcHJvY2VlZD8nXG4gICAgICAgIClcbiAgICAgIDogZ2V0dGV4dCgnWW91IGFyZSBhYm91dCB0byB1cGRhdGUgdGhlIENlcnRpZmljYXRlIFJldm9jYXRpb24gTGlzdC4gRG8geW91IHdhbnQgdG8gcHJvY2VlZD8nKTtcblxuICAgIGF3YWl0IHRoaXMubW9kYWxTZXJ2aWNlLmNvbmZpcm0oXG4gICAgICBnZXR0ZXh0KCdVcGRhdGUgdGhlIENlcnRpZmljYXRlIFJldm9jYXRpb24gTGlzdCcpLFxuICAgICAgYm9keSxcbiAgICAgIHN0YXR1cyxcbiAgICAgIHtcbiAgICAgICAgb2s6IGdldHRleHQoJ1VwZGF0ZScpXG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgY2xlYXJTYXZlZERhdGEoKSB7XG4gICAgdGhpcy5kcm9wcGVkRmlsZXMgPSBbXTtcbiAgICB0aGlzLmNybHMgPSBbdGhpcy5nZXRFbXB0eUNlcnRpZmljYXRlUmV2b2NhdGlvbigpXTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc2F2ZUNybHMoKSB7XG4gICAgaWYgKCF0aGlzLmlzTGlzdEVtcHR5KSB7XG4gICAgICBhd2FpdCB0aGlzLmNybFNlcnZpY2UudXBsb2FkQ3Jscyh0aGlzLmNybHMpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgdXBsb2FkQ3JsRmlsZSgpIHtcbiAgICBpZiAodGhpcy5pc0ZpbGVEcm9wcGVkKSB7XG4gICAgICBhd2FpdCB0aGlzLmNybFNlcnZpY2UudXBsb2FkQ3JsRmlsZSh0aGlzLmRyb3BwZWRGaWxlc1swXS5maWxlKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldEVtcHR5Q2VydGlmaWNhdGVSZXZvY2F0aW9uKCk6IElDZXJ0aWZpY2F0ZVJldm9jYXRpb24ge1xuICAgIHJldHVybiB7XG4gICAgICBzZXJpYWxOdW1iZXJJbkhleDogJydcbiAgICB9O1xuICB9XG59XG4iLCI8Yzh5LXRpdGxlPnt7ICdUcnVzdGVkIGNlcnRpZmljYXRlcycgfCB0cmFuc2xhdGUgfX08L2M4eS10aXRsZT5cblxuPGM4eS1icmVhZGNydW1iPlxuICA8Yzh5LWJyZWFkY3J1bWItaXRlbVxuICAgIGljb249XCJjOHktbWFuYWdlbWVudFwiXG4gICAgbGFiZWw9XCJ7eyAnTWFuYWdlbWVudCcgfCB0cmFuc2xhdGUgfX1cIlxuICA+PC9jOHktYnJlYWRjcnVtYi1pdGVtPlxuICA8Yzh5LWJyZWFkY3J1bWItaXRlbVxuICAgIGljb249XCJjZXJ0aWZpY2F0ZVwiXG4gICAgbGFiZWw9XCJ7eyAnVHJ1c3RlZCBjZXJ0aWZpY2F0ZXMnIHwgdHJhbnNsYXRlIH19XCJcbiAgPjwvYzh5LWJyZWFkY3J1bWItaXRlbT5cbjwvYzh5LWJyZWFkY3J1bWI+XG5cbjxjOHktY3JsLWNoZWNrLXNldHRpbmdzPjwvYzh5LWNybC1jaGVjay1zZXR0aW5ncz5cblxuPCEtLSAjVE9ETyB1bmNvbW1lbnQgd2hlbiBhdmFpbGFibGUgaW4gZG9jdW1lbnRhdGlvbiAgLS0+XG48IS0tIDxjOHktaGVscCBzcmM9XCIvdXNlcnMtZ3VpZGUvZGV2aWNlLW1hbmFnZW1lbnQvI1RPRE9cIj48L2M4eS1oZWxwPiAtLT5cblxuPGZvcm1cbiAgY2xhc3M9XCJjYXJkIGNhcmQtLWZ1bGxwYWdlXCJcbiAgI2NybE1hbnVhbEZvcm09XCJuZ0Zvcm1cIlxuICBub3ZhbGlkYXRlXG4+XG4gIDxkaXYgY2xhc3M9XCJjYXJkLWhlYWRlciBzZXBhcmF0b3JcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY2FyZC10aXRsZVwiPlxuICAgICAge3sgJ0NSTCBvZmZsaW5lIHNldHVwJyB8IHRyYW5zbGF0ZSB9fVxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cImlubmVyLXNjcm9sbFwiPlxuICAgIDxkaXYgY2xhc3M9XCJjYXJkLWJsb2NrXCI+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwibGVnZW5kIGZvcm0tYmxvY2tcIlxuICAgICAgPlxuICAgICAgICB7eyAnTWFudWFsJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgY2xhc3M9XCJidG4taGVscCBidG4taGVscC0tc21cIlxuICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ0hlbHAnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICBwb3BvdmVyPVwie3sgTUFOVUFMX0VOVFJZX1BPUE9WRVIgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgIHBsYWNlbWVudD1cInJpZ2h0XCJcbiAgICAgICAgICB0cmlnZ2Vycz1cImZvY3VzXCJcbiAgICAgICAgICBjb250YWluZXI9XCJib2R5XCJcbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJyb3cgdGlnaHQtZ3JpZFwiXG4gICAgICAgICpuZ0Zvcj1cImxldCBjZXJ0aWZpY2F0ZVJldm9jYXRpb24gb2YgY3JsczsgaW5kZXggYXMgaW5kZXg7IGxhc3QgYXMgaXNMYXN0XCJcbiAgICAgID5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS01XCI+XG4gICAgICAgICAgPGM4eS1mb3JtLWdyb3VwPlxuICAgICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAgIFtmb3JdPVwiJ3NlcmlhbE51bWJlcicgKyBpbmRleFwiXG4gICAgICAgICAgICAgIHRyYW5zbGF0ZVxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICBTZXJpYWwgbnVtYmVyXG4gICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgICAgcmVxdWlyZWRcbiAgICAgICAgICAgICAgW25hbWVdPVwiJ3NlcmlhbE51bWJlcicgKyBpbmRleFwiXG4gICAgICAgICAgICAgIFtpZF09XCInc2VyaWFsTnVtYmVyJyArIGluZGV4XCJcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJjZXJ0aWZpY2F0ZVJldm9jYXRpb24uc2VyaWFsTnVtYmVySW5IZXhcIlxuICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ2UuZy4ge3sgZXhhbXBsZSB9fScgfCB0cmFuc2xhdGU6IHsgZXhhbXBsZTogJzhhYjM0ZmU1NDc2JyB9XCJcbiAgICAgICAgICAgICAgYzh5RGVmYXVsdFZhbGlkYXRpb249XCJjb2xvbmVkSGV4TnVtYmVyXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9jOHktZm9ybS1ncm91cD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tNVwiPlxuICAgICAgICAgIDxjOHktZm9ybS1ncm91cCBjbGFzcz1cImRhdGVwaWNrZXJcIj5cbiAgICAgICAgICAgIDxsYWJlbCBbZm9yXT1cIid2YWxpZFRpbGxQaWNrZXInICsgaW5kZXhcIj5cbiAgICAgICAgICAgICAge3sgJ1ZhbGlkIHRpbGwnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInRGF0ZSB0bycgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7ICdEYXRlIHRvJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgIFtuYW1lXT1cIid2YWxpZFRpbGxQaWNrZXInICsgaW5kZXhcIlxuICAgICAgICAgICAgICBbaWRdPVwiJ3ZhbGlkVGlsbFBpY2tlcicgKyBpbmRleFwiXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiY2VydGlmaWNhdGVSZXZvY2F0aW9uLnJldm9jYXRpb25EYXRlXCJcbiAgICAgICAgICAgICAgW2JzQ29uZmlnXT1cInsgY3VzdG9tVG9kYXlDbGFzczogJ3RvZGF5JyB9XCJcbiAgICAgICAgICAgICAgYnNEYXRlcGlja2VyXG4gICAgICAgICAgICAgIFttYXhEYXRlXT1cInRvZGF5XCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9jOHktZm9ybS1ncm91cD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tMlwiPlxuICAgICAgICAgIDxjOHktZm9ybS1ncm91cD5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLXQtMjRcIj5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICpuZ0lmPVwiY3Jscy5sZW5ndGggPiAxXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tbGluayBoaWRkZW4teHMgaGlkZGVuLXNtXCJcbiAgICAgICAgICAgICAgICB0aXRsZT1cInt7ICdSZW1vdmUnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwicmVtb3ZlQ2VydGlmaWNhdGVSZXZvY2F0aW9uKGNlcnRpZmljYXRlUmV2b2NhdGlvbilcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGV4dC1kYW5nZXJcIlxuICAgICAgICAgICAgICAgICAgYzh5SWNvbj1cIm1pbnVzLWNpcmNsZVwiXG4gICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tbGluayBoaWRkZW4teHMgaGlkZGVuLXNtXCJcbiAgICAgICAgICAgICAgICB0aXRsZT1cInt7ICdBZGQnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkQ2VydGlmaWNhdGVSZXZvY2F0aW9uKClcIlxuICAgICAgICAgICAgICAgICpuZ0lmPVwiaXNMYXN0XCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cInRleHQtcHJpbWFyeVwiXG4gICAgICAgICAgICAgICAgICBjOHlJY29uPVwicGx1cy1jaXJjbGVcIlxuICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAqbmdJZj1cImNybHMubGVuZ3RoID4gMVwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLWRhbmdlciBidG4tYmxvY2sgYnRuLXNtIHZpc2libGUteHMgdmlzaWJsZS1zbVwiXG4gICAgICAgICAgICAgICAgdGl0bGU9XCJ7eyAnUmVtb3ZlJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZUNlcnRpZmljYXRlUmV2b2NhdGlvbihjZXJ0aWZpY2F0ZVJldm9jYXRpb24pXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxpIGM4eUljb249XCJtaW51cy1jaXJjbGVcIj48L2k+XG4gICAgICAgICAgICAgICAge3sgJ1JlbW92ZScgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBidG4tYmxvY2sgYnRuLXNtIHZpc2libGUteHMgdmlzaWJsZS1zbVwiXG4gICAgICAgICAgICAgICAgdGl0bGU9XCJ7eyAnQWRkJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZENlcnRpZmljYXRlUmV2b2NhdGlvbigpXCJcbiAgICAgICAgICAgICAgICAqbmdJZj1cImlzTGFzdFwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8aSBjOHlJY29uPVwicGx1cy1jaXJjbGVcIj48L2k+XG4gICAgICAgICAgICAgICAge3sgJ0FkZCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2M4eS1mb3JtLWdyb3VwPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImxlZ2VuZCBmb3JtLWJsb2NrIGNlbnRlclwiPlxuICAgICAgICB7eyAnb3InIHwgdHJhbnNsYXRlIH19XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJsZWdlbmQgZm9ybS1ibG9ja1wiXG4gICAgICA+XG4gICAgICAgIHt7ICdGaWxlIHVwbG9hZCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIGNsYXNzPVwiYnRuLWhlbHAgYnRuLWhlbHAtLXNtXCJcbiAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidIZWxwJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgcG9wb3Zlcj1cInt7IEZJTEVfVVBMT0FEX1BPUE9WRVIgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgIHBsYWNlbWVudD1cInJpZ2h0XCJcbiAgICAgICAgICB0cmlnZ2Vycz1cImZvY3VzXCJcbiAgICAgICAgICBjb250YWluZXI9XCJib2R5XCJcbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxjOHktZHJvcC1hcmVhXG4gICAgICAgIGNsYXNzPVwiZHJvcC1hcmVhLXNtXCJcbiAgICAgICAgW3RpdGxlXT1cIidVcGxvYWQgQ1JMIGZpbGUgKC5jc3YgZm9ybWF0KScgfCB0cmFuc2xhdGVcIlxuICAgICAgICBuYW1lPVwidXBsb2FkQ3JsRHJvcEFyZWFcIlxuICAgICAgICBbKG5nTW9kZWwpXT1cImRyb3BwZWRGaWxlc1wiXG4gICAgICAgIFttZXNzYWdlXT1cIidVcGxvYWQgQ1JMIGZpbGUgKC5jc3YgZm9ybWF0KScgfCB0cmFuc2xhdGVcIlxuICAgICAgICBbbG9hZGluZ01lc3NhZ2VdPVwiJ1VwbG9hZGluZ+KApicgfCB0cmFuc2xhdGVcIlxuICAgICAgICBbYWNjZXB0XT1cIicuY3N2J1wiXG4gICAgICAgIFttYXhBbGxvd2VkRmlsZXNdPVwiMVwiXG4gICAgICA+PC9jOHktZHJvcC1hcmVhPlxuICAgICAgPHAgY2xhc3M9XCJoZWxwLWJsb2NrIGhhcy1pbmZvIHRleHQtbXV0ZWQgbS10LTRcIj5cbiAgICAgICAge3sgJ0NSTCBmaWxlIGNvbnRlbnQgd2lsbCBvdmVycmlkZSBtYW51YWwgZW50cmllcy4nIHwgdHJhbnNsYXRlIH19XG4gICAgICA8L3A+XG5cbiAgICAgIDxidXR0b25cbiAgICAgICAgY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1kZWZhdWx0IG0tdC0xNlwiXG4gICAgICAgIHRpdGxlPVwie3sgJ0Rvd25sb2FkIHRlbXBsYXRlJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAoY2xpY2spPVwiZG93bmxvYWRDcmxUZW1wbGF0ZSgpXCJcbiAgICAgID5cbiAgICAgICAgPGlcbiAgICAgICAgICBjbGFzcz1cIm0tci00XCJcbiAgICAgICAgICBjOHlJY29uPVwidGVtcGxhdGVcIlxuICAgICAgICA+PC9pPlxuICAgICAgICB7eyAnRG93bmxvYWQgdGVtcGxhdGUnIHwgdHJhbnNsYXRlIH19XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJjYXJkLWZvb3RlciBzZXBhcmF0b3JcIj5cbiAgICA8YnV0dG9uXG4gICAgICBjbGFzcz1cImJ0biBidG4tZGVmYXVsdFwiXG4gICAgICB0aXRsZT1cInt7ICdEb3dubG9hZCBDUkwgZmlsZScgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAoY2xpY2spPVwiZG93bmxvYWRDcmwoKVwiXG4gICAgPlxuICAgICAgPGlcbiAgICAgICAgY2xhc3M9XCJtLXItNFwiXG4gICAgICAgIGM4eUljb249XCJkb3dubG9hZFwiXG4gICAgICA+PC9pPlxuICAgICAge3sgJ0Rvd25sb2FkIENSTCBmaWxlJyB8IHRyYW5zbGF0ZSB9fVxuICAgIDwvYnV0dG9uPlxuICAgIDxidXR0b25cbiAgICAgIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCJcbiAgICAgIHRpdGxlPVwie3sgJ1NhdmUnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgIHR5cGU9XCJzdWJtaXRcIlxuICAgICAgKGNsaWNrKT1cInNhdmUoKVwiXG4gICAgICBbZGlzYWJsZWRdPVwiIShjcmxNYW51YWxGb3JtLmZvcm0udmFsaWQgfHwgaXNMaXN0RW1wdHkpIHx8IChpc0xpc3RFbXB0eSAmJiAhaXNGaWxlRHJvcHBlZClcIlxuICAgID5cbiAgICAgIHt7ICdTYXZlJyB8IHRyYW5zbGF0ZSB9fVxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cbjwvZm9ybT5cbiJdfQ==
@@ -175,7 +175,7 @@ export class TrustedCertificateListComponent {
175
175
  reader.readAsText(input.files[0]);
176
176
  }
177
177
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TrustedCertificateListComponent, deps: [{ token: i1.BsModalService }, { token: i2.AlertService }, { token: i3.TrustedCertificateService }, { token: i2.ModalService }, { token: i4.TranslateService }, { token: i2.ClipboardService }, { token: i2.GainsightService }], target: i0.ɵɵFactoryTarget.Component }); }
178
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: TrustedCertificateListComponent, selector: "c8y-trusted-certificates", ngImport: i0, template: "<c8y-title>{{ 'Trusted certificates' | translate }}</c8y-title>\n\n<c8y-breadcrumb>\n <c8y-breadcrumb-item\n icon=\"c8y-management\"\n label=\"{{ 'Management' | translate }}\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n icon=\"certificate\"\n label=\"{{ 'Trusted certificates' | translate }}\"\n ></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <button\n class=\"btn btn-link\"\n title=\"{{ 'Add trusted certificate' | translate }}\"\n type=\"button\"\n (click)=\"addTrustedCertificate()\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Add trusted certificate' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <button\n class=\"btn btn-link\"\n title=\"{{ 'Reload' | translate }}\"\n type=\"button\"\n (click)=\"loadTrustedCertificates()\"\n >\n <i\n c8yIcon=\"refresh\"\n [ngClass]=\"{ 'icon-spin': reloading | async }\"\n ></i>\n {{ 'Reload' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-help\n src=\"/docs/device-management-application/managing-device-data/#managing-trusted-certificates\"\n></c8y-help>\n\n<c8y-ui-empty-state\n [icon]=\"'certificate'\"\n [title]=\"'No trusted certificates to display.' | translate\"\n [subtitle]=\"'Add your first certificate by clicking below.' | translate\"\n *ngIf=\"(trustedCertificates | async)?.data.length === 0\"\n>\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Add trusted certificate' | translate }}\"\n type=\"button\"\n (click)=\"addTrustedCertificate()\"\n >\n {{ 'Add trusted certificate' | translate }}\n </button>\n</c8y-ui-empty-state>\n\n<c8y-list-group class=\"m-b-24\">\n <div\n class=\"page-sticky-header hidden-xs c8y-list__item c8y-list__item--empty-actions\"\n *ngIf=\"(trustedCertificates | async)?.data.length > 0\"\n >\n <div class=\"c8y-list__item__block\">\n <div class=\"c8y-list__item__icon\">\n <i\n class=\"invisible\"\n c8yIcon=\"certificate\"\n ></i>\n </div>\n <div class=\"c8y-list__item__body\">\n <div class=\"content-flex-60\">\n <div class=\"col-2\">\n <span\n class=\"text-truncate\"\n title=\" {{ 'Certificate' | translate }} \"\n >\n {{ 'Certificate' | translate }}\n </span>\n </div>\n <div class=\"col-2\">\n <span\n class=\"text-truncate\"\n title=\"{{ 'Status' | translate }}\"\n >\n {{ 'Status' | translate }}\n </span>\n </div>\n <div class=\"col-2\">\n <span\n class=\"text-truncate\"\n title=\"{{ 'Algorithm' | translate }}\"\n >\n {{ 'Algorithm' | translate }}\n </span>\n </div>\n <div class=\"col-2\">\n <span\n class=\"text-truncate\"\n title=\"{{ 'Expiration date' | translate }}\"\n >\n {{ 'Expiration date' | translate }}\n </span>\n </div>\n <div class=\"col-2\">\n <span\n class=\"text-truncate\"\n title=\" {{ 'Auto registration' | translate }}\"\n >\n {{ 'Auto registration' | translate }}\n </span>\n </div>\n <div class=\"col-2\">\n <span\n class=\"text-truncate\"\n title=\" {{ 'Proof of possession' | translate }}\"\n >\n {{ 'Proof of possession' | translate }}\n </span>\n </div>\n </div>\n </div>\n <div class=\"c8y-list__item__actions\"></div>\n </div>\n </div>\n\n <c8y-li\n *c8yFor=\"\n let trustedCertificate of trustedCertificates | async;\n let i = index;\n pipe: sortByExpirationDateAsc;\n loadMore: 'none'\n \"\n #listItem\n data-cy=\"c8y-trusted-certificates-list--item-block\"\n >\n <c8y-li-icon>\n <i c8yIcon=\"certificate\"></i>\n </c8y-li-icon>\n\n <c8y-li-body class=\"content-flex-60\">\n <div class=\"col-2\">\n <button\n class=\"btn-clean text-truncate\"\n title=\"{{ trustedCertificate.name }}\"\n type=\"button\"\n (click)=\"listItem.toggleCollapsed()\"\n >\n {{ trustedCertificate.name }}\n </button>\n </div>\n <div class=\"col-2\">\n <div class=\"visible-xs p-8\"></div>\n <button\n class=\"btn c8y-btn-checkbox--inline\"\n name=\"certificateStatus\"\n type=\"button\"\n [(ngModel)]=\"trustedCertificate.status\"\n btnCheckbox\n btnCheckboxTrue=\"ENABLED\"\n btnCheckboxFalse=\"DISABLED\"\n (ngModelChange)=\"updateCertificate(trustedCertificate, { status: $event })\"\n >\n <small\n title=\"{{ 'Disabled`trusted certificate status`' | translate }}\"\n [hidden]=\"trustedCertificate.status !== 'DISABLED'\"\n >\n {{ 'Disabled`trusted certificate status`' | translate }}\n </small>\n <small\n title=\"{{ 'Enabled`trusted certificate status`' | translate }}\"\n [hidden]=\"trustedCertificate.status !== 'ENABLED'\"\n >\n {{ 'Enabled`trusted certificate status`' | translate }}\n </small>\n </button>\n <div class=\"visible-xs p-8\"></div>\n </div>\n <div class=\"col-2\">\n <div\n class=\"text-truncate\"\n title=\"{{ 'Algorithm' | translate }}: {{ trustedCertificate.algorithmName }}\"\n >\n <span\n class=\"text-label-small m-t-8 m-r-8 visible-xs-inline\"\n translate\n >\n Algorithm\n </span>\n {{ trustedCertificate.algorithmName }}\n </div>\n </div>\n\n <div class=\"col-2\">\n <div\n class=\"text-truncate\"\n title=\"{{ 'Expiration date' | translate }}: {{ trustedCertificate.notAfter | c8yDate }}\"\n >\n <span\n class=\"text-label-small m-t-8 m-r-8 visible-xs-inline\"\n translate\n >\n Expiration date\n </span>\n <small [ngClass]=\"highlightDependingOnExpirationStatus(trustedCertificate)\">\n <i\n class=\"m-r-4\"\n c8yIcon=\"calendar\"\n *ngIf=\"!highlightDependingOnExpirationStatus(trustedCertificate)\"\n ></i>\n <i\n class=\"m-r-4\"\n c8yIcon=\"warning\"\n *ngIf=\"highlightDependingOnExpirationStatus(trustedCertificate)\"\n ></i>\n <span>{{ trustedCertificate.notAfter | c8yDate }}</span>\n </small>\n </div>\n </div>\n <div class=\"col-2\">\n <div class=\"text-truncate\">\n <span class=\"text-label-small m-t-8 m-r-4 visible-xs-inline\">\n {{ 'Auto registration' | translate }}\n </span>\n <span\n title=\"{{ 'Auto registration' | translate }}: {{\n 'Enabled`auto registration`' | translate\n }}\"\n *ngIf=\"trustedCertificate.autoRegistrationEnabled\"\n >\n {{ 'Enabled`auto registration`' | translate }}\n </span>\n <span\n title=\"{{ 'Auto registration' | translate }}: {{\n 'Disabled`auto registration`' | translate\n }}\"\n *ngIf=\"!trustedCertificate.autoRegistrationEnabled\"\n >\n {{ 'Disabled`auto registration`' | translate }}\n </span>\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ AUTO_REGISTRATION_POPOVER | translate }}\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n type=\"button\"\n ></button>\n </div>\n </div>\n <div class=\"col-2 d-flex\">\n <div class=\"text-truncate\">\n <span class=\"text-label-small m-t-8 m-r-4 visible-xs-inline\">\n {{ 'Proof of possession' | translate }}\n </span>\n <span\n title=\"{{ 'Proof of possession' | translate }}: {{\n 'Complete`proof of possession`' | translate\n }}\"\n *ngIf=\"trustedCertificate.proofOfPossessionValid\"\n >\n <div class=\"icon-flex\">\n <i\n class=\"text-success\"\n c8yIcon=\"success\"\n ></i>\n {{ 'Complete`proof of possession`' | translate }}\n </div>\n </span>\n <span\n title=\"{{ 'Proof of possession' | translate }}: {{\n 'Incomplete`proof of possession`' | translate\n }}\"\n *ngIf=\"!trustedCertificate.proofOfPossessionValid\"\n >\n <div class=\"icon-flex\">\n <i\n class=\"text-warning\"\n c8yIcon=\"warning\"\n ></i>\n {{ 'Incomplete`proof of possession`' | translate }}\n </div>\n </span>\n </div>\n <button\n class=\"m-l-auto btn-dot btn-dot--danger btn showOnHover m-r-8\"\n [attr.aria-label]=\"'Delete' | translate\"\n tooltip=\"{{ 'Delete' | translate }}\"\n placement=\"right\"\n type=\"button\"\n data-cy=\"c8y-trusted-certificate--delete\"\n [delay]=\"500\"\n (click)=\"deleteTrustedCertificate(trustedCertificate)\"\n >\n <i c8yIcon=\"delete\"></i>\n </button>\n </div>\n </c8y-li-body>\n\n <c8y-li-collapse>\n <div class=\"p-t-16 p-b-16\">\n <div class=\"row\">\n <div class=\"col-md-4\">\n <c8y-form-group>\n <label class=\"control-label\">\n {{ 'Certificate name' | translate }}\n </label>\n <div class=\"input-group input-group-editable\">\n <input\n class=\"form-control\"\n type=\"text\"\n required\n data-cy=\"c8y-trusted-certificates--edit-certificate-name\"\n [(ngModel)]=\"trustedCertificate.name\"\n />\n <span></span>\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Update certificate name' | translate }}\"\n type=\"button\"\n (click)=\"\n updateCertificate(trustedCertificate, { name: trustedCertificate.name })\n \"\n [disabled]=\"!trustedCertificate.name\"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n </div>\n </c8y-form-group>\n </div>\n <div class=\"col-md-1\"></div>\n <div class=\"col-md-7\">\n <c8y-form-group>\n <label\n class=\"control-label\"\n for=\"certInPemFormat\"\n translate\n >\n Certificate\n </label>\n <textarea\n class=\"form-control no-resize\"\n id=\"certInPemFormat\"\n name=\"certInPemFormat\"\n type=\"text\"\n rows=\"7\"\n readonly\n [(ngModel)]=\"trustedCertificate.certInPemFormat\"\n ></textarea>\n </c8y-form-group>\n <c8y-form-group>\n <label\n class=\"c8y-checkbox\"\n title=\"{{ 'Auto registration' | translate }}\"\n >\n <input\n type=\"checkbox\"\n [(ngModel)]=\"trustedCertificate.autoRegistrationEnabled\"\n (ngModelChange)=\"\n updateCertificate(trustedCertificate, { autoRegistrationEnabled: $event })\n \"\n />\n <span></span>\n <span>{{ 'Auto registration' | translate }}</span>\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ AUTO_REGISTRATION_POPOVER | translate }}\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n type=\"button\"\n ></button>\n </label>\n </c8y-form-group>\n </div>\n </div>\n <div class=\"row\">\n <div class=\"col-md-4\">\n <div\n class=\"legend form-block\"\n translate\n >\n Additional properties\n </div>\n <ul class=\"list-unstyled\">\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Algorithm' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.algorithmName }}\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Version' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.version }}\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Valid from' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.notBefore | c8yDate }}\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Issuer' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.issuer }}\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Expiration date' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.notAfter | c8yDate }}\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Serial number' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.serialNumber }}\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Subject`of a certificate`' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.subject }}\n </span>\n </li>\n </ul>\n </div>\n <div class=\"col-md-1\"></div>\n <div class=\"col-md-7\">\n <div class=\"legend form-block\">\n {{ 'Proof of possession' | translate }}\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ PROOF_OF_POSSESSION_POPOVER | translate }}\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n type=\"button\"\n ></button>\n </div>\n <div *ngIf=\"trustedCertificate.proofOfPossessionValid\">\n <span\n class=\"icon-flex\"\n title=\"{{ 'Proof of possession' | translate }}: {{\n 'Complete`proof of possession`' | translate\n }}\"\n >\n <i\n class=\"text-success\"\n c8yIcon=\"success\"\n ></i>\n {{ 'Complete`proof of possession`' | translate }}\n </span>\n </div>\n <div *ngIf=\"!trustedCertificate.proofOfPossessionValid\">\n <div class=\"row m-b-16\">\n <div class=\"col-md-6\">\n <span\n class=\"icon-flex\"\n title=\"{{ 'Proof of possession' | translate }}: {{\n 'Incomplete`proof of possession`' | translate\n }}\"\n >\n <i\n class=\"text-warning\"\n c8yIcon=\"warning\"\n ></i>\n {{ 'Incomplete`proof of possession`' | translate }}\n </span>\n </div>\n <div class=\"col-md-6 col-lg-6 text-right-md\">\n <span class=\"text-label-small m-r-4\">\n {{ 'Verification code expires/expired on' | translate }}\n </span>\n {{\n (trustedCertificate.proofOfPossessionVerificationCodeUsableUntil | c8yDate) ||\n '---'\n }}\n </div>\n </div>\n <div class=\"row\">\n <div class=\"col-md-6 col-lg-6\">\n <c8y-form-group>\n <label\n class=\"control-label\"\n for=\"unsignedVerificationCode\"\n translate\n >\n Verification code\n </label>\n <textarea\n class=\"form-control no-resize\"\n id=\"unsignedVerificationCode\"\n name=\"unsignedVerificationCode\"\n type=\"text\"\n rows=\"5\"\n readonly\n [(ngModel)]=\"trustedCertificate.proofOfPossessionUnsignedVerificationCode\"\n ></textarea>\n </c8y-form-group>\n <div class=\"d-flex\">\n <button\n class=\"btn btn-primary btn-sm\"\n title=\"{{ 'Regenerate verification code' | translate }}\"\n type=\"button\"\n (click)=\"regenerateUnsignedVerificationCode(trustedCertificate)\"\n >\n {{ 'Regenerate`verification code`' | translate }}\n </button>\n\n <button\n class=\"btn btn-sm btn-default m-l-auto m-r-0\"\n [attr.aria-label]=\"'Copy to clipboard' | translate\"\n tooltip=\"{{ 'Copy to clipboard' | translate }}\"\n placement=\"right\"\n type=\"button\"\n data-cy=\"c8y-trusted-certificates--copy-to-clipboard\"\n [delay]=\"500\"\n [disabled]=\"!trustedCertificate.proofOfPossessionUnsignedVerificationCode\"\n (click)=\"copyUnsignedVerificationCodeToClipboard(trustedCertificate)\"\n >\n <i c8yIcon=\"clipboard\"></i>\n </button>\n <button\n class=\"btn btn-default btn-sm\"\n [attr.aria-label]=\"'Download as file' | translate\"\n tooltip=\"{{ 'Download as file' | translate }}\"\n type=\"button\"\n data-cy=\"c8y-trusted-certificates--download-as-file\"\n [delay]=\"500\"\n [disabled]=\"!trustedCertificate.proofOfPossessionUnsignedVerificationCode\"\n (click)=\"downloadUnsignedVerificationCode(trustedCertificate)\"\n c8yProductExperience\n [actionName]=\"PRODUCT_EXPERIENCE.EVENT\"\n [actionData]=\"{\n component: PRODUCT_EXPERIENCE.VERIFICATION_CODE.COMPONENTS.DOWNLOAD_CODE,\n action: PRODUCT_EXPERIENCE.VERIFICATION_CODE.ACTIONS.DOWNLOAD\n }\"\n >\n <i c8yIcon=\"download\"></i>\n </button>\n </div>\n </div>\n\n <div class=\"col-md-6 col-lg-6\">\n <c8y-form-group>\n <label\n class=\"control-label\"\n for=\"signedVerificationCode\"\n >\n {{ 'Signed verification code' | translate }}\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ SIGNED_VERIFICATION_CODE_POPOVER | translate }}\"\n placement=\"top\"\n container=\"body\"\n type=\"button\"\n data-cy=\"c8y-trusted-certificates--signed-verification-code-popup\"\n [outsideClick]=\"true\"\n ></button>\n </label>\n <textarea\n class=\"form-control no-resize\"\n id=\"signedVerificationCode\"\n name=\"signedVerificationCode\"\n type=\"text\"\n rows=\"5\"\n [(ngModel)]=\"trustedCertificate.signedVerificationCode\"\n ></textarea>\n </c8y-form-group>\n <div class=\"d-flex\">\n <button\n class=\"btn btn-primary btn-sm\"\n title=\"{{ 'Verify signed verification code' | translate }}\"\n type=\"button\"\n (click)=\"verifySignedVerificationCode(trustedCertificate)\"\n [disabled]=\"!trustedCertificate.signedVerificationCode\"\n >\n {{ 'Verify`signed verification code`' | translate }}\n </button>\n <button\n class=\"btn btn-sm btn-default m-l-auto\"\n [attr.aria-label]=\"'Upload file' | translate\"\n tooltip=\"{{ 'Upload file' | translate }}\"\n type=\"button\"\n [delay]=\"500\"\n (click)=\"fileInput.click()\"\n >\n <i c8yIcon=\"upload\"></i>\n </button>\n <input\n class=\"hidden\"\n type=\"file\"\n #fileInput\n (change)=\"onFileInput($event, trustedCertificate)\"\n />\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </c8y-li-collapse>\n </c8y-li>\n</c8y-list-group>\n", dependencies: [{ kind: "component", type: i2.ActionBarItemComponent, selector: "c8y-action-bar-item", inputs: ["placement", "priority", "itemClass", "injector", "groupId", "inGroupPriority"] }, { kind: "component", type: i2.BreadcrumbComponent, selector: "c8y-breadcrumb" }, { kind: "component", type: i2.BreadcrumbItemComponent, selector: "c8y-breadcrumb-item", inputs: ["icon", "translate", "label", "path", "injector"] }, { kind: "component", type: i2.EmptyStateComponent, selector: "c8y-ui-empty-state", inputs: ["icon", "title", "subtitle", "horizontal"] }, { kind: "directive", type: i2.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i2.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.ForOfDirective, selector: "[c8yFor]", inputs: ["c8yForOf", "c8yForLoadMore", "c8yForPipe", "c8yForNotFound", "c8yForMaxIterations", "c8yForLoadingTemplate", "c8yForLoadNextLabel", "c8yForRealtime", "c8yForRealtimeOptions", "c8yForComparator", "c8yForEnableVirtualScroll", "c8yForVirtualScrollElementSize", "c8yForVirtualScrollStrategy", "c8yForVirtualScrollContainerHeight"], outputs: ["c8yForCount"] }, { kind: "component", type: i2.TitleComponent, selector: "c8y-title", inputs: ["pageTitleUpdate"] }, { kind: "directive", type: i6.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i6.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i2.FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "directive", type: i2.RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "component", type: i2.ListGroupComponent, selector: "c8y-list-group" }, { kind: "component", type: i2.ListItemComponent, selector: "c8y-list-item, c8y-li", inputs: ["active", "emptyActions", "collapsed", "selectable"], outputs: ["collapsedChange"] }, { kind: "component", type: i2.ListItemIconComponent, selector: "c8y-list-item-icon, c8y-li-icon", inputs: ["icon", "status"] }, { kind: "component", type: i2.ListItemBodyComponent, selector: "c8y-list-item-body, c8y-li-body", inputs: ["body"] }, { kind: "component", type: i2.ListItemCollapseComponent, selector: "c8y-list-item-collapse, c8y-li-collapse", inputs: ["collapseWay"] }, { kind: "directive", type: i2.ProductExperienceDirective, selector: "[c8yProductExperience]", inputs: ["actionName", "actionData", "inherit", "suppressDataOverriding"] }, { kind: "component", type: i2.HelpComponent, selector: "c8y-help", inputs: ["src", "isCollapsed", "priority", "icon"] }, { kind: "directive", type: i7.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["adaptivePosition", "tooltip", "placement", "triggers", "container", "containerClass", "boundariesElement", "isOpen", "isDisabled", "delay", "tooltipHtml", "tooltipPlacement", "tooltipIsOpen", "tooltipEnable", "tooltipAppendToBody", "tooltipAnimation", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "tooltipFadeDuration", "tooltipTrigger"], outputs: ["tooltipChange", "onShown", "onHidden", "tooltipStateChanged"], exportAs: ["bs-tooltip"] }, { kind: "directive", type: i8.ButtonCheckboxDirective, selector: "[btnCheckbox]", inputs: ["btnCheckboxTrue", "btnCheckboxFalse"] }, { kind: "directive", type: i9.PopoverDirective, selector: "[popover]", inputs: ["adaptivePosition", "boundariesElement", "popover", "popoverContext", "popoverTitle", "placement", "outsideClick", "triggers", "container", "containerClass", "isOpen", "delay"], outputs: ["onShown", "onHidden"], exportAs: ["bs-popover"] }, { kind: "pipe", type: i2.C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }, { kind: "pipe", type: i2.DatePipe, name: "c8yDate" }] }); }
178
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: TrustedCertificateListComponent, selector: "c8y-trusted-certificates", ngImport: i0, template: "<c8y-title>{{ 'Trusted certificates' | translate }}</c8y-title>\n\n<c8y-breadcrumb>\n <c8y-breadcrumb-item\n icon=\"c8y-management\"\n label=\"{{ 'Management' | translate }}\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n icon=\"certificate\"\n label=\"{{ 'Trusted certificates' | translate }}\"\n ></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <button\n class=\"btn btn-link\"\n title=\"{{ 'Add trusted certificate' | translate }}\"\n type=\"button\"\n (click)=\"addTrustedCertificate()\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Add trusted certificate' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <button\n class=\"btn btn-link\"\n title=\"{{ 'Reload' | translate }}\"\n type=\"button\"\n (click)=\"loadTrustedCertificates()\"\n >\n <i\n c8yIcon=\"refresh\"\n [ngClass]=\"{ 'icon-spin': reloading | async }\"\n ></i>\n {{ 'Reload' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-help\n src=\"/docs/device-management-application/managing-device-data/#managing-trusted-certificates\"\n></c8y-help>\n\n<c8y-ui-empty-state\n [icon]=\"'certificate'\"\n [title]=\"'No trusted certificates to display.' | translate\"\n [subtitle]=\"'Add your first certificate by clicking below.' | translate\"\n *ngIf=\"(trustedCertificates | async)?.data.length === 0\"\n>\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Add trusted certificate' | translate }}\"\n type=\"button\"\n (click)=\"addTrustedCertificate()\"\n >\n {{ 'Add trusted certificate' | translate }}\n </button>\n</c8y-ui-empty-state>\n\n<c8y-list-group class=\"m-b-24\">\n <div\n class=\"page-sticky-header hidden-xs c8y-list__item c8y-list__item--empty-actions\"\n *ngIf=\"(trustedCertificates | async)?.data.length > 0\"\n >\n <div class=\"c8y-list__item__block\">\n <div class=\"c8y-list__item__icon\">\n <i\n class=\"invisible\"\n c8yIcon=\"certificate\"\n ></i>\n </div>\n <div class=\"c8y-list__item__body\">\n <div class=\"content-flex-60\">\n <div class=\"col-2\">\n <span\n class=\"text-truncate\"\n title=\" {{ 'Certificate' | translate }} \"\n >\n {{ 'Certificate' | translate }}\n </span>\n </div>\n <div class=\"col-2\">\n <span\n class=\"text-truncate\"\n title=\"{{ 'Status' | translate }}\"\n >\n {{ 'Status' | translate }}\n </span>\n </div>\n <div class=\"col-2\">\n <span\n class=\"text-truncate\"\n title=\"{{ 'Algorithm' | translate }}\"\n >\n {{ 'Algorithm' | translate }}\n </span>\n </div>\n <div class=\"col-2\">\n <span\n class=\"text-truncate\"\n title=\"{{ 'Expiration date' | translate }}\"\n >\n {{ 'Expiration date' | translate }}\n </span>\n </div>\n <div class=\"col-2\">\n <span\n class=\"text-truncate\"\n title=\" {{ 'Auto registration' | translate }}\"\n >\n {{ 'Auto registration' | translate }}\n </span>\n </div>\n <div class=\"col-2\">\n <span\n class=\"text-truncate\"\n title=\" {{ 'Proof of possession' | translate }}\"\n >\n {{ 'Proof of possession' | translate }}\n </span>\n </div>\n </div>\n </div>\n <div class=\"c8y-list__item__actions\"></div>\n </div>\n </div>\n\n <c8y-li\n *c8yFor=\"\n let trustedCertificate of trustedCertificates | async;\n let i = index;\n pipe: sortByExpirationDateAsc;\n loadMore: 'none'\n \"\n #listItem\n data-cy=\"c8y-trusted-certificates-list--item-block\"\n >\n <c8y-li-icon>\n <i c8yIcon=\"certificate\"></i>\n </c8y-li-icon>\n\n <c8y-li-body class=\"content-flex-60\">\n <div class=\"col-2\">\n <button\n class=\"btn-clean text-truncate\"\n title=\"{{ trustedCertificate.name }}\"\n type=\"button\"\n (click)=\"listItem.toggleCollapsed()\"\n >\n {{ trustedCertificate.name }}\n </button>\n </div>\n <div class=\"col-2\">\n <div class=\"visible-xs p-8\"></div>\n <button\n class=\"btn c8y-btn-checkbox--inline\"\n name=\"certificateStatus\"\n type=\"button\"\n [(ngModel)]=\"trustedCertificate.status\"\n btnCheckbox\n btnCheckboxTrue=\"ENABLED\"\n btnCheckboxFalse=\"DISABLED\"\n (ngModelChange)=\"updateCertificate(trustedCertificate, { status: $event })\"\n >\n <small\n title=\"{{ 'Disabled`trusted certificate status`' | translate }}\"\n [hidden]=\"trustedCertificate.status !== 'DISABLED'\"\n >\n {{ 'Disabled`trusted certificate status`' | translate }}\n </small>\n <small\n title=\"{{ 'Enabled`trusted certificate status`' | translate }}\"\n [hidden]=\"trustedCertificate.status !== 'ENABLED'\"\n >\n {{ 'Enabled`trusted certificate status`' | translate }}\n </small>\n </button>\n <div class=\"visible-xs p-8\"></div>\n </div>\n <div class=\"col-2\">\n <div\n class=\"text-truncate\"\n title=\"{{ 'Algorithm' | translate }}: {{ trustedCertificate.algorithmName }}\"\n >\n <span\n class=\"text-label-small m-t-8 m-r-8 visible-xs-inline\"\n translate\n >\n Algorithm\n </span>\n {{ trustedCertificate.algorithmName }}\n </div>\n </div>\n\n <div class=\"col-2\">\n <div\n class=\"text-truncate\"\n title=\"{{ 'Expiration date' | translate }}: {{ trustedCertificate.notAfter | c8yDate }}\"\n >\n <span\n class=\"text-label-small m-t-8 m-r-8 visible-xs-inline\"\n translate\n >\n Expiration date\n </span>\n <small [ngClass]=\"highlightDependingOnExpirationStatus(trustedCertificate)\">\n <i\n class=\"m-r-4\"\n c8yIcon=\"calendar\"\n *ngIf=\"!highlightDependingOnExpirationStatus(trustedCertificate)\"\n ></i>\n <i\n class=\"m-r-4\"\n c8yIcon=\"warning\"\n *ngIf=\"highlightDependingOnExpirationStatus(trustedCertificate)\"\n ></i>\n <span>{{ trustedCertificate.notAfter | c8yDate }}</span>\n </small>\n </div>\n </div>\n <div class=\"col-2\">\n <div class=\"text-truncate\">\n <span class=\"text-label-small m-t-8 m-r-4 visible-xs-inline\">\n {{ 'Auto registration' | translate }}\n </span>\n <span\n title=\"{{ 'Auto registration' | translate }}: {{\n 'Enabled`auto registration`' | translate\n }}\"\n *ngIf=\"trustedCertificate.autoRegistrationEnabled\"\n >\n {{ 'Enabled`auto registration`' | translate }}\n </span>\n <span\n title=\"{{ 'Auto registration' | translate }}: {{\n 'Disabled`auto registration`' | translate\n }}\"\n *ngIf=\"!trustedCertificate.autoRegistrationEnabled\"\n >\n {{ 'Disabled`auto registration`' | translate }}\n </span>\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ AUTO_REGISTRATION_POPOVER | translate }}\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n type=\"button\"\n ></button>\n </div>\n </div>\n <div class=\"col-2 d-flex\">\n <div class=\"text-truncate\">\n <span class=\"text-label-small m-t-8 m-r-4 visible-xs-inline\">\n {{ 'Proof of possession' | translate }}\n </span>\n <span\n title=\"{{ 'Proof of possession' | translate }}: {{\n 'Complete`proof of possession`' | translate\n }}\"\n *ngIf=\"trustedCertificate.proofOfPossessionValid\"\n >\n <div class=\"icon-flex\">\n <i\n class=\"text-success\"\n c8yIcon=\"success\"\n ></i>\n {{ 'Complete`proof of possession`' | translate }}\n </div>\n </span>\n <span\n title=\"{{ 'Proof of possession' | translate }}: {{\n 'Incomplete`proof of possession`' | translate\n }}\"\n *ngIf=\"!trustedCertificate.proofOfPossessionValid\"\n >\n <div class=\"icon-flex\">\n <i\n class=\"text-warning\"\n c8yIcon=\"warning\"\n ></i>\n {{ 'Incomplete`proof of possession`' | translate }}\n </div>\n </span>\n </div>\n <button\n class=\"m-l-auto btn-dot btn-dot--danger btn showOnHover m-r-8\"\n [attr.aria-label]=\"'Delete' | translate\"\n tooltip=\"{{ 'Delete' | translate }}\"\n placement=\"right\"\n type=\"button\"\n data-cy=\"c8y-trusted-certificate--delete\"\n [delay]=\"500\"\n (click)=\"deleteTrustedCertificate(trustedCertificate)\"\n >\n <i c8yIcon=\"delete\"></i>\n </button>\n </div>\n </c8y-li-body>\n\n <c8y-li-collapse>\n <div class=\"p-t-16 p-b-16\">\n <div class=\"row\">\n <div class=\"col-md-4\">\n <c8y-form-group>\n <label class=\"control-label\">\n {{ 'Certificate name' | translate }}\n </label>\n <div class=\"input-group input-group-editable\">\n <input\n class=\"form-control\"\n type=\"text\"\n required\n data-cy=\"c8y-trusted-certificates--edit-certificate-name\"\n [(ngModel)]=\"trustedCertificate.name\"\n />\n <span></span>\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Update certificate name' | translate }}\"\n type=\"button\"\n (click)=\"\n updateCertificate(trustedCertificate, { name: trustedCertificate.name })\n \"\n [disabled]=\"!trustedCertificate.name\"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n </div>\n </c8y-form-group>\n </div>\n <div class=\"col-md-1\"></div>\n <div class=\"col-md-7\">\n <c8y-form-group>\n <label\n class=\"control-label\"\n for=\"certInPemFormat\"\n translate\n >\n Certificate\n </label>\n <textarea\n class=\"form-control no-resize\"\n id=\"certInPemFormat\"\n name=\"certInPemFormat\"\n type=\"text\"\n rows=\"7\"\n readonly\n [(ngModel)]=\"trustedCertificate.certInPemFormat\"\n ></textarea>\n </c8y-form-group>\n <c8y-form-group>\n <label\n class=\"c8y-checkbox\"\n title=\"{{ 'Auto registration' | translate }}\"\n >\n <input\n type=\"checkbox\"\n [(ngModel)]=\"trustedCertificate.autoRegistrationEnabled\"\n (ngModelChange)=\"\n updateCertificate(trustedCertificate, { autoRegistrationEnabled: $event })\n \"\n />\n <span></span>\n <span>{{ 'Auto registration' | translate }}</span>\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ AUTO_REGISTRATION_POPOVER | translate }}\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n type=\"button\"\n ></button>\n </label>\n </c8y-form-group>\n </div>\n </div>\n <div class=\"row\">\n <div class=\"col-md-4\">\n <div\n class=\"legend form-block\"\n translate\n >\n Additional properties\n </div>\n <ul class=\"list-unstyled\">\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Algorithm' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.algorithmName }}\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Version' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.version }}\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Valid from' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.notBefore | c8yDate }}\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Issuer' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.issuer }}\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Expiration date' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.notAfter | c8yDate }}\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Serial number' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.serialNumber }}\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Subject`of a certificate`' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.subject }}\n </span>\n </li>\n </ul>\n </div>\n <div class=\"col-md-1\"></div>\n <div class=\"col-md-7\">\n <div class=\"legend form-block\">\n {{ 'Proof of possession' | translate }}\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ PROOF_OF_POSSESSION_POPOVER | translate }}\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n type=\"button\"\n ></button>\n </div>\n <div *ngIf=\"trustedCertificate.proofOfPossessionValid\">\n <span\n class=\"icon-flex\"\n title=\"{{ 'Proof of possession' | translate }}: {{\n 'Complete`proof of possession`' | translate\n }}\"\n >\n <i\n class=\"text-success\"\n c8yIcon=\"success\"\n ></i>\n {{ 'Complete`proof of possession`' | translate }}\n </span>\n </div>\n <div *ngIf=\"!trustedCertificate.proofOfPossessionValid\">\n <div class=\"row m-b-16\">\n <div class=\"col-md-6\">\n <span\n class=\"icon-flex\"\n title=\"{{ 'Proof of possession' | translate }}: {{\n 'Incomplete`proof of possession`' | translate\n }}\"\n >\n <i\n class=\"text-warning\"\n c8yIcon=\"warning\"\n ></i>\n {{ 'Incomplete`proof of possession`' | translate }}\n </span>\n </div>\n <div class=\"col-md-6 col-lg-6 text-right-md\">\n <span class=\"text-label-small m-r-4\">\n {{ 'Verification code expires/expired on' | translate }}\n </span>\n {{\n (trustedCertificate.proofOfPossessionVerificationCodeUsableUntil | c8yDate) ||\n '---'\n }}\n </div>\n </div>\n <div class=\"row\">\n <div class=\"col-md-6 col-lg-6\">\n <c8y-form-group>\n <label\n class=\"control-label\"\n for=\"unsignedVerificationCode\"\n translate\n >\n Verification code\n </label>\n <textarea\n class=\"form-control no-resize\"\n id=\"unsignedVerificationCode\"\n name=\"unsignedVerificationCode\"\n type=\"text\"\n rows=\"5\"\n readonly\n [(ngModel)]=\"trustedCertificate.proofOfPossessionUnsignedVerificationCode\"\n ></textarea>\n </c8y-form-group>\n <div class=\"d-flex\">\n <button\n class=\"btn btn-primary btn-sm\"\n title=\"{{ 'Regenerate verification code' | translate }}\"\n type=\"button\"\n (click)=\"regenerateUnsignedVerificationCode(trustedCertificate)\"\n >\n {{ 'Regenerate`verification code`' | translate }}\n </button>\n\n <button\n class=\"btn btn-sm btn-default m-l-auto m-r-0\"\n [attr.aria-label]=\"'Copy to clipboard' | translate\"\n tooltip=\"{{ 'Copy to clipboard' | translate }}\"\n placement=\"right\"\n type=\"button\"\n data-cy=\"c8y-trusted-certificates--copy-to-clipboard\"\n [delay]=\"500\"\n [disabled]=\"!trustedCertificate.proofOfPossessionUnsignedVerificationCode\"\n (click)=\"copyUnsignedVerificationCodeToClipboard(trustedCertificate)\"\n >\n <i c8yIcon=\"clipboard\"></i>\n </button>\n <button\n class=\"btn btn-default btn-sm\"\n [attr.aria-label]=\"'Download as file' | translate\"\n tooltip=\"{{ 'Download as file' | translate }}\"\n type=\"button\"\n data-cy=\"c8y-trusted-certificates--download-as-file\"\n [delay]=\"500\"\n [disabled]=\"!trustedCertificate.proofOfPossessionUnsignedVerificationCode\"\n (click)=\"downloadUnsignedVerificationCode(trustedCertificate)\"\n c8yProductExperience\n [actionName]=\"PRODUCT_EXPERIENCE.EVENT\"\n [actionData]=\"{\n component: PRODUCT_EXPERIENCE.VERIFICATION_CODE.COMPONENTS.DOWNLOAD_CODE,\n action: PRODUCT_EXPERIENCE.VERIFICATION_CODE.ACTIONS.DOWNLOAD\n }\"\n >\n <i c8yIcon=\"download\"></i>\n </button>\n </div>\n </div>\n\n <div class=\"col-md-6 col-lg-6\">\n <c8y-form-group>\n <label\n class=\"control-label\"\n for=\"signedVerificationCode\"\n >\n {{ 'Signed verification code' | translate }}\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ SIGNED_VERIFICATION_CODE_POPOVER | translate }}\"\n placement=\"top\"\n container=\"body\"\n type=\"button\"\n data-cy=\"c8y-trusted-certificates--signed-verification-code-popup\"\n [outsideClick]=\"true\"\n ></button>\n </label>\n <textarea\n class=\"form-control no-resize\"\n id=\"signedVerificationCode\"\n name=\"signedVerificationCode\"\n type=\"text\"\n rows=\"5\"\n [(ngModel)]=\"trustedCertificate.signedVerificationCode\"\n ></textarea>\n </c8y-form-group>\n <div class=\"d-flex\">\n <button\n class=\"btn btn-primary btn-sm\"\n title=\"{{ 'Verify signed verification code' | translate }}\"\n type=\"button\"\n (click)=\"verifySignedVerificationCode(trustedCertificate)\"\n [disabled]=\"!trustedCertificate.signedVerificationCode\"\n >\n {{ 'Verify`signed verification code`' | translate }}\n </button>\n <button\n class=\"btn btn-sm btn-default m-l-auto\"\n [attr.aria-label]=\"'Upload file' | translate\"\n tooltip=\"{{ 'Upload file' | translate }}\"\n type=\"button\"\n [delay]=\"500\"\n (click)=\"fileInput.click()\"\n >\n <i c8yIcon=\"upload\"></i>\n </button>\n <input\n class=\"hidden\"\n type=\"file\"\n #fileInput\n (change)=\"onFileInput($event, trustedCertificate)\"\n />\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </c8y-li-collapse>\n </c8y-li>\n</c8y-list-group>\n", dependencies: [{ kind: "component", type: i2.ActionBarItemComponent, selector: "c8y-action-bar-item", inputs: ["placement", "priority", "itemClass", "injector", "groupId", "inGroupPriority"] }, { kind: "component", type: i2.BreadcrumbComponent, selector: "c8y-breadcrumb" }, { kind: "component", type: i2.BreadcrumbItemComponent, selector: "c8y-breadcrumb-item", inputs: ["icon", "translate", "label", "path", "injector"] }, { kind: "component", type: i2.EmptyStateComponent, selector: "c8y-ui-empty-state", inputs: ["icon", "title", "subtitle", "horizontal"] }, { kind: "directive", type: i2.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i2.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.ForOfDirective, selector: "[c8yFor]", inputs: ["c8yForOf", "c8yForLoadMore", "c8yForPipe", "c8yForNotFound", "c8yForMaxIterations", "c8yForLoadingTemplate", "c8yForLoadNextLabel", "c8yForLoadingLabel", "c8yForRealtime", "c8yForRealtimeOptions", "c8yForComparator", "c8yForEnableVirtualScroll", "c8yForVirtualScrollElementSize", "c8yForVirtualScrollStrategy", "c8yForVirtualScrollContainerHeight"], outputs: ["c8yForCount", "c8yForLoadMoreComponent"] }, { kind: "component", type: i2.TitleComponent, selector: "c8y-title", inputs: ["pageTitleUpdate"] }, { kind: "directive", type: i6.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i6.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i2.FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "directive", type: i2.RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "component", type: i2.ListGroupComponent, selector: "c8y-list-group" }, { kind: "component", type: i2.ListItemComponent, selector: "c8y-list-item, c8y-li", inputs: ["active", "emptyActions", "collapsed", "selectable"], outputs: ["collapsedChange"] }, { kind: "component", type: i2.ListItemIconComponent, selector: "c8y-list-item-icon, c8y-li-icon", inputs: ["icon", "status"] }, { kind: "component", type: i2.ListItemBodyComponent, selector: "c8y-list-item-body, c8y-li-body", inputs: ["body"] }, { kind: "component", type: i2.ListItemCollapseComponent, selector: "c8y-list-item-collapse, c8y-li-collapse", inputs: ["collapseWay"] }, { kind: "directive", type: i2.ProductExperienceDirective, selector: "[c8yProductExperience]", inputs: ["actionName", "actionData", "inherit", "suppressDataOverriding"] }, { kind: "component", type: i2.HelpComponent, selector: "c8y-help", inputs: ["src", "isCollapsed", "priority", "icon"] }, { kind: "directive", type: i7.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["adaptivePosition", "tooltip", "placement", "triggers", "container", "containerClass", "boundariesElement", "isOpen", "isDisabled", "delay", "tooltipHtml", "tooltipPlacement", "tooltipIsOpen", "tooltipEnable", "tooltipAppendToBody", "tooltipAnimation", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "tooltipFadeDuration", "tooltipTrigger"], outputs: ["tooltipChange", "onShown", "onHidden", "tooltipStateChanged"], exportAs: ["bs-tooltip"] }, { kind: "directive", type: i8.ButtonCheckboxDirective, selector: "[btnCheckbox]", inputs: ["btnCheckboxTrue", "btnCheckboxFalse"] }, { kind: "directive", type: i9.PopoverDirective, selector: "[popover]", inputs: ["adaptivePosition", "boundariesElement", "popover", "popoverContext", "popoverTitle", "placement", "outsideClick", "triggers", "container", "containerClass", "isOpen", "delay"], outputs: ["onShown", "onHidden"], exportAs: ["bs-popover"] }, { kind: "pipe", type: i2.C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }, { kind: "pipe", type: i2.DatePipe, name: "c8yDate" }] }); }
179
179
  }
180
180
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TrustedCertificateListComponent, decorators: [{
181
181
  type: Component,
@@ -162,7 +162,7 @@ export class MapWidgetConfigComponent {
162
162
  this.previewMap.addMarkerToMap(this.centerIcon);
163
163
  }
164
164
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: MapWidgetConfigComponent, deps: [{ token: i1.MapService }, { token: i2.AlertService }, { token: i3.TranslateService }, { token: MAP_DEFAULT_CONFIG }], target: i0.ɵɵFactoryTarget.Component }); }
165
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: MapWidgetConfigComponent, selector: "c8y-map-widget-config", inputs: { config: "config" }, viewQueries: [{ propertyName: "previewMap", first: true, predicate: MapComponent, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"row p-t-16\" *ngIf=\"formConfig\">\n <div class=\"col-xs-2\">\n <c8y-form-group class=\"m-b-0 text-center form-group-sm\">\n <label translate>Marker icon</label>\n <c8y-icon-selector-wrapper\n [canRemoveIcon]=\"true\"\n [selectedIcon]=\"formConfig.icon\"\n (onSelect)=\"selectIcon($event)\"\n ></c8y-icon-selector-wrapper>\n </c8y-form-group>\n </div>\n <div class=\"col-xs-10\">\n <div class=\"row tight-grid separator-bottom\">\n <div class=\"col-xs-4\">\n <div class=\"form-group form-group-sm\">\n <label translate>Zoom level</label>\n <c8y-range\n class=\"label-bottom\"\n #range\n [(ngModel)]=\"formConfig.zoomLevel\"\n (change)=\"zoomLevelChanged()\"\n name=\"zoomLevel\"\n >\n <input type=\"range\" min=\"2\" max=\"18\" step=\"1\" />\n </c8y-range>\n </div>\n </div>\n <div class=\"col-xs-8\">\n <c8y-form-group class=\"form-group-sm m-b-8\">\n <label translate>Center bound</label>\n <div class=\"input-group input-group-sm\">\n <input\n class=\"form-control\"\n [(ngModel)]=\"formConfig.center[0]\"\n (change)=\"changeCenter()\"\n placeholder=\"lat\"\n name=\"centerLat\"\n type=\"number\"\n required\n />\n <input\n class=\"form-control\"\n [(ngModel)]=\"formConfig.center[1]\"\n (change)=\"changeCenter()\"\n placeholder=\"lng\"\n name=\"centerLng\"\n type=\"number\"\n required\n />\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-default\"\n [attr.aria-label]=\"'Use your location' | translate\"\n [tooltip]=\"'Use your location' | translate\"\n (click)=\"useOwnPosition()\"\n placement=\"top\"\n container=\"body\"\n >\n <i class=\"icon-14\" c8yIcon=\"location-arrow\"></i>\n </button>\n </div>\n <div class=\"input-group-btn\" *ngIf=\"canAutoCenter\">\n <button\n class=\"btn btn-default\"\n [attr.aria-label]=\"'Use selected asset location' | translate\"\n [tooltip]=\"'Use selected asset location' | translate\"\n (click)=\"centerToAsset()\"\n placement=\"top\"\n container=\"body\"\n >\n <i class=\"icon-14\" c8yIcon=\"location\"></i>\n </button>\n </div>\n </div>\n <div class=\"help-block\">\n {{ 'Drag the map to the desired position' | translate }}\n </div>\n </c8y-form-group>\n </div>\n </div>\n\n <div class=\"row tight-grid p-t-8 d-flex a-i-center\">\n <div class=\"col-xs-6\">\n <c8y-form-group class=\"m-b-0 form-group-sm\">\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control\"\n id=\"selectExample\"\n [(ngModel)]=\"refreshOptions\"\n (change)=\"updateRefreshOptions()\"\n title=\"{{ 'Refresh options' | translate }}\"\n name=\"refreshSelection\"\n >\n <option [title]=\"'Only refreshing on interaction' | translate\" value=\"none\" translate>\n No automatic refresh\n </option>\n <option\n *ngIf=\"!isPositionedDevice\"\n [title]=\"'Refreshing after a give interval and on interaction' | translate\"\n value=\"interval\"\n translate\n >\n Use refresh interval\n </option>\n <option\n *ngIf=\"isPositionedDevice\"\n [title]=\"'Live updating on each position change' | translate\"\n value=\"realtime\"\n translate\n >\n Realtime\n </option>\n <option\n *ngIf=\"isPositionedDevice\"\n [title]=\"'Bind widget to dashboard realtime context' | translate\"\n value=\"dashboard-realtime-context\"\n translate\n >\n Dashboard realtime context\n </option>\n </select>\n </div>\n </c8y-form-group>\n </div>\n <div class=\"col-xs-8\">\n <div class=\"form-group form-group-sm m-b-0\">\n <c8y-range\n class=\"label-bottom\"\n #intervalRange\n *ngIf=\"refreshOptions === 'interval'\"\n [(ngModel)]=\"formConfig.refreshInterval\"\n name=\"refreshInterval\"\n >\n <ng-template #c8yRangeValue>\n <div>\n <span\n [translateParams]=\"{ intervalInSeconds: intervalRange.value * 0.001 }\"\n translate\n ngNonBindable\n >\n {{ intervalInSeconds }} s\n </span>\n </div>\n </ng-template>\n <input type=\"range\" min=\"5000\" max=\"100000\" step=\"1000\" />\n </c8y-range>\n </div>\n <label\n class=\"c8y-switch c8y-switch--inline\"\n *ngIf=\"refreshOptions === 'realtime' || refreshOptions === 'dashboard-realtime-context'\"\n >\n <input [(ngModel)]=\"formConfig.follow\" name=\"follow\" type=\"checkbox\" />\n <span></span>\n <span class=\"text-12\" translate>Follow selected</span>\n </label>\n </div>\n </div>\n </div>\n</div>\n\n<div class=\"p-t-16 p-b-16\" style=\"width: 100%; height: 240px\">\n <c8y-map\n *ngIf=\"config.mapConfig\"\n [assets]=\"assets\"\n [config]=\"config.mapConfig\"\n (onMove)=\"onPreviewMapMove($event)\"\n (onZoomStart)=\"onPreviewZoomStart()\"\n (onZoomEnd)=\"onPreviewZoomEnd($event)\"\n (onInit)=\"previewMapInit($event)\"\n ></c8y-map>\n</div>\n", dependencies: [{ kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i5.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i5.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i5.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i2.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i2.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i2.MinValidationDirective, selector: "[min]", inputs: ["min"] }, { kind: "directive", type: i2.MaxValidationDirective, selector: "[max]", inputs: ["max"] }, { kind: "component", type: i2.FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "directive", type: i2.RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "directive", type: i2.RangeDirective, selector: "input[type=\"range\"]" }, { kind: "component", type: i2.RangeComponent, selector: "c8y-range" }, { kind: "component", type: i6.IconSelectorWrapperComponent, selector: "c8y-icon-selector-wrapper", inputs: ["canRemoveIcon", "selectedIcon", "iconSize"], outputs: ["onSelect"] }, { kind: "component", type: i1.MapComponent, selector: "c8y-map", inputs: ["config", "assets"], outputs: ["onMove", "onMoveEnd", "onZoomStart", "onZoomEnd", "onRealtimeUpdate", "onInit"] }, { kind: "directive", type: i7.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["adaptivePosition", "tooltip", "placement", "triggers", "container", "containerClass", "boundariesElement", "isOpen", "isDisabled", "delay", "tooltipHtml", "tooltipPlacement", "tooltipIsOpen", "tooltipEnable", "tooltipAppendToBody", "tooltipAnimation", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "tooltipFadeDuration", "tooltipTrigger"], outputs: ["tooltipChange", "onShown", "onHidden", "tooltipStateChanged"], exportAs: ["bs-tooltip"] }, { kind: "pipe", type: i2.C8yTranslatePipe, name: "translate" }], viewProviders: [{ provide: ControlContainer, useExisting: NgForm }] }); }
165
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: MapWidgetConfigComponent, selector: "c8y-map-widget-config", inputs: { config: "config" }, viewQueries: [{ propertyName: "previewMap", first: true, predicate: MapComponent, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"row p-t-16\" *ngIf=\"formConfig\">\n <div class=\"col-xs-2\">\n <c8y-form-group class=\"m-b-0 text-center form-group-sm\">\n <label translate>Marker icon</label>\n <c8y-icon-selector-wrapper\n [canRemoveIcon]=\"true\"\n [selectedIcon]=\"formConfig.icon\"\n (onSelect)=\"selectIcon($event)\"\n ></c8y-icon-selector-wrapper>\n </c8y-form-group>\n </div>\n <div class=\"col-xs-10\">\n <div class=\"row tight-grid separator-bottom\">\n <div class=\"col-xs-4\">\n <div class=\"form-group form-group-sm\">\n <label translate>Zoom level</label>\n <c8y-range\n class=\"label-bottom\"\n #range\n [(ngModel)]=\"formConfig.zoomLevel\"\n (change)=\"zoomLevelChanged()\"\n name=\"zoomLevel\"\n >\n <input type=\"range\" min=\"2\" max=\"18\" step=\"1\" />\n </c8y-range>\n </div>\n </div>\n <div class=\"col-xs-8\">\n <c8y-form-group class=\"form-group-sm m-b-8\">\n <label translate>Center bound</label>\n <div class=\"input-group input-group-sm\">\n <input\n class=\"form-control\"\n [(ngModel)]=\"formConfig.center[0]\"\n (change)=\"changeCenter()\"\n placeholder=\"lat\"\n name=\"centerLat\"\n type=\"number\"\n required\n />\n <input\n class=\"form-control\"\n [(ngModel)]=\"formConfig.center[1]\"\n (change)=\"changeCenter()\"\n placeholder=\"lng\"\n name=\"centerLng\"\n type=\"number\"\n required\n />\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-default\"\n [attr.aria-label]=\"'Use your location' | translate\"\n [tooltip]=\"'Use your location' | translate\"\n (click)=\"useOwnPosition()\"\n placement=\"top\"\n container=\"body\"\n >\n <i class=\"icon-14\" c8yIcon=\"location-arrow\"></i>\n </button>\n </div>\n <div class=\"input-group-btn\" *ngIf=\"canAutoCenter\">\n <button\n class=\"btn btn-default\"\n [attr.aria-label]=\"'Use selected asset location' | translate\"\n [tooltip]=\"'Use selected asset location' | translate\"\n (click)=\"centerToAsset()\"\n placement=\"top\"\n container=\"body\"\n >\n <i class=\"icon-14\" c8yIcon=\"location\"></i>\n </button>\n </div>\n </div>\n <div class=\"help-block\">\n {{ 'Drag the map to the desired position' | translate }}\n </div>\n </c8y-form-group>\n </div>\n </div>\n\n <div class=\"row tight-grid p-t-8 d-flex a-i-center\">\n <div class=\"col-xs-6\">\n <c8y-form-group class=\"m-b-0 form-group-sm\">\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control\"\n id=\"selectExample\"\n [(ngModel)]=\"refreshOptions\"\n (change)=\"updateRefreshOptions()\"\n title=\"{{ 'Refresh options' | translate }}\"\n name=\"refreshSelection\"\n >\n <option [title]=\"'Only refreshing on interaction' | translate\" value=\"none\" translate>\n No automatic refresh\n </option>\n <option\n *ngIf=\"!isPositionedDevice\"\n [title]=\"'Refreshing after a give interval and on interaction' | translate\"\n value=\"interval\"\n translate\n >\n Use refresh interval\n </option>\n <option\n *ngIf=\"isPositionedDevice\"\n [title]=\"'Live updating on each position change' | translate\"\n value=\"realtime\"\n translate\n >\n Realtime\n </option>\n <option\n *ngIf=\"isPositionedDevice\"\n [title]=\"'Bind widget to dashboard realtime context' | translate\"\n value=\"dashboard-realtime-context\"\n translate\n >\n Dashboard realtime context\n </option>\n </select>\n </div>\n </c8y-form-group>\n </div>\n <div class=\"col-xs-8\">\n <div class=\"form-group form-group-sm m-b-0\">\n <c8y-range\n class=\"label-bottom\"\n #intervalRange\n *ngIf=\"refreshOptions === 'interval'\"\n [(ngModel)]=\"formConfig.refreshInterval\"\n name=\"refreshInterval\"\n >\n <ng-template #c8yRangeValue>\n <div>\n <span\n [translateParams]=\"{ intervalInSeconds: intervalRange.value * 0.001 }\"\n translate\n ngNonBindable\n >\n {{ intervalInSeconds }} s\n </span>\n </div>\n </ng-template>\n <input type=\"range\" min=\"5000\" max=\"100000\" step=\"1000\" />\n </c8y-range>\n </div>\n <label\n class=\"c8y-switch c8y-switch--inline\"\n *ngIf=\"refreshOptions === 'realtime' || refreshOptions === 'dashboard-realtime-context'\"\n >\n <input [(ngModel)]=\"formConfig.follow\" name=\"follow\" type=\"checkbox\" />\n <span></span>\n <span class=\"text-12\" translate>Follow selected</span>\n </label>\n </div>\n </div>\n </div>\n</div>\n\n<div class=\"p-t-16 p-b-16\" style=\"width: 100%; height: 240px\">\n <c8y-map\n *ngIf=\"config.mapConfig\"\n [assets]=\"assets\"\n [config]=\"config.mapConfig\"\n (onMove)=\"onPreviewMapMove($event)\"\n (onZoomStart)=\"onPreviewZoomStart()\"\n (onZoomEnd)=\"onPreviewZoomEnd($event)\"\n (onInit)=\"previewMapInit($event)\"\n ></c8y-map>\n</div>\n", dependencies: [{ kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i5.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i5.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i5.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i2.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i2.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i2.MinValidationDirective, selector: "[min]", inputs: ["min"] }, { kind: "directive", type: i2.MaxValidationDirective, selector: "[max]", inputs: ["max"] }, { kind: "component", type: i2.FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "directive", type: i2.RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "directive", type: i2.RangeDirective, selector: "input[type=\"range\"]" }, { kind: "component", type: i2.RangeComponent, selector: "c8y-range" }, { kind: "component", type: i6.IconSelectorWrapperComponent, selector: "c8y-icon-selector-wrapper", inputs: ["canRemoveIcon", "selectedIcon", "iconSize"], outputs: ["onSelect"] }, { kind: "component", type: i1.MapComponent, selector: "c8y-map", inputs: ["config", "assets", "polyline$", "polylineOptions"], outputs: ["onMove", "onMoveEnd", "onZoomStart", "onZoomEnd", "onRealtimeUpdate", "onInit"] }, { kind: "directive", type: i7.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["adaptivePosition", "tooltip", "placement", "triggers", "container", "containerClass", "boundariesElement", "isOpen", "isDisabled", "delay", "tooltipHtml", "tooltipPlacement", "tooltipIsOpen", "tooltipEnable", "tooltipAppendToBody", "tooltipAnimation", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "tooltipFadeDuration", "tooltipTrigger"], outputs: ["tooltipChange", "onShown", "onHidden", "tooltipStateChanged"], exportAs: ["bs-tooltip"] }, { kind: "pipe", type: i2.C8yTranslatePipe, name: "translate" }], viewProviders: [{ provide: ControlContainer, useExisting: NgForm }] }); }
166
166
  }
167
167
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: MapWidgetConfigComponent, decorators: [{
168
168
  type: Component,
@@ -176,4 +176,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
176
176
  type: ViewChild,
177
177
  args: [MapComponent]
178
178
  }] } });
179
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFwLXdpZGdldC1jb25maWcuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vd2lkZ2V0cy9pbXBsZW1lbnRhdGlvbnMvbWFwL21hcC13aWRnZXQtY29uZmlnLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3dpZGdldHMvaW1wbGVtZW50YXRpb25zL21hcC9tYXAtd2lkZ2V0LWNvbmZpZy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULE1BQU0sRUFDTixLQUFLLEVBS0wsU0FBUyxFQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMxRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRTVELE9BQU8sRUFFTCxrQkFBa0IsRUFDbEIsWUFBWSxFQUNaLFVBQVUsRUFFWCxNQUFNLHlCQUF5QixDQUFDO0FBQ2pDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRXZELE9BQU8sRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7Ozs7OztBQVEzQyxNQUFNLE9BQU8sd0JBQXdCO0lBbUJuQyxZQUNVLFVBQXNCLEVBQ3RCLFlBQTBCLEVBQzFCLGdCQUFrQyxFQUNOLGdCQUE4QztRQUgxRSxlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQ3RCLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQzFCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDTixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQThCO1FBdEIzRSxXQUFNLEdBQW9CO1lBQ2pDLFNBQVMsRUFBRSxTQUFTO1NBQ3JCLENBQUM7UUFJRixr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QUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFO1lBQ2hELElBQUk7U0FDTCxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDbEQsQ0FBQzsrR0FwTFUsd0JBQXdCLHdHQXVCekIsa0JBQWtCO21HQXZCakIsd0JBQXdCLHVJQWdCeEIsWUFBWSxxRUMvQ3pCLGtuTUEyS0EsbzVHRDlJaUIsQ0FBQyxFQUFFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLENBQUM7OzRGQUV4RCx3QkFBd0I7a0JBTHBDLFNBQVM7K0JBQ0UsdUJBQXVCLGlCQUVsQixDQUFDLEVBQUUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsQ0FBQzs7MEJBeUJoRSxNQUFNOzJCQUFDLGtCQUFrQjs0Q0F0Qm5CLE1BQU07c0JBQWQsS0FBSztnQkFnQkUsVUFBVTtzQkFEakIsU0FBUzt1QkFBQyxZQUFZIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBJbmplY3QsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBTaW1wbGVDaGFuZ2VzLFxuICBWaWV3Q2hpbGRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb250cm9sQ29udGFpbmVyLCBOZ0Zvcm0gfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBBbGVydFNlcnZpY2UsIGdldHRleHQgfSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzJztcbmltcG9ydCB0eXBlIHsgTWFwRGVmYXVsdENvbmZpZyB9IGZyb20gJ0BjOHkvZGV2a2l0L29wdGlvbnMnO1xuaW1wb3J0IHtcbiAgQ2x1c3Rlck1hcENvbmZpZyxcbiAgTUFQX0RFRkFVTFRfQ09ORklHLFxuICBNYXBDb21wb25lbnQsXG4gIE1hcFNlcnZpY2UsXG4gIFBvc2l0aW9uTWFuYWdlZE9iamVjdFxufSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzL21hcCc7XG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgdHlwZSBMIGZyb20gJ2xlYWZsZXQnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgTWFwV2lkZ2V0Q29uZmlnLCBSZWZyZXNoT3B0aW9ucyB9IGZyb20gJy4vbWFwLXdpZGdldC5tb2RlbCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2M4eS1tYXAtd2lkZ2V0LWNvbmZpZycsXG4gIHRlbXBsYXRlVXJsOiAnLi9tYXAtd2lkZ2V0LWNvbmZpZy5jb21wb25lbnQuaHRtbCcsXG4gIHZpZXdQcm92aWRlcnM6IFt7IHByb3ZpZGU6IENvbnRyb2xDb250YWluZXIsIHVzZUV4aXN0aW5nOiBOZ0Zvcm0gfV1cbn0pXG5leHBvcnQgY2xhc3MgTWFwV2lkZ2V0Q29uZmlnQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XG4gIEBJbnB1dCgpIGNvbmZpZzogTWFwV2lkZ2V0Q29uZmlnID0ge1xuICAgIG1hcENvbmZpZzogdW5kZWZpbmVkXG4gIH07XG5cbiAgZm9ybUNvbmZpZzogQ2x1c3Rlck1hcENvbmZpZztcblxuICBjYW5BdXRvQ2VudGVyID0gdHJ1ZTtcbiAgaXNQb3NpdGlvbmVkRGV2aWNlID0gZmFsc2U7XG4gIGFzc2V0czogUG9zaXRpb25NYW5hZ2VkT2JqZWN0W107XG4gIHJlZnJlc2hPcHRpb25zOiBSZWZyZXNoT3B0aW9ucyA9ICdub25lJztcblxuICBwcml2YXRlIGRlc3Ryb3llZCQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICBwcml2YXRlIGxlYWZsZXQ6IHR5cGVvZiBMO1xuICBwcml2YXRlIGNlbnRlckljb246IEwuTWFya2VyO1xuXG4gIEBWaWV3Q2hpbGQoTWFwQ29tcG9uZW50KVxuICBwcml2YXRlIHByZXZpZXdNYXA6IE1hcENvbXBvbmVudDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIG1hcFNlcnZpY2U6IE1hcFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBhbGVydFNlcnZpY2U6IEFsZXJ0U2VydmljZSxcbiAgICBwcml2YXRlIHRyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgQEluamVjdChNQVBfREVGQVVMVF9DT05GSUcpIHByaXZhdGUgZGVmYXVsdE1hcENvbmZpZzogT2JzZXJ2YWJsZTxNYXBEZWZhdWx0Q29uZmlnPlxuICApIHt9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5kZXN0cm95ZWQkLm5leHQoKTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuZGVmYXVsdE1hcENvbmZpZy5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3llZCQpKS5zdWJzY3JpYmUoZGVmYXVsdENvbmZpZyA9PiB7XG4gICAgICB0aGlzLmZvcm1Db25maWcgPSB7XG4gICAgICAgIHpvb21MZXZlbDogZGVmYXVsdENvbmZpZy56b29tTGV2ZWwsXG4gICAgICAgIGNlbnRlcjogZGVmYXVsdENvbmZpZy5jZW50ZXJcbiAgICAgIH07XG4gICAgICB0aGlzLmluaXRGb3JtKCk7XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBpbml0Rm9ybSgpIHtcbiAgICBpZiAoIXRoaXMuY29uZmlnLm1hcENvbmZpZykge1xuICAgICAgdGhpcy5jb25maWcubWFwQ29uZmlnID0gdGhpcy5mb3JtQ29uZmlnO1xuICAgIH1cbiAgICB0aGlzLmZvcm1Db25maWcgPSB7XG4gICAgICAuLi50aGlzLmZvcm1Db25maWcsXG4gICAgICAuLi50aGlzLmNvbmZpZy5tYXBDb25maWcsXG4gICAgICBkaXNhYmxlUGFuOiBmYWxzZVxuICAgIH07XG4gICAgYXdhaXQgdGhpcy51cGRhdGVBc3NldCgpO1xuICB9XG5cbiAgYXN5bmMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGlmIChcbiAgICAgIGNoYW5nZXMuY29uZmlnLmN1cnJlbnRWYWx1ZSAhPT0gY2hhbmdlcy5jb25maWcucHJldmlvdXNWYWx1ZSAmJlxuICAgICAgIWNoYW5nZXMuY29uZmlnLmZpcnN0Q2hhbmdlXG4gICAgKSB7XG4gICAgICBhd2FpdCB0aGlzLnVwZGF0ZUFzc2V0KCk7XG4gICAgfVxuICB9XG5cbiAgcHJldmlld01hcEluaXQobGVhZmxldDogdHlwZW9mIEwpOiB2b2lkIHtcbiAgICB0aGlzLmxlYWZsZXQgPSBsZWFmbGV0O1xuICAgIHRoaXMuYWRkQ2VudGVySWNvbih0aGlzLmZvcm1Db25maWcuY2VudGVyWzBdLCB0aGlzLmZvcm1Db25maWcuY2VudGVyWzFdKTtcbiAgfVxuXG4gIG9uQmVmb3JlU2F2ZSgpIHtcbiAgICB0aGlzLmNvbmZpZy5tYXBDb25maWcgPSB0aGlzLmZvcm1Db25maWc7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICB6b29tTGV2ZWxDaGFuZ2VkKCkge1xuICAgIHRoaXMuY29uZmlnLm1hcENvbmZpZyA9IHtcbiAgICAgIC4uLnRoaXMuY29uZmlnLm1hcENvbmZpZyxcbiAgICAgIHpvb21MZXZlbDogdGhpcy5mb3JtQ29uZmlnLnpvb21MZXZlbFxuICAgIH07XG4gIH1cblxuICBjaGFuZ2VDZW50ZXIoKSB7XG4gICAgdGhpcy5jb25maWcubWFwQ29uZmlnID0geyAuLi50aGlzLmZvcm1Db25maWcsIGNlbnRlcjogdGhpcy5mb3JtQ29uZmlnLmNlbnRlciB9O1xuICB9XG5cbiAgb25QcmV2aWV3Wm9vbVN0YXJ0KCkge1xuICAgIHRoaXMuY2VudGVySWNvbi5yZW1vdmUoKTtcbiAgfVxuXG4gIG9uUHJldmlld1pvb21FbmQoZXZlbnQ6IEwuTGVhZmxldEV2ZW50KSB7XG4gICAgdGhpcy5mb3JtQ29uZmlnLnpvb21MZXZlbCA9IE1hdGguZmxvb3IoZXZlbnQudGFyZ2V0LmdldFpvb20oKSk7XG4gIH1cblxuICBvblByZXZpZXdNYXBNb3ZlKGV2ZW50OiBMLkxlYWZsZXRFdmVudCkge1xuICAgIGlmICh0aGlzLmNlbnRlckljb24pIHtcbiAgICAgIHRoaXMuY2VudGVySWNvbi5yZW1vdmUoKTtcbiAgICB9XG4gICAgY29uc3QgeyBsYXQsIGxuZyB9ID0gZXZlbnQudGFyZ2V0LmdldEJvdW5kcygpLmdldENlbnRlcigpO1xuICAgIHRoaXMuYWRkQ2VudGVySWNvbihsYXQsIGxuZyk7XG4gICAgdGhpcy5mb3JtQ29uZmlnLmNlbnRlciA9IFtsYXQsIGxuZ107XG4gIH1cblxuICB1c2VPd25Qb3NpdGlvbigpIHtcbiAgICBuYXZpZ2F0b3IuZ2VvbG9jYXRpb24uZ2V0Q3VycmVudFBvc2l0aW9uKCh7IGNvb3JkcyB9KSA9PiB7XG4gICAgICB0aGlzLmZvcm1Db25maWcuY2VudGVyID0gW2Nvb3Jkcy5sYXRpdHVkZSwgY29vcmRzLmxvbmdpdHVkZV07XG4gICAgICB0aGlzLmNoYW5nZUNlbnRlcigpO1xuICAgIH0pO1xuICB9XG5cbiAgY2VudGVyVG9Bc3NldCgpIHtcbiAgICB0aGlzLmZvcm1Db25maWcuY2VudGVyID0gW1xuICAgICAgdGhpcy5jb25maWcuZGV2aWNlLmM4eV9Qb3NpdGlvbi5sYXQsXG4gICAgICB0aGlzLmNvbmZpZy5kZXZpY2UuYzh5X1Bvc2l0aW9uLmxuZ1xuICAgIF07XG4gICAgdGhpcy5jaGFuZ2VDZW50ZXIoKTtcbiAgfVxuXG4gIHVwZGF0ZVJlZnJlc2hPcHRpb25zKCkge1xuICAgIHRoaXMuZm9ybUNvbmZpZy5yZWFsdGltZSA9IHRoaXMucmVmcmVzaE9wdGlvbnMgPT09ICdyZWFsdGltZSc7XG4gICAgaWYgKHRoaXMucmVmcmVzaE9wdGlvbnMgPT09ICdpbnRlcnZhbCcpIHtcbiAgICAgIHRoaXMuZm9ybUNvbmZpZy5yZWZyZXNoSW50ZXJ2YWwgPz89IDUwMDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZm9ybUNvbmZpZy5yZWZyZXNoSW50ZXJ2YWwgPSBudWxsO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuZm9ybUNvbmZpZy5yZWFsdGltZSkge1xuICAgICAgdGhpcy5mb3JtQ29uZmlnLmZvbGxvdyA9IGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLmNvbmZpZy53aWRnZXRJbnN0YW5jZUdsb2JhbFRpbWVDb250ZXh0ID1cbiAgICAgIHRoaXMucmVmcmVzaE9wdGlvbnMgPT09ICdkYXNoYm9hcmQtcmVhbHRpbWUtY29udGV4dCc7XG4gICAgaWYgKHRoaXMuY29uZmlnLndpZGdldEluc3RhbmNlR2xvYmFsVGltZUNvbnRleHQpIHtcbiAgICAgIHRoaXMuZm9ybUNvbmZpZy5yZWFsdGltZSA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgc2VsZWN0SWNvbihpY29uOiBzdHJpbmcpIHtcbiAgICB0aGlzLmZvcm1Db25maWcuaWNvbiA9IGljb247XG4gICAgdGhpcy5jb25maWcubWFwQ29uZmlnLmljb24gPSBpY29uO1xuICAgIHRoaXMucHJldmlld01hcC5yZWZyZXNoTWFya2VycygpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB1cGRhdGVBc3NldCgpIHtcbiAgICB0aGlzLmNhbkF1dG9DZW50ZXIgPSB0aGlzLm1hcFNlcnZpY2UuaGFzUG9zaXRpb24odGhpcy5jb25maWcuZGV2aWNlKTtcbiAgICB0aGlzLmlzUG9zaXRpb25lZERldmljZSA9IHRoaXMubWFwU2VydmljZS5pc1Bvc2l0aW9uZWREZXZpY2UodGhpcy5jb25maWcuZGV2aWNlKTtcbiAgICB0aGlzLnJlZnJlc2hPcHRpb25zID0gdGhpcy5nZXRSZWZyZXNoT3B0aW9ucygpO1xuICAgIHRoaXMudXBkYXRlUmVmcmVzaE9wdGlvbnMoKTtcblxuICAgIGNvbnN0IHsgZGF0YSwgcGFnaW5nIH0gPSBhd2FpdCB0aGlzLm1hcFNlcnZpY2UuZ2V0QWxsUG9zaXRpb25NT3ModGhpcy5jb25maWcuZGV2aWNlKTtcbiAgICB0aGlzLmFzc2V0cyA9IGRhdGE7XG4gICAgaWYgKHBhZ2luZy50b3RhbFBhZ2VzID4gMSkge1xuICAgICAgdGhpcy5hbGVydFNlcnZpY2UuZGFuZ2VyKFxuICAgICAgICBnZXR0ZXh0KFxuICAgICAgICAgICdJdCBtaWdodCBiZSBwb3NzaWJsZSB0aGF0IGFzc2V0cyBhcmUgbm90IHNob3duIGluIHRoZSBwcmV2aWV3LCBhcyB0aGUgY3VycmVudCBzZWxlY3Rpb24gaGFzIG1vcmUgdGhhbiA1MDAgYXNzZXRzIGFuZCB0aGUgcHJldmlldyBvbmx5IHN1cHBvcnRzIGEgbWF4aW11bSBvZiA1MDAgYXNzZXRzLidcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldFJlZnJlc2hPcHRpb25zKCk6IFJlZnJlc2hPcHRpb25zIHtcbiAgICBsZXQgb3B0aW9uOiBSZWZyZXNoT3B0aW9ucyA9ICdub25lJztcbiAgICBpZiAodGhpcy5mb3JtQ29uZmlnLnJlYWx0aW1lKSB7XG4gICAgICBvcHRpb24gPSAncmVhbHRpbWUnO1xuICAgIH0gZWxzZSBpZiAodGhpcy5mb3JtQ29uZmlnLnJlZnJlc2hJbnRlcnZhbCkge1xuICAgICAgb3B0aW9uID0gJ2ludGVydmFsJztcbiAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlnLndpZGdldEluc3RhbmNlR2xvYmFsVGltZUNvbnRleHQpIHtcbiAgICAgIG9wdGlvbiA9ICdkYXNoYm9hcmQtcmVhbHRpbWUtY29udGV4dCc7XG4gICAgfVxuICAgIGNvbnN0IGlzTm90QWxsb3dlZE9wdGlvbiA9XG4gICAgICAoIXRoaXMuaXNQb3NpdGlvbmVkRGV2aWNlICYmIG9wdGlvbiA9PT0gJ2Rhc2hib2FyZC1yZWFsdGltZS1jb250ZXh0JykgfHxcbiAgICAgICghdGhpcy5pc1Bvc2l0aW9uZWREZXZpY2UgJiYgb3B0aW9uID09PSAncmVhbHRpbWUnKSB8fFxuICAgICAgKHRoaXMuaXNQb3NpdGlvbmVkRGV2aWNlICYmIG9wdGlvbiA9PT0gJ2ludGVydmFsJyk7XG4gICAgb3B0aW9uID0gaXNOb3RBbGxvd2VkT3B0aW9uID8gJ25vbmUnIDogb3B0aW9uO1xuICAgIHJldHVybiBvcHRpb247XG4gIH1cblxuICBwcml2YXRlIGFkZENlbnRlckljb24obGF0OiBudW1iZXIsIGxuZzogbnVtYmVyKSB7XG4gICAgY29uc3QgdGl0bGVUZXh0ID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoZ2V0dGV4dCgnTWFwIGNlbnRlcicpKTtcbiAgICBjb25zdCBpY29uID0gdGhpcy5sZWFmbGV0LmRpdkljb24oe1xuICAgICAgaHRtbDogYDxpIHN0eWxlPVwicG9pbnRlci1ldmVudHM6IG5vbmVcIiBjbGFzcz1cImM4eS1tYXAtbWFya2VyLWljb24gdGV4dC1tdXRlZCBkbHQtYzh5LWljb24tdGFyZ2V0IGljb24tMnhcIiB0aXRsZT1cIiR7dGl0bGVUZXh0fVwiIC8+YFxuICAgIH0pO1xuICAgIHRoaXMuY2VudGVySWNvbiA9IHRoaXMubGVhZmxldC5tYXJrZXIoW2xhdCwgbG5nXSwge1xuICAgICAgaWNvblxuICAgIH0pO1xuICAgIHRoaXMucHJldmlld01hcC5hZGRNYXJrZXJUb01hcCh0aGlzLmNlbnRlckljb24pO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwicm93IHAtdC0xNlwiICpuZ0lmPVwiZm9ybUNvbmZpZ1wiPlxuICA8ZGl2IGNsYXNzPVwiY29sLXhzLTJcIj5cbiAgICA8Yzh5LWZvcm0tZ3JvdXAgY2xhc3M9XCJtLWItMCB0ZXh0LWNlbnRlciBmb3JtLWdyb3VwLXNtXCI+XG4gICAgICA8bGFiZWwgdHJhbnNsYXRlPk1hcmtlciBpY29uPC9sYWJlbD5cbiAgICAgIDxjOHktaWNvbi1zZWxlY3Rvci13cmFwcGVyXG4gICAgICAgIFtjYW5SZW1vdmVJY29uXT1cInRydWVcIlxuICAgICAgICBbc2VsZWN0ZWRJY29uXT1cImZvcm1Db25maWcuaWNvblwiXG4gICAgICAgIChvblNlbGVjdCk9XCJzZWxlY3RJY29uKCRldmVudClcIlxuICAgICAgPjwvYzh5LWljb24tc2VsZWN0b3Itd3JhcHBlcj5cbiAgICA8L2M4eS1mb3JtLWdyb3VwPlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cImNvbC14cy0xMFwiPlxuICAgIDxkaXYgY2xhc3M9XCJyb3cgdGlnaHQtZ3JpZCBzZXBhcmF0b3ItYm90dG9tXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLXhzLTRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgZm9ybS1ncm91cC1zbVwiPlxuICAgICAgICAgIDxsYWJlbCB0cmFuc2xhdGU+Wm9vbSBsZXZlbDwvbGFiZWw+XG4gICAgICAgICAgPGM4eS1yYW5nZVxuICAgICAgICAgICAgY2xhc3M9XCJsYWJlbC1ib3R0b21cIlxuICAgICAgICAgICAgI3JhbmdlXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cImZvcm1Db25maWcuem9vbUxldmVsXCJcbiAgICAgICAgICAgIChjaGFuZ2UpPVwiem9vbUxldmVsQ2hhbmdlZCgpXCJcbiAgICAgICAgICAgIG5hbWU9XCJ6b29tTGV2ZWxcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwicmFuZ2VcIiBtaW49XCIyXCIgbWF4PVwiMThcIiBzdGVwPVwiMVwiIC8+XG4gICAgICAgICAgPC9jOHktcmFuZ2U+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLXhzLThcIj5cbiAgICAgICAgPGM4eS1mb3JtLWdyb3VwIGNsYXNzPVwiZm9ybS1ncm91cC1zbSBtLWItOFwiPlxuICAgICAgICAgIDxsYWJlbCB0cmFuc2xhdGU+Q2VudGVyIGJvdW5kPC9sYWJlbD5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAgaW5wdXQtZ3JvdXAtc21cIj5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZm9ybUNvbmZpZy5jZW50ZXJbMF1cIlxuICAgICAgICAgICAgICAoY2hhbmdlKT1cImNoYW5nZUNlbnRlcigpXCJcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJsYXRcIlxuICAgICAgICAgICAgICBuYW1lPVwiY2VudGVyTGF0XCJcbiAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXG4gICAgICAgICAgICAgIHJlcXVpcmVkXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJmb3JtQ29uZmlnLmNlbnRlclsxXVwiXG4gICAgICAgICAgICAgIChjaGFuZ2UpPVwiY2hhbmdlQ2VudGVyKClcIlxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cImxuZ1wiXG4gICAgICAgICAgICAgIG5hbWU9XCJjZW50ZXJMbmdcIlxuICAgICAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcbiAgICAgICAgICAgICAgcmVxdWlyZWRcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAtYnRuXCI+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tZGVmYXVsdFwiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInVXNlIHlvdXIgbG9jYXRpb24nIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICBbdG9vbHRpcF09XCInVXNlIHlvdXIgbG9jYXRpb24nIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwidXNlT3duUG9zaXRpb24oKVwiXG4gICAgICAgICAgICAgICAgcGxhY2VtZW50PVwidG9wXCJcbiAgICAgICAgICAgICAgICBjb250YWluZXI9XCJib2R5XCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiaWNvbi0xNFwiIGM4eUljb249XCJsb2NhdGlvbi1hcnJvd1wiPjwvaT5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cC1idG5cIiAqbmdJZj1cImNhbkF1dG9DZW50ZXJcIj5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0XCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidVc2Ugc2VsZWN0ZWQgYXNzZXQgbG9jYXRpb24nIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICBbdG9vbHRpcF09XCInVXNlIHNlbGVjdGVkIGFzc2V0IGxvY2F0aW9uJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImNlbnRlclRvQXNzZXQoKVwiXG4gICAgICAgICAgICAgICAgcGxhY2VtZW50PVwidG9wXCJcbiAgICAgICAgICAgICAgICBjb250YWluZXI9XCJib2R5XCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiaWNvbi0xNFwiIGM4eUljb249XCJsb2NhdGlvblwiPjwvaT5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVscC1ibG9ja1wiPlxuICAgICAgICAgICAge3sgJ0RyYWcgdGhlIG1hcCB0byB0aGUgZGVzaXJlZCBwb3NpdGlvbicgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9jOHktZm9ybS1ncm91cD5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cInJvdyB0aWdodC1ncmlkIHAtdC04IGQtZmxleCBhLWktY2VudGVyXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLXhzLTZcIj5cbiAgICAgICAgPGM4eS1mb3JtLWdyb3VwIGNsYXNzPVwibS1iLTAgZm9ybS1ncm91cC1zbVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjOHktc2VsZWN0LXdyYXBwZXJcIj5cbiAgICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICAgICBpZD1cInNlbGVjdEV4YW1wbGVcIlxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInJlZnJlc2hPcHRpb25zXCJcbiAgICAgICAgICAgICAgKGNoYW5nZSk9XCJ1cGRhdGVSZWZyZXNoT3B0aW9ucygpXCJcbiAgICAgICAgICAgICAgdGl0bGU9XCJ7eyAnUmVmcmVzaCBvcHRpb25zJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgIG5hbWU9XCJyZWZyZXNoU2VsZWN0aW9uXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPG9wdGlvbiBbdGl0bGVdPVwiJ09ubHkgcmVmcmVzaGluZyBvbiBpbnRlcmFjdGlvbicgfCB0cmFuc2xhdGVcIiB2YWx1ZT1cIm5vbmVcIiB0cmFuc2xhdGU+XG4gICAgICAgICAgICAgICAgTm8gYXV0b21hdGljIHJlZnJlc2hcbiAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgIDxvcHRpb25cbiAgICAgICAgICAgICAgICAqbmdJZj1cIiFpc1Bvc2l0aW9uZWREZXZpY2VcIlxuICAgICAgICAgICAgICAgIFt0aXRsZV09XCInUmVmcmVzaGluZyBhZnRlciBhIGdpdmUgaW50ZXJ2YWwgYW5kIG9uIGludGVyYWN0aW9uJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgdmFsdWU9XCJpbnRlcnZhbFwiXG4gICAgICAgICAgICAgICAgdHJhbnNsYXRlXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICBVc2UgcmVmcmVzaCBpbnRlcnZhbFxuICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgPG9wdGlvblxuICAgICAgICAgICAgICAgICpuZ0lmPVwiaXNQb3NpdGlvbmVkRGV2aWNlXCJcbiAgICAgICAgICAgICAgICBbdGl0bGVdPVwiJ0xpdmUgdXBkYXRpbmcgb24gZWFjaCBwb3NpdGlvbiBjaGFuZ2UnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICB2YWx1ZT1cInJlYWx0aW1lXCJcbiAgICAgICAgICAgICAgICB0cmFuc2xhdGVcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIFJlYWx0aW1lXG4gICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICA8b3B0aW9uXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJpc1Bvc2l0aW9uZWREZXZpY2VcIlxuICAgICAgICAgICAgICAgIFt0aXRsZV09XCInQmluZCB3aWRnZXQgdG8gZGFzaGJvYXJkIHJlYWx0aW1lIGNvbnRleHQnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICB2YWx1ZT1cImRhc2hib2FyZC1yZWFsdGltZS1jb250ZXh0XCJcbiAgICAgICAgICAgICAgICB0cmFuc2xhdGVcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIERhc2hib2FyZCByZWFsdGltZSBjb250ZXh0XG4gICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvYzh5LWZvcm0tZ3JvdXA+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wteHMtOFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCBmb3JtLWdyb3VwLXNtIG0tYi0wXCI+XG4gICAgICAgICAgPGM4eS1yYW5nZVxuICAgICAgICAgICAgY2xhc3M9XCJsYWJlbC1ib3R0b21cIlxuICAgICAgICAgICAgI2ludGVydmFsUmFuZ2VcbiAgICAgICAgICAgICpuZ0lmPVwicmVmcmVzaE9wdGlvbnMgPT09ICdpbnRlcnZhbCdcIlxuICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJmb3JtQ29uZmlnLnJlZnJlc2hJbnRlcnZhbFwiXG4gICAgICAgICAgICBuYW1lPVwicmVmcmVzaEludGVydmFsXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI2M4eVJhbmdlVmFsdWU+XG4gICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgIFt0cmFuc2xhdGVQYXJhbXNdPVwieyBpbnRlcnZhbEluU2Vjb25kczogaW50ZXJ2YWxSYW5nZS52YWx1ZSAqIDAuMDAxIH1cIlxuICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlXG4gICAgICAgICAgICAgICAgICBuZ05vbkJpbmRhYmxlXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAge3sgaW50ZXJ2YWxJblNlY29uZHMgfX0gc1xuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJyYW5nZVwiIG1pbj1cIjUwMDBcIiBtYXg9XCIxMDAwMDBcIiBzdGVwPVwiMTAwMFwiIC8+XG4gICAgICAgICAgPC9jOHktcmFuZ2U+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8bGFiZWxcbiAgICAgICAgICBjbGFzcz1cImM4eS1zd2l0Y2ggYzh5LXN3aXRjaC0taW5saW5lXCJcbiAgICAgICAgICAqbmdJZj1cInJlZnJlc2hPcHRpb25zID09PSAncmVhbHRpbWUnIHx8IHJlZnJlc2hPcHRpb25zID09PSAnZGFzaGJvYXJkLXJlYWx0aW1lLWNvbnRleHQnXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxpbnB1dCBbKG5nTW9kZWwpXT1cImZvcm1Db25maWcuZm9sbG93XCIgbmFtZT1cImZvbGxvd1wiIHR5cGU9XCJjaGVja2JveFwiIC8+XG4gICAgICAgICAgPHNwYW4+PC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC0xMlwiIHRyYW5zbGF0ZT5Gb2xsb3cgc2VsZWN0ZWQ8L3NwYW4+XG4gICAgICAgIDwvbGFiZWw+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cblxuPGRpdiBjbGFzcz1cInAtdC0xNiBwLWItMTZcIiBzdHlsZT1cIndpZHRoOiAxMDAlOyBoZWlnaHQ6IDI0MHB4XCI+XG4gIDxjOHktbWFwXG4gICAgKm5nSWY9XCJjb25maWcubWFwQ29uZmlnXCJcbiAgICBbYXNzZXRzXT1cImFzc2V0c1wiXG4gICAgW2NvbmZpZ109XCJjb25maWcubWFwQ29uZmlnXCJcbiAgICAob25Nb3ZlKT1cIm9uUHJldmlld01hcE1vdmUoJGV2ZW50KVwiXG4gICAgKG9uWm9vbVN0YXJ0KT1cIm9uUHJldmlld1pvb21TdGFydCgpXCJcbiAgICAob25ab29tRW5kKT1cIm9uUHJldmlld1pvb21FbmQoJGV2ZW50KVwiXG4gICAgKG9uSW5pdCk9XCJwcmV2aWV3TWFwSW5pdCgkZXZlbnQpXCJcbiAgPjwvYzh5LW1hcD5cbjwvZGl2PlxuIl19
179
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFwLXdpZGdldC1jb25maWcuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vd2lkZ2V0cy9pbXBsZW1lbnRhdGlvbnMvbWFwL21hcC13aWRnZXQtY29uZmlnLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3dpZGdldHMvaW1wbGVtZW50YXRpb25zL21hcC9tYXAtd2lkZ2V0LWNvbmZpZy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULE1BQU0sRUFDTixLQUFLLEVBS0wsU0FBUyxFQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMxRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRTVELE9BQU8sRUFFTCxrQkFBa0IsRUFDbEIsWUFBWSxFQUNaLFVBQVUsRUFFWCxNQUFNLHlCQUF5QixDQUFDO0FBQ2pDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRXZELE9BQU8sRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7Ozs7OztBQVEzQyxNQUFNLE9BQU8sd0JBQXdCO0lBbUJuQyxZQUNVLFVBQXNCLEVBQ3RCLFlBQTBCLEVBQzFCLGdCQUFrQyxFQUNOLGdCQUE4QztRQUgxRSxlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQ3RCLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQzFCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDTixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQThCO1FBdEIzRSxXQUFNLEdBQW9CO1lBQ2pDLFNBQVMsRUFBRSxTQUFTO1NBQ3JCLENBQUM7UUFJRixr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QUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFO1lBQ2hELElBQUk7U0FDTCxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDbEQsQ0FBQzsrR0FwTFUsd0JBQXdCLHdHQXVCekIsa0JBQWtCO21HQXZCakIsd0JBQXdCLHVJQWdCeEIsWUFBWSxxRUMvQ3pCLGtuTUEyS0EsbzdHRDlJaUIsQ0FBQyxFQUFFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLENBQUM7OzRGQUV4RCx3QkFBd0I7a0JBTHBDLFNBQVM7K0JBQ0UsdUJBQXVCLGlCQUVsQixDQUFDLEVBQUUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsQ0FBQzs7MEJBeUJoRSxNQUFNOzJCQUFDLGtCQUFrQjs0Q0F0Qm5CLE1BQU07c0JBQWQsS0FBSztnQkFnQkUsVUFBVTtzQkFEakIsU0FBUzt1QkFBQyxZQUFZIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBJbmplY3QsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBTaW1wbGVDaGFuZ2VzLFxuICBWaWV3Q2hpbGRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb250cm9sQ29udGFpbmVyLCBOZ0Zvcm0gfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBBbGVydFNlcnZpY2UsIGdldHRleHQgfSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzJztcbmltcG9ydCB0eXBlIHsgTWFwRGVmYXVsdENvbmZpZyB9IGZyb20gJ0BjOHkvZGV2a2l0L29wdGlvbnMnO1xuaW1wb3J0IHtcbiAgQ2x1c3Rlck1hcENvbmZpZyxcbiAgTUFQX0RFRkFVTFRfQ09ORklHLFxuICBNYXBDb21wb25lbnQsXG4gIE1hcFNlcnZpY2UsXG4gIFBvc2l0aW9uTWFuYWdlZE9iamVjdFxufSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzL21hcCc7XG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgdHlwZSBMIGZyb20gJ2xlYWZsZXQnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgTWFwV2lkZ2V0Q29uZmlnLCBSZWZyZXNoT3B0aW9ucyB9IGZyb20gJy4vbWFwLXdpZGdldC5tb2RlbCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2M4eS1tYXAtd2lkZ2V0LWNvbmZpZycsXG4gIHRlbXBsYXRlVXJsOiAnLi9tYXAtd2lkZ2V0LWNvbmZpZy5jb21wb25lbnQuaHRtbCcsXG4gIHZpZXdQcm92aWRlcnM6IFt7IHByb3ZpZGU6IENvbnRyb2xDb250YWluZXIsIHVzZUV4aXN0aW5nOiBOZ0Zvcm0gfV1cbn0pXG5leHBvcnQgY2xhc3MgTWFwV2lkZ2V0Q29uZmlnQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XG4gIEBJbnB1dCgpIGNvbmZpZzogTWFwV2lkZ2V0Q29uZmlnID0ge1xuICAgIG1hcENvbmZpZzogdW5kZWZpbmVkXG4gIH07XG5cbiAgZm9ybUNvbmZpZzogQ2x1c3Rlck1hcENvbmZpZztcblxuICBjYW5BdXRvQ2VudGVyID0gdHJ1ZTtcbiAgaXNQb3NpdGlvbmVkRGV2aWNlID0gZmFsc2U7XG4gIGFzc2V0czogUG9zaXRpb25NYW5hZ2VkT2JqZWN0W107XG4gIHJlZnJlc2hPcHRpb25zOiBSZWZyZXNoT3B0aW9ucyA9ICdub25lJztcblxuICBwcml2YXRlIGRlc3Ryb3llZCQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICBwcml2YXRlIGxlYWZsZXQ6IHR5cGVvZiBMO1xuICBwcml2YXRlIGNlbnRlckljb246IEwuTWFya2VyO1xuXG4gIEBWaWV3Q2hpbGQoTWFwQ29tcG9uZW50KVxuICBwcml2YXRlIHByZXZpZXdNYXA6IE1hcENvbXBvbmVudDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIG1hcFNlcnZpY2U6IE1hcFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBhbGVydFNlcnZpY2U6IEFsZXJ0U2VydmljZSxcbiAgICBwcml2YXRlIHRyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgQEluamVjdChNQVBfREVGQVVMVF9DT05GSUcpIHByaXZhdGUgZGVmYXVsdE1hcENvbmZpZzogT2JzZXJ2YWJsZTxNYXBEZWZhdWx0Q29uZmlnPlxuICApIHt9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5kZXN0cm95ZWQkLm5leHQoKTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuZGVmYXVsdE1hcENvbmZpZy5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3llZCQpKS5zdWJzY3JpYmUoZGVmYXVsdENvbmZpZyA9PiB7XG4gICAgICB0aGlzLmZvcm1Db25maWcgPSB7XG4gICAgICAgIHpvb21MZXZlbDogZGVmYXVsdENvbmZpZy56b29tTGV2ZWwsXG4gICAgICAgIGNlbnRlcjogZGVmYXVsdENvbmZpZy5jZW50ZXJcbiAgICAgIH07XG4gICAgICB0aGlzLmluaXRGb3JtKCk7XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBpbml0Rm9ybSgpIHtcbiAgICBpZiAoIXRoaXMuY29uZmlnLm1hcENvbmZpZykge1xuICAgICAgdGhpcy5jb25maWcubWFwQ29uZmlnID0gdGhpcy5mb3JtQ29uZmlnO1xuICAgIH1cbiAgICB0aGlzLmZvcm1Db25maWcgPSB7XG4gICAgICAuLi50aGlzLmZvcm1Db25maWcsXG4gICAgICAuLi50aGlzLmNvbmZpZy5tYXBDb25maWcsXG4gICAgICBkaXNhYmxlUGFuOiBmYWxzZVxuICAgIH07XG4gICAgYXdhaXQgdGhpcy51cGRhdGVBc3NldCgpO1xuICB9XG5cbiAgYXN5bmMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGlmIChcbiAgICAgIGNoYW5nZXMuY29uZmlnLmN1cnJlbnRWYWx1ZSAhPT0gY2hhbmdlcy5jb25maWcucHJldmlvdXNWYWx1ZSAmJlxuICAgICAgIWNoYW5nZXMuY29uZmlnLmZpcnN0Q2hhbmdlXG4gICAgKSB7XG4gICAgICBhd2FpdCB0aGlzLnVwZGF0ZUFzc2V0KCk7XG4gICAgfVxuICB9XG5cbiAgcHJldmlld01hcEluaXQobGVhZmxldDogdHlwZW9mIEwpOiB2b2lkIHtcbiAgICB0aGlzLmxlYWZsZXQgPSBsZWFmbGV0O1xuICAgIHRoaXMuYWRkQ2VudGVySWNvbih0aGlzLmZvcm1Db25maWcuY2VudGVyWzBdLCB0aGlzLmZvcm1Db25maWcuY2VudGVyWzFdKTtcbiAgfVxuXG4gIG9uQmVmb3JlU2F2ZSgpIHtcbiAgICB0aGlzLmNvbmZpZy5tYXBDb25maWcgPSB0aGlzLmZvcm1Db25maWc7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICB6b29tTGV2ZWxDaGFuZ2VkKCkge1xuICAgIHRoaXMuY29uZmlnLm1hcENvbmZpZyA9IHtcbiAgICAgIC4uLnRoaXMuY29uZmlnLm1hcENvbmZpZyxcbiAgICAgIHpvb21MZXZlbDogdGhpcy5mb3JtQ29uZmlnLnpvb21MZXZlbFxuICAgIH07XG4gIH1cblxuICBjaGFuZ2VDZW50ZXIoKSB7XG4gICAgdGhpcy5jb25maWcubWFwQ29uZmlnID0geyAuLi50aGlzLmZvcm1Db25maWcsIGNlbnRlcjogdGhpcy5mb3JtQ29uZmlnLmNlbnRlciB9O1xuICB9XG5cbiAgb25QcmV2aWV3Wm9vbVN0YXJ0KCkge1xuICAgIHRoaXMuY2VudGVySWNvbi5yZW1vdmUoKTtcbiAgfVxuXG4gIG9uUHJldmlld1pvb21FbmQoZXZlbnQ6IEwuTGVhZmxldEV2ZW50KSB7XG4gICAgdGhpcy5mb3JtQ29uZmlnLnpvb21MZXZlbCA9IE1hdGguZmxvb3IoZXZlbnQudGFyZ2V0LmdldFpvb20oKSk7XG4gIH1cblxuICBvblByZXZpZXdNYXBNb3ZlKGV2ZW50OiBMLkxlYWZsZXRFdmVudCkge1xuICAgIGlmICh0aGlzLmNlbnRlckljb24pIHtcbiAgICAgIHRoaXMuY2VudGVySWNvbi5yZW1vdmUoKTtcbiAgICB9XG4gICAgY29uc3QgeyBsYXQsIGxuZyB9ID0gZXZlbnQudGFyZ2V0LmdldEJvdW5kcygpLmdldENlbnRlcigpO1xuICAgIHRoaXMuYWRkQ2VudGVySWNvbihsYXQsIGxuZyk7XG4gICAgdGhpcy5mb3JtQ29uZmlnLmNlbnRlciA9IFtsYXQsIGxuZ107XG4gIH1cblxuICB1c2VPd25Qb3NpdGlvbigpIHtcbiAgICBuYXZpZ2F0b3IuZ2VvbG9jYXRpb24uZ2V0Q3VycmVudFBvc2l0aW9uKCh7IGNvb3JkcyB9KSA9PiB7XG4gICAgICB0aGlzLmZvcm1Db25maWcuY2VudGVyID0gW2Nvb3Jkcy5sYXRpdHVkZSwgY29vcmRzLmxvbmdpdHVkZV07XG4gICAgICB0aGlzLmNoYW5nZUNlbnRlcigpO1xuICAgIH0pO1xuICB9XG5cbiAgY2VudGVyVG9Bc3NldCgpIHtcbiAgICB0aGlzLmZvcm1Db25maWcuY2VudGVyID0gW1xuICAgICAgdGhpcy5jb25maWcuZGV2aWNlLmM4eV9Qb3NpdGlvbi5sYXQsXG4gICAgICB0aGlzLmNvbmZpZy5kZXZpY2UuYzh5X1Bvc2l0aW9uLmxuZ1xuICAgIF07XG4gICAgdGhpcy5jaGFuZ2VDZW50ZXIoKTtcbiAgfVxuXG4gIHVwZGF0ZVJlZnJlc2hPcHRpb25zKCkge1xuICAgIHRoaXMuZm9ybUNvbmZpZy5yZWFsdGltZSA9IHRoaXMucmVmcmVzaE9wdGlvbnMgPT09ICdyZWFsdGltZSc7XG4gICAgaWYgKHRoaXMucmVmcmVzaE9wdGlvbnMgPT09ICdpbnRlcnZhbCcpIHtcbiAgICAgIHRoaXMuZm9ybUNvbmZpZy5yZWZyZXNoSW50ZXJ2YWwgPz89IDUwMDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZm9ybUNvbmZpZy5yZWZyZXNoSW50ZXJ2YWwgPSBudWxsO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuZm9ybUNvbmZpZy5yZWFsdGltZSkge1xuICAgICAgdGhpcy5mb3JtQ29uZmlnLmZvbGxvdyA9IGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLmNvbmZpZy53aWRnZXRJbnN0YW5jZUdsb2JhbFRpbWVDb250ZXh0ID1cbiAgICAgIHRoaXMucmVmcmVzaE9wdGlvbnMgPT09ICdkYXNoYm9hcmQtcmVhbHRpbWUtY29udGV4dCc7XG4gICAgaWYgKHRoaXMuY29uZmlnLndpZGdldEluc3RhbmNlR2xvYmFsVGltZUNvbnRleHQpIHtcbiAgICAgIHRoaXMuZm9ybUNvbmZpZy5yZWFsdGltZSA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgc2VsZWN0SWNvbihpY29uOiBzdHJpbmcpIHtcbiAgICB0aGlzLmZvcm1Db25maWcuaWNvbiA9IGljb247XG4gICAgdGhpcy5jb25maWcubWFwQ29uZmlnLmljb24gPSBpY29uO1xuICAgIHRoaXMucHJldmlld01hcC5yZWZyZXNoTWFya2VycygpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB1cGRhdGVBc3NldCgpIHtcbiAgICB0aGlzLmNhbkF1dG9DZW50ZXIgPSB0aGlzLm1hcFNlcnZpY2UuaGFzUG9zaXRpb24odGhpcy5jb25maWcuZGV2aWNlKTtcbiAgICB0aGlzLmlzUG9zaXRpb25lZERldmljZSA9IHRoaXMubWFwU2VydmljZS5pc1Bvc2l0aW9uZWREZXZpY2UodGhpcy5jb25maWcuZGV2aWNlKTtcbiAgICB0aGlzLnJlZnJlc2hPcHRpb25zID0gdGhpcy5nZXRSZWZyZXNoT3B0aW9ucygpO1xuICAgIHRoaXMudXBkYXRlUmVmcmVzaE9wdGlvbnMoKTtcblxuICAgIGNvbnN0IHsgZGF0YSwgcGFnaW5nIH0gPSBhd2FpdCB0aGlzLm1hcFNlcnZpY2UuZ2V0QWxsUG9zaXRpb25NT3ModGhpcy5jb25maWcuZGV2aWNlKTtcbiAgICB0aGlzLmFzc2V0cyA9IGRhdGE7XG4gICAgaWYgKHBhZ2luZy50b3RhbFBhZ2VzID4gMSkge1xuICAgICAgdGhpcy5hbGVydFNlcnZpY2UuZGFuZ2VyKFxuICAgICAgICBnZXR0ZXh0KFxuICAgICAgICAgICdJdCBtaWdodCBiZSBwb3NzaWJsZSB0aGF0IGFzc2V0cyBhcmUgbm90IHNob3duIGluIHRoZSBwcmV2aWV3LCBhcyB0aGUgY3VycmVudCBzZWxlY3Rpb24gaGFzIG1vcmUgdGhhbiA1MDAgYXNzZXRzIGFuZCB0aGUgcHJldmlldyBvbmx5IHN1cHBvcnRzIGEgbWF4aW11bSBvZiA1MDAgYXNzZXRzLidcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldFJlZnJlc2hPcHRpb25zKCk6IFJlZnJlc2hPcHRpb25zIHtcbiAgICBsZXQgb3B0aW9uOiBSZWZyZXNoT3B0aW9ucyA9ICdub25lJztcbiAgICBpZiAodGhpcy5mb3JtQ29uZmlnLnJlYWx0aW1lKSB7XG4gICAgICBvcHRpb24gPSAncmVhbHRpbWUnO1xuICAgIH0gZWxzZSBpZiAodGhpcy5mb3JtQ29uZmlnLnJlZnJlc2hJbnRlcnZhbCkge1xuICAgICAgb3B0aW9uID0gJ2ludGVydmFsJztcbiAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlnLndpZGdldEluc3RhbmNlR2xvYmFsVGltZUNvbnRleHQpIHtcbiAgICAgIG9wdGlvbiA9ICdkYXNoYm9hcmQtcmVhbHRpbWUtY29udGV4dCc7XG4gICAgfVxuICAgIGNvbnN0IGlzTm90QWxsb3dlZE9wdGlvbiA9XG4gICAgICAoIXRoaXMuaXNQb3NpdGlvbmVkRGV2aWNlICYmIG9wdGlvbiA9PT0gJ2Rhc2hib2FyZC1yZWFsdGltZS1jb250ZXh0JykgfHxcbiAgICAgICghdGhpcy5pc1Bvc2l0aW9uZWREZXZpY2UgJiYgb3B0aW9uID09PSAncmVhbHRpbWUnKSB8fFxuICAgICAgKHRoaXMuaXNQb3NpdGlvbmVkRGV2aWNlICYmIG9wdGlvbiA9PT0gJ2ludGVydmFsJyk7XG4gICAgb3B0aW9uID0gaXNOb3RBbGxvd2VkT3B0aW9uID8gJ25vbmUnIDogb3B0aW9uO1xuICAgIHJldHVybiBvcHRpb247XG4gIH1cblxuICBwcml2YXRlIGFkZENlbnRlckljb24obGF0OiBudW1iZXIsIGxuZzogbnVtYmVyKSB7XG4gICAgY29uc3QgdGl0bGVUZXh0ID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoZ2V0dGV4dCgnTWFwIGNlbnRlcicpKTtcbiAgICBjb25zdCBpY29uID0gdGhpcy5sZWFmbGV0LmRpdkljb24oe1xuICAgICAgaHRtbDogYDxpIHN0eWxlPVwicG9pbnRlci1ldmVudHM6IG5vbmVcIiBjbGFzcz1cImM4eS1tYXAtbWFya2VyLWljb24gdGV4dC1tdXRlZCBkbHQtYzh5LWljb24tdGFyZ2V0IGljb24tMnhcIiB0aXRsZT1cIiR7dGl0bGVUZXh0fVwiIC8+YFxuICAgIH0pO1xuICAgIHRoaXMuY2VudGVySWNvbiA9IHRoaXMubGVhZmxldC5tYXJrZXIoW2xhdCwgbG5nXSwge1xuICAgICAgaWNvblxuICAgIH0pO1xuICAgIHRoaXMucHJldmlld01hcC5hZGRNYXJrZXJUb01hcCh0aGlzLmNlbnRlckljb24pO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwicm93IHAtdC0xNlwiICpuZ0lmPVwiZm9ybUNvbmZpZ1wiPlxuICA8ZGl2IGNsYXNzPVwiY29sLXhzLTJcIj5cbiAgICA8Yzh5LWZvcm0tZ3JvdXAgY2xhc3M9XCJtLWItMCB0ZXh0LWNlbnRlciBmb3JtLWdyb3VwLXNtXCI+XG4gICAgICA8bGFiZWwgdHJhbnNsYXRlPk1hcmtlciBpY29uPC9sYWJlbD5cbiAgICAgIDxjOHktaWNvbi1zZWxlY3Rvci13cmFwcGVyXG4gICAgICAgIFtjYW5SZW1vdmVJY29uXT1cInRydWVcIlxuICAgICAgICBbc2VsZWN0ZWRJY29uXT1cImZvcm1Db25maWcuaWNvblwiXG4gICAgICAgIChvblNlbGVjdCk9XCJzZWxlY3RJY29uKCRldmVudClcIlxuICAgICAgPjwvYzh5LWljb24tc2VsZWN0b3Itd3JhcHBlcj5cbiAgICA8L2M4eS1mb3JtLWdyb3VwPlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cImNvbC14cy0xMFwiPlxuICAgIDxkaXYgY2xhc3M9XCJyb3cgdGlnaHQtZ3JpZCBzZXBhcmF0b3ItYm90dG9tXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLXhzLTRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgZm9ybS1ncm91cC1zbVwiPlxuICAgICAgICAgIDxsYWJlbCB0cmFuc2xhdGU+Wm9vbSBsZXZlbDwvbGFiZWw+XG4gICAgICAgICAgPGM4eS1yYW5nZVxuICAgICAgICAgICAgY2xhc3M9XCJsYWJlbC1ib3R0b21cIlxuICAgICAgICAgICAgI3JhbmdlXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cImZvcm1Db25maWcuem9vbUxldmVsXCJcbiAgICAgICAgICAgIChjaGFuZ2UpPVwiem9vbUxldmVsQ2hhbmdlZCgpXCJcbiAgICAgICAgICAgIG5hbWU9XCJ6b29tTGV2ZWxcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwicmFuZ2VcIiBtaW49XCIyXCIgbWF4PVwiMThcIiBzdGVwPVwiMVwiIC8+XG4gICAgICAgICAgPC9jOHktcmFuZ2U+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLXhzLThcIj5cbiAgICAgICAgPGM4eS1mb3JtLWdyb3VwIGNsYXNzPVwiZm9ybS1ncm91cC1zbSBtLWItOFwiPlxuICAgICAgICAgIDxsYWJlbCB0cmFuc2xhdGU+Q2VudGVyIGJvdW5kPC9sYWJlbD5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAgaW5wdXQtZ3JvdXAtc21cIj5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZm9ybUNvbmZpZy5jZW50ZXJbMF1cIlxuICAgICAgICAgICAgICAoY2hhbmdlKT1cImNoYW5nZUNlbnRlcigpXCJcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJsYXRcIlxuICAgICAgICAgICAgICBuYW1lPVwiY2VudGVyTGF0XCJcbiAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXG4gICAgICAgICAgICAgIHJlcXVpcmVkXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJmb3JtQ29uZmlnLmNlbnRlclsxXVwiXG4gICAgICAgICAgICAgIChjaGFuZ2UpPVwiY2hhbmdlQ2VudGVyKClcIlxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cImxuZ1wiXG4gICAgICAgICAgICAgIG5hbWU9XCJjZW50ZXJMbmdcIlxuICAgICAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcbiAgICAgICAgICAgICAgcmVxdWlyZWRcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAtYnRuXCI+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tZGVmYXVsdFwiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInVXNlIHlvdXIgbG9jYXRpb24nIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICBbdG9vbHRpcF09XCInVXNlIHlvdXIgbG9jYXRpb24nIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwidXNlT3duUG9zaXRpb24oKVwiXG4gICAgICAgICAgICAgICAgcGxhY2VtZW50PVwidG9wXCJcbiAgICAgICAgICAgICAgICBjb250YWluZXI9XCJib2R5XCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiaWNvbi0xNFwiIGM4eUljb249XCJsb2NhdGlvbi1hcnJvd1wiPjwvaT5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cC1idG5cIiAqbmdJZj1cImNhbkF1dG9DZW50ZXJcIj5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0XCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidVc2Ugc2VsZWN0ZWQgYXNzZXQgbG9jYXRpb24nIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICBbdG9vbHRpcF09XCInVXNlIHNlbGVjdGVkIGFzc2V0IGxvY2F0aW9uJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImNlbnRlclRvQXNzZXQoKVwiXG4gICAgICAgICAgICAgICAgcGxhY2VtZW50PVwidG9wXCJcbiAgICAgICAgICAgICAgICBjb250YWluZXI9XCJib2R5XCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiaWNvbi0xNFwiIGM4eUljb249XCJsb2NhdGlvblwiPjwvaT5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVscC1ibG9ja1wiPlxuICAgICAgICAgICAge3sgJ0RyYWcgdGhlIG1hcCB0byB0aGUgZGVzaXJlZCBwb3NpdGlvbicgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9jOHktZm9ybS1ncm91cD5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cInJvdyB0aWdodC1ncmlkIHAtdC04IGQtZmxleCBhLWktY2VudGVyXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLXhzLTZcIj5cbiAgICAgICAgPGM4eS1mb3JtLWdyb3VwIGNsYXNzPVwibS1iLTAgZm9ybS1ncm91cC1zbVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjOHktc2VsZWN0LXdyYXBwZXJcIj5cbiAgICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICAgICBpZD1cInNlbGVjdEV4YW1wbGVcIlxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInJlZnJlc2hPcHRpb25zXCJcbiAgICAgICAgICAgICAgKGNoYW5nZSk9XCJ1cGRhdGVSZWZyZXNoT3B0aW9ucygpXCJcbiAgICAgICAgICAgICAgdGl0bGU9XCJ7eyAnUmVmcmVzaCBvcHRpb25zJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgIG5hbWU9XCJyZWZyZXNoU2VsZWN0aW9uXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPG9wdGlvbiBbdGl0bGVdPVwiJ09ubHkgcmVmcmVzaGluZyBvbiBpbnRlcmFjdGlvbicgfCB0cmFuc2xhdGVcIiB2YWx1ZT1cIm5vbmVcIiB0cmFuc2xhdGU+XG4gICAgICAgICAgICAgICAgTm8gYXV0b21hdGljIHJlZnJlc2hcbiAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgIDxvcHRpb25cbiAgICAgICAgICAgICAgICAqbmdJZj1cIiFpc1Bvc2l0aW9uZWREZXZpY2VcIlxuICAgICAgICAgICAgICAgIFt0aXRsZV09XCInUmVmcmVzaGluZyBhZnRlciBhIGdpdmUgaW50ZXJ2YWwgYW5kIG9uIGludGVyYWN0aW9uJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgdmFsdWU9XCJpbnRlcnZhbFwiXG4gICAgICAgICAgICAgICAgdHJhbnNsYXRlXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICBVc2UgcmVmcmVzaCBpbnRlcnZhbFxuICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgPG9wdGlvblxuICAgICAgICAgICAgICAgICpuZ0lmPVwiaXNQb3NpdGlvbmVkRGV2aWNlXCJcbiAgICAgICAgICAgICAgICBbdGl0bGVdPVwiJ0xpdmUgdXBkYXRpbmcgb24gZWFjaCBwb3NpdGlvbiBjaGFuZ2UnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICB2YWx1ZT1cInJlYWx0aW1lXCJcbiAgICAgICAgICAgICAgICB0cmFuc2xhdGVcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIFJlYWx0aW1lXG4gICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICA8b3B0aW9uXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJpc1Bvc2l0aW9uZWREZXZpY2VcIlxuICAgICAgICAgICAgICAgIFt0aXRsZV09XCInQmluZCB3aWRnZXQgdG8gZGFzaGJvYXJkIHJlYWx0aW1lIGNvbnRleHQnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICB2YWx1ZT1cImRhc2hib2FyZC1yZWFsdGltZS1jb250ZXh0XCJcbiAgICAgICAgICAgICAgICB0cmFuc2xhdGVcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIERhc2hib2FyZCByZWFsdGltZSBjb250ZXh0XG4gICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvYzh5LWZvcm0tZ3JvdXA+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wteHMtOFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCBmb3JtLWdyb3VwLXNtIG0tYi0wXCI+XG4gICAgICAgICAgPGM4eS1yYW5nZVxuICAgICAgICAgICAgY2xhc3M9XCJsYWJlbC1ib3R0b21cIlxuICAgICAgICAgICAgI2ludGVydmFsUmFuZ2VcbiAgICAgICAgICAgICpuZ0lmPVwicmVmcmVzaE9wdGlvbnMgPT09ICdpbnRlcnZhbCdcIlxuICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJmb3JtQ29uZmlnLnJlZnJlc2hJbnRlcnZhbFwiXG4gICAgICAgICAgICBuYW1lPVwicmVmcmVzaEludGVydmFsXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI2M4eVJhbmdlVmFsdWU+XG4gICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgIFt0cmFuc2xhdGVQYXJhbXNdPVwieyBpbnRlcnZhbEluU2Vjb25kczogaW50ZXJ2YWxSYW5nZS52YWx1ZSAqIDAuMDAxIH1cIlxuICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlXG4gICAgICAgICAgICAgICAgICBuZ05vbkJpbmRhYmxlXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAge3sgaW50ZXJ2YWxJblNlY29uZHMgfX0gc1xuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJyYW5nZVwiIG1pbj1cIjUwMDBcIiBtYXg9XCIxMDAwMDBcIiBzdGVwPVwiMTAwMFwiIC8+XG4gICAgICAgICAgPC9jOHktcmFuZ2U+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8bGFiZWxcbiAgICAgICAgICBjbGFzcz1cImM4eS1zd2l0Y2ggYzh5LXN3aXRjaC0taW5saW5lXCJcbiAgICAgICAgICAqbmdJZj1cInJlZnJlc2hPcHRpb25zID09PSAncmVhbHRpbWUnIHx8IHJlZnJlc2hPcHRpb25zID09PSAnZGFzaGJvYXJkLXJlYWx0aW1lLWNvbnRleHQnXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxpbnB1dCBbKG5nTW9kZWwpXT1cImZvcm1Db25maWcuZm9sbG93XCIgbmFtZT1cImZvbGxvd1wiIHR5cGU9XCJjaGVja2JveFwiIC8+XG4gICAgICAgICAgPHNwYW4+PC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC0xMlwiIHRyYW5zbGF0ZT5Gb2xsb3cgc2VsZWN0ZWQ8L3NwYW4+XG4gICAgICAgIDwvbGFiZWw+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cblxuPGRpdiBjbGFzcz1cInAtdC0xNiBwLWItMTZcIiBzdHlsZT1cIndpZHRoOiAxMDAlOyBoZWlnaHQ6IDI0MHB4XCI+XG4gIDxjOHktbWFwXG4gICAgKm5nSWY9XCJjb25maWcubWFwQ29uZmlnXCJcbiAgICBbYXNzZXRzXT1cImFzc2V0c1wiXG4gICAgW2NvbmZpZ109XCJjb25maWcubWFwQ29uZmlnXCJcbiAgICAob25Nb3ZlKT1cIm9uUHJldmlld01hcE1vdmUoJGV2ZW50KVwiXG4gICAgKG9uWm9vbVN0YXJ0KT1cIm9uUHJldmlld1pvb21TdGFydCgpXCJcbiAgICAob25ab29tRW5kKT1cIm9uUHJldmlld1pvb21FbmQoJGV2ZW50KVwiXG4gICAgKG9uSW5pdCk9XCJwcmV2aWV3TWFwSW5pdCgkZXZlbnQpXCJcbiAgPjwvYzh5LW1hcD5cbjwvZGl2PlxuIl19
@@ -2671,7 +2671,7 @@ class ReportDashboardListComponent {
2671
2671
  : this.reportDashboardService.removeNavigatorNode(report);
2672
2672
  }
2673
2673
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ReportDashboardListComponent, deps: [{ token: i1.InventoryService }, { token: ContextDashboardService }, { token: i3$1.BsModalService }, { token: i3.TranslateService }, { token: i5.ModalService }, { token: i5.AlertService }, { token: ReportDashboardService }, { token: i5.Permissions }], target: i0.ɵɵFactoryTarget.Component }); }
2674
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: ReportDashboardListComponent, selector: "c8y-report-dashboard-list", viewQueries: [{ propertyName: "filter", first: true, predicate: FilterInputComponent, descendants: true }], ngImport: i0, template: "<c8y-title>\n {{ 'Reports' | translate }}\n</c8y-title>\n\n<c8y-action-bar-item\n [placement]=\"'left'\"\n itemClass=\"navbar-form\"\n>\n <div class=\"input-group input-group-search\">\n <input\n class=\"form-control\"\n [attr.aria-label]=\"'Filter' | translate\"\n placeholder=\"{{ 'Filter\u2026' | translate }}\"\n type=\"search\"\n [ngModel]=\"textFilter$ | async\"\n (ngModelChange)=\"textFilter$.next($event)\"\n />\n <span class=\"input-group-addon\">\n <i\n c8yIcon=\"search\"\n *ngIf=\"(textFilter$ | async).length === 0\"\n ></i>\n <i\n class=\"text-muted\"\n c8yIcon=\"times\"\n *ngIf=\"(textFilter$ | async).length > 0\"\n (click)=\"textFilter$.next('')\"\n px-event=\"Clear filtering reports\"\n ></i>\n </span>\n </div>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <button\n class=\"btn btn-link\"\n title=\"{{ 'Add report' | translate }}\"\n type=\"button\"\n [attr.data-cy]=\"'reports-add-report-action-bar-button'\"\n (click)=\"add()\"\n [disabled]=\"!canAddReport\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Add report' | translate }}\n </button>\n <button\n class=\"btn btn-dot m-r-16\"\n aria-label=\"{{ 'Info' | translate }}\"\n popover=\"{{ 'You don\\'t have permission to add reports' | translate }}\"\n placement=\"top\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n *ngIf=\"!canAddReport\"\n >\n <i\n class=\"text-primary\"\n [c8yIcon]=\"'info-circle'\"\n ></i>\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <button\n class=\"btn btn-link\"\n title=\"{{ 'Reload' | translate }}\"\n type=\"button\"\n (click)=\"loadReports()\"\n >\n <i\n c8yIcon=\"refresh\"\n [ngClass]=\"{ 'icon-spin': reloading }\"\n ></i>\n {{ 'Reload' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-help src=\"/docs/cockpit/working-with-reports/#working-with-reports\"></c8y-help>\n\n<c8y-list-group>\n <c8y-li\n class=\"page-sticky-header hidden-xs hidden-sm\"\n *ngIf=\"(reports$ | async)?.data.length > 0\"\n >\n <c8y-li-icon>\n <i class=\"p-l-24\"></i>\n </c8y-li-icon>\n <c8y-li-body class=\"content-flex-60\">\n <div class=\"col-3\">\n {{ 'Report' | translate }}\n </div>\n <div class=\"col-6\">\n {{ 'Description' | translate }}\n </div>\n <div class=\"col-2\">\n {{ 'Show in navigator' | translate }}\n </div>\n </c8y-li-body>\n </c8y-li>\n\n <c8y-li *c8yFor=\"let report of reports$; let i = index; loadMore: 'auto'\">\n <c8y-li-icon [icon]=\"report.icon\"></c8y-li-icon>\n <c8y-li-body class=\"content-flex-60\">\n <div class=\"col-3\">\n <button\n class=\"btn-clean\"\n title=\"{{ report.name }}\"\n type=\"button\"\n routerLink=\"/reports/{{ report.id }}\"\n >\n <span class=\"text-truncate\">\n {{ report.name }}\n </span>\n </button>\n </div>\n <div class=\"col-6\">\n <p class=\"small text-truncate-wrap\">\n <em\n class=\"text-muted\"\n *ngIf=\"!report.description; else showDescription\"\n >\n {{ 'No description available' | translate }}\n </em>\n <ng-template #showDescription>\n {{ report.description }}\n </ng-template>\n </p>\n </div>\n <div class=\"col-2 fit-h-20 m-t-xs-8\">\n <label\n class=\"c8y-switch c8y-switch--inline\"\n title=\"{{ 'Show in navigator' | translate }}\"\n >\n <input\n type=\"checkbox\"\n [(ngModel)]=\"!!report.c8y_IsNavigatorNode\"\n (change)=\"update(report)\"\n />\n <span></span>\n <span class=\"visible-xs\">\n {{ 'Show in navigator' | translate }}\n </span>\n </label>\n </div>\n <div class=\"col-1 hidden-xs\">\n <button\n class=\"btn btn-dot btn-dot--danger showOnHover m-l-auto d-flex\"\n [attr.aria-label]=\"'Remove report' | translate\"\n tooltip=\"{{ 'Remove report' | translate }}\"\n type=\"button\"\n [delay]=\"500\"\n (click)=\"delete(report)\"\n >\n <i c8yIcon=\"minus-circle\"></i>\n </button>\n </div>\n <div class=\"visible-xs p-t-8 text-right\">\n <button\n class=\"btn btn-default btn-sm\"\n title=\"{{ 'Remove report' | translate }}\"\n type=\"button\"\n (click)=\"delete(report)\"\n >\n <i c8yIcon=\"delete\"></i>\n {{ 'Remove report' | translate }}\n </button>\n </div>\n </c8y-li-body>\n </c8y-li>\n</c8y-list-group>\n\n<c8y-ui-empty-state\n [icon]=\"'c8y-reports'\"\n [title]=\"'There are no reports defined.' | translate\"\n [subtitle]=\"'Add a report first.' | translate\"\n *ngIf=\"(reports$ | async)?.data.length === 0\"\n>\n <p>\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Add report' | translate }}\"\n type=\"button\"\n [attr.data-cy]=\"'reports-add-report-empty-state-button'\"\n [disabled]=\"!canAddReport\"\n (click)=\"add()\"\n >\n {{ 'Add report' | translate }}\n </button>\n </p>\n <p c8y-guide-docs>\n <small\n translate\n ngNonBindable\n >\n Find out more in the\n <a c8y-guide-href=\"/docs/cockpit/working-with-reports\">user documentation</a>\n .\n </small>\n </p>\n</c8y-ui-empty-state>\n", dependencies: [{ kind: "component", type: i5.ActionBarItemComponent, selector: "c8y-action-bar-item", inputs: ["placement", "priority", "itemClass", "injector", "groupId", "inGroupPriority"] }, { kind: "component", type: i5.EmptyStateComponent, selector: "c8y-ui-empty-state", inputs: ["icon", "title", "subtitle", "horizontal"] }, { kind: "directive", type: i5.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i5.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i5$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.ForOfDirective, selector: "[c8yFor]", inputs: ["c8yForOf", "c8yForLoadMore", "c8yForPipe", "c8yForNotFound", "c8yForMaxIterations", "c8yForLoadingTemplate", "c8yForLoadNextLabel", "c8yForRealtime", "c8yForRealtimeOptions", "c8yForComparator", "c8yForEnableVirtualScroll", "c8yForVirtualScrollElementSize", "c8yForVirtualScrollStrategy", "c8yForVirtualScrollContainerHeight"], outputs: ["c8yForCount"] }, { kind: "component", type: i5.TitleComponent, selector: "c8y-title", inputs: ["pageTitleUpdate"] }, { kind: "directive", type: i6.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i6.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i5.GuideHrefDirective, selector: "[c8y-guide-href]", inputs: ["c8y-guide-href"] }, { kind: "component", type: i5.GuideDocsComponent, selector: "[c8y-guide-docs]" }, { kind: "component", type: i5.ListGroupComponent, selector: "c8y-list-group" }, { kind: "component", type: i5.ListItemComponent, selector: "c8y-list-item, c8y-li", inputs: ["active", "emptyActions", "collapsed", "selectable"], outputs: ["collapsedChange"] }, { kind: "component", type: i5.ListItemIconComponent, selector: "c8y-list-item-icon, c8y-li-icon", inputs: ["icon", "status"] }, { kind: "component", type: i5.ListItemBodyComponent, selector: "c8y-list-item-body, c8y-li-body", inputs: ["body"] }, { kind: "component", type: i5.HelpComponent, selector: "c8y-help", inputs: ["src", "isCollapsed", "priority", "icon"] }, { kind: "directive", type: i3$2.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["adaptivePosition", "tooltip", "placement", "triggers", "container", "containerClass", "boundariesElement", "isOpen", "isDisabled", "delay", "tooltipHtml", "tooltipPlacement", "tooltipIsOpen", "tooltipEnable", "tooltipAppendToBody", "tooltipAnimation", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "tooltipFadeDuration", "tooltipTrigger"], outputs: ["tooltipChange", "onShown", "onHidden", "tooltipStateChanged"], exportAs: ["bs-tooltip"] }, { kind: "directive", type: i1$1.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: i4.PopoverDirective, selector: "[popover]", inputs: ["adaptivePosition", "boundariesElement", "popover", "popoverContext", "popoverTitle", "placement", "outsideClick", "triggers", "container", "containerClass", "isOpen", "delay"], outputs: ["onShown", "onHidden"], exportAs: ["bs-popover"] }, { kind: "pipe", type: i5.C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i5$1.AsyncPipe, name: "async" }] }); }
2674
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: ReportDashboardListComponent, selector: "c8y-report-dashboard-list", viewQueries: [{ propertyName: "filter", first: true, predicate: FilterInputComponent, descendants: true }], ngImport: i0, template: "<c8y-title>\n {{ 'Reports' | translate }}\n</c8y-title>\n\n<c8y-action-bar-item\n [placement]=\"'left'\"\n itemClass=\"navbar-form\"\n>\n <div class=\"input-group input-group-search\">\n <input\n class=\"form-control\"\n [attr.aria-label]=\"'Filter' | translate\"\n placeholder=\"{{ 'Filter\u2026' | translate }}\"\n type=\"search\"\n [ngModel]=\"textFilter$ | async\"\n (ngModelChange)=\"textFilter$.next($event)\"\n />\n <span class=\"input-group-addon\">\n <i\n c8yIcon=\"search\"\n *ngIf=\"(textFilter$ | async).length === 0\"\n ></i>\n <i\n class=\"text-muted\"\n c8yIcon=\"times\"\n *ngIf=\"(textFilter$ | async).length > 0\"\n (click)=\"textFilter$.next('')\"\n px-event=\"Clear filtering reports\"\n ></i>\n </span>\n </div>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <button\n class=\"btn btn-link\"\n title=\"{{ 'Add report' | translate }}\"\n type=\"button\"\n [attr.data-cy]=\"'reports-add-report-action-bar-button'\"\n (click)=\"add()\"\n [disabled]=\"!canAddReport\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Add report' | translate }}\n </button>\n <button\n class=\"btn btn-dot m-r-16\"\n aria-label=\"{{ 'Info' | translate }}\"\n popover=\"{{ 'You don\\'t have permission to add reports' | translate }}\"\n placement=\"top\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n *ngIf=\"!canAddReport\"\n >\n <i\n class=\"text-primary\"\n [c8yIcon]=\"'info-circle'\"\n ></i>\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <button\n class=\"btn btn-link\"\n title=\"{{ 'Reload' | translate }}\"\n type=\"button\"\n (click)=\"loadReports()\"\n >\n <i\n c8yIcon=\"refresh\"\n [ngClass]=\"{ 'icon-spin': reloading }\"\n ></i>\n {{ 'Reload' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-help src=\"/docs/cockpit/working-with-reports/#working-with-reports\"></c8y-help>\n\n<c8y-list-group>\n <c8y-li\n class=\"page-sticky-header hidden-xs hidden-sm\"\n *ngIf=\"(reports$ | async)?.data.length > 0\"\n >\n <c8y-li-icon>\n <i class=\"p-l-24\"></i>\n </c8y-li-icon>\n <c8y-li-body class=\"content-flex-60\">\n <div class=\"col-3\">\n {{ 'Report' | translate }}\n </div>\n <div class=\"col-6\">\n {{ 'Description' | translate }}\n </div>\n <div class=\"col-2\">\n {{ 'Show in navigator' | translate }}\n </div>\n </c8y-li-body>\n </c8y-li>\n\n <c8y-li *c8yFor=\"let report of reports$; let i = index; loadMore: 'auto'\">\n <c8y-li-icon [icon]=\"report.icon\"></c8y-li-icon>\n <c8y-li-body class=\"content-flex-60\">\n <div class=\"col-3\">\n <button\n class=\"btn-clean\"\n title=\"{{ report.name }}\"\n type=\"button\"\n routerLink=\"/reports/{{ report.id }}\"\n >\n <span class=\"text-truncate\">\n {{ report.name }}\n </span>\n </button>\n </div>\n <div class=\"col-6\">\n <p class=\"small text-truncate-wrap\">\n <em\n class=\"text-muted\"\n *ngIf=\"!report.description; else showDescription\"\n >\n {{ 'No description available' | translate }}\n </em>\n <ng-template #showDescription>\n {{ report.description }}\n </ng-template>\n </p>\n </div>\n <div class=\"col-2 fit-h-20 m-t-xs-8\">\n <label\n class=\"c8y-switch c8y-switch--inline\"\n title=\"{{ 'Show in navigator' | translate }}\"\n >\n <input\n type=\"checkbox\"\n [(ngModel)]=\"!!report.c8y_IsNavigatorNode\"\n (change)=\"update(report)\"\n />\n <span></span>\n <span class=\"visible-xs\">\n {{ 'Show in navigator' | translate }}\n </span>\n </label>\n </div>\n <div class=\"col-1 hidden-xs\">\n <button\n class=\"btn btn-dot btn-dot--danger showOnHover m-l-auto d-flex\"\n [attr.aria-label]=\"'Remove report' | translate\"\n tooltip=\"{{ 'Remove report' | translate }}\"\n type=\"button\"\n [delay]=\"500\"\n (click)=\"delete(report)\"\n >\n <i c8yIcon=\"minus-circle\"></i>\n </button>\n </div>\n <div class=\"visible-xs p-t-8 text-right\">\n <button\n class=\"btn btn-default btn-sm\"\n title=\"{{ 'Remove report' | translate }}\"\n type=\"button\"\n (click)=\"delete(report)\"\n >\n <i c8yIcon=\"delete\"></i>\n {{ 'Remove report' | translate }}\n </button>\n </div>\n </c8y-li-body>\n </c8y-li>\n</c8y-list-group>\n\n<c8y-ui-empty-state\n [icon]=\"'c8y-reports'\"\n [title]=\"'There are no reports defined.' | translate\"\n [subtitle]=\"'Add a report first.' | translate\"\n *ngIf=\"(reports$ | async)?.data.length === 0\"\n>\n <p>\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Add report' | translate }}\"\n type=\"button\"\n [attr.data-cy]=\"'reports-add-report-empty-state-button'\"\n [disabled]=\"!canAddReport\"\n (click)=\"add()\"\n >\n {{ 'Add report' | translate }}\n </button>\n </p>\n <p c8y-guide-docs>\n <small\n translate\n ngNonBindable\n >\n Find out more in the\n <a c8y-guide-href=\"/docs/cockpit/working-with-reports\">user documentation</a>\n .\n </small>\n </p>\n</c8y-ui-empty-state>\n", dependencies: [{ kind: "component", type: i5.ActionBarItemComponent, selector: "c8y-action-bar-item", inputs: ["placement", "priority", "itemClass", "injector", "groupId", "inGroupPriority"] }, { kind: "component", type: i5.EmptyStateComponent, selector: "c8y-ui-empty-state", inputs: ["icon", "title", "subtitle", "horizontal"] }, { kind: "directive", type: i5.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i5.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i5$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.ForOfDirective, selector: "[c8yFor]", inputs: ["c8yForOf", "c8yForLoadMore", "c8yForPipe", "c8yForNotFound", "c8yForMaxIterations", "c8yForLoadingTemplate", "c8yForLoadNextLabel", "c8yForLoadingLabel", "c8yForRealtime", "c8yForRealtimeOptions", "c8yForComparator", "c8yForEnableVirtualScroll", "c8yForVirtualScrollElementSize", "c8yForVirtualScrollStrategy", "c8yForVirtualScrollContainerHeight"], outputs: ["c8yForCount", "c8yForLoadMoreComponent"] }, { kind: "component", type: i5.TitleComponent, selector: "c8y-title", inputs: ["pageTitleUpdate"] }, { kind: "directive", type: i6.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i6.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i5.GuideHrefDirective, selector: "[c8y-guide-href]", inputs: ["c8y-guide-href"] }, { kind: "component", type: i5.GuideDocsComponent, selector: "[c8y-guide-docs]" }, { kind: "component", type: i5.ListGroupComponent, selector: "c8y-list-group" }, { kind: "component", type: i5.ListItemComponent, selector: "c8y-list-item, c8y-li", inputs: ["active", "emptyActions", "collapsed", "selectable"], outputs: ["collapsedChange"] }, { kind: "component", type: i5.ListItemIconComponent, selector: "c8y-list-item-icon, c8y-li-icon", inputs: ["icon", "status"] }, { kind: "component", type: i5.ListItemBodyComponent, selector: "c8y-list-item-body, c8y-li-body", inputs: ["body"] }, { kind: "component", type: i5.HelpComponent, selector: "c8y-help", inputs: ["src", "isCollapsed", "priority", "icon"] }, { kind: "directive", type: i3$2.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["adaptivePosition", "tooltip", "placement", "triggers", "container", "containerClass", "boundariesElement", "isOpen", "isDisabled", "delay", "tooltipHtml", "tooltipPlacement", "tooltipIsOpen", "tooltipEnable", "tooltipAppendToBody", "tooltipAnimation", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "tooltipFadeDuration", "tooltipTrigger"], outputs: ["tooltipChange", "onShown", "onHidden", "tooltipStateChanged"], exportAs: ["bs-tooltip"] }, { kind: "directive", type: i1$1.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: i4.PopoverDirective, selector: "[popover]", inputs: ["adaptivePosition", "boundariesElement", "popover", "popoverContext", "popoverTitle", "placement", "outsideClick", "triggers", "container", "containerClass", "isOpen", "delay"], outputs: ["onShown", "onHidden"], exportAs: ["bs-popover"] }, { kind: "pipe", type: i5.C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i5$1.AsyncPipe, name: "async" }] }); }
2675
2675
  }
2676
2676
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ReportDashboardListComponent, decorators: [{
2677
2677
  type: Component,