@sunbird-cb/cbp-ai 0.0.1

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 (128) hide show
  1. package/README.md +24 -0
  2. package/esm2022/lib/ai-cbp-routing.module.mjs +56 -0
  3. package/esm2022/lib/ai-cbp.component.mjs +14 -0
  4. package/esm2022/lib/ai-cbp.module.mjs +263 -0
  5. package/esm2022/lib/ai-cbp.service.mjs +14 -0
  6. package/esm2022/lib/components/add-course/add-course.component.mjs +444 -0
  7. package/esm2022/lib/components/add-designation/add-designation.component.mjs +460 -0
  8. package/esm2022/lib/components/add-personalisation/add-personalisation.component.mjs +33 -0
  9. package/esm2022/lib/components/approval-request-form/approval-request-form.component.mjs +392 -0
  10. package/esm2022/lib/components/approval-requests/approval-requests.component.mjs +398 -0
  11. package/esm2022/lib/components/dashboard/dashboard.component.mjs +265 -0
  12. package/esm2022/lib/components/delete-role-mapping/delete-role-mapping.component.mjs +53 -0
  13. package/esm2022/lib/components/delete-role-mapping-popup/delete-role-mapping-popup.component.mjs +39 -0
  14. package/esm2022/lib/components/edit-cbp-plan/edit-cbp-plan.component.mjs +699 -0
  15. package/esm2022/lib/components/gap-analysis-recommended-course/gap-analysis-recommended-course.component.mjs +188 -0
  16. package/esm2022/lib/components/generate-course-recommendation/generate-course-recommendation.component.mjs +1949 -0
  17. package/esm2022/lib/components/list-popup/list-popup.component.mjs +32 -0
  18. package/esm2022/lib/components/review-request/review-request.component.mjs +138 -0
  19. package/esm2022/lib/components/role-mapping-generation/role-mapping-generation.component.mjs +1082 -0
  20. package/esm2022/lib/components/role-mapping-list/role-mapping-list.component.mjs +714 -0
  21. package/esm2022/lib/components/suggest-more-courses/suggest-more-courses.component.mjs +370 -0
  22. package/esm2022/lib/components/update-designation-hierarchy/update-designation-hierarchy.component.mjs +235 -0
  23. package/esm2022/lib/components/view-cbp-plan/view-cbp-plan.component.mjs +125 -0
  24. package/esm2022/lib/components/view-course-recommendation/view-course-recommendation.component.mjs +397 -0
  25. package/esm2022/lib/components/view-final-cbp-plan/view-final-cbp-plan.component.mjs +883 -0
  26. package/esm2022/lib/modules/initial-screen/initial-screen.component.mjs +127 -0
  27. package/esm2022/lib/modules/shared/constant/app.constant.mjs +2036 -0
  28. package/esm2022/lib/modules/shared/directives/clickoutside.directive.mjs +38 -0
  29. package/esm2022/lib/modules/shared/directives/directive.module.mjs +21 -0
  30. package/esm2022/lib/modules/shared/pipes/order-by-name.pipe.mjs +23 -0
  31. package/esm2022/lib/modules/shared/services/event.service.mjs +24 -0
  32. package/esm2022/lib/modules/shared/services/events.mjs +125 -0
  33. package/esm2022/lib/modules/shared/services/init.service.mjs +41 -0
  34. package/esm2022/lib/modules/shared/services/role-mapping.service.mjs +261 -0
  35. package/esm2022/lib/modules/shared/services/shared.service.mjs +869 -0
  36. package/esm2022/lib/modules/upload-document-page/progress-dialog/progress-dialog.component.mjs +53 -0
  37. package/esm2022/lib/modules/upload-document-page/upload-dialog/upload-dialog.component.mjs +186 -0
  38. package/esm2022/lib/modules/upload-document-page/upload-document-page.component.mjs +367 -0
  39. package/esm2022/lib/pipe-public-URL/pipe-public-URL.module.mjs +20 -0
  40. package/esm2022/lib/pipe-public-URL/pipe-public-URL.pipe.mjs +23 -0
  41. package/esm2022/public-api.mjs +14 -0
  42. package/esm2022/sunbird-cb-cbp-ai.mjs +5 -0
  43. package/fesm2022/sunbird-cb-cbp-ai.mjs +12952 -0
  44. package/fesm2022/sunbird-cb-cbp-ai.mjs.map +1 -0
  45. package/index.d.ts +6 -0
  46. package/lib/ai-cbp-routing.module.d.ts +8 -0
  47. package/lib/ai-cbp-routing.module.d.ts.map +1 -0
  48. package/lib/ai-cbp.component.d.ts +7 -0
  49. package/lib/ai-cbp.component.d.ts.map +1 -0
  50. package/lib/ai-cbp.module.d.ts +68 -0
  51. package/lib/ai-cbp.module.d.ts.map +1 -0
  52. package/lib/ai-cbp.service.d.ts +7 -0
  53. package/lib/ai-cbp.service.d.ts.map +1 -0
  54. package/lib/components/add-course/add-course.component.d.ts +67 -0
  55. package/lib/components/add-course/add-course.component.d.ts.map +1 -0
  56. package/lib/components/add-designation/add-designation.component.d.ts +52 -0
  57. package/lib/components/add-designation/add-designation.component.d.ts.map +1 -0
  58. package/lib/components/add-personalisation/add-personalisation.component.d.ts +16 -0
  59. package/lib/components/add-personalisation/add-personalisation.component.d.ts.map +1 -0
  60. package/lib/components/approval-request-form/approval-request-form.component.d.ts +48 -0
  61. package/lib/components/approval-request-form/approval-request-form.component.d.ts.map +1 -0
  62. package/lib/components/approval-requests/approval-requests.component.d.ts +80 -0
  63. package/lib/components/approval-requests/approval-requests.component.d.ts.map +1 -0
  64. package/lib/components/dashboard/dashboard.component.d.ts +55 -0
  65. package/lib/components/dashboard/dashboard.component.d.ts.map +1 -0
  66. package/lib/components/delete-role-mapping/delete-role-mapping.component.d.ts +18 -0
  67. package/lib/components/delete-role-mapping/delete-role-mapping.component.d.ts.map +1 -0
  68. package/lib/components/delete-role-mapping-popup/delete-role-mapping-popup.component.d.ts +18 -0
  69. package/lib/components/delete-role-mapping-popup/delete-role-mapping-popup.component.d.ts.map +1 -0
  70. package/lib/components/edit-cbp-plan/edit-cbp-plan.component.d.ts +94 -0
  71. package/lib/components/edit-cbp-plan/edit-cbp-plan.component.d.ts.map +1 -0
  72. package/lib/components/gap-analysis-recommended-course/gap-analysis-recommended-course.component.d.ts +35 -0
  73. package/lib/components/gap-analysis-recommended-course/gap-analysis-recommended-course.component.d.ts.map +1 -0
  74. package/lib/components/generate-course-recommendation/generate-course-recommendation.component.d.ts +198 -0
  75. package/lib/components/generate-course-recommendation/generate-course-recommendation.component.d.ts.map +1 -0
  76. package/lib/components/list-popup/list-popup.component.d.ts +13 -0
  77. package/lib/components/list-popup/list-popup.component.d.ts.map +1 -0
  78. package/lib/components/review-request/review-request.component.d.ts +39 -0
  79. package/lib/components/review-request/review-request.component.d.ts.map +1 -0
  80. package/lib/components/role-mapping-generation/role-mapping-generation.component.d.ts +99 -0
  81. package/lib/components/role-mapping-generation/role-mapping-generation.component.d.ts.map +1 -0
  82. package/lib/components/role-mapping-list/role-mapping-list.component.d.ts +83 -0
  83. package/lib/components/role-mapping-list/role-mapping-list.component.d.ts.map +1 -0
  84. package/lib/components/suggest-more-courses/suggest-more-courses.component.d.ts +48 -0
  85. package/lib/components/suggest-more-courses/suggest-more-courses.component.d.ts.map +1 -0
  86. package/lib/components/update-designation-hierarchy/update-designation-hierarchy.component.d.ts +41 -0
  87. package/lib/components/update-designation-hierarchy/update-designation-hierarchy.component.d.ts.map +1 -0
  88. package/lib/components/view-cbp-plan/view-cbp-plan.component.d.ts +29 -0
  89. package/lib/components/view-cbp-plan/view-cbp-plan.component.d.ts.map +1 -0
  90. package/lib/components/view-course-recommendation/view-course-recommendation.component.d.ts +49 -0
  91. package/lib/components/view-course-recommendation/view-course-recommendation.component.d.ts.map +1 -0
  92. package/lib/components/view-final-cbp-plan/view-final-cbp-plan.component.d.ts +73 -0
  93. package/lib/components/view-final-cbp-plan/view-final-cbp-plan.component.d.ts.map +1 -0
  94. package/lib/modules/initial-screen/initial-screen.component.d.ts +85 -0
  95. package/lib/modules/initial-screen/initial-screen.component.d.ts.map +1 -0
  96. package/lib/modules/shared/constant/app.constant.d.ts +457 -0
  97. package/lib/modules/shared/constant/app.constant.d.ts.map +1 -0
  98. package/lib/modules/shared/directives/clickoutside.directive.d.ts +13 -0
  99. package/lib/modules/shared/directives/clickoutside.directive.d.ts.map +1 -0
  100. package/lib/modules/shared/directives/directive.module.d.ts +8 -0
  101. package/lib/modules/shared/directives/directive.module.d.ts.map +1 -0
  102. package/lib/modules/shared/pipes/order-by-name.pipe.d.ts +8 -0
  103. package/lib/modules/shared/pipes/order-by-name.pipe.d.ts.map +1 -0
  104. package/lib/modules/shared/services/event.service.d.ts +12 -0
  105. package/lib/modules/shared/services/event.service.d.ts.map +1 -0
  106. package/lib/modules/shared/services/events.d.ts +200 -0
  107. package/lib/modules/shared/services/events.d.ts.map +1 -0
  108. package/lib/modules/shared/services/init.service.d.ts +13 -0
  109. package/lib/modules/shared/services/init.service.d.ts.map +1 -0
  110. package/lib/modules/shared/services/role-mapping.service.d.ts +21 -0
  111. package/lib/modules/shared/services/role-mapping.service.d.ts.map +1 -0
  112. package/lib/modules/shared/services/shared.service.d.ts +108 -0
  113. package/lib/modules/shared/services/shared.service.d.ts.map +1 -0
  114. package/lib/modules/upload-document-page/progress-dialog/progress-dialog.component.d.ts +14 -0
  115. package/lib/modules/upload-document-page/progress-dialog/progress-dialog.component.d.ts.map +1 -0
  116. package/lib/modules/upload-document-page/upload-dialog/upload-dialog.component.d.ts +29 -0
  117. package/lib/modules/upload-document-page/upload-dialog/upload-dialog.component.d.ts.map +1 -0
  118. package/lib/modules/upload-document-page/upload-document-page.component.d.ts +64 -0
  119. package/lib/modules/upload-document-page/upload-document-page.component.d.ts.map +1 -0
  120. package/lib/pipe-public-URL/pipe-public-URL.module.d.ts +9 -0
  121. package/lib/pipe-public-URL/pipe-public-URL.module.d.ts.map +1 -0
  122. package/lib/pipe-public-URL/pipe-public-URL.pipe.d.ts +11 -0
  123. package/lib/pipe-public-URL/pipe-public-URL.pipe.d.ts.map +1 -0
  124. package/package.json +28 -0
  125. package/public-api.d.ts +11 -0
  126. package/public-api.d.ts.map +1 -0
  127. package/sunbird-cb-cbp-ai-0.0.1.tgz +0 -0
  128. package/sunbird-cb-cbp-ai.d.ts.map +1 -0
@@ -0,0 +1,53 @@
1
+ import { Component, Inject } from '@angular/core';
2
+ import { MAT_DIALOG_DATA } from '@angular/material/dialog';
3
+ import * as i0 from "@angular/core";
4
+ export class ProgressDialogComponent {
5
+ constructor(data) {
6
+ this.data = data;
7
+ console.log('data--', data);
8
+ }
9
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ProgressDialogComponent, deps: [{ token: MAT_DIALOG_DATA }], target: i0.ɵɵFactoryTarget.Component }); }
10
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: ProgressDialogComponent, selector: "app-progress-dialog", ngImport: i0, template: `
11
+ <div class="progress-container">
12
+ <h3>Processing Summaries</h3>
13
+ <p>{{ data.message }}</p>
14
+ <p>Please wait , it will take few minutes to complete</p>
15
+ <div class="progress-container">
16
+ <!-- Circular Spinner -->
17
+ <div class="spinner"></div>
18
+
19
+ <!-- Linear Progress Bar -->
20
+ <div class="linear-progress">
21
+ <div class="bar"></div>
22
+ </div>
23
+
24
+
25
+ </div>
26
+ </div>
27
+ `, isInline: true, styles: [".progress-container{padding:20px;width:auto;text-align:center}mat-progress-bar{margin-top:20px}.spinner{width:64px;height:64px;border-radius:50%;border:6px solid #e8e6ff;border-top-color:#5b5bf0;border-right-color:#8b7cf7;animation:spin 1.2s linear infinite;margin:0 auto 28px}@keyframes spin{to{transform:rotate(360deg)}}.linear-progress{position:relative;width:100%;height:8px;background:#e8e6ff;border-radius:4px;overflow:hidden;margin-bottom:24px}.linear-progress .bar{position:absolute;height:100%;width:40%;background:linear-gradient(90deg,#b8b1ff,#5b5bf0,#b8b1ff);animation:indeterminate 1.6s infinite ease-in-out}@keyframes indeterminate{0%{left:-40%}to{left:100%}}.label strong{font-size:18px;color:#2f2f44}.label p{margin-top:4px;font-size:14px;color:#6b6b8a}\n"] }); }
28
+ }
29
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ProgressDialogComponent, decorators: [{
30
+ type: Component,
31
+ args: [{ selector: 'app-progress-dialog', template: `
32
+ <div class="progress-container">
33
+ <h3>Processing Summaries</h3>
34
+ <p>{{ data.message }}</p>
35
+ <p>Please wait , it will take few minutes to complete</p>
36
+ <div class="progress-container">
37
+ <!-- Circular Spinner -->
38
+ <div class="spinner"></div>
39
+
40
+ <!-- Linear Progress Bar -->
41
+ <div class="linear-progress">
42
+ <div class="bar"></div>
43
+ </div>
44
+
45
+
46
+ </div>
47
+ </div>
48
+ `, styles: [".progress-container{padding:20px;width:auto;text-align:center}mat-progress-bar{margin-top:20px}.spinner{width:64px;height:64px;border-radius:50%;border:6px solid #e8e6ff;border-top-color:#5b5bf0;border-right-color:#8b7cf7;animation:spin 1.2s linear infinite;margin:0 auto 28px}@keyframes spin{to{transform:rotate(360deg)}}.linear-progress{position:relative;width:100%;height:8px;background:#e8e6ff;border-radius:4px;overflow:hidden;margin-bottom:24px}.linear-progress .bar{position:absolute;height:100%;width:40%;background:linear-gradient(90deg,#b8b1ff,#5b5bf0,#b8b1ff);animation:indeterminate 1.6s infinite ease-in-out}@keyframes indeterminate{0%{left:-40%}to{left:100%}}.label strong{font-size:18px;color:#2f2f44}.label p{margin-top:4px;font-size:14px;color:#6b6b8a}\n"] }]
49
+ }], ctorParameters: function () { return [{ type: undefined, decorators: [{
50
+ type: Inject,
51
+ args: [MAT_DIALOG_DATA]
52
+ }] }]; } });
53
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZ3Jlc3MtZGlhbG9nLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnJhcnkvc3VuYmlyZC1jYi9jYnAtYWkvc3JjL2xpYi9tb2R1bGVzL3VwbG9hZC1kb2N1bWVudC1wYWdlL3Byb2dyZXNzLWRpYWxvZy9wcm9ncmVzcy1kaWFsb2cuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2xELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQzs7QUF3RzNELE1BQU0sT0FBTyx1QkFBdUI7SUFDbEMsWUFBNEMsSUFBMkM7UUFBM0MsU0FBSSxHQUFKLElBQUksQ0FBdUM7UUFDckYsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUE7SUFDN0IsQ0FBQzsrR0FIVSx1QkFBdUIsa0JBQ2QsZUFBZTttR0FEeEIsdUJBQXVCLDJEQXBHeEI7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJUOzs0RkFtRlUsdUJBQXVCO2tCQXRHbkMsU0FBUzsrQkFDRSxxQkFBcUIsWUFDckI7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJUOzswQkFvRlksTUFBTTsyQkFBQyxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1BVF9ESUFMT0dfREFUQSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1wcm9ncmVzcy1kaWFsb2cnLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzcy1jb250YWluZXJcIj5cbiAgICAgIDxoMz5Qcm9jZXNzaW5nIFN1bW1hcmllczwvaDM+XG4gICAgICA8cD57eyBkYXRhLm1lc3NhZ2UgfX08L3A+XG4gICAgICA8cD5QbGVhc2Ugd2FpdCAsIGl0IHdpbGwgdGFrZSBmZXcgbWludXRlcyB0byBjb21wbGV0ZTwvcD5cbiAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzcy1jb250YWluZXJcIj5cbiAgICAgICAgPCEtLSBDaXJjdWxhciBTcGlubmVyIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwic3Bpbm5lclwiPjwvZGl2PlxuXG4gICAgICAgIDwhLS0gTGluZWFyIFByb2dyZXNzIEJhciAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImxpbmVhci1wcm9ncmVzc1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJiYXJcIj48L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICBcbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICBgLFxuICBzdHlsZXM6IFtgXG4gICAgLnByb2dyZXNzLWNvbnRhaW5lciB7XG4gICAgICBwYWRkaW5nOiAyMHB4O1xuICAgICAgd2lkdGg6IGF1dG87XG4gICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgfVxuICAgIG1hdC1wcm9ncmVzcy1iYXIge1xuICAgICAgbWFyZ2luLXRvcDogMjBweDtcbiAgICB9XG4gICBcblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgQ2lyY3VsYXIgU3Bpbm5lclxuPT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuLnNwaW5uZXIge1xuICB3aWR0aDogNjRweDtcbiAgaGVpZ2h0OiA2NHB4O1xuICBib3JkZXItcmFkaXVzOiA1MCU7XG4gIGJvcmRlcjogNnB4IHNvbGlkICNlOGU2ZmY7XG4gIGJvcmRlci10b3AtY29sb3I6ICM1YjViZjA7XG4gIGJvcmRlci1yaWdodC1jb2xvcjogIzhiN2NmNztcbiAgYW5pbWF0aW9uOiBzcGluIDEuMnMgbGluZWFyIGluZmluaXRlO1xuICBtYXJnaW46IDAgYXV0byAyOHB4O1xufVxuXG5Aa2V5ZnJhbWVzIHNwaW4ge1xuICAxMDAlIHtcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpO1xuICB9XG59XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgIExpbmVhciBQcm9ncmVzcyBCYXJcbj09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cbi5saW5lYXItcHJvZ3Jlc3Mge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDhweDtcbiAgYmFja2dyb3VuZDogI2U4ZTZmZjtcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICBtYXJnaW4tYm90dG9tOiAyNHB4O1xufVxuXG4ubGluZWFyLXByb2dyZXNzIC5iYXIge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIGhlaWdodDogMTAwJTtcbiAgd2lkdGg6IDQwJTtcbiAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KFxuICAgIDkwZGVnLFxuICAgICNiOGIxZmYsXG4gICAgIzViNWJmMCxcbiAgICAjYjhiMWZmXG4gICk7XG4gIGFuaW1hdGlvbjogaW5kZXRlcm1pbmF0ZSAxLjZzIGluZmluaXRlIGVhc2UtaW4tb3V0O1xufVxuXG5Aa2V5ZnJhbWVzIGluZGV0ZXJtaW5hdGUge1xuICAwJSB7XG4gICAgbGVmdDogLTQwJTtcbiAgfVxuICAxMDAlIHtcbiAgICBsZWZ0OiAxMDAlO1xuICB9XG59XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgIFRleHRcbj09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cbi5sYWJlbCBzdHJvbmcge1xuICBmb250LXNpemU6IDE4cHg7XG4gIGNvbG9yOiAjMmYyZjQ0O1xufVxuXG4ubGFiZWwgcCB7XG4gIG1hcmdpbi10b3A6IDRweDtcbiAgZm9udC1zaXplOiAxNHB4O1xuICBjb2xvcjogIzZiNmI4YTtcbn1cblxuICBgXVxufSlcbmV4cG9ydCBjbGFzcyBQcm9ncmVzc0RpYWxvZ0NvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKEBJbmplY3QoTUFUX0RJQUxPR19EQVRBKSBwdWJsaWMgZGF0YTogeyBwcm9ncmVzczogbnVtYmVyOyBtZXNzYWdlOiBzdHJpbmcgfSkge1xuICAgIGNvbnNvbGUubG9nKCdkYXRhLS0nLCBkYXRhKVxuICB9XG59Il19
@@ -0,0 +1,186 @@
1
+ import { Component } from '@angular/core';
2
+ import { ProgressDialogComponent } from '../progress-dialog/progress-dialog.component';
3
+ import { interval, forkJoin } from 'rxjs';
4
+ import { startWith, switchMap, takeWhile, tap } from 'rxjs/operators';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "@angular/material/dialog";
7
+ import * as i2 from "../../shared/services/shared.service";
8
+ import * as i3 from "@angular/material/snack-bar";
9
+ import * as i4 from "@angular/common";
10
+ import * as i5 from "@angular/material/legacy-button";
11
+ import * as i6 from "@angular/material/icon";
12
+ import * as i7 from "@angular/material/progress-spinner";
13
+ import * as i8 from "@angular/material/tooltip";
14
+ export class UploadDialogComponent {
15
+ constructor(dialogRef, sharedService, snackBar, dialog) {
16
+ this.dialogRef = dialogRef;
17
+ this.sharedService = sharedService;
18
+ this.snackBar = snackBar;
19
+ this.dialog = dialog;
20
+ this.MAX_FILES = 10;
21
+ this.documentName = '';
22
+ this.selectedFiles = [];
23
+ this.cbpFinalObj = {};
24
+ this.loading = false;
25
+ this.uploadedFileData = {};
26
+ this.cbpFinalObj = this.sharedService.getCBPPlanLocalStorage();
27
+ }
28
+ /** Already uploaded files count */
29
+ get uploadedCount() {
30
+ return this.cbpFinalObj?.documents?.length || 0;
31
+ }
32
+ /** Uploaded + newly selected */
33
+ get totalFileCount() {
34
+ return this.uploadedCount + this.selectedFiles.length;
35
+ }
36
+ onFileSelected(event) {
37
+ const input = event.target;
38
+ if (!input.files)
39
+ return;
40
+ const files = Array.from(input.files);
41
+ const allowedExtensions = ['pdf', 'doc', 'docx'];
42
+ for (const file of files) {
43
+ if (this.totalFileCount >= this.MAX_FILES) {
44
+ this.snackBar.open('You can upload a maximum of 10 documents.', 'X', {
45
+ duration: 3000,
46
+ panelClass: ['snackbar-error']
47
+ });
48
+ break;
49
+ }
50
+ const ext = file.name.split('.').pop()?.toLowerCase();
51
+ if (!ext || !allowedExtensions.includes(ext)) {
52
+ this.snackBar.open(`Invalid file type: ${file.name}`, 'X', { duration: 3000, panelClass: ['snackbar-error'] });
53
+ continue;
54
+ }
55
+ // Prevent duplicate selection
56
+ if (this.selectedFiles.some(f => f.name === file.name && f.size === file.size)) {
57
+ continue;
58
+ }
59
+ this.selectedFiles.push(file);
60
+ }
61
+ // Reset input so same file can be re-selected
62
+ input.value = '';
63
+ }
64
+ removeFile(index) {
65
+ this.selectedFiles.splice(index, 1);
66
+ }
67
+ // upload(): void {
68
+ // if (!this.documentName || this.selectedFiles.length === 0) {
69
+ // return;
70
+ // }
71
+ // if (this.totalFileCount > this.MAX_FILES) {
72
+ // this.snackBar.open('Maximum 10 documents allowed.', 'X', {
73
+ // duration: 3000,
74
+ // panelClass: ['snackbar-error']
75
+ // });
76
+ // return;
77
+ // }
78
+ // this.loading = true;
79
+ // const uploadNext = (index: number) => {
80
+ // if (index >= this.selectedFiles.length) {
81
+ // this.loading = false;
82
+ // this.dialogRef.close('close');
83
+ // return;
84
+ // }
85
+ // const file = this.selectedFiles[index];
86
+ // const reqBody = {
87
+ // state_center_id: this.cbpFinalObj?.ministry?.identifier,
88
+ // department_id: this.cbpFinalObj?.departments,
89
+ // documentName: this.documentName
90
+ // };
91
+ // this.sharedService.uploadDocument(reqBody, file).subscribe({
92
+ // next: (res) => {
93
+ // this.uploadedFileData = res;
94
+ // this.triggerFileSummary();
95
+ // uploadNext(index + 1);
96
+ // },
97
+ // error: (err) => {
98
+ // this.loading = false;
99
+ // this.snackBar.open(
100
+ // err?.error?.detail || 'Upload failed',
101
+ // 'X',
102
+ // { duration: 3000, panelClass: ['snackbar-error'] }
103
+ // );
104
+ // }
105
+ // });
106
+ // };
107
+ // uploadNext(0);
108
+ // }
109
+ upload() {
110
+ if (this.selectedFiles.length === 0) {
111
+ return;
112
+ }
113
+ if (this.totalFileCount > this.MAX_FILES) {
114
+ this.snackBar.open('Maximum 10 documents allowed.', 'X', {
115
+ duration: 3000,
116
+ panelClass: ['snackbar-error']
117
+ });
118
+ return;
119
+ }
120
+ const formData = new FormData();
121
+ // Required fields
122
+ formData.append('state_center_id', this.cbpFinalObj?.ministry?.identifier || '');
123
+ formData.append('department_id', this.cbpFinalObj?.departments || '');
124
+ // Append multiple files with SAME key "files"
125
+ this.selectedFiles.forEach((file) => {
126
+ formData.append('files', file, file.name);
127
+ });
128
+ this.loading = true;
129
+ this.sharedService.uploadDocument(formData).subscribe({
130
+ next: (res) => {
131
+ this.loading = false;
132
+ this.uploadedFileData = res;
133
+ this.triggerFileSummary();
134
+ this.snackBar.open(res?.message, 'X', {
135
+ duration: 3000,
136
+ panelClass: ['snackbar-success']
137
+ });
138
+ },
139
+ error: (error) => {
140
+ this.loading = false;
141
+ this.snackBar.open(error?.error?.detail || 'Upload failed', 'X', { duration: 3000, panelClass: ['snackbar-error'] });
142
+ }
143
+ });
144
+ }
145
+ triggerFileSummary() {
146
+ if (!this.uploadedFileData?.successful_uploads?.length)
147
+ return;
148
+ const files = this.uploadedFileData.successful_uploads;
149
+ const totalFiles = files.length;
150
+ const dialogRefForProgress = this.dialog.open(ProgressDialogComponent, {
151
+ disableClose: true,
152
+ data: { progress: 0, message: `Processing 0 of ${totalFiles} summaries...` }
153
+ });
154
+ let completedFiles = 0;
155
+ const pollingRequests = files.map(file => interval(5000).pipe(startWith(0), // trigger immediately
156
+ switchMap(() => this.sharedService.triggerFileSummary(file.file_id)), // must return { summary_status }
157
+ tap((res) => {
158
+ if (res.summary_status === 'COMPLETED') {
159
+ completedFiles++;
160
+ dialogRefForProgress.componentInstance.data.progress = Math.floor((completedFiles / totalFiles) * 100);
161
+ dialogRefForProgress.componentInstance.data.message = `Processing ${completedFiles} of ${totalFiles} summaries...`;
162
+ }
163
+ }), takeWhile((res) => res.summary_status !== 'COMPLETED', true)));
164
+ forkJoin(pollingRequests).subscribe({
165
+ complete: () => {
166
+ dialogRefForProgress.componentInstance.data.progress = 100;
167
+ dialogRefForProgress.componentInstance.data.message = `All ${totalFiles} summaries completed!`;
168
+ setTimeout(() => {
169
+ dialogRefForProgress.close();
170
+ this.dialogRef.close('close');
171
+ }, 500);
172
+ },
173
+ error: () => {
174
+ dialogRefForProgress.close();
175
+ this.dialogRef.close('close');
176
+ }
177
+ });
178
+ }
179
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: UploadDialogComponent, deps: [{ token: i1.MatDialogRef }, { token: i2.SharedService }, { token: i3.MatSnackBar }, { token: i1.MatDialog }], target: i0.ɵɵFactoryTarget.Component }); }
180
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: UploadDialogComponent, selector: "app-upload-dialog", ngImport: i0, template: "<h2 mat-dialog-title>Upload Document</h2>\n\n<mat-dialog-content>\n\n <!-- <mat-form-field appearance=\"fill\" style=\"width: 100%; border: 1px solid #000;\">\n <input\n matInput\n [(ngModel)]=\"documentName\"\n placeholder=\"Document Name\"\n [disabled]=\"totalFileCount >= MAX_FILES\"\n >\n </mat-form-field> -->\n\n <!-- Upload Box -->\n <div\n class=\"file-upload-box\"\n style=\"margin-top: 30px;\"\n [class.disabled]=\"totalFileCount >= MAX_FILES\"\n (click)=\"totalFileCount < MAX_FILES && fileInput.click()\"\n >\n <input\n type=\"file\"\n #fileInput\n hidden\n multiple\n accept=\".pdf,.doc,.docx\"\n (change)=\"onFileSelected($event)\"\n >\n\n <p *ngIf=\"totalFileCount < MAX_FILES\">\n Click to select files\n </p>\n\n <p *ngIf=\"totalFileCount >= MAX_FILES\" class=\"error-text\">\n Maximum 10 documents allowed\n </p>\n\n <p><strong>Note:</strong> <small>PDF Files Only (Max:25 MB)</small></p>\n </div>\n\n <!-- Selected Files List -->\n <div *ngIf=\"selectedFiles.length > 0\" class=\"file-list\" style=\"margin-top:10px\">\n <p><strong>Selected Files</strong></p>\n\n <div class=\"file-item\" *ngFor=\"let file of selectedFiles; let i = index\">\n <span>{{ file.name }}</span>\n <span (click)=\"removeFile(i)\">\n <mat-icon class=\"file-cross-icon\" matTooltip=\"Remove\" matTooltipPosition=\"above\">close</mat-icon>\n </span>\n </div>\n </div>\n\n</mat-dialog-content>\n\n<div class=\"disclaimer-text\">\n <p>Disclaimer: Please do not upload any confidential documents.</p>\n</div>\n\n<mat-dialog-actions align=\"center\" style=\"margin: 20px 0;\">\n <button mat-button mat-dialog-close>Cancel</button>\n\n <button class=\"primary-btn cursor-pointer\"\n mat-raised-button\n color=\"primary\"\n (click)=\"upload()\"\n [disabled]=\"selectedFiles.length === 0\"\n >\n Upload\n </button>\n</mat-dialog-actions>\n\n<div class=\"overlay-loader\" *ngIf=\"loading\">\n <mat-spinner diameter=\"50\"></mat-spinner>\n</div>\n", styles: [".file-upload-box{border:2px dashed #ccc;padding:20px;text-align:center;cursor:pointer;margin-top:10px}.primary-btn{background-color:#1b4ca1;color:#fff}.disclaimer-text p{font-size:16px;font-family:Lato;font-weight:400;margin-left:24px}.file-cross-icon{height:24px;width:24px;vertical-align:middle;background:#d3d3d3;margin-left:10px;border-radius:25px}:host .mat-mdc-dialog-content{max-height:100vh!important}.cursor-pointer{cursor:pointer}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i5.MatLegacyButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i1.MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { kind: "directive", type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "directive", type: i1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "component", type: i7.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "directive", type: i8.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }] }); }
181
+ }
182
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: UploadDialogComponent, decorators: [{
183
+ type: Component,
184
+ args: [{ selector: 'app-upload-dialog', template: "<h2 mat-dialog-title>Upload Document</h2>\n\n<mat-dialog-content>\n\n <!-- <mat-form-field appearance=\"fill\" style=\"width: 100%; border: 1px solid #000;\">\n <input\n matInput\n [(ngModel)]=\"documentName\"\n placeholder=\"Document Name\"\n [disabled]=\"totalFileCount >= MAX_FILES\"\n >\n </mat-form-field> -->\n\n <!-- Upload Box -->\n <div\n class=\"file-upload-box\"\n style=\"margin-top: 30px;\"\n [class.disabled]=\"totalFileCount >= MAX_FILES\"\n (click)=\"totalFileCount < MAX_FILES && fileInput.click()\"\n >\n <input\n type=\"file\"\n #fileInput\n hidden\n multiple\n accept=\".pdf,.doc,.docx\"\n (change)=\"onFileSelected($event)\"\n >\n\n <p *ngIf=\"totalFileCount < MAX_FILES\">\n Click to select files\n </p>\n\n <p *ngIf=\"totalFileCount >= MAX_FILES\" class=\"error-text\">\n Maximum 10 documents allowed\n </p>\n\n <p><strong>Note:</strong> <small>PDF Files Only (Max:25 MB)</small></p>\n </div>\n\n <!-- Selected Files List -->\n <div *ngIf=\"selectedFiles.length > 0\" class=\"file-list\" style=\"margin-top:10px\">\n <p><strong>Selected Files</strong></p>\n\n <div class=\"file-item\" *ngFor=\"let file of selectedFiles; let i = index\">\n <span>{{ file.name }}</span>\n <span (click)=\"removeFile(i)\">\n <mat-icon class=\"file-cross-icon\" matTooltip=\"Remove\" matTooltipPosition=\"above\">close</mat-icon>\n </span>\n </div>\n </div>\n\n</mat-dialog-content>\n\n<div class=\"disclaimer-text\">\n <p>Disclaimer: Please do not upload any confidential documents.</p>\n</div>\n\n<mat-dialog-actions align=\"center\" style=\"margin: 20px 0;\">\n <button mat-button mat-dialog-close>Cancel</button>\n\n <button class=\"primary-btn cursor-pointer\"\n mat-raised-button\n color=\"primary\"\n (click)=\"upload()\"\n [disabled]=\"selectedFiles.length === 0\"\n >\n Upload\n </button>\n</mat-dialog-actions>\n\n<div class=\"overlay-loader\" *ngIf=\"loading\">\n <mat-spinner diameter=\"50\"></mat-spinner>\n</div>\n", styles: [".file-upload-box{border:2px dashed #ccc;padding:20px;text-align:center;cursor:pointer;margin-top:10px}.primary-btn{background-color:#1b4ca1;color:#fff}.disclaimer-text p{font-size:16px;font-family:Lato;font-weight:400;margin-left:24px}.file-cross-icon{height:24px;width:24px;vertical-align:middle;background:#d3d3d3;margin-left:10px;border-radius:25px}:host .mat-mdc-dialog-content{max-height:100vh!important}.cursor-pointer{cursor:pointer}\n"] }]
185
+ }], ctorParameters: function () { return [{ type: i1.MatDialogRef }, { type: i2.SharedService }, { type: i3.MatSnackBar }, { type: i1.MatDialog }]; } });
186
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBsb2FkLWRpYWxvZy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJyYXJ5L3N1bmJpcmQtY2IvY2JwLWFpL3NyYy9saWIvbW9kdWxlcy91cGxvYWQtZG9jdW1lbnQtcGFnZS91cGxvYWQtZGlhbG9nL3VwbG9hZC1kaWFsb2cuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL2NicC1haS9zcmMvbGliL21vZHVsZXMvdXBsb2FkLWRvY3VtZW50LXBhZ2UvdXBsb2FkLWRpYWxvZy91cGxvYWQtZGlhbG9nLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFLMUMsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sOENBQThDLENBQUM7QUFDdkYsT0FBTyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDMUMsT0FBTyxFQUFPLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7Ozs7O0FBTTNFLE1BQU0sT0FBTyxxQkFBcUI7SUFVaEMsWUFDUyxTQUE4QyxFQUM5QyxhQUE0QixFQUM1QixRQUFxQixFQUNyQixNQUFpQjtRQUhqQixjQUFTLEdBQVQsU0FBUyxDQUFxQztRQUM5QyxrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUM1QixhQUFRLEdBQVIsUUFBUSxDQUFhO1FBQ3JCLFdBQU0sR0FBTixNQUFNLENBQVc7UUFaakIsY0FBUyxHQUFHLEVBQUUsQ0FBQztRQUV4QixpQkFBWSxHQUFHLEVBQUUsQ0FBQztRQUNsQixrQkFBYSxHQUFXLEVBQUUsQ0FBQztRQUMzQixnQkFBVyxHQUFRLEVBQUUsQ0FBQztRQUN0QixZQUFPLEdBQUcsS0FBSyxDQUFDO1FBQ2hC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QUF1QixDQUFDO2dCQUMvRixVQUFVLENBQUMsR0FBRyxFQUFFO29CQUNkLG9CQUFvQixDQUFDLEtBQUssRUFBRSxDQUFDO29CQUM3QixJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDaEMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ1YsQ0FBQztZQUNELEtBQUssRUFBRSxHQUFHLEVBQUU7Z0JBQ1Ysb0JBQW9CLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQzdCLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2hDLENBQUM7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDOytHQTlOVSxxQkFBcUI7bUdBQXJCLHFCQUFxQix5RENibEMsNmlFQTBFQTs7NEZEN0RhLHFCQUFxQjtrQkFMakMsU0FBUzsrQkFDRSxtQkFBbUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1hdERpYWxvZ1JlZiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5pbXBvcnQgeyBTaGFyZWRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2hhcmVkL3NlcnZpY2VzL3NoYXJlZC5zZXJ2aWNlJztcbmltcG9ydCB7IE1hdFNuYWNrQmFyIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc25hY2stYmFyJztcbmltcG9ydCB7IE1hdERpYWxvZyB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5pbXBvcnQgeyBQcm9ncmVzc0RpYWxvZ0NvbXBvbmVudCB9IGZyb20gJy4uL3Byb2dyZXNzLWRpYWxvZy9wcm9ncmVzcy1kaWFsb2cuY29tcG9uZW50JztcbmltcG9ydCB7IGludGVydmFsLCBmb3JrSm9pbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwLCBzdGFydFdpdGgsIHN3aXRjaE1hcCwgdGFrZVdoaWxlLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtdXBsb2FkLWRpYWxvZycsXG4gIHRlbXBsYXRlVXJsOiAnLi91cGxvYWQtZGlhbG9nLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vdXBsb2FkLWRpYWxvZy5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIFVwbG9hZERpYWxvZ0NvbXBvbmVudCB7XG5cbiAgcmVhZG9ubHkgTUFYX0ZJTEVTID0gMTA7XG5cbiAgZG9jdW1lbnROYW1lID0gJyc7XG4gIHNlbGVjdGVkRmlsZXM6IEZpbGVbXSA9IFtdO1xuICBjYnBGaW5hbE9iajogYW55ID0ge307XG4gIGxvYWRpbmcgPSBmYWxzZTtcbiAgdXBsb2FkZWRGaWxlRGF0YTogYW55ID0ge307XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGRpYWxvZ1JlZjogTWF0RGlhbG9nUmVmPFVwbG9hZERpYWxvZ0NvbXBvbmVudD4sXG4gICAgcHVibGljIHNoYXJlZFNlcnZpY2U6IFNoYXJlZFNlcnZpY2UsXG4gICAgcHVibGljIHNuYWNrQmFyOiBNYXRTbmFja0JhcixcbiAgICBwdWJsaWMgZGlhbG9nOiBNYXREaWFsb2dcbiAgKSB7XG4gICAgdGhpcy5jYnBGaW5hbE9iaiA9IHRoaXMuc2hhcmVkU2VydmljZS5nZXRDQlBQbGFuTG9jYWxTdG9yYWdlKCk7XG4gIH1cblxuICAvKiogQWxyZWFkeSB1cGxvYWRlZCBmaWxlcyBjb3VudCAqL1xuICBnZXQgdXBsb2FkZWRDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmNicEZpbmFsT2JqPy5kb2N1bWVudHM/Lmxlbmd0aCB8fCAwO1xuICB9XG5cbiAgLyoqIFVwbG9hZGVkICsgbmV3bHkgc2VsZWN0ZWQgKi9cbiAgZ2V0IHRvdGFsRmlsZUNvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMudXBsb2FkZWRDb3VudCArIHRoaXMuc2VsZWN0ZWRGaWxlcy5sZW5ndGg7XG4gIH1cblxuICBvbkZpbGVTZWxlY3RlZChldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBpbnB1dCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgIGlmICghaW5wdXQuZmlsZXMpIHJldHVybjtcblxuICAgIGNvbnN0IGZpbGVzID0gQXJyYXkuZnJvbShpbnB1dC5maWxlcyk7XG4gICAgY29uc3QgYWxsb3dlZEV4dGVuc2lvbnMgPSBbJ3BkZicsICdkb2MnLCAnZG9jeCddO1xuXG4gICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICBpZiAodGhpcy50b3RhbEZpbGVDb3VudCA+PSB0aGlzLk1BWF9GSUxFUykge1xuICAgICAgICB0aGlzLnNuYWNrQmFyLm9wZW4oJ1lvdSBjYW4gdXBsb2FkIGEgbWF4aW11bSBvZiAxMCBkb2N1bWVudHMuJywgJ1gnLCB7XG4gICAgICAgICAgZHVyYXRpb246IDMwMDAsXG4gICAgICAgICAgcGFuZWxDbGFzczogWydzbmFja2Jhci1lcnJvciddXG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgY29uc3QgZXh0ID0gZmlsZS5uYW1lLnNwbGl0KCcuJykucG9wKCk/LnRvTG93ZXJDYXNlKCk7XG4gICAgICBpZiAoIWV4dCB8fCAhYWxsb3dlZEV4dGVuc2lvbnMuaW5jbHVkZXMoZXh0KSkge1xuICAgICAgICB0aGlzLnNuYWNrQmFyLm9wZW4oXG4gICAgICAgICAgYEludmFsaWQgZmlsZSB0eXBlOiAke2ZpbGUubmFtZX1gLFxuICAgICAgICAgICdYJyxcbiAgICAgICAgICB7IGR1cmF0aW9uOiAzMDAwLCBwYW5lbENsYXNzOiBbJ3NuYWNrYmFyLWVycm9yJ10gfVxuICAgICAgICApO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gUHJldmVudCBkdXBsaWNhdGUgc2VsZWN0aW9uXG4gICAgICBpZiAodGhpcy5zZWxlY3RlZEZpbGVzLnNvbWUoZiA9PiBmLm5hbWUgPT09IGZpbGUubmFtZSAmJiBmLnNpemUgPT09IGZpbGUuc2l6ZSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc2VsZWN0ZWRGaWxlcy5wdXNoKGZpbGUpO1xuICAgIH1cblxuICAgIC8vIFJlc2V0IGlucHV0IHNvIHNhbWUgZmlsZSBjYW4gYmUgcmUtc2VsZWN0ZWRcbiAgICBpbnB1dC52YWx1ZSA9ICcnO1xuICB9XG5cbiAgcmVtb3ZlRmlsZShpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3RlZEZpbGVzLnNwbGljZShpbmRleCwgMSk7XG4gIH1cblxuICAvLyB1cGxvYWQoKTogdm9pZCB7XG4gIC8vICAgaWYgKCF0aGlzLmRvY3VtZW50TmFtZSB8fCB0aGlzLnNlbGVjdGVkRmlsZXMubGVuZ3RoID09PSAwKSB7XG4gIC8vICAgICByZXR1cm47XG4gIC8vICAgfVxuXG4gIC8vICAgaWYgKHRoaXMudG90YWxGaWxlQ291bnQgPiB0aGlzLk1BWF9GSUxFUykge1xuICAvLyAgICAgdGhpcy5zbmFja0Jhci5vcGVuKCdNYXhpbXVtIDEwIGRvY3VtZW50cyBhbGxvd2VkLicsICdYJywge1xuICAvLyAgICAgICBkdXJhdGlvbjogMzAwMCxcbiAgLy8gICAgICAgcGFuZWxDbGFzczogWydzbmFja2Jhci1lcnJvciddXG4gIC8vICAgICB9KTtcbiAgLy8gICAgIHJldHVybjtcbiAgLy8gICB9XG5cbiAgLy8gICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuXG4gIC8vICAgY29uc3QgdXBsb2FkTmV4dCA9IChpbmRleDogbnVtYmVyKSA9PiB7XG4gIC8vICAgICBpZiAoaW5kZXggPj0gdGhpcy5zZWxlY3RlZEZpbGVzLmxlbmd0aCkge1xuICAvLyAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgLy8gICAgICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UoJ2Nsb3NlJyk7XG4gIC8vICAgICAgIHJldHVybjtcbiAgLy8gICAgIH1cblxuICAvLyAgICAgY29uc3QgZmlsZSA9IHRoaXMuc2VsZWN0ZWRGaWxlc1tpbmRleF07XG5cbiAgLy8gICAgIGNvbnN0IHJlcUJvZHkgPSB7XG4gIC8vICAgICAgIHN0YXRlX2NlbnRlcl9pZDogdGhpcy5jYnBGaW5hbE9iaj8ubWluaXN0cnk/LmlkZW50aWZpZXIsXG4gIC8vICAgICAgIGRlcGFydG1lbnRfaWQ6IHRoaXMuY2JwRmluYWxPYmo/LmRlcGFydG1lbnRzLFxuICAvLyAgICAgICBkb2N1bWVudE5hbWU6IHRoaXMuZG9jdW1lbnROYW1lXG4gIC8vICAgICB9O1xuXG4gIC8vICAgICB0aGlzLnNoYXJlZFNlcnZpY2UudXBsb2FkRG9jdW1lbnQocmVxQm9keSwgZmlsZSkuc3Vic2NyaWJlKHtcbiAgLy8gICAgICAgbmV4dDogKHJlcykgPT4ge1xuICAvLyAgICAgICAgIHRoaXMudXBsb2FkZWRGaWxlRGF0YSA9IHJlcztcbiAgLy8gICAgICAgICB0aGlzLnRyaWdnZXJGaWxlU3VtbWFyeSgpO1xuICAvLyAgICAgICAgIHVwbG9hZE5leHQoaW5kZXggKyAxKTtcbiAgLy8gICAgICAgfSxcbiAgLy8gICAgICAgZXJyb3I6IChlcnIpID0+IHtcbiAgLy8gICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgLy8gICAgICAgICB0aGlzLnNuYWNrQmFyLm9wZW4oXG4gIC8vICAgICAgICAgICBlcnI/LmVycm9yPy5kZXRhaWwgfHwgJ1VwbG9hZCBmYWlsZWQnLFxuICAvLyAgICAgICAgICAgJ1gnLFxuICAvLyAgICAgICAgICAgeyBkdXJhdGlvbjogMzAwMCwgcGFuZWxDbGFzczogWydzbmFja2Jhci1lcnJvciddIH1cbiAgLy8gICAgICAgICApO1xuICAvLyAgICAgICB9XG4gIC8vICAgICB9KTtcbiAgLy8gICB9O1xuXG4gIC8vICAgdXBsb2FkTmV4dCgwKTtcbiAgLy8gfVxuXG4gIHVwbG9hZCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZEZpbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgXG4gICAgaWYgKHRoaXMudG90YWxGaWxlQ291bnQgPiB0aGlzLk1BWF9GSUxFUykge1xuICAgICAgdGhpcy5zbmFja0Jhci5vcGVuKCdNYXhpbXVtIDEwIGRvY3VtZW50cyBhbGxvd2VkLicsICdYJywge1xuICAgICAgICBkdXJhdGlvbjogMzAwMCxcbiAgICAgICAgcGFuZWxDbGFzczogWydzbmFja2Jhci1lcnJvciddXG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIFxuICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7XG4gIFxuICAgIC8vIFJlcXVpcmVkIGZpZWxkc1xuICAgIGZvcm1EYXRhLmFwcGVuZChcbiAgICAgICdzdGF0ZV9jZW50ZXJfaWQnLFxuICAgICAgdGhpcy5jYnBGaW5hbE9iaj8ubWluaXN0cnk/LmlkZW50aWZpZXIgfHwgJydcbiAgICApO1xuICBcbiAgICBmb3JtRGF0YS5hcHBlbmQoXG4gICAgICAnZGVwYXJ0bWVudF9pZCcsXG4gICAgICB0aGlzLmNicEZpbmFsT2JqPy5kZXBhcnRtZW50cyB8fCAnJ1xuICAgICk7XG4gIFxuICAgIC8vIEFwcGVuZCBtdWx0aXBsZSBmaWxlcyB3aXRoIFNBTUUga2V5IFwiZmlsZXNcIlxuICAgIHRoaXMuc2VsZWN0ZWRGaWxlcy5mb3JFYWNoKChmaWxlOiBGaWxlKSA9PiB7XG4gICAgICBmb3JtRGF0YS5hcHBlbmQoJ2ZpbGVzJywgZmlsZSwgZmlsZS5uYW1lKTtcbiAgICB9KTtcbiAgXG4gICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcbiAgXG4gICAgdGhpcy5zaGFyZWRTZXJ2aWNlLnVwbG9hZERvY3VtZW50KGZvcm1EYXRhKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlcykgPT4ge1xuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy51cGxvYWRlZEZpbGVEYXRhID0gcmVzO1xuICAgICAgICB0aGlzLnRyaWdnZXJGaWxlU3VtbWFyeSgpO1xuICAgICAgICB0aGlzLnNuYWNrQmFyLm9wZW4ocmVzPy5tZXNzYWdlLCAnWCcsIHtcbiAgICAgICAgICBkdXJhdGlvbjogMzAwMCxcbiAgICAgICAgICBwYW5lbENsYXNzOiBbJ3NuYWNrYmFyLXN1Y2Nlc3MnXVxuICAgICAgICB9KTtcbiAgXG4gICAgICAgIFxuICAgICAgfSxcbiAgICAgIGVycm9yOiAoZXJyb3IpID0+IHtcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gIFxuICAgICAgICB0aGlzLnNuYWNrQmFyLm9wZW4oXG4gICAgICAgICAgZXJyb3I/LmVycm9yPy5kZXRhaWwgfHwgJ1VwbG9hZCBmYWlsZWQnLFxuICAgICAgICAgICdYJyxcbiAgICAgICAgICB7IGR1cmF0aW9uOiAzMDAwLCBwYW5lbENsYXNzOiBbJ3NuYWNrYmFyLWVycm9yJ10gfVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIFxuXG5cbiAgdHJpZ2dlckZpbGVTdW1tYXJ5KCkge1xuICAgIGlmICghdGhpcy51cGxvYWRlZEZpbGVEYXRhPy5zdWNjZXNzZnVsX3VwbG9hZHM/Lmxlbmd0aCkgcmV0dXJuO1xuICBcbiAgICBjb25zdCBmaWxlcyA9IHRoaXMudXBsb2FkZWRGaWxlRGF0YS5zdWNjZXNzZnVsX3VwbG9hZHM7XG4gICAgY29uc3QgdG90YWxGaWxlcyA9IGZpbGVzLmxlbmd0aDtcbiAgXG4gICAgY29uc3QgZGlhbG9nUmVmRm9yUHJvZ3Jlc3MgPSB0aGlzLmRpYWxvZy5vcGVuKFByb2dyZXNzRGlhbG9nQ29tcG9uZW50LCB7XG4gICAgICBkaXNhYmxlQ2xvc2U6IHRydWUsXG4gICAgICBkYXRhOiB7IHByb2dyZXNzOiAwLCBtZXNzYWdlOiBgUHJvY2Vzc2luZyAwIG9mICR7dG90YWxGaWxlc30gc3VtbWFyaWVzLi4uYCB9XG4gICAgfSk7XG4gIFxuICAgIGxldCBjb21wbGV0ZWRGaWxlcyA9IDA7XG4gIFxuICAgIGNvbnN0IHBvbGxpbmdSZXF1ZXN0cyA9IGZpbGVzLm1hcChmaWxlID0+XG4gICAgICBpbnRlcnZhbCg1MDAwKS5waXBlKFxuICAgICAgICBzdGFydFdpdGgoMCksIC8vIHRyaWdnZXIgaW1tZWRpYXRlbHlcbiAgICAgICAgc3dpdGNoTWFwKCgpID0+IHRoaXMuc2hhcmVkU2VydmljZS50cmlnZ2VyRmlsZVN1bW1hcnkoZmlsZS5maWxlX2lkKSksIC8vIG11c3QgcmV0dXJuIHsgc3VtbWFyeV9zdGF0dXMgfVxuICAgICAgICB0YXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgICAgaWYgKHJlcy5zdW1tYXJ5X3N0YXR1cyA9PT0gJ0NPTVBMRVRFRCcpIHtcbiAgICAgICAgICAgIGNvbXBsZXRlZEZpbGVzKys7XG4gICAgICAgICAgICBkaWFsb2dSZWZGb3JQcm9ncmVzcy5jb21wb25lbnRJbnN0YW5jZS5kYXRhLnByb2dyZXNzID0gTWF0aC5mbG9vcigoY29tcGxldGVkRmlsZXMgLyB0b3RhbEZpbGVzKSAqIDEwMCk7XG4gICAgICAgICAgICBkaWFsb2dSZWZGb3JQcm9ncmVzcy5jb21wb25lbnRJbnN0YW5jZS5kYXRhLm1lc3NhZ2UgPSBgUHJvY2Vzc2luZyAke2NvbXBsZXRlZEZpbGVzfSBvZiAke3RvdGFsRmlsZXN9IHN1bW1hcmllcy4uLmA7XG4gICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICAgICAgdGFrZVdoaWxlKChyZXM6IGFueSkgPT4gcmVzLnN1bW1hcnlfc3RhdHVzICE9PSAnQ09NUExFVEVEJywgdHJ1ZSlcbiAgICAgIClcbiAgICApO1xuICBcbiAgICBmb3JrSm9pbihwb2xsaW5nUmVxdWVzdHMpLnN1YnNjcmliZSh7XG4gICAgICBjb21wbGV0ZTogKCkgPT4ge1xuICAgICAgICBkaWFsb2dSZWZGb3JQcm9ncmVzcy5jb21wb25lbnRJbnN0YW5jZS5kYXRhLnByb2dyZXNzID0gMTAwO1xuICAgICAgICBkaWFsb2dSZWZGb3JQcm9ncmVzcy5jb21wb25lbnRJbnN0YW5jZS5kYXRhLm1lc3NhZ2UgPSBgQWxsICR7dG90YWxGaWxlc30gc3VtbWFyaWVzIGNvbXBsZXRlZCFgO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBkaWFsb2dSZWZGb3JQcm9ncmVzcy5jbG9zZSgpO1xuICAgICAgICAgIHRoaXMuZGlhbG9nUmVmLmNsb3NlKCdjbG9zZScpO1xuICAgICAgICB9LCA1MDApO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoKSA9PiB7XG4gICAgICAgIGRpYWxvZ1JlZkZvclByb2dyZXNzLmNsb3NlKCk7XG4gICAgICAgIHRoaXMuZGlhbG9nUmVmLmNsb3NlKCdjbG9zZScpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIFxuXG5cbn1cbiIsIjxoMiBtYXQtZGlhbG9nLXRpdGxlPlVwbG9hZCBEb2N1bWVudDwvaDI+XG5cbjxtYXQtZGlhbG9nLWNvbnRlbnQ+XG5cbiAgPCEtLSA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cImZpbGxcIiBzdHlsZT1cIndpZHRoOiAxMDAlOyBib3JkZXI6IDFweCBzb2xpZCAjMDAwO1wiPlxuICAgIDxpbnB1dFxuICAgICAgbWF0SW5wdXRcbiAgICAgIFsobmdNb2RlbCldPVwiZG9jdW1lbnROYW1lXCJcbiAgICAgIHBsYWNlaG9sZGVyPVwiRG9jdW1lbnQgTmFtZVwiXG4gICAgICBbZGlzYWJsZWRdPVwidG90YWxGaWxlQ291bnQgPj0gTUFYX0ZJTEVTXCJcbiAgICA+XG4gIDwvbWF0LWZvcm0tZmllbGQ+IC0tPlxuXG4gIDwhLS0gVXBsb2FkIEJveCAtLT5cbiAgPGRpdlxuICAgIGNsYXNzPVwiZmlsZS11cGxvYWQtYm94XCJcbiAgICBzdHlsZT1cIm1hcmdpbi10b3A6IDMwcHg7XCJcbiAgICBbY2xhc3MuZGlzYWJsZWRdPVwidG90YWxGaWxlQ291bnQgPj0gTUFYX0ZJTEVTXCJcbiAgICAoY2xpY2spPVwidG90YWxGaWxlQ291bnQgPCBNQVhfRklMRVMgJiYgZmlsZUlucHV0LmNsaWNrKClcIlxuICA+XG4gICAgPGlucHV0XG4gICAgICB0eXBlPVwiZmlsZVwiXG4gICAgICAjZmlsZUlucHV0XG4gICAgICBoaWRkZW5cbiAgICAgIG11bHRpcGxlXG4gICAgICBhY2NlcHQ9XCIucGRmLC5kb2MsLmRvY3hcIlxuICAgICAgKGNoYW5nZSk9XCJvbkZpbGVTZWxlY3RlZCgkZXZlbnQpXCJcbiAgICA+XG5cbiAgICA8cCAqbmdJZj1cInRvdGFsRmlsZUNvdW50IDwgTUFYX0ZJTEVTXCI+XG4gICAgICBDbGljayB0byBzZWxlY3QgZmlsZXNcbiAgICA8L3A+XG5cbiAgICA8cCAqbmdJZj1cInRvdGFsRmlsZUNvdW50ID49IE1BWF9GSUxFU1wiIGNsYXNzPVwiZXJyb3ItdGV4dFwiPlxuICAgICAgTWF4aW11bSAxMCBkb2N1bWVudHMgYWxsb3dlZFxuICAgIDwvcD5cblxuICAgIDxwPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gPHNtYWxsPlBERiBGaWxlcyBPbmx5IChNYXg6MjUgTUIpPC9zbWFsbD48L3A+XG4gIDwvZGl2PlxuXG4gIDwhLS0gU2VsZWN0ZWQgRmlsZXMgTGlzdCAtLT5cbiAgPGRpdiAqbmdJZj1cInNlbGVjdGVkRmlsZXMubGVuZ3RoID4gMFwiIGNsYXNzPVwiZmlsZS1saXN0XCIgc3R5bGU9XCJtYXJnaW4tdG9wOjEwcHhcIj5cbiAgICA8cD48c3Ryb25nPlNlbGVjdGVkIEZpbGVzPC9zdHJvbmc+PC9wPlxuXG4gICAgPGRpdiBjbGFzcz1cImZpbGUtaXRlbVwiICpuZ0Zvcj1cImxldCBmaWxlIG9mIHNlbGVjdGVkRmlsZXM7IGxldCBpID0gaW5kZXhcIj5cbiAgICAgIDxzcGFuPnt7IGZpbGUubmFtZSB9fTwvc3Bhbj5cbiAgICAgIDxzcGFuIChjbGljayk9XCJyZW1vdmVGaWxlKGkpXCI+XG4gICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImZpbGUtY3Jvc3MtaWNvblwiIG1hdFRvb2x0aXA9XCJSZW1vdmVcIiBtYXRUb29sdGlwUG9zaXRpb249XCJhYm92ZVwiPmNsb3NlPC9tYXQtaWNvbj5cbiAgICAgIDwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbjwvbWF0LWRpYWxvZy1jb250ZW50PlxuXG48ZGl2IGNsYXNzPVwiZGlzY2xhaW1lci10ZXh0XCI+XG4gIDxwPkRpc2NsYWltZXI6IFBsZWFzZSBkbyBub3QgdXBsb2FkIGFueSBjb25maWRlbnRpYWwgZG9jdW1lbnRzLjwvcD5cbjwvZGl2PlxuXG48bWF0LWRpYWxvZy1hY3Rpb25zIGFsaWduPVwiY2VudGVyXCIgc3R5bGU9XCJtYXJnaW46IDIwcHggMDtcIj5cbiAgPGJ1dHRvbiBtYXQtYnV0dG9uIG1hdC1kaWFsb2ctY2xvc2U+Q2FuY2VsPC9idXR0b24+XG5cbiAgPGJ1dHRvbiBjbGFzcz1cInByaW1hcnktYnRuIGN1cnNvci1wb2ludGVyXCJcbiAgICBtYXQtcmFpc2VkLWJ1dHRvblxuICAgIGNvbG9yPVwicHJpbWFyeVwiXG4gICAgKGNsaWNrKT1cInVwbG9hZCgpXCJcbiAgICBbZGlzYWJsZWRdPVwic2VsZWN0ZWRGaWxlcy5sZW5ndGggPT09IDBcIlxuICA+XG4gICAgVXBsb2FkXG4gIDwvYnV0dG9uPlxuPC9tYXQtZGlhbG9nLWFjdGlvbnM+XG5cbjxkaXYgY2xhc3M9XCJvdmVybGF5LWxvYWRlclwiICpuZ0lmPVwibG9hZGluZ1wiPlxuICA8bWF0LXNwaW5uZXIgZGlhbWV0ZXI9XCI1MFwiPjwvbWF0LXNwaW5uZXI+XG48L2Rpdj5cbiJdfQ==