gamma-app-controller 1.1.26 → 1.1.28

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 (135) hide show
  1. package/esm2020/lib/application-controller/application-controller.module.mjs +20 -20
  2. package/esm2020/lib/application-controller/application-dataset-component/application-dataset/application-dataset.component.mjs +1 -1
  3. package/esm2020/lib/application-controller/application-dataset-component/create-dataset/create-dataset.component.mjs +1 -1
  4. package/esm2020/lib/application-controller/application-filter/application-filter.component.mjs +1 -1
  5. package/esm2020/lib/application-controller/application-menu-controller/application-menus/application-menus.component.mjs +1 -1
  6. package/esm2020/lib/application-controller/application-metric-config/all-metrics-config/all-metrics-config.component.mjs +1 -1
  7. package/esm2020/lib/application-controller/application-metric-config/create-metrics/create-metrics.component.mjs +1 -1
  8. package/esm2020/lib/application-controller/application-view-components/application-views/application-views.component.mjs +1 -1
  9. package/esm2020/lib/application-controller/application-view-components/create-comp-view/create-comp-view.component.mjs +1 -1
  10. package/esm2020/lib/application-controller/page-controller/page-config/page-config.component.mjs +11 -11
  11. package/esm2020/lib/application-controller/page-controller/page-config-multi-layout/page-config-multi-layout.component.mjs +10 -10
  12. package/esm2020/lib/application-controller/page-controller/page-controller/page-controller.component.mjs +1 -1
  13. package/esm2020/lib/application-controller/support-components/dash-chart/dash-chart.component.mjs +1 -1
  14. package/esm2020/lib/application-controller/support-components/dash-table/dash-table.component.mjs +1 -1
  15. package/esm2020/lib/application-controller/support-components/dash-today-previous/dash-today-previous.component.mjs +1 -1
  16. package/esm2020/lib/application-controller/support-components/geo-map/geo-map.component.mjs +2 -2
  17. package/esm2020/lib/application-controller/support-components/heat-map/heat-map.component.mjs +1 -1
  18. package/esm2020/lib/application-controller/support-components/single-card/single-card.component.mjs +1 -1
  19. package/esm2020/lib/application-controller/support-components/table-with-bar/table-with-bar.component.mjs +2 -2
  20. package/esm2020/lib/shared/advanced-component/advance-widget-header-filter/advance-widget-header-filter.component.mjs +116 -0
  21. package/esm2020/lib/shared/advanced-component/app-advance-header/app-header.component.mjs +306 -0
  22. package/esm2020/lib/shared/advanced-component/gamm-single-number-card/gamm-single-number-card.component.mjs +80 -0
  23. package/esm2020/lib/shared/advanced-component/gamma-advance-chart/gamma-advance-chart.component.mjs +379 -0
  24. package/esm2020/lib/shared/advanced-component/gamma-advance-operator-table/gamma-advance-operator-table.component.mjs +188 -0
  25. package/esm2020/lib/shared/advanced-component/gamma-geo-chart/gamma-geo-chart.component.mjs +435 -0
  26. package/esm2020/lib/shared/advanced-component/gamma-heatmap/gamma-heatmap.component.mjs +334 -0
  27. package/esm2020/lib/shared/advanced-component/gamma-table-clumn-bar-chart/gamma-table-clumn-bar-chart.component.mjs +155 -0
  28. package/esm2020/lib/shared/advanced-component/gamma-table-with-percentage/contentSafeHtml.mjs +20 -0
  29. package/esm2020/lib/shared/advanced-component/gamma-table-with-percentage/gamma-table-with-percentage.component.mjs +187 -0
  30. package/esm2020/lib/shared/advanced-component/gamma-today-previous/gamma-today-previous.component.mjs +86 -0
  31. package/esm2020/lib/shared/advanced-component/google-geo-map/google-geo-map.component.mjs +439 -0
  32. package/esm2020/lib/shared/app-title/app-title.component.mjs +67 -0
  33. package/esm2020/lib/shared/gamam-widget/gamam-widget.component.mjs +35 -0
  34. package/esm2020/lib/shared/gamma-advance-filter/gamma-advance-filter.component.mjs +273 -0
  35. package/esm2020/lib/shared/gamma-bread-crumbs/bread-crumbs.component.mjs +142 -0
  36. package/esm2020/lib/shared/kpi-comon-service.mjs +537 -0
  37. package/esm2020/lib/{application-controller/shared → shared}/loader/loader.component.mjs +1 -1
  38. package/esm2020/lib/{application-controller/shared → shared}/loading/loading.component.mjs +1 -1
  39. package/esm2020/lib/shared/loading/loadingModule.mjs +28 -0
  40. package/esm2020/lib/shared/safeHtmlPipe.mjs +20 -0
  41. package/esm2020/lib/template-module/KpiCreationModule/create-kpi-tree.component.mjs +1 -1
  42. package/esm2020/lib/template-module/KpiCreationModule/kpiCreation.module.mjs +2 -2
  43. package/esm2020/lib/template-module/bookmarked-template/bookmarked-dataset-call.service.mjs +364 -0
  44. package/esm2020/lib/template-module/bookmarked-template/bookmarked-layout.service.mjs +121 -0
  45. package/esm2020/lib/template-module/bookmarked-template/bookmarked-template.component.mjs +816 -0
  46. package/esm2020/lib/template-module/bookmarked-template/bookmarkedTemplate.module.mjs +151 -0
  47. package/esm2020/lib/template-module/cdrConfigModule/cdr-config.component.mjs +1 -1
  48. package/esm2020/lib/template-module/cdrConfigModule/cdrConfig.module.mjs +2 -2
  49. package/esm2020/lib/template-module/defaulLandingComponent/defaultLandingComponent.module.mjs +151 -0
  50. package/esm2020/lib/template-module/defaulLandingComponent/landing-component.component.mjs +870 -0
  51. package/esm2020/lib/template-module/defaulLandingComponent/landing-component.service.mjs +121 -0
  52. package/esm2020/lib/template-module/defaulLandingComponent/landing-dataset-call.service.mjs +364 -0
  53. package/esm2020/lib/template-module/exceptionConfigModule/exception-operation.component.mjs +1 -1
  54. package/esm2020/lib/template-module/exceptionConfigModule/exceptionConfig.module.mjs +2 -2
  55. package/esm2020/lib/template-module/kpiWithMultiLayout/dynamin-modal-multi.component.mjs +180 -0
  56. package/esm2020/lib/template-module/kpiWithMultiLayout/kpi-multi-layout.service.mjs +121 -0
  57. package/esm2020/lib/template-module/kpiWithMultiLayout/kpi-with-multilayout.component.mjs +992 -0
  58. package/esm2020/lib/template-module/kpiWithMultiLayout/kpiWithMultiayout.module.mjs +156 -0
  59. package/esm2020/lib/template-module/kpiWithMultiLayout/single-layout-dataset-call.service.mjs +364 -0
  60. package/esm2020/lib/template-module/kpiWithSingleLayout/dynamin-modal.component.mjs +180 -0
  61. package/esm2020/lib/template-module/kpiWithSingleLayout/kpi-single-layout.service.mjs +121 -0
  62. package/esm2020/lib/template-module/kpiWithSingleLayout/kpi-with-dataset.component.mjs +1046 -0
  63. package/esm2020/lib/template-module/kpiWithSingleLayout/kpiWithSingleLayout.module.mjs +156 -0
  64. package/esm2020/lib/template-module/kpiWithSingleLayout/multi-layout-dataset-call.service.mjs +364 -0
  65. package/esm2020/public-api.mjs +38 -20
  66. package/fesm2015/gamma-app-controller.mjs +7025 -399
  67. package/fesm2015/gamma-app-controller.mjs.map +1 -1
  68. package/fesm2020/gamma-app-controller.mjs +6970 -399
  69. package/fesm2020/gamma-app-controller.mjs.map +1 -1
  70. package/lib/application-controller/application-controller.module.d.ts +19 -19
  71. package/lib/application-controller/page-controller/page-config/page-config.component.d.ts +9 -9
  72. package/lib/application-controller/page-controller/page-config-multi-layout/page-config-multi-layout.component.d.ts +8 -8
  73. package/lib/{application-controller/shared → shared}/advanced-component/app-advance-header/app-header.component.d.ts +18 -2
  74. package/lib/{application-controller/shared → shared}/advanced-component/gamm-single-number-card/gamm-single-number-card.component.d.ts +3 -5
  75. package/lib/{application-controller/shared → shared}/advanced-component/gamma-advance-chart/gamma-advance-chart.component.d.ts +3 -1
  76. package/lib/{application-controller/shared → shared}/advanced-component/gamma-advance-operator-table/gamma-advance-operator-table.component.d.ts +4 -2
  77. package/lib/{application-controller/shared → shared}/advanced-component/gamma-geo-chart/gamma-geo-chart.component.d.ts +1 -1
  78. package/lib/{application-controller/shared → shared}/advanced-component/gamma-heatmap/gamma-heatmap.component.d.ts +1 -1
  79. package/lib/{application-controller/shared → shared}/advanced-component/gamma-table-clumn-bar-chart/gamma-table-clumn-bar-chart.component.d.ts +1 -1
  80. package/lib/{application-controller/shared → shared}/advanced-component/gamma-table-with-percentage/gamma-table-with-percentage.component.d.ts +6 -2
  81. package/lib/{application-controller/shared → shared}/advanced-component/gamma-today-previous/gamma-today-previous.component.d.ts +1 -1
  82. package/lib/{application-controller/shared → shared}/advanced-component/google-geo-map/google-geo-map.component.d.ts +1 -1
  83. package/lib/{application-controller/shared → shared}/app-title/app-title.component.d.ts +1 -1
  84. package/lib/{application-controller/shared → shared}/gamam-widget/gamam-widget.component.d.ts +1 -1
  85. package/lib/{application-controller/shared → shared}/gamma-advance-filter/gamma-advance-filter.component.d.ts +3 -2
  86. package/lib/{application-controller/shared → shared}/gamma-bread-crumbs/bread-crumbs.component.d.ts +1 -1
  87. package/lib/{application-controller/shared → shared}/kpi-comon-service.d.ts +1 -1
  88. package/lib/template-module/KpiCreationModule/kpiCreation.module.d.ts +1 -1
  89. package/lib/template-module/bookmarked-template/bookmarked-dataset-call.service.d.ts +24 -0
  90. package/lib/template-module/bookmarked-template/bookmarked-layout.service.d.ts +33 -0
  91. package/lib/template-module/bookmarked-template/bookmarked-template.component.d.ts +109 -0
  92. package/lib/template-module/bookmarked-template/bookmarkedTemplate.module.d.ts +16 -0
  93. package/lib/template-module/cdrConfigModule/cdrConfig.module.d.ts +1 -1
  94. package/lib/template-module/defaulLandingComponent/defaultLandingComponent.module.d.ts +16 -0
  95. package/lib/template-module/defaulLandingComponent/landing-component.component.d.ts +109 -0
  96. package/lib/template-module/defaulLandingComponent/landing-component.service.d.ts +33 -0
  97. package/lib/template-module/defaulLandingComponent/landing-dataset-call.service.d.ts +24 -0
  98. package/lib/template-module/exceptionConfigModule/exceptionConfig.module.d.ts +1 -1
  99. package/lib/template-module/kpiWithMultiLayout/dynamin-modal-multi.component.d.ts +42 -0
  100. package/lib/template-module/kpiWithMultiLayout/kpi-multi-layout.service.d.ts +33 -0
  101. package/lib/template-module/kpiWithMultiLayout/kpi-with-multilayout.component.d.ts +117 -0
  102. package/lib/template-module/kpiWithMultiLayout/kpiWithMultiayout.module.d.ts +17 -0
  103. package/lib/template-module/kpiWithMultiLayout/single-layout-dataset-call.service.d.ts +24 -0
  104. package/lib/template-module/kpiWithSingleLayout/dynamin-modal.component.d.ts +42 -0
  105. package/lib/template-module/kpiWithSingleLayout/kpi-single-layout.service.d.ts +33 -0
  106. package/lib/template-module/kpiWithSingleLayout/kpi-with-dataset.component.d.ts +122 -0
  107. package/lib/template-module/kpiWithSingleLayout/kpiWithSingleLayout.module.d.ts +17 -0
  108. package/lib/template-module/kpiWithSingleLayout/multi-layout-dataset-call.service.d.ts +24 -0
  109. package/package.json +1 -1
  110. package/public-api.d.ts +37 -19
  111. package/esm2020/lib/application-controller/shared/advanced-component/advance-widget-header-filter/advance-widget-header-filter.component.mjs +0 -124
  112. package/esm2020/lib/application-controller/shared/advanced-component/app-advance-header/app-header.component.mjs +0 -220
  113. package/esm2020/lib/application-controller/shared/advanced-component/gamm-single-number-card/gamm-single-number-card.component.mjs +0 -95
  114. package/esm2020/lib/application-controller/shared/advanced-component/gamma-advance-chart/gamma-advance-chart.component.mjs +0 -362
  115. package/esm2020/lib/application-controller/shared/advanced-component/gamma-advance-operator-table/gamma-advance-operator-table.component.mjs +0 -177
  116. package/esm2020/lib/application-controller/shared/advanced-component/gamma-geo-chart/gamma-geo-chart.component.mjs +0 -441
  117. package/esm2020/lib/application-controller/shared/advanced-component/gamma-heatmap/gamma-heatmap.component.mjs +0 -328
  118. package/esm2020/lib/application-controller/shared/advanced-component/gamma-table-clumn-bar-chart/gamma-table-clumn-bar-chart.component.mjs +0 -155
  119. package/esm2020/lib/application-controller/shared/advanced-component/gamma-table-with-percentage/contentSafeHtml.mjs +0 -20
  120. package/esm2020/lib/application-controller/shared/advanced-component/gamma-table-with-percentage/gamma-table-with-percentage.component.mjs +0 -157
  121. package/esm2020/lib/application-controller/shared/advanced-component/gamma-today-previous/gamma-today-previous.component.mjs +0 -85
  122. package/esm2020/lib/application-controller/shared/advanced-component/google-geo-map/google-geo-map.component.mjs +0 -439
  123. package/esm2020/lib/application-controller/shared/app-title/app-title.component.mjs +0 -67
  124. package/esm2020/lib/application-controller/shared/gamam-widget/gamam-widget.component.mjs +0 -35
  125. package/esm2020/lib/application-controller/shared/gamma-advance-filter/gamma-advance-filter.component.mjs +0 -237
  126. package/esm2020/lib/application-controller/shared/gamma-bread-crumbs/bread-crumbs.component.mjs +0 -142
  127. package/esm2020/lib/application-controller/shared/kpi-comon-service.mjs +0 -537
  128. package/esm2020/lib/application-controller/shared/loading/loadingModule.mjs +0 -28
  129. package/esm2020/lib/application-controller/shared/safeHtmlPipe.mjs +0 -20
  130. /package/lib/{application-controller/shared → shared}/advanced-component/advance-widget-header-filter/advance-widget-header-filter.component.d.ts +0 -0
  131. /package/lib/{application-controller/shared → shared}/advanced-component/gamma-table-with-percentage/contentSafeHtml.d.ts +0 -0
  132. /package/lib/{application-controller/shared → shared}/loader/loader.component.d.ts +0 -0
  133. /package/lib/{application-controller/shared → shared}/loading/loading.component.d.ts +0 -0
  134. /package/lib/{application-controller/shared → shared}/loading/loadingModule.d.ts +0 -0
  135. /package/lib/{application-controller/shared → shared}/safeHtmlPipe.d.ts +0 -0
@@ -1,35 +0,0 @@
1
- import { Component, Input } from '@angular/core';
2
- import * as i0 from "@angular/core";
3
- import * as i1 from "../../common";
4
- import * as i2 from "ngx-toastr";
5
- import * as i3 from "../kpi-comon-service";
6
- import * as i4 from "@angular/common";
7
- import * as i5 from "../loader/loader.component";
8
- export class GamamWidgetComponent {
9
- constructor(commonService, toastr, kpiService) {
10
- this.commonService = commonService;
11
- this.toastr = toastr;
12
- this.kpiService = kpiService;
13
- this.isLoader = true;
14
- }
15
- set widgetConfigSource(value) {
16
- if (value === undefined || value.length === 0) {
17
- }
18
- else {
19
- this.page_config = value;
20
- this.isLoader = false;
21
- }
22
- }
23
- ngOnInit() {
24
- }
25
- }
26
- GamamWidgetComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: GamamWidgetComponent, deps: [{ token: i1.CommonService }, { token: i2.ToastrService }, { token: i3.kpicommonService }], target: i0.ɵɵFactoryTarget.Component });
27
- GamamWidgetComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: GamamWidgetComponent, selector: "app-gamam-widget", inputs: { widgetConfigSource: "widgetConfigSource" }, ngImport: i0, template: "<div class=\"w-full my-1\">\n <div class=\"block mx-1 rounded-lg shadow-lg bg-white border border-gray-200 rounded-lg shadow-md\n dark:bg-gray-800 dark:border-gray-700 max-w-sm\">\n <div\n class=\"py-3 px-6 bg-white border border-gray-200 rounded-lg shadow-md dark:bg-gray-800 dark:border-gray-700\">\n <div class=\"flex justify-between\">\n <div class=\"flex items-center float-start\">\n {{page_config.title}}\n </div>\n <div class=\"flex items-center float-end\">\n <i class=\"{{page_config.icon}}\"></i>\n </div>\n\n </div>\n </div>\n <app-loader *ngIf=\"isLoader\"></app-loader>\n\n <div class=\"p-2\" *ngIf=\"!isLoader\">\n <div class=\"flex flex-row items-center justify-center m-0\">\n <div class=\"w-full px-2 \">\n <div class=\"flex justify-center items-center text-4xl font-bold text-{{page_config.color}} p-2\">\n {{page_config.count}}\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>", styles: [""], dependencies: [{ kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i5.LoaderComponent, selector: "app-loader" }] });
28
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: GamamWidgetComponent, decorators: [{
29
- type: Component,
30
- args: [{ selector: 'app-gamam-widget', template: "<div class=\"w-full my-1\">\n <div class=\"block mx-1 rounded-lg shadow-lg bg-white border border-gray-200 rounded-lg shadow-md\n dark:bg-gray-800 dark:border-gray-700 max-w-sm\">\n <div\n class=\"py-3 px-6 bg-white border border-gray-200 rounded-lg shadow-md dark:bg-gray-800 dark:border-gray-700\">\n <div class=\"flex justify-between\">\n <div class=\"flex items-center float-start\">\n {{page_config.title}}\n </div>\n <div class=\"flex items-center float-end\">\n <i class=\"{{page_config.icon}}\"></i>\n </div>\n\n </div>\n </div>\n <app-loader *ngIf=\"isLoader\"></app-loader>\n\n <div class=\"p-2\" *ngIf=\"!isLoader\">\n <div class=\"flex flex-row items-center justify-center m-0\">\n <div class=\"w-full px-2 \">\n <div class=\"flex justify-center items-center text-4xl font-bold text-{{page_config.color}} p-2\">\n {{page_config.count}}\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>" }]
31
- }], ctorParameters: function () { return [{ type: i1.CommonService }, { type: i2.ToastrService }, { type: i3.kpicommonService }]; }, propDecorators: { widgetConfigSource: [{
32
- type: Input,
33
- args: ['widgetConfigSource']
34
- }] } });
35
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2FtYW0td2lkZ2V0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2dhbW1hLWFwcC1jb250cm9sbGVyL3NyYy9saWIvYXBwbGljYXRpb24tY29udHJvbGxlci9zaGFyZWQvZ2FtYW0td2lkZ2V0L2dhbWFtLXdpZGdldC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9nYW1tYS1hcHAtY29udHJvbGxlci9zcmMvbGliL2FwcGxpY2F0aW9uLWNvbnRyb2xsZXIvc2hhcmVkL2dhbWFtLXdpZGdldC9nYW1hbS13aWRnZXQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQVUsTUFBTSxlQUFlLENBQUM7Ozs7Ozs7QUFVekQsTUFBTSxPQUFPLG9CQUFvQjtJQU0vQixZQUNTLGFBQTRCLEVBQzNCLE1BQXFCLEVBQ3JCLFVBQTRCO1FBRjdCLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQzNCLFdBQU0sR0FBTixNQUFNLENBQWU7UUFDckIsZUFBVSxHQUFWLFVBQVUsQ0FBa0I7UUFMdEMsYUFBUSxHQUFZLElBQUksQ0FBQztJQU1yQixDQUFDO0lBRUwsSUFDSSxrQkFBa0IsQ0FBQyxLQUFLO1FBSTFCLElBQUksS0FBSyxLQUFLLFNBQVMsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtTQUU5QzthQUFNO1lBQ0wsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7WUFDekIsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7U0FXdkI7SUFFSCxDQUFDO0lBRUQsUUFBUTtJQUNSLENBQUM7O2lIQXJDVSxvQkFBb0I7cUdBQXBCLG9CQUFvQiw4R0NWakMsbXJDQTJCTTsyRkRqQk8sb0JBQW9CO2tCQUxoQyxTQUFTOytCQUNFLGtCQUFrQjsrSkFpQnhCLGtCQUFrQjtzQkFEckIsS0FBSzt1QkFBQyxvQkFBb0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFRvYXN0clNlcnZpY2UgfSBmcm9tICduZ3gtdG9hc3RyJztcbmltcG9ydCB7IGtwaWNvbW1vblNlcnZpY2UgfSBmcm9tICcuLi9rcGktY29tb24tc2VydmljZSc7XG5pbXBvcnQgeyBDb21tb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29tbW9uJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLWdhbWFtLXdpZGdldCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9nYW1hbS13aWRnZXQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9nYW1hbS13aWRnZXQuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBHYW1hbVdpZGdldENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgc3Vic2NyaWJlcl9jb3VudDtcbiAgcGFnZV9jb25maWc7XG4gIGlzTG9hZGVyOiBib29sZWFuID0gdHJ1ZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgY29tbW9uU2VydmljZTogQ29tbW9uU2VydmljZSxcbiAgICBwcml2YXRlIHRvYXN0cjogVG9hc3RyU2VydmljZSxcbiAgICBwcml2YXRlIGtwaVNlcnZpY2U6IGtwaWNvbW1vblNlcnZpY2VcbiAgKSB7IH1cblxuICBASW5wdXQoJ3dpZGdldENvbmZpZ1NvdXJjZScpXG4gIHNldCB3aWRnZXRDb25maWdTb3VyY2UodmFsdWUpIHtcblxuICAgIC8vIGNvbnNvbGUubG9nKHZhbHVlKTtcbiAgICAvLyBjb25zb2xlLmxvZyh2YWx1ZSk7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUubGVuZ3RoID09PSAwKSB7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wYWdlX2NvbmZpZyA9IHZhbHVlO1xuICAgICAgdGhpcy5pc0xvYWRlciA9IGZhbHNlO1xuXG4gICAgICAvLyB0aGlzLnNlcnZpY2UuZ2V0VW5pcXVlRGF0YSh2YWx1ZS5rcGlDb25maWcuYXBpKS5zdWJzY3JpYmUoKGRhdGE6IGFueSkgPT4ge1xuICAgICAgLy8gICB0aGlzLnN1YnNjcmliZXJfY291bnQgPSB0aGlzLmNvbW1vblNlcnZpY2UucmVmb3JtYXROdW1iZXJXaXRoVGhvdXNhbmRTZXBhcmF0b3JWMihkYXRhLCAwKTtcbiAgICAgIC8vICAgdGhpcy5pc0xvYWRlciA9IGZhbHNlO1xuICAgICAgLy8gfSwgZXJyb3IgPT4ge1xuICAgICAgLy8gICB0aGlzLnRvYXN0ci5lcnJvcignVW5leHBlY3RlZCBTZXJ2ZXIgRXhjZXB0aW9uLiBQbGVhc2UgY29udGFjdCBTeXN0ZW0gQWRtaW4uJywgJ1VuaXF1ZSBTdWJzY3JpYmVyJyk7XG4gICAgICAvLyB9KVxuXG4gICAgICAvLyB0aGlzLnRvYXN0ci5lcnJvcignVW5leHBlY3RlZCBTZXJ2ZXIgRXhjZXB0aW9uLiBQbGVhc2UgY29udGFjdCBTeXN0ZW0gQWRtaW4uJywgJ2Vycm9yJyk7XG5cbiAgICB9XG5cbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICB9XG5cbn1cbiIsIjxkaXYgY2xhc3M9XCJ3LWZ1bGwgbXktMVwiPlxuICAgIDxkaXYgY2xhc3M9XCJibG9jayBteC0xIHJvdW5kZWQtbGcgc2hhZG93LWxnIGJnLXdoaXRlIGJvcmRlciBib3JkZXItZ3JheS0yMDAgcm91bmRlZC1sZyBzaGFkb3ctbWRcbiAgICAgICAgICAgICAgICAgZGFyazpiZy1ncmF5LTgwMCBkYXJrOmJvcmRlci1ncmF5LTcwMCBtYXgtdy1zbVwiPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cInB5LTMgcHgtNiBiZy13aGl0ZSBib3JkZXIgYm9yZGVyLWdyYXktMjAwIHJvdW5kZWQtbGcgc2hhZG93LW1kIGRhcms6YmctZ3JheS04MDAgZGFyazpib3JkZXItZ3JheS03MDBcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktYmV0d2VlblwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBmbG9hdC1zdGFydFwiPlxuICAgICAgICAgICAgICAgICAgICB7e3BhZ2VfY29uZmlnLnRpdGxlfX1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgZmxvYXQtZW5kXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwie3twYWdlX2NvbmZpZy5pY29ufX1cIj48L2k+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGFwcC1sb2FkZXIgKm5nSWY9XCJpc0xvYWRlclwiPjwvYXBwLWxvYWRlcj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwicC0yXCIgKm5nSWY9XCIhaXNMb2FkZXJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBtLTBcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy1mdWxsIHB4LTIgXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY2VudGVyIGl0ZW1zLWNlbnRlciB0ZXh0LTR4bCBmb250LWJvbGQgdGV4dC17e3BhZ2VfY29uZmlnLmNvbG9yfX0gcC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7e3BhZ2VfY29uZmlnLmNvdW50fX1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG48L2Rpdj4iXX0=
@@ -1,237 +0,0 @@
1
- import { Component, Input, EventEmitter, Output, ViewChild, HostListener } from '@angular/core';
2
- import moment from './../../moment-helper';
3
- import * as i0 from "@angular/core";
4
- import * as i1 from "../../application-content.service";
5
- import * as i2 from "../kpi-comon-service";
6
- import * as i3 from "ngx-toastr";
7
- import * as i4 from "../../common";
8
- import * as i5 from "@angular/common";
9
- import * as i6 from "devextreme-angular/ui/date-box";
10
- import * as i7 from "devextreme-angular/ui/select-box";
11
- import * as i8 from "devextreme-angular/ui/tag-box";
12
- import * as i9 from "devextreme-angular/ui/text-box";
13
- import * as i10 from "@angular/forms";
14
- import * as i11 from "../loader/loader.component";
15
- export class GammaAdvanceFilterComponent {
16
- constructor(service, kpiService, toastr, commonService) {
17
- this.service = service;
18
- this.kpiService = kpiService;
19
- this.toastr = toastr;
20
- this.commonService = commonService;
21
- this.filterDataObject = new EventEmitter();
22
- this.quickDateSelector = false;
23
- this.isLoader = true;
24
- this.ranges = [
25
- { name: "Today", value: [moment(), moment()] },
26
- { name: "Yesterday", value: [moment().subtract(1, 'days'), moment().subtract(1, 'days')] },
27
- { name: "Last 7 Days", value: [moment().subtract(7, 'days'), moment().subtract(1, 'days')] },
28
- { name: "Last 15 Days", value: [moment().subtract(15, 'days'), moment().subtract(1, 'days')] },
29
- { name: 'This Month', value: [moment().startOf('month'), moment().endOf('month')] },
30
- { name: 'Last 1 Month', value: [moment().subtract(30, 'days'), moment()] },
31
- { name: 'Last 3 Month', value: [moment().subtract(91, 'days'), moment()] },
32
- { name: 'Last 6 Month', value: [moment().subtract(182, 'days'), moment()] },
33
- { name: 'Last 1 Year', value: [moment().subtract(365, 'days'), moment()] }
34
- ];
35
- }
36
- set filterOperatorData(value) {
37
- if (value === undefined || value.length === 0) {
38
- return;
39
- }
40
- else {
41
- this.kpiFilterData = [];
42
- this.kpiFilterData = value;
43
- this.kpiFilterData.forEach(item => {
44
- if (item.hasOwnProperty('momentFormate')) {
45
- item.momentFormat = item.momentFormate;
46
- delete item.momentFormate;
47
- }
48
- });
49
- this.processFilterForData();
50
- }
51
- }
52
- ngOnInit() {
53
- this.defaultEndDate = moment().subtract('1', 'days').format('YYYY-MM-DD');
54
- this.defaultStartDate = moment(this.defaultEndDate).subtract('5', 'days').format('YYYY-MM-DD');
55
- }
56
- async processFilterForData() {
57
- for (const filter of this.kpiFilterData) {
58
- this.isLoader = true;
59
- const startDateFilter = this.kpiFilterData.find(filter => filter.apiName === 'startDate' && (filter.display !== undefined ? filter.display : true));
60
- const endDateFilter = this.kpiFilterData.find(filter => filter.apiName === 'endDate' && (filter.display !== undefined ? filter.display : true));
61
- if (startDateFilter && endDateFilter) {
62
- this.quickDateSelector = true;
63
- }
64
- try {
65
- if (filter.apiName !== 'startDate' && filter.apiName !== 'endDate') {
66
- if (filter.apiName.includes('/reference/')) {
67
- const data = await this.service.getFilterDataByDrillDown(filter.apiName).toPromise();
68
- filter['filterDataSource'] = data;
69
- if (filter.defaultFilterType == "dynamic" && filter.defaultFilterValue !== "") {
70
- filter['filterDataSourceValue'] = this.parseContentValue(filter.defaultFilterValue);
71
- }
72
- else {
73
- filter['filterDataSourceValue'] = "";
74
- }
75
- }
76
- else {
77
- filter['filterDataSource'] = [];
78
- }
79
- }
80
- else if (filter.filterType == 'date' || filter.filterType == 'datetime') {
81
- if (filter.display == undefined) {
82
- filter.display = true;
83
- }
84
- if (filter.defaultFilterType == "dynamic" && filter.momentFunction !== "" && filter.defaultFilterValue !== "" && filter.momentFormat !== "") {
85
- if (filter.apiName == "startDate") {
86
- let [count, unit] = filter.defaultFilterValue.split(',');
87
- filter['filterDataSourceValue'] = moment()[filter.momentFunction](parseInt(count), unit).format(filter.momentFormat);
88
- }
89
- if (filter.apiName == "endDate") {
90
- let [count, unit] = filter.defaultFilterValue.split(',');
91
- filter['filterDataSourceValue'] = moment()[filter.momentFunction](parseInt(count), unit).format(filter.momentFormat);
92
- }
93
- }
94
- else if ((filter.defaultFilterType == "static" && filter.defaultFilterValue !== "")) {
95
- if (filter.apiName == "startDate") {
96
- filter['filterDataSourceValue'] = filter.defaultFilterValue;
97
- }
98
- if (filter.apiName == "endDate") {
99
- filter['filterDataSourceValue'] = filter.defaultFilterValue;
100
- }
101
- }
102
- }
103
- }
104
- catch (err) {
105
- this.toastr.error("Unexpected Server Exception. Please contact System Admin.", filter.type);
106
- }
107
- finally {
108
- this.isLoader = false;
109
- console.log(this.kpiFilterData);
110
- }
111
- }
112
- }
113
- parseContentValue(contentvalue) {
114
- return contentvalue.split(',').map(item => item.trim());
115
- }
116
- getIsMsisdn(context) {
117
- let key = context.toLowerCase();
118
- if (key.includes('msisdn')) {
119
- return true;
120
- }
121
- else {
122
- return false;
123
- }
124
- }
125
- startDateChange(e) {
126
- this.defaultStartDate = e.value;
127
- }
128
- endDateChange(e) {
129
- this.defaultEndDate = e.value;
130
- }
131
- searchByFilter() {
132
- let apiJsonObject = {};
133
- let operationFilter = {};
134
- this.kpiFilterData.forEach(element => {
135
- if (element.filterType == 'date' || element.filterType == 'datetime') {
136
- apiJsonObject[element.apiName] = moment(element.filterDataSourceValue).format(element.momentFormat);
137
- }
138
- else {
139
- if ((typeof element.filterDataSourceValue === "string" && element.filterDataSourceValue !== "") ||
140
- (Array.isArray(element.filterDataSourceValue) && element.filterDataSourceValue.length > 0)) {
141
- if (element.operatorName !== "") {
142
- if (element.filterType == "content") {
143
- operationFilter[element.operatorName] = element.filterDataSourceValue;
144
- }
145
- else {
146
- operationFilter[element.operatorName] = Array.isArray(element.filterDataSourceValue) ? element.filterDataSourceValue : [element.filterDataSourceValue];
147
- }
148
- }
149
- else {
150
- apiJsonObject[element.apiName] = element.filterDataSourceValue;
151
- }
152
- }
153
- }
154
- });
155
- apiJsonObject['operationFilter'] = operationFilter;
156
- console.log(apiJsonObject);
157
- this.filterDataObject.emit(apiJsonObject);
158
- }
159
- reseteFilter() {
160
- this.defaultEndDate = this.filterEndDate;
161
- this.defaultStartDate = this.filterStartDate;
162
- this.kpiFilterData.forEach(element => {
163
- element['filterDataSourceValue'] = "";
164
- });
165
- }
166
- getDrildownDimentions(apiName) {
167
- let dimentions = {
168
- "/api/v1/reference/getServedTypes": "srvType",
169
- "/api/v1/reference/getOutRoamingServedTypes": "srvType",
170
- "/api/v1/reference/getMSCDirections": "direction",
171
- "/api/v1/reference/getCBSVoiceDirections": "direction",
172
- "/api/v1/reference/getCBSmsDirections": "direction",
173
- "/api/v1/reference/getCBSGprsDirections": "direction",
174
- "/api/v1/reference/getNetworkTypeKeys": "nw_call_type",
175
- "/api/v1/reference/getGGSNRatingGroups": "ratingGroup",
176
- "/api/v1/reference/getGGSNAccessPointNames": "apn",
177
- "/api/v1/reference/getMainAccountBalanceTypes": "balanceTypeId",
178
- "/api/v1/reference/getDialDigitCountries": "other_party_iso"
179
- };
180
- return dimentions[apiName];
181
- }
182
- getCapitalize(item) {
183
- return this.commonService.convertToSpaceSeparatedCapitalized(item);
184
- }
185
- getQuickDateClick(item) {
186
- let startDate = item.value[0];
187
- let endDate = item.value[1];
188
- for (const filter of this.kpiFilterData) {
189
- if (filter.filterType == 'date' || filter.filterType == 'datetime') {
190
- if (filter.apiName == "startDate") {
191
- filter['filterDataSourceValue'] = moment(startDate).format(filter.momentFormat);
192
- }
193
- if (filter.apiName == "endDate") {
194
- filter['filterDataSourceValue'] = moment(endDate).format(filter.momentFormat);
195
- }
196
- }
197
- }
198
- }
199
- onDocumentClick(event) {
200
- if (this.isDatesDropDown) {
201
- const menuElement = this.menuIcon.nativeElement;
202
- if (!menuElement.contains(event.target)) {
203
- if (event.target['innerText'] !== "Quick Dates") {
204
- this.isDatesDropDown = false;
205
- }
206
- }
207
- }
208
- }
209
- }
210
- GammaAdvanceFilterComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: GammaAdvanceFilterComponent, deps: [{ token: i1.ApplicationContentService }, { token: i2.kpicommonService }, { token: i3.ToastrService }, { token: i4.CommonService }], target: i0.ɵɵFactoryTarget.Component });
211
- GammaAdvanceFilterComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: GammaAdvanceFilterComponent, selector: "app-gamma-advance-filter", inputs: { kpiId: "kpiId", filterStartDate: "filterStartDate", filterEndDate: "filterEndDate", browser_api_config: "browser_api_config", isButtonDesiable: "isButtonDesiable", filterOperatorData: "filterOperatorData" }, outputs: { filterDataObject: "filterDataObject" }, host: { listeners: { "document:click": "onDocumentClick($event)" } }, viewQueries: [{ propertyName: "menuIcon", first: true, predicate: ["menuIcon"], descendants: true }], ngImport: i0, template: "<app-loader *ngIf=\"isLoader\"></app-loader>\n\n\n<ng-container *ngIf=\"!isLoader\">\n <div class=\"flex flex-col border-b\">\n <div class=\"flex flex-row justify-end mb-4\" *ngIf=\"quickDateSelector\">\n <div class=\"w-1/4\">\n <dx-select-box [dataSource]=\"ranges\" valueExpr=\"value\" displayExpr=\"name\"\n (onValueChanged)=\"getQuickDateClick($event)\" placeholder=\"Quick Dates\">\n </dx-select-box>\n </div>\n </div>\n\n <ng-container *ngFor=\"let filter of kpiFilterData\">\n\n <div class=\"flex flex-row justify-between\">\n <ng-container *ngIf=\"filter.filterType == 'date'\">\n <ng-container *ngIf=\"filter.display\">\n <div class=\"mb-2\">{{getCapitalize(filter.label)}}</div>\n <div class=\"mb-2\">\n <div class=\"w-80\">\n <dx-date-box (onValueChanged)=\"startDateChange($event)\" displayFormat=\"yyyy-MM-dd\"\n type=\"{{filter.filterType}}\" [(ngModel)]=\"filter.filterDataSourceValue\">\n </dx-date-box>\n </div>\n </div>\n </ng-container>\n\n\n </ng-container>\n <ng-container *ngIf=\"filter.filterType == 'datetime'\">\n <div class=\"mb-2\">{{getCapitalize(filter.label)}}</div>\n <div class=\"mb-2\">\n <div class=\"w-80\">\n <dx-date-box (onValueChanged)=\"startDateChange($event)\" displayFormat=\"yyyy-MM-dd HH:mm:ss\"\n type=\"{{filter.filterType}}\" [(ngModel)]=\"filter.filterDataSourceValue\">\n </dx-date-box>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"filter.filterType !== 'date' && filter.filterType !== 'datetime'\">\n <div class=\"mb-2\">\n {{getCapitalize(filter.label)}}\n </div>\n <div class=\"mb-2\">\n <ng-container *ngIf=\"filter.filterType == 'multiple'\">\n <div class=\"w-80\">\n <dx-tag-box [dataSource]=\"filter.filterDataSource\" valueExpr=\"value\" displayExpr=\"name\"\n [searchEnabled]=\"true\" [multiline]=\"true\" [maxDisplayedTags]=\"6\"\n [(ngModel)]=\"filter.filterDataSourceValue\" [showSelectionControls]=\"true\"\n [searchEnabled]=\"true\">\n </dx-tag-box>\n </div>\n </ng-container>\n <ng-container *ngIf=\"filter.filterType == 'single'\">\n <div class=\"w-80\">\n <dx-select-box [items]=\"filter.filterDataSource\"\n [(ngModel)]=\"filter.filterDataSourceValue\" displayExpr=\"name\"\n valueExpr=\"value\"></dx-select-box>\n </div>\n </ng-container>\n <ng-container *ngIf=\"filter.filterType == 'content'\">\n <div class=\"w-80\">\n <dx-text-box [(ngModel)]=\"filter.filterDataSourceValue\"></dx-text-box>\n </div>\n </ng-container>\n </div>\n </ng-container>\n </div>\n </ng-container>\n </div>\n <div class=\"flex flex-row justify-end pl-3\">\n\n\n <button class=\"{{commonService.BtnLightWhite}} cursor-pointer mt-2\" (click)=\"reseteFilter()\">Reset</button>\n <button class=\"{{commonService.btnPrimaryBlue}} cursor-pointer mt-2\" (click)=\"searchByFilter()\"\n *ngIf=\"isButtonDesiable\">Search</button>\n </div>\n</ng-container>", styles: ["::ng-deep .dx-timeview{width:250px!important}::ng-deep .dx-timeview-field .dx-numberbox{width:70px!important}::ng-deep .dx-timeview-format12{width:70px!important}::ng-deep .dx-numberbox-spin-container{width:18px!important}::ng-deep .dx-texteditor{margin-bottom:10px}.floating-menu{position:absolute;display:none;background:white;border:1px solid #ccc;box-shadow:0 4px 8px #0000001a;z-index:1000;min-width:150px}.floating-menu.show{display:block;z-index:99999}.floating-menu ul{list-style:none;padding:0;margin:0}.floating-menu ul li{padding:10px;cursor:pointer}.floating-menu ul li:hover{background:#f0f0f0}\n"], dependencies: [{ kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i6.DxDateBoxComponent, selector: "dx-date-box", inputs: ["acceptCustomValue", "accessKey", "activeStateEnabled", "adaptivityEnabled", "applyButtonText", "applyValueMode", "buttons", "calendarOptions", "cancelButtonText", "dateOutOfRangeMessage", "dateSerializationFormat", "deferRendering", "disabled", "disabledDates", "displayFormat", "dropDownButtonTemplate", "dropDownOptions", "elementAttr", "focusStateEnabled", "height", "hint", "hoverStateEnabled", "inputAttr", "interval", "invalidDateMessage", "isValid", "label", "labelMode", "max", "maxLength", "min", "name", "opened", "openOnFieldClick", "pickerType", "placeholder", "readOnly", "rtlEnabled", "showAnalogClock", "showClearButton", "showDropDownButton", "spellcheck", "stylingMode", "tabIndex", "text", "type", "useMaskBehavior", "validationError", "validationErrors", "validationMessageMode", "validationStatus", "value", "valueChangeEvent", "visible", "width"], outputs: ["onChange", "onClosed", "onContentReady", "onCopy", "onCut", "onDisposing", "onEnterKey", "onFocusIn", "onFocusOut", "onInitialized", "onInput", "onKeyDown", "onKeyUp", "onOpened", "onOptionChanged", "onPaste", "onValueChanged", "acceptCustomValueChange", "accessKeyChange", "activeStateEnabledChange", "adaptivityEnabledChange", "applyButtonTextChange", "applyValueModeChange", "buttonsChange", "calendarOptionsChange", "cancelButtonTextChange", "dateOutOfRangeMessageChange", "dateSerializationFormatChange", "deferRenderingChange", "disabledChange", "disabledDatesChange", "displayFormatChange", "dropDownButtonTemplateChange", "dropDownOptionsChange", "elementAttrChange", "focusStateEnabledChange", "heightChange", "hintChange", "hoverStateEnabledChange", "inputAttrChange", "intervalChange", "invalidDateMessageChange", "isValidChange", "labelChange", "labelModeChange", "maxChange", "maxLengthChange", "minChange", "nameChange", "openedChange", "openOnFieldClickChange", "pickerTypeChange", "placeholderChange", "readOnlyChange", "rtlEnabledChange", "showAnalogClockChange", "showClearButtonChange", "showDropDownButtonChange", "spellcheckChange", "stylingModeChange", "tabIndexChange", "textChange", "typeChange", "useMaskBehaviorChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationStatusChange", "valueChange", "valueChangeEventChange", "visibleChange", "widthChange", "onBlur"] }, { kind: "component", type: i7.DxSelectBoxComponent, selector: "dx-select-box", inputs: ["acceptCustomValue", "accessKey", "activeStateEnabled", "buttons", "dataSource", "deferRendering", "disabled", "displayExpr", "displayValue", "dropDownButtonTemplate", "dropDownOptions", "elementAttr", "fieldTemplate", "focusStateEnabled", "grouped", "groupTemplate", "height", "hint", "hoverStateEnabled", "inputAttr", "isValid", "items", "itemTemplate", "label", "labelMode", "maxLength", "minSearchLength", "name", "noDataText", "opened", "openOnFieldClick", "placeholder", "readOnly", "rtlEnabled", "searchEnabled", "searchExpr", "searchMode", "searchTimeout", "selectedItem", "showClearButton", "showDataBeforeSearch", "showDropDownButton", "showSelectionControls", "spellcheck", "stylingMode", "tabIndex", "text", "useItemTextAsTitle", "validationError", "validationErrors", "validationMessageMode", "validationStatus", "value", "valueChangeEvent", "valueExpr", "visible", "width", "wrapItemText"], outputs: ["onChange", "onClosed", "onContentReady", "onCopy", "onCustomItemCreating", "onCut", "onDisposing", "onEnterKey", "onFocusIn", "onFocusOut", "onInitialized", "onInput", "onItemClick", "onKeyDown", "onKeyUp", "onOpened", "onOptionChanged", "onPaste", "onSelectionChanged", "onValueChanged", "acceptCustomValueChange", "accessKeyChange", "activeStateEnabledChange", "buttonsChange", "dataSourceChange", "deferRenderingChange", "disabledChange", "displayExprChange", "displayValueChange", "dropDownButtonTemplateChange", "dropDownOptionsChange", "elementAttrChange", "fieldTemplateChange", "focusStateEnabledChange", "groupedChange", "groupTemplateChange", "heightChange", "hintChange", "hoverStateEnabledChange", "inputAttrChange", "isValidChange", "itemsChange", "itemTemplateChange", "labelChange", "labelModeChange", "maxLengthChange", "minSearchLengthChange", "nameChange", "noDataTextChange", "openedChange", "openOnFieldClickChange", "placeholderChange", "readOnlyChange", "rtlEnabledChange", "searchEnabledChange", "searchExprChange", "searchModeChange", "searchTimeoutChange", "selectedItemChange", "showClearButtonChange", "showDataBeforeSearchChange", "showDropDownButtonChange", "showSelectionControlsChange", "spellcheckChange", "stylingModeChange", "tabIndexChange", "textChange", "useItemTextAsTitleChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationStatusChange", "valueChange", "valueChangeEventChange", "valueExprChange", "visibleChange", "widthChange", "wrapItemTextChange", "onBlur"] }, { kind: "component", type: i8.DxTagBoxComponent, selector: "dx-tag-box", inputs: ["acceptCustomValue", "accessKey", "activeStateEnabled", "applyValueMode", "buttons", "dataSource", "deferRendering", "disabled", "displayExpr", "dropDownButtonTemplate", "dropDownOptions", "elementAttr", "fieldTemplate", "focusStateEnabled", "grouped", "groupTemplate", "height", "hideSelectedItems", "hint", "hoverStateEnabled", "inputAttr", "isValid", "items", "itemTemplate", "label", "labelMode", "maxDisplayedTags", "maxFilterQueryLength", "maxLength", "minSearchLength", "multiline", "name", "noDataText", "opened", "openOnFieldClick", "placeholder", "readOnly", "rtlEnabled", "searchEnabled", "searchExpr", "searchMode", "searchTimeout", "selectAllMode", "selectAllText", "selectedItems", "showClearButton", "showDataBeforeSearch", "showDropDownButton", "showMultiTagOnly", "showSelectionControls", "stylingMode", "tabIndex", "tagTemplate", "text", "useItemTextAsTitle", "validationError", "validationErrors", "validationMessageMode", "validationStatus", "value", "valueExpr", "visible", "width", "wrapItemText"], outputs: ["onChange", "onClosed", "onContentReady", "onCustomItemCreating", "onDisposing", "onEnterKey", "onFocusIn", "onFocusOut", "onInitialized", "onInput", "onItemClick", "onKeyDown", "onKeyUp", "onMultiTagPreparing", "onOpened", "onOptionChanged", "onSelectAllValueChanged", "onSelectionChanged", "onValueChanged", "acceptCustomValueChange", "accessKeyChange", "activeStateEnabledChange", "applyValueModeChange", "buttonsChange", "dataSourceChange", "deferRenderingChange", "disabledChange", "displayExprChange", "dropDownButtonTemplateChange", "dropDownOptionsChange", "elementAttrChange", "fieldTemplateChange", "focusStateEnabledChange", "groupedChange", "groupTemplateChange", "heightChange", "hideSelectedItemsChange", "hintChange", "hoverStateEnabledChange", "inputAttrChange", "isValidChange", "itemsChange", "itemTemplateChange", "labelChange", "labelModeChange", "maxDisplayedTagsChange", "maxFilterQueryLengthChange", "maxLengthChange", "minSearchLengthChange", "multilineChange", "nameChange", "noDataTextChange", "openedChange", "openOnFieldClickChange", "placeholderChange", "readOnlyChange", "rtlEnabledChange", "searchEnabledChange", "searchExprChange", "searchModeChange", "searchTimeoutChange", "selectAllModeChange", "selectAllTextChange", "selectedItemsChange", "showClearButtonChange", "showDataBeforeSearchChange", "showDropDownButtonChange", "showMultiTagOnlyChange", "showSelectionControlsChange", "stylingModeChange", "tabIndexChange", "tagTemplateChange", "textChange", "useItemTextAsTitleChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationStatusChange", "valueChange", "valueExprChange", "visibleChange", "widthChange", "wrapItemTextChange", "onBlur"] }, { kind: "component", type: i9.DxTextBoxComponent, selector: "dx-text-box", inputs: ["accessKey", "activeStateEnabled", "buttons", "disabled", "elementAttr", "focusStateEnabled", "height", "hint", "hoverStateEnabled", "inputAttr", "isValid", "label", "labelMode", "mask", "maskChar", "maskInvalidMessage", "maskRules", "maxLength", "mode", "name", "placeholder", "readOnly", "rtlEnabled", "showClearButton", "showMaskMode", "spellcheck", "stylingMode", "tabIndex", "text", "useMaskedValue", "validationError", "validationErrors", "validationMessageMode", "validationStatus", "value", "valueChangeEvent", "visible", "width"], outputs: ["onChange", "onContentReady", "onCopy", "onCut", "onDisposing", "onEnterKey", "onFocusIn", "onFocusOut", "onInitialized", "onInput", "onKeyDown", "onKeyUp", "onOptionChanged", "onPaste", "onValueChanged", "accessKeyChange", "activeStateEnabledChange", "buttonsChange", "disabledChange", "elementAttrChange", "focusStateEnabledChange", "heightChange", "hintChange", "hoverStateEnabledChange", "inputAttrChange", "isValidChange", "labelChange", "labelModeChange", "maskChange", "maskCharChange", "maskInvalidMessageChange", "maskRulesChange", "maxLengthChange", "modeChange", "nameChange", "placeholderChange", "readOnlyChange", "rtlEnabledChange", "showClearButtonChange", "showMaskModeChange", "spellcheckChange", "stylingModeChange", "tabIndexChange", "textChange", "useMaskedValueChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationStatusChange", "valueChange", "valueChangeEventChange", "visibleChange", "widthChange", "onBlur"] }, { kind: "directive", type: i10.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i10.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i11.LoaderComponent, selector: "app-loader" }] });
212
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: GammaAdvanceFilterComponent, decorators: [{
213
- type: Component,
214
- args: [{ selector: 'app-gamma-advance-filter', template: "<app-loader *ngIf=\"isLoader\"></app-loader>\n\n\n<ng-container *ngIf=\"!isLoader\">\n <div class=\"flex flex-col border-b\">\n <div class=\"flex flex-row justify-end mb-4\" *ngIf=\"quickDateSelector\">\n <div class=\"w-1/4\">\n <dx-select-box [dataSource]=\"ranges\" valueExpr=\"value\" displayExpr=\"name\"\n (onValueChanged)=\"getQuickDateClick($event)\" placeholder=\"Quick Dates\">\n </dx-select-box>\n </div>\n </div>\n\n <ng-container *ngFor=\"let filter of kpiFilterData\">\n\n <div class=\"flex flex-row justify-between\">\n <ng-container *ngIf=\"filter.filterType == 'date'\">\n <ng-container *ngIf=\"filter.display\">\n <div class=\"mb-2\">{{getCapitalize(filter.label)}}</div>\n <div class=\"mb-2\">\n <div class=\"w-80\">\n <dx-date-box (onValueChanged)=\"startDateChange($event)\" displayFormat=\"yyyy-MM-dd\"\n type=\"{{filter.filterType}}\" [(ngModel)]=\"filter.filterDataSourceValue\">\n </dx-date-box>\n </div>\n </div>\n </ng-container>\n\n\n </ng-container>\n <ng-container *ngIf=\"filter.filterType == 'datetime'\">\n <div class=\"mb-2\">{{getCapitalize(filter.label)}}</div>\n <div class=\"mb-2\">\n <div class=\"w-80\">\n <dx-date-box (onValueChanged)=\"startDateChange($event)\" displayFormat=\"yyyy-MM-dd HH:mm:ss\"\n type=\"{{filter.filterType}}\" [(ngModel)]=\"filter.filterDataSourceValue\">\n </dx-date-box>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"filter.filterType !== 'date' && filter.filterType !== 'datetime'\">\n <div class=\"mb-2\">\n {{getCapitalize(filter.label)}}\n </div>\n <div class=\"mb-2\">\n <ng-container *ngIf=\"filter.filterType == 'multiple'\">\n <div class=\"w-80\">\n <dx-tag-box [dataSource]=\"filter.filterDataSource\" valueExpr=\"value\" displayExpr=\"name\"\n [searchEnabled]=\"true\" [multiline]=\"true\" [maxDisplayedTags]=\"6\"\n [(ngModel)]=\"filter.filterDataSourceValue\" [showSelectionControls]=\"true\"\n [searchEnabled]=\"true\">\n </dx-tag-box>\n </div>\n </ng-container>\n <ng-container *ngIf=\"filter.filterType == 'single'\">\n <div class=\"w-80\">\n <dx-select-box [items]=\"filter.filterDataSource\"\n [(ngModel)]=\"filter.filterDataSourceValue\" displayExpr=\"name\"\n valueExpr=\"value\"></dx-select-box>\n </div>\n </ng-container>\n <ng-container *ngIf=\"filter.filterType == 'content'\">\n <div class=\"w-80\">\n <dx-text-box [(ngModel)]=\"filter.filterDataSourceValue\"></dx-text-box>\n </div>\n </ng-container>\n </div>\n </ng-container>\n </div>\n </ng-container>\n </div>\n <div class=\"flex flex-row justify-end pl-3\">\n\n\n <button class=\"{{commonService.BtnLightWhite}} cursor-pointer mt-2\" (click)=\"reseteFilter()\">Reset</button>\n <button class=\"{{commonService.btnPrimaryBlue}} cursor-pointer mt-2\" (click)=\"searchByFilter()\"\n *ngIf=\"isButtonDesiable\">Search</button>\n </div>\n</ng-container>", styles: ["::ng-deep .dx-timeview{width:250px!important}::ng-deep .dx-timeview-field .dx-numberbox{width:70px!important}::ng-deep .dx-timeview-format12{width:70px!important}::ng-deep .dx-numberbox-spin-container{width:18px!important}::ng-deep .dx-texteditor{margin-bottom:10px}.floating-menu{position:absolute;display:none;background:white;border:1px solid #ccc;box-shadow:0 4px 8px #0000001a;z-index:1000;min-width:150px}.floating-menu.show{display:block;z-index:99999}.floating-menu ul{list-style:none;padding:0;margin:0}.floating-menu ul li{padding:10px;cursor:pointer}.floating-menu ul li:hover{background:#f0f0f0}\n"] }]
215
- }], ctorParameters: function () { return [{ type: i1.ApplicationContentService }, { type: i2.kpicommonService }, { type: i3.ToastrService }, { type: i4.CommonService }]; }, propDecorators: { kpiId: [{
216
- type: Input
217
- }], filterStartDate: [{
218
- type: Input
219
- }], filterEndDate: [{
220
- type: Input
221
- }], browser_api_config: [{
222
- type: Input
223
- }], isButtonDesiable: [{
224
- type: Input
225
- }], filterDataObject: [{
226
- type: Output
227
- }], menuIcon: [{
228
- type: ViewChild,
229
- args: ['menuIcon', { static: false }]
230
- }], filterOperatorData: [{
231
- type: Input,
232
- args: ['filterOperatorData']
233
- }], onDocumentClick: [{
234
- type: HostListener,
235
- args: ['document:click', ['$event']]
236
- }] } });
237
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2FtbWEtYWR2YW5jZS1maWx0ZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZ2FtbWEtYXBwLWNvbnRyb2xsZXIvc3JjL2xpYi9hcHBsaWNhdGlvbi1jb250cm9sbGVyL3NoYXJlZC9nYW1tYS1hZHZhbmNlLWZpbHRlci9nYW1tYS1hZHZhbmNlLWZpbHRlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9nYW1tYS1hcHAtY29udHJvbGxlci9zcmMvbGliL2FwcGxpY2F0aW9uLWNvbnRyb2xsZXIvc2hhcmVkL2dhbW1hLWFkdmFuY2UtZmlsdGVyL2dhbW1hLWFkdmFuY2UtZmlsdGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsS0FBSyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQWMsU0FBUyxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVwSCxPQUFPLE1BQU0sTUFBTSx1QkFBdUIsQ0FBQzs7Ozs7Ozs7Ozs7OztBQVUzQyxNQUFNLE9BQU8sMkJBQTJCO0lBZ0R0QyxZQUNVLE9BQWtDLEVBQ2xDLFVBQTRCLEVBQzVCLE1BQXFCLEVBQ3RCLGFBQTRCO1FBSDNCLFlBQU8sR0FBUCxPQUFPLENBQTJCO1FBQ2xDLGVBQVUsR0FBVixVQUFVLENBQWtCO1FBQzVCLFdBQU0sR0FBTixNQUFNLENBQWU7UUFDdEIsa0JBQWEsR0FBYixhQUFhLENBQWU7UUE5Q3BCLHFCQUFnQixHQUFzQixJQUFJLFlBQVksRUFBRSxDQUFDO1FBSTFFLHNCQUFpQixHQUFZLEtBQUssQ0FBQztRQU1uQyxhQUFRLEdBQUcsSUFBSSxDQUFDO1FBRWhCLFdBQU0sR0FBRztZQUNQLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFO1lBQzlDLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRTtZQUMxRixFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUU7WUFDNUYsRUFBRSxJQUFJLEVBQUUsY0FBYyxFQUFFLEtBQUssRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFO1lBQzlGLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUU7WUFDbkYsRUFBRSxJQUFJLEVBQUUsY0FBYyxFQUFFLEtBQUssRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRTtZQUMxRSxFQUFFLElBQUksRUFBRSxjQUFjLEVBQUUsS0FBSyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFO1lBQzFFLEVBQUUsSUFBSSxFQUFFLGNBQWMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsR0FB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aEQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFO2dCQUN2QyxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLEtBQUssYUFBYSxFQUFFO29CQUMvQyxJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQztpQkFDOUI7YUFFRjtTQUNGO0lBQ0gsQ0FBQzs7d0hBclBVLDJCQUEyQjs0R0FBM0IsMkJBQTJCLHlmQ1p4QywwbUlBOEVlOzJGRGxFRiwyQkFBMkI7a0JBTHZDLFNBQVM7K0JBQ0UsMEJBQTBCO3VNQUszQixLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ1csZ0JBQWdCO3NCQUFoQyxNQUFNO2dCQUNtQyxRQUFRO3NCQUFqRCxTQUFTO3VCQUFDLFVBQVUsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBd0JwQyxrQkFBa0I7c0JBRHJCLEtBQUs7dUJBQUMsb0JBQW9CO2dCQTRNM0IsZUFBZTtzQkFEZCxZQUFZO3VCQUFDLGdCQUFnQixFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIElucHV0LCBFdmVudEVtaXR0ZXIsIE91dHB1dCwgRWxlbWVudFJlZiwgVmlld0NoaWxkLCBIb3N0TGlzdGVuZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFRvYXN0clNlcnZpY2UgfSBmcm9tICduZ3gtdG9hc3RyJztcbmltcG9ydCBtb21lbnQgZnJvbSAnLi8uLi8uLi9tb21lbnQtaGVscGVyJztcbmltcG9ydCB7IGtwaWNvbW1vblNlcnZpY2UgfSBmcm9tICcuLi9rcGktY29tb24tc2VydmljZSc7XG5pbXBvcnQgeyBBcHBsaWNhdGlvbkNvbnRlbnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vYXBwbGljYXRpb24tY29udGVudC5zZXJ2aWNlJztcbmltcG9ydCB7IENvbW1vblNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb21tb24nO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtZ2FtbWEtYWR2YW5jZS1maWx0ZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vZ2FtbWEtYWR2YW5jZS1maWx0ZXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9nYW1tYS1hZHZhbmNlLWZpbHRlci5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIEdhbW1hQWR2YW5jZUZpbHRlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBJbnB1dCgpIGtwaUlkOiBhbnk7XG4gIEBJbnB1dCgpIGZpbHRlclN0YXJ0RGF0ZTogYW55O1xuICBASW5wdXQoKSBmaWx0ZXJFbmREYXRlOiBhbnk7XG4gIEBJbnB1dCgpIGJyb3dzZXJfYXBpX2NvbmZpZzogYW55O1xuICBASW5wdXQoKSBpc0J1dHRvbkRlc2lhYmxlOiBib29sZWFuO1xuICBAT3V0cHV0KCkgcHVibGljIGZpbHRlckRhdGFPYmplY3Q6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAVmlld0NoaWxkKCdtZW51SWNvbicsIHsgc3RhdGljOiBmYWxzZSB9KSBtZW51SWNvbjogRWxlbWVudFJlZjtcblxuICBpc0RhdGVzRHJvcERvd246IGJvb2xlYW47XG4gIHF1aWNrRGF0ZVNlbGVjdG9yOiBib29sZWFuID0gZmFsc2U7XG4gIGtwaUZpbHRlckRhdGE6IGFueTtcbiAgLy8gc3RhcnRfZGF0ZSA9IG1vbWVudCgpLnN1YnRyYWN0KDUsICdkYXlzJykuZm9ybWF0KCdZWVlZLU1NLUREJyk7XG4gIC8vIGVuZF9kYXRlID0gbW9tZW50KCkuZm9ybWF0KCdZWVlZLU1NLUREJyk7XG4gIGRlZmF1bHRTdGFydERhdGU6IGFueTtcbiAgZGVmYXVsdEVuZERhdGU6IGFueTtcbiAgaXNMb2FkZXIgPSB0cnVlO1xuXG4gIHJhbmdlcyA9IFtcbiAgICB7IG5hbWU6IFwiVG9kYXlcIiwgdmFsdWU6IFttb21lbnQoKSwgbW9tZW50KCldIH0sXG4gICAgeyBuYW1lOiBcIlllc3RlcmRheVwiLCB2YWx1ZTogW21vbWVudCgpLnN1YnRyYWN0KDEsICdkYXlzJyksIG1vbWVudCgpLnN1YnRyYWN0KDEsICdkYXlzJyldIH0sXG4gICAgeyBuYW1lOiBcIkxhc3QgNyBEYXlzXCIsIHZhbHVlOiBbbW9tZW50KCkuc3VidHJhY3QoNywgJ2RheXMnKSwgbW9tZW50KCkuc3VidHJhY3QoMSwgJ2RheXMnKV0gfSxcbiAgICB7IG5hbWU6IFwiTGFzdCAxNSBEYXlzXCIsIHZhbHVlOiBbbW9tZW50KCkuc3VidHJhY3QoMTUsICdkYXlzJyksIG1vbWVudCgpLnN1YnRyYWN0KDEsICdkYXlzJyldIH0sXG4gICAgeyBuYW1lOiAnVGhpcyBNb250aCcsIHZhbHVlOiBbbW9tZW50KCkuc3RhcnRPZignbW9udGgnKSwgbW9tZW50KCkuZW5kT2YoJ21vbnRoJyldIH0sXG4gICAgeyBuYW1lOiAnTGFzdCAxIE1vbnRoJywgdmFsdWU6IFttb21lbnQoKS5zdWJ0cmFjdCgzMCwgJ2RheXMnKSwgbW9tZW50KCldIH0sXG4gICAgeyBuYW1lOiAnTGFzdCAzIE1vbnRoJywgdmFsdWU6IFttb21lbnQoKS5zdWJ0cmFjdCg5MSwgJ2RheXMnKSwgbW9tZW50KCldIH0sXG4gICAgeyBuYW1lOiAnTGFzdCA2IE1vbnRoJywgdmFsdWU6IFttb21lbnQoKS5zdWJ0cmFjdCgxODIsICdkYXlzJyksIG1vbWVudCgpXSB9LFxuICAgIHsgbmFtZTogJ0xhc3QgMSBZZWFyJywgdmFsdWU6IFttb21lbnQoKS5zdWJ0cmFjdCgzNjUsICdkYXlzJyksIG1vbWVudCgpXSB9XG4gIF1cblxuICBASW5wdXQoJ2ZpbHRlck9wZXJhdG9yRGF0YScpXG4gIHNldCBmaWx0ZXJPcGVyYXRvckRhdGEodmFsdWUpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2Uge1xuXG4gICAgICB0aGlzLmtwaUZpbHRlckRhdGEgPSBbXTtcbiAgICAgIHRoaXMua3BpRmlsdGVyRGF0YSA9IHZhbHVlO1xuICAgICAgdGhpcy5rcGlGaWx0ZXJEYXRhLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgIGlmIChpdGVtLmhhc093blByb3BlcnR5KCdtb21lbnRGb3JtYXRlJykpIHtcbiAgICAgICAgICBpdGVtLm1vbWVudEZvcm1hdCA9IGl0ZW0ubW9tZW50Rm9ybWF0ZTtcbiAgICAgICAgICBkZWxldGUgaXRlbS5tb21lbnRGb3JtYXRlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHRoaXMucHJvY2Vzc0ZpbHRlckZvckRhdGEoKTtcbiAgICB9XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHNlcnZpY2U6IEFwcGxpY2F0aW9uQ29udGVudFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBrcGlTZXJ2aWNlOiBrcGljb21tb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgdG9hc3RyOiBUb2FzdHJTZXJ2aWNlLFxuICAgIHB1YmxpYyBjb21tb25TZXJ2aWNlOiBDb21tb25TZXJ2aWNlXG4gICkgeyB9XG5cblxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuZGVmYXVsdEVuZERhdGUgPSBtb21lbnQoKS5zdWJ0cmFjdCgnMScsICdkYXlzJykuZm9ybWF0KCdZWVlZLU1NLUREJyk7XG4gICAgdGhpcy5kZWZhdWx0U3RhcnREYXRlID0gbW9tZW50KHRoaXMuZGVmYXVsdEVuZERhdGUpLnN1YnRyYWN0KCc1JywgJ2RheXMnKS5mb3JtYXQoJ1lZWVktTU0tREQnKTtcblxuXG4gIH1cblxuXG4gIGFzeW5jIHByb2Nlc3NGaWx0ZXJGb3JEYXRhKCkge1xuICAgIGZvciAoY29uc3QgZmlsdGVyIG9mIHRoaXMua3BpRmlsdGVyRGF0YSkge1xuXG4gICAgICB0aGlzLmlzTG9hZGVyID0gdHJ1ZTtcbiAgICAgIGNvbnN0IHN0YXJ0RGF0ZUZpbHRlciA9IHRoaXMua3BpRmlsdGVyRGF0YS5maW5kKGZpbHRlciA9PiBmaWx0ZXIuYXBpTmFtZSA9PT0gJ3N0YXJ0RGF0ZScgJiYgKGZpbHRlci5kaXNwbGF5ICE9PSB1bmRlZmluZWQgPyBmaWx0ZXIuZGlzcGxheSA6IHRydWUpKTtcbiAgICAgIGNvbnN0IGVuZERhdGVGaWx0ZXIgPSB0aGlzLmtwaUZpbHRlckRhdGEuZmluZChmaWx0ZXIgPT4gZmlsdGVyLmFwaU5hbWUgPT09ICdlbmREYXRlJyAmJiAoZmlsdGVyLmRpc3BsYXkgIT09IHVuZGVmaW5lZCA/IGZpbHRlci5kaXNwbGF5IDogdHJ1ZSkpO1xuICAgICAgaWYgKHN0YXJ0RGF0ZUZpbHRlciAmJiBlbmREYXRlRmlsdGVyKSB7XG4gICAgICAgIHRoaXMucXVpY2tEYXRlU2VsZWN0b3IgPSB0cnVlO1xuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKGZpbHRlci5hcGlOYW1lICE9PSAnc3RhcnREYXRlJyAmJiBmaWx0ZXIuYXBpTmFtZSAhPT0gJ2VuZERhdGUnKSB7XG4gICAgICAgICAgaWYgKGZpbHRlci5hcGlOYW1lLmluY2x1ZGVzKCcvcmVmZXJlbmNlLycpKSB7XG4gICAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgdGhpcy5zZXJ2aWNlLmdldEZpbHRlckRhdGFCeURyaWxsRG93bihmaWx0ZXIuYXBpTmFtZSkudG9Qcm9taXNlKCk7XG5cbiAgICAgICAgICAgIGZpbHRlclsnZmlsdGVyRGF0YVNvdXJjZSddID0gZGF0YTtcbiAgICAgICAgICAgIGlmIChmaWx0ZXIuZGVmYXVsdEZpbHRlclR5cGUgPT0gXCJkeW5hbWljXCIgJiYgZmlsdGVyLmRlZmF1bHRGaWx0ZXJWYWx1ZSAhPT0gXCJcIikge1xuICAgICAgICAgICAgICBmaWx0ZXJbJ2ZpbHRlckRhdGFTb3VyY2VWYWx1ZSddID0gdGhpcy5wYXJzZUNvbnRlbnRWYWx1ZShmaWx0ZXIuZGVmYXVsdEZpbHRlclZhbHVlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGZpbHRlclsnZmlsdGVyRGF0YVNvdXJjZVZhbHVlJ10gPSBcIlwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmaWx0ZXJbJ2ZpbHRlckRhdGFTb3VyY2UnXSA9IFtdO1xuICAgICAgICAgIH1cblxuICAgICAgICB9IGVsc2UgaWYgKGZpbHRlci5maWx0ZXJUeXBlID09ICdkYXRlJyB8fCBmaWx0ZXIuZmlsdGVyVHlwZSA9PSAnZGF0ZXRpbWUnKSB7XG4gICAgICAgICAgaWYgKGZpbHRlci5kaXNwbGF5ID09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZmlsdGVyLmRpc3BsYXkgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZmlsdGVyLmRlZmF1bHRGaWx0ZXJUeXBlID09IFwiZHluYW1pY1wiICYmIGZpbHRlci5tb21lbnRGdW5jdGlvbiAhPT0gXCJcIiAmJiBmaWx0ZXIuZGVmYXVsdEZpbHRlclZhbHVlICE9PSBcIlwiICYmIGZpbHRlci5tb21lbnRGb3JtYXQgIT09IFwiXCIpIHtcbiAgICAgICAgICAgIGlmIChmaWx0ZXIuYXBpTmFtZSA9PSBcInN0YXJ0RGF0ZVwiKSB7XG4gICAgICAgICAgICAgIGxldCBbY291bnQsIHVuaXRdID0gZmlsdGVyLmRlZmF1bHRGaWx0ZXJWYWx1ZS5zcGxpdCgnLCcpO1xuICAgICAgICAgICAgICBmaWx0ZXJbJ2ZpbHRlckRhdGFTb3VyY2VWYWx1ZSddID0gbW9tZW50KClbZmlsdGVyLm1vbWVudEZ1bmN0aW9uXShwYXJzZUludChjb3VudCksIHVuaXQpLmZvcm1hdChmaWx0ZXIubW9tZW50Rm9ybWF0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChmaWx0ZXIuYXBpTmFtZSA9PSBcImVuZERhdGVcIikge1xuICAgICAgICAgICAgICBsZXQgW2NvdW50LCB1bml0XSA9IGZpbHRlci5kZWZhdWx0RmlsdGVyVmFsdWUuc3BsaXQoJywnKTtcbiAgICAgICAgICAgICAgZmlsdGVyWydmaWx0ZXJEYXRhU291cmNlVmFsdWUnXSA9IG1vbWVudCgpW2ZpbHRlci5tb21lbnRGdW5jdGlvbl0ocGFyc2VJbnQoY291bnQpLCB1bml0KS5mb3JtYXQoZmlsdGVyLm1vbWVudEZvcm1hdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmKChmaWx0ZXIuZGVmYXVsdEZpbHRlclR5cGUgPT0gXCJzdGF0aWNcIiAmJiBmaWx0ZXIuZGVmYXVsdEZpbHRlclZhbHVlICE9PSBcIlwiKSkge1xuICAgICAgICAgICAgaWYgKGZpbHRlci5hcGlOYW1lID09IFwic3RhcnREYXRlXCIpIHtcbiAgICAgICAgICAgICAgZmlsdGVyWydmaWx0ZXJEYXRhU291cmNlVmFsdWUnXSA9IGZpbHRlci5kZWZhdWx0RmlsdGVyVmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZmlsdGVyLmFwaU5hbWUgPT0gXCJlbmREYXRlXCIpIHtcbiAgICAgICAgICAgICAgZmlsdGVyWydmaWx0ZXJEYXRhU291cmNlVmFsdWUnXSA9IGZpbHRlci5kZWZhdWx0RmlsdGVyVmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHRoaXMudG9hc3RyLmVycm9yKFwiVW5leHBlY3RlZCBTZXJ2ZXIgRXhjZXB0aW9uLiBQbGVhc2UgY29udGFjdCBTeXN0ZW0gQWRtaW4uXCIsIGZpbHRlci50eXBlKVxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgdGhpcy5pc0xvYWRlciA9IGZhbHNlO1xuICAgICAgICBjb25zb2xlLmxvZyh0aGlzLmtwaUZpbHRlckRhdGEpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHBhcnNlQ29udGVudFZhbHVlKGNvbnRlbnR2YWx1ZSkge1xuICAgIHJldHVybiBjb250ZW50dmFsdWUuc3BsaXQoJywnKS5tYXAoaXRlbSA9PiBpdGVtLnRyaW0oKSk7XG4gIH1cblxuXG4gIGdldElzTXNpc2RuKGNvbnRleHQpIHtcbiAgICBsZXQga2V5ID0gY29udGV4dC50b0xvd2VyQ2FzZSgpXG4gICAgaWYgKGtleS5pbmNsdWRlcygnbXNpc2RuJykpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgc3RhcnREYXRlQ2hhbmdlKGUpIHtcbiAgICB0aGlzLmRlZmF1bHRTdGFydERhdGUgPSBlLnZhbHVlO1xuICB9XG4gIGVuZERhdGVDaGFuZ2UoZSkge1xuICAgIHRoaXMuZGVmYXVsdEVuZERhdGUgPSBlLnZhbHVlO1xuICB9XG5cbiAgc2VhcmNoQnlGaWx0ZXIoKSB7XG5cbiAgICBsZXQgYXBpSnNvbk9iamVjdDogYW55ID0ge307XG4gICAgbGV0IG9wZXJhdGlvbkZpbHRlcjogYW55ID0ge307XG4gICAgdGhpcy5rcGlGaWx0ZXJEYXRhLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICBpZiAoZWxlbWVudC5maWx0ZXJUeXBlID09ICdkYXRlJyB8fCBlbGVtZW50LmZpbHRlclR5cGUgPT0gJ2RhdGV0aW1lJykge1xuICAgICAgICBhcGlKc29uT2JqZWN0W2VsZW1lbnQuYXBpTmFtZV0gPSBtb21lbnQoZWxlbWVudC5maWx0ZXJEYXRhU291cmNlVmFsdWUpLmZvcm1hdChlbGVtZW50Lm1vbWVudEZvcm1hdCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgKHR5cGVvZiBlbGVtZW50LmZpbHRlckRhdGFTb3VyY2VWYWx1ZSA9PT0gXCJzdHJpbmdcIiAmJiBlbGVtZW50LmZpbHRlckRhdGFTb3VyY2VWYWx1ZSAhPT0gXCJcIikgfHxcbiAgICAgICAgICAoQXJyYXkuaXNBcnJheShlbGVtZW50LmZpbHRlckRhdGFTb3VyY2VWYWx1ZSkgJiYgZWxlbWVudC5maWx0ZXJEYXRhU291cmNlVmFsdWUubGVuZ3RoID4gMClcbiAgICAgICAgKSB7XG4gICAgICAgICAgaWYgKGVsZW1lbnQub3BlcmF0b3JOYW1lICE9PSBcIlwiKSB7XG4gICAgICAgICAgICBpZiAoZWxlbWVudC5maWx0ZXJUeXBlID09IFwiY29udGVudFwiKSB7XG4gICAgICAgICAgICAgIG9wZXJhdGlvbkZpbHRlcltlbGVtZW50Lm9wZXJhdG9yTmFtZV0gPSBlbGVtZW50LmZpbHRlckRhdGFTb3VyY2VWYWx1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIG9wZXJhdGlvbkZpbHRlcltlbGVtZW50Lm9wZXJhdG9yTmFtZV0gPSBBcnJheS5pc0FycmF5KGVsZW1lbnQuZmlsdGVyRGF0YVNvdXJjZVZhbHVlKSA/IGVsZW1lbnQuZmlsdGVyRGF0YVNvdXJjZVZhbHVlIDogW2VsZW1lbnQuZmlsdGVyRGF0YVNvdXJjZVZhbHVlXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYXBpSnNvbk9iamVjdFtlbGVtZW50LmFwaU5hbWVdID0gZWxlbWVudC5maWx0ZXJEYXRhU291cmNlVmFsdWU7XG5cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgIH0pO1xuXG4gICAgYXBpSnNvbk9iamVjdFsnb3BlcmF0aW9uRmlsdGVyJ10gPSBvcGVyYXRpb25GaWx0ZXI7XG4gICAgLy8gbGV0IGZpbHRlcl9jb25maWcgPSB7XG4gICAgLy8gICBzdGFydERhdGU6IHRoaXMuZGVmYXVsdFN0YXJ0RGF0ZSxcbiAgICAvLyAgIGVuZERhdGU6IHRoaXMuZGVmYXVsdEVuZERhdGUsXG4gICAgLy8gICBvcGVyYXRpb25GaWx0ZXI6IGFwaUpzb25PYmplY3RcbiAgICAvLyB9XG4gICAgLy8gdGhpcy5pc0J1dHRvbkRlc2lhYmxlID0gZmFsc2U7XG5cbiAgICBjb25zb2xlLmxvZyhhcGlKc29uT2JqZWN0KTtcbiAgICB0aGlzLmZpbHRlckRhdGFPYmplY3QuZW1pdChhcGlKc29uT2JqZWN0KTtcblxuICB9XG5cblxuXG4gIHJlc2V0ZUZpbHRlcigpIHtcbiAgICB0aGlzLmRlZmF1bHRFbmREYXRlID0gdGhpcy5maWx0ZXJFbmREYXRlO1xuICAgIHRoaXMuZGVmYXVsdFN0YXJ0RGF0ZSA9IHRoaXMuZmlsdGVyU3RhcnREYXRlO1xuICAgIHRoaXMua3BpRmlsdGVyRGF0YS5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgZWxlbWVudFsnZmlsdGVyRGF0YVNvdXJjZVZhbHVlJ10gPSBcIlwiXG4gICAgfSk7XG4gIH1cblxuXG4gIGdldERyaWxkb3duRGltZW50aW9ucyhhcGlOYW1lKSB7XG4gICAgbGV0IGRpbWVudGlvbnMgPSB7XG4gICAgICBcIi9hcGkvdjEvcmVmZXJlbmNlL2dldFNlcnZlZFR5cGVzXCI6IFwic3J2VHlwZVwiLFxuICAgICAgXCIvYXBpL3YxL3JlZmVyZW5jZS9nZXRPdXRSb2FtaW5nU2VydmVkVHlwZXNcIjogXCJzcnZUeXBlXCIsXG4gICAgICBcIi9hcGkvdjEvcmVmZXJlbmNlL2dldE1TQ0RpcmVjdGlvbnNcIjogXCJkaXJlY3Rpb25cIixcbiAgICAgIFwiL2FwaS92MS9yZWZlcmVuY2UvZ2V0Q0JTVm9pY2VEaXJlY3Rpb25zXCI6IFwiZGlyZWN0aW9uXCIsXG4gICAgICBcIi9hcGkvdjEvcmVmZXJlbmNlL2dldENCU21zRGlyZWN0aW9uc1wiOiBcImRpcmVjdGlvblwiLFxuICAgICAgXCIvYXBpL3YxL3JlZmVyZW5jZS9nZXRDQlNHcHJzRGlyZWN0aW9uc1wiOiBcImRpcmVjdGlvblwiLFxuICAgICAgXCIvYXBpL3YxL3JlZmVyZW5jZS9nZXROZXR3b3JrVHlwZUtleXNcIjogXCJud19jYWxsX3R5cGVcIixcbiAgICAgIFwiL2FwaS92MS9yZWZlcmVuY2UvZ2V0R0dTTlJhdGluZ0dyb3Vwc1wiOiBcInJhdGluZ0dyb3VwXCIsXG4gICAgICBcIi9hcGkvdjEvcmVmZXJlbmNlL2dldEdHU05BY2Nlc3NQb2ludE5hbWVzXCI6IFwiYXBuXCIsXG4gICAgICBcIi9hcGkvdjEvcmVmZXJlbmNlL2dldE1haW5BY2NvdW50QmFsYW5jZVR5cGVzXCI6IFwiYmFsYW5jZVR5cGVJZFwiLFxuICAgICAgXCIvYXBpL3YxL3JlZmVyZW5jZS9nZXREaWFsRGlnaXRDb3VudHJpZXNcIjogXCJvdGhlcl9wYXJ0eV9pc29cIlxuICAgIH1cbiAgICByZXR1cm4gZGltZW50aW9uc1thcGlOYW1lXTtcbiAgfVxuICBnZXRDYXBpdGFsaXplKGl0ZW06IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmNvbW1vblNlcnZpY2UuY29udmVydFRvU3BhY2VTZXBhcmF0ZWRDYXBpdGFsaXplZChpdGVtKVxuICB9XG5cblxuXG4gIGdldFF1aWNrRGF0ZUNsaWNrKGl0ZW0pIHtcbiAgICBsZXQgc3RhcnREYXRlID0gaXRlbS52YWx1ZVswXTtcbiAgICBsZXQgZW5kRGF0ZSA9IGl0ZW0udmFsdWVbMV07XG5cbiAgICBmb3IgKGNvbnN0IGZpbHRlciBvZiB0aGlzLmtwaUZpbHRlckRhdGEpIHtcbiAgICAgIGlmIChmaWx0ZXIuZmlsdGVyVHlwZSA9PSAnZGF0ZScgfHwgZmlsdGVyLmZpbHRlclR5cGUgPT0gJ2RhdGV0aW1lJykge1xuICAgICAgICBpZiAoZmlsdGVyLmFwaU5hbWUgPT0gXCJzdGFydERhdGVcIikge1xuICAgICAgICAgIGZpbHRlclsnZmlsdGVyRGF0YVNvdXJjZVZhbHVlJ10gPSBtb21lbnQoc3RhcnREYXRlKS5mb3JtYXQoZmlsdGVyLm1vbWVudEZvcm1hdCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZpbHRlci5hcGlOYW1lID09IFwiZW5kRGF0ZVwiKSB7XG4gICAgICAgICAgZmlsdGVyWydmaWx0ZXJEYXRhU291cmNlVmFsdWUnXSA9IG1vbWVudChlbmREYXRlKS5mb3JtYXQoZmlsdGVyLm1vbWVudEZvcm1hdCk7XG4gICAgICAgIH1cblxuICAgICAgfVxuICAgIH1cblxuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6Y2xpY2snLCBbJyRldmVudCddKVxuICBvbkRvY3VtZW50Q2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpIHtcblxuICAgIGlmICh0aGlzLmlzRGF0ZXNEcm9wRG93bikge1xuICAgICAgY29uc3QgbWVudUVsZW1lbnQgPSB0aGlzLm1lbnVJY29uLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICBpZiAoIW1lbnVFbGVtZW50LmNvbnRhaW5zKGV2ZW50LnRhcmdldCkpIHtcbiAgICAgICAgaWYgKGV2ZW50LnRhcmdldFsnaW5uZXJUZXh0J10gIT09IFwiUXVpY2sgRGF0ZXNcIikge1xuICAgICAgICAgIHRoaXMuaXNEYXRlc0Ryb3BEb3duID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgfVxuICAgIH1cbiAgfVxuXG5cbn1cbiIsIjxhcHAtbG9hZGVyICpuZ0lmPVwiaXNMb2FkZXJcIj48L2FwcC1sb2FkZXI+XG5cblxuPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc0xvYWRlclwiPlxuICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGJvcmRlci1iXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGp1c3RpZnktZW5kIG1iLTRcIiAqbmdJZj1cInF1aWNrRGF0ZVNlbGVjdG9yXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy0xLzRcIj5cbiAgICAgICAgICAgICAgICA8ZHgtc2VsZWN0LWJveCBbZGF0YVNvdXJjZV09XCJyYW5nZXNcIiB2YWx1ZUV4cHI9XCJ2YWx1ZVwiIGRpc3BsYXlFeHByPVwibmFtZVwiXG4gICAgICAgICAgICAgICAgICAgIChvblZhbHVlQ2hhbmdlZCk9XCJnZXRRdWlja0RhdGVDbGljaygkZXZlbnQpXCIgcGxhY2Vob2xkZXI9XCJRdWljayBEYXRlc1wiPlxuICAgICAgICAgICAgICAgIDwvZHgtc2VsZWN0LWJveD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBmaWx0ZXIgb2Yga3BpRmlsdGVyRGF0YVwiPlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBqdXN0aWZ5LWJldHdlZW5cIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZmlsdGVyLmZpbHRlclR5cGUgPT0gJ2RhdGUnXCI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJmaWx0ZXIuZGlzcGxheVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTJcIj57e2dldENhcGl0YWxpemUoZmlsdGVyLmxhYmVsKX19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LTgwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC1kYXRlLWJveCAob25WYWx1ZUNoYW5nZWQpPVwic3RhcnREYXRlQ2hhbmdlKCRldmVudClcIiBkaXNwbGF5Rm9ybWF0PVwieXl5eS1NTS1kZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwie3tmaWx0ZXIuZmlsdGVyVHlwZX19XCIgWyhuZ01vZGVsKV09XCJmaWx0ZXIuZmlsdGVyRGF0YVNvdXJjZVZhbHVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZHgtZGF0ZS1ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cblxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJmaWx0ZXIuZmlsdGVyVHlwZSA9PSAnZGF0ZXRpbWUnXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0yXCI+e3tnZXRDYXBpdGFsaXplKGZpbHRlci5sYWJlbCl9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctODBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtZGF0ZS1ib3ggKG9uVmFsdWVDaGFuZ2VkKT1cInN0YXJ0RGF0ZUNoYW5nZSgkZXZlbnQpXCIgZGlzcGxheUZvcm1hdD1cInl5eXktTU0tZGQgSEg6bW06c3NcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwie3tmaWx0ZXIuZmlsdGVyVHlwZX19XCIgWyhuZ01vZGVsKV09XCJmaWx0ZXIuZmlsdGVyRGF0YVNvdXJjZVZhbHVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9keC1kYXRlLWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZmlsdGVyLmZpbHRlclR5cGUgIT09ICdkYXRlJyAmJiBmaWx0ZXIuZmlsdGVyVHlwZSAhPT0gJ2RhdGV0aW1lJ1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3tnZXRDYXBpdGFsaXplKGZpbHRlci5sYWJlbCl9fVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJmaWx0ZXIuZmlsdGVyVHlwZSA9PSAnbXVsdGlwbGUnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctODBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXRhZy1ib3ggW2RhdGFTb3VyY2VdPVwiZmlsdGVyLmZpbHRlckRhdGFTb3VyY2VcIiB2YWx1ZUV4cHI9XCJ2YWx1ZVwiIGRpc3BsYXlFeHByPVwibmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2VhcmNoRW5hYmxlZF09XCJ0cnVlXCIgW211bHRpbGluZV09XCJ0cnVlXCIgW21heERpc3BsYXllZFRhZ3NdPVwiNlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImZpbHRlci5maWx0ZXJEYXRhU291cmNlVmFsdWVcIiBbc2hvd1NlbGVjdGlvbkNvbnRyb2xzXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NlYXJjaEVuYWJsZWRdPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2R4LXRhZy1ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJmaWx0ZXIuZmlsdGVyVHlwZSA9PSAnc2luZ2xlJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LTgwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC1zZWxlY3QtYm94IFtpdGVtc109XCJmaWx0ZXIuZmlsdGVyRGF0YVNvdXJjZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImZpbHRlci5maWx0ZXJEYXRhU291cmNlVmFsdWVcIiBkaXNwbGF5RXhwcj1cIm5hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVFeHByPVwidmFsdWVcIj48L2R4LXNlbGVjdC1ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJmaWx0ZXIuZmlsdGVyVHlwZSA9PSAnY29udGVudCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy04MFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3ggWyhuZ01vZGVsKV09XCJmaWx0ZXIuZmlsdGVyRGF0YVNvdXJjZVZhbHVlXCI+PC9keC10ZXh0LWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBqdXN0aWZ5LWVuZCBwbC0zXCI+XG5cblxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwie3tjb21tb25TZXJ2aWNlLkJ0bkxpZ2h0V2hpdGV9fSBjdXJzb3ItcG9pbnRlciBtdC0yXCIgKGNsaWNrKT1cInJlc2V0ZUZpbHRlcigpXCI+UmVzZXQ8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5QcmltYXJ5Qmx1ZX19IGN1cnNvci1wb2ludGVyIG10LTJcIiAoY2xpY2spPVwic2VhcmNoQnlGaWx0ZXIoKVwiXG4gICAgICAgICAgICAqbmdJZj1cImlzQnV0dG9uRGVzaWFibGVcIj5TZWFyY2g8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbjwvbmctY29udGFpbmVyPiJdfQ==
@@ -1,142 +0,0 @@
1
- import { Component, Input } from "@angular/core";
2
- import * as i0 from "@angular/core";
3
- import * as i1 from "@angular/common";
4
- import * as i2 from "@angular/router";
5
- import * as i3 from "@angular/common/http";
6
- import * as i4 from "../../common";
7
- export class BreadCrumbsComponent {
8
- constructor(location, router, http, activatedRoute, commonService) {
9
- this.location = location;
10
- this.router = router;
11
- this.http = http;
12
- this.activatedRoute = activatedRoute;
13
- this.commonService = commonService;
14
- this.kpiListData = [];
15
- this.kpi_structures = {};
16
- this.kpi_names = {};
17
- this.data = [];
18
- }
19
- set kpi_data_container(value) {
20
- if (value === undefined || value.length === 0) {
21
- this.isBreadCrumbs = false;
22
- return;
23
- }
24
- else {
25
- let relativePath = 'rakpiBrowser';
26
- this.getKpiName(value, relativePath);
27
- setTimeout(() => {
28
- this.loadBreadCrumbs();
29
- }, 500);
30
- this.isBreadCrumbs = true;
31
- }
32
- }
33
- ngOnInit() {
34
- }
35
- getKpiName(data, relativePath) {
36
- data.forEach(result => {
37
- const item = {};
38
- let obj;
39
- item['relativePath'] = relativePath;
40
- if (result['nodes'] !== undefined) {
41
- let childRelativePath = relativePath + '/' + result['name'];
42
- this.getKpiName(result['nodes'], childRelativePath);
43
- }
44
- if (result['id']) {
45
- obj = {
46
- 'name': result['name'],
47
- 'desc': result['desc'],
48
- 'relativePath': result['relativePath'],
49
- 'kpiId': result['id'],
50
- 'isBookmarked': result['isBookmarked'],
51
- };
52
- }
53
- item['externalLink'] = relativePath + '/' + result['name'];
54
- item['tid'] = result['tid'];
55
- item['id'] = result['id'];
56
- item['name'] = result['name'];
57
- this.kpiListData.push(item);
58
- });
59
- }
60
- getBreadCrumbsData(data) {
61
- let structures = {};
62
- data.forEach(result => {
63
- const item = {};
64
- item["relativePath"] = result.relativePath;
65
- item["name"] = result["name"];
66
- item["tid"] = result["tid"].trim();
67
- if (result["nodes"] !== undefined) {
68
- item["nodes"] = this.getBreadCrumbsData(result["nodes"]);
69
- }
70
- this.kpi_names[result["id"]] = item["tid"];
71
- structures[result["tid"]] = item;
72
- this.kpi_structures[result["tid"]] = item;
73
- });
74
- return structures;
75
- }
76
- loadBreadCrumbs() {
77
- let kpiRoot = this.kpiBrowserName ? "fmskpi" : "rakpi";
78
- let kpiContainer;
79
- if (this.kpiListData.length > 0 || this.kpiListData != undefined) {
80
- kpiContainer = this.getBreadCrumbsData(this.kpiListData);
81
- }
82
- else {
83
- kpiContainer = this.getBreadCrumbsData(this.commonService.allKpibrowserDetailContainer);
84
- }
85
- const kpiId = this.activatedRoute.snapshot.queryParams['id'];
86
- const kpiTid = this.kpi_names[kpiId];
87
- const props = this.kpi_structures[kpiTid];
88
- const propsList = props["relativePath"] + "/" + props["name"];
89
- this.breadcrumbList = propsList.split("/");
90
- if (this.location.path() !== "") {
91
- let link = {};
92
- this.breadcrumbLinksList = [];
93
- for (let i = 0; i < this.breadcrumbList.length; i++) {
94
- if (i == 0) {
95
- if (!this.kpiBrowserName) {
96
- link = {
97
- name: this.breadcrumbList[i],
98
- url: "/apps/raKpi/rakpiBrowser",
99
- kpiName: "RA KPI Browser",
100
- };
101
- }
102
- else {
103
- link = {
104
- name: this.breadcrumbList[i],
105
- url: "/apps/fmsKpi",
106
- kpiName: "FMS KPI Browser",
107
- };
108
- }
109
- }
110
- else {
111
- let returnId = "";
112
- for (let j = 0; j <= i; j++) {
113
- if (j != 0) {
114
- returnId += "/";
115
- }
116
- returnId += this.breadcrumbList[j];
117
- }
118
- link = {
119
- name: this.breadcrumbList[i],
120
- url: this.breadcrumbLinksList[i - 1]["url"],
121
- id: this.breadcrumbList[i],
122
- kpiName: this.breadcrumbList[i],
123
- returnId: returnId,
124
- };
125
- this.commonService.global_kpi_name = this.breadcrumbList[i];
126
- }
127
- this.breadcrumbLinksList.push(link);
128
- }
129
- this.count = this.breadcrumbList.length;
130
- }
131
- }
132
- }
133
- BreadCrumbsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: BreadCrumbsComponent, deps: [{ token: i1.Location }, { token: i2.Router }, { token: i3.HttpClient }, { token: i2.ActivatedRoute }, { token: i4.CommonService }], target: i0.ɵɵFactoryTarget.Component });
134
- BreadCrumbsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: BreadCrumbsComponent, selector: "gamma-bread-crumbs", inputs: { kpi_data_container: "kpi_data_container" }, ngImport: i0, template: "<nav class=\"flex mt-1\" aria-label=\"Breadcrumb\" *ngIf=\"isBreadCrumbs\">\n <ol class=\"inline-flex items-center space-x-1 md:space-x-3\">\n <li class=\"inline-flex items-center cursor-pointer\" *ngFor=\"let breadcrumbLabel of breadcrumbLinksList;\">\n <a [routerLink]=\"breadcrumbLabel.url\" [queryParams]=\"{returnId: breadcrumbLabel.returnId }\"\n class=\"inline-flex items-center text-sm font-medium text-gray-700 hover:text-gray-900 dark:text-gray-400 dark:hover:text-white\">\n <svg class=\"w-6 h-6 text-gray-400\" fill=\"currentColor\" viewBox=\"0 0 20 20\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <path fill-rule=\"evenodd\"\n d=\"M7.293 14.707a1 1 0 010-1.414L10.586 10 7.293 6.707a1 1 0 011.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z\"\n clip-rule=\"evenodd\"></path>\n </svg>\n {{breadcrumbLabel.kpiName}}\n </a>\n </li>\n </ol>\n</nav>", styles: [".breadcrumb{padding:0!important;margin-bottom:0!important;font-weight:400;font-size:12px}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.RouterLinkWithHref, selector: "a[routerLink],area[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "preserveFragment", "skipLocationChange", "replaceUrl", "state", "relativeTo", "routerLink"] }] });
135
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: BreadCrumbsComponent, decorators: [{
136
- type: Component,
137
- args: [{ selector: "gamma-bread-crumbs", template: "<nav class=\"flex mt-1\" aria-label=\"Breadcrumb\" *ngIf=\"isBreadCrumbs\">\n <ol class=\"inline-flex items-center space-x-1 md:space-x-3\">\n <li class=\"inline-flex items-center cursor-pointer\" *ngFor=\"let breadcrumbLabel of breadcrumbLinksList;\">\n <a [routerLink]=\"breadcrumbLabel.url\" [queryParams]=\"{returnId: breadcrumbLabel.returnId }\"\n class=\"inline-flex items-center text-sm font-medium text-gray-700 hover:text-gray-900 dark:text-gray-400 dark:hover:text-white\">\n <svg class=\"w-6 h-6 text-gray-400\" fill=\"currentColor\" viewBox=\"0 0 20 20\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <path fill-rule=\"evenodd\"\n d=\"M7.293 14.707a1 1 0 010-1.414L10.586 10 7.293 6.707a1 1 0 011.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z\"\n clip-rule=\"evenodd\"></path>\n </svg>\n {{breadcrumbLabel.kpiName}}\n </a>\n </li>\n </ol>\n</nav>", styles: [".breadcrumb{padding:0!important;margin-bottom:0!important;font-weight:400;font-size:12px}\n"] }]
138
- }], ctorParameters: function () { return [{ type: i1.Location }, { type: i2.Router }, { type: i3.HttpClient }, { type: i2.ActivatedRoute }, { type: i4.CommonService }]; }, propDecorators: { kpi_data_container: [{
139
- type: Input,
140
- args: ['kpi_data_container']
141
- }] } });
142
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJlYWQtY3J1bWJzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2dhbW1hLWFwcC1jb250cm9sbGVyL3NyYy9saWIvYXBwbGljYXRpb24tY29udHJvbGxlci9zaGFyZWQvZ2FtbWEtYnJlYWQtY3J1bWJzL2JyZWFkLWNydW1icy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9nYW1tYS1hcHAtY29udHJvbGxlci9zcmMvbGliL2FwcGxpY2F0aW9uLWNvbnRyb2xsZXIvc2hhcmVkL2dhbW1hLWJyZWFkLWNydW1icy9icmVhZC1jcnVtYnMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQVUsTUFBTSxlQUFlLENBQUM7Ozs7OztBQVl6RCxNQUFNLE9BQU8sb0JBQW9CO0lBZ0MvQixZQUNVLFFBQWtCLEVBQ2xCLE1BQWMsRUFDZCxJQUFnQixFQUNoQixjQUE4QixFQUM5QixhQUE0QjtRQUo1QixhQUFRLEdBQVIsUUFBUSxDQUFVO1FBQ2xCLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxTQUFJLEdBQUosSUFBSSxDQUFZO1FBQ2hCLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM5QixrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQS9CdEMsZ0JBQVcsR0FBUSxFQUFFLENBQUM7UUFDdEIsbUJBQWMsR0FBRyxFQUFFLENBQUM7UUFDcEIsY0FBUyxHQUFHLEVBQUUsQ0FBQztRQUVmLFNBQUksR0FBRyxFQUFFLENBQUM7SUE0Qk4sQ0FBQztJQXZCTCxJQUNJLGtCQUFrQixDQUFDLEtBQUs7UUFDMUIsSUFBSSxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQzdDLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO1lBRTNCLE9BQU87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Q0YsSUFBSSxDQUFDLGFBQWEsQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDN0Q7Z0JBQ0QsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUNyQztZQUNELElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUM7U0FDekM7SUFDSCxDQUFDOztpSEE5SlUsb0JBQW9CO3FHQUFwQixvQkFBb0IsZ0hDWmpDLHloQ0FlTTsyRkRITyxvQkFBb0I7a0JBTGhDLFNBQVM7K0JBQ0Usb0JBQW9CO3NNQW9CMUIsa0JBQWtCO3NCQURyQixLQUFLO3VCQUFDLG9CQUFvQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE9uSW5pdCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBSb3V0ZXIsIE5hdmlnYXRpb25FeHRyYXMsIEFjdGl2YXRlZFJvdXRlIH0gZnJvbSBcIkBhbmd1bGFyL3JvdXRlclwiO1xuaW1wb3J0IHsgTG9jYXRpb24gfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uXCI7XG5pbXBvcnQgeyBIdHRwQ2xpZW50LCBIdHRwSGVhZGVycyB9IGZyb20gXCJAYW5ndWxhci9jb21tb24vaHR0cFwiO1xuaW1wb3J0IHsgQ29tbW9uU2VydmljZSB9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcblxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6IFwiZ2FtbWEtYnJlYWQtY3J1bWJzXCIsXG4gIHRlbXBsYXRlVXJsOiBcIi4vYnJlYWQtY3J1bWJzLmNvbXBvbmVudC5odG1sXCIsXG4gIHN0eWxlVXJsczogW1wiLi9icmVhZC1jcnVtYnMuY29tcG9uZW50LnNjc3NcIl0sXG59KVxuZXhwb3J0IGNsYXNzIEJyZWFkQ3J1bWJzQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcblxuICBicmVhZGNydW1iTGlzdDtcbiAgYnJlYWRjcnVtYkxpbmtzTGlzdDtcbiAgcm91dGU6IHN0cmluZztcbiAgY291bnQ6IG51bWJlcjtcbiAga3BpTGlzdERhdGE6IGFueSA9IFtdO1xuICBrcGlfc3RydWN0dXJlcyA9IHt9O1xuICBrcGlfbmFtZXMgPSB7fTtcbiAga3BpVXJsSUQ7XG4gIGRhdGEgPSBbXTtcblxuICBrcGlCcm93c2VyTmFtZTogQm9vbGVhbjtcbiAgaXNCcmVhZENydW1iczogQm9vbGVhbjtcblxuICBASW5wdXQoJ2twaV9kYXRhX2NvbnRhaW5lcicpXG4gIHNldCBrcGlfZGF0YV9jb250YWluZXIodmFsdWUpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuaXNCcmVhZENydW1icyA9IGZhbHNlO1xuICAgICAgLy8gdGhpcy5hZGRSb2xlQ29udGFpbmVyID0gW3sgXCJ0eXBlXCI6IFwidGV4dFwiLCBcInZhbHVlXCI6ICcnLCBcInJvbGVpZFwiOiBcInJvd0lkMFwiIH1dO1xuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyB0aGlzLmtwaUxpc3REYXRhID0gdmFsdWU7XG4gICAgICBsZXQgcmVsYXRpdmVQYXRoID0gJ3Jha3BpQnJvd3Nlcic7XG4gICAgICB0aGlzLmdldEtwaU5hbWUodmFsdWUsIHJlbGF0aXZlUGF0aCk7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5sb2FkQnJlYWRDcnVtYnMoKTtcbiAgICAgIH0sIDUwMCk7XG4gICAgICB0aGlzLmlzQnJlYWRDcnVtYnMgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgbG9jYXRpb246IExvY2F0aW9uLFxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXG4gICAgcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LFxuICAgIHByaXZhdGUgYWN0aXZhdGVkUm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgIHByaXZhdGUgY29tbW9uU2VydmljZTogQ29tbW9uU2VydmljZSxcbiAgKSB7IH1cblxuICBuZ09uSW5pdCgpIHtcblxuXG4gIH1cblxuICBnZXRLcGlOYW1lKGRhdGEsIHJlbGF0aXZlUGF0aCkge1xuXG4gICAgZGF0YS5mb3JFYWNoKHJlc3VsdCA9PiB7XG4gICAgICBjb25zdCBpdGVtID0ge307XG4gICAgICBsZXQgb2JqO1xuICAgICAgaXRlbVsncmVsYXRpdmVQYXRoJ10gPSByZWxhdGl2ZVBhdGg7XG5cbiAgICAgIGlmIChyZXN1bHRbJ25vZGVzJ10gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBsZXQgY2hpbGRSZWxhdGl2ZVBhdGggPSByZWxhdGl2ZVBhdGggKyAnLycgKyByZXN1bHRbJ25hbWUnXTtcbiAgICAgICAgdGhpcy5nZXRLcGlOYW1lKHJlc3VsdFsnbm9kZXMnXSwgY2hpbGRSZWxhdGl2ZVBhdGgpO1xuICAgICAgfVxuICAgICAgaWYgKHJlc3VsdFsnaWQnXSkge1xuICAgICAgICBvYmogPSB7XG4gICAgICAgICAgJ25hbWUnOiByZXN1bHRbJ25hbWUnXSxcbiAgICAgICAgICAnZGVzYyc6IHJlc3VsdFsnZGVzYyddLFxuICAgICAgICAgICdyZWxhdGl2ZVBhdGgnOiByZXN1bHRbJ3JlbGF0aXZlUGF0aCddLFxuICAgICAgICAgICdrcGlJZCc6IHJlc3VsdFsnaWQnXSxcbiAgICAgICAgICAvLyAna3BpR2lmVXJsJzogZW52aXJvbm1lbnQuYXBwVXJsICsgZW52aXJvbm1lbnQuYXBpVmVyc2lvbiArICcva3BpL2dpZj9pZD0nICsgcmVzdWx0WydpZCddLFxuICAgICAgICAgICdpc0Jvb2ttYXJrZWQnOiByZXN1bHRbJ2lzQm9va21hcmtlZCddLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaXRlbVsnZXh0ZXJuYWxMaW5rJ10gPSByZWxhdGl2ZVBhdGggKyAnLycgKyByZXN1bHRbJ25hbWUnXVxuICAgICAgaXRlbVsndGlkJ10gPSByZXN1bHRbJ3RpZCddO1xuICAgICAgaXRlbVsnaWQnXSA9IHJlc3VsdFsnaWQnXTtcbiAgICAgIGl0ZW1bJ25hbWUnXSA9IHJlc3VsdFsnbmFtZSddO1xuXG4gICAgICB0aGlzLmtwaUxpc3REYXRhLnB1c2goaXRlbSk7XG4gICAgfSk7XG5cbiAgfVxuXG5cbiAgZ2V0QnJlYWRDcnVtYnNEYXRhKGRhdGEpIHtcbiAgICBsZXQgc3RydWN0dXJlcyA9IHt9O1xuICAgIGRhdGEuZm9yRWFjaChyZXN1bHQgPT4ge1xuICAgICAgY29uc3QgaXRlbTogb2JqZWN0ID0ge307XG4gICAgICBpdGVtW1wicmVsYXRpdmVQYXRoXCJdID0gcmVzdWx0LnJlbGF0aXZlUGF0aDtcbiAgICAgIGl0ZW1bXCJuYW1lXCJdID0gcmVzdWx0W1wibmFtZVwiXTtcbiAgICAgIGl0ZW1bXCJ0aWRcIl0gPSByZXN1bHRbXCJ0aWRcIl0udHJpbSgpO1xuICAgICAgaWYgKHJlc3VsdFtcIm5vZGVzXCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaXRlbVtcIm5vZGVzXCJdID0gdGhpcy5nZXRCcmVhZENydW1ic0RhdGEoXG4gICAgICAgICAgcmVzdWx0W1wibm9kZXNcIl1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHRoaXMua3BpX25hbWVzW3Jlc3VsdFtcImlkXCJdXSA9IGl0ZW1bXCJ0aWRcIl07XG5cbiAgICAgIHN0cnVjdHVyZXNbcmVzdWx0W1widGlkXCJdXSA9IGl0ZW07XG4gICAgICB0aGlzLmtwaV9zdHJ1Y3R1cmVzW3Jlc3VsdFtcInRpZFwiXV0gPSBpdGVtO1xuICAgIH0pO1xuICAgIHJldHVybiBzdHJ1Y3R1cmVzO1xuICB9XG5cbiAgbG9hZEJyZWFkQ3J1bWJzKCkge1xuXG4gICAgbGV0IGtwaVJvb3QgPSB0aGlzLmtwaUJyb3dzZXJOYW1lID8gXCJmbXNrcGlcIiA6IFwicmFrcGlcIjtcbiAgICBsZXQga3BpQ29udGFpbmVyO1xuICAgIC8vIGNvbnN0IG5hdnVybCA9IHRoaXMucm91dGVyLnVybC5zcGxpdChcIj9cIik7XG4gICAgLy8gbGV0IHVybCA9IG5hdnVybFswXS5zcGxpdChcIi9cIik7XG4gICAgLy8gdGhpcy5rcGlVcmxJRCA9IHVybC5zbGljZSgtMSkucG9wKCk7XG5cbiAgICBpZiAodGhpcy5rcGlMaXN0RGF0YS5sZW5ndGggPiAwIHx8IHRoaXMua3BpTGlzdERhdGEgIT0gdW5kZWZpbmVkKSB7XG4gICAgICBrcGlDb250YWluZXIgPSB0aGlzLmdldEJyZWFkQ3J1bWJzRGF0YSh0aGlzLmtwaUxpc3REYXRhKTtcbiAgICB9IGVsc2Uge1xuICAgICAga3BpQ29udGFpbmVyID0gdGhpcy5nZXRCcmVhZENydW1ic0RhdGEoXG4gICAgICAgIHRoaXMuY29tbW9uU2VydmljZS5hbGxLcGlicm93c2VyRGV0YWlsQ29udGFpbmVyLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3Qga3BpSWQgPSB0aGlzLmFjdGl2YXRlZFJvdXRlLnNuYXBzaG90LnF1ZXJ5UGFyYW1zWydpZCddO1xuICAgIGNvbnN0IGtwaVRpZCA9IHRoaXMua3BpX25hbWVzW2twaUlkXTtcbiAgICBjb25zdCBwcm9wcyA9IHRoaXMua3BpX3N0cnVjdHVyZXNba3BpVGlkXTtcbiAgICBjb25zdCBwcm9wc0xpc3QgPSBwcm9wc1tcInJlbGF0aXZlUGF0aFwiXSArIFwiL1wiICsgcHJvcHNbXCJuYW1lXCJdO1xuICAgIHRoaXMuYnJlYWRjcnVtYkxpc3QgPSBwcm9wc0xpc3Quc3BsaXQoXCIvXCIpO1xuXG4gICAgaWYgKHRoaXMubG9jYXRpb24ucGF0aCgpICE9PSBcIlwiKSB7XG4gICAgICBsZXQgbGluayA9IHt9O1xuICAgICAgdGhpcy5icmVhZGNydW1iTGlua3NMaXN0ID0gW107XG5cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5icmVhZGNydW1iTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoaSA9PSAwKSB7XG4gICAgICAgICAgaWYgKCF0aGlzLmtwaUJyb3dzZXJOYW1lKSB7XG4gICAgICAgICAgICBsaW5rID0ge1xuICAgICAgICAgICAgICBuYW1lOiB0aGlzLmJyZWFkY3J1bWJMaXN0W2ldLFxuICAgICAgICAgICAgICB1cmw6IFwiL2FwcHMvcmFLcGkvcmFrcGlCcm93c2VyXCIsXG4gICAgICAgICAgICAgIGtwaU5hbWU6IFwiUkEgS1BJIEJyb3dzZXJcIixcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxpbmsgPSB7XG4gICAgICAgICAgICAgIG5hbWU6IHRoaXMuYnJlYWRjcnVtYkxpc3RbaV0sXG4gICAgICAgICAgICAgIHVybDogXCIvYXBwcy9mbXNLcGlcIixcbiAgICAgICAgICAgICAga3BpTmFtZTogXCJGTVMgS1BJIEJyb3dzZXJcIixcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxldCByZXR1cm5JZCA9IFwiXCI7XG4gICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPD0gaTsgaisrKSB7XG4gICAgICAgICAgICBpZiAoaiAhPSAwKSB7XG4gICAgICAgICAgICAgIHJldHVybklkICs9IFwiL1wiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuSWQgKz0gdGhpcy5icmVhZGNydW1iTGlzdFtqXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbGluayA9IHtcbiAgICAgICAgICAgIG5hbWU6IHRoaXMuYnJlYWRjcnVtYkxpc3RbaV0sXG4gICAgICAgICAgICB1cmw6IHRoaXMuYnJlYWRjcnVtYkxpbmtzTGlzdFtpIC0gMV1bXCJ1cmxcIl0sXG4gICAgICAgICAgICBpZDogdGhpcy5icmVhZGNydW1iTGlzdFtpXSxcbiAgICAgICAgICAgIGtwaU5hbWU6IHRoaXMuYnJlYWRjcnVtYkxpc3RbaV0sXG4gICAgICAgICAgICByZXR1cm5JZDogcmV0dXJuSWQsXG4gICAgICAgICAgfTtcbiAgICAgICAgICB0aGlzLmNvbW1vblNlcnZpY2UuZ2xvYmFsX2twaV9uYW1lID0gdGhpcy5icmVhZGNydW1iTGlzdFtpXTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmJyZWFkY3J1bWJMaW5rc0xpc3QucHVzaChsaW5rKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY291bnQgPSB0aGlzLmJyZWFkY3J1bWJMaXN0Lmxlbmd0aDtcbiAgICB9XG4gIH1cbn1cbiIsIjxuYXYgY2xhc3M9XCJmbGV4IG10LTFcIiBhcmlhLWxhYmVsPVwiQnJlYWRjcnVtYlwiICpuZ0lmPVwiaXNCcmVhZENydW1ic1wiPlxuICAgIDxvbCBjbGFzcz1cImlubGluZS1mbGV4IGl0ZW1zLWNlbnRlciBzcGFjZS14LTEgbWQ6c3BhY2UteC0zXCI+XG4gICAgICAgIDxsaSBjbGFzcz1cImlubGluZS1mbGV4IGl0ZW1zLWNlbnRlciBjdXJzb3ItcG9pbnRlclwiICpuZ0Zvcj1cImxldCBicmVhZGNydW1iTGFiZWwgb2YgYnJlYWRjcnVtYkxpbmtzTGlzdDtcIj5cbiAgICAgICAgICAgIDxhIFtyb3V0ZXJMaW5rXT1cImJyZWFkY3J1bWJMYWJlbC51cmxcIiBbcXVlcnlQYXJhbXNdPVwie3JldHVybklkOiBicmVhZGNydW1iTGFiZWwucmV0dXJuSWQgfVwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJpbmxpbmUtZmxleCBpdGVtcy1jZW50ZXIgdGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LWdyYXktNzAwIGhvdmVyOnRleHQtZ3JheS05MDAgZGFyazp0ZXh0LWdyYXktNDAwIGRhcms6aG92ZXI6dGV4dC13aGl0ZVwiPlxuICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJ3LTYgaC02IHRleHQtZ3JheS00MDBcIiBmaWxsPVwiY3VycmVudENvbG9yXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiXG4gICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgICAgICAgICAgPHBhdGggZmlsbC1ydWxlPVwiZXZlbm9kZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTcuMjkzIDE0LjcwN2ExIDEgMCAwMTAtMS40MTRMMTAuNTg2IDEwIDcuMjkzIDYuNzA3YTEgMSAwIDAxMS40MTQtMS40MTRsNCA0YTEgMSAwIDAxMCAxLjQxNGwtNCA0YTEgMSAwIDAxLTEuNDE0IDB6XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsaXAtcnVsZT1cImV2ZW5vZGRcIj48L3BhdGg+XG4gICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAge3ticmVhZGNydW1iTGFiZWwua3BpTmFtZX19XG4gICAgICAgICAgICA8L2E+XG4gICAgICAgIDwvbGk+XG4gICAgPC9vbD5cbjwvbmF2PiJdfQ==