@unifylib/ui-lib 1.0.3 → 1.0.65

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 (265) hide show
  1. package/esm2022/iq-ui-lib.mjs +5 -0
  2. package/esm2022/lib/base-model/SearchStrConfig.mjs +11 -0
  3. package/esm2022/lib/base-model/api-response.mjs +2 -0
  4. package/esm2022/lib/base-model/audit-log-entry.mjs +3 -0
  5. package/esm2022/lib/base-model/button-action-settings.mjs +17 -0
  6. package/esm2022/lib/base-model/column-def.model.mjs +28 -0
  7. package/esm2022/lib/base-model/do-action-request.mjs +8 -0
  8. package/esm2022/lib/base-model/field-action.mjs +6 -0
  9. package/esm2022/lib/base-model/field-filter.model.mjs +3 -0
  10. package/esm2022/lib/base-model/field-info.mjs +64 -0
  11. package/esm2022/lib/base-model/field-predicate.model.mjs +10 -0
  12. package/esm2022/lib/base-model/filter-request.mjs +13 -0
  13. package/esm2022/lib/base-model/filter.model.mjs +25 -0
  14. package/esm2022/lib/base-model/get-items-list.mjs +10 -0
  15. package/esm2022/lib/base-model/index.mjs +13 -0
  16. package/esm2022/lib/base-model/items-total.model.mjs +8 -0
  17. package/esm2022/lib/base-model/line-item.model.mjs +12 -0
  18. package/esm2022/lib/base-model/lookupItem.mjs +16 -0
  19. package/esm2022/lib/base-model/page-info.mjs +17 -0
  20. package/esm2022/lib/base-model/permission-matrix.model.mjs +2 -0
  21. package/esm2022/lib/base-model/report-request.model.mjs +17 -0
  22. package/esm2022/lib/base-model/response-envelop.model.mjs +10 -0
  23. package/esm2022/lib/base-model/snack-message.model.mjs +11 -0
  24. package/esm2022/lib/base-model/table-column.interface.mjs +2 -0
  25. package/esm2022/lib/base-model/table-page-user-action.interface.mjs +21 -0
  26. package/esm2022/lib/base-model/workflow/workflow-steps.model.mjs +9 -0
  27. package/esm2022/lib/base-model/workflow/workflow.model.mjs +42 -0
  28. package/esm2022/lib/components/action-comment/action-comment.component.mjs +111 -0
  29. package/esm2022/lib/components/action-confirmation/action-confirmation.component.mjs +68 -0
  30. package/esm2022/lib/components/activity-report-form/activity-report-form.component.mjs +486 -0
  31. package/esm2022/lib/components/advanced-filter/field-filter/field-filter.component.mjs +44 -0
  32. package/esm2022/lib/components/advanced-filter/filter-builder/filter-builder.component.mjs +323 -0
  33. package/esm2022/lib/components/audit-log-details-dialog/audit-log-details-dialog.component.mjs +70 -0
  34. package/esm2022/lib/components/audit-log-list/audit-log.component.mjs +97 -0
  35. package/esm2022/lib/components/auto-complete/auto-complete.component.mjs +300 -0
  36. package/esm2022/lib/components/base-form/base-form.component.mjs +284 -0
  37. package/esm2022/lib/components/base-form-canvas/MaxDigitsDirective.mjs +29 -0
  38. package/esm2022/lib/components/base-form-canvas/NumbersOnlyDirective.mjs +132 -0
  39. package/esm2022/lib/components/base-form-canvas/base-form-canvas.component.mjs +789 -0
  40. package/esm2022/lib/components/base-input-dialog/base-input-dialog.component.mjs +72 -0
  41. package/esm2022/lib/components/base-table/base-table.component.mjs +708 -0
  42. package/esm2022/lib/components/button-actions/button-actions.component.mjs +101 -0
  43. package/esm2022/lib/components/editable-base-table/editable-base-table.component.mjs +507 -0
  44. package/esm2022/lib/components/equation-builder/equation-builder.component.mjs +117 -0
  45. package/esm2022/lib/components/item-line-editor/item-line-editor.component.mjs +322 -0
  46. package/esm2022/lib/components/multi-auto-complete/multi-auto-complete.component.mjs +294 -0
  47. package/esm2022/lib/components/paginator/paginator.component.mjs +181 -0
  48. package/esm2022/lib/components/permission-matrix/permission-matrix.component.mjs +129 -0
  49. package/esm2022/lib/components/report-details-dialog/report-details-dialog.component.mjs +102 -0
  50. package/esm2022/lib/components/report-form/report-form.component.mjs +485 -0
  51. package/esm2022/lib/components/search-bar/search-bar.component.mjs +63 -0
  52. package/esm2022/lib/components/section-form-canvas/section-form-canvas.component.mjs +99 -0
  53. package/esm2022/lib/components/shared/action-button/action-button.component.mjs +59 -0
  54. package/esm2022/lib/components/shared/action-card/action-card.component.mjs +93 -0
  55. package/esm2022/lib/components/shared/attachment-uploader/attachment-uploader.component.mjs +74 -0
  56. package/esm2022/lib/components/shared-list/shared-list.component.mjs +47 -0
  57. package/esm2022/lib/components/snackbar-static/snackbar-static.component.mjs +43 -0
  58. package/esm2022/lib/components/title-bar/title-bar.component.mjs +185 -0
  59. package/esm2022/lib/services/backend-service.mjs +241 -0
  60. package/esm2022/lib/services/index.mjs +4 -0
  61. package/esm2022/lib/services/top-panel.mjs +22 -0
  62. package/esm2022/lib/services/trigger-form.service.mjs +17 -0
  63. package/esm2022/lib/utils/base-utils.mjs +101 -0
  64. package/esm2022/lib/validators/date-range-validator.mjs +27 -0
  65. package/esm2022/lib/validators/index.mjs +4 -0
  66. package/esm2022/lib/validators/match-list.validator.mjs +9 -0
  67. package/esm2022/lib/validators/multi-email-validator.mjs +13 -0
  68. package/esm2022/public-api.mjs +30 -0
  69. package/esm2022/unifylib-ui-lib.mjs +5 -0
  70. package/fesm2022/iq-ui-lib.mjs +6713 -0
  71. package/fesm2022/iq-ui-lib.mjs.map +1 -0
  72. package/fesm2022/unifylib-ui-lib.mjs +6713 -0
  73. package/fesm2022/unifylib-ui-lib.mjs.map +1 -0
  74. package/index.d.ts +5 -0
  75. package/lib/base-model/SearchStrConfig.d.ts +8 -0
  76. package/{src/lib/base-model/api-response.ts → lib/base-model/api-response.d.ts} +5 -7
  77. package/lib/base-model/audit-log-entry.d.ts +7 -0
  78. package/lib/base-model/button-action-settings.d.ts +16 -0
  79. package/lib/base-model/column-def.model.d.ts +11 -0
  80. package/lib/base-model/do-action-request.d.ts +10 -0
  81. package/lib/base-model/field-action.d.ts +6 -0
  82. package/lib/base-model/field-filter.model.d.ts +7 -0
  83. package/lib/base-model/field-info.d.ts +59 -0
  84. package/lib/base-model/field-predicate.model.d.ts +7 -0
  85. package/lib/base-model/filter-request.d.ts +15 -0
  86. package/lib/base-model/filter.model.d.ts +22 -0
  87. package/lib/base-model/get-items-list.d.ts +21 -0
  88. package/lib/base-model/index.d.ts +12 -0
  89. package/lib/base-model/items-total.model.d.ts +6 -0
  90. package/lib/base-model/line-item.model.d.ts +10 -0
  91. package/lib/base-model/lookupItem.d.ts +13 -0
  92. package/{src/lib/base-model/page-info.ts → lib/base-model/page-info.d.ts} +26 -24
  93. package/lib/base-model/permission-matrix.model.d.ts +18 -0
  94. package/lib/base-model/report-request.model.d.ts +18 -0
  95. package/lib/base-model/response-envelop.model.d.ts +8 -0
  96. package/lib/base-model/snack-message.model.d.ts +7 -0
  97. package/lib/base-model/table-column.interface.d.ts +31 -0
  98. package/lib/base-model/table-page-user-action.interface.d.ts +14 -0
  99. package/lib/base-model/workflow/workflow-steps.model.d.ts +7 -0
  100. package/lib/base-model/workflow/workflow.model.d.ts +13 -0
  101. package/lib/components/action-comment/action-comment.component.d.ts +35 -0
  102. package/lib/components/action-confirmation/action-confirmation.component.d.ts +27 -0
  103. package/lib/components/activity-report-form/activity-report-form.component.d.ts +93 -0
  104. package/lib/components/advanced-filter/field-filter/field-filter.component.d.ts +21 -0
  105. package/lib/components/advanced-filter/filter-builder/filter-builder.component.d.ts +51 -0
  106. package/lib/components/audit-log-details-dialog/audit-log-details-dialog.component.d.ts +25 -0
  107. package/lib/components/audit-log-list/audit-log.component.d.ts +29 -0
  108. package/lib/components/auto-complete/auto-complete.component.d.ts +52 -0
  109. package/lib/components/base-form/base-form.component.d.ts +59 -0
  110. package/lib/components/base-form-canvas/MaxDigitsDirective.d.ts +7 -0
  111. package/lib/components/base-form-canvas/NumbersOnlyDirective.d.ts +23 -0
  112. package/lib/components/base-form-canvas/base-form-canvas.component.d.ts +142 -0
  113. package/lib/components/base-input-dialog/base-input-dialog.component.d.ts +23 -0
  114. package/lib/components/base-table/base-table.component.d.ts +172 -0
  115. package/lib/components/button-actions/button-actions.component.d.ts +19 -0
  116. package/lib/components/editable-base-table/editable-base-table.component.d.ts +109 -0
  117. package/lib/components/equation-builder/equation-builder.component.d.ts +23 -0
  118. package/lib/components/item-line-editor/item-line-editor.component.d.ts +66 -0
  119. package/lib/components/multi-auto-complete/multi-auto-complete.component.d.ts +53 -0
  120. package/lib/components/paginator/paginator.component.d.ts +41 -0
  121. package/lib/components/permission-matrix/permission-matrix.component.d.ts +26 -0
  122. package/lib/components/report-details-dialog/report-details-dialog.component.d.ts +34 -0
  123. package/lib/components/report-form/report-form.component.d.ts +92 -0
  124. package/lib/components/search-bar/search-bar.component.d.ts +29 -0
  125. package/lib/components/section-form-canvas/section-form-canvas.component.d.ts +32 -0
  126. package/lib/components/shared/action-button/action-button.component.d.ts +17 -0
  127. package/lib/components/shared/action-card/action-card.component.d.ts +37 -0
  128. package/lib/components/shared/attachment-uploader/attachment-uploader.component.d.ts +18 -0
  129. package/lib/components/shared-list/shared-list.component.d.ts +21 -0
  130. package/lib/components/snackbar-static/snackbar-static.component.d.ts +15 -0
  131. package/lib/components/title-bar/title-bar.component.d.ts +54 -0
  132. package/lib/services/backend-service.d.ts +59 -0
  133. package/{src/lib/services/index.ts → lib/services/index.d.ts} +1 -1
  134. package/lib/services/top-panel.d.ts +8 -0
  135. package/lib/services/trigger-form.service.d.ts +7 -0
  136. package/lib/utils/base-utils.d.ts +13 -0
  137. package/lib/validators/date-range-validator.d.ts +2 -0
  138. package/lib/validators/match-list.validator.d.ts +4 -0
  139. package/lib/validators/multi-email-validator.d.ts +6 -0
  140. package/package.json +16 -3
  141. package/public-api.d.ts +26 -0
  142. package/ng-package.json +0 -7
  143. package/src/lib/base-model/SearchStrConfig.ts +0 -12
  144. package/src/lib/base-model/audit-log-entry.ts +0 -7
  145. package/src/lib/base-model/button-action-settings.ts +0 -25
  146. package/src/lib/base-model/column-def.model.ts +0 -34
  147. package/src/lib/base-model/do-action-request.ts +0 -11
  148. package/src/lib/base-model/field-action.ts +0 -7
  149. package/src/lib/base-model/field-filter.model.ts +0 -14
  150. package/src/lib/base-model/field-info.ts +0 -98
  151. package/src/lib/base-model/field-predicate.model.ts +0 -7
  152. package/src/lib/base-model/filter-request.ts +0 -27
  153. package/src/lib/base-model/filter.model.ts +0 -49
  154. package/src/lib/base-model/get-items-list.ts +0 -24
  155. package/src/lib/base-model/index.ts +0 -11
  156. package/src/lib/base-model/lookupItem.ts +0 -21
  157. package/src/lib/base-model/null-snackmessage.ts +0 -9
  158. package/src/lib/base-model/report-request.model.ts +0 -33
  159. package/src/lib/base-model/response-envelop.model.ts +0 -15
  160. package/src/lib/base-model/snack-message.model.ts +0 -14
  161. package/src/lib/base-model/snackmessage-interface.ts +0 -7
  162. package/src/lib/base-model/table-column.interface.ts +0 -29
  163. package/src/lib/base-model/table-page-user-action.interface.ts +0 -33
  164. package/src/lib/base-model/workflow/workflow-steps.model.ts +0 -9
  165. package/src/lib/base-model/workflow/workflow.model.ts +0 -52
  166. package/src/lib/components/action-confirmation/action-confirmation.component.css +0 -34
  167. package/src/lib/components/action-confirmation/action-confirmation.component.html +0 -18
  168. package/src/lib/components/action-confirmation/action-confirmation.component.spec.ts +0 -23
  169. package/src/lib/components/action-confirmation/action-confirmation.component.ts +0 -58
  170. package/src/lib/components/activity-report-form/activity-report-form.component.html +0 -109
  171. package/src/lib/components/activity-report-form/activity-report-form.component.scss +0 -0
  172. package/src/lib/components/activity-report-form/activity-report-form.component.spec.ts +0 -25
  173. package/src/lib/components/activity-report-form/activity-report-form.component.ts +0 -605
  174. package/src/lib/components/audit-log-details-dialog/audit-log-details-dialog.component.css +0 -51
  175. package/src/lib/components/audit-log-details-dialog/audit-log-details-dialog.component.html +0 -23
  176. package/src/lib/components/audit-log-details-dialog/audit-log-details-dialog.component.spec.ts +0 -23
  177. package/src/lib/components/audit-log-details-dialog/audit-log-details-dialog.component.ts +0 -69
  178. package/src/lib/components/audit-log-list/audit-log.component.html +0 -23
  179. package/src/lib/components/audit-log-list/audit-log.component.scss +0 -0
  180. package/src/lib/components/audit-log-list/audit-log.component.spec.ts +0 -25
  181. package/src/lib/components/audit-log-list/audit-log.component.ts +0 -116
  182. package/src/lib/components/auto-complete/auto-complete.component.css +0 -14
  183. package/src/lib/components/auto-complete/auto-complete.component.html +0 -29
  184. package/src/lib/components/auto-complete/auto-complete.component.spec.ts +0 -23
  185. package/src/lib/components/auto-complete/auto-complete.component.ts +0 -330
  186. package/src/lib/components/base-form/base-form.component.html +0 -58
  187. package/src/lib/components/base-form/base-form.component.scss +0 -0
  188. package/src/lib/components/base-form/base-form.component.spec.ts +0 -25
  189. package/src/lib/components/base-form/base-form.component.ts +0 -305
  190. package/src/lib/components/base-form-canvas/base-form-canvas.component.css +0 -22
  191. package/src/lib/components/base-form-canvas/base-form-canvas.component.html +0 -1006
  192. package/src/lib/components/base-form-canvas/base-form-canvas.component.spec.ts +0 -23
  193. package/src/lib/components/base-form-canvas/base-form-canvas.component.ts +0 -573
  194. package/src/lib/components/base-input-dialog/base-input-dialog.component.css +0 -0
  195. package/src/lib/components/base-input-dialog/base-input-dialog.component.html +0 -42
  196. package/src/lib/components/base-input-dialog/base-input-dialog.component.spec.ts +0 -23
  197. package/src/lib/components/base-input-dialog/base-input-dialog.component.ts +0 -78
  198. package/src/lib/components/base-table/base-table.component.html +0 -242
  199. package/src/lib/components/base-table/base-table.component.scss +0 -31
  200. package/src/lib/components/base-table/base-table.component.spec.ts +0 -25
  201. package/src/lib/components/base-table/base-table.component.ts +0 -568
  202. package/src/lib/components/button-actions/button-actions.component.html +0 -28
  203. package/src/lib/components/button-actions/button-actions.component.scss +0 -6
  204. package/src/lib/components/button-actions/button-actions.component.spec.ts +0 -23
  205. package/src/lib/components/button-actions/button-actions.component.ts +0 -72
  206. package/src/lib/components/editable-base-table/editable-base-table.component.html +0 -372
  207. package/src/lib/components/editable-base-table/editable-base-table.component.scss +0 -44
  208. package/src/lib/components/editable-base-table/editable-base-table.component.spec.ts +0 -25
  209. package/src/lib/components/editable-base-table/editable-base-table.component.ts +0 -570
  210. package/src/lib/components/equation-builder/equation-builder.component.css +0 -0
  211. package/src/lib/components/equation-builder/equation-builder.component.html +0 -31
  212. package/src/lib/components/equation-builder/equation-builder.component.spec.ts +0 -23
  213. package/src/lib/components/equation-builder/equation-builder.component.ts +0 -121
  214. package/src/lib/components/multi-auto-complete/multi-auto-complete.component.css +0 -11
  215. package/src/lib/components/multi-auto-complete/multi-auto-complete.component.html +0 -38
  216. package/src/lib/components/multi-auto-complete/multi-auto-complete.component.spec.ts +0 -23
  217. package/src/lib/components/multi-auto-complete/multi-auto-complete.component.ts +0 -317
  218. package/src/lib/components/paginator/paginator.component.css +0 -25
  219. package/src/lib/components/paginator/paginator.component.html +0 -34
  220. package/src/lib/components/paginator/paginator.component.ts +0 -94
  221. package/src/lib/components/rejection-comment/action-comment.component.css +0 -33
  222. package/src/lib/components/rejection-comment/action-comment.component.html +0 -46
  223. package/src/lib/components/rejection-comment/action-comment.component.spec.ts +0 -23
  224. package/src/lib/components/rejection-comment/action-comment.component.ts +0 -86
  225. package/src/lib/components/report-details-dialog/report-details-dialog.component.css +0 -17
  226. package/src/lib/components/report-details-dialog/report-details-dialog.component.html +0 -16
  227. package/src/lib/components/report-details-dialog/report-details-dialog.component.spec.ts +0 -23
  228. package/src/lib/components/report-details-dialog/report-details-dialog.component.ts +0 -113
  229. package/src/lib/components/report-form/report-form.component.html +0 -94
  230. package/src/lib/components/report-form/report-form.component.scss +0 -0
  231. package/src/lib/components/report-form/report-form.component.spec.ts +0 -25
  232. package/src/lib/components/report-form/report-form.component.ts +0 -588
  233. package/src/lib/components/search-bar/search-bar.component.html +0 -62
  234. package/src/lib/components/search-bar/search-bar.component.scss +0 -8
  235. package/src/lib/components/search-bar/search-bar.component.spec.ts +0 -25
  236. package/src/lib/components/search-bar/search-bar.component.ts +0 -70
  237. package/src/lib/components/shared/attachment-uploader/attachment-uploader.component.css +0 -54
  238. package/src/lib/components/shared/attachment-uploader/attachment-uploader.component.html +0 -22
  239. package/src/lib/components/shared/attachment-uploader/attachment-uploader.component.spec.ts +0 -23
  240. package/src/lib/components/shared/attachment-uploader/attachment-uploader.component.ts +0 -45
  241. package/src/lib/components/shared-list/shared-list.component.css +0 -0
  242. package/src/lib/components/shared-list/shared-list.component.html +0 -17
  243. package/src/lib/components/shared-list/shared-list.component.spec.ts +0 -23
  244. package/src/lib/components/shared-list/shared-list.component.ts +0 -53
  245. package/src/lib/components/title-bar/title-bar.component.css +0 -0
  246. package/src/lib/components/title-bar/title-bar.component.css.map +0 -1
  247. package/src/lib/components/title-bar/title-bar.component.html +0 -31
  248. package/src/lib/components/title-bar/title-bar.component.scss +0 -23
  249. package/src/lib/components/title-bar/title-bar.component.spec.ts +0 -23
  250. package/src/lib/components/title-bar/title-bar.component.ts +0 -119
  251. package/src/lib/services/backend-service.ts +0 -286
  252. package/src/lib/services/top-panel.ts +0 -17
  253. package/src/lib/services/trigger-form.service.ts +0 -11
  254. package/src/lib/share-module/shared-module.ts +0 -10
  255. package/src/lib/styles/invoiceq-theme.scss +0 -252
  256. package/src/lib/styles/styles.scss +0 -1723
  257. package/src/lib/utils/base-utils.ts +0 -102
  258. package/src/lib/validators/date-range-validator.ts +0 -31
  259. package/src/lib/validators/match-list.validator.ts +0 -10
  260. package/src/lib/validators/multi-email-validator.ts +0 -15
  261. package/src/public-api.ts +0 -21
  262. package/tsconfig.lib.json +0 -15
  263. package/tsconfig.lib.prod.json +0 -11
  264. package/tsconfig.spec.json +0 -15
  265. /package/{src/lib/validators/index.ts → lib/validators/index.d.ts} +0 -0
@@ -0,0 +1,485 @@
1
+ import { Component, EventEmitter, Input, Output } from '@angular/core';
2
+ import { EMPTY_PAGE_INFO } from "../../base-model/page-info";
3
+ import { TranslateModule } from "@ngx-translate/core";
4
+ import { formatDate, NgForOf, NgIf } from "@angular/common";
5
+ import { MatMenu, MatMenuItem, MatMenuTrigger } from "@angular/material/menu";
6
+ import { MatButton, MatButtonModule } from "@angular/material/button";
7
+ import { BaseTableComponent } from "../base-table/base-table.component";
8
+ import { MatIconModule } from "@angular/material/icon";
9
+ import { FilterRequest } from "../../base-model/filter-request";
10
+ import { ReportRequest } from "../../base-model/report-request.model";
11
+ import { Filter } from "../../base-model/filter.model";
12
+ import { TitleBarComponent } from "../title-bar/title-bar.component";
13
+ import { BaseFormCanvasComponent } from "../base-form-canvas/base-form-canvas.component";
14
+ import { DRILL_DOWN_ACTION, JUNIOR_DOWN_ACTION, SnackMessage } from "../../base-model";
15
+ import { ReportDetailsDialogComponent } from "../report-details-dialog/report-details-dialog.component";
16
+ import { cloneDeep } from 'lodash';
17
+ import { MatTooltip } from "@angular/material/tooltip";
18
+ import * as i0 from "@angular/core";
19
+ import * as i1 from "@ngx-translate/core";
20
+ import * as i2 from "../../services/backend-service";
21
+ import * as i3 from "@angular/router";
22
+ import * as i4 from "@angular/cdk/bidi";
23
+ import * as i5 from "@angular/material/dialog";
24
+ import * as i6 from "@angular/forms";
25
+ import * as i7 from "@angular/material/button";
26
+ import * as i8 from "@angular/material/icon";
27
+ const NON_REPORT_COLUMNS = ['listAction', 'button', 'checkbox'];
28
+ export class ReportFormComponent {
29
+ constructor(translateService, backendService, activatedRoute, injector, router, route, directionality, dialog, fb) {
30
+ this.translateService = translateService;
31
+ this.backendService = backendService;
32
+ this.activatedRoute = activatedRoute;
33
+ this.injector = injector;
34
+ this.router = router;
35
+ this.route = route;
36
+ this.directionality = directionality;
37
+ this.dialog = dialog;
38
+ this.fb = fb;
39
+ this.showDetails = [];
40
+ this.showExtractButton = true;
41
+ this.columns = [];
42
+ this.userAction = new EventEmitter();
43
+ this.activeLevel = 1;
44
+ this.isEditable = true;
45
+ this.fields = [];
46
+ this.pageInfo = EMPTY_PAGE_INFO;
47
+ this.drillDownPageInfo = EMPTY_PAGE_INFO;
48
+ this.drillDownColumns = [];
49
+ this.juniorPageInfo = EMPTY_PAGE_INFO;
50
+ this.juniorColumns = [];
51
+ this.columnsDefinition = [];
52
+ this.types = ["pdf", "csv", "xlsx"];
53
+ this.searchStr = '';
54
+ this.errors = [];
55
+ this.reloadData = false;
56
+ this.backButtonEnabled = true;
57
+ this.reportRequest = new ReportRequest({});
58
+ this.childReportRequest = new ReportRequest({});
59
+ this.juniorReportRequest = new ReportRequest({});
60
+ this.readyToSearch = false;
61
+ this.disableExportAction = false;
62
+ }
63
+ ngOnInit() {
64
+ this.currentDirection = this.directionality.value;
65
+ this.directionality.change.subscribe((value) => {
66
+ this.currentDirection = value;
67
+ });
68
+ this.activatedRoute.data.subscribe(data => {
69
+ this.pageInfo = data['pageInfo'];
70
+ this.pageSize = this.pageInfo.pageSize ?? 10;
71
+ this.filterRequest = new FilterRequest(this.pageSize);
72
+ data['pageInfo'].lazyLoadData = true;
73
+ this.drillDownPageInfo = data['drillDownPageInfo'];
74
+ this.drillDownColumns = data['drillDownColumns']?.filter(c => c.property !== 'selectItem');
75
+ this.hideDrillDownButton = data['hideDrillDownButton'] ?? false;
76
+ this.juniorPageInfo = data['juniorPageInfo'];
77
+ this.juniorColumns = data['juniorColumns'];
78
+ this.columnsDefinition = data['columnsDefinition'].filter(c => (this.drillDownPageInfo && this.drillDownColumns || (!NON_REPORT_COLUMNS.includes(c.type))));
79
+ this.fields = data['fields'];
80
+ if (data['enrichDrillDownReportRequest']) {
81
+ this.enrichDrillDownReportRequest = data['enrichDrillDownReportRequest'](this.injector);
82
+ }
83
+ if (data['enrichJuniorReportRequest']) {
84
+ this.enrichJuniorReportRequest = data['enrichJuniorReportRequest'](this.injector);
85
+ }
86
+ if (data['enrichHyperLinkReportRequest']) {
87
+ this.enrichHyperLinkReportRequest = data['enrichHyperLinkReportRequest'](this.injector);
88
+ }
89
+ });
90
+ this.route.queryParamMap.subscribe(params => {
91
+ const isComparisonReport = params.get('comparisonReport') === 'true';
92
+ if (isComparisonReport) {
93
+ const comparisonStr = sessionStorage.getItem('comparisonReportPageInfo');
94
+ if (comparisonStr) {
95
+ const comparisonData = JSON.parse(comparisonStr);
96
+ this.pageInfo.lazyLoadData = comparisonData.lazyLoadData ?? false;
97
+ this.activeLevel = comparisonData.activeLevel ?? 2;
98
+ this.isEditable = false;
99
+ this.backButtonEnabled = false;
100
+ this.drillDownPageInfo = comparisonData.drillDownPageInfo;
101
+ this.drillDownColumns = comparisonData.drillDownColumns;
102
+ this.reportForm = this.fb.group({
103
+ directorate: [[]],
104
+ fromDate: [''],
105
+ toDate: [''],
106
+ sector: [''],
107
+ });
108
+ this.reportForm.patchValue(comparisonData.form);
109
+ this.fields = this.fields.filter(c => c.type !== 'checkbox');
110
+ const reportRequest = comparisonData.reportRequest;
111
+ this.childReportRequest = this.backendService.buildReportRequest(this.drillDownColumns, `${this.drillDownPageInfo.labelsSection}.${this.drillDownPageInfo.id}`, reportRequest, '', this.drillDownPageInfo, 'LANDSCAPE');
112
+ }
113
+ }
114
+ });
115
+ }
116
+ // ngOnChanges({item, errors, fields}: SimpleChanges): void {
117
+ // // errors?.currentValue?.forEach((msg: FieldMessage) => {
118
+ // // this.backendService.parentForm.get(msg.fieldName)?.setErrors({serverError: msg.message});
119
+ // // });
120
+ // // if (fields?.currentValue && !fields.isFirstChange()){
121
+ // // this.buildForm();
122
+ // // }
123
+ // // this.buildForm();
124
+ // }
125
+ isMatchHeight() {
126
+ return this.pageInfo.pageHeight === 'match';
127
+ }
128
+ doAction(type) {
129
+ if (this.backendService.parentForm.valid) {
130
+ this.reloadData = !this.reloadData;
131
+ const filterRequest = new FilterRequest(this.pageSize);
132
+ filterRequest.filters = [];
133
+ let paramsString = [];
134
+ this.fields.filter(x => x.type !== 'spacer').forEach(f => {
135
+ if (this.getParamValue(f) != null && this.getParamValue(f).toString().trim() !== '') {
136
+ if (f.type === 'multi-select' || f.type === 'lookup') {
137
+ // do not filter if this field as cascading for another one and the other one got selected values
138
+ const childFieldIdx = this.fields.findIndex(field => field.cascadedBy === f.property);
139
+ if (childFieldIdx > -1 && this.backendService.parentForm.get(this.fields[childFieldIdx].property)?.value?.length > 0) {
140
+ return;
141
+ }
142
+ const idz = [];
143
+ const param = [];
144
+ if (this.backendService.parentForm.get(f.property)?.value && Array.isArray(this.backendService.parentForm.get(f.property)?.value)
145
+ && this.backendService.parentForm.get(f.property)?.value.length > 0) {
146
+ this.backendService.parentForm.get(f.property)?.value.forEach((a) => {
147
+ if (f.flattenBySubAttribute) {
148
+ idz.push(a[f.flattenBySubAttribute]);
149
+ param.push(a[f.flattenBySubAttribute]);
150
+ }
151
+ else if (this.fields.find(s => s.property === 'terminalId')) {
152
+ idz.push(a.channelId);
153
+ param.push(a.englishName);
154
+ }
155
+ else {
156
+ idz.push(a.id);
157
+ param.push(a.englishName);
158
+ }
159
+ });
160
+ filterRequest.filters?.push(new Filter({
161
+ id: f.property, fieldName: f.property, label: this.translateService.instant(f.label),
162
+ filterType: 'FILED_FILTER', operator: f.filterOperator,
163
+ valueObject: idz
164
+ }));
165
+ paramsString.push(this.translateService.instant(f.label) + ' : ' + param.join(','));
166
+ }
167
+ else if (this.backendService.parentForm.get(f.property)?.value && f.flattenBySubAttribute) {
168
+ filterRequest.filters?.push(new Filter({
169
+ id: f.property, fieldName: f.property, label: this.translateService.instant(f.label),
170
+ filterType: 'FILED_FILTER', operator: f.filterOperator,
171
+ valueObject: this.getParamValue(f)[f.flattenBySubAttribute]
172
+ }));
173
+ }
174
+ }
175
+ else {
176
+ if (this.backendService.parentForm.get(f.property)?.value !== null &&
177
+ this.backendService.parentForm.get(f.property)?.value !== undefined &&
178
+ this.backendService.parentForm.get(f.property)?.value !== "") {
179
+ filterRequest.filters?.push(new Filter({
180
+ id: f.property, fieldName: f.property, label: this.translateService.instant(f.label),
181
+ filterType: 'FILED_FILTER', operator: f.filterOperator,
182
+ valueObject: this.getParamValue(f)
183
+ }));
184
+ }
185
+ paramsString.push(this.translateService.instant(f.label) + ' : ' + this.getParamValueLabel(f));
186
+ }
187
+ }
188
+ });
189
+ const reportRequest = this.backendService.buildReportRequest(this.columnsDefinition, this.pageInfo.labelsSection + '.' + this.pageInfo.id, filterRequest, type, this.pageInfo, 'LANDSCAPE');
190
+ reportRequest.searchStr = paramsString.join(' , ');
191
+ this.reportRequest = reportRequest;
192
+ // this.activeLevel = 1;
193
+ }
194
+ else {
195
+ this.backendService.topPanelMessage$.next(new SnackMessage('INVALID_REPORT_FORM', true, 'error'));
196
+ }
197
+ }
198
+ getParamValue(f) {
199
+ if (f.type === 'date' && this.backendService.parentForm.get(f.property)?.value) {
200
+ return formatDate(this.backendService.parentForm.get(f.property)?.value, 'yyyy-MM-dd', 'en_US');
201
+ }
202
+ else if (f.type === 'checkbox') {
203
+ return !!this.backendService.parentForm.get(f.property)?.value;
204
+ }
205
+ else {
206
+ return this.backendService.parentForm.get(f.property)?.value;
207
+ }
208
+ }
209
+ getParamValueLabel(f) {
210
+ if (f.type === 'checkbox') {
211
+ return this.backendService.parentForm.get(f.property)?.value ? this.translateService.instant('yes') : this.translateService.instant('no');
212
+ }
213
+ else {
214
+ return this.backendService.parentForm.get(f.property)?.value;
215
+ }
216
+ }
217
+ getTitle() {
218
+ const pageInfoMap = {
219
+ 1: this.pageInfo,
220
+ 2: this.drillDownPageInfo,
221
+ 3: this.juniorPageInfo
222
+ };
223
+ const currentInfo = pageInfoMap[this.activeLevel] || this.pageInfo;
224
+ return `${currentInfo.labelsSection}.${currentInfo.id}`;
225
+ }
226
+ updateForm($event) {
227
+ this.reportForm = $event;
228
+ this.backendService.parentForm = $event;
229
+ this.setupDependentFieldWatchers();
230
+ this.backendService.parentForm.valueChanges.subscribe(x => {
231
+ this.readyToSearch = this.backendService.parentForm.valid;
232
+ });
233
+ }
234
+ setupDependentFieldWatchers() {
235
+ this.fields
236
+ .filter(field => field.lookupFilterList && field.lookupFilterList.length > 0)
237
+ .forEach(field => {
238
+ const dependentFields = field.lookupFilterList.map(f => f.fieldName);
239
+ dependentFields.forEach(dependentFieldName => {
240
+ const dependentControl = this.reportForm.get(dependentFieldName);
241
+ if (dependentControl) {
242
+ dependentControl.valueChanges.subscribe(() => {
243
+ const targetControl = this.reportForm.get(field.property);
244
+ if (targetControl) {
245
+ targetControl.setValue([]);
246
+ }
247
+ });
248
+ }
249
+ });
250
+ });
251
+ }
252
+ isValidForm() {
253
+ return this.readyToSearch;
254
+ }
255
+ emitUserAction($event) {
256
+ $event.pageInfo = this.pageInfo;
257
+ this.doADrillDownAction($event);
258
+ }
259
+ emitHyperLinkAction($event) {
260
+ if (!this.shouldProcessEventItem($event.item))
261
+ return;
262
+ const item = $event.item;
263
+ this.prepareDialogReportRequest(item);
264
+ const reportRequest = this.buildDialogReportRequest();
265
+ reportRequest.filterRequest.pageIndex = 0;
266
+ const dialogRef = this.dialog.open(ReportDetailsDialogComponent, {
267
+ data: {
268
+ pageInfo: this.juniorPageInfo,
269
+ request: reportRequest,
270
+ columns: this.juniorColumns,
271
+ item,
272
+ },
273
+ height: '50vw',
274
+ maxWidth: '120vw',
275
+ direction: this.currentDirection,
276
+ disableClose: false,
277
+ });
278
+ dialogRef.afterOpened().subscribe(() => this.doHyperLinkAction($event));
279
+ dialogRef.afterClosed().subscribe(() => { });
280
+ }
281
+ prepareDialogReportRequest(item) {
282
+ this.dialogReportRequest = cloneDeep(this.reportRequest);
283
+ this.dialogReportRequest.filterRequest = { filters: [] };
284
+ this.addStandardFilters(item);
285
+ this.addOrReplaceFilter('isec1', 'iSec', item['isec_value']);
286
+ this.addFilterType();
287
+ }
288
+ addStandardFilters(item) {
289
+ const standardFilters = [
290
+ { key: 'period', value: item['period'] },
291
+ { key: 'year', value: item['year'] },
292
+ { key: 'sector', value: item['sectorCode'] },
293
+ { key: 'directorate', value: item['directorateCode'] },
294
+ { key: 'subTaxRate', value: item['tax_rate_code'] },
295
+ ];
296
+ standardFilters.forEach(({ key, value }) => this.dialogReportRequest.filterRequest.filters.push(this.createFilter(key, key, value)));
297
+ }
298
+ addFilterType() {
299
+ const isTax = this.dialogReportRequest.actionKey?.toLowerCase().includes('tax');
300
+ const filterType = isTax ? 'TAX' : 'VALUE';
301
+ this.dialogReportRequest.filterRequest.filters.push(this.createFilter('filterType', 'filterType', filterType));
302
+ }
303
+ buildDialogReportRequest() {
304
+ return this.backendService.buildReportRequest(this.juniorColumns, `${this.juniorPageInfo.labelsSection}.${this.juniorPageInfo.id}`, { ...this.dialogReportRequest.filterRequest }, '', this.juniorPageInfo, 'LANDSCAPE');
305
+ }
306
+ createFilter(key, fieldName, value) {
307
+ return new Filter({
308
+ key,
309
+ fieldName,
310
+ label: '',
311
+ filterType: 'FILED_FILTER',
312
+ operator: 'EQUALS',
313
+ valueObject: value,
314
+ });
315
+ }
316
+ addOrReplaceFilter(id, fieldName, value) {
317
+ const filter = new Filter({
318
+ id,
319
+ fieldName,
320
+ label: '',
321
+ filterType: 'FILED_FILTER',
322
+ operator: 'EQUALS',
323
+ valueObject: value,
324
+ });
325
+ const filters = this.dialogReportRequest.filterRequest.filters;
326
+ const existingIndex = filters.findIndex((f) => f.id === id);
327
+ if (existingIndex !== -1) {
328
+ filters.splice(existingIndex, 1, filter);
329
+ }
330
+ else {
331
+ filters.push(filter);
332
+ }
333
+ }
334
+ emitJuniorAction($event) {
335
+ const juniorAction = JUNIOR_DOWN_ACTION;
336
+ juniorAction.pageInfo = this.drillDownPageInfo;
337
+ this.doJuniorAction($event);
338
+ }
339
+ drillDown() {
340
+ const drilldownaction = DRILL_DOWN_ACTION;
341
+ drilldownaction.pageInfo = this.drillDownPageInfo;
342
+ this.doADrillDownAction(drilldownaction);
343
+ }
344
+ doJuniorAction($event) {
345
+ if (this.juniorColumns && this.juniorPageInfo) {
346
+ if (this.enrichJuniorReportRequest) {
347
+ if (this.activeLevel === 2) {
348
+ this.isEditable = false;
349
+ this.disableExportAction = this.juniorPageInfo.hideReportsExtractButton || false;
350
+ this.juniorReportRequest = this.backendService.buildReportRequest(this.juniorColumns, this.juniorPageInfo.labelsSection + '.' + this.juniorPageInfo.id, this.reportRequest.filterRequest, '', this.juniorPageInfo, 'LANDSCAPE');
351
+ this.enrichJuniorReportRequest($event, this.juniorReportRequest);
352
+ }
353
+ }
354
+ this.activeLevel = this.activeLevel + 1;
355
+ }
356
+ }
357
+ doADrillDownAction($event) {
358
+ if (this.drillDownColumns && this.drillDownPageInfo) {
359
+ if (this.enrichDrillDownReportRequest) {
360
+ if (this.activeLevel === 1) {
361
+ this.isEditable = false;
362
+ this.childReportRequest = this.backendService.buildReportRequest(this.drillDownColumns, this.drillDownPageInfo.labelsSection + '.' + this.drillDownPageInfo.id, this.reportRequest.filterRequest, '', this.drillDownPageInfo, 'LANDSCAPE');
363
+ this.disableExportAction = this.drillDownPageInfo.hideReportsExtractButton || false;
364
+ this.enrichDrillDownReportRequest($event, this.childReportRequest);
365
+ }
366
+ }
367
+ this.activeLevel = this.activeLevel + 1;
368
+ }
369
+ }
370
+ doHyperLinkAction($event) {
371
+ if (this.enrichHyperLinkReportRequest) {
372
+ this.juniorReportRequest = this.backendService.buildReportRequest(this.juniorColumns, this.juniorPageInfo.labelsSection + '.' + this.juniorPageInfo.id, this.dialogReportRequest.filterRequest, '', this.juniorPageInfo, 'LANDSCAPE');
373
+ this.disableExportAction = this.juniorPageInfo.hideReportsExtractButton || false;
374
+ this.enrichHyperLinkReportRequest($event, this.juniorReportRequest);
375
+ }
376
+ }
377
+ extractReport(reportType) {
378
+ if (this.activeLevel === 1) {
379
+ this.reportRequest.reportType = reportType;
380
+ this.backendService.downloadReport(this.reportRequest, this.pageInfo.apiUri);
381
+ }
382
+ else if (this.activeLevel === 2) {
383
+ this.childReportRequest.reportType = reportType;
384
+ this.backendService.downloadReport(this.childReportRequest, this.drillDownPageInfo.apiUri);
385
+ }
386
+ else if (this.activeLevel === 3) {
387
+ this.juniorReportRequest.reportType = reportType;
388
+ this.backendService.downloadReport(this.juniorReportRequest, this.juniorPageInfo.apiUri);
389
+ }
390
+ }
391
+ goUp() {
392
+ this.isEditable = true;
393
+ this.activeLevel = this.activeLevel - 1;
394
+ this.doAction(this.x);
395
+ this.reloadData = true;
396
+ if (this.activeLevel > 1) {
397
+ this.isEditable = false;
398
+ }
399
+ this.disableExportAction = false;
400
+ }
401
+ drillDownEnabled() {
402
+ return this.drillDownPageInfo && !this.hideDrillDownButton && !this.getIsEmptyList();
403
+ }
404
+ drillDownLabel() {
405
+ return `${this.pageInfo.labelsSection}.drillDownLabel`;
406
+ }
407
+ getIsEmptyList() {
408
+ return this.backendService.isEmptyItems || this.disableExportAction === true;
409
+ }
410
+ clear() {
411
+ const currentUrl = this.router.url;
412
+ this.router.navigateByUrl('/', { skipLocationChange: true }).then(() => {
413
+ this.router.navigate([currentUrl]);
414
+ });
415
+ // if (this.reportForm) {
416
+ // this.reportForm.reset();
417
+ //
418
+ // this.fields.forEach(field => {
419
+ // if (field.type === 'lookup' || field.type === 'multi-select') {
420
+ // const control = this.reportForm.get(field.property);
421
+ // if (control) {
422
+ // control.setValue([]);
423
+ // }
424
+ // }
425
+ // });
426
+ // }
427
+ }
428
+ isFormEmpty() {
429
+ if (!this.reportForm || !this.reportForm.value) {
430
+ return true;
431
+ }
432
+ return Object.values(this.reportForm.value).every(value => {
433
+ if (value === null || value === undefined || value === '') {
434
+ return true;
435
+ }
436
+ return Array.isArray(value) && value.length === 0;
437
+ });
438
+ }
439
+ shouldProcessEventItem(item) {
440
+ const groupByProp = this.pageInfo?.groupByProperty;
441
+ const groupByValues = this.pageInfo?.groupByValue;
442
+ if (!groupByProp || !groupByValues || !item[groupByProp]) {
443
+ return true;
444
+ }
445
+ const value = item[groupByProp].toString();
446
+ return !groupByValues.some(v => value.includes(v) && value.length >= v.length);
447
+ }
448
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ReportFormComponent, deps: [{ token: i1.TranslateService }, { token: i2.BackendService }, { token: i3.ActivatedRoute }, { token: i0.Injector }, { token: i3.Router }, { token: i3.ActivatedRoute }, { token: i4.Directionality }, { token: i5.MatDialog }, { token: i6.FormBuilder }], target: i0.ɵɵFactoryTarget.Component }); }
449
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: ReportFormComponent, isStandalone: true, selector: "app-report-form", inputs: { showDetails: "showDetails", showExtractButton: "showExtractButton", columns: "columns", actionRequestCallback: "actionRequestCallback", enrichDrillDownReportRequest: "enrichDrillDownReportRequest", enrichHyperLinkReportRequest: "enrichHyperLinkReportRequest", enrichJuniorReportRequest: "enrichJuniorReportRequest" }, outputs: { userAction: "userAction" }, ngImport: i0, template: "<div class=\"column full-width\">\r\n\r\n <div class=\"row align-start-center\" style=\"margin-bottom: 10px;\">\r\n <app-title-bar [pageTitle]=\"getTitle()\" [newAction]=\"false\"></app-title-bar>\r\n\r\n <mat-icon\r\n *ngIf=\"pageInfo?.hasHint\"\r\n role=\"img\"\r\n [attr.aria-label]=\"(pageInfo.labelsSection + '.hint') | translate\"\r\n [matTooltip]=\"pageInfo.labelsSection + '.hint' | translate\"\r\n matTooltipPosition=\"right\"\r\n color=\"primary\"\r\n class=\"hint-icon\"\r\n matTooltipClass=\"custom-tooltip\">\r\n help_outline\r\n </mat-icon>\r\n </div>\r\n\r\n <app-base-form-canvas\r\n [pageInfo]=\"pageInfo\"\r\n [fields]=\"fields\"\r\n [editable]=\"isEditable\"\r\n [errors]=\"errors\"\r\n [item]=\"this.reportForm?.value || {}\"\r\n (formUpdated)=\"updateForm($event)\"\r\n ></app-base-form-canvas>\r\n\r\n <br><br>\r\n\r\n <div class=\"column\">\r\n <div class=\"row gap-10 responsive-row\">\r\n <button *ngIf=\"activeLevel === 1\" color=\"primary\" mat-flat-button (click)=\"doAction(x)\" [disabled]=\"!isValidForm()\" id=\"report-generate-btn\">\r\n {{ 'REPORTS.generate' | translate }}\r\n </button>\r\n\r\n <button mat-raised-button [matMenuTriggerFor]=\"menu\" [disabled]=\"getIsEmptyList()\" color=\"primary\" id=\"report-extract-trigger\">\r\n {{ 'extract' | translate }}\r\n <mat-icon class=\"expand_more actionButton__expand\">expand_more</mat-icon>\r\n </button>\r\n\r\n <button mat-flat-button (click)=\"clear()\" [disabled]=\"isFormEmpty() || activeLevel > 1\" id=\"report-clear-btn\">\r\n {{ 'REPORTS.clear' | translate }}\r\n </button>\r\n\r\n <button *ngIf=\"activeLevel === 1 && drillDownEnabled()\" color=\"warn\" mat-flat-button (click)=\"drillDown()\" id=\"report-drilldown-btn\">\r\n {{ drillDownLabel() | translate }}\r\n </button>\r\n\r\n <button *ngIf=\"activeLevel > 1 && backButtonEnabled\" color=\"warn\" mat-flat-button (click)=\"goUp()\" id=\"report-up-btn\">\r\n {{ 'REPORTS.up' | translate }}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"activeLevel >= 1\" class=\"main-form-canvas row align-start-start responsive-table\" style=\"margin-top: 3vh;\">\r\n <div class=\"column full-width\">\r\n <app-base-table\r\n *ngIf=\"activeLevel === 1\"\r\n [pageInfo]=\"pageInfo\"\r\n [columns]=\"columnsDefinition\"\r\n [enforceRefresh]=\"reloadData\"\r\n id=\"parent\"\r\n [reportRequest]=\"reportRequest\"\r\n (userAction)=\"emitUserAction($event)\"\r\n (hyperLinkAction)=\"emitHyperLinkAction($event)\">\r\n </app-base-table>\r\n\r\n <app-base-table\r\n *ngIf=\"activeLevel === 2\"\r\n [pageInfo]=\"drillDownPageInfo\"\r\n [columns]=\"drillDownColumns\"\r\n id=\"child\"\r\n [reportRequest]=\"childReportRequest\"\r\n (userAction)=\"emitJuniorAction($event)\"\r\n (hyperLinkAction)=\"emitHyperLinkAction($event)\">\r\n </app-base-table>\r\n\r\n <app-base-table\r\n *ngIf=\"activeLevel === 3\"\r\n [pageInfo]=\"juniorPageInfo\"\r\n [columns]=\"juniorColumns\"\r\n id=\"junior\"\r\n [reportRequest]=\"juniorReportRequest\">\r\n </app-base-table>\r\n </div>\r\n </div>\r\n\r\n</div>\r\n\r\n<mat-menu #menu=\"matMenu\">\r\n <button type=\"button\" mat-menu-item *ngFor=\"let type of types\" (click)=\"extractReport(type)\" [attr.id]=\"'report-extract-item-' + type\">\r\n {{ type }}\r\n </button>\r\n</mat-menu>\r\n", styles: [".column{display:flex;flex-direction:column;width:100%}.row{display:flex;flex-direction:row;width:100%}.align-start-center{align-items:center;justify-content:flex-start}.align-start-start{align-items:flex-start;justify-content:flex-start}.gap-10>*+*{margin-left:10px}.full-width{width:100%}.hint-icon{cursor:pointer;margin-left:10px}.responsive-row{flex-wrap:wrap}@media (max-width: 960px){.responsive-row{flex-direction:column;align-items:flex-start}}@media (max-width: 600px){.responsive-table{justify-content:center}}\n"], dependencies: [{ kind: "component", type: TitleBarComponent, selector: "app-title-bar", inputs: ["pageTitle", "showExtractButton", "totalElements", "titleMode", "pageInfo", "subTitle", "statusDesc", "newAction", "extraButton", "showDetails", "showImport", "showButton", "extraData", "titleCorporateAdmin", "hideBackButton", "buttons", "buttonsDisplayMode", "draftSupported", "isPending", "onViewModeChange"], outputs: ["newActionClicked", "extraButtonClicked", "extractReport", "buttonClicked", "viewModeChanged"] }, { kind: "component", type: BaseFormCanvasComponent, selector: "app-base-form-canvas", inputs: ["pageInfo", "currency", "fields", "errors", "workflowEditableFields", "isWorkflowEditableManaged", "supportingAttributes", "editable", "emitOnValueChanges", "filterResetNonce", "item", "equationSuggestedFields", "currentEquationValue"], outputs: ["attachmentEmitter", "actionEmitter", "formUpdated", "hyperTextEvent", "currentEquationValueChange"] }, { kind: "component", type: MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i7.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "component", type: BaseTableComponent, selector: "app-base-table", inputs: ["filterFields", "noDataFoundSvgPath", "noDataFoundTitle", "noDataFoundSubtitle", "noResultSvgPath", "noResultTitle", "noResultSubtitle", "pageInfo", "enablePagination", "mobilePageSize", "mobileLoadMoreIncrement", "data", "listAction", "extraActions", "buttonsDisplayMode", "columns", "filters", "pathParam", "extraButton", "enforceRefresh", "isPending", "trigger", "reportRequest", "separateEndpointData", "manageablePages", "totalPagesCount", "currentPageIndex", "customizedData"], outputs: ["buttonClicked", "pageChange", "userAction", "hyperLinkAction", "extraAction", "selectedColumn", "listActionClicked", "showDialog", "clickRoutePage"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i8.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }] }); }
450
+ }
451
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ReportFormComponent, decorators: [{
452
+ type: Component,
453
+ args: [{ selector: 'app-report-form', standalone: true, imports: [
454
+ TitleBarComponent,
455
+ BaseFormCanvasComponent,
456
+ MatMenu,
457
+ MatMenuItem,
458
+ NgForOf,
459
+ MatMenuTrigger,
460
+ MatButtonModule,
461
+ TranslateModule,
462
+ BaseTableComponent,
463
+ NgIf,
464
+ MatIconModule,
465
+ MatButton,
466
+ MatTooltip
467
+ ], template: "<div class=\"column full-width\">\r\n\r\n <div class=\"row align-start-center\" style=\"margin-bottom: 10px;\">\r\n <app-title-bar [pageTitle]=\"getTitle()\" [newAction]=\"false\"></app-title-bar>\r\n\r\n <mat-icon\r\n *ngIf=\"pageInfo?.hasHint\"\r\n role=\"img\"\r\n [attr.aria-label]=\"(pageInfo.labelsSection + '.hint') | translate\"\r\n [matTooltip]=\"pageInfo.labelsSection + '.hint' | translate\"\r\n matTooltipPosition=\"right\"\r\n color=\"primary\"\r\n class=\"hint-icon\"\r\n matTooltipClass=\"custom-tooltip\">\r\n help_outline\r\n </mat-icon>\r\n </div>\r\n\r\n <app-base-form-canvas\r\n [pageInfo]=\"pageInfo\"\r\n [fields]=\"fields\"\r\n [editable]=\"isEditable\"\r\n [errors]=\"errors\"\r\n [item]=\"this.reportForm?.value || {}\"\r\n (formUpdated)=\"updateForm($event)\"\r\n ></app-base-form-canvas>\r\n\r\n <br><br>\r\n\r\n <div class=\"column\">\r\n <div class=\"row gap-10 responsive-row\">\r\n <button *ngIf=\"activeLevel === 1\" color=\"primary\" mat-flat-button (click)=\"doAction(x)\" [disabled]=\"!isValidForm()\" id=\"report-generate-btn\">\r\n {{ 'REPORTS.generate' | translate }}\r\n </button>\r\n\r\n <button mat-raised-button [matMenuTriggerFor]=\"menu\" [disabled]=\"getIsEmptyList()\" color=\"primary\" id=\"report-extract-trigger\">\r\n {{ 'extract' | translate }}\r\n <mat-icon class=\"expand_more actionButton__expand\">expand_more</mat-icon>\r\n </button>\r\n\r\n <button mat-flat-button (click)=\"clear()\" [disabled]=\"isFormEmpty() || activeLevel > 1\" id=\"report-clear-btn\">\r\n {{ 'REPORTS.clear' | translate }}\r\n </button>\r\n\r\n <button *ngIf=\"activeLevel === 1 && drillDownEnabled()\" color=\"warn\" mat-flat-button (click)=\"drillDown()\" id=\"report-drilldown-btn\">\r\n {{ drillDownLabel() | translate }}\r\n </button>\r\n\r\n <button *ngIf=\"activeLevel > 1 && backButtonEnabled\" color=\"warn\" mat-flat-button (click)=\"goUp()\" id=\"report-up-btn\">\r\n {{ 'REPORTS.up' | translate }}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"activeLevel >= 1\" class=\"main-form-canvas row align-start-start responsive-table\" style=\"margin-top: 3vh;\">\r\n <div class=\"column full-width\">\r\n <app-base-table\r\n *ngIf=\"activeLevel === 1\"\r\n [pageInfo]=\"pageInfo\"\r\n [columns]=\"columnsDefinition\"\r\n [enforceRefresh]=\"reloadData\"\r\n id=\"parent\"\r\n [reportRequest]=\"reportRequest\"\r\n (userAction)=\"emitUserAction($event)\"\r\n (hyperLinkAction)=\"emitHyperLinkAction($event)\">\r\n </app-base-table>\r\n\r\n <app-base-table\r\n *ngIf=\"activeLevel === 2\"\r\n [pageInfo]=\"drillDownPageInfo\"\r\n [columns]=\"drillDownColumns\"\r\n id=\"child\"\r\n [reportRequest]=\"childReportRequest\"\r\n (userAction)=\"emitJuniorAction($event)\"\r\n (hyperLinkAction)=\"emitHyperLinkAction($event)\">\r\n </app-base-table>\r\n\r\n <app-base-table\r\n *ngIf=\"activeLevel === 3\"\r\n [pageInfo]=\"juniorPageInfo\"\r\n [columns]=\"juniorColumns\"\r\n id=\"junior\"\r\n [reportRequest]=\"juniorReportRequest\">\r\n </app-base-table>\r\n </div>\r\n </div>\r\n\r\n</div>\r\n\r\n<mat-menu #menu=\"matMenu\">\r\n <button type=\"button\" mat-menu-item *ngFor=\"let type of types\" (click)=\"extractReport(type)\" [attr.id]=\"'report-extract-item-' + type\">\r\n {{ type }}\r\n </button>\r\n</mat-menu>\r\n", styles: [".column{display:flex;flex-direction:column;width:100%}.row{display:flex;flex-direction:row;width:100%}.align-start-center{align-items:center;justify-content:flex-start}.align-start-start{align-items:flex-start;justify-content:flex-start}.gap-10>*+*{margin-left:10px}.full-width{width:100%}.hint-icon{cursor:pointer;margin-left:10px}.responsive-row{flex-wrap:wrap}@media (max-width: 960px){.responsive-row{flex-direction:column;align-items:flex-start}}@media (max-width: 600px){.responsive-table{justify-content:center}}\n"] }]
468
+ }], ctorParameters: () => [{ type: i1.TranslateService }, { type: i2.BackendService }, { type: i3.ActivatedRoute }, { type: i0.Injector }, { type: i3.Router }, { type: i3.ActivatedRoute }, { type: i4.Directionality }, { type: i5.MatDialog }, { type: i6.FormBuilder }], propDecorators: { showDetails: [{
469
+ type: Input
470
+ }], showExtractButton: [{
471
+ type: Input
472
+ }], columns: [{
473
+ type: Input
474
+ }], actionRequestCallback: [{
475
+ type: Input
476
+ }], enrichDrillDownReportRequest: [{
477
+ type: Input
478
+ }], enrichHyperLinkReportRequest: [{
479
+ type: Input
480
+ }], enrichJuniorReportRequest: [{
481
+ type: Input
482
+ }], userAction: [{
483
+ type: Output
484
+ }] } });
485
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LWZvcm0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaW52b2ljZXEvdWktbGliL3NyYy9saWIvY29tcG9uZW50cy9yZXBvcnQtZm9ybS9yZXBvcnQtZm9ybS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pbnZvaWNlcS91aS1saWIvc3JjL2xpYi9jb21wb25lbnRzL3JlcG9ydC1mb3JtL3JlcG9ydC1mb3JtLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBMEIsU0FBUyxFQUFFLFlBQVksRUFBWSxLQUFLLEVBQVUsTUFBTSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRWhILE9BQU8sRUFBQyxlQUFlLEVBQVcsTUFBTSw0QkFBNEIsQ0FBQztBQUdyRSxPQUFPLEVBQUMsZUFBZSxFQUFtQixNQUFNLHFCQUFxQixDQUFDO0FBSXRFLE9BQU8sRUFBQyxVQUFVLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQzFELE9BQU8sRUFBQyxPQUFPLEVBQUUsV0FBVyxFQUFFLGNBQWMsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBQzVFLE9BQU8sRUFBQyxTQUFTLEVBQUUsZUFBZSxFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFDcEUsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sb0NBQW9DLENBQUM7QUFDdEUsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBQ3JELE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxpQ0FBaUMsQ0FBQztBQUM5RCxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sdUNBQXVDLENBQUM7QUFDcEUsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLCtCQUErQixDQUFDO0FBQ3JELE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLGtDQUFr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Q0cseUJBQXlCO3NCQUFqQyxLQUFLO2dCQUdOLFVBQVU7c0JBRFQsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbmplY3RvciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0fSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtGaWVsZEluZm99IGZyb20gXCIuLi8uLi9iYXNlLW1vZGVsL2ZpZWxkLWluZm9cIjtcclxuaW1wb3J0IHtFTVBUWV9QQUdFX0lORk8sIFBhZ2VJbmZvfSBmcm9tIFwiLi4vLi4vYmFzZS1tb2RlbC9wYWdlLWluZm9cIjtcclxuaW1wb3J0IHtUYWJsZUNvbHVtbn0gZnJvbSBcIi4uLy4uL2Jhc2UtbW9kZWwvdGFibGUtY29sdW1uLmludGVyZmFjZVwiO1xyXG5pbXBvcnQge0ZpZWxkTWVzc2FnZX0gZnJvbSBcIi4uLy4uL2Jhc2UtbW9kZWwvYXBpLXJlc3BvbnNlXCI7XHJcbmltcG9ydCB7VHJhbnNsYXRlTW9kdWxlLCBUcmFuc2xhdGVTZXJ2aWNlfSBmcm9tIFwiQG5neC10cmFuc2xhdGUvY29yZVwiO1xyXG5pbXBvcnQge0JhY2tlbmRTZXJ2aWNlfSBmcm9tIFwiLi4vLi4vc2VydmljZXMvYmFja2VuZC1zZXJ2aWNlXCI7XHJcbmltcG9ydCB7QWN0aXZhdGVkUm91dGUsIFJvdXRlcn0gZnJvbSBcIkBhbmd1bGFyL3JvdXRlclwiO1xyXG5pbXBvcnQge0Zvcm1CdWlsZGVyLCBGb3JtR3JvdXB9IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xyXG5pbXBvcnQge2Zvcm1hdERhdGUsIE5nRm9yT2YsIE5nSWZ9IGZyb20gXCJAYW5ndWxhci9jb21tb25cIjtcclxuaW1wb3J0IHtNYXRNZW51LCBNYXRNZW51SXRlbSwgTWF0TWVudVRyaWdnZXJ9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9tZW51XCI7XHJcbmltcG9ydCB7TWF0QnV0dG9uLCBNYXRCdXR0b25Nb2R1bGV9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9idXR0b25cIjtcclxuaW1wb3J0IHtCYXNlVGFibGVDb21wb25lbnR9IGZyb20gXCIuLi9iYXNlLXRhYmxlL2Jhc2UtdGFibGUuY29tcG9uZW50XCI7XHJcbmltcG9ydCB7TWF0SWNvbk1vZHVsZX0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2ljb25cIjtcclxuaW1wb3J0IHtGaWx0ZXJSZXF1ZXN0fSBmcm9tIFwiLi4vLi4vYmFzZS1tb2RlbC9maWx0ZXItcmVxdWVzdFwiO1xyXG5pbXBvcnQge1JlcG9ydFJlcXVlc3R9IGZyb20gXCIuLi8uLi9iYXNlLW1vZGVsL3JlcG9ydC1yZXF1ZXN0Lm1vZGVsXCI7XHJcbmltcG9ydCB7RmlsdGVyfSBmcm9tIFwiLi4vLi4vYmFzZS1tb2RlbC9maWx0ZXIubW9kZWxcIjtcclxuaW1wb3J0IHtUaXRsZUJhckNvbXBvbmVudH0gZnJvbSBcIi4uL3RpdGxlLWJhci90aXRsZS1iYXIuY29tcG9uZW50XCI7XHJcbmltcG9ydCB7QmFzZUZvcm1DYW52YXNDb21wb25lbnR9IGZyb20gXCIuLi9iYXNlLWZvcm0tY2FudmFzL2Jhc2UtZm9ybS1jYW52YXMuY29tcG9uZW50XCI7XHJcbmltcG9ydCB7RFJJTExfRE9XTl9BQ1RJT04sIEpVTklPUl9ET1dOX0FDVElPTiwgU25hY2tNZXNzYWdlLCBUYWJsZVBhZ2VVc2VyQWN0aW9ufSBmcm9tIFwiLi4vLi4vYmFzZS1tb2RlbFwiO1xyXG5pbXBvcnQge30gZnJvbSBcIi4uL2F1ZGl0LWxvZy1kZXRhaWxzLWRpYWxvZy9hdWRpdC1sb2ctZGV0YWlscy1kaWFsb2cuY29tcG9uZW50XCI7XHJcbmltcG9ydCB7TWF0RGlhbG9nfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nXCI7XHJcbmltcG9ydCB7UmVwb3J0RGV0YWlsc0RpYWxvZ0NvbXBvbmVudH0gZnJvbSBcIi4uL3JlcG9ydC1kZXRhaWxzLWRpYWxvZy9yZXBvcnQtZGV0YWlscy1kaWFsb2cuY29tcG9uZW50XCI7XHJcbmltcG9ydCB7IGNsb25lRGVlcCB9IGZyb20gJ2xvZGFzaCc7XHJcbmltcG9ydCB7TWF0VG9vbHRpcH0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL3Rvb2x0aXBcIjtcclxuaW1wb3J0IHtEaXJlY3Rpb25hbGl0eX0gZnJvbSBcIkBhbmd1bGFyL2Nkay9iaWRpXCI7XHJcblxyXG5cclxuY29uc3QgTk9OX1JFUE9SVF9DT0xVTU5TID0gWydsaXN0QWN0aW9uJywgJ2J1dHRvbicsICdjaGVja2JveCddO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ2FwcC1yZXBvcnQtZm9ybScsXHJcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtcclxuICAgIFRpdGxlQmFyQ29tcG9uZW50LFxyXG4gICAgQmFzZUZvcm1DYW52YXNDb21wb25lbnQsXHJcbiAgICBNYXRNZW51LFxyXG4gICAgTWF0TWVudUl0ZW0sXHJcbiAgICBOZ0Zvck9mLFxyXG4gICAgTWF0TWVudVRyaWdnZXIsXHJcbiAgICBNYXRCdXR0b25Nb2R1bGUsXHJcbiAgICBUcmFuc2xhdGVNb2R1bGUsXHJcbiAgICBCYXNlVGFibGVDb21wb25lbnQsXHJcbiAgICBOZ0lmLFxyXG4gICAgTWF0SWNvbk1vZHVsZSxcclxuICAgIE1hdEJ1dHRvbixcclxuICAgIE1hdFRvb2x0aXBcclxuICBdLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL3JlcG9ydC1mb3JtLmNvbXBvbmVudC5odG1sJyxcclxuICAgIHN0eWxlVXJsOiAnLi9yZXBvcnQtZm9ybS5jb21wb25lbnQuc2NzcydcclxufSlcclxuZXhwb3J0IGNsYXNzIFJlcG9ydEZvcm1Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gICAgQElucHV0KClcclxuICAgIHNob3dEZXRhaWxzIDogYW55ID0gW107XHJcblxyXG4gICAgQElucHV0KClcclxuICAgIHNob3dFeHRyYWN0QnV0dG9uOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgY29sdW1uczogVGFibGVDb2x1bW48YW55PltdID1bXTtcclxuXHJcbiAgICBASW5wdXQoKSBhY3Rpb25SZXF1ZXN0Q2FsbGJhY2shOiAoYWN0aW9uUmVxdWVzdDogVGFibGVQYWdlVXNlckFjdGlvbikgPT4gVGFibGVQYWdlVXNlckFjdGlvbjtcclxuICAgIEBJbnB1dCgpIGVucmljaERyaWxsRG93blJlcG9ydFJlcXVlc3QhOiAoYWN0aW9uUmVxdWVzdDogVGFibGVQYWdlVXNlckFjdGlvbiwgcmVwb3J0UmVxdWVzdDogUmVwb3J0UmVxdWVzdCkgPT4gVGFibGVQYWdlVXNlckFjdGlvbjtcclxuICAgIEBJbnB1dCgpIGVucmljaEh5cGVyTGlua1JlcG9ydFJlcXVlc3QhOiAoYWN0aW9uUmVxdWVzdDogVGFibGVQYWdlVXNlckFjdGlvbiwgcmVwb3J0UmVxdWVzdDogUmVwb3J0UmVxdWVzdCkgPT4gVGFibGVQYWdlVXNlckFjdGlvbjtcclxuICAgIEBJbnB1dCgpIGVucmljaEp1bmlvclJlcG9ydFJlcXVlc3QhOiAoYWN0aW9uUmVxdWVzdDogVGFibGVQYWdlVXNlckFjdGlvbiwgcmVwb3J0UmVxdWVzdDogUmVwb3J0UmVxdWVzdCkgPT4gVGFibGVQYWdlVXNlckFjdGlvbjtcclxuXHJcbiAgICBAT3V0cHV0KClcclxuICAgIHVzZXJBY3Rpb246IEV2ZW50RW1pdHRlcjxUYWJsZVBhZ2VVc2VyQWN0aW9uPiA9IG5ldyBFdmVudEVtaXR0ZXI8VGFibGVQYWdlVXNlckFjdGlvbj4oKTtcclxuICAgIGFjdGl2ZUxldmVsOiBudW1iZXIgPSAxO1xyXG5cclxuICAgIHByaXZhdGUgZmlsdGVyUmVxdWVzdDogRmlsdGVyUmVxdWVzdDtcclxuICAgIHg6IGFueTtcclxuICAgIGlzRWRpdGFibGU6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgZmllbGRzOiBGaWVsZEluZm9bXSA9IFtdO1xyXG4gICAgcGFnZUluZm86IFBhZ2VJbmZvID0gRU1QVFlfUEFHRV9JTkZPO1xyXG4gICAgZHJpbGxEb3duUGFnZUluZm86IFBhZ2VJbmZvID0gRU1QVFlfUEFHRV9JTkZPO1xyXG4gICAgZHJpbGxEb3duQ29sdW1uczogVGFibGVDb2x1bW48YW55PltdID0gW107XHJcbiAgICBoaWRlRHJpbGxEb3duQnV0dG9uOiBmYWxzZTtcclxuXHJcbiAgICBqdW5pb3JQYWdlSW5mbzogUGFnZUluZm8gPSBFTVBUWV9QQUdFX0lORk87XHJcbiAgICBqdW5pb3JDb2x1bW5zOiBUYWJsZUNvbHVtbjxhbnk+W10gPSBbXTtcclxuXHJcbiAgICBjb2x1bW5zRGVmaW5pdGlvbjogVGFibGVDb2x1bW48YW55PltdID0gW107XHJcbiAgICB0eXBlczogc3RyaW5nW10gPSBbXCJwZGZcIiwgXCJjc3ZcIiwgXCJ4bHN4XCJdXHJcbiAgICBzZWFyY2hTdHI6IHN0cmluZyA9ICcnO1xyXG5cclxuICAgIGVycm9yczogRmllbGRNZXNzYWdlW10gPSBbXTtcclxuXHJcbiAgICByZWxvYWREYXRhOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBiYWNrQnV0dG9uRW5hYmxlZDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG5cclxuICAgIHJlcG9ydFJlcXVlc3Q6IFJlcG9ydFJlcXVlc3QgPSBuZXcgUmVwb3J0UmVxdWVzdCh7fSk7XHJcbiAgICBjaGlsZFJlcG9ydFJlcXVlc3Q6IFJlcG9ydFJlcXVlc3QgPSBuZXcgUmVwb3J0UmVxdWVzdCh7fSk7XHJcbiAgICBqdW5pb3JSZXBvcnRSZXF1ZXN0OiBSZXBvcnRSZXF1ZXN0ID0gbmV3IFJlcG9ydFJlcXVlc3Qoe30pO1xyXG4gICAgcHVibGljIHJlcG9ydEZvcm06IEZvcm1Hcm91cDtcclxuICAgIHJlYWR5VG9TZWFyY2ggPSBmYWxzZTtcclxuICAgIHByaXZhdGUgcGFnZVNpemU6IGFueTtcclxuICAgIHByaXZhdGUgZGlhbG9nUmVwb3J0UmVxdWVzdDogYW55O1xyXG4gICAgY3VycmVudERpcmVjdGlvbjogJ2x0cicgfCAncnRsJztcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSB0cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlLFxyXG4gICAgICAgICAgICAgICAgcHVibGljIGJhY2tlbmRTZXJ2aWNlOiBCYWNrZW5kU2VydmljZSxcclxuICAgICAgICAgICAgICAgIHByaXZhdGUgYWN0aXZhdGVkUm91dGU6IEFjdGl2YXRlZFJvdXRlLFxyXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSBpbmplY3RvcjogSW5qZWN0b3IsXHJcbiAgICAgICAgICAgICAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxyXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSByb3V0ZTogQWN0aXZhdGVkUm91dGUsXHJcbiAgICAgICAgICAgICAgICBwcml2YXRlIGRpcmVjdGlvbmFsaXR5OiBEaXJlY3Rpb25hbGl0eSxcclxuICAgICAgICAgICAgICAgIHB1YmxpYyBkaWFsb2c6IE1hdERpYWxvZyxcclxuICAgICAgICAgICAgICAgIHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyKSB7XHJcbiAgICB9XHJcblxyXG4gICAgZGlzYWJsZUV4cG9ydEFjdGlvbiA6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgICAgdGhpcy5jdXJyZW50RGlyZWN0aW9uID0gdGhpcy5kaXJlY3Rpb25hbGl0eS52YWx1ZTtcclxuICAgICAgdGhpcy5kaXJlY3Rpb25hbGl0eS5jaGFuZ2Uuc3Vic2NyaWJlKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIHRoaXMuY3VycmVudERpcmVjdGlvbiA9IHZhbHVlO1xyXG4gICAgICB9KVxyXG5cclxuICAgICAgdGhpcy5hY3RpdmF0ZWRSb3V0ZS5kYXRhLnN1YnNjcmliZShkYXRhID0+IHtcclxuICAgICAgICB0aGlzLnBhZ2VJbmZvID0gZGF0YVsncGFnZUluZm8nXTtcclxuICAgICAgICB0aGlzLnBhZ2VTaXplID0gdGhpcy5wYWdlSW5mby5wYWdlU2l6ZSA/PyAxMDtcclxuICAgICAgICB0aGlzLmZpbHRlclJlcXVlc3QgPSBuZXcgRmlsdGVyUmVxdWVzdCh0aGlzLnBhZ2VTaXplKTtcclxuICAgICAgICBkYXRhWydwYWdlSW5mbyddLmxhenlMb2FkRGF0YSA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5kcmlsbERvd25QYWdlSW5mbyA9IGRhdGFbJ2RyaWxsRG93blBhZ2VJbmZvJ107XHJcbiAgICAgICAgdGhpcy5kcmlsbERvd25Db2x1bW5zID0gZGF0YVsnZHJpbGxEb3duQ29sdW1ucyddPy5maWx0ZXIoYyA9PiBjLnByb3BlcnR5ICE9PSAnc2VsZWN0SXRlbScpO1xyXG4gICAgICAgIHRoaXMuaGlkZURyaWxsRG93bkJ1dHRvbiA9IGRhdGFbJ2hpZGVEcmlsbERvd25CdXR0b24nXSA/PyBmYWxzZTtcclxuICAgICAgICB0aGlzLmp1bmlvclBhZ2VJbmZvID0gZGF0YVsnanVuaW9yUGFnZUluZm8nXTtcclxuICAgICAgICB0aGlzLmp1bmlvckNvbHVtbnMgPSBkYXRhWydqdW5pb3JDb2x1bW5zJ107XHJcbiAgICAgICAgdGhpcy5jb2x1bW5zRGVmaW5pdGlvbiA9IGRhdGFbJ2NvbHVtbnNEZWZpbml0aW9uJ10uZmlsdGVyKGMgPT4gKHRoaXMuZHJpbGxEb3duUGFnZUluZm8gJiYgdGhpcy5kcmlsbERvd25Db2x1bW5zIHx8ICghTk9OX1JFUE9SVF9DT0xVTU5TLmluY2x1ZGVzKGMudHlwZSkpKSk7XHJcbiAgICAgICAgdGhpcy5maWVsZHMgPSBkYXRhWydmaWVsZHMnXTtcclxuICAgICAgICBpZiAoZGF0YVsnZW5yaWNoRHJpbGxEb3duUmVwb3J0UmVxdWVzdCddKSB7XHJcbiAgICAgICAgICB0aGlzLmVucmljaERyaWxsRG93blJlcG9ydFJlcXVlc3QgPSBkYXRhWydlbnJpY2hEcmlsbERvd25SZXBvcnRSZXF1ZXN0J10odGhpcy5pbmplY3Rvcik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChkYXRhWydlbnJpY2hKdW5pb3JSZXBvcnRSZXF1ZXN0J10pIHtcclxuICAgICAgICAgIHRoaXMuZW5yaWNoSnVuaW9yUmVwb3J0UmVxdWVzdCA9IGRhdGFbJ2VucmljaEp1bmlvclJlcG9ydFJlcXVlc3QnXSh0aGlzLmluamVjdG9yKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChkYXRhWydlbnJpY2hIeXBlckxpbmtSZXBvcnRSZXF1ZXN0J10pIHtcclxuICAgICAgICAgIHRoaXMuZW5yaWNoSHlwZXJMaW5rUmVwb3J0UmVxdWVzdCA9IGRhdGFbJ2VucmljaEh5cGVyTGlua1JlcG9ydFJlcXVlc3QnXSh0aGlzLmluamVjdG9yKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLnJvdXRlLnF1ZXJ5UGFyYW1NYXAuc3Vic2NyaWJlKHBhcmFtcyA9PiB7XHJcbiAgICAgICAgY29uc3QgaXNDb21wYXJpc29uUmVwb3J0ID0gcGFyYW1zLmdldCgnY29tcGFyaXNvblJlcG9ydCcpID09PSAndHJ1ZSc7XHJcblxyXG4gICAgICAgIGlmIChpc0NvbXBhcmlzb25SZXBvcnQpIHtcclxuICAgICAgICAgIGNvbnN0IGNvbXBhcmlzb25TdHIgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKCdjb21wYXJpc29uUmVwb3J0UGFnZUluZm8nKTtcclxuXHJcbiAgICAgICAgICBpZiAoY29tcGFyaXNvblN0cikge1xyXG4gICAgICAgICAgICBjb25zdCBjb21wYXJpc29uRGF0YSA9IEpTT04ucGFyc2UoY29tcGFyaXNvblN0cik7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnBhZ2VJbmZvLmxhenlMb2FkRGF0YSA9IGNvbXBhcmlzb25EYXRhLmxhenlMb2FkRGF0YSA/PyBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5hY3RpdmVMZXZlbCA9IGNvbXBhcmlzb25EYXRhLmFjdGl2ZUxldmVsID8/IDI7XHJcbiAgICAgICAgICAgIHRoaXMuaXNFZGl0YWJsZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLmJhY2tCdXR0b25FbmFibGVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuZHJpbGxEb3duUGFnZUluZm8gPSBjb21wYXJpc29uRGF0YS5kcmlsbERvd25QYWdlSW5mbztcclxuICAgICAgICAgICAgdGhpcy5kcmlsbERvd25Db2x1bW5zID0gY29tcGFyaXNvbkRhdGEuZHJpbGxEb3duQ29sdW1ucztcclxuICAgICAgICAgICAgdGhpcy5yZXBvcnRGb3JtID0gdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgICAgICAgICAgZGlyZWN0b3JhdGU6IFtbXV0sXHJcbiAgICAgICAgICAgICAgZnJvbURhdGU6IFsnJ10sXHJcbiAgICAgICAgICAgICAgdG9EYXRlOiBbJyddLFxyXG4gICAgICAgICAgICAgIHNlY3RvcjogWycnXSxcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnJlcG9ydEZvcm0ucGF0Y2hWYWx1ZShjb21wYXJpc29uRGF0YS5mb3JtKVxyXG4gICAgICAgICAgICB0aGlzLmZpZWxkcyA9IHRoaXMuZmllbGRzLmZpbHRlcihjID0+IGMudHlwZSAhPT0gJ2NoZWNrYm94Jyk7XHJcblxyXG4gICAgICAgICAgICBjb25zdCByZXBvcnRSZXF1ZXN0ID0gY29tcGFyaXNvbkRhdGEucmVwb3J0UmVxdWVzdDtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuY2hpbGRSZXBvcnRSZXF1ZXN0ID0gdGhpcy5iYWNrZW5kU2VydmljZS5idWlsZFJlcG9ydFJlcXVlc3QoXHJcbiAgICAgICAgICAgICAgdGhpcy5kcmlsbERvd25Db2x1bW5zLFxyXG4gICAgICAgICAgICAgIGAke3RoaXMuZHJpbGxEb3duUGFnZUluZm8ubGFiZWxzU2VjdGlvbn0uJHt0aGlzLmRyaWxsRG93blBhZ2VJbmZvLmlkfWAsXHJcbiAgICAgICAgICAgICAgcmVwb3J0UmVxdWVzdCxcclxuICAgICAgICAgICAgICAnJyxcclxuICAgICAgICAgICAgICB0aGlzLmRyaWxsRG93blBhZ2VJbmZvLFxyXG4gICAgICAgICAgICAgICdMQU5EU0NBUEUnXHJcbiAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICAvLyBuZ09uQ2hhbmdlcyh7aXRlbSwgZXJyb3JzLCBmaWVsZHN9OiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICAvLyAgICAgLy8gZXJyb3JzPy5jdXJyZW50VmFsdWU/LmZvckVhY2goKG1zZzogRmllbGRNZXNzYWdlKSA9PiB7XHJcbiAgICAvLyAgICAgLy8gICAgIHRoaXMuYmFja2VuZFNlcnZpY2UucGFyZW50Rm9ybS5nZXQobXNnLmZpZWxkTmFtZSk/LnNldEVycm9ycyh7c2VydmVyRXJyb3I6IG1zZy5tZXNzYWdlfSk7XHJcbiAgICAvLyAgICAgLy8gfSk7XHJcbiAgICAvLyAgICAgLy8gaWYgKGZpZWxkcz8uY3VycmVudFZhbHVlICYmICFmaWVsZHMuaXNGaXJzdENoYW5nZSgpKXtcclxuICAgIC8vICAgICAvLyAgICAgdGhpcy5idWlsZEZvcm0oKTtcclxuICAgIC8vICAgICAvLyB9XHJcbiAgICAvLyAgICAgLy8gdGhpcy5idWlsZEZvcm0oKTtcclxuICAgIC8vIH1cclxuXHJcbiAgICBpc01hdGNoSGVpZ2h0KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnBhZ2VJbmZvLnBhZ2VIZWlnaHQgPT09ICdtYXRjaCc7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIGRvQWN0aW9uKHR5cGU6IHN0cmluZykge1xyXG4gICAgICBpZiAodGhpcy5iYWNrZW5kU2VydmljZS5wYXJlbnRGb3JtLnZhbGlkKSB7XHJcbiAgICAgICAgdGhpcy5yZWxvYWREYXRhID0gIXRoaXMucmVsb2FkRGF0YTtcclxuICAgICAgICBjb25zdCBmaWx0ZXJSZXF1ZXN0OiBGaWx0ZXJSZXF1ZXN0ID0gbmV3IEZpbHRlclJlcXVlc3QodGhpcy5wYWdlU2l6ZSk7XHJcbiAgICAgICAgZmlsdGVyUmVxdWVzdC5maWx0ZXJzID0gW107XHJcbiAgICAgICAgbGV0IHBhcmFtc1N0cmluZzogc3RyaW5nW10gPSBbXTtcclxuICAgICAgICB0aGlzLmZpZWxkcy5maWx0ZXIoeCA9PiB4LnR5cGUgIT09ICdzcGFjZXInKS5mb3JFYWNoKGYgPT4ge1xyXG4gICAgICAgICAgaWYgKHRoaXMuZ2V0UGFyYW1WYWx1ZShmKSAhPSBudWxsICYmIHRoaXMuZ2V0UGFyYW1WYWx1ZShmKS50b1N0cmluZygpLnRyaW0oKSAhPT0gJycpXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICBpZiAoZi50eXBlID09PSAnbXVsdGktc2VsZWN0JyB8fCBmLnR5cGUgPT09ICdsb29rdXAnKSB7XHJcbiAgICAgICAgICAgIC8vIGRvIG5vdCBmaWx0ZXIgaWYgdGhpcyBmaWVsZCBhcyBjYXNjYWRpbmcgZm9yIGFub3RoZXIgb25lIGFuZCB0aGUgb3RoZXIgb25lIGdvdCBzZWxlY3RlZCB2YWx1ZXNcclxuICAgICAgICAgICAgY29uc3QgY2hpbGRGaWVsZElkeCA9IHRoaXMuZmllbGRzLmZpbmRJbmRleChmaWVsZCA9PiBmaWVsZC5jYXNjYWRlZEJ5ID09PSBmLnByb3BlcnR5KTtcclxuICAgICAgICAgICAgaWYgKGNoaWxkRmllbGRJZHggPiAtMSAmJiB0aGlzLmJhY2tlbmRTZXJ2aWNlLnBhcmVudEZvcm0uZ2V0KHRoaXMuZmllbGRzW2NoaWxkRmllbGRJZHhdLnByb3BlcnR5KT8udmFsdWU/Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3QgaWR6OiBudW1iZXJbXSA9IFtdO1xyXG4gICAgICAgICAgICBjb25zdCBwYXJhbTogc3RyaW5nW10gPSBbXTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuYmFja2VuZFNlcnZpY2UucGFyZW50Rm9ybS5nZXQoZi5wcm9wZXJ0eSk/LnZhbHVlICYmIEFycmF5LmlzQXJyYXkodGhpcy5iYWNrZW5kU2VydmljZS5wYXJlbnRGb3JtLmdldChmLnByb3BlcnR5KT8udmFsdWUpXHJcbiAgICAgICAgICAgICAgJiYgdGhpcy5iYWNrZW5kU2VydmljZS5wYXJlbnRGb3JtLmdldChmLnByb3BlcnR5KT8udmFsdWUubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgIHRoaXMuYmFja2VuZFNlcnZpY2UucGFyZW50Rm9ybS5nZXQoZi5wcm9wZXJ0eSk/LnZhbHVlLmZvckVhY2goKGE6IHtcclxuICAgICAgICAgICAgICAgIGNoYW5uZWxJZDogbnVtYmVyO1xyXG4gICAgICAgICAgICAgICAgZW5nbGlzaE5hbWU6IHN0cmluZztcclxuICAgICAgICAgICAgICAgIGlkOiBudW1iZXI7XHJcbiAgICAgICAgICAgICAgfSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKGYuZmxhdHRlbkJ5U3ViQXR0cmlidXRlKSB7XHJcbiAgICAgICAgICAgICAgICAgIGlkei5wdXNoKGFbZi5mbGF0dGVuQnlTdWJBdHRyaWJ1dGVdKTtcclxuICAgICAgICAgICAgICAgICAgcGFyYW0ucHVzaChhW2YuZmxhdHRlbkJ5U3ViQXR0cmlidXRlXSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZmllbGRzLmZpbmQocyA9PiBzLnByb3BlcnR5ID09PSAndGVybWluYWxJZCcpKSB7XHJcbiAgICAgICAgICAgICAgICAgIGlkei5wdXNoKGEuY2hhbm5lbElkKTtcclxuICAgICAgICAgICAgICAgICAgcGFyYW0ucHVzaChhLmVuZ2xpc2hOYW1lKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIGlkei5wdXNoKGEuaWQpO1xyXG4gICAgICAgICAgICAgICAgICBwYXJhbS5wdXNoKGEuZW5nbGlzaE5hbWUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgZmlsdGVyUmVxdWVzdC5maWx0ZXJzPy5wdXNoKG5ldyBGaWx0ZXIoe1xyXG4gICAgICAgICAgICAgICAgaWQ6IGYucHJvcGVydHksIGZpZWxkTmFtZTogZi5wcm9wZXJ0eSwgbGFiZWw6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KGYubGFiZWwpLFxyXG4gICAgICAgICAgICAgICAgZmlsdGVyVHlwZTogJ0ZJTEVEX0ZJTFRFUicsIG9wZXJhdG9yOiBmLmZpbHRlck9wZXJhdG9yLFxyXG4gICAgICAgICAgICAgICAgdmFsdWVPYmplY3Q6IGlkelxyXG4gICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgICBwYXJhbXNTdHJpbmcucHVzaCh0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChmLmxhYmVsKSArICcgOiAnICsgcGFyYW0uam9pbignLCcpKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmJhY2tlbmRTZXJ2aWNlLnBhcmVudEZvcm0uZ2V0KGYucHJvcGVydHkpPy52YWx1ZSAmJiBmLmZsYXR0ZW5CeVN1YkF0dHJpYnV0ZSkge1xyXG4gICAgICAgICAgICAgIGZpbHRlclJlcXVlc3QuZmlsdGVycz8ucHVzaChuZXcgRmlsdGVyKHtcclxuICAgICAgICAgICAgICAgIGlkOiBmLnByb3BlcnR5LCBmaWVsZE5hbWU6IGYucHJvcGVydHksIGxhYmVsOiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChmLmxhYmVsKSxcclxuICAgICAgICAgICAgICAgIGZpbHRlclR5cGU6ICdGSUxFRF9GSUxURVInLCBvcGVyYXRvcjogZi5maWx0ZXJPcGVyYXRvcixcclxuICAgICAgICAgICAgICAgIHZhbHVlT2JqZWN0OiB0aGlzLmdldFBhcmFtVmFsdWUoZilbZi5mbGF0dGVuQnlTdWJBdHRyaWJ1dGVdXHJcbiAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5iYWNrZW5kU2VydmljZS5wYXJlbnRGb3JtLmdldChmLnByb3BlcnR5KT8udmFsdWUgIT09IG51bGwgJiZcclxuICAgICAgICAgICAgICB0aGlzLmJhY2tlbmRTZXJ2aWNlLnBhcmVudEZvcm0uZ2V0KGYucHJvcGVydHkpPy52YWx1ZSAhPT0gdW5kZWZpbmVkICYmXHJcbiAgICAgICAgICAgICAgdGhpcy5iYWNrZW5kU2VydmljZS5wYXJlbnRGb3JtLmdldChmLnByb3BlcnR5KT8udmFsdWUgIT09IFwiXCIpIHtcclxuICAgICAgICAgICAgICBmaWx0ZXJSZXF1ZXN0LmZpbHRlcnM/LnB1c2gobmV3IEZpbHRlcih7XHJcbiAgICAgICAgICAgICAgICBpZDogZi5wcm9wZXJ0eSwgZmllbGROYW1lOiBmLnByb3BlcnR5LCBsYWJlbDogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoZi5sYWJlbCksXHJcbiAgICAgICAgICAgICAgICBmaWx0ZXJUeXBlOiAnRklMRURfRklMVEVSJywgb3BlcmF0b3I6IGYuZmlsdGVyT3BlcmF0b3IsXHJcbiAgICAgICAgICAgICAgICB2YWx1ZU9iamVjdDogdGhpcy5nZXRQYXJhbVZhbHVlKGYpXHJcbiAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHBhcmFtc1N0cmluZy5wdXNoKHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KGYubGFiZWwpICsgJyA6ICcgKyB0aGlzLmdldFBhcmFtVmFsdWVMYWJlbChmKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfX0pXHJcbiAgICAgICAgY29uc3QgcmVwb3J0UmVxdWVzdCA9IHRoaXMuYmFja2VuZFNlcnZpY2UuYnVpbGRSZXBvcnRSZXF1ZXN0KHRoaXMuY29sdW1uc0RlZmluaXRpb24sIHRoaXMucGFnZUluZm8ubGFiZWxzU2VjdGlvbiArICcuJyArIHRoaXMucGFnZUluZm8uaWQsXHJcbiAgICAgICAgICBmaWx0ZXJSZXF1ZXN0LCB0eXBlLCB0aGlzLnBhZ2VJbmZvLCAnTEFORFNDQVBFJyk7XHJcbiAgICAgICAgcmVwb3J0UmVxdWVzdC5zZWFyY2hTdHIgPSBwYXJhbXNTdHJpbmcuam9pbignICwgJyk7XHJcbiAgICAgICAgdGhpcy5yZXBvcnRSZXF1ZXN0ID0gcmVwb3J0UmVxdWVzdDtcclxuICAgICAgICAvLyB0aGlzLmFjdGl2ZUxldmVsID0gMTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmJhY2tlbmRTZXJ2aWNlLnRvcFBhbmVsTWVzc2FnZSQubmV4dChuZXcgU25hY2tNZXNzYWdlKCdJTlZBTElEX1JFUE9SVF9GT1JNJywgdHJ1ZSwgJ2Vycm9yJykpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRQYXJhbVZhbHVlKGY6IEZpZWxkSW5mbykge1xyXG4gICAgICAgIGlmIChmLnR5cGUgPT09ICdkYXRlJyAmJiB0aGlzLmJhY2tlbmRTZXJ2aWNlLnBhcmVudEZvcm0uZ2V0KGYucHJvcGVydHkpPy52YWx1ZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZm9ybWF0RGF0ZSh0aGlzLmJhY2tlbmRTZXJ2aWNlLnBhcmVudEZvcm0uZ2V0KGYucHJvcGVydHkpPy52YWx1ZSwgJ3l5eXktTU0tZGQnLCAnZW5fVVMnKVxyXG4gICAgICAgIH1lbHNlIGlmIChmLnR5cGUgPT09ICdjaGVja2JveCcpIHtcclxuICAgICAgICAgICAgcmV0dXJuICEhdGhpcy5iYWNrZW5kU2VydmljZS5wYXJlbnRGb3JtLmdldChmLnByb3BlcnR5KT8udmFsdWU7XHJcbiAgICAgICAgfWVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5iYWNrZW5kU2VydmljZS5wYXJlbnRGb3JtLmdldChmLnByb3BlcnR5KT8udmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0UGFyYW1WYWx1ZUxhYmVsKGY6IEZpZWxkSW5mbykge1xyXG4gICAgICAgIGlmIChmLnR5cGUgPT09ICdjaGVja2JveCcpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYmFja2VuZFNlcnZpY2UucGFyZW50Rm9ybS5nZXQoZi5wcm9wZXJ0eSk/LnZhbHVlID8gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ3llcycpIDogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ25vJyk7XHJcbiAgICAgICAgfWVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5iYWNrZW5kU2VydmljZS5wYXJlbnRGb3JtLmdldChmLnByb3BlcnR5KT8udmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICBnZXRUaXRsZSgpIHtcclxuICAgIGNvbnN0IHBhZ2VJbmZvTWFwID0ge1xyXG4gICAgICAxOiB0aGlzLnBhZ2VJbmZvLFxyXG4gICAgICAyOiB0aGlzLmRyaWxsRG93blBhZ2VJbmZvLFxyXG4gICAgICAzOiB0aGlzLmp1bmlvclBhZ2VJbmZvXHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IGN1cnJlbnRJbmZvID0gcGFnZUluZm9NYXBbdGhpcy5hY3RpdmVMZXZlbF0gfHwgdGhpcy5wYWdlSW5mbztcclxuICAgIHJldHVybiBgJHtjdXJyZW50SW5mby5sYWJlbHNTZWN0aW9ufS4ke2N1cnJlbnRJbmZvLmlkfWA7XHJcbiAgfVxyXG5cclxuICAgIHVwZGF0ZUZvcm0oJGV2ZW50OiBGb3JtR3JvdXApIHtcclxuICAgICAgdGhpcy5yZXBvcnRGb3JtID0gJGV2ZW50O1xyXG4gICAgICB0aGlzLmJhY2tlbmRTZXJ2aWNlLnBhcmVudEZvcm0gPSAkZXZlbnQ7XHJcblxyXG4gICAgICB0aGlzLnNldHVwRGVwZW5kZW50RmllbGRXYXRjaGVycygpO1xyXG5cclxuICAgICAgdGhpcy5iYWNrZW5kU2VydmljZS5wYXJlbnRGb3JtLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoeCA9PiB7XHJcbiAgICAgICAgICB0aGlzLnJlYWR5VG9TZWFyY2ggPSB0aGlzLmJhY2tlbmRTZXJ2aWNlLnBhcmVudEZvcm0udmFsaWQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXR1cERlcGVuZGVudEZpZWxkV2F0Y2hlcnMoKSB7XHJcbiAgICB0aGlzLmZpZWxkc1xyXG4gICAgICAuZmlsdGVyKGZpZWxkID0+IGZpZWxkLmxvb2t1cEZpbHRlckxpc3QgJiYgZmllbGQubG9va3VwRmlsdGVyTGlzdC5sZW5ndGggPiAwKVxyXG4gICAgICAuZm9yRWFjaChmaWVsZCA9PiB7XHJcbiAgICAgICAgY29uc3QgZGVwZW5kZW50RmllbGRzID0gZmllbGQubG9va3VwRmlsdGVyTGlzdC5tYXAoZiA9PiBmLmZpZWxkTmFtZSk7XHJcblxyXG4gICAgICAgIGRlcGVuZGVudEZpZWxkcy5mb3JFYWNoKGRlcGVuZGVudEZpZWxkTmFtZSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBkZXBlbmRlbnRDb250cm9sID0gdGhpcy5yZXBvcnRGb3JtLmdldChkZXBlbmRlbnRGaWVsZE5hbWUpO1xyXG4gICAgICAgICAgaWYgKGRlcGVuZGVudENvbnRyb2wpIHtcclxuICAgICAgICAgICAgZGVwZW5kZW50Q29udHJvbC52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICAgICAgICBjb25zdCB0YXJnZXRDb250cm9sID0gdGhpcy5yZXBvcnRGb3JtLmdldChmaWVsZC5wcm9wZXJ0eSk7XHJcbiAgICAgICAgICAgICAgaWYgKHRhcmdldENvbnRyb2wpIHtcclxuICAgICAgICAgICAgICAgIHRhcmdldENvbnRyb2wuc2V0VmFsdWUoW10pO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgaXNWYWxpZEZvcm0oKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLnJlYWR5VG9TZWFyY2ggO1xyXG5cclxuICAgIH1cclxuXHJcblxyXG5cclxuICBlbWl0VXNlckFjdGlvbigkZXZlbnQ6IFRhYmxlUGFnZVVzZXJBY3Rpb24pIHtcclxuICAgICRldmVudC5wYWdlSW5mbyA9IHRoaXMucGFnZUluZm87XHJcbiAgICB0aGlzLmRvQURyaWxsRG93bkFjdGlvbigkZXZlbnQpO1xyXG4gIH1cclxuXHJcbiAgZW1pdEh5cGVyTGlua0FjdGlvbigkZXZlbnQ6IFRhYmxlUGFnZVVzZXJBY3Rpb24pIHtcclxuICAgIGlmICghdGhpcy5zaG91bGRQcm9jZXNzRXZlbnRJdGVtKCRldmVudC5pdGVtKSkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IGl0ZW0gPSAkZXZlbnQuaXRlbTtcclxuICAgIHRoaXMucHJlcGFyZURpYWxvZ1JlcG9ydFJlcXVlc3QoaXRlbSk7XHJcbiAgICBjb25zdCByZXBvcnRSZXF1ZXN0ID0gdGhpcy5idWlsZERpYWxvZ1JlcG9ydFJlcXVlc3QoKTtcclxuICAgIHJlcG9ydFJlcXVlc3QuZmlsdGVyUmVxdWVzdC5wYWdlSW5kZXggPSAwXHJcbiAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKFJlcG9ydERldGFpbHNEaWFsb2dDb21wb25lbnQsIHtcclxuICAgICAgZGF0YToge1xyXG4gICAgICAgIHBhZ2VJbmZvOiB0aGlzLmp1bmlvclBhZ2VJbmZvLFxyXG4gICAgICAgIHJlcXVlc3Q6IHJlcG9ydFJlcXVlc3QsXHJcbiAgICAgICAgY29sdW1uczogdGhpcy5qdW5pb3JDb2x1bW5zLFxyXG4gICAgICAgIGl0ZW0sXHJcbiAgICAgIH0sXHJcbiAgICAgIGhlaWdodDogJzUwdncnLFxyXG4gICAgICBtYXhXaWR0aDogJzEyMHZ3JyxcclxuICAgICAgZGlyZWN0aW9uOiB0aGlzLmN1cnJlbnREaXJlY3Rpb24sXHJcbiAgICAgIGRpc2FibGVDbG9zZTogZmFsc2UsXHJcbiAgICB9KTtcclxuXHJcbiAgICBkaWFsb2dSZWYuYWZ0ZXJPcGVuZWQoKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5kb0h5cGVyTGlua0FjdGlvbigkZXZlbnQpKTtcclxuICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZSgoKSA9PiB7fSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHByZXBhcmVEaWFsb2dSZXBvcnRSZXF1ZXN0KGl0ZW06IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5kaWFsb2dSZXBvcnRSZXF1ZXN0ID0gY2xvbmVEZWVwKHRoaXMucmVwb3J0UmVxdWVzdCk7XHJcbiAgICB0aGlzLmRpYWxvZ1JlcG9ydFJlcXVlc3QuZmlsdGVyUmVxdWVzdCA9IHsgZmlsdGVyczogW10gfTtcclxuXHJcbiAgICB0aGlzLmFkZFN0YW5kYXJkRmlsdGVycyhpdGVtKTtcclxuICAgIHRoaXMuYWRkT3JSZXBsYWNlRmlsdGVyKCdpc2VjMScsICdpU2VjJywgaXRlbVsnaXNlY192YWx1ZSddKTtcclxuICAgIHRoaXMuYWRkRmlsdGVyVHlwZSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhZGRTdGFuZGFyZEZpbHRlcnMoaXRlbTogYW55KTogdm9pZCB7XHJcbiAgICBjb25zdCBzdGFuZGFyZEZpbHRlcnMgPSBbXHJcbiAgICAgIHsga2V5OiAncGVyaW9kJywgdmFsdWU6IGl0ZW1bJ3BlcmlvZCddIH0sXHJcbiAgICAgIHsga2V5OiAneWVhcicsIHZhbHVlOiBpdGVtWyd5ZWFyJ10gfSxcclxuICAgICAgeyBrZXk6ICdzZWN0b3InLCB2YWx1ZTogaXRlbVsnc2VjdG9yQ29kZSddIH0sXHJcbiAgICAgIHsga2V5OiAnZGlyZWN0b3JhdGUnLCB2YWx1ZTogaXRlbVsnZGlyZWN0b3JhdGVDb2RlJ10gfSxcclxuICAgICAgeyBrZXk6ICdzdWJUYXhSYXRlJywgdmFsdWU6IGl0ZW1bJ3RheF9yYXRlX2NvZGUnXSB9LFxyXG4gICAgXTtcclxuXHJcbiAgICBzdGFuZGFyZEZpbHRlcnMuZm9yRWFjaCgoeyBrZXksIHZhbHVlIH0pID0+XHJcbiAgICAgIHRoaXMuZGlhbG9nUmVwb3J0UmVxdWVzdC5maWx0ZXJSZXF1ZXN0LmZpbHRlcnMucHVzaChcclxuICAgICAgICB0aGlzLmNyZWF0ZUZpbHRlcihrZXksIGtleSwgdmFsdWUpXHJcbiAgICAgIClcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFkZEZpbHRlclR5cGUoKTogdm9pZCB7XHJcbiAgICBjb25zdCBpc1RheCA9IHRoaXMuZGlhbG9nUmVwb3J0UmVxdWVzdC5hY3Rpb25LZXk/LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ3RheCcpO1xyXG4gICAgY29uc3QgZmlsdGVyVHlwZSA9IGlzVGF4ID8gJ1RBWCcgOiAnVkFMVUUnO1xyXG5cclxuICAgIHRoaXMuZGlhbG9nUmVwb3J0UmVxdWVzdC5maWx0ZXJSZXF1ZXN0LmZpbHRlcnMucHVzaChcclxuICAgICAgdGhpcy5jcmVhdGVGaWx0ZXIoJ2ZpbHRlclR5cGUnLCAnZmlsdGVyVHlwZScsIGZpbHRlclR5cGUpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBidWlsZERpYWxvZ1JlcG9ydFJlcXVlc3QoKTogYW55IHtcclxuICAgIHJldHVybiB0aGlzLmJhY2tlbmRTZXJ2aWNlLmJ1aWxkUmVwb3J0UmVxdWVzdChcclxuICAgICAgdGhpcy5qdW5pb3JDb2x1bW5zLFxyXG4gICAgICBgJHt0aGlzLmp1bmlvclBhZ2VJbmZvLmxhYmVsc1NlY3Rpb259LiR7dGhpcy5qdW5pb3JQYWdlSW5mby5pZH1gLFxyXG4gICAgICB7IC4uLnRoaXMuZGlhbG9nUmVwb3J0UmVxdWVzdC5maWx0ZXJSZXF1ZXN0IH0sXHJcbiAgICAgICcnLFxyXG4gICAgICB0aGlzLmp1bmlvclBhZ2VJbmZvLFxyXG4gICAgICAnTEFORFNDQVBFJ1xyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlRmlsdGVyKGtleTogc3RyaW5nLCBmaWVsZE5hbWU6IHN0cmluZywgdmFsdWU6IGFueSk6IEZpbHRlciB7XHJcbiAgICByZXR1cm4gbmV3IEZpbHRlcih7XHJcbiAgICAgIGtleSxcclxuICAgICAgZmllbGROYW1lLFxyXG4gICAgICBsYWJlbDogJycsXHJcbiAgICAgIGZpbHRlclR5cGU6ICdGSUxFRF9GSUxURVInLFxyXG4gICAgICBvcGVyYXRvcjogJ0VRVUFMUycsXHJcbiAgICAgIHZhbHVlT2JqZWN0OiB2YWx1ZSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhZGRPclJlcGxhY2VGaWx0ZXIoaWQ6IHN0cmluZywgZmllbGROYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpOiB2b2lkIHtcclxuICAgIGNvbnN0IGZpbHRlciA9IG5ldyBGaWx0ZXIoe1xyXG4gICAgICBpZCxcclxuICAgICAgZmllbGROYW1lLFxyXG4gICAgICBsYWJlbDogJycsXHJcbiAgICAgIGZpbHRlclR5cGU6ICdGSUxFRF9GSUxURVInLFxyXG4gICAgICBvcGVyYXRvcjogJ0VRVUFMUycsXHJcbiAgICAgIHZhbHVlT2JqZWN0OiB2YWx1ZSxcclxuICAgIH0pO1xyXG5cclxuICAgIGNvbnN0IGZpbHRlcnMgPSB0aGlzLmRpYWxvZ1JlcG9ydFJlcXVlc3QuZmlsdGVyUmVxdWVzdC5maWx0ZXJzO1xyXG4gICAgY29uc3QgZXhpc3RpbmdJbmRleCA9IGZpbHRlcnMuZmluZEluZGV4KChmOiBGaWx0ZXIpID0+IGYuaWQgPT09IGlkKTtcclxuXHJcbiAgICBpZiAoZXhpc3RpbmdJbmRleCAhPT0gLTEpIHtcclxuICAgICAgZmlsdGVycy5zcGxpY2UoZXhpc3RpbmdJbmRleCwgMSwgZmlsdGVyKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGZpbHRlcnMucHVzaChmaWx0ZXIpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG5cclxuICBlbWl0SnVuaW9yQWN0aW9uKCRldmVudDogVGFibGVQYWdlVXNlckFjdGlvbikge1xyXG4gICAgY29uc3QganVuaW9yQWN0aW9uID0gSlVOSU9SX0RPV05fQUNUSU9OO1xyXG4gICAganVuaW9yQWN0aW9uLnBhZ2VJbmZvID0gdGhpcy5kcmlsbERvd25QYWdlSW5mbztcclxuICAgIHRoaXMuZG9KdW5pb3JBY3Rpb24oJGV2ZW50KTtcclxuICB9XHJcblxyXG4gIGRyaWxsRG93bigpIHtcclxuICAgIGNvbnN0IGRyaWxsZG93bmFjdGlvbiA9IERSSUxMX0RPV05fQUNUSU9OO1xyXG4gICAgZHJpbGxkb3duYWN0aW9uLnBhZ2VJbmZvID0gdGhpcy5kcmlsbERvd25QYWdlSW5mbztcclxuICAgIHRoaXMuZG9BRHJpbGxEb3duQWN0aW9uKGRyaWxsZG93bmFjdGlvbik7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGRvSnVuaW9yQWN0aW9uKCRldmVudDogVGFibGVQYWdlVXNlckFjdGlvbikge1xyXG4gICAgaWYgKHRoaXMuanVuaW9yQ29sdW1ucyAmJiB0aGlzLmp1bmlvclBhZ2VJbmZvKSB7XHJcbiAgICAgIGlmICh0aGlzLmVucmljaEp1bmlvclJlcG9ydFJlcXVlc3QpIHtcclxuICAgICAgICBpZiAodGhpcy5hY3RpdmVMZXZlbCA9PT0gMikge1xyXG4gICAgICAgICAgdGhpcy5pc0VkaXRhYmxlID0gZmFsc2U7XHJcbiAgICAgICAgICB0aGlzLmRpc2FibGVFeHBvcnRBY3Rpb24gPSB0aGlzLmp1bmlvclBhZ2VJbmZvLmhpZGVSZXBvcnRzRXh0cmFjdEJ1dHRvbiB8fCBmYWxzZTtcclxuICAgICAgICAgIHRoaXMuanVuaW9yUmVwb3J0UmVxdWVzdCA9IHRoaXMuYmFja2VuZFNlcnZpY2UuYnVpbGRSZXBvcnRSZXF1ZXN0KHRoaXMuanVuaW9yQ29sdW1ucyxcclxuICAgICAgICAgICAgdGhpcy5qdW5pb3JQYWdlSW5mby5sYWJlbHNTZWN0aW9uICsgJy4nICsgdGhpcy5qdW5pb3JQYWdlSW5mby5pZCxcclxuICAgICAgICAgICAgdGhpcy5yZXBvcnRSZXF1ZXN0LmZpbHRlclJlcXVlc3QsICcnLCB0aGlzLmp1bmlvclBhZ2VJbmZvLCAnTEFORFNDQVBFJyk7XHJcbiAgICAgICAgICB0aGlzLmVucmljaEp1bmlvclJlcG9ydFJlcXVlc3QoJGV2ZW50LCB0aGlzLmp1bmlvclJlcG9ydFJlcXVlc3QpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICB0aGlzLmFjdGl2ZUxldmVsID0gdGhpcy5hY3RpdmVMZXZlbCArMTtcclxuICAgIH1cclxuICB9XHJcbiAgcHJpdmF0ZSBkb0FEcmlsbERvd25BY3Rpb24oJGV2ZW50OiBUYWJsZVBhZ2VVc2VyQWN0aW9uKSB7XHJcbiAgICBpZiAodGhpcy5kcmlsbERvd25Db2x1bW5zICYmIHRoaXMuZHJpbGxEb3duUGFnZUluZm8pIHtcclxuICAgICAgaWYgKHRoaXMuZW5yaWNoRHJpbGxEb3duUmVwb3J0UmVxdWVzdCkge1xyXG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZUxldmVsID09PSAxKSB7XHJcbiAgICAgICAgICB0aGlzLmlzRWRpdGFibGUgPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMuY2hpbGRSZXBvcnRSZXF1ZXN0ID0gdGhpcy5iYWNrZW5kU2VydmljZS5idWlsZFJlcG9ydFJlcXVlc3QodGhpcy5kcmlsbERvd25Db2x1bW5zLFxyXG4gICAgICAgICAgICB0aGlzLmRyaWxsRG93blBhZ2VJbmZvLmxhYmVsc1NlY3Rpb24gKyAnLicgKyB0aGlzLmRyaWxsRG93blBhZ2VJbmZvLmlkLFxyXG4gICAgICAgICAgICB0aGlzLnJlcG9ydFJlcXVlc3QuZmlsdGVyUmVxdWVzdCwgJycsIHRoaXMuZHJpbGxEb3duUGFnZUluZm8sICdMQU5EU0NBUEUnKTtcclxuICAgICAgICAgIHRoaXMuZGlzYWJsZUV4cG9ydEFjdGlvbiA9IHRoaXMuZHJpbGxEb3duUGFnZUluZm8uaGlkZVJlcG9ydHNFeHRyYWN0QnV0dG9uIHx8IGZhbHNlO1xyXG4gICAgICAgICAgdGhpcy5lbnJpY2hEcmlsbERvd25SZXBvcnRSZXF1ZXN0KCRldmVudCwgdGhpcy5jaGlsZFJlcG9ydFJlcXVlc3QpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICB0aGlzLmFjdGl2ZUxldmVsID0gdGhpcy5hY3RpdmVMZXZlbCArMTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZG9IeXBlckxpbmtBY3Rpb24oJGV2ZW50OiBUYWJsZVBhZ2VVc2VyQWN0aW9uKSB7XHJcbiAgICBpZiAodGhpcy5lbnJpY2hIeXBlckxpbmtSZXBvcnRSZXF1ZXN0KSB7XHJcbiAgICAgICAgICB0aGlzLmp1bmlvclJlcG9ydFJlcXVlc3QgPSB0aGlzLmJhY2tlbmRTZXJ2aWNlLmJ1aWxkUmVwb3J0UmVxdWVzdCh0aGlzLmp1bmlvckNvbHVtbnMsXHJcbiAgICAgICAgICAgIHRoaXMuanVuaW9yUGFnZUluZm8ubGFiZWxzU2VjdGlvbiArICcuJyArIHRoaXMuanVuaW9yUGFnZUluZm8uaWQsXHJcbiAgICAgICAgICAgIHRoaXMuZGlhbG9nUmVwb3J0UmVxdWVzdC5maWx0ZXJSZXF1ZXN0LCAnJywgdGhpcy5qdW5pb3JQYWdlSW5mbywgJ0xBTkRTQ0FQRScpO1xyXG4gICAgICAgICAgdGhpcy5kaXNhYmxlRXhwb3J0QWN0aW9uID0gdGhpcy5qdW5pb3JQYWdlSW5mby5oaWRlUmVwb3J0c0V4dHJhY3RCdXR0b24gfHwgZmFsc2U7XHJcbiAgICAgICAgICB0aGlzLmVucmljaEh5cGVyTGlua1JlcG9ydFJlcXVlc3QoJGV2ZW50LCB0aGlzLmp1bmlvclJlcG9ydFJlcXVlc3QpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZXh0cmFjdFJlcG9ydChyZXBvcnRUeXBlOiBhbnkpIHtcclxuICAgICAgaWYgKHRoaXMuYWN0aXZlTGV2ZWwgPT09IDEpIHtcclxuICAgICAgICB0aGlzLnJlcG9ydFJlcXVlc3QucmVwb3J0VHlwZSA9IHJlcG9ydFR5cGU7XHJcbiAgICAgICAgdGhpcy5iYWNrZW5kU2VydmljZS5kb3dubG9hZFJlcG9ydCh0aGlzLnJlcG9ydFJlcXVlc3QsIHRoaXMucGFnZUluZm8uYXBpVXJpICk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAodGhpcy5hY3RpdmVMZXZlbCA9PT0gMikge1xyXG4gICAgICAgIHRoaXMuY2hpbGRSZXBvcnRSZXF1ZXN0LnJlcG9ydFR5cGUgPSByZXBvcnRUeXBlO1xyXG4gICAgICAgIHRoaXMuYmFja2VuZFNlcnZpY2UuZG93bmxvYWRSZXBvcnQodGhpcy5jaGlsZFJlcG9ydFJlcXVlc3QsIHRoaXMuZHJpbGxEb3duUGFnZUluZm8uYXBpVXJpICk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAodGhpcy5hY3RpdmVMZXZlbCA9PT0gMykge1xyXG4gICAgICAgIHRoaXMuanVuaW9yUmVwb3J0UmVxdWVzdC5yZXBvcnRUeXBlID0gcmVwb3J0VHlwZTtcclxuICAgICAgICB0aGlzLmJhY2tlbmRTZXJ2aWNlLmRvd25sb2FkUmVwb3J0KHRoaXMuanVuaW9yUmVwb3J0UmVxdWVzdCwgdGhpcy5qdW5pb3JQYWdlSW5mby5hcGlVcmkgKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICBnb1VwKCkge1xyXG4gICAgdGhpcy5pc0VkaXRhYmxlID0gdHJ1ZTtcclxuICAgIHRoaXMuYWN0aXZlTGV2ZWwgPSB0aGlzLmFjdGl2ZUxldmVsIC0xO1xyXG4gICAgdGhpcy5kb0FjdGlvbih0aGlzLngpO1xyXG4gICAgdGhpcy5yZWxvYWREYXRhID0gdHJ1ZTtcclxuICAgIGlmICh0aGlzLmFjdGl2ZUxldmVsID4xKSB7XHJcbiAgICAgIHRoaXMuaXNFZGl0YWJsZSA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgdGhpcy5kaXNhYmxlRXhwb3J0QWN0aW9uID0gZmFsc2VcclxuICB9XHJcblxyXG4gIGRyaWxsRG93bkVuYWJsZWQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5kcmlsbERvd25QYWdlSW5mbyAmJiAhdGhpcy5oaWRlRHJpbGxEb3duQnV0dG9uICYmICF0aGlzLmdldElzRW1wdHlMaXN0KCk7XHJcbiAgfVxyXG5cclxuICBkcmlsbERvd25MYWJlbCgpIHtcclxuICAgIHJldHVybiBgJHt0aGlzLnBhZ2VJbmZvLmxhYmVsc1NlY3Rpb259LmRyaWxsRG93bkxhYmVsYCA7XHJcbiAgfVxyXG4gIGdldElzRW1wdHlMaXN0KCkge1xyXG4gICAgcmV0dXJuIHRoaXMuYmFja2VuZFNlcnZpY2UuaXNFbXB0eUl0ZW1zIHx8IHRoaXMuZGlzYWJsZUV4cG9ydEFjdGlvbiA9PT0gdHJ1ZTtcclxuICB9XHJcbiAgY2xlYXIoKSB7XHJcbiAgICBjb25zdCBjdXJyZW50VXJsID0gdGhpcy5yb3V0ZXIudXJsO1xyXG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGVCeVVybCgnLycsIHsgc2tpcExvY2F0aW9uQ2hhbmdlOiB0cnVlIH0pLnRoZW4oKCkgPT4ge1xyXG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbY3VycmVudFVybF0pO1xyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gaWYgKHRoaXMucmVwb3J0Rm9ybSkge1xyXG4gICAgLy8gICB0aGlzLnJlcG9ydEZvcm0ucmVzZXQoKTtcclxuICAgIC8vXHJcbiAgICAvLyAgIHRoaXMuZmllbGRzLmZvckVhY2goZmllbGQgPT4ge1xyXG4gICAgLy8gICAgIGlmIChmaWVsZC50eXBlID09PSAnbG9va3VwJyB8fCBmaWVsZC50eXBlID09PSAnbXVsdGktc2VsZWN0Jykge1xyXG4gICAgLy8gICAgICAgY29uc3QgY29udHJvbCA9IHRoaXMucmVwb3J0Rm9ybS5nZXQoZmllbGQucHJvcGVydHkpO1xyXG4gICAgLy8gICAgICAgaWYgKGNvbnRyb2wpIHtcclxuICAgIC8vICAgICAgICAgY29udHJvbC5zZXRWYWx1ZShbXSk7XHJcbiAgICAvLyAgICAgICB9XHJcbiAgICAvLyAgICAgfVxyXG4gICAgLy8gICB9KTtcclxuICAgIC8vIH1cclxuXHJcbiAgfVxyXG5cclxuXHJcbiAgaXNGb3JtRW1wdHkoKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoIXRoaXMucmVwb3J0Rm9ybSB8fCAhdGhpcy5yZXBvcnRGb3JtLnZhbHVlKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBPYmplY3QudmFsdWVzKHRoaXMucmVwb3J0Rm9ybS52YWx1ZSkuZXZlcnkodmFsdWUgPT4ge1xyXG4gICAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gJycpIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID09PSAwO1xyXG5cclxuXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHNob3VsZFByb2Nlc3NFdmVudEl0ZW0oaXRlbTogYW55KTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBncm91cEJ5UHJvcCA9IHRoaXMucGFnZUluZm8/Lmdyb3VwQnlQcm9wZXJ0eTtcclxuICAgIGNvbnN0IGdyb3VwQnlWYWx1ZXMgPSB0aGlzLnBhZ2VJbmZvPy5ncm91cEJ5VmFsdWU7XHJcblxyXG4gICAgaWYgKCFncm91cEJ5UHJvcCB8fCAhZ3JvdXBCeVZhbHVlcyB8fCAhaXRlbVtncm91cEJ5UHJvcF0pIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgdmFsdWUgPSBpdGVtW2dyb3VwQnlQcm9wXS50b1N0cmluZygpO1xyXG5cclxuICAgIHJldHVybiAhZ3JvdXBCeVZhbHVlcy5zb21lKHYgPT4gdmFsdWUuaW5jbHVkZXModikgJiYgdmFsdWUubGVuZ3RoID49IHYubGVuZ3RoKTtcclxuICB9XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cImNvbHVtbiBmdWxsLXdpZHRoXCI+XHJcblxyXG4gIDxkaXYgY2xhc3M9XCJyb3cgYWxpZ24tc3RhcnQtY2VudGVyXCIgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiAxMHB4O1wiPlxyXG4gICAgPGFwcC10aXRsZS1iYXIgW3BhZ2VUaXRsZV09XCJnZXRUaXRsZSgpXCIgW25ld0FjdGlvbl09XCJmYWxzZVwiPjwvYXBwLXRpdGxlLWJhcj5cclxuXHJcbiAgICA8bWF0LWljb25cclxuICAgICAgKm5nSWY9XCJwYWdlSW5mbz8uaGFzSGludFwiXHJcbiAgICAgIHJvbGU9XCJpbWdcIlxyXG4gICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIihwYWdlSW5mby5sYWJlbHNTZWN0aW9uICsgJy5oaW50JykgfCB0cmFuc2xhdGVcIlxyXG4gICAgICBbbWF0VG9vbHRpcF09XCJwYWdlSW5mby5sYWJlbHNTZWN0aW9uICsgJy5oaW50JyB8IHRyYW5zbGF0ZVwiXHJcbiAgICAgIG1hdFRvb2x0aXBQb3NpdGlvbj1cInJpZ2h0XCJcclxuICAgICAgY29sb3I9XCJwcmltYXJ5XCJcclxuICAgICAgY2xhc3M9XCJoaW50LWljb25cIlxyXG4gICAgICBtYXRUb29sdGlwQ2xhc3M9XCJjdXN0b20tdG9vbHRpcFwiPlxyXG4gICAgICBoZWxwX291dGxpbmVcclxuICAgIDwvbWF0LWljb24+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDxhcHAtYmFzZS1mb3JtLWNhbnZhc1xyXG4gICAgW3BhZ2VJbmZvXT1cInBhZ2VJbmZvXCJcclxuICAgIFtmaWVsZHNdPVwiZmllbGRzXCJcclxuICAgIFtlZGl0YWJsZV09XCJpc0VkaXRhYmxlXCJcclxuICAgIFtlcnJvcnNdPVwiZXJyb3JzXCJcclxuICAgIFtpdGVtXT1cInRoaXMucmVwb3J0Rm9ybT8udmFsdWUgfHwge31cIlxyXG4gICAgKGZvcm1VcGRhdGVkKT1cInVwZGF0ZUZvcm0oJGV2ZW50KVwiXHJcbiAgPjwvYXBwLWJhc2UtZm9ybS1jYW52YXM+XHJcblxyXG4gIDxicj48YnI+XHJcblxyXG4gIDxkaXYgY2xhc3M9XCJjb2x1bW5cIj5cclxuICAgIDxkaXYgY2xhc3M9XCJyb3cgZ2FwLTEwIHJlc3BvbnNpdmUtcm93XCI+XHJcbiAgICAgIDxidXR0b24gKm5nSWY9XCJhY3RpdmVMZXZlbCA9PT0gMVwiIGNvbG9yPVwicHJpbWFyeVwiIG1hdC1mbGF0LWJ1dHRvbiAoY2xpY2spPVwiZG9BY3Rpb24oeClcIiBbZGlzYWJsZWRdPVwiIWlzVmFsaWRGb3JtKClcIiBpZD1cInJlcG9ydC1nZW5lcmF0ZS1idG5cIj5cclxuICAgICAgICB7eyAnUkVQT1JUUy5nZW5lcmF0ZScgfCB0cmFuc2xhdGUgfX1cclxuICAgICAgPC9idXR0b24+XHJcblxyXG4gICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIFttYXRNZW51VHJpZ2dlckZvcl09XCJtZW51XCIgW2Rpc2FibGVkXT1cImdldElzRW1wdHlMaXN0KClcIiBjb2xvcj1cInByaW1hcnlcIiBpZD1cInJlcG9ydC1leHRyYWN0LXRyaWdnZXJcIj5cclxuICAgICAgICB7eyAnZXh0cmFjdCcgfCB0cmFuc2xhdGUgfX1cclxuICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJleHBhbmRfbW9yZSBhY3Rpb25CdXR0b25fX2V4cGFuZFwiPmV4cGFuZF9tb3JlPC9tYXQtaWNvbj5cclxuICAgICAgPC9idXR0b24+XHJcblxyXG4gICAgICA8YnV0dG9uIG1hdC1mbGF0LWJ1dHRvbiAoY2xpY2spPVwiY2xlYXIoKVwiIFtkaXNhYmxlZF09XCJpc0Zvcm1FbXB0eSgpIHx8IGFjdGl2ZUxldmVsID4gMVwiIGlkPVwicmVwb3J0LWNsZWFyLWJ0blwiPlxyXG4gICAgICAgIHt7ICdSRVBPUlRTLmNsZWFyJyB8IHRyYW5zbGF0ZSB9fVxyXG4gICAgICA8L2J1dHRvbj5cclxuXHJcbiAgICAgIDxidXR0b24gKm5nSWY9XCJhY3RpdmVMZXZlbCA9PT0gMSAmJiBkcmlsbERvd25FbmFibGVkKClcIiBjb2xvcj1cIndhcm5cIiBtYXQtZmxhdC1idXR0b24gKGNsaWNrKT1cImRyaWxsRG93bigpXCIgaWQ9XCJyZXBvcnQtZHJpbGxkb3duLWJ0blwiPlxyXG4gICAgICAgIHt7IGRyaWxsRG93bkxhYmVsKCkgfCB0cmFuc2xhdGUgfX1cclxuICAgICAgPC9idXR0b24+XHJcblxyXG4gICAgICA8YnV0dG9uICpuZ0lmPVwiYWN0aXZlTGV2ZWwgPiAxICYmIGJhY2tCdXR0b25FbmFibGVkXCIgY29sb3I9XCJ3YXJuXCIgbWF0LWZsYXQtYnV0dG9uIChjbGljayk9XCJnb1VwKClcIiBpZD1cInJlcG9ydC11cC1idG5cIj5cclxuICAgICAgICB7eyAnUkVQT1JUUy51cCcgfCB0cmFuc2xhdGUgfX1cclxuICAgICAgPC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuXHJcbiAgPGRpdiAqbmdJZj1cImFjdGl2ZUxldmVsID49IDFcIiBjbGFzcz1cIm1haW4tZm9ybS1jYW52YXMgcm93IGFsaWduLXN0YXJ0LXN0YXJ0IHJlc3BvbnNpdmUtdGFibGVcIiBzdHlsZT1cIm1hcmdpbi10b3A6IDN2aDtcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJjb2x1bW4gZnVsbC13aWR0aFwiPlxyXG4gICAgICA8YXBwLWJhc2UtdGFibGVcclxuICAgICAgICAqbmdJZj1cImFjdGl2ZUxldmVsID09PSAxXCJcclxuICAgICAgICBbcGFnZUluZm9dPVwicGFnZUluZm9cIlxyXG4gICAgICAgIFtjb2x1bW5zXT1cImNvbHVtbnNEZWZpbml0aW9uXCJcclxuICAgICAgICBbZW5mb3JjZVJlZnJlc2hdPVwicmVsb2FkRGF0YVwiXHJcbiAgICAgICAgaWQ9XCJwYXJlbnRcIlxyXG4gICAgICAgIFtyZXBvcnRSZXF1ZXN0XT1cInJlcG9ydFJlcXVlc3RcIlxyXG4gICAgICAgICh1c2VyQWN0aW9uKT1cImVtaXRVc2VyQWN0aW9uKCRldmVudClcIlxyXG4gICAgICAgIChoeXBlckxpbmtBY3Rpb24pPVwiZW1pdEh5cGVyTGlua0FjdGlvbigkZXZlbnQpXCI+XHJcbiAgICAgIDwvYXBwLWJhc2UtdGFibGU+XHJcblxyXG4gICAgICA8YXBwLWJhc2UtdGFibGVcclxuICAgICAgICAqbmdJZj1cImFjdGl2ZUxldmVsID09PSAyXCJcclxuICAgICAgICBbcGFnZUluZm9dPVwiZHJpbGxEb3duUGFnZUluZm9cIlxyXG4gICAgICAgIFtjb2x1bW5zXT1cImRyaWxsRG93bkNvbHVtbnNcIlxyXG4gICAgICAgIGlkPVwiY2hpbGRcIlxyXG4gICAgICAgIFtyZXBvcnRSZXF1ZXN0XT1cImNoaWxkUmVwb3J0UmVxdWVzdFwiXHJcbiAgICAgICAgKHVzZXJBY3Rpb24pPVwiZW1pdEp1bmlvckFjdGlvbigkZXZlbnQpXCJcclxuICAgICAgICAoaHlwZXJMaW5rQWN0aW9uKT1cImVtaXRIeXBlckxpbmtBY3Rpb24oJGV2ZW50KVwiPlxyXG4gICAgICA8L2FwcC1iYXNlLXRhYmxlPlxyXG5cclxuICAgICAgPGFwcC1iYXNlLXRhYmxlXHJcbiAgICAgICAgKm5nSWY9XCJhY3RpdmVMZXZlbCA9PT0gM1wiXHJcbiAgICAgICAgW3BhZ2VJbmZvXT1cImp1bmlvclBhZ2VJbmZvXCJcclxuICAgICAgICBbY29sdW1uc109XCJqdW5pb3JDb2x1bW5zXCJcclxuICAgICAgICBpZD1cImp1bmlvclwiXHJcbiAgICAgICAgW3JlcG9ydFJlcXVlc3RdPVwianVuaW9yUmVwb3J0UmVxdWVzdFwiPlxyXG4gICAgICA8L2FwcC1iYXNlLXRhYmxlPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcblxyXG48L2Rpdj5cclxuXHJcbjxtYXQtbWVudSAjbWVudT1cIm1hdE1lbnVcIj5cclxuICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBtYXQtbWVudS1pdGVtICpuZ0Zvcj1cImxldCB0eXBlIG9mIHR5cGVzXCIgKGNsaWNrKT1cImV4dHJhY3RSZXBvcnQodHlwZSlcIiBbYXR0ci5pZF09XCIncmVwb3J0LWV4dHJhY3QtaXRlbS0nICsgdHlwZVwiPlxyXG4gICAge3sgdHlwZSB9fVxyXG4gIDwvYnV0dG9uPlxyXG48L21hdC1tZW51PlxyXG4iXX0=