ng-pli-commons 0.0.1908 → 1.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 (471) hide show
  1. package/esm2022/lib/components/backoffice.commons.component.mjs +40 -0
  2. package/esm2022/lib/components/common.lists.component.mjs +194 -0
  3. package/{esm2020 → esm2022}/lib/components/configuration-token/configuration-token-subject.service.mjs +23 -23
  4. package/esm2022/lib/components/configuration-token/configuration-token.component.mjs +665 -0
  5. package/esm2022/lib/components/configuration-token/guarantee-token/guarantee-token.component.mjs +103 -0
  6. package/esm2022/lib/components/configuration-token/snapshot-token/snapshot-token.component.mjs +108 -0
  7. package/esm2022/lib/components/configuration.commons.component.mjs +40 -0
  8. package/{esm2020 → esm2022}/lib/components/dashboard.commons.component.mjs +84 -84
  9. package/esm2022/lib/components/dynamic-filter/dynamic-filter.component.mjs +131 -0
  10. package/esm2022/lib/components/excel-to-json/excel-to-json.component.mjs +54 -0
  11. package/esm2022/lib/components/frontoffice.commons.component.mjs +86 -0
  12. package/esm2022/lib/components/pdf-analyzer/pdf-analyzer.component.mjs +162 -0
  13. package/{esm2020 → esm2022}/lib/components/pdf-config/pdf-config.component.mjs +170 -170
  14. package/esm2022/lib/components/pdf-generator/pdf-generator.component.mjs +223 -0
  15. package/esm2022/lib/components/pdf-merge-visualizer/pdf-merge-visualizer.component.mjs +307 -0
  16. package/esm2022/lib/components/pdf-visualizer/pdf-visualizer.component.mjs +387 -0
  17. package/esm2022/lib/components/progress-bar/progress-bar.component.mjs +92 -0
  18. package/esm2022/lib/components/segmentation-tokens/segmentation-tokens.component.mjs +199 -0
  19. package/esm2022/lib/components/select-ppp/select-ppp.component.mjs +199 -0
  20. package/esm2022/lib/components/show-hide-columns/show-hide-columns-table.component.mjs +116 -0
  21. package/esm2022/lib/components/token/token.component.mjs +1006 -0
  22. package/esm2022/lib/components/tokens-calculator/tokens-calculator.component.mjs +128 -0
  23. package/{esm2020 → esm2022}/lib/directives/currency-colfuturo-formatter.directive.mjs +47 -47
  24. package/{esm2020 → esm2022}/lib/directives/currency-decimal-colfuturo-formatter.directive.mjs +34 -34
  25. package/esm2022/lib/ng-pli-commons.module.mjs +387 -0
  26. package/{esm2020 → esm2022}/lib/ng-pli-commons.service.mjs +14 -14
  27. package/esm2022/lib/pipes/currency-colfuturo.pipe.mjs +35 -0
  28. package/{esm2020 → esm2022}/lib/pipes/currency-decimal-colfuturo.pipe.mjs +36 -36
  29. package/{esm2020 → esm2022}/lib/pipes/currency-print-colfuturo.pipe.mjs +33 -33
  30. package/esm2022/lib/pipes/thousands.pipe.mjs +60 -0
  31. package/{esm2020 → esm2022}/lib/services/application-fill-percentage.service.mjs +30 -30
  32. package/{esm2020 → esm2022}/lib/services/application-tag.service.mjs +56 -56
  33. package/{esm2020 → esm2022}/lib/services/application.service.mjs +247 -247
  34. package/esm2022/lib/services/authentication.service.mjs +133 -0
  35. package/{esm2020 → esm2022}/lib/services/blocked-beneficiary.service.mjs +42 -42
  36. package/esm2022/lib/services/budget-application.service.mjs +265 -0
  37. package/{esm2020 → esm2022}/lib/services/budget-simulation.service.mjs +61 -61
  38. package/esm2022/lib/services/budget.service.mjs +205 -0
  39. package/{esm2020 → esm2022}/lib/services/closure-wallet.service.mjs +39 -39
  40. package/{esm2020 → esm2022}/lib/services/cnf-correspondence-document-manager.service.mjs +39 -39
  41. package/{esm2020 → esm2022}/lib/services/committee-money.service.mjs +44 -44
  42. package/{esm2020 → esm2022}/lib/services/committee-pdf.service.mjs +27 -27
  43. package/{esm2020 → esm2022}/lib/services/committee-snapshot.service.mjs +60 -60
  44. package/{esm2020 → esm2022}/lib/services/common-info.service.mjs +51 -51
  45. package/esm2022/lib/services/common.service.mjs +291 -0
  46. package/esm2022/lib/services/configuration-document.service.mjs +297 -0
  47. package/{esm2020 → esm2022}/lib/services/configuration-minisite.service.mjs +26 -26
  48. package/{esm2020 → esm2022}/lib/services/configuration.service.mjs +53 -53
  49. package/{esm2020 → esm2022}/lib/services/correspondence-document-category.service.mjs +31 -31
  50. package/{esm2020 → esm2022}/lib/services/correspondence-manager.service.mjs +67 -67
  51. package/{esm2020 → esm2022}/lib/services/credit-score.service.mjs +48 -48
  52. package/{esm2020 → esm2022}/lib/services/credit-study.service.mjs +292 -292
  53. package/{esm2020 → esm2022}/lib/services/cube.service.mjs +27 -27
  54. package/{esm2020 → esm2022}/lib/services/data-form-history.service.mjs +25 -25
  55. package/{esm2020 → esm2022}/lib/services/data-form.service.mjs +176 -176
  56. package/{esm2020 → esm2022}/lib/services/data-letter-segmentation.service.mjs +64 -64
  57. package/{esm2020 → esm2022}/lib/services/document-analysis-auto.service.mjs +27 -27
  58. package/{esm2020 → esm2022}/lib/services/document-history.service.mjs +43 -43
  59. package/{esm2020 → esm2022}/lib/services/document-management.service.mjs +57 -57
  60. package/{esm2020 → esm2022}/lib/services/document-validation-attempt.service.mjs +32 -32
  61. package/{esm2020 → esm2022}/lib/services/document.service.mjs +131 -131
  62. package/esm2022/lib/services/documentary.type.service.mjs +69 -0
  63. package/{esm2020 → esm2022}/lib/services/email.service.mjs +30 -30
  64. package/{esm2020 → esm2022}/lib/services/evaluation.service.mjs +181 -181
  65. package/{esm2020 → esm2022}/lib/services/export-excel.service.mjs +32 -32
  66. package/esm2022/lib/services/file.service.mjs +153 -0
  67. package/{esm2020 → esm2022}/lib/services/form.service.mjs +112 -112
  68. package/{esm2020 → esm2022}/lib/services/gic-client-disbursement-metadata.service.mjs +31 -31
  69. package/{esm2020 → esm2022}/lib/services/gic-client.service.mjs +49 -49
  70. package/{esm2020 → esm2022}/lib/services/gic-cnf-bankvision-transaction.service.mjs +31 -31
  71. package/{esm2020 → esm2022}/lib/services/gic-cnf-closing-date.service.mjs +34 -34
  72. package/{esm2020 → esm2022}/lib/services/gic-cnf-maintenance.service.mjs +30 -30
  73. package/{esm2020 → esm2022}/lib/services/gic-collection.service.mjs +53 -53
  74. package/{esm2020 → esm2022}/lib/services/gic-disbursement.service.mjs +39 -39
  75. package/{esm2020 → esm2022}/lib/services/gic-extract.service.mjs +41 -41
  76. package/{esm2020 → esm2022}/lib/services/gic-log.service.mjs +41 -41
  77. package/{esm2020 → esm2022}/lib/services/gic-payment-application.service.mjs +35 -35
  78. package/{esm2020 → esm2022}/lib/services/gic-payment-plan-cube.service.mjs +27 -27
  79. package/{esm2020 → esm2022}/lib/services/gic-payment-plan.service.mjs +32 -32
  80. package/{esm2020 → esm2022}/lib/services/gic-trm.service.mjs +27 -27
  81. package/{esm2020 → esm2022}/lib/services/global.show.task.service.mjs +37 -37
  82. package/{esm2020 → esm2022}/lib/services/guarantee-document.service.mjs +52 -52
  83. package/{esm2020 → esm2022}/lib/services/guarantee-enrollment.service.mjs +37 -37
  84. package/esm2022/lib/services/guarantee.service.mjs +128 -0
  85. package/{esm2020 → esm2022}/lib/services/hash.service.mjs +36 -36
  86. package/{esm2020 → esm2022}/lib/services/import-data.service.mjs +27 -27
  87. package/{esm2020 → esm2022}/lib/services/import-excel-gic.service.mjs +45 -45
  88. package/{esm2020 → esm2022}/lib/services/initial-configuration-gic-parameters.service.mjs +51 -51
  89. package/{esm2020 → esm2022}/lib/services/initial-record.service.mjs +51 -51
  90. package/{esm2020 → esm2022}/lib/services/integration-ado.service.mjs +54 -54
  91. package/{esm2020 → esm2022}/lib/services/interaction-application-user.service.mjs +81 -81
  92. package/{esm2020 → esm2022}/lib/services/interest-adjustment.service.mjs +34 -34
  93. package/esm2022/lib/services/keys-assignation.service.mjs +127 -0
  94. package/{esm2020 → esm2022}/lib/services/legalization.service.mjs +150 -150
  95. package/{esm2020 → esm2022}/lib/services/letter-campaing.service.mjs +49 -49
  96. package/{esm2020 → esm2022}/lib/services/letter-task-mapping.service.mjs +40 -40
  97. package/{esm2020 → esm2022}/lib/services/log.service.mjs +41 -41
  98. package/{esm2020 → esm2022}/lib/services/maintenance.service.mjs +66 -66
  99. package/{esm2020 → esm2022}/lib/services/master-category.service.mjs +66 -66
  100. package/{esm2020 → esm2022}/lib/services/master-program.service.mjs +78 -78
  101. package/{esm2020 → esm2022}/lib/services/master-university.service.mjs +68 -68
  102. package/{esm2020 → esm2022}/lib/services/migration-plis.service.mjs +27 -27
  103. package/{esm2020 → esm2022}/lib/services/migration-survey-queue.service.mjs +24 -24
  104. package/{esm2020 → esm2022}/lib/services/page.service.mjs +38 -38
  105. package/{esm2020 → esm2022}/lib/services/partner-system.service.mjs +30 -30
  106. package/{esm2020 → esm2022}/lib/services/partner.service.mjs +34 -34
  107. package/{esm2020 → esm2022}/lib/services/pdf-analyzer.service.mjs +33 -33
  108. package/{esm2020 → esm2022}/lib/services/people-master.service.mjs +42 -42
  109. package/{esm2020 → esm2022}/lib/services/permission.service.mjs +29 -29
  110. package/{esm2020 → esm2022}/lib/services/pli-cnf-acuity-fields.service.mjs +34 -34
  111. package/{esm2020 → esm2022}/lib/services/pli-cnf-app-card-filter.service.mjs +40 -40
  112. package/{esm2020 → esm2022}/lib/services/pli-cnf-appointment-type.service.mjs +41 -41
  113. package/{esm2020 → esm2022}/lib/services/pli-cnf-budget-program-type.service.mjs +54 -54
  114. package/{esm2020 → esm2022}/lib/services/pli-cnf-budget.service.mjs +31 -31
  115. package/{esm2020 → esm2022}/lib/services/pli-cnf-cloning.service.mjs +27 -27
  116. package/{esm2020 → esm2022}/lib/services/pli-cnf-committee-pdf-config-table-config.service.mjs +47 -47
  117. package/{esm2020 → esm2022}/lib/services/pli-cnf-committee-pdf-gen-status.service.mjs +30 -30
  118. package/{esm2020 → esm2022}/lib/services/pli-cnf-committee-valpro-columns.service.mjs +42 -42
  119. package/{esm2020 → esm2022}/lib/services/pli-cnf-committee-visualization-mode.service.mjs +42 -42
  120. package/{esm2020 → esm2022}/lib/services/pli-cnf-committee.service.mjs +51 -51
  121. package/{esm2020 → esm2022}/lib/services/pli-cnf-config-minisite.service.mjs +90 -90
  122. package/{esm2020 → esm2022}/lib/services/pli-cnf-configuration-credit-study.service.mjs +41 -41
  123. package/{esm2020 → esm2022}/lib/services/pli-cnf-document-management.service.mjs +40 -40
  124. package/{esm2020 → esm2022}/lib/services/pli-cnf-dynamic-keys-assign.service.mjs +52 -52
  125. package/{esm2020 → esm2022}/lib/services/pli-cnf-evaluation-task-mailing.service.mjs +31 -31
  126. package/esm2022/lib/services/pli-cnf-evaluation-task.service.mjs +112 -0
  127. package/{esm2020 → esm2022}/lib/services/pli-cnf-evaluation-template.service.mjs +95 -95
  128. package/{esm2020 → esm2022}/lib/services/pli-cnf-form-edit.service.mjs +68 -68
  129. package/{esm2020 → esm2022}/lib/services/pli-cnf-form-multiaplicacion.service.mjs +46 -46
  130. package/{esm2020 → esm2022}/lib/services/pli-cnf-guarantee-documents-template.service.mjs +40 -40
  131. package/{esm2020 → esm2022}/lib/services/pli-cnf-guarantee-token.service.mjs +42 -42
  132. package/{esm2020 → esm2022}/lib/services/pli-cnf-header.service.mjs +39 -39
  133. package/{esm2020 → esm2022}/lib/services/pli-cnf-indicator.service.mjs +39 -39
  134. package/{esm2020 → esm2022}/lib/services/pli-cnf-information-system.service.mjs +24 -24
  135. package/{esm2020 → esm2022}/lib/services/pli-cnf-interaction.service.mjs +78 -78
  136. package/{esm2020 → esm2022}/lib/services/pli-cnf-letter-template-type.service.mjs +29 -29
  137. package/{esm2020 → esm2022}/lib/services/pli-cnf-letter-template.service.mjs +48 -48
  138. package/{esm2020 → esm2022}/lib/services/pli-cnf-look-and-feel.service.mjs +28 -28
  139. package/{esm2020 → esm2022}/lib/services/pli-cnf-mail.service.mjs +30 -30
  140. package/{esm2020 → esm2022}/lib/services/pli-cnf-menu-form.service.mjs +34 -34
  141. package/{esm2020 → esm2022}/lib/services/pli-cnf-migration-plis-field-budget.service.mjs +33 -33
  142. package/{esm2020 → esm2022}/lib/services/pli-cnf-migration-plis-field.service.mjs +47 -47
  143. package/{esm2020 → esm2022}/lib/services/pli-cnf-migration-status-plis.service.mjs +44 -44
  144. package/{esm2020 → esm2022}/lib/services/pli-cnf-page-section-form.service.mjs +66 -66
  145. package/{esm2020 → esm2022}/lib/services/pli-cnf-page-sub-process.service.mjs +25 -25
  146. package/{esm2020 → esm2022}/lib/services/pli-cnf-pdfs.service.mjs +31 -31
  147. package/{esm2020 → esm2022}/lib/services/pli-cnf-profile-form.service.mjs +40 -40
  148. package/{esm2020 → esm2022}/lib/services/pli-cnf-profile-user.service.mjs +49 -49
  149. package/{esm2020 → esm2022}/lib/services/pli-cnf-project-summary.service.mjs +39 -39
  150. package/{esm2020 → esm2022}/lib/services/pli-cnf-scenario.service.mjs +47 -47
  151. package/{esm2020 → esm2022}/lib/services/pli-cnf-segmentation.service.mjs +72 -72
  152. package/{esm2020 → esm2022}/lib/services/pli-cnf-snapshot-token.service.mjs +42 -42
  153. package/{esm2020 → esm2022}/lib/services/pli-cnf-status-flow-interaction.service.mjs +74 -74
  154. package/{esm2020 → esm2022}/lib/services/pli-cnf-status-flow.service.mjs +56 -56
  155. package/{esm2020 → esm2022}/lib/services/pli-cnf-support-document-category.service.mjs +47 -47
  156. package/{esm2020 → esm2022}/lib/services/pli-cnf-support-document.service.mjs +56 -56
  157. package/{esm2020 → esm2022}/lib/services/pli-cnf-survey-document.service.mjs +37 -37
  158. package/{esm2020 → esm2022}/lib/services/pli-cnf-survey-pdf.service.mjs +34 -34
  159. package/{esm2020 → esm2022}/lib/services/pli-cnf-survey.service.mjs +46 -46
  160. package/{esm2020 → esm2022}/lib/services/pli-cnf-task-group.service.mjs +33 -33
  161. package/{esm2020 → esm2022}/lib/services/pli-cnf-text-category.service.mjs +38 -38
  162. package/{esm2020 → esm2022}/lib/services/pli-cnf-text-option.service.mjs +39 -39
  163. package/{esm2020 → esm2022}/lib/services/pli-cnf-text.service.mjs +62 -62
  164. package/{esm2020 → esm2022}/lib/services/pli-cnf-type-text.service.mjs +45 -45
  165. package/{esm2020 → esm2022}/lib/services/pli-cnf-university-article.service.mjs +39 -39
  166. package/{esm2020 → esm2022}/lib/services/pli-cnf-user-calendar.service.mjs +36 -36
  167. package/{esm2020 → esm2022}/lib/services/pli-cnf-user-workspace.service.mjs +35 -35
  168. package/{esm2020 → esm2022}/lib/services/pli-cnf-valpro-keys.service.mjs +35 -35
  169. package/{esm2020 → esm2022}/lib/services/pli-cnf-workspace-segmentation.service.mjs +31 -31
  170. package/{esm2020 → esm2022}/lib/services/pli-message-type.service.mjs +40 -40
  171. package/{esm2020 → esm2022}/lib/services/pli-multiple-value-filter.service.mjs +39 -39
  172. package/{esm2020 → esm2022}/lib/services/pli-promocion-username.service.mjs +57 -57
  173. package/{esm2020 → esm2022}/lib/services/pli-seg-action-user.service.mjs +37 -37
  174. package/{esm2020 → esm2022}/lib/services/pli-segmentation.service.mjs +130 -130
  175. package/{esm2020 → esm2022}/lib/services/pli-tag-assignment.service.mjs +36 -36
  176. package/{esm2020 → esm2022}/lib/services/pli-tag.service.mjs +55 -55
  177. package/{esm2020 → esm2022}/lib/services/pli-user.service.mjs +51 -51
  178. package/{esm2020 → esm2022}/lib/services/plis-beneficiario.service.mjs +29 -29
  179. package/{esm2020 → esm2022}/lib/services/plis-estatus-change.service.mjs +30 -30
  180. package/esm2022/lib/services/ppp.service.mjs +360 -0
  181. package/{esm2020 → esm2022}/lib/services/profile.service.mjs +60 -60
  182. package/esm2022/lib/services/progress-bar.service.mjs +40 -0
  183. package/{esm2020 → esm2022}/lib/services/promotion-score.service.mjs +44 -44
  184. package/{esm2020 → esm2022}/lib/services/registry-identifier.service.mjs +39 -39
  185. package/{esm2020 → esm2022}/lib/services/return-refund.service.mjs +53 -53
  186. package/esm2022/lib/services/segmentation-tokens.service.mjs +43 -0
  187. package/{esm2020 → esm2022}/lib/services/segmentation-user-service.service.mjs +90 -90
  188. package/{esm2020 → esm2022}/lib/services/segmentation.service.mjs +31 -31
  189. package/esm2022/lib/services/send-application.service.mjs +492 -0
  190. package/{esm2020 → esm2022}/lib/services/sesion-form.service.mjs +31 -31
  191. package/{esm2020 → esm2022}/lib/services/sesion.service.mjs +48 -48
  192. package/{esm2020 → esm2022}/lib/services/spinner.service.mjs +16 -16
  193. package/{esm2020 → esm2022}/lib/services/sponsorship-letter.service.mjs +68 -68
  194. package/{esm2020 → esm2022}/lib/services/status.service.mjs +100 -100
  195. package/{esm2020 → esm2022}/lib/services/summary-budget.service.mjs +24 -24
  196. package/{esm2020 → esm2022}/lib/services/survey-metadata.service.mjs +28 -28
  197. package/{esm2020 → esm2022}/lib/services/survey-queue.service.mjs +24 -24
  198. package/{esm2020 → esm2022}/lib/services/survey.service.mjs +52 -52
  199. package/{esm2020 → esm2022}/lib/services/tasa.cambio.service.mjs +35 -35
  200. package/{esm2020 → esm2022}/lib/services/token-transformation.service.mjs +62 -62
  201. package/esm2022/lib/services/token.service.mjs +1345 -0
  202. package/{esm2020 → esm2022}/lib/services/university.service.mjs +50 -50
  203. package/esm2022/lib/services/upload-documents.service.mjs +60 -0
  204. package/{esm2020 → esm2022}/lib/services/user.service.mjs +28 -28
  205. package/{esm2020 → esm2022}/lib/services/visualization-committee.service.mjs +84 -84
  206. package/esm2022/lib/utils/custom-validator.mjs +95 -0
  207. package/esm2022/lib/utils/form-util.mjs +35 -0
  208. package/esm2022/lib/utils/formio-util.mjs +582 -0
  209. package/{esm2020 → esm2022}/lib/utils/version-commons.mjs +9 -9
  210. package/{esm2020 → esm2022}/ng-pli-commons.mjs +4 -4
  211. package/{esm2020 → esm2022}/public-api.mjs +214 -214
  212. package/{esm2020 → esm2022}/version.mjs +29 -29
  213. package/{fesm2020 → fesm2022}/ng-pli-commons.mjs +16724 -16725
  214. package/fesm2022/ng-pli-commons.mjs.map +1 -0
  215. package/{ng-pli-commons.d.ts → index.d.ts} +5 -5
  216. package/lib/components/backoffice.commons.component.d.ts +15 -15
  217. package/lib/components/common.lists.component.d.ts +61 -61
  218. package/lib/components/configuration-token/configuration-token-subject.service.d.ts +10 -10
  219. package/lib/components/configuration-token/configuration-token.component.d.ts +124 -124
  220. package/lib/components/configuration-token/guarantee-token/guarantee-token.component.d.ts +33 -33
  221. package/lib/components/configuration-token/snapshot-token/snapshot-token.component.d.ts +37 -37
  222. package/lib/components/configuration.commons.component.d.ts +15 -15
  223. package/lib/components/dashboard.commons.component.d.ts +39 -39
  224. package/lib/components/dynamic-filter/dynamic-filter.component.d.ts +50 -50
  225. package/lib/components/excel-to-json/excel-to-json.component.d.ts +12 -12
  226. package/lib/components/frontoffice.commons.component.d.ts +26 -26
  227. package/lib/components/pdf-analyzer/pdf-analyzer.component.d.ts +36 -36
  228. package/lib/components/pdf-config/pdf-config.component.d.ts +78 -78
  229. package/lib/components/pdf-generator/pdf-generator.component.d.ts +69 -69
  230. package/lib/components/pdf-merge-visualizer/pdf-merge-visualizer.component.d.ts +114 -114
  231. package/lib/components/pdf-visualizer/pdf-visualizer.component.d.ts +147 -147
  232. package/lib/components/progress-bar/progress-bar.component.d.ts +30 -30
  233. package/lib/components/segmentation-tokens/segmentation-tokens.component.d.ts +48 -48
  234. package/lib/components/select-ppp/select-ppp.component.d.ts +42 -42
  235. package/lib/components/show-hide-columns/show-hide-columns-table.component.d.ts +39 -39
  236. package/lib/components/token/token.component.d.ts +99 -99
  237. package/lib/components/tokens-calculator/tokens-calculator.component.d.ts +37 -37
  238. package/lib/directives/currency-colfuturo-formatter.directive.d.ts +14 -14
  239. package/lib/directives/currency-decimal-colfuturo-formatter.directive.d.ts +13 -13
  240. package/lib/ng-pli-commons.module.d.ts +47 -47
  241. package/lib/ng-pli-commons.service.d.ts +6 -6
  242. package/lib/pipes/currency-colfuturo.pipe.d.ts +12 -12
  243. package/lib/pipes/currency-decimal-colfuturo.pipe.d.ts +11 -11
  244. package/lib/pipes/currency-print-colfuturo.pipe.d.ts +11 -11
  245. package/lib/pipes/thousands.pipe.d.ts +9 -9
  246. package/lib/services/application-fill-percentage.service.d.ts +15 -15
  247. package/lib/services/application-tag.service.d.ts +23 -23
  248. package/lib/services/application.service.d.ts +107 -107
  249. package/lib/services/authentication.service.d.ts +45 -45
  250. package/lib/services/blocked-beneficiary.service.d.ts +17 -17
  251. package/lib/services/budget-application.service.d.ts +52 -52
  252. package/lib/services/budget-simulation.service.d.ts +32 -32
  253. package/lib/services/budget.service.d.ts +65 -65
  254. package/lib/services/closure-wallet.service.d.ts +16 -16
  255. package/lib/services/cnf-correspondence-document-manager.service.d.ts +14 -14
  256. package/lib/services/committee-money.service.d.ts +12 -12
  257. package/lib/services/committee-pdf.service.d.ts +13 -13
  258. package/lib/services/committee-snapshot.service.d.ts +24 -24
  259. package/lib/services/common-info.service.d.ts +30 -30
  260. package/lib/services/common.service.d.ts +103 -103
  261. package/lib/services/configuration-document.service.d.ts +84 -84
  262. package/lib/services/configuration-minisite.service.d.ts +13 -13
  263. package/lib/services/configuration.service.d.ts +15 -15
  264. package/lib/services/correspondence-document-category.service.d.ts +12 -12
  265. package/lib/services/correspondence-manager.service.d.ts +21 -21
  266. package/lib/services/credit-score.service.d.ts +14 -14
  267. package/lib/services/credit-study.service.d.ts +52 -52
  268. package/lib/services/cube.service.d.ts +14 -14
  269. package/lib/services/data-form-history.service.d.ts +13 -13
  270. package/lib/services/data-form.service.d.ts +82 -82
  271. package/lib/services/data-letter-segmentation.service.d.ts +20 -20
  272. package/lib/services/document-analysis-auto.service.d.ts +14 -14
  273. package/lib/services/document-history.service.d.ts +18 -18
  274. package/lib/services/document-management.service.d.ts +22 -22
  275. package/lib/services/document-validation-attempt.service.d.ts +13 -13
  276. package/lib/services/document.service.d.ts +51 -51
  277. package/lib/services/documentary.type.service.d.ts +23 -23
  278. package/lib/services/email.service.d.ts +15 -15
  279. package/lib/services/evaluation.service.d.ts +58 -58
  280. package/lib/services/export-excel.service.d.ts +8 -8
  281. package/lib/services/file.service.d.ts +63 -63
  282. package/lib/services/form.service.d.ts +39 -39
  283. package/lib/services/gic-client-disbursement-metadata.service.d.ts +12 -12
  284. package/lib/services/gic-client.service.d.ts +20 -20
  285. package/lib/services/gic-cnf-bankvision-transaction.service.d.ts +13 -13
  286. package/lib/services/gic-cnf-closing-date.service.d.ts +15 -15
  287. package/lib/services/gic-cnf-maintenance.service.d.ts +13 -13
  288. package/lib/services/gic-collection.service.d.ts +19 -19
  289. package/lib/services/gic-disbursement.service.d.ts +16 -16
  290. package/lib/services/gic-extract.service.d.ts +15 -15
  291. package/lib/services/gic-log.service.d.ts +17 -17
  292. package/lib/services/gic-payment-application.service.d.ts +15 -15
  293. package/lib/services/gic-payment-plan-cube.service.d.ts +13 -13
  294. package/lib/services/gic-payment-plan.service.d.ts +19 -19
  295. package/lib/services/gic-trm.service.d.ts +14 -14
  296. package/lib/services/global.show.task.service.d.ts +20 -20
  297. package/lib/services/guarantee-document.service.d.ts +17 -17
  298. package/lib/services/guarantee-enrollment.service.d.ts +14 -14
  299. package/lib/services/guarantee.service.d.ts +34 -34
  300. package/lib/services/hash.service.d.ts +18 -18
  301. package/lib/services/import-data.service.d.ts +14 -14
  302. package/lib/services/import-excel-gic.service.d.ts +22 -22
  303. package/lib/services/initial-configuration-gic-parameters.service.d.ts +19 -19
  304. package/lib/services/initial-record.service.d.ts +24 -24
  305. package/lib/services/integration-ado.service.d.ts +15 -15
  306. package/lib/services/interaction-application-user.service.d.ts +28 -28
  307. package/lib/services/interest-adjustment.service.d.ts +16 -16
  308. package/lib/services/keys-assignation.service.d.ts +33 -33
  309. package/lib/services/legalization.service.d.ts +46 -46
  310. package/lib/services/letter-campaing.service.d.ts +24 -24
  311. package/lib/services/letter-task-mapping.service.d.ts +22 -22
  312. package/lib/services/log.service.d.ts +17 -17
  313. package/lib/services/maintenance.service.d.ts +23 -23
  314. package/lib/services/master-category.service.d.ts +40 -40
  315. package/lib/services/master-program.service.d.ts +45 -45
  316. package/lib/services/master-university.service.d.ts +40 -40
  317. package/lib/services/migration-plis.service.d.ts +14 -14
  318. package/lib/services/migration-survey-queue.service.d.ts +12 -12
  319. package/lib/services/page.service.d.ts +18 -18
  320. package/lib/services/partner-system.service.d.ts +13 -13
  321. package/lib/services/partner.service.d.ts +17 -17
  322. package/lib/services/pdf-analyzer.service.d.ts +11 -11
  323. package/lib/services/people-master.service.d.ts +14 -14
  324. package/lib/services/permission.service.d.ts +14 -14
  325. package/lib/services/pli-cnf-acuity-fields.service.d.ts +14 -14
  326. package/lib/services/pli-cnf-app-card-filter.service.d.ts +20 -20
  327. package/lib/services/pli-cnf-appointment-type.service.d.ts +16 -16
  328. package/lib/services/pli-cnf-budget-program-type.service.d.ts +18 -18
  329. package/lib/services/pli-cnf-budget.service.d.ts +13 -13
  330. package/lib/services/pli-cnf-cloning.service.d.ts +12 -12
  331. package/lib/services/pli-cnf-committee-pdf-config-table-config.service.d.ts +19 -19
  332. package/lib/services/pli-cnf-committee-pdf-gen-status.service.d.ts +13 -13
  333. package/lib/services/pli-cnf-committee-valpro-columns.service.d.ts +15 -15
  334. package/lib/services/pli-cnf-committee-visualization-mode.service.d.ts +17 -17
  335. package/lib/services/pli-cnf-committee.service.d.ts +21 -21
  336. package/lib/services/pli-cnf-config-minisite.service.d.ts +26 -26
  337. package/lib/services/pli-cnf-configuration-credit-study.service.d.ts +16 -16
  338. package/lib/services/pli-cnf-document-management.service.d.ts +15 -15
  339. package/lib/services/pli-cnf-dynamic-keys-assign.service.d.ts +21 -21
  340. package/lib/services/pli-cnf-evaluation-task-mailing.service.d.ts +13 -13
  341. package/lib/services/pli-cnf-evaluation-task.service.d.ts +35 -35
  342. package/lib/services/pli-cnf-evaluation-template.service.d.ts +44 -44
  343. package/lib/services/pli-cnf-form-edit.service.d.ts +29 -29
  344. package/lib/services/pli-cnf-form-multiaplicacion.service.d.ts +21 -21
  345. package/lib/services/pli-cnf-guarantee-documents-template.service.d.ts +17 -17
  346. package/lib/services/pli-cnf-guarantee-token.service.d.ts +16 -16
  347. package/lib/services/pli-cnf-header.service.d.ts +18 -18
  348. package/lib/services/pli-cnf-indicator.service.d.ts +20 -20
  349. package/lib/services/pli-cnf-information-system.service.d.ts +12 -12
  350. package/lib/services/pli-cnf-interaction.service.d.ts +31 -31
  351. package/lib/services/pli-cnf-letter-template-type.service.d.ts +15 -15
  352. package/lib/services/pli-cnf-letter-template.service.d.ts +22 -22
  353. package/lib/services/pli-cnf-look-and-feel.service.d.ts +13 -13
  354. package/lib/services/pli-cnf-mail.service.d.ts +13 -13
  355. package/lib/services/pli-cnf-menu-form.service.d.ts +16 -16
  356. package/lib/services/pli-cnf-migration-plis-field-budget.service.d.ts +14 -14
  357. package/lib/services/pli-cnf-migration-plis-field.service.d.ts +17 -17
  358. package/lib/services/pli-cnf-migration-status-plis.service.d.ts +17 -17
  359. package/lib/services/pli-cnf-page-section-form.service.d.ts +24 -24
  360. package/lib/services/pli-cnf-page-sub-process.service.d.ts +12 -12
  361. package/lib/services/pli-cnf-pdfs.service.d.ts +14 -14
  362. package/lib/services/pli-cnf-profile-form.service.d.ts +20 -20
  363. package/lib/services/pli-cnf-profile-user.service.d.ts +24 -24
  364. package/lib/services/pli-cnf-project-summary.service.d.ts +16 -16
  365. package/lib/services/pli-cnf-scenario.service.d.ts +23 -23
  366. package/lib/services/pli-cnf-segmentation.service.d.ts +32 -32
  367. package/lib/services/pli-cnf-snapshot-token.service.d.ts +16 -16
  368. package/lib/services/pli-cnf-status-flow-interaction.service.d.ts +28 -28
  369. package/lib/services/pli-cnf-status-flow.service.d.ts +26 -26
  370. package/lib/services/pli-cnf-support-document-category.service.d.ts +17 -17
  371. package/lib/services/pli-cnf-support-document.service.d.ts +23 -23
  372. package/lib/services/pli-cnf-survey-document.service.d.ts +16 -16
  373. package/lib/services/pli-cnf-survey-pdf.service.d.ts +15 -15
  374. package/lib/services/pli-cnf-survey.service.d.ts +19 -19
  375. package/lib/services/pli-cnf-task-group.service.d.ts +15 -15
  376. package/lib/services/pli-cnf-text-category.service.d.ts +15 -15
  377. package/lib/services/pli-cnf-text-option.service.d.ts +15 -15
  378. package/lib/services/pli-cnf-text.service.d.ts +21 -21
  379. package/lib/services/pli-cnf-type-text.service.d.ts +16 -16
  380. package/lib/services/pli-cnf-university-article.service.d.ts +20 -20
  381. package/lib/services/pli-cnf-user-calendar.service.d.ts +16 -16
  382. package/lib/services/pli-cnf-user-workspace.service.d.ts +18 -18
  383. package/lib/services/pli-cnf-valpro-keys.service.d.ts +18 -18
  384. package/lib/services/pli-cnf-workspace-segmentation.service.d.ts +16 -16
  385. package/lib/services/pli-message-type.service.d.ts +15 -15
  386. package/lib/services/pli-multiple-value-filter.service.d.ts +17 -17
  387. package/lib/services/pli-promocion-username.service.d.ts +26 -26
  388. package/lib/services/pli-seg-action-user.service.d.ts +20 -20
  389. package/lib/services/pli-segmentation.service.d.ts +48 -48
  390. package/lib/services/pli-tag-assignment.service.d.ts +15 -15
  391. package/lib/services/pli-tag.service.d.ts +21 -21
  392. package/lib/services/pli-user.service.d.ts +24 -24
  393. package/lib/services/plis-beneficiario.service.d.ts +10 -10
  394. package/lib/services/plis-estatus-change.service.d.ts +13 -13
  395. package/lib/services/ppp.service.d.ts +77 -77
  396. package/lib/services/profile.service.d.ts +26 -26
  397. package/lib/services/progress-bar.service.d.ts +14 -14
  398. package/lib/services/promotion-score.service.d.ts +14 -14
  399. package/lib/services/registry-identifier.service.d.ts +16 -16
  400. package/lib/services/return-refund.service.d.ts +20 -20
  401. package/lib/services/segmentation-tokens.service.d.ts +22 -22
  402. package/lib/services/segmentation-user-service.service.d.ts +26 -26
  403. package/lib/services/segmentation.service.d.ts +16 -16
  404. package/lib/services/send-application.service.d.ts +71 -71
  405. package/lib/services/sesion-form.service.d.ts +16 -16
  406. package/lib/services/sesion.service.d.ts +27 -27
  407. package/lib/services/spinner.service.d.ts +6 -6
  408. package/lib/services/sponsorship-letter.service.d.ts +34 -34
  409. package/lib/services/status.service.d.ts +31 -31
  410. package/lib/services/summary-budget.service.d.ts +11 -11
  411. package/lib/services/survey-metadata.service.d.ts +13 -13
  412. package/lib/services/survey-queue.service.d.ts +12 -12
  413. package/lib/services/survey.service.d.ts +17 -17
  414. package/lib/services/tasa.cambio.service.d.ts +14 -14
  415. package/lib/services/token-transformation.service.d.ts +19 -19
  416. package/lib/services/token.service.d.ts +270 -270
  417. package/lib/services/university.service.d.ts +28 -28
  418. package/lib/services/upload-documents.service.d.ts +21 -21
  419. package/lib/services/user.service.d.ts +12 -12
  420. package/lib/services/visualization-committee.service.d.ts +32 -32
  421. package/lib/utils/custom-validator.d.ts +19 -19
  422. package/lib/utils/form-util.d.ts +11 -11
  423. package/lib/utils/formio-util.d.ts +105 -105
  424. package/lib/utils/version-commons.d.ts +4 -4
  425. package/package.json +10 -16
  426. package/public-api.d.ts +210 -210
  427. package/version.d.ts +25 -25
  428. package/esm2020/lib/components/backoffice.commons.component.mjs +0 -40
  429. package/esm2020/lib/components/common.lists.component.mjs +0 -194
  430. package/esm2020/lib/components/configuration-token/configuration-token.component.mjs +0 -665
  431. package/esm2020/lib/components/configuration-token/guarantee-token/guarantee-token.component.mjs +0 -103
  432. package/esm2020/lib/components/configuration-token/snapshot-token/snapshot-token.component.mjs +0 -108
  433. package/esm2020/lib/components/configuration.commons.component.mjs +0 -40
  434. package/esm2020/lib/components/dynamic-filter/dynamic-filter.component.mjs +0 -131
  435. package/esm2020/lib/components/excel-to-json/excel-to-json.component.mjs +0 -54
  436. package/esm2020/lib/components/frontoffice.commons.component.mjs +0 -86
  437. package/esm2020/lib/components/pdf-analyzer/pdf-analyzer.component.mjs +0 -162
  438. package/esm2020/lib/components/pdf-generator/pdf-generator.component.mjs +0 -223
  439. package/esm2020/lib/components/pdf-merge-visualizer/pdf-merge-visualizer.component.mjs +0 -307
  440. package/esm2020/lib/components/pdf-visualizer/pdf-visualizer.component.mjs +0 -387
  441. package/esm2020/lib/components/progress-bar/progress-bar.component.mjs +0 -92
  442. package/esm2020/lib/components/segmentation-tokens/segmentation-tokens.component.mjs +0 -199
  443. package/esm2020/lib/components/select-ppp/select-ppp.component.mjs +0 -199
  444. package/esm2020/lib/components/show-hide-columns/show-hide-columns-table.component.mjs +0 -116
  445. package/esm2020/lib/components/token/token.component.mjs +0 -1006
  446. package/esm2020/lib/components/tokens-calculator/tokens-calculator.component.mjs +0 -128
  447. package/esm2020/lib/ng-pli-commons.module.mjs +0 -390
  448. package/esm2020/lib/pipes/currency-colfuturo.pipe.mjs +0 -35
  449. package/esm2020/lib/pipes/thousands.pipe.mjs +0 -60
  450. package/esm2020/lib/services/authentication.service.mjs +0 -133
  451. package/esm2020/lib/services/budget-application.service.mjs +0 -265
  452. package/esm2020/lib/services/budget.service.mjs +0 -205
  453. package/esm2020/lib/services/common.service.mjs +0 -291
  454. package/esm2020/lib/services/configuration-document.service.mjs +0 -297
  455. package/esm2020/lib/services/documentary.type.service.mjs +0 -69
  456. package/esm2020/lib/services/file.service.mjs +0 -153
  457. package/esm2020/lib/services/guarantee.service.mjs +0 -128
  458. package/esm2020/lib/services/keys-assignation.service.mjs +0 -127
  459. package/esm2020/lib/services/pli-cnf-evaluation-task.service.mjs +0 -112
  460. package/esm2020/lib/services/ppp.service.mjs +0 -360
  461. package/esm2020/lib/services/progress-bar.service.mjs +0 -40
  462. package/esm2020/lib/services/segmentation-tokens.service.mjs +0 -43
  463. package/esm2020/lib/services/send-application.service.mjs +0 -492
  464. package/esm2020/lib/services/token.service.mjs +0 -1345
  465. package/esm2020/lib/services/upload-documents.service.mjs +0 -60
  466. package/esm2020/lib/utils/custom-validator.mjs +0 -95
  467. package/esm2020/lib/utils/form-util.mjs +0 -35
  468. package/esm2020/lib/utils/formio-util.mjs +0 -580
  469. package/fesm2015/ng-pli-commons.mjs +0 -17373
  470. package/fesm2015/ng-pli-commons.mjs.map +0 -1
  471. package/fesm2020/ng-pli-commons.mjs.map +0 -1
@@ -1,1006 +0,0 @@
1
- import { Component, Input, Output, EventEmitter } from '@angular/core';
2
- import { UtilString, ETipoPresupuesto, PliUsuario, AuthenticationUtil, DateUtil } from 'ng-pli-util';
3
- import { TokenService } from '../../services/token.service';
4
- import 'jquery';
5
- import * as i0 from "@angular/core";
6
- import * as i1 from "@angular/common";
7
- import * as i2 from "../../services/token.service";
8
- import * as i3 from "ngx-toastr";
9
- import * as i4 from "../../services/authentication.service";
10
- export class TokenComponent {
11
- constructor(currencyPipe, tokenService, toastrService, authenticationService) {
12
- this.currencyPipe = currencyPipe;
13
- this.tokenService = tokenService;
14
- this.toastrService = toastrService;
15
- this.authenticationService = authenticationService;
16
- /** It notifies the html is generated*/
17
- this.onGenerate = new EventEmitter();
18
- /** It enables the visualization of destination */
19
- this.enableDestination = false;
20
- }
21
- ngOnInit() {
22
- this.lTokenCalculated = null;
23
- this.lFormFieldsToken = null;
24
- this.budgetDtoPrimary = null;
25
- this.budgetDtoSecundary = null;
26
- this.evaluation = null;
27
- }
28
- /** It manages the change of the every @Input */
29
- ngOnChanges(changes) {
30
- // Every time that input values change, call new verification code
31
- this.uniqueVerificationCode = null;
32
- const template = changes.template;
33
- const data = changes.data;
34
- if (template && template.currentValue) {
35
- this.template = template.currentValue;
36
- }
37
- if (data && data.currentValue) {
38
- this.data = data.currentValue;
39
- this.promCodigo = this.data.promCodigo;
40
- }
41
- if (this.data) {
42
- this.budgetDtoPrimary = this.data.budgetDtoPrimary ? this.data.budgetDtoPrimary : null;
43
- this.budgetDtoSecundary = this.data.budgetDtoSecundary
44
- ? this.data.budgetDtoSecundary
45
- : null;
46
- this.evaluation = this.data.evaluation;
47
- }
48
- if (this.data && this.template && this.promCodigo) {
49
- const self = this;
50
- setTimeout(() => {
51
- self.init();
52
- }, 300);
53
- }
54
- }
55
- /** It initializes the process of translation */
56
- init() {
57
- this.translateTokens(this.template, this.data.dataFormByForm);
58
- }
59
- translateCategory(categoryName) {
60
- const languageByDefault = 'en';
61
- // If don't find the lang, get in en.
62
- let categoryNameByDef = categoryName;
63
- if (categoryName && this.data.categories && this.data.idioma) {
64
- // If the locale select is es, this is the dafult category language
65
- if (this.data.idioma.locale === 'es') {
66
- return categoryName;
67
- }
68
- for (const category of this.data.categories) {
69
- if (category.listaRubroIdioma && category.rubRubro === categoryName) {
70
- for (const language of category.listaRubroIdioma) {
71
- if (language.rubiIdioma === this.data.idioma.locale) {
72
- return language.rubiTraduccion;
73
- }
74
- if (language.rubiIdioma === languageByDefault) {
75
- categoryNameByDef = language.rubiTraduccion;
76
- }
77
- }
78
- break;
79
- }
80
- }
81
- }
82
- return categoryNameByDef;
83
- }
84
- translateTokens(html, listData) {
85
- this.alreadyCallReplaceTokens = false;
86
- const lTokens = this.getListTokens(html);
87
- if (!lTokens || Object.keys(lTokens).length === 0) {
88
- this.template = html;
89
- }
90
- this.callListTokens(lTokens, html, listData);
91
- }
92
- callListTokens(lTokens, html, listData) {
93
- if (lTokens[TokenService.TOKEN_LABEL_CALCULATED] &&
94
- Object.keys(lTokens[TokenService.TOKEN_LABEL_CALCULATED]).length > 0) {
95
- if (this.lTokenCalculated) {
96
- this.validateListTokens(lTokens, html, listData);
97
- }
98
- else {
99
- this.tokenService.getListByPromCodigo(this.promCodigo).subscribe((lTokenCalculated) => {
100
- this.lTokenCalculated = lTokenCalculated;
101
- this.validateListTokens(lTokens, html, listData);
102
- }, (error) => {
103
- console.error('Error callListTokens -getListByPromCodigo', error);
104
- this.toastrService.error('Error generando carta');
105
- });
106
- }
107
- }
108
- else {
109
- this.validateListTokens(lTokens, html, listData);
110
- }
111
- if (lTokens[TokenService.TOKEN_LABEL_FORM] &&
112
- Object.keys(lTokens[TokenService.TOKEN_LABEL_FORM]).length > 0) {
113
- if (this.lFormFieldsToken) {
114
- this.validateListTokens(lTokens, html, listData);
115
- }
116
- else {
117
- this.tokenService.getFormFieldsByPromCode(this.promCodigo).then((lFormFieldsToken) => {
118
- this.lFormFieldsToken = lFormFieldsToken;
119
- this.validateListTokens(lTokens, html, listData);
120
- }, (error) => {
121
- console.error('Error callListTokens -getFormFieldsByPromCode', error);
122
- this.toastrService.error('Error generando carta');
123
- });
124
- }
125
- }
126
- else {
127
- this.validateListTokens(lTokens, html, listData);
128
- }
129
- if (lTokens[TokenService.TOKEN_LABEL_STATIC] &&
130
- Object.keys(lTokens[TokenService.TOKEN_LABEL_STATIC]).length > 0) {
131
- if (this.uniqueVerificationCode !== null) {
132
- this.validateListTokens(lTokens, html, listData);
133
- }
134
- else {
135
- const tokenVerificationCode = lTokens[TokenService.TOKEN_LABEL_STATIC].find((token) => {
136
- const subToken = token.key
137
- .replace('{', '')
138
- .replace('}', '')
139
- .split('_');
140
- return (subToken[1].toLowerCase() ==
141
- TokenService.STATIC_TOKENS_KEY_CODIGO_VERIFICACION.toLowerCase());
142
- });
143
- // Only if the static token is the unique verification code
144
- if (tokenVerificationCode && Object.keys(tokenVerificationCode).length > 0) {
145
- let pliUsuarioObject = AuthenticationUtil.getPliUsuario();
146
- if (!pliUsuarioObject) {
147
- this.uniqueVerificationCode = '';
148
- console.error('No se logro consultar el usuario para consultar el token', pliUsuarioObject);
149
- this.validateListTokens(lTokens, html, listData);
150
- }
151
- else {
152
- const pliUsuario = Object.assign(new PliUsuario(), JSON.parse(JSON.stringify(pliUsuarioObject)));
153
- this.authenticationService.getTokenByLogin(pliUsuario.usuLogin).subscribe((sesion) => {
154
- // Try to get the unique verification code with the default value of sesion if is not a valid value
155
- const sesionValue = sesion ? sesion.sesion : '1';
156
- this.getUniqueVerificationCode(pliUsuario.usuLogin, sesionValue, lTokens, html, listData);
157
- }, (error) => {
158
- console.error('Error consultando el login en PLIS, getTokenByLogin', error);
159
- // Try to get the unique verification code with the default value of sesion
160
- this.getUniqueVerificationCode(pliUsuario.usuLogin, '1', lTokens, html, listData);
161
- //this.toastrService.error("Error generando carta");
162
- });
163
- }
164
- }
165
- else {
166
- this.uniqueVerificationCode = '';
167
- this.validateListTokens(lTokens, html, listData);
168
- }
169
- }
170
- }
171
- else {
172
- this.validateListTokens(lTokens, html, listData);
173
- }
174
- }
175
- /**
176
- * Get the unique verification code and call validateListTokens method
177
- */
178
- getUniqueVerificationCode(usuLogin, sesion, lTokens, html, listData) {
179
- this.tokenService.getUniqueVerificationCode(usuLogin, sesion).subscribe((uniqueCodeValue) => {
180
- const uniqueCode = uniqueCodeValue.codigoUnico;
181
- this.uniqueVerificationCode =
182
- uniqueCode.substring(0, 4) + ' ' + uniqueCode.substring(4, 8);
183
- this.validateListTokens(lTokens, html, listData);
184
- }, (error) => {
185
- console.error('Error callListTokens -getListByPromCodigo', error);
186
- this.toastrService.error('Error generando carta');
187
- });
188
- }
189
- validateListTokens(lTokens, html, listData) {
190
- let finishLoadListForm = false;
191
- let finishLoadListCalculated = false;
192
- let finishLoadListStatic = false;
193
- const finishLoadListBudget = true;
194
- if (lTokens[TokenService.TOKEN_LABEL_FORM] &&
195
- lTokens[TokenService.TOKEN_LABEL_FORM].length > 0) {
196
- finishLoadListForm = this.lFormFieldsToken ? true : false;
197
- }
198
- else {
199
- finishLoadListForm = true;
200
- }
201
- if (lTokens[TokenService.TOKEN_LABEL_CALCULATED] &&
202
- lTokens[TokenService.TOKEN_LABEL_CALCULATED].length > 0) {
203
- finishLoadListCalculated = this.lTokenCalculated ? true : false;
204
- }
205
- else {
206
- finishLoadListCalculated = true;
207
- }
208
- if (lTokens[TokenService.TOKEN_LABEL_STATIC] &&
209
- lTokens[TokenService.TOKEN_LABEL_STATIC].length > 0) {
210
- finishLoadListStatic = this.uniqueVerificationCode !== null ? true : false;
211
- }
212
- else {
213
- finishLoadListStatic = true;
214
- }
215
- if (finishLoadListForm &&
216
- finishLoadListBudget &&
217
- finishLoadListStatic &&
218
- finishLoadListCalculated &&
219
- !this.alreadyCallReplaceTokens) {
220
- this.alreadyCallReplaceTokens = true;
221
- this.replaceTokensWithData(lTokens, html, listData);
222
- }
223
- }
224
- replaceTokensWithData(lTokens, html, listData) {
225
- const lDataOrg = [];
226
- const lFormFieldsTokenOrg = [];
227
- if ((lTokens[TokenService.TOKEN_LABEL_FORM] ||
228
- lTokens[TokenService.TOKEN_LABEL_CALCULATED]) &&
229
- listData) {
230
- for (const dataForm in listData) {
231
- lDataOrg[dataForm.toLowerCase()] = listData[dataForm];
232
- }
233
- if (this.lFormFieldsToken) {
234
- for (const formFieldToken of this.lFormFieldsToken) {
235
- for (const valuesField of formFieldToken.value) {
236
- const keyToken = '${' + formFieldToken.title.key + '_' + valuesField.key + '}';
237
- lFormFieldsTokenOrg[keyToken] = valuesField;
238
- }
239
- }
240
- }
241
- }
242
- const lTokensCalculated = [];
243
- if (lTokens[TokenService.TOKEN_LABEL_CALCULATED]) {
244
- if (this.lTokenCalculated) {
245
- for (const tokenCal of this.lTokenCalculated) {
246
- lTokensCalculated[UtilString.replaceAccentSpacesOthers(tokenCal.name)] =
247
- tokenCal;
248
- }
249
- }
250
- }
251
- let typeToken;
252
- const tokenTypeTranslated = [];
253
- for (typeToken in lTokens) {
254
- if (!lTokens[typeToken]) {
255
- continue;
256
- }
257
- const tokensType = lTokens[typeToken];
258
- tokenTypeTranslated[typeToken] = [];
259
- for (const token of tokensType) {
260
- let tokenTranslated = null;
261
- const subToken = token.key.replace('{', '').replace('}', '').split('_');
262
- switch (typeToken) {
263
- case TokenService.TOKEN_LABEL_FORM: // Form
264
- let valueData = null;
265
- const dataOrgKey = subToken[1].toLowerCase();
266
- // Put this key because there no other way to differentiate the same key in differents forms
267
- const dataOrgKeyByForm = subToken[0].substring(1) + '_' + subToken[1].toLowerCase();
268
- const dataOrgValue = lDataOrg.hasOwnProperty(dataOrgKey)
269
- ? lDataOrg[dataOrgKey]
270
- : lDataOrg.hasOwnProperty(dataOrgKeyByForm)
271
- ? lDataOrg[dataOrgKeyByForm]
272
- : null;
273
- // const dataOrgValueByForm = lDataOrg[dataOrgKeyByForm];
274
- if (subToken.length === 3 &&
275
- typeof dataOrgValue !== 'undefined' &&
276
- dataOrgValue !== null &&
277
- dataOrgValue.hasOwnProperty(subToken[2])) {
278
- valueData = dataOrgValue[subToken[2]];
279
- }
280
- else if (subToken.length === 2 &&
281
- typeof dataOrgValue !== 'undefined' &&
282
- dataOrgValue !== null) {
283
- valueData = dataOrgValue;
284
- if (lFormFieldsTokenOrg[token.key]) {
285
- valueData = this.tokenService.getValueFromFormField(lFormFieldsTokenOrg[token.key], valueData);
286
- }
287
- }
288
- valueData = valueData ? valueData : '';
289
- tokenTranslated = valueData;
290
- html = this.tokenService.replaceToken(html, token.value, valueData);
291
- break;
292
- case TokenService.TOKEN_LABEL_BUDGET: //Budget
293
- const budgetResolveToken = this.resolveBudgetToken(html, token, subToken);
294
- html = budgetResolveToken.html;
295
- tokenTranslated = budgetResolveToken.value;
296
- break;
297
- case TokenService.TOKEN_LABEL_TASKL: //Task
298
- const taskResolveToken = this.resolveTaskoken(html, token, subToken);
299
- html = taskResolveToken.html;
300
- tokenTranslated = taskResolveToken.value;
301
- break;
302
- case TokenService.TOKEN_LABEL_STATIC: //Static
303
- const staticResolveToken = this.resolveStaticToken(html, token, subToken);
304
- html = staticResolveToken.html;
305
- tokenTranslated = staticResolveToken.value;
306
- break;
307
- case TokenService.TOKEN_LABEL_CALCULATED: //Calculated
308
- // Replaces de tokens of the formula
309
- const tokenName = lTokensCalculated[subToken[1]].name;
310
- let formula = lTokensCalculated[subToken[1]].formula;
311
- try {
312
- //AQUI
313
- formula = this.tokenService.replaceTokensFromListObject(tokenName, formula, lDataOrg);
314
- }
315
- catch (error) {
316
- formula = null;
317
- console.error(error.error ? error.error : error);
318
- this.toastrService.warning(error.message, error.tittle);
319
- return;
320
- }
321
- // Try to evaluate the formula
322
- let result = null;
323
- if (formula !== null) {
324
- try {
325
- result = formula.startsWith('file://')
326
- ? "<img width='250px' height='auto' src='" + formula + "'/>"
327
- : eval(formula);
328
- }
329
- catch (e) {
330
- console.error('Error evaluating the formula.', lTokensCalculated, subToken, e);
331
- this.toastrService.error('No se logro evaluar la formular del token ' + tokenName, 'Error!');
332
- return;
333
- }
334
- if (result !== null) {
335
- html = this.tokenService.replaceToken(html, token.value, result);
336
- tokenTranslated = result;
337
- }
338
- }
339
- break;
340
- }
341
- tokenTypeTranslated[typeToken][token.key] = tokenTranslated;
342
- }
343
- }
344
- this.onGenerate.emit({
345
- html: html,
346
- tokenTypeTranslated: tokenTypeTranslated
347
- });
348
- // }
349
- }
350
- /**
351
- * Try to find the budget info to translate the token.
352
- * @param html
353
- * @param token
354
- * @param subToken
355
- */
356
- resolveBudgetToken(html, token, subToken) {
357
- let tpresCodigo = Number(subToken[1]);
358
- let tokenValue = subToken[2];
359
- let budgetDto = null;
360
- let idTotalBudget = null;
361
- if (this.budgetDtoPrimary &&
362
- this.budgetDtoPrimary.budget &&
363
- tpresCodigo == ETipoPresupuesto.PRIMARY) {
364
- budgetDto = this.budgetDtoPrimary;
365
- idTotalBudget = 'pli-token-principal-budget-total-summary';
366
- }
367
- else if (this.budgetDtoSecundary &&
368
- this.budgetDtoSecundary.budget &&
369
- tpresCodigo == ETipoPresupuesto.SECONDARY) {
370
- budgetDto = this.budgetDtoSecundary;
371
- idTotalBudget = 'pli-token-secundary-budget-total-summary';
372
- }
373
- if (budgetDto === null || !budgetDto.budget) {
374
- console.error('No se logro encontrar el presupuesto del token.', token, this.budgetDtoPrimary, this.budgetDtoSecundary);
375
- return {
376
- html: html,
377
- value: null
378
- };
379
- }
380
- let valueData = null;
381
- const applicationProcess = tokenValue == TokenService.BUDGET_TOKENS_KEY_APPLICATION_PROCESS_TOTAL_AMOUNT ||
382
- tokenValue == TokenService.BUDGET_TOKENS_KEY_APPLICATION_PROCESS_TOTAL_OWN_FOUNDS ||
383
- tokenValue == TokenService.BUDGET_TOKENS_KEY_APPLICATION_PROCESS_TOTAL_FINANCING;
384
- const legalizationProcess = tokenValue == TokenService.BUDGET_TOKENS_KEY_LEGALIZATION_PROCESS_TOTAL_AMOUNT ||
385
- tokenValue == TokenService.BUDGET_TOKENS_KEY_LEGALIZATION_PROCESS_TOTAL_OWN_FOUNDS ||
386
- tokenValue == TokenService.BUDGET_TOKENS_KEY_LEGALIZATION_PROCESS_TOTAL_FINANCING;
387
- if (tokenValue == TokenService.BUDGET_TOKENS_KEY_TOTAL_AMOUNT) {
388
- valueData =
389
- budgetDto.budget && budgetDto.budget.summary
390
- ? this.currencyPipe.transform(budgetDto.budget.summary.budgetTotal, 'default', '', '1.0-0')
391
- : 0;
392
- }
393
- else if (tokenValue == TokenService.BUDGET_TOKENS_KEY_RESUME_CATEGORY_YEAR) {
394
- // this.addInfoTokenResumeCategoryYear(tpresCodigo, idTotalBudget, budgetDto);
395
- this.addInfoTokenResumeCategoryYear(tpresCodigo, idTotalBudget, budgetDto);
396
- const pliTokenTotalBudget = document.getElementById(idTotalBudget);
397
- if (pliTokenTotalBudget) {
398
- valueData = this.removeCommentsHtml(pliTokenTotalBudget.innerHTML);
399
- }
400
- else {
401
- console.log('pliTokenTotalBudget - NULL', pliTokenTotalBudget);
402
- }
403
- }
404
- else if (tokenValue == TokenService.BUDGET_TOKENS_KEY_FECHA_FINANCING_START) {
405
- valueData =
406
- budgetDto.budget && budgetDto.budget.financingStart
407
- ? budgetDto.budget.financingStart
408
- : '';
409
- html = this.tokenService.replaceToken(html, token.value, valueData, this.data?.idioma?.locale);
410
- }
411
- else if (tokenValue == TokenService.BUDGET_TOKENS_KEY_FECHA_FINANCING_END) {
412
- valueData =
413
- budgetDto.budget && budgetDto.budget.financingEnd
414
- ? budgetDto.budget.financingEnd
415
- : '';
416
- html = this.tokenService.replaceToken(html, token.value, valueData, this.data?.idioma?.locale);
417
- }
418
- else if (tokenValue == TokenService.BUDGET_TOKENS_DURATION_STUDIES) {
419
- valueData =
420
- budgetDto.budget && budgetDto.budget.studyStart && budgetDto.budget.studyEnd
421
- ? DateUtil.elapsedMonths(budgetDto.budget.studyStart, budgetDto.budget.studyEnd) + 1
422
- : '';
423
- }
424
- else if (tokenValue == TokenService.BUDGET_TOKENS_FINANCING_DURATION) {
425
- valueData =
426
- budgetDto.budget && budgetDto.budget.financingEnd && budgetDto.budget.financingStart
427
- ? DateUtil.elapsedMonths(budgetDto.budget.financingStart, budgetDto.budget.financingEnd) + 1
428
- : '';
429
- }
430
- else if (tokenValue == TokenService.LEGALIZATION_OR_APPLICATION_TOTAL_FINANCING) {
431
- // JMP - Mantis 6674 - Add logic to legalization or application total financing
432
- if (this.data &&
433
- this.data.dataFormApplication &&
434
- this.data.dataFormApplication.budget) {
435
- const budget = this.data.dataFormApplication.budget;
436
- if (budget.legalizationProcess && budget.legalizationProcess.totalFinancing) {
437
- const totalFinancing = Number(budget.legalizationProcess.totalFinancing);
438
- valueData = totalFinancing * 1.003;
439
- }
440
- else if (budget.applicationProcess && budget.applicationProcess.totalFinancing) {
441
- valueData = Number(budget.applicationProcess.totalFinancing);
442
- }
443
- }
444
- }
445
- else if ((applicationProcess || legalizationProcess) &&
446
- this.data &&
447
- this.data.dataFormApplication &&
448
- this.data.dataFormApplication.budget) {
449
- // Get the total budget amount depend of the process
450
- const appBudgetTotal = applicationProcess
451
- ? this.data.dataFormApplication.budget.applicationProcess
452
- : this.data.dataFormApplication.budget.legalizationProcess;
453
- if (appBudgetTotal != undefined && appBudgetTotal != null) {
454
- // no matter the process, the class is the same
455
- switch (tokenValue) {
456
- case TokenService.BUDGET_TOKENS_KEY_APPLICATION_PROCESS_TOTAL_AMOUNT:
457
- case TokenService.BUDGET_TOKENS_KEY_LEGALIZATION_PROCESS_TOTAL_AMOUNT:
458
- valueData = appBudgetTotal.totalAmount;
459
- break;
460
- case TokenService.BUDGET_TOKENS_KEY_APPLICATION_PROCESS_TOTAL_OWN_FOUNDS:
461
- case TokenService.BUDGET_TOKENS_KEY_LEGALIZATION_PROCESS_TOTAL_OWN_FOUNDS:
462
- valueData = appBudgetTotal.totalOwnFunds;
463
- break;
464
- case TokenService.BUDGET_TOKENS_KEY_APPLICATION_PROCESS_TOTAL_FINANCING:
465
- case TokenService.BUDGET_TOKENS_KEY_LEGALIZATION_PROCESS_TOTAL_FINANCING:
466
- valueData = appBudgetTotal.totalFinancing;
467
- break;
468
- }
469
- }
470
- }
471
- else if (tokenValue == TokenService.BUDGET_TOKENS_KEY_INSURANCE_AMOUNT) {
472
- let totalFinancing = this.data.dataFormApplication.budget.legalizationProcess &&
473
- this.data.dataFormApplication.budget.legalizationProcess.totalFinancing;
474
- totalFinancing =
475
- totalFinancing == undefined || totalFinancing == null ? 0 : Number(totalFinancing);
476
- // let totalInsuranceAmount = this.data.dataFormApplication.totalInsuranceAmount;
477
- // totalInsuranceAmount =
478
- // totalInsuranceAmount == undefined || totalInsuranceAmount == null
479
- // ? 0
480
- // : Number(totalInsuranceAmount);
481
- valueData = totalFinancing * 1.003;
482
- }
483
- else {
484
- // When the token can't be resolve
485
- console.error('resolveBudgetToken -No se logro resolver el token de tipo presupuesto');
486
- }
487
- valueData = valueData === null ? '' : valueData;
488
- html = this.tokenService.replaceToken(html, token.value, valueData);
489
- return {
490
- html: html,
491
- value: valueData
492
- };
493
- }
494
- resolveTaskoken(html, token, subToken) {
495
- let valueTask = null;
496
- if (subToken.length > 2) {
497
- let taskId = Number(subToken[2]);
498
- let task = this.evaluation.tasks.find((t) => t.idTask == taskId);
499
- valueTask = task.result;
500
- }
501
- html = this.tokenService.replaceToken(html, token.value, valueTask);
502
- return {
503
- html: html,
504
- value: valueTask
505
- };
506
- }
507
- resolveStaticToken(html, token, subToken) {
508
- let valueReplace = null;
509
- if (subToken[1].toLowerCase() ==
510
- TokenService.STATIC_TOKENS_KEY_CODIGO_VERIFICACION.toLowerCase()) {
511
- valueReplace = this.uniqueVerificationCode;
512
- html = this.tokenService.replaceToken(html, token.value, this.uniqueVerificationCode);
513
- }
514
- else if (subToken[1].toLowerCase() ==
515
- TokenService.STATIC_TOKENS_KEY_A_QUIEN_VA_DIRIGIDO.toLowerCase()) {
516
- // if (this.data.dataDestination) {
517
- html = this.resolveStaticTokensKeyAQuienVaDirigido(html, token.value);
518
- valueReplace = '';
519
- // }
520
- }
521
- else if (subToken[1].toLowerCase() == TokenService.STATIC_TOKENS_KEY_LETTER_SIGN.toLowerCase()) {
522
- html = this.resolveStaticTokensKeySign(html, token.value, subToken);
523
- valueReplace = '';
524
- }
525
- else if (subToken[1].toLowerCase() ==
526
- TokenService.STATIC_TOKENS_KEY_SALUDO_COMPLEMENTARIO.toLowerCase()) {
527
- // if (this.data.dataDestination) {
528
- html = this.resolveStaticTokensKeySaludoComplementario(html, token.value);
529
- valueReplace = '';
530
- // }
531
- }
532
- else if (subToken[1].toLowerCase() == TokenService.STATIC_TOKENS_KEY_FECHA_ACTUAL.toLowerCase()) {
533
- valueReplace = new Date();
534
- html = this.tokenService.replaceToken(html, token.value, new Date());
535
- }
536
- else if (subToken[1].toLowerCase() == TokenService.STATIC_TOKENS_KEY_PATROCINADOR.toLowerCase()) {
537
- const patNombre = this.data.pliPromocion &&
538
- this.data.pliPromocion.pliPrograma &&
539
- this.data.pliPromocion.pliPrograma.pliPatrocinador
540
- ? this.data.pliPromocion.pliPrograma.pliPatrocinador.patNombre
541
- : '';
542
- valueReplace = patNombre;
543
- html = this.tokenService.replaceToken(html, token.value, patNombre);
544
- }
545
- else if (subToken[1].toLowerCase() == TokenService.STATIC_TOKENS_KEY_PROGRAMA.toLowerCase()) {
546
- const progNombre = this.data.pliPromocion && this.data.pliPromocion.pliPrograma
547
- ? this.data.pliPromocion.pliPrograma.progNombre
548
- : '';
549
- valueReplace = progNombre;
550
- html = this.tokenService.replaceToken(html, token.value, progNombre);
551
- }
552
- else if (subToken[1].toLowerCase() == TokenService.STATIC_TOKENS_KEY_PROMOCION.toLowerCase()) {
553
- const promNombre = this.data.pliPromocion ? this.data.pliPromocion.promNombre : '';
554
- valueReplace = promNombre;
555
- html = this.tokenService.replaceToken(html, token.value, promNombre);
556
- }
557
- else if (subToken[1].toLowerCase() == TokenService.STATIC_TOKENS_KEY_ANIO_PROMOCION.toLowerCase()) {
558
- const anioPromocion = this.data.pliPromocion && this.data.pliPromocion.promAnio
559
- ? this.data.pliPromocion.promAnio
560
- : 0;
561
- valueReplace = anioPromocion;
562
- html = this.tokenService.replaceToken(html, token.value, anioPromocion);
563
- }
564
- else if (subToken[1].toLowerCase() ==
565
- TokenService.STATIC_TOKENS_KEY_ISO_MONEDA_BASE.toLowerCase()) {
566
- const baseCurrency = this.data.budgetDtoPrimary && this.data.budgetDtoPrimary.budget
567
- ? this.data.budgetDtoPrimary.budget.baseCurrency
568
- : this.data.budgetDtoSecundary && this.data.budgetDtoSecundary.budget
569
- ? this.data.budgetDtoSecundary.budget.baseCurrency
570
- : '';
571
- valueReplace = baseCurrency;
572
- html = this.tokenService.replaceToken(html, token.value, baseCurrency);
573
- }
574
- else if (subToken[1].toLowerCase() == TokenService.STATIC_TOKENS_KEY_STATUS_NAME.toLowerCase()) {
575
- const statusName = this.data.dataFormApplication &&
576
- UtilString.isValid(this.data.dataFormApplication.stateName)
577
- ? this.data.dataFormApplication.stateName
578
- : '';
579
- valueReplace = statusName;
580
- html = this.tokenService.replaceToken(html, token.value, statusName);
581
- }
582
- else if (subToken[1].toLowerCase() == TokenService.STATIC_TOKENS_KEY_USER_INITIALS.toLowerCase()) {
583
- const pliUser = AuthenticationUtil.getPliUser();
584
- valueReplace = UtilString.initialLetters(pliUser.firstname + ' ' + pliUser.lastname);
585
- html = this.tokenService.replaceToken(html, token.value, valueReplace);
586
- }
587
- else if (subToken[1].toLowerCase() ==
588
- TokenService.STATIC_TOKENS_KEY_NUMBER_APPLICATION.toLowerCase()) {
589
- const number = this.data.dataFormApplication && this.data.dataFormApplication.number
590
- ? this.data.dataFormApplication.number
591
- : null;
592
- valueReplace = number;
593
- html = this.tokenService.replaceToken(html, token.value, number);
594
- }
595
- else if (subToken[1].toLowerCase() == TokenService.STATIC_TOKENS_COMMITTEE_NAME.toLowerCase()) {
596
- const comiteNombre = this.data.dataFormByForm && this.data.dataFormByForm.comiteNombre
597
- ? this.data.dataFormByForm.comiteNombre
598
- : null;
599
- valueReplace = comiteNombre;
600
- html = this.tokenService.replaceToken(html, token.value, comiteNombre);
601
- }
602
- else if (subToken[1].toLowerCase() ==
603
- TokenService.STATIC_TOKENS_COMMITTEE_SEGMENTATION.toLowerCase()) {
604
- const comiteSegmentacion = this.data.dataFormByForm &&
605
- this.data.dataFormByForm[TokenService.STATIC_TOKENS_COMMITTEE_SEGMENTATION]
606
- ? this.data.dataFormByForm[TokenService.STATIC_TOKENS_COMMITTEE_SEGMENTATION]
607
- : null;
608
- valueReplace = comiteSegmentacion;
609
- html = this.tokenService.replaceToken(html, token.value, comiteSegmentacion);
610
- }
611
- else if (subToken[1].toLowerCase() ==
612
- TokenService.STATIC_TOKENS_COMMITTEE_AGGRUPATION.toLowerCase()) {
613
- const comiteAgrupacion = this.data.dataFormByForm &&
614
- this.data.dataFormByForm[TokenService.STATIC_TOKENS_COMMITTEE_AGGRUPATION]
615
- ? this.data.dataFormByForm[TokenService.STATIC_TOKENS_COMMITTEE_AGGRUPATION]
616
- : null;
617
- valueReplace = comiteAgrupacion;
618
- html = this.tokenService.replaceToken(html, token.value, comiteAgrupacion);
619
- }
620
- else if (subToken[1].toLowerCase() ==
621
- TokenService.STATIC_TOKENS_COMMITTEE_CUTLINE_DATE.toLowerCase()) {
622
- let cutLineDate = this.data.dataFormByForm &&
623
- this.data.dataFormByForm[TokenService.STATIC_TOKENS_COMMITTEE_CUTLINE_DATE]
624
- ? this.data.dataFormByForm[TokenService.STATIC_TOKENS_COMMITTEE_CUTLINE_DATE]
625
- : null;
626
- if (cutLineDate instanceof Date) {
627
- cutLineDate = cutLineDate.toString();
628
- }
629
- valueReplace = cutLineDate;
630
- html = this.tokenService.replaceToken(html, token.value, cutLineDate);
631
- }
632
- else if (subToken[1].toLowerCase() == TokenService.STATIC_TOKENS_TOTAL_WEIGHTED.toLowerCase()) {
633
- let bestScenarioValue = '';
634
- if (this.evaluation && this.evaluation.scenarios) {
635
- let bestScenario = this.evaluation.scenarios.filter((s) => s.best)[0];
636
- if (bestScenario) {
637
- bestScenarioValue = bestScenario.result;
638
- }
639
- }
640
- html = this.tokenService.replaceToken(html, token.value, bestScenarioValue);
641
- }
642
- else if (subToken[1].toLowerCase() ==
643
- TokenService.STATIC_TOKENS_USER_TYPE_CREDIT_STUDY.toLowerCase()) {
644
- const userTypeCreditStudy = this.data.dataFormByForm &&
645
- this.data.dataFormByForm[TokenService.STATIC_TOKENS_USER_TYPE_CREDIT_STUDY]
646
- ? this.data.dataFormByForm[TokenService.STATIC_TOKENS_USER_TYPE_CREDIT_STUDY]
647
- : null;
648
- valueReplace = userTypeCreditStudy;
649
- html = this.tokenService.replaceToken(html, token.value, userTypeCreditStudy);
650
- }
651
- else if (subToken[1].toLowerCase() == TokenService.STATIC_TOKENS_BEN_CODIGO.toLowerCase()) {
652
- valueReplace = this.data.dataFormApplication.benCodigo;
653
- html = this.tokenService.replaceToken(html, token.value, this.data.dataFormApplication.benCodigo);
654
- }
655
- else {
656
- // Don't find the token
657
- console.error('No se encontro el token', token);
658
- html = this.tokenService.replaceToken(html, token.value, '');
659
- }
660
- return {
661
- html: html,
662
- value: valueReplace
663
- };
664
- }
665
- /**
666
- * Find all the tokens present in the HTML text. Organize this tokens in four categories.
667
- * @param html Text of the html
668
- */
669
- getListTokens(html) {
670
- // let strings: string[] = html.split(" ");
671
- let tokens = this.tokenService.getListTokensByString(html);
672
- let tokensCategory = [];
673
- for (let infoToken of tokens) {
674
- if (infoToken) {
675
- const keyType = TokenService.getKeyType(infoToken.key.replace('{', '').replace('}', ''));
676
- if (keyType) {
677
- switch (keyType) {
678
- case 1: // Form
679
- if (!tokensCategory[TokenService.TOKEN_LABEL_FORM]) {
680
- tokensCategory[TokenService.TOKEN_LABEL_FORM] = [];
681
- }
682
- tokensCategory[TokenService.TOKEN_LABEL_FORM].push(infoToken);
683
- break;
684
- case 2: //Budget
685
- if (!tokensCategory[TokenService.TOKEN_LABEL_BUDGET]) {
686
- tokensCategory[TokenService.TOKEN_LABEL_BUDGET] = [];
687
- }
688
- tokensCategory[TokenService.TOKEN_LABEL_BUDGET].push(infoToken);
689
- break;
690
- case 3: //Static
691
- if (!tokensCategory[TokenService.TOKEN_LABEL_STATIC]) {
692
- tokensCategory[TokenService.TOKEN_LABEL_STATIC] = [];
693
- }
694
- tokensCategory[TokenService.TOKEN_LABEL_STATIC].push(infoToken);
695
- break;
696
- case 4: //Calculated
697
- if (!tokensCategory[TokenService.TOKEN_LABEL_CALCULATED]) {
698
- tokensCategory[TokenService.TOKEN_LABEL_CALCULATED] = [];
699
- }
700
- tokensCategory[TokenService.TOKEN_LABEL_CALCULATED].push(infoToken);
701
- break;
702
- case 5: //Task
703
- if (!tokensCategory[TokenService.TOKEN_LABEL_TASKL]) {
704
- tokensCategory[TokenService.TOKEN_LABEL_TASKL] = [];
705
- }
706
- tokensCategory[TokenService.TOKEN_LABEL_TASKL].push(infoToken);
707
- break;
708
- }
709
- }
710
- }
711
- }
712
- return tokensCategory;
713
- }
714
- /**
715
- * It resolves the static token destination
716
- * @param stringText
717
- * @param token
718
- * @param dataValue
719
- */
720
- resolveStaticTokensKeyAQuienVaDirigido(stringText, tokenValue) {
721
- // if (this.data.dataDestination) {
722
- this.enableDestination = true;
723
- this.addInfoTokenDestination();
724
- const pliTokenDestination = document.getElementById('pli-token-destination');
725
- let html = '';
726
- if (pliTokenDestination && pliTokenDestination.innerHTML.length > 0) {
727
- html = this.removeCommentsHtml(pliTokenDestination.innerHTML);
728
- }
729
- return this.tokenService.replaceToken(stringText, tokenValue, html);
730
- // }
731
- // return stringText;
732
- }
733
- /**
734
- *
735
- */
736
- addInfoTokenDestination() {
737
- let pliTokenDestination = $('#pli-token-destination');
738
- pliTokenDestination.empty();
739
- if (this.data.dataDestination) {
740
- let destinationInfo = $('<div></div>');
741
- if (this.data.dataDestination.text) {
742
- let valueInfo = $('<div></div>').text(this.data.dataDestination.text);
743
- destinationInfo.append(valueInfo);
744
- }
745
- if (this.data.dataDestination.title) {
746
- let valueInfo = $('<div></div>').text(this.data.dataDestination.title);
747
- destinationInfo.append(valueInfo);
748
- }
749
- if (this.data.dataDestination.name || this.data.dataDestination.lastName) {
750
- let valueInfoName = this.data.dataDestination.name
751
- ? this.data.dataDestination.name + ' '
752
- : '';
753
- valueInfoName += this.data.dataDestination.lastName
754
- ? this.data.dataDestination.lastName
755
- : '';
756
- let valueInfo = $('<div></div>').append('<strong>' + valueInfoName + '</strong>');
757
- destinationInfo.append(valueInfo);
758
- }
759
- if (this.data.dataDestination.cargo) {
760
- let valueInfo = $('<div></div>').text(this.data.dataDestination.cargo);
761
- destinationInfo.append(valueInfo);
762
- }
763
- if (this.data.dataDestination.occupation) {
764
- let valueInfo = $('<div></div>').text(this.data.dataDestination.occupation);
765
- destinationInfo.append(valueInfo);
766
- }
767
- if (this.data.dataDestination.company) {
768
- let valueInfo = $('<div></div>').text(this.data.dataDestination.company);
769
- destinationInfo.append(valueInfo);
770
- }
771
- if (this.data.dataDestination.address || this.data.dataDestination.addressDetails) {
772
- let valueInfoName = this.data.dataDestination.address
773
- ? this.data.dataDestination.address + ' '
774
- : '';
775
- valueInfoName += this.data.dataDestination.addressDetails
776
- ? this.data.dataDestination.addressDetails
777
- : '';
778
- let valueInfo = $('<div></div>').text(valueInfoName);
779
- destinationInfo.append(valueInfo);
780
- }
781
- if (this.data.dataDestination.city || this.data.dataDestination.country) {
782
- let valueInfoName = this.data.dataDestination.city
783
- ? this.data.dataDestination.city
784
- : '';
785
- valueInfoName +=
786
- this.data.dataDestination.city && this.data.dataDestination.country ? ', ' : '';
787
- valueInfoName += this.data.dataDestination.country
788
- ? this.data.dataDestination.country
789
- : '';
790
- let valueInfo = $('<div></div>').text(valueInfoName);
791
- destinationInfo.append(valueInfo);
792
- }
793
- pliTokenDestination.append(destinationInfo);
794
- }
795
- }
796
- /**
797
- * It resolves the static token destination
798
- * @param stringText
799
- * @param token
800
- * @param dataValue
801
- */
802
- resolveStaticTokensKeySaludoComplementario(stringText, tokenValue) {
803
- // if (this.data.dataDestination) {
804
- this.enableDestination = true;
805
- this.addInfoTokenSaludoComplementario();
806
- const pliTokenDestination = document.getElementById('pli-token-complementary-greeting');
807
- let html = '';
808
- if (pliTokenDestination) {
809
- html = this.removeCommentsHtml(pliTokenDestination.innerHTML);
810
- }
811
- return this.tokenService.replaceToken(stringText, tokenValue, html);
812
- // }
813
- // return stringText;
814
- }
815
- /**
816
- *
817
- */
818
- addInfoTokenSaludoComplementario() {
819
- let pliTokenDestination = $('#pli-token-complementary-greeting');
820
- pliTokenDestination.empty();
821
- if (this.data.dataDestination) {
822
- let destinationInfo = $('<div></div>');
823
- if (this.data.dataDestination.greeting) {
824
- destinationInfo.html(this.data.dataDestination.greeting);
825
- }
826
- if (this.data.dataDestination.title) {
827
- const valueText = (destinationInfo.html().length == 0 ? '' : ' ') +
828
- this.data.dataDestination.title;
829
- destinationInfo.html(destinationInfo.html() + valueText);
830
- }
831
- if (this.data.dataDestination.lastName) {
832
- let valueInfoName = this.data.dataDestination.lastName
833
- ? this.data.dataDestination.lastName
834
- : '';
835
- const valueText = (destinationInfo.html().length == 0 ? '' : ' ') +
836
- '<strong>' +
837
- valueInfoName +
838
- '</strong>';
839
- destinationInfo.html(destinationInfo.html() + valueText);
840
- }
841
- pliTokenDestination.append(destinationInfo);
842
- }
843
- }
844
- removeCommentsHtml(html) {
845
- return html ? html.replace(/<!--[\s\S]*?-->/g, '') : html;
846
- }
847
- resolveStaticTokensKeySign(html, tokenValue, subToken) {
848
- let container = $('<div></div>');
849
- let img = $('<img id="' + TokenService.SIGN_LETTER_TAG_ID + '">');
850
- img.attr('src', '');
851
- if (subToken.length > 2) {
852
- img.attr('width', subToken[2].toString());
853
- }
854
- if (subToken.length > 3) {
855
- img.attr('height', subToken[3].toString());
856
- }
857
- if (subToken.length > 4) {
858
- img.attr('name', subToken[4].toString());
859
- }
860
- container.append(img);
861
- // return container.html();
862
- return this.tokenService.replaceToken(html, tokenValue, container.html());
863
- }
864
- getRubroLabel() {
865
- return this.data.idioma.locale === 'es'
866
- ? 'Rubro'
867
- : this.data.idioma.locale === 'de'
868
- ? 'Posten'
869
- : 'Item';
870
- }
871
- getTotalLabel() {
872
- return this.data.idioma.locale === 'es'
873
- ? 'Total'
874
- : this.data.idioma.locale === 'de'
875
- ? 'Gesamt'
876
- : this.data.idioma.locale === 'fr'
877
- ? 'Total'
878
- : this.data.idioma.locale === 'it'
879
- ? 'Totale'
880
- : 'Item';
881
- }
882
- getYearLabel() {
883
- return this.data.idioma.locale === 'es'
884
- ? 'Año'
885
- : this.data.idioma.locale === 'de'
886
- ? 'Jahr'
887
- : this.data.idioma.locale === 'fr'
888
- ? 'Année'
889
- : this.data.idioma.locale === 'it'
890
- ? 'Anno'
891
- : 'Year';
892
- }
893
- /**
894
- *
895
- */
896
- addInfoTokenResumeCategoryYear(tpresCodigo, idTotalBudget, budgetDto) {
897
- if (tpresCodigo == ETipoPresupuesto.PRIMARY) {
898
- }
899
- else {
900
- }
901
- let resumeCategoryYearContent = $('#' + idTotalBudget);
902
- resumeCategoryYearContent.empty();
903
- if (budgetDto && budgetDto.budget && budgetDto.budget.summary) {
904
- const summary = budgetDto.budget.summary;
905
- const table = $('<table></table>');
906
- table.css('border-spacing', '2px');
907
- table.css('border-collapse', 'collapse');
908
- //thead
909
- const thead = $('<thead>').appendTo(table);
910
- const thRubro = $('<th>', { html: this.getRubroLabel() }).appendTo(thead);
911
- thRubro.css('text-align', 'center');
912
- thRubro.css('border', '1px solid black');
913
- thRubro.css('color', 'white');
914
- thRubro.css('background-color', 'grey');
915
- let iteracionAnio = 0;
916
- for (const year of summary.years) {
917
- const thYear = $('<th>', { html: this.getYearLabel() + ++iteracionAnio }).appendTo(thead);
918
- thYear.css('text-align', 'center');
919
- thYear.css('border', '1px solid black');
920
- thYear.css('color', 'white');
921
- thYear.css('background-color', 'grey');
922
- thYear.css('width', '80px');
923
- }
924
- const totalLabel = '&nbsp;' + this.getTotalLabel() + summary.baseCurrency + '&nbsp;';
925
- const thTotal = $('<th>', { html: totalLabel }).appendTo(thead);
926
- thTotal.css('text-align', 'center');
927
- thTotal.css('border', '1px solid black');
928
- thTotal.css('color', 'white');
929
- thTotal.css('background-color', 'grey');
930
- thTotal.css('width', '80px');
931
- //tbody
932
- let tbody = $('<tbody>').appendTo(table);
933
- for (let iCat = 0; iCat < summary.categories.length; iCat++) {
934
- const tr = $('<tr>').appendTo(tbody);
935
- const category = summary.categories[iCat];
936
- const rubroLabel = '&nbsp;&nbsp;' +
937
- this.translateCategory(category.category) +
938
- '&nbsp;&nbsp;&nbsp;&nbsp;';
939
- const tdRubro = $('<td>', { html: rubroLabel }).appendTo(tr);
940
- tdRubro.css('text-align', 'left');
941
- tdRubro.css('border', '1px solid black');
942
- tdRubro.css('font-weight', 'bold');
943
- for (const year of category.years) {
944
- const yearTotal = year.total == 0
945
- ? '-'
946
- : this.currencyPipe.transform(year.total, 'default', '', '1.0-0');
947
- const yearLabelTotal = '&nbsp;&nbsp;' + yearTotal + '&nbsp;&nbsp;';
948
- const tdYear = $('<td>', { html: yearLabelTotal }).appendTo(tr);
949
- tdYear.css('text-align', 'right');
950
- tdYear.css('border', '1px solid black');
951
- }
952
- const categoryTotal = category.total == 0
953
- ? '-'
954
- : this.currencyPipe.transform(category.total, 'default', '', '1.0-0');
955
- const categoryLabelTotal = '&nbsp;&nbsp;' + categoryTotal + '&nbsp;&nbsp;';
956
- const tdTotal = $('<td>', { html: categoryLabelTotal }).appendTo(tr);
957
- tdTotal.css('text-align', 'right');
958
- tdTotal.css('border', '1px solid black');
959
- tdTotal.css('font-weight', 'bold');
960
- }
961
- const trFinal = $('<tr>').appendTo(tbody);
962
- const baseCurrency = this.getTotalLabel() + ' ' + summary.baseCurrency + '&nbsp;&nbsp;';
963
- const tdFinalTotalBC = $('<td>', { html: baseCurrency }).appendTo(trFinal);
964
- tdFinalTotalBC.css('text-align', 'right');
965
- tdFinalTotalBC.css('border', '1px solid black');
966
- tdFinalTotalBC.css('color', 'white');
967
- tdFinalTotalBC.css('background-color', 'grey');
968
- let budgetTotal = 0;
969
- for (const year of summary.years) {
970
- const yearTotal = year.total == 0
971
- ? '-'
972
- : this.currencyPipe.transform(year.total, 'default', '', '1.0-0');
973
- const yearLabelTotal = yearTotal + '&nbsp;&nbsp;';
974
- const tdYear = $('<td>', { html: yearLabelTotal }).appendTo(trFinal);
975
- tdYear.css('text-align', 'right');
976
- tdYear.css('border', '1px solid black');
977
- tdYear.css('color', 'white');
978
- tdYear.css('background-color', 'grey');
979
- budgetTotal += year.total;
980
- }
981
- const totalBaseCurrency = budgetTotal == 0
982
- ? '-'
983
- : this.currencyPipe.transform(budgetTotal, 'default', '', '1.0-0');
984
- const totalLabelBaseCurrency = '&nbsp;&nbsp;' + totalBaseCurrency + '&nbsp;&nbsp;';
985
- const tdFinalTotal = $('<td>', { html: totalLabelBaseCurrency }).appendTo(trFinal);
986
- tdFinalTotal.css('text-align', 'right');
987
- tdFinalTotal.css('border', '1px solid black');
988
- tdFinalTotal.css('color', 'white');
989
- tdFinalTotal.css('background-color', 'grey');
990
- resumeCategoryYearContent.append(table);
991
- }
992
- }
993
- }
994
- TokenComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: TokenComponent, deps: [{ token: i1.CurrencyPipe }, { token: i2.TokenService }, { token: i3.ToastrService }, { token: i4.AuthenticationService }], target: i0.ɵɵFactoryTarget.Component });
995
- TokenComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.5", type: TokenComponent, selector: "pli-token", inputs: { template: "template", data: "data" }, outputs: { onGenerate: "onGenerate" }, usesOnChanges: true, ngImport: i0, template: "<div style=\"display: none;\" id=\"pli-token-destination\">\r\n\t<!-- <div *ngIf=\"data != undefined && data.dataDestination != undefined\">\r\n\r\n <div *ngIf=\"data.dataDestination.text != undefined\">\r\n {{data.dataDestination.text}}\r\n </div>\r\n <div *ngIf=\"data.dataDestination.title != undefined\">\r\n {{data.dataDestination.title}}\r\n </div>\r\n <div *ngIf=\"data.dataDestination.name != undefined || data.dataDestination.lastName != undefined\">\r\n <strong>{{data.dataDestination.name}} {{data.dataDestination.lastName}}</strong>\r\n </div>\r\n <div *ngIf=\"data.dataDestination.cargo != undefined\">\r\n {{data.dataDestination.cargo}}\r\n </div>\r\n <div *ngIf=\"data.dataDestination.occupation != undefined\">\r\n {{data.dataDestination.occupation}}\r\n </div>\r\n <div *ngIf=\"data.dataDestination.company != undefined\">\r\n {{data.dataDestination.company}}\r\n </div>\r\n <div *ngIf=\"data.dataDestination.address != undefined || data.dataDestination.addressDetails != undefined \">\r\n {{data.dataDestination.address}} {{data.dataDestination.addressDetails}}\r\n </div>\r\n <div *ngIf=\"data.dataDestination.city != undefined || data.dataDestination.country != undefined \">\r\n {{data.dataDestination.city}}<span *ngIf=\"data.dataDestination.city != undefined && data.dataDestination.country != undefined\">,</span>{{data.dataDestination.country}}\r\n </div>\r\n\r\n </div> -->\r\n</div>\r\n<!-- Complementary greeting-->\r\n<div style=\"display: none;\" id=\"pli-token-complementary-greeting\">\r\n\t<!-- <div\r\n\t\t*ngIf=\"\r\n\t\t\tdata != undefined &&\r\n\t\t\tdata.dataDestination != undefined &&\r\n\t\t\tdata.dataDestination.targetId == 2 &&\r\n\t\t\tdata.dataDestination.greeting != undefined\r\n\t\t\"\r\n\t>\r\n\t\t{{ data.dataDestination.greeting\r\n\t\t}}<span *ngIf=\"data.dataDestination.title != undefined\"\r\n\t\t\t>&nbsp;{{ data.dataDestination.title }}</span\r\n\t\t><span *ngIf=\"data.dataDestination.lastName != undefined\"\r\n\t\t\t>&nbsp;{{ data.dataDestination.lastName }}</span\r\n\t\t>:\r\n\t</div>-->\r\n</div>\r\n\r\n<!-- Primary budget total summary ${presupuesto_288_resumeCategoryYear} -->\r\n<div style=\"display: none;\" id=\"pli-token-principal-budget-total-summary\">\r\n\t<!-- <div>\r\n\t\t<table\r\n\t\t\t*ngIf=\"\r\n\t\t\t\tbudgetDtoPrimary !== null &&\r\n\t\t\t\tbudgetDtoPrimary.budget &&\r\n\t\t\t\tbudgetDtoPrimary.budget.summary\r\n\t\t\t\"\r\n\t\t\tstyle=\"border-spacing: 2px;border-collapse: collapse;\"\r\n\t\t>\r\n\t\t\t<thead>\r\n\t\t\t\t<tr style=\"font-weight: bold;\">\r\n\t\t\t\t\t<td\r\n\t\t\t\t\t\tstyle=\"text-align: center;border: 1px solid black; color: white;background-color: grey;\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\tRubro\r\n\t\t\t\t\t</td>\r\n\t\t\t\t\t<td\r\n\t\t\t\t\t\t*ngFor=\"let year of budgetDtoPrimary.budget.summary.years\"\r\n\t\t\t\t\t\tstyle=\"text-align: center;border: 1px solid black; color: white;background-color: grey; width:80px;\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t{{ year.yearNumber }}\r\n\t\t\t\t\t</td>\r\n\t\t\t\t\t<td\r\n\t\t\t\t\t\tstyle=\"text-align: center;border: 1px solid black; color: white;background-color: grey; width: 110px;\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\tTotal ({{ budgetDtoPrimary.budget.summary.baseCurrency }})\r\n\t\t\t\t\t</td>\r\n\t\t\t\t</tr>\r\n\t\t\t</thead>\r\n\t\t\t<tbody>\r\n\t\t\t\t<tr\r\n\t\t\t\t\t*ngFor=\"\r\n\t\t\t\t\t\tlet category of budgetDtoPrimary.budget.summary.categories;\r\n\t\t\t\t\t\tlet iCat = index\r\n\t\t\t\t\t\"\r\n\t\t\t\t>\r\n\t\t\t\t\t<td style=\"font-weight: bold;text-align: left;border: 1px solid black;\">\r\n\t\t\t\t\t\t&nbsp;&nbsp;{{\r\n\t\t\t\t\t\t\ttranslateCategory(category.category)\r\n\t\t\t\t\t\t}}&nbsp;&nbsp;&nbsp;&nbsp;\r\n\t\t\t\t\t</td>\r\n\t\t\t\t\t<td\r\n\t\t\t\t\t\t*ngFor=\"let year of category.years\"\r\n\t\t\t\t\t\tstyle=\"text-align: right;border: 1px solid black; \"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t&nbsp;&nbsp;{{\r\n\t\t\t\t\t\t\tyear.total == 0 ? '-' : (year.total | currency: 'default':'':'1.0-0')\r\n\t\t\t\t\t\t}}&nbsp;&nbsp;\r\n\t\t\t\t\t</td>\r\n\t\t\t\t\t<td style=\"font-weight: bold; text-align: right;border: 1px solid black;\">\r\n\t\t\t\t\t\t&nbsp;&nbsp;{{\r\n\t\t\t\t\t\t\tcategory.total == 0\r\n\t\t\t\t\t\t\t\t? '-'\r\n\t\t\t\t\t\t\t\t: (category.total | currency: 'default':'':'1.0-0')\r\n\t\t\t\t\t\t}}&nbsp;&nbsp;\r\n\t\t\t\t\t</td>\r\n\t\t\t\t</tr>\r\n\t\t\t\t<tr style=\"font-weight: bold;\">\r\n\t\t\t\t\t<td\r\n\t\t\t\t\t\tstyle=\"text-align: right;border: 1px solid black; color: white;background-color: grey;\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\tTotal ({{ budgetDtoPrimary.budget.summary.baseCurrency }})&nbsp;&nbsp;\r\n\t\t\t\t\t</td>\r\n\t\t\t\t\t<td\r\n\t\t\t\t\t\t*ngFor=\"let year of budgetDtoPrimary.budget.summary.years\"\r\n\t\t\t\t\t\tstyle=\"text-align: right;border: 1px solid black; color: white;background-color: grey; \"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t{{\r\n\t\t\t\t\t\t\tyear.total == 0 ? '-' : (year.total | currency: 'default':'':'1.0-0')\r\n\t\t\t\t\t\t}}&nbsp;&nbsp;\r\n\t\t\t\t\t</td>\r\n\t\t\t\t\t<td\r\n\t\t\t\t\t\tstyle=\"text-align: right;border: 1px solid black; color: white;background-color: grey;\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t{{\r\n\t\t\t\t\t\t\tbudgetDtoPrimary.budget.summary.budgetTotal == 0\r\n\t\t\t\t\t\t\t\t? '-'\r\n\t\t\t\t\t\t\t\t: (budgetDtoPrimary.budget.summary.budgetTotal\r\n\t\t\t\t\t\t\t\t | currency: 'default':'':'1.0-0')\r\n\t\t\t\t\t\t}}&nbsp;&nbsp;\r\n\t\t\t\t\t</td>\r\n\t\t\t\t</tr>\r\n\t\t\t</tbody>\r\n\t\t</table>\r\n\t</div> -->\r\n</div>\r\n<!-- Secundary budget total summary ${presupuesto_288_resumeCategoryYear} -->\r\n<div style=\"display: none;\" id=\"pli-token-secundary-budget-total-summary\">\r\n\t<div>\r\n\t\t<table\r\n\t\t\t*ngIf=\"\r\n\t\t\t\tbudgetDtoSecundary !== null &&\r\n\t\t\t\tbudgetDtoSecundary.budget &&\r\n\t\t\t\tbudgetDtoSecundary.budget.summary\r\n\t\t\t\"\r\n\t\t\tstyle=\"border-spacing: 2px; border-collapse: collapse; width: 100%;\"\r\n\t\t>\r\n\t\t\t<thead>\r\n\t\t\t\t<tr style=\"font-weight: bold;\">\r\n\t\t\t\t\t<td\r\n\t\t\t\t\t\tstyle=\"\r\n\t\t\t\t\t\t\ttext-align: center;\r\n\t\t\t\t\t\t\tborder: 1px solid black;\r\n\t\t\t\t\t\t\tcolor: white;\r\n\t\t\t\t\t\t\tbackground-color: grey;\r\n\t\t\t\t\t\t\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\tRubro\r\n\t\t\t\t\t</td>\r\n\t\t\t\t\t<td\r\n\t\t\t\t\t\t*ngFor=\"let year of budgetDtoSecundary.budget.summary.years\"\r\n\t\t\t\t\t\tstyle=\"\r\n\t\t\t\t\t\t\ttext-align: center;\r\n\t\t\t\t\t\t\tborder: 1px solid black;\r\n\t\t\t\t\t\t\tcolor: white;\r\n\t\t\t\t\t\t\tbackground-color: grey;\r\n\t\t\t\t\t\t\twidth: 80px;\r\n\t\t\t\t\t\t\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t{{ year.yearNumber }}\r\n\t\t\t\t\t</td>\r\n\t\t\t\t\t<td\r\n\t\t\t\t\t\tstyle=\"\r\n\t\t\t\t\t\t\ttext-align: center;\r\n\t\t\t\t\t\t\tborder: 1px solid black;\r\n\t\t\t\t\t\t\tcolor: white;\r\n\t\t\t\t\t\t\tbackground-color: grey;\r\n\t\t\t\t\t\t\twidth: 110px;\r\n\t\t\t\t\t\t\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\tTotal ({{ budgetDtoSecundary.budget.summary.baseCurrency }})\r\n\t\t\t\t\t</td>\r\n\t\t\t\t</tr>\r\n\t\t\t</thead>\r\n\t\t\t<tbody>\r\n\t\t\t\t<tr\r\n\t\t\t\t\t*ngFor=\"\r\n\t\t\t\t\t\tlet category of budgetDtoSecundary.budget.summary.categories;\r\n\t\t\t\t\t\tlet iCat = index\r\n\t\t\t\t\t\"\r\n\t\t\t\t>\r\n\t\t\t\t\t<td style=\"font-weight: bold; text-align: left; border: 1px solid black;\">\r\n\t\t\t\t\t\t&nbsp;&nbsp;{{\r\n\t\t\t\t\t\t\ttranslateCategory(category.category)\r\n\t\t\t\t\t\t}}&nbsp;&nbsp;&nbsp;&nbsp;\r\n\t\t\t\t\t</td>\r\n\t\t\t\t\t<td\r\n\t\t\t\t\t\t*ngFor=\"let year of category.years\"\r\n\t\t\t\t\t\tstyle=\"text-align: right; border: 1px solid black;\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t&nbsp;&nbsp;{{\r\n\t\t\t\t\t\t\tyear.total == 0 ? '-' : (year.total | currency: 'default':'':'1.0-0')\r\n\t\t\t\t\t\t}}&nbsp;&nbsp;\r\n\t\t\t\t\t</td>\r\n\t\t\t\t\t<td style=\"font-weight: bold; text-align: right; border: 1px solid black;\">\r\n\t\t\t\t\t\t&nbsp;&nbsp;{{\r\n\t\t\t\t\t\t\tcategory.total == 0\r\n\t\t\t\t\t\t\t\t? '-'\r\n\t\t\t\t\t\t\t\t: (category.total | currency: 'default':'':'1.0-0')\r\n\t\t\t\t\t\t}}&nbsp;&nbsp;\r\n\t\t\t\t\t</td>\r\n\t\t\t\t</tr>\r\n\t\t\t\t<tr style=\"font-weight: bold;\">\r\n\t\t\t\t\t<td\r\n\t\t\t\t\t\tstyle=\"\r\n\t\t\t\t\t\t\ttext-align: right;\r\n\t\t\t\t\t\t\tborder: 1px solid black;\r\n\t\t\t\t\t\t\tcolor: white;\r\n\t\t\t\t\t\t\tbackground-color: grey;\r\n\t\t\t\t\t\t\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\tTotal ({{ budgetDtoSecundary.budget.summary.baseCurrency }})&nbsp;&nbsp;\r\n\t\t\t\t\t</td>\r\n\t\t\t\t\t<td\r\n\t\t\t\t\t\t*ngFor=\"let year of budgetDtoSecundary.budget.summary.years\"\r\n\t\t\t\t\t\tstyle=\"\r\n\t\t\t\t\t\t\ttext-align: right;\r\n\t\t\t\t\t\t\tborder: 1px solid black;\r\n\t\t\t\t\t\t\tcolor: white;\r\n\t\t\t\t\t\t\tbackground-color: grey;\r\n\t\t\t\t\t\t\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t{{\r\n\t\t\t\t\t\t\tyear.total == 0 ? '-' : (year.total | currency: 'default':'':'1.0-0')\r\n\t\t\t\t\t\t}}&nbsp;&nbsp;\r\n\t\t\t\t\t</td>\r\n\t\t\t\t\t<td\r\n\t\t\t\t\t\tstyle=\"\r\n\t\t\t\t\t\t\ttext-align: right;\r\n\t\t\t\t\t\t\tborder: 1px solid black;\r\n\t\t\t\t\t\t\tcolor: white;\r\n\t\t\t\t\t\t\tbackground-color: grey;\r\n\t\t\t\t\t\t\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t{{\r\n\t\t\t\t\t\t\tbudgetDtoSecundary.budget.summary.budgetTotal == 0\r\n\t\t\t\t\t\t\t\t? '-'\r\n\t\t\t\t\t\t\t\t: (budgetDtoSecundary.budget.summary.budgetTotal\r\n\t\t\t\t\t\t\t\t | currency: 'default':'':'1.0-0')\r\n\t\t\t\t\t\t}}&nbsp;&nbsp;\r\n\t\t\t\t\t</td>\r\n\t\t\t\t</tr>\r\n\t\t\t</tbody>\r\n\t\t</table>\r\n\t</div>\r\n</div>\r\n", styles: [""], directives: [{ type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], pipes: { "currency": i1.CurrencyPipe } });
996
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: TokenComponent, decorators: [{
997
- type: Component,
998
- args: [{ selector: 'pli-token', template: "<div style=\"display: none;\" id=\"pli-token-destination\">\r\n\t<!-- <div *ngIf=\"data != undefined && data.dataDestination != undefined\">\r\n\r\n <div *ngIf=\"data.dataDestination.text != undefined\">\r\n {{data.dataDestination.text}}\r\n </div>\r\n <div *ngIf=\"data.dataDestination.title != undefined\">\r\n {{data.dataDestination.title}}\r\n </div>\r\n <div *ngIf=\"data.dataDestination.name != undefined || data.dataDestination.lastName != undefined\">\r\n <strong>{{data.dataDestination.name}} {{data.dataDestination.lastName}}</strong>\r\n </div>\r\n <div *ngIf=\"data.dataDestination.cargo != undefined\">\r\n {{data.dataDestination.cargo}}\r\n </div>\r\n <div *ngIf=\"data.dataDestination.occupation != undefined\">\r\n {{data.dataDestination.occupation}}\r\n </div>\r\n <div *ngIf=\"data.dataDestination.company != undefined\">\r\n {{data.dataDestination.company}}\r\n </div>\r\n <div *ngIf=\"data.dataDestination.address != undefined || data.dataDestination.addressDetails != undefined \">\r\n {{data.dataDestination.address}} {{data.dataDestination.addressDetails}}\r\n </div>\r\n <div *ngIf=\"data.dataDestination.city != undefined || data.dataDestination.country != undefined \">\r\n {{data.dataDestination.city}}<span *ngIf=\"data.dataDestination.city != undefined && data.dataDestination.country != undefined\">,</span>{{data.dataDestination.country}}\r\n </div>\r\n\r\n </div> -->\r\n</div>\r\n<!-- Complementary greeting-->\r\n<div style=\"display: none;\" id=\"pli-token-complementary-greeting\">\r\n\t<!-- <div\r\n\t\t*ngIf=\"\r\n\t\t\tdata != undefined &&\r\n\t\t\tdata.dataDestination != undefined &&\r\n\t\t\tdata.dataDestination.targetId == 2 &&\r\n\t\t\tdata.dataDestination.greeting != undefined\r\n\t\t\"\r\n\t>\r\n\t\t{{ data.dataDestination.greeting\r\n\t\t}}<span *ngIf=\"data.dataDestination.title != undefined\"\r\n\t\t\t>&nbsp;{{ data.dataDestination.title }}</span\r\n\t\t><span *ngIf=\"data.dataDestination.lastName != undefined\"\r\n\t\t\t>&nbsp;{{ data.dataDestination.lastName }}</span\r\n\t\t>:\r\n\t</div>-->\r\n</div>\r\n\r\n<!-- Primary budget total summary ${presupuesto_288_resumeCategoryYear} -->\r\n<div style=\"display: none;\" id=\"pli-token-principal-budget-total-summary\">\r\n\t<!-- <div>\r\n\t\t<table\r\n\t\t\t*ngIf=\"\r\n\t\t\t\tbudgetDtoPrimary !== null &&\r\n\t\t\t\tbudgetDtoPrimary.budget &&\r\n\t\t\t\tbudgetDtoPrimary.budget.summary\r\n\t\t\t\"\r\n\t\t\tstyle=\"border-spacing: 2px;border-collapse: collapse;\"\r\n\t\t>\r\n\t\t\t<thead>\r\n\t\t\t\t<tr style=\"font-weight: bold;\">\r\n\t\t\t\t\t<td\r\n\t\t\t\t\t\tstyle=\"text-align: center;border: 1px solid black; color: white;background-color: grey;\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\tRubro\r\n\t\t\t\t\t</td>\r\n\t\t\t\t\t<td\r\n\t\t\t\t\t\t*ngFor=\"let year of budgetDtoPrimary.budget.summary.years\"\r\n\t\t\t\t\t\tstyle=\"text-align: center;border: 1px solid black; color: white;background-color: grey; width:80px;\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t{{ year.yearNumber }}\r\n\t\t\t\t\t</td>\r\n\t\t\t\t\t<td\r\n\t\t\t\t\t\tstyle=\"text-align: center;border: 1px solid black; color: white;background-color: grey; width: 110px;\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\tTotal ({{ budgetDtoPrimary.budget.summary.baseCurrency }})\r\n\t\t\t\t\t</td>\r\n\t\t\t\t</tr>\r\n\t\t\t</thead>\r\n\t\t\t<tbody>\r\n\t\t\t\t<tr\r\n\t\t\t\t\t*ngFor=\"\r\n\t\t\t\t\t\tlet category of budgetDtoPrimary.budget.summary.categories;\r\n\t\t\t\t\t\tlet iCat = index\r\n\t\t\t\t\t\"\r\n\t\t\t\t>\r\n\t\t\t\t\t<td style=\"font-weight: bold;text-align: left;border: 1px solid black;\">\r\n\t\t\t\t\t\t&nbsp;&nbsp;{{\r\n\t\t\t\t\t\t\ttranslateCategory(category.category)\r\n\t\t\t\t\t\t}}&nbsp;&nbsp;&nbsp;&nbsp;\r\n\t\t\t\t\t</td>\r\n\t\t\t\t\t<td\r\n\t\t\t\t\t\t*ngFor=\"let year of category.years\"\r\n\t\t\t\t\t\tstyle=\"text-align: right;border: 1px solid black; \"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t&nbsp;&nbsp;{{\r\n\t\t\t\t\t\t\tyear.total == 0 ? '-' : (year.total | currency: 'default':'':'1.0-0')\r\n\t\t\t\t\t\t}}&nbsp;&nbsp;\r\n\t\t\t\t\t</td>\r\n\t\t\t\t\t<td style=\"font-weight: bold; text-align: right;border: 1px solid black;\">\r\n\t\t\t\t\t\t&nbsp;&nbsp;{{\r\n\t\t\t\t\t\t\tcategory.total == 0\r\n\t\t\t\t\t\t\t\t? '-'\r\n\t\t\t\t\t\t\t\t: (category.total | currency: 'default':'':'1.0-0')\r\n\t\t\t\t\t\t}}&nbsp;&nbsp;\r\n\t\t\t\t\t</td>\r\n\t\t\t\t</tr>\r\n\t\t\t\t<tr style=\"font-weight: bold;\">\r\n\t\t\t\t\t<td\r\n\t\t\t\t\t\tstyle=\"text-align: right;border: 1px solid black; color: white;background-color: grey;\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\tTotal ({{ budgetDtoPrimary.budget.summary.baseCurrency }})&nbsp;&nbsp;\r\n\t\t\t\t\t</td>\r\n\t\t\t\t\t<td\r\n\t\t\t\t\t\t*ngFor=\"let year of budgetDtoPrimary.budget.summary.years\"\r\n\t\t\t\t\t\tstyle=\"text-align: right;border: 1px solid black; color: white;background-color: grey; \"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t{{\r\n\t\t\t\t\t\t\tyear.total == 0 ? '-' : (year.total | currency: 'default':'':'1.0-0')\r\n\t\t\t\t\t\t}}&nbsp;&nbsp;\r\n\t\t\t\t\t</td>\r\n\t\t\t\t\t<td\r\n\t\t\t\t\t\tstyle=\"text-align: right;border: 1px solid black; color: white;background-color: grey;\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t{{\r\n\t\t\t\t\t\t\tbudgetDtoPrimary.budget.summary.budgetTotal == 0\r\n\t\t\t\t\t\t\t\t? '-'\r\n\t\t\t\t\t\t\t\t: (budgetDtoPrimary.budget.summary.budgetTotal\r\n\t\t\t\t\t\t\t\t | currency: 'default':'':'1.0-0')\r\n\t\t\t\t\t\t}}&nbsp;&nbsp;\r\n\t\t\t\t\t</td>\r\n\t\t\t\t</tr>\r\n\t\t\t</tbody>\r\n\t\t</table>\r\n\t</div> -->\r\n</div>\r\n<!-- Secundary budget total summary ${presupuesto_288_resumeCategoryYear} -->\r\n<div style=\"display: none;\" id=\"pli-token-secundary-budget-total-summary\">\r\n\t<div>\r\n\t\t<table\r\n\t\t\t*ngIf=\"\r\n\t\t\t\tbudgetDtoSecundary !== null &&\r\n\t\t\t\tbudgetDtoSecundary.budget &&\r\n\t\t\t\tbudgetDtoSecundary.budget.summary\r\n\t\t\t\"\r\n\t\t\tstyle=\"border-spacing: 2px; border-collapse: collapse; width: 100%;\"\r\n\t\t>\r\n\t\t\t<thead>\r\n\t\t\t\t<tr style=\"font-weight: bold;\">\r\n\t\t\t\t\t<td\r\n\t\t\t\t\t\tstyle=\"\r\n\t\t\t\t\t\t\ttext-align: center;\r\n\t\t\t\t\t\t\tborder: 1px solid black;\r\n\t\t\t\t\t\t\tcolor: white;\r\n\t\t\t\t\t\t\tbackground-color: grey;\r\n\t\t\t\t\t\t\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\tRubro\r\n\t\t\t\t\t</td>\r\n\t\t\t\t\t<td\r\n\t\t\t\t\t\t*ngFor=\"let year of budgetDtoSecundary.budget.summary.years\"\r\n\t\t\t\t\t\tstyle=\"\r\n\t\t\t\t\t\t\ttext-align: center;\r\n\t\t\t\t\t\t\tborder: 1px solid black;\r\n\t\t\t\t\t\t\tcolor: white;\r\n\t\t\t\t\t\t\tbackground-color: grey;\r\n\t\t\t\t\t\t\twidth: 80px;\r\n\t\t\t\t\t\t\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t{{ year.yearNumber }}\r\n\t\t\t\t\t</td>\r\n\t\t\t\t\t<td\r\n\t\t\t\t\t\tstyle=\"\r\n\t\t\t\t\t\t\ttext-align: center;\r\n\t\t\t\t\t\t\tborder: 1px solid black;\r\n\t\t\t\t\t\t\tcolor: white;\r\n\t\t\t\t\t\t\tbackground-color: grey;\r\n\t\t\t\t\t\t\twidth: 110px;\r\n\t\t\t\t\t\t\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\tTotal ({{ budgetDtoSecundary.budget.summary.baseCurrency }})\r\n\t\t\t\t\t</td>\r\n\t\t\t\t</tr>\r\n\t\t\t</thead>\r\n\t\t\t<tbody>\r\n\t\t\t\t<tr\r\n\t\t\t\t\t*ngFor=\"\r\n\t\t\t\t\t\tlet category of budgetDtoSecundary.budget.summary.categories;\r\n\t\t\t\t\t\tlet iCat = index\r\n\t\t\t\t\t\"\r\n\t\t\t\t>\r\n\t\t\t\t\t<td style=\"font-weight: bold; text-align: left; border: 1px solid black;\">\r\n\t\t\t\t\t\t&nbsp;&nbsp;{{\r\n\t\t\t\t\t\t\ttranslateCategory(category.category)\r\n\t\t\t\t\t\t}}&nbsp;&nbsp;&nbsp;&nbsp;\r\n\t\t\t\t\t</td>\r\n\t\t\t\t\t<td\r\n\t\t\t\t\t\t*ngFor=\"let year of category.years\"\r\n\t\t\t\t\t\tstyle=\"text-align: right; border: 1px solid black;\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t&nbsp;&nbsp;{{\r\n\t\t\t\t\t\t\tyear.total == 0 ? '-' : (year.total | currency: 'default':'':'1.0-0')\r\n\t\t\t\t\t\t}}&nbsp;&nbsp;\r\n\t\t\t\t\t</td>\r\n\t\t\t\t\t<td style=\"font-weight: bold; text-align: right; border: 1px solid black;\">\r\n\t\t\t\t\t\t&nbsp;&nbsp;{{\r\n\t\t\t\t\t\t\tcategory.total == 0\r\n\t\t\t\t\t\t\t\t? '-'\r\n\t\t\t\t\t\t\t\t: (category.total | currency: 'default':'':'1.0-0')\r\n\t\t\t\t\t\t}}&nbsp;&nbsp;\r\n\t\t\t\t\t</td>\r\n\t\t\t\t</tr>\r\n\t\t\t\t<tr style=\"font-weight: bold;\">\r\n\t\t\t\t\t<td\r\n\t\t\t\t\t\tstyle=\"\r\n\t\t\t\t\t\t\ttext-align: right;\r\n\t\t\t\t\t\t\tborder: 1px solid black;\r\n\t\t\t\t\t\t\tcolor: white;\r\n\t\t\t\t\t\t\tbackground-color: grey;\r\n\t\t\t\t\t\t\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\tTotal ({{ budgetDtoSecundary.budget.summary.baseCurrency }})&nbsp;&nbsp;\r\n\t\t\t\t\t</td>\r\n\t\t\t\t\t<td\r\n\t\t\t\t\t\t*ngFor=\"let year of budgetDtoSecundary.budget.summary.years\"\r\n\t\t\t\t\t\tstyle=\"\r\n\t\t\t\t\t\t\ttext-align: right;\r\n\t\t\t\t\t\t\tborder: 1px solid black;\r\n\t\t\t\t\t\t\tcolor: white;\r\n\t\t\t\t\t\t\tbackground-color: grey;\r\n\t\t\t\t\t\t\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t{{\r\n\t\t\t\t\t\t\tyear.total == 0 ? '-' : (year.total | currency: 'default':'':'1.0-0')\r\n\t\t\t\t\t\t}}&nbsp;&nbsp;\r\n\t\t\t\t\t</td>\r\n\t\t\t\t\t<td\r\n\t\t\t\t\t\tstyle=\"\r\n\t\t\t\t\t\t\ttext-align: right;\r\n\t\t\t\t\t\t\tborder: 1px solid black;\r\n\t\t\t\t\t\t\tcolor: white;\r\n\t\t\t\t\t\t\tbackground-color: grey;\r\n\t\t\t\t\t\t\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t{{\r\n\t\t\t\t\t\t\tbudgetDtoSecundary.budget.summary.budgetTotal == 0\r\n\t\t\t\t\t\t\t\t? '-'\r\n\t\t\t\t\t\t\t\t: (budgetDtoSecundary.budget.summary.budgetTotal\r\n\t\t\t\t\t\t\t\t | currency: 'default':'':'1.0-0')\r\n\t\t\t\t\t\t}}&nbsp;&nbsp;\r\n\t\t\t\t\t</td>\r\n\t\t\t\t</tr>\r\n\t\t\t</tbody>\r\n\t\t</table>\r\n\t</div>\r\n</div>\r\n", styles: [""] }]
999
- }], ctorParameters: function () { return [{ type: i1.CurrencyPipe }, { type: i2.TokenService }, { type: i3.ToastrService }, { type: i4.AuthenticationService }]; }, propDecorators: { template: [{
1000
- type: Input
1001
- }], data: [{
1002
- type: Input
1003
- }], onGenerate: [{
1004
- type: Output
1005
- }] } });
1006
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW4uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctcGxpLWNvbW1vbnMvc3JjL2xpYi9jb21wb25lbnRzL3Rva2VuL3Rva2VuLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLXBsaS1jb21tb25zL3NyYy9saWIvY29tcG9uZW50cy90b2tlbi90b2tlbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ04sU0FBUyxFQUVULEtBQUssRUFDTCxNQUFNLEVBQ04sWUFBWSxFQUlaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFDTixVQUFVLEVBSVYsZ0JBQWdCLEVBQ2hCLFVBQVUsRUFFVixrQkFBa0IsRUFHbEIsUUFBUSxFQUVSLE1BQU0sYUFBYSxDQUFDO0FBRXJCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUc1RCxPQUFPLFFBQVEsQ0FBQzs7Ozs7O0FBT2hCLE1BQU0sT0FBTyxjQUFjO0lBNkIxQixZQUNTLFlBQTBCLEVBQzFCLFlBQTBCLEVBQzFCLGFBQTRCLEVBQzVCLHFCQUE0QztRQUg1QyxpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUMxQixpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUMxQixrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUM1QiwwQkFBcUIsR0FBckIscUJBQXFCLENBQXVCO1FBNUJyRCx1Q0FBdUM7UUFDN0IsZUFBVSxHQUFzQixJQUFJLFlBQVksRUFBTyxDQUFDO1FBRWxFLGtEQUFrRDtRQUNsRCxzQkFBaUIsR0FBWSxLQUFLLENBQUM7SUF5QmhDLENBQUM7SUFFSixRQUFRO1FBQ1AsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztRQUM3QixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO1FBQzdCLElBQUksQ0FBQyxnQkFBZ0IsR0FB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QUFRO3NCQUFoQixLQUFLO2dCQUVHLElBQUk7c0JBQVosS0FBSztnQkFFSSxVQUFVO3NCQUFuQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuXHRDb21wb25lbnQsXHJcblx0T25Jbml0LFxyXG5cdElucHV0LFxyXG5cdE91dHB1dCxcclxuXHRFdmVudEVtaXR0ZXIsXHJcblx0T25DaGFuZ2VzLFxyXG5cdFNpbXBsZUNoYW5nZXMsXHJcblx0U2ltcGxlQ2hhbmdlXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7XHJcblx0VXRpbFN0cmluZyxcclxuXHREYXRhVG9UcmFuc2xhdGVUb2tlbixcclxuXHRUb2tlbixcclxuXHRCdWRnZXREdG8sXHJcblx0RVRpcG9QcmVzdXB1ZXN0byxcclxuXHRQbGlVc3VhcmlvLFxyXG5cdHNlc2lvbixcclxuXHRBdXRoZW50aWNhdGlvblV0aWwsXHJcblx0UGxpVXNlcixcclxuXHRBcHBsaWNhdGlvbkJ1ZGdldFRvdGFsLFxyXG5cdERhdGVVdGlsLFxyXG5cdEV2YWx1YXRpb25cclxufSBmcm9tICduZy1wbGktdXRpbCc7XHJcbmltcG9ydCB7IEN1cnJlbmN5UGlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IFRva2VuU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3Rva2VuLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBUb2FzdHJTZXJ2aWNlIH0gZnJvbSAnbmd4LXRvYXN0cic7XHJcbmltcG9ydCB7IEF1dGhlbnRpY2F0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2F1dGhlbnRpY2F0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgJ2pxdWVyeSc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuXHRzZWxlY3RvcjogJ3BsaS10b2tlbicsXHJcblx0dGVtcGxhdGVVcmw6ICcuL3Rva2VuLmNvbXBvbmVudC5odG1sJyxcclxuXHRzdHlsZVVybHM6IFsnLi90b2tlbi5jb21wb25lbnQuY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIFRva2VuQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xyXG5cdC8qKiBJdCBjb250YWlucyB0aGUgdGVtcGxhdGUgaHRtbCB0byB0cmFuc2xhdGUgKi9cclxuXHRASW5wdXQoKSB0ZW1wbGF0ZTogc3RyaW5nO1xyXG5cdC8qKiBJdCBjb250YWlucyB0aGUgZGF0YSB0byBpbXBsZW1lbnQgKi9cclxuXHRASW5wdXQoKSBkYXRhOiBEYXRhVG9UcmFuc2xhdGVUb2tlbjtcclxuXHQvKiogSXQgbm90aWZpZXMgdGhlIGh0bWwgaXMgZ2VuZXJhdGVkKi9cclxuXHRAT3V0cHV0KCkgb25HZW5lcmF0ZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcblx0LyoqIEl0IGVuYWJsZXMgdGhlIHZpc3VhbGl6YXRpb24gb2YgZGVzdGluYXRpb24gKi9cclxuXHRlbmFibGVEZXN0aW5hdGlvbjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuXHQvKiogSXQgY29udGFpbnMgdGhlIHByb20gY29kZSAqL1xyXG5cdHByb21Db2RpZ286IG51bWJlcjtcclxuXHJcblx0LyoqICovXHJcblx0bFRva2VuQ2FsY3VsYXRlZDogVG9rZW5bXTtcclxuXHQvKiogKi9cclxuXHRsRm9ybUZpZWxkc1Rva2VuOiBhbnlbXTtcclxuXHQvKiogKi9cclxuXHR1bmlxdWVWZXJpZmljYXRpb25Db2RlOiBzdHJpbmc7XHJcblx0LyoqICovXHJcblx0YnVkZ2V0RHRvUHJpbWFyeTogQnVkZ2V0RHRvO1xyXG5cdC8qKiAqL1xyXG5cdGJ1ZGdldER0b1NlY3VuZGFyeTogQnVkZ2V0RHRvO1xyXG5cdC8qKiBBcyB0aGUgbGlzdCBvZiB0b2tlbiBhcmUgbG9hZGVkIGR5bmFtaWNhbGx5LCB0aGlzIG1hbmFnZSB0aGF0IG9ubHkgcmVwbGFjZSB0aGUgaW5mbyBvbmNlLiAqL1xyXG5cdGFscmVhZHlDYWxsUmVwbGFjZVRva2VuczogYm9vbGVhbjtcclxuXHJcblx0ZXZhbHVhdGlvbjogRXZhbHVhdGlvbjtcclxuXHJcblx0Y29uc3RydWN0b3IoXHJcblx0XHRwcml2YXRlIGN1cnJlbmN5UGlwZTogQ3VycmVuY3lQaXBlLFxyXG5cdFx0cHJpdmF0ZSB0b2tlblNlcnZpY2U6IFRva2VuU2VydmljZSxcclxuXHRcdHByaXZhdGUgdG9hc3RyU2VydmljZTogVG9hc3RyU2VydmljZSxcclxuXHRcdHByaXZhdGUgYXV0aGVudGljYXRpb25TZXJ2aWNlOiBBdXRoZW50aWNhdGlvblNlcnZpY2VcclxuXHQpIHt9XHJcblxyXG5cdG5nT25Jbml0KCkge1xyXG5cdFx0dGhpcy5sVG9rZW5DYWxjdWxhdGVkID0gbnVsbDtcclxuXHRcdHRoaXMubEZvcm1GaWVsZHNUb2tlbiA9IG51bGw7XHJcblx0XHR0aGlzLmJ1ZGdldER0b1ByaW1hcnkgPSBudWxsO1xyXG5cdFx0dGhpcy5idWRnZXREdG9TZWN1bmRhcnkgPSBudWxsO1xyXG5cdFx0dGhpcy5ldmFsdWF0aW9uID0gbnVsbDtcclxuXHR9XHJcblxyXG5cdC8qKiBJdCBtYW5hZ2VzIHRoZSBjaGFuZ2Ugb2YgdGhlIGV2ZXJ5IEBJbnB1dCAqL1xyXG5cdG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuXHRcdC8vIEV2ZXJ5IHRpbWUgdGhhdCBpbnB1dCB2YWx1ZXMgY2hhbmdlLCBjYWxsIG5ldyB2ZXJpZmljYXRpb24gY29kZVxyXG5cdFx0dGhpcy51bmlxdWVWZXJpZmljYXRpb25Db2RlID0gbnVsbDtcclxuXHRcdGNvbnN0IHRlbXBsYXRlOiBTaW1wbGVDaGFuZ2UgPSBjaGFuZ2VzLnRlbXBsYXRlO1xyXG5cdFx0Y29uc3QgZGF0YTogU2ltcGxlQ2hhbmdlID0gY2hhbmdlcy5kYXRhO1xyXG5cclxuXHRcdGlmICh0ZW1wbGF0ZSAmJiB0ZW1wbGF0ZS5jdXJyZW50VmFsdWUpIHtcclxuXHRcdFx0dGhpcy50ZW1wbGF0ZSA9IHRlbXBsYXRlLmN1cnJlbnRWYWx1ZTtcclxuXHRcdH1cclxuXHRcdGlmIChkYXRhICYmIGRhdGEuY3VycmVudFZhbHVlKSB7XHJcblx0XHRcdHRoaXMuZGF0YSA9IGRhdGEuY3VycmVudFZhbHVlO1xyXG5cdFx0XHR0aGlzLnByb21Db2RpZ28gPSB0aGlzLmRhdGEucHJvbUNvZGlnbztcclxuXHRcdH1cclxuXHRcdGlmICh0aGlzLmRhdGEpIHtcclxuXHRcdFx0dGhpcy5idWRnZXREdG9QcmltYXJ5ID0gdGhpcy5kYXRhLmJ1ZGdldER0b1ByaW1hcnkgPyB0aGlzLmRhdGEuYnVkZ2V0RHRvUHJpbWFyeSA6IG51bGw7XHJcblx0XHRcdHRoaXMuYnVkZ2V0RHRvU2VjdW5kYXJ5ID0gdGhpcy5kYXRhLmJ1ZGdldER0b1NlY3VuZGFyeVxyXG5cdFx0XHRcdD8gdGhpcy5kYXRhLmJ1ZGdldER0b1NlY3VuZGFyeVxyXG5cdFx0XHRcdDogbnVsbDtcclxuXHRcdFx0dGhpcy5ldmFsdWF0aW9uID0gdGhpcy5kYXRhLmV2YWx1YXRpb247XHJcblx0XHR9XHJcblx0XHRpZiAodGhpcy5kYXRhICYmIHRoaXMudGVtcGxhdGUgJiYgdGhpcy5wcm9tQ29kaWdvKSB7XHJcblx0XHRcdGNvbnN0IHNlbGYgPSB0aGlzO1xyXG5cdFx0XHRzZXRUaW1lb3V0KCgpID0+IHtcclxuXHRcdFx0XHRzZWxmLmluaXQoKTtcclxuXHRcdFx0fSwgMzAwKTtcclxuXHRcdH1cclxuXHR9XHJcblx0LyoqIEl0IGluaXRpYWxpemVzIHRoZSBwcm9jZXNzIG9mIHRyYW5zbGF0aW9uICovXHJcblx0cHJpdmF0ZSBpbml0KCkge1xyXG5cdFx0dGhpcy50cmFuc2xhdGVUb2tlbnModGhpcy50ZW1wbGF0ZSwgdGhpcy5kYXRhLmRhdGFGb3JtQnlGb3JtKTtcclxuXHR9XHJcblxyXG5cdHRyYW5zbGF0ZUNhdGVnb3J5KGNhdGVnb3J5TmFtZTogc3RyaW5nKTogc3RyaW5nIHtcclxuXHRcdGNvbnN0IGxhbmd1YWdlQnlEZWZhdWx0ID0gJ2VuJztcclxuXHRcdC8vIElmIGRvbid0IGZpbmQgdGhlIGxhbmcsIGdldCBpbiBlbi5cclxuXHRcdGxldCBjYXRlZ29yeU5hbWVCeURlZjogc3RyaW5nID0gY2F0ZWdvcnlOYW1lO1xyXG5cdFx0aWYgKGNhdGVnb3J5TmFtZSAmJiB0aGlzLmRhdGEuY2F0ZWdvcmllcyAmJiB0aGlzLmRhdGEuaWRpb21hKSB7XHJcblx0XHRcdC8vIElmIHRoZSBsb2NhbGUgc2VsZWN0IGlzIGVzLCB0aGlzIGlzIHRoZSBkYWZ1bHQgY2F0ZWdvcnkgbGFuZ3VhZ2VcclxuXHRcdFx0aWYgKHRoaXMuZGF0YS5pZGlvbWEubG9jYWxlID09PSAnZXMnKSB7XHJcblx0XHRcdFx0cmV0dXJuIGNhdGVnb3J5TmFtZTtcclxuXHRcdFx0fVxyXG5cdFx0XHRmb3IgKGNvbnN0IGNhdGVnb3J5IG9mIHRoaXMuZGF0YS5jYXRlZ29yaWVzKSB7XHJcblx0XHRcdFx0aWYgKGNhdGVnb3J5Lmxpc3RhUnVicm9JZGlvbWEgJiYgY2F0ZWdvcnkucnViUnVicm8gPT09IGNhdGVnb3J5TmFtZSkge1xyXG5cdFx0XHRcdFx0Zm9yIChjb25zdCBsYW5ndWFnZSBvZiBjYXRlZ29yeS5saXN0YVJ1YnJvSWRpb21hKSB7XHJcblx0XHRcdFx0XHRcdGlmIChsYW5ndWFnZS5ydWJpSWRpb21hID09PSB0aGlzLmRhdGEuaWRpb21hLmxvY2FsZSkge1xyXG5cdFx0XHRcdFx0XHRcdHJldHVybiBsYW5ndWFnZS5ydWJpVHJhZHVjY2lvbjtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRpZiAobGFuZ3VhZ2UucnViaUlkaW9tYSA9PT0gbGFuZ3VhZ2VCeURlZmF1bHQpIHtcclxuXHRcdFx0XHRcdFx0XHRjYXRlZ29yeU5hbWVCeURlZiA9IGxhbmd1YWdlLnJ1YmlUcmFkdWNjaW9uO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdHJldHVybiBjYXRlZ29yeU5hbWVCeURlZjtcclxuXHR9XHJcblxyXG5cdHRyYW5zbGF0ZVRva2VucyhodG1sOiBzdHJpbmcsIGxpc3REYXRhOiBhbnkpIHtcclxuXHRcdHRoaXMuYWxyZWFkeUNhbGxSZXBsYWNlVG9rZW5zID0gZmFsc2U7XHJcblx0XHRjb25zdCBsVG9rZW5zOiBhbnlbXSA9IHRoaXMuZ2V0TGlzdFRva2VucyhodG1sKTtcclxuXHRcdGlmICghbFRva2VucyB8fCBPYmplY3Qua2V5cyhsVG9rZW5zKS5sZW5ndGggPT09IDApIHtcclxuXHRcdFx0dGhpcy50ZW1wbGF0ZSA9IGh0bWw7XHJcblx0XHR9XHJcblx0XHR0aGlzLmNhbGxMaXN0VG9rZW5zKGxUb2tlbnMsIGh0bWwsIGxpc3REYXRhKTtcclxuXHR9XHJcblxyXG5cdGNhbGxMaXN0VG9rZW5zKGxUb2tlbnM6IGFueVtdLCBodG1sOiBzdHJpbmcsIGxpc3REYXRhOiBhbnkpIHtcclxuXHRcdGlmIChcclxuXHRcdFx0bFRva2Vuc1tUb2tlblNlcnZpY2UuVE9LRU5fTEFCRUxfQ0FMQ1VMQVRFRF0gJiZcclxuXHRcdFx0T2JqZWN0LmtleXMobFRva2Vuc1tUb2tlblNlcnZpY2UuVE9LRU5fTEFCRUxfQ0FMQ1VMQVRFRF0pLmxlbmd0aCA+IDBcclxuXHRcdCkge1xyXG5cdFx0XHRpZiAodGhpcy5sVG9rZW5DYWxjdWxhdGVkKSB7XHJcblx0XHRcdFx0dGhpcy52YWxpZGF0ZUxpc3RUb2tlbnMobFRva2VucywgaHRtbCwgbGlzdERhdGEpO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdHRoaXMudG9rZW5TZXJ2aWNlLmdldExpc3RCeVByb21Db2RpZ28odGhpcy5wcm9tQ29kaWdvKS5zdWJzY3JpYmUoXHJcblx0XHRcdFx0XHQobFRva2VuQ2FsY3VsYXRlZDogVG9rZW5bXSkgPT4ge1xyXG5cdFx0XHRcdFx0XHR0aGlzLmxUb2tlbkNhbGN1bGF0ZWQgPSBsVG9rZW5DYWxjdWxhdGVkO1xyXG5cdFx0XHRcdFx0XHR0aGlzLnZhbGlkYXRlTGlzdFRva2VucyhsVG9rZW5zLCBodG1sLCBsaXN0RGF0YSk7XHJcblx0XHRcdFx0XHR9LFxyXG5cdFx0XHRcdFx0KGVycm9yKSA9PiB7XHJcblx0XHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGNhbGxMaXN0VG9rZW5zIC1nZXRMaXN0QnlQcm9tQ29kaWdvJywgZXJyb3IpO1xyXG5cdFx0XHRcdFx0XHR0aGlzLnRvYXN0clNlcnZpY2UuZXJyb3IoJ0Vycm9yIGdlbmVyYW5kbyBjYXJ0YScpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdCk7XHJcblx0XHRcdH1cclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdHRoaXMudmFsaWRhdGVMaXN0VG9rZW5zKGxUb2tlbnMsIGh0bWwsIGxpc3REYXRhKTtcclxuXHRcdH1cclxuXHRcdGlmIChcclxuXHRcdFx0bFRva2Vuc1tUb2tlblNlcnZpY2UuVE9LRU5fTEFCRUxfRk9STV0gJiZcclxuXHRcdFx0T2JqZWN0LmtleXMobFRva2Vuc1tUb2tlblNlcnZpY2UuVE9LRU5fTEFCRUxfRk9STV0pLmxlbmd0aCA+IDBcclxuXHRcdCkge1xyXG5cdFx0XHRpZiAodGhpcy5sRm9ybUZpZWxkc1Rva2VuKSB7XHJcblx0XHRcdFx0dGhpcy52YWxpZGF0ZUxpc3RUb2tlbnMobFRva2VucywgaHRtbCwgbGlzdERhdGEpO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdHRoaXMudG9rZW5TZXJ2aWNlLmdldEZvcm1GaWVsZHNCeVByb21Db2RlKHRoaXMucHJvbUNvZGlnbykudGhlbihcclxuXHRcdFx0XHRcdChsRm9ybUZpZWxkc1Rva2VuOiBhbnlbXSkgPT4ge1xyXG5cdFx0XHRcdFx0XHR0aGlzLmxGb3JtRmllbGRzVG9rZW4gPSBsRm9ybUZpZWxkc1Rva2VuO1xyXG5cdFx0XHRcdFx0XHR0aGlzLnZhbGlkYXRlTGlzdFRva2VucyhsVG9rZW5zLCBodG1sLCBsaXN0RGF0YSk7XHJcblx0XHRcdFx0XHR9LFxyXG5cdFx0XHRcdFx0KGVycm9yKSA9PiB7XHJcblx0XHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGNhbGxMaXN0VG9rZW5zIC1nZXRGb3JtRmllbGRzQnlQcm9tQ29kZScsIGVycm9yKTtcclxuXHRcdFx0XHRcdFx0dGhpcy50b2FzdHJTZXJ2aWNlLmVycm9yKCdFcnJvciBnZW5lcmFuZG8gY2FydGEnKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHQpO1xyXG5cdFx0XHR9XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHR0aGlzLnZhbGlkYXRlTGlzdFRva2VucyhsVG9rZW5zLCBodG1sLCBsaXN0RGF0YSk7XHJcblx0XHR9XHJcblx0XHRpZiAoXHJcblx0XHRcdGxUb2tlbnNbVG9rZW5TZXJ2aWNlLlRPS0VOX0xBQkVMX1NUQVRJQ10gJiZcclxuXHRcdFx0T2JqZWN0LmtleXMobFRva2Vuc1tUb2tlblNlcnZpY2UuVE9LRU5fTEFCRUxfU1RBVElDXSkubGVuZ3RoID4gMFxyXG5cdFx0KSB7XHJcblx0XHRcdGlmICh0aGlzLnVuaXF1ZVZlcmlmaWNhdGlvbkNvZGUgIT09IG51bGwpIHtcclxuXHRcdFx0XHR0aGlzLnZhbGlkYXRlTGlzdFRva2VucyhsVG9rZW5zLCBodG1sLCBsaXN0RGF0YSk7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0Y29uc3QgdG9rZW5WZXJpZmljYXRpb25Db2RlOiBhbnlbXSA9IGxUb2tlbnNbVG9rZW5TZXJ2aWNlLlRPS0VOX0xBQkVMX1NUQVRJQ10uZmluZChcclxuXHRcdFx0XHRcdCh0b2tlbikgPT4ge1xyXG5cdFx0XHRcdFx0XHRjb25zdCBzdWJUb2tlbjogc3RyaW5nW10gPSB0b2tlbi5rZXlcclxuXHRcdFx0XHRcdFx0XHQucmVwbGFjZSgneycsICcnKVxyXG5cdFx0XHRcdFx0XHRcdC5yZXBsYWNlKCd9JywgJycpXHJcblx0XHRcdFx0XHRcdFx0LnNwbGl0KCdfJyk7XHJcblx0XHRcdFx0XHRcdHJldHVybiAoXHJcblx0XHRcdFx0XHRcdFx0c3ViVG9rZW5bMV0udG9Mb3dlckNhc2UoKSA9PVxyXG5cdFx0XHRcdFx0XHRcdFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5TX0tFWV9DT0RJR09fVkVSSUZJQ0FDSU9OLnRvTG93ZXJDYXNlKClcclxuXHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHQpO1xyXG5cdFx0XHRcdC8vIE9ubHkgaWYgdGhlIHN0YXRpYyB0b2tlbiBpcyB0aGUgdW5pcXVlIHZlcmlmaWNhdGlvbiBjb2RlXHJcblx0XHRcdFx0aWYgKHRva2VuVmVyaWZpY2F0aW9uQ29kZSAmJiBPYmplY3Qua2V5cyh0b2tlblZlcmlmaWNhdGlvbkNvZGUpLmxlbmd0aCA+IDApIHtcclxuXHRcdFx0XHRcdGxldCBwbGlVc3VhcmlvT2JqZWN0ID0gQXV0aGVudGljYXRpb25VdGlsLmdldFBsaVVzdWFyaW8oKTtcclxuXHRcdFx0XHRcdGlmICghcGxpVXN1YXJpb09iamVjdCkge1xyXG5cdFx0XHRcdFx0XHR0aGlzLnVuaXF1ZVZlcmlmaWNhdGlvbkNvZGUgPSAnJztcclxuXHRcdFx0XHRcdFx0Y29uc29sZS5lcnJvcihcclxuXHRcdFx0XHRcdFx0XHQnTm8gc2UgbG9ncm8gY29uc3VsdGFyIGVsIHVzdWFyaW8gcGFyYSBjb25zdWx0YXIgZWwgdG9rZW4nLFxyXG5cdFx0XHRcdFx0XHRcdHBsaVVzdWFyaW9PYmplY3RcclxuXHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdFx0dGhpcy52YWxpZGF0ZUxpc3RUb2tlbnMobFRva2VucywgaHRtbCwgbGlzdERhdGEpO1xyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0Y29uc3QgcGxpVXN1YXJpbzogUGxpVXN1YXJpbyA9IE9iamVjdC5hc3NpZ24oXHJcblx0XHRcdFx0XHRcdFx0bmV3IFBsaVVzdWFyaW8oKSxcclxuXHRcdFx0XHRcdFx0XHRKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHBsaVVzdWFyaW9PYmplY3QpKVxyXG5cdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0XHR0aGlzLmF1dGhlbnRpY2F0aW9uU2VydmljZS5nZXRUb2tlbkJ5TG9naW4ocGxpVXN1YXJpby51c3VMb2dpbikuc3Vic2NyaWJlKFxyXG5cdFx0XHRcdFx0XHRcdChzZXNpb246IHNlc2lvbikgPT4ge1xyXG5cdFx0XHRcdFx0XHRcdFx0Ly8gVHJ5IHRvIGdldCB0aGUgdW5pcXVlIHZlcmlmaWNhdGlvbiBjb2RlIHdpdGggdGhlIGRlZmF1bHQgdmFsdWUgb2Ygc2VzaW9uIGlmIGlzIG5vdCBhIHZhbGlkIHZhbHVlXHJcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBzZXNpb25WYWx1ZSA9IHNlc2lvbiA/IHNlc2lvbi5zZXNpb24gOiAnMSc7XHJcblx0XHRcdFx0XHRcdFx0XHR0aGlzLmdldFVuaXF1ZVZlcmlmaWNhdGlvbkNvZGUoXHJcblx0XHRcdFx0XHRcdFx0XHRcdHBsaVVzdWFyaW8udXN1TG9naW4sXHJcblx0XHRcdFx0XHRcdFx0XHRcdHNlc2lvblZhbHVlLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRsVG9rZW5zLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRodG1sLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRsaXN0RGF0YVxyXG5cdFx0XHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdFx0XHR9LFxyXG5cdFx0XHRcdFx0XHRcdChlcnJvcikgPT4ge1xyXG5cdFx0XHRcdFx0XHRcdFx0Y29uc29sZS5lcnJvcihcclxuXHRcdFx0XHRcdFx0XHRcdFx0J0Vycm9yIGNvbnN1bHRhbmRvIGVsIGxvZ2luIGVuIFBMSVMsIGdldFRva2VuQnlMb2dpbicsXHJcblx0XHRcdFx0XHRcdFx0XHRcdGVycm9yXHJcblx0XHRcdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0XHRcdFx0Ly8gVHJ5IHRvIGdldCB0aGUgdW5pcXVlIHZlcmlmaWNhdGlvbiBjb2RlIHdpdGggdGhlIGRlZmF1bHQgdmFsdWUgb2Ygc2VzaW9uXHJcblx0XHRcdFx0XHRcdFx0XHR0aGlzLmdldFVuaXF1ZVZlcmlmaWNhdGlvbkNvZGUoXHJcblx0XHRcdFx0XHRcdFx0XHRcdHBsaVVzdWFyaW8udXN1TG9naW4sXHJcblx0XHRcdFx0XHRcdFx0XHRcdCcxJyxcclxuXHRcdFx0XHRcdFx0XHRcdFx0bFRva2VucyxcclxuXHRcdFx0XHRcdFx0XHRcdFx0aHRtbCxcclxuXHRcdFx0XHRcdFx0XHRcdFx0bGlzdERhdGFcclxuXHRcdFx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRcdFx0XHQvL3RoaXMudG9hc3RyU2VydmljZS5lcnJvcihcIkVycm9yIGdlbmVyYW5kbyBjYXJ0YVwiKTtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdHRoaXMudW5pcXVlVmVyaWZpY2F0aW9uQ29kZSA9ICcnO1xyXG5cdFx0XHRcdFx0dGhpcy52YWxpZGF0ZUxpc3RUb2tlbnMobFRva2VucywgaHRtbCwgbGlzdERhdGEpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0dGhpcy52YWxpZGF0ZUxpc3RUb2tlbnMobFRva2VucywgaHRtbCwgbGlzdERhdGEpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogR2V0IHRoZSB1bmlxdWUgdmVyaWZpY2F0aW9uIGNvZGUgYW5kIGNhbGwgdmFsaWRhdGVMaXN0VG9rZW5zIG1ldGhvZFxyXG5cdCAqL1xyXG5cdGdldFVuaXF1ZVZlcmlmaWNhdGlvbkNvZGUoXHJcblx0XHR1c3VMb2dpbjogc3RyaW5nLFxyXG5cdFx0c2VzaW9uOiBzdHJpbmcsXHJcblx0XHRsVG9rZW5zOiBhbnlbXSxcclxuXHRcdGh0bWw6IHN0cmluZyxcclxuXHRcdGxpc3REYXRhOiBhbnlcclxuXHQpIHtcclxuXHRcdHRoaXMudG9rZW5TZXJ2aWNlLmdldFVuaXF1ZVZlcmlmaWNhdGlvbkNvZGUodXN1TG9naW4sIHNlc2lvbikuc3Vic2NyaWJlKFxyXG5cdFx0XHQodW5pcXVlQ29kZVZhbHVlOiBhbnkpID0+IHtcclxuXHRcdFx0XHRjb25zdCB1bmlxdWVDb2RlOiBzdHJpbmcgPSB1bmlxdWVDb2RlVmFsdWUuY29kaWdvVW5pY287XHJcblx0XHRcdFx0dGhpcy51bmlxdWVWZXJpZmljYXRpb25Db2RlID1cclxuXHRcdFx0XHRcdHVuaXF1ZUNvZGUuc3Vic3RyaW5nKDAsIDQpICsgJyAnICsgdW5pcXVlQ29kZS5zdWJzdHJpbmcoNCwgOCk7XHJcblx0XHRcdFx0dGhpcy52YWxpZGF0ZUxpc3RUb2tlbnMobFRva2VucywgaHRtbCwgbGlzdERhdGEpO1xyXG5cdFx0XHR9LFxyXG5cdFx0XHQoZXJyb3IpID0+IHtcclxuXHRcdFx0XHRjb25zb2xlLmVycm9yKCdFcnJvciBjYWxsTGlzdFRva2VucyAtZ2V0TGlzdEJ5UHJvbUNvZGlnbycsIGVycm9yKTtcclxuXHRcdFx0XHR0aGlzLnRvYXN0clNlcnZpY2UuZXJyb3IoJ0Vycm9yIGdlbmVyYW5kbyBjYXJ0YScpO1xyXG5cdFx0XHR9XHJcblx0XHQpO1xyXG5cdH1cclxuXHJcblx0dmFsaWRhdGVMaXN0VG9rZW5zKGxUb2tlbnM6IGFueVtdLCBodG1sOiBzdHJpbmcsIGxpc3REYXRhOiBhbnkpIHtcclxuXHRcdGxldCBmaW5pc2hMb2FkTGlzdEZvcm06IGJvb2xlYW4gPSBmYWxzZTtcclxuXHRcdGxldCBmaW5pc2hMb2FkTGlzdENhbGN1bGF0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHRcdGxldCBmaW5pc2hMb2FkTGlzdFN0YXRpYzogYm9vbGVhbiA9IGZhbHNlO1xyXG5cdFx0Y29uc3QgZmluaXNoTG9hZExpc3RCdWRnZXQ6IGJvb2xlYW4gPSB0cnVlO1xyXG5cdFx0aWYgKFxyXG5cdFx0XHRsVG9rZW5zW1Rva2VuU2VydmljZS5UT0tFTl9MQUJFTF9GT1JNXSAmJlxyXG5cdFx0XHRsVG9rZW5zW1Rva2VuU2VydmljZS5UT0tFTl9MQUJFTF9GT1JNXS5sZW5ndGggPiAwXHJcblx0XHQpIHtcclxuXHRcdFx0ZmluaXNoTG9hZExpc3RGb3JtID0gdGhpcy5sRm9ybUZpZWxkc1Rva2VuID8gdHJ1ZSA6IGZhbHNlO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0ZmluaXNoTG9hZExpc3RGb3JtID0gdHJ1ZTtcclxuXHRcdH1cclxuXHRcdGlmIChcclxuXHRcdFx0bFRva2Vuc1tUb2tlblNlcnZpY2UuVE9LRU5fTEFCRUxfQ0FMQ1VMQVRFRF0gJiZcclxuXHRcdFx0bFRva2Vuc1tUb2tlblNlcnZpY2UuVE9LRU5fTEFCRUxfQ0FMQ1VMQVRFRF0ubGVuZ3RoID4gMFxyXG5cdFx0KSB7XHJcblx0XHRcdGZpbmlzaExvYWRMaXN0Q2FsY3VsYXRlZCA9IHRoaXMubFRva2VuQ2FsY3VsYXRlZCA/IHRydWUgOiBmYWxzZTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdGZpbmlzaExvYWRMaXN0Q2FsY3VsYXRlZCA9IHRydWU7XHJcblx0XHR9XHJcblx0XHRpZiAoXHJcblx0XHRcdGxUb2tlbnNbVG9rZW5TZXJ2aWNlLlRPS0VOX0xBQkVMX1NUQVRJQ10gJiZcclxuXHRcdFx0bFRva2Vuc1tUb2tlblNlcnZpY2UuVE9LRU5fTEFCRUxfU1RBVElDXS5sZW5ndGggPiAwXHJcblx0XHQpIHtcclxuXHRcdFx0ZmluaXNoTG9hZExpc3RTdGF0aWMgPSB0aGlzLnVuaXF1ZVZlcmlmaWNhdGlvbkNvZGUgIT09IG51bGwgPyB0cnVlIDogZmFsc2U7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRmaW5pc2hMb2FkTGlzdFN0YXRpYyA9IHRydWU7XHJcblx0XHR9XHJcblx0XHRpZiAoXHJcblx0XHRcdGZpbmlzaExvYWRMaXN0Rm9ybSAmJlxyXG5cdFx0XHRmaW5pc2hMb2FkTGlzdEJ1ZGdldCAmJlxyXG5cdFx0XHRmaW5pc2hMb2FkTGlzdFN0YXRpYyAmJlxyXG5cdFx0XHRmaW5pc2hMb2FkTGlzdENhbGN1bGF0ZWQgJiZcclxuXHRcdFx0IXRoaXMuYWxyZWFkeUNhbGxSZXBsYWNlVG9rZW5zXHJcblx0XHQpIHtcclxuXHRcdFx0dGhpcy5hbHJlYWR5Q2FsbFJlcGxhY2VUb2tlbnMgPSB0cnVlO1xyXG5cdFx0XHR0aGlzLnJlcGxhY2VUb2tlbnNXaXRoRGF0YShsVG9rZW5zLCBodG1sLCBsaXN0RGF0YSk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRyZXBsYWNlVG9rZW5zV2l0aERhdGEobFRva2VuczogYW55W10sIGh0bWw6IHN0cmluZywgbGlzdERhdGE6IGFueSkge1xyXG5cdFx0Y29uc3QgbERhdGFPcmc6IGFueVtdID0gW107XHJcblx0XHRjb25zdCBsRm9ybUZpZWxkc1Rva2VuT3JnOiBhbnlbXSA9IFtdO1xyXG5cdFx0aWYgKFxyXG5cdFx0XHQobFRva2Vuc1tUb2tlblNlcnZpY2UuVE9LRU5fTEFCRUxfRk9STV0gfHxcclxuXHRcdFx0XHRsVG9rZW5zW1Rva2VuU2VydmljZS5UT0tFTl9MQUJFTF9DQUxDVUxBVEVEXSkgJiZcclxuXHRcdFx0bGlzdERhdGFcclxuXHRcdCkge1xyXG5cdFx0XHRmb3IgKGNvbnN0IGRhdGFGb3JtIGluIGxpc3REYXRhKSB7XHJcblx0XHRcdFx0bERhdGFPcmdbZGF0YUZvcm0udG9Mb3dlckNhc2UoKV0gPSBsaXN0RGF0YVtkYXRhRm9ybV07XHJcblx0XHRcdH1cclxuXHRcdFx0aWYgKHRoaXMubEZvcm1GaWVsZHNUb2tlbikge1xyXG5cdFx0XHRcdGZvciAoY29uc3QgZm9ybUZpZWxkVG9rZW4gb2YgdGhpcy5sRm9ybUZpZWxkc1Rva2VuKSB7XHJcblx0XHRcdFx0XHRmb3IgKGNvbnN0IHZhbHVlc0ZpZWxkIG9mIGZvcm1GaWVsZFRva2VuLnZhbHVlKSB7XHJcblx0XHRcdFx0XHRcdGNvbnN0IGtleVRva2VuOiBzdHJpbmcgPVxyXG5cdFx0XHRcdFx0XHRcdCckeycgKyBmb3JtRmllbGRUb2tlbi50aXRsZS5rZXkgKyAnXycgKyB2YWx1ZXNGaWVsZC5rZXkgKyAnfSc7XHJcblx0XHRcdFx0XHRcdGxGb3JtRmllbGRzVG9rZW5Pcmdba2V5VG9rZW5dID0gdmFsdWVzRmllbGQ7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRjb25zdCBsVG9rZW5zQ2FsY3VsYXRlZDogYW55W10gPSBbXTtcclxuXHRcdGlmIChsVG9rZW5zW1Rva2VuU2VydmljZS5UT0tFTl9MQUJFTF9DQUxDVUxBVEVEXSkge1xyXG5cdFx0XHRpZiAodGhpcy5sVG9rZW5DYWxjdWxhdGVkKSB7XHJcblx0XHRcdFx0Zm9yIChjb25zdCB0b2tlbkNhbCBvZiB0aGlzLmxUb2tlbkNhbGN1bGF0ZWQpIHtcclxuXHRcdFx0XHRcdGxUb2tlbnNDYWxjdWxhdGVkW1V0aWxTdHJpbmcucmVwbGFjZUFjY2VudFNwYWNlc090aGVycyh0b2tlbkNhbC5uYW1lKV0gPVxyXG5cdFx0XHRcdFx0XHR0b2tlbkNhbDtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdGxldCB0eXBlVG9rZW46IGFueTtcclxuXHRcdGNvbnN0IHRva2VuVHlwZVRyYW5zbGF0ZWQ6IGFueSA9IFtdO1xyXG5cdFx0Zm9yICh0eXBlVG9rZW4gaW4gbFRva2Vucykge1xyXG5cdFx0XHRpZiAoIWxUb2tlbnNbdHlwZVRva2VuXSkge1xyXG5cdFx0XHRcdGNvbnRpbnVlO1xyXG5cdFx0XHR9XHJcblx0XHRcdGNvbnN0IHRva2Vuc1R5cGU6IGFueVtdID0gbFRva2Vuc1t0eXBlVG9rZW5dO1xyXG5cdFx0XHR0b2tlblR5cGVUcmFuc2xhdGVkW3R5cGVUb2tlbl0gPSBbXTtcclxuXHRcdFx0Zm9yIChjb25zdCB0b2tlbiBvZiB0b2tlbnNUeXBlKSB7XHJcblx0XHRcdFx0bGV0IHRva2VuVHJhbnNsYXRlZCA9IG51bGw7XHJcblx0XHRcdFx0Y29uc3Qgc3ViVG9rZW46IHN0cmluZ1tdID0gdG9rZW4ua2V5LnJlcGxhY2UoJ3snLCAnJykucmVwbGFjZSgnfScsICcnKS5zcGxpdCgnXycpO1xyXG5cdFx0XHRcdHN3aXRjaCAodHlwZVRva2VuKSB7XHJcblx0XHRcdFx0XHRjYXNlIFRva2VuU2VydmljZS5UT0tFTl9MQUJFTF9GT1JNOiAvLyBGb3JtXHJcblx0XHRcdFx0XHRcdGxldCB2YWx1ZURhdGEgPSBudWxsO1xyXG5cdFx0XHRcdFx0XHRjb25zdCBkYXRhT3JnS2V5ID0gc3ViVG9rZW5bMV0udG9Mb3dlckNhc2UoKTtcclxuXHRcdFx0XHRcdFx0Ly8gUHV0IHRoaXMga2V5IGJlY2F1c2UgdGhlcmUgbm8gb3RoZXIgd2F5IHRvIGRpZmZlcmVudGlhdGUgdGhlIHNhbWUga2V5IGluIGRpZmZlcmVudHMgZm9ybXNcclxuXHRcdFx0XHRcdFx0Y29uc3QgZGF0YU9yZ0tleUJ5Rm9ybSA9XHJcblx0XHRcdFx0XHRcdFx0c3ViVG9rZW5bMF0uc3Vic3RyaW5nKDEpICsgJ18nICsgc3ViVG9rZW5bMV0udG9Mb3dlckNhc2UoKTtcclxuXHRcdFx0XHRcdFx0Y29uc3QgZGF0YU9yZ1ZhbHVlID0gbERhdGFPcmcuaGFzT3duUHJvcGVydHkoZGF0YU9yZ0tleSlcclxuXHRcdFx0XHRcdFx0XHQ/IGxEYXRhT3JnW2RhdGFPcmdLZXldXHJcblx0XHRcdFx0XHRcdFx0OiBsRGF0YU9yZy5oYXNPd25Qcm9wZXJ0eShkYXRhT3JnS2V5QnlGb3JtKVxyXG5cdFx0XHRcdFx0XHRcdD8gbERhdGFPcmdbZGF0YU9yZ0tleUJ5Rm9ybV1cclxuXHRcdFx0XHRcdFx0XHQ6IG51bGw7XHJcblx0XHRcdFx0XHRcdC8vIGNvbnN0IGRhdGFPcmdWYWx1ZUJ5Rm9ybSA9IGxEYXRhT3JnW2RhdGFPcmdLZXlCeUZvcm1dO1xyXG5cdFx0XHRcdFx0XHRpZiAoXHJcblx0XHRcdFx0XHRcdFx0c3ViVG9rZW4ubGVuZ3RoID09PSAzICYmXHJcblx0XHRcdFx0XHRcdFx0dHlwZW9mIGRhdGFPcmdWYWx1ZSAhPT0gJ3VuZGVmaW5lZCcgJiZcclxuXHRcdFx0XHRcdFx0XHRkYXRhT3JnVmFsdWUgIT09IG51bGwgJiZcclxuXHRcdFx0XHRcdFx0XHRkYXRhT3JnVmFsdWUuaGFzT3duUHJvcGVydHkoc3ViVG9rZW5bMl0pXHJcblx0XHRcdFx0XHRcdCkge1xyXG5cdFx0XHRcdFx0XHRcdHZhbHVlRGF0YSA9IGRhdGFPcmdWYWx1ZVtzdWJUb2tlblsyXV07XHJcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoXHJcblx0XHRcdFx0XHRcdFx0c3ViVG9rZW4ubGVuZ3RoID09PSAyICYmXHJcblx0XHRcdFx0XHRcdFx0dHlwZW9mIGRhdGFPcmdWYWx1ZSAhPT0gJ3VuZGVmaW5lZCcgJiZcclxuXHRcdFx0XHRcdFx0XHRkYXRhT3JnVmFsdWUgIT09IG51bGxcclxuXHRcdFx0XHRcdFx0KSB7XHJcblx0XHRcdFx0XHRcdFx0dmFsdWVEYXRhID0gZGF0YU9yZ1ZhbHVlO1xyXG5cdFx0XHRcdFx0XHRcdGlmIChsRm9ybUZpZWxkc1Rva2VuT3JnW3Rva2VuLmtleV0pIHtcclxuXHRcdFx0XHRcdFx0XHRcdHZhbHVlRGF0YSA9IHRoaXMudG9rZW5TZXJ2aWNlLmdldFZhbHVlRnJvbUZvcm1GaWVsZChcclxuXHRcdFx0XHRcdFx0XHRcdFx0bEZvcm1GaWVsZHNUb2tlbk9yZ1t0b2tlbi5rZXldLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHR2YWx1ZURhdGFcclxuXHRcdFx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdHZhbHVlRGF0YSA9IHZhbHVlRGF0YSA/IHZhbHVlRGF0YSA6ICcnO1xyXG5cdFx0XHRcdFx0XHR0b2tlblRyYW5zbGF0ZWQgPSB2YWx1ZURhdGE7XHJcblx0XHRcdFx0XHRcdGh0bWwgPSB0aGlzLnRva2VuU2VydmljZS5yZXBsYWNlVG9rZW4oaHRtbCwgdG9rZW4udmFsdWUsIHZhbHVlRGF0YSk7XHJcblx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdFx0Y2FzZSBUb2tlblNlcnZpY2UuVE9LRU5fTEFCRUxfQlVER0VUOiAvL0J1ZGdldFxyXG5cdFx0XHRcdFx0XHRjb25zdCBidWRnZXRSZXNvbHZlVG9rZW4gPSB0aGlzLnJlc29sdmVCdWRnZXRUb2tlbihodG1sLCB0b2tlbiwgc3ViVG9rZW4pO1xyXG5cdFx0XHRcdFx0XHRodG1sID0gYnVkZ2V0UmVzb2x2ZVRva2VuLmh0bWw7XHJcblx0XHRcdFx0XHRcdHRva2VuVHJhbnNsYXRlZCA9IGJ1ZGdldFJlc29sdmVUb2tlbi52YWx1ZTtcclxuXHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHRjYXNlIFRva2VuU2VydmljZS5UT0tFTl9MQUJFTF9UQVNLTDogLy9UYXNrXHJcblx0XHRcdFx0XHRcdGNvbnN0IHRhc2tSZXNvbHZlVG9rZW4gPSB0aGlzLnJlc29sdmVUYXNrb2tlbihodG1sLCB0b2tlbiwgc3ViVG9rZW4pO1xyXG5cdFx0XHRcdFx0XHRodG1sID0gdGFza1Jlc29sdmVUb2tlbi5odG1sO1xyXG5cdFx0XHRcdFx0XHR0b2tlblRyYW5zbGF0ZWQgPSB0YXNrUmVzb2x2ZVRva2VuLnZhbHVlO1xyXG5cdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdGNhc2UgVG9rZW5TZXJ2aWNlLlRPS0VOX0xBQkVMX1NUQVRJQzogLy9TdGF0aWNcclxuXHRcdFx0XHRcdFx0Y29uc3Qgc3RhdGljUmVzb2x2ZVRva2VuID0gdGhpcy5yZXNvbHZlU3RhdGljVG9rZW4oaHRtbCwgdG9rZW4sIHN1YlRva2VuKTtcclxuXHRcdFx0XHRcdFx0aHRtbCA9IHN0YXRpY1Jlc29sdmVUb2tlbi5odG1sO1xyXG5cdFx0XHRcdFx0XHR0b2tlblRyYW5zbGF0ZWQgPSBzdGF0aWNSZXNvbHZlVG9rZW4udmFsdWU7XHJcblx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdFx0Y2FzZSBUb2tlblNlcnZpY2UuVE9LRU5fTEFCRUxfQ0FMQ1VMQVRFRDogLy9DYWxjdWxhdGVkXHJcblx0XHRcdFx0XHRcdC8vIFJlcGxhY2VzIGRlIHRva2VucyBvZiB0aGUgZm9ybXVsYVxyXG5cdFx0XHRcdFx0XHRjb25zdCB0b2tlbk5hbWU6IHN0cmluZyA9IGxUb2tlbnNDYWxjdWxhdGVkW3N1YlRva2VuWzFdXS5uYW1lO1xyXG5cdFx0XHRcdFx0XHRsZXQgZm9ybXVsYTogc3RyaW5nID0gbFRva2Vuc0NhbGN1bGF0ZWRbc3ViVG9rZW5bMV1dLmZvcm11bGE7XHJcblx0XHRcdFx0XHRcdHRyeSB7XHJcblx0XHRcdFx0XHRcdFx0Ly9BUVVJXHJcblx0XHRcdFx0XHRcdFx0Zm9ybXVsYSA9IHRoaXMudG9rZW5TZXJ2aWNlLnJlcGxhY2VUb2tlbnNGcm9tTGlzdE9iamVjdChcclxuXHRcdFx0XHRcdFx0XHRcdHRva2VuTmFtZSxcclxuXHRcdFx0XHRcdFx0XHRcdGZvcm11bGEsXHJcblx0XHRcdFx0XHRcdFx0XHRsRGF0YU9yZ1xyXG5cdFx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XHJcblx0XHRcdFx0XHRcdFx0Zm9ybXVsYSA9IG51bGw7XHJcblx0XHRcdFx0XHRcdFx0Y29uc29sZS5lcnJvcihlcnJvci5lcnJvciA/IGVycm9yLmVycm9yIDogZXJyb3IpO1xyXG5cdFx0XHRcdFx0XHRcdHRoaXMudG9hc3RyU2VydmljZS53YXJuaW5nKGVycm9yLm1lc3NhZ2UsIGVycm9yLnRpdHRsZSk7XHJcblx0XHRcdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdC8vIFRyeSB0byBldmFsdWF0ZSB0aGUgZm9ybXVsYVxyXG5cdFx0XHRcdFx0XHRsZXQgcmVzdWx0OiBhbnkgPSBudWxsO1xyXG5cdFx0XHRcdFx0XHRpZiAoZm9ybXVsYSAhPT0gbnVsbCkge1xyXG5cdFx0XHRcdFx0XHRcdHRyeSB7XHJcblx0XHRcdFx0XHRcdFx0XHRyZXN1bHQgPSBmb3JtdWxhLnN0YXJ0c1dpdGgoJ2ZpbGU6Ly8nKVxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ/IFwiPGltZyB3aWR0aD0nMjUwcHgnIGhlaWdodD0nYXV0bycgc3JjPSdcIiArIGZvcm11bGEgKyBcIicvPlwiXHJcblx0XHRcdFx0XHRcdFx0XHRcdDogZXZhbChmb3JtdWxhKTtcclxuXHRcdFx0XHRcdFx0XHR9IGNhdGNoIChlKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yKFxyXG5cdFx0XHRcdFx0XHRcdFx0XHQnRXJyb3IgZXZhbHVhdGluZyB0aGUgZm9ybXVsYS4nLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRsVG9rZW5zQ2FsY3VsYXRlZCxcclxuXHRcdFx0XHRcdFx0XHRcdFx0c3ViVG9rZW4sXHJcblx0XHRcdFx0XHRcdFx0XHRcdGVcclxuXHRcdFx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRcdFx0XHR0aGlzLnRvYXN0clNlcnZpY2UuZXJyb3IoXHJcblx0XHRcdFx0XHRcdFx0XHRcdCdObyBzZSBsb2dybyBldmFsdWFyIGxhIGZvcm11bGFyIGRlbCB0b2tlbiAnICsgdG9rZW5OYW1lLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHQnRXJyb3IhJ1xyXG5cdFx0XHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0aWYgKHJlc3VsdCAhPT0gbnVsbCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0aHRtbCA9IHRoaXMudG9rZW5TZXJ2aWNlLnJlcGxhY2VUb2tlbihodG1sLCB0b2tlbi52YWx1ZSwgcmVzdWx0KTtcclxuXHRcdFx0XHRcdFx0XHRcdHRva2VuVHJhbnNsYXRlZCA9IHJlc3VsdDtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdHRva2VuVHlwZVRyYW5zbGF0ZWRbdHlwZVRva2VuXVt0b2tlbi5rZXldID0gdG9rZW5UcmFuc2xhdGVkO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHR0aGlzLm9uR2VuZXJhdGUuZW1pdCh7XHJcblx0XHRcdGh0bWw6IGh0bWwsXHJcblx0XHRcdHRva2VuVHlwZVRyYW5zbGF0ZWQ6IHRva2VuVHlwZVRyYW5zbGF0ZWRcclxuXHRcdH0pO1xyXG5cdFx0Ly8gfVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVHJ5IHRvIGZpbmQgdGhlIGJ1ZGdldCBpbmZvIHRvIHRyYW5zbGF0ZSB0aGUgdG9rZW4uXHJcblx0ICogQHBhcmFtIGh0bWxcclxuXHQgKiBAcGFyYW0gdG9rZW5cclxuXHQgKiBAcGFyYW0gc3ViVG9rZW5cclxuXHQgKi9cclxuXHRyZXNvbHZlQnVkZ2V0VG9rZW4oaHRtbDogc3RyaW5nLCB0b2tlbjogYW55LCBzdWJUb2tlbjogc3RyaW5nW10pOiBhbnkge1xyXG5cdFx0bGV0IHRwcmVzQ29kaWdvOiBudW1iZXIgPSBOdW1iZXIoc3ViVG9rZW5bMV0pO1xyXG5cdFx0bGV0IHRva2VuVmFsdWU6IHN0cmluZyA9IHN1YlRva2VuWzJdO1xyXG5cdFx0bGV0IGJ1ZGdldER0bzogQnVkZ2V0RHRvID0gbnVsbDtcclxuXHRcdGxldCBpZFRvdGFsQnVkZ2V0OiBzdHJpbmcgPSBudWxsO1xyXG5cdFx0aWYgKFxyXG5cdFx0XHR0aGlzLmJ1ZGdldER0b1ByaW1hcnkgJiZcclxuXHRcdFx0dGhpcy5idWRnZXREdG9QcmltYXJ5LmJ1ZGdldCAmJlxyXG5cdFx0XHR0cHJlc0NvZGlnbyA9PSBFVGlwb1ByZXN1cHVlc3RvLlBSSU1BUllcclxuXHRcdCkge1xyXG5cdFx0XHRidWRnZXREdG8gPSB0aGlzLmJ1ZGdldER0b1ByaW1hcnk7XHJcblx0XHRcdGlkVG90YWxCdWRnZXQgPSAncGxpLXRva2VuLXByaW5jaXBhbC1idWRnZXQtdG90YWwtc3VtbWFyeSc7XHJcblx0XHR9IGVsc2UgaWYgKFxyXG5cdFx0XHR0aGlzLmJ1ZGdldER0b1NlY3VuZGFyeSAmJlxyXG5cdFx0XHR0aGlzLmJ1ZGdldER0b1NlY3VuZGFyeS5idWRnZXQgJiZcclxuXHRcdFx0dHByZXNDb2RpZ28gPT0gRVRpcG9QcmVzdXB1ZXN0by5TRUNPTkRBUllcclxuXHRcdCkge1xyXG5cdFx0XHRidWRnZXREdG8gPSB0aGlzLmJ1ZGdldER0b1NlY3VuZGFyeTtcclxuXHRcdFx0aWRUb3RhbEJ1ZGdldCA9ICdwbGktdG9rZW4tc2VjdW5kYXJ5LWJ1ZGdldC10b3RhbC1zdW1tYXJ5JztcclxuXHRcdH1cclxuXHRcdGlmIChidWRnZXREdG8gPT09IG51bGwgfHwgIWJ1ZGdldER0by5idWRnZXQpIHtcclxuXHRcdFx0Y29uc29sZS5lcnJvcihcclxuXHRcdFx0XHQnTm8gc2UgbG9ncm8gZW5jb250cmFyIGVsIHByZXN1cHVlc3RvIGRlbCB0b2tlbi4nLFxyXG5cdFx0XHRcdHRva2VuLFxyXG5cdFx0XHRcdHRoaXMuYnVkZ2V0RHRvUHJpbWFyeSxcclxuXHRcdFx0XHR0aGlzLmJ1ZGdldER0b1NlY3VuZGFyeVxyXG5cdFx0XHQpO1xyXG5cdFx0XHRyZXR1cm4ge1xyXG5cdFx0XHRcdGh0bWw6IGh0bWwsXHJcblx0XHRcdFx0dmFsdWU6IG51bGxcclxuXHRcdFx0fTtcclxuXHRcdH1cclxuXHRcdGxldCB2YWx1ZURhdGEgPSBudWxsO1xyXG5cdFx0Y29uc3QgYXBwbGljYXRpb25Qcm9jZXNzID1cclxuXHRcdFx0dG9rZW5WYWx1ZSA9PSBUb2tlblNlcnZpY2UuQlVER0VUX1RPS0VOU19LRVlfQVBQTElDQVRJT05fUFJPQ0VTU19UT1RBTF9BTU9VTlQgfHxcclxuXHRcdFx0dG9rZW5WYWx1ZSA9PSBUb2tlblNlcnZpY2UuQlVER0VUX1RPS0VOU19LRVlfQVBQTElDQVRJT05fUFJPQ0VTU19UT1RBTF9PV05fRk9VTkRTIHx8XHJcblx0XHRcdHRva2VuVmFsdWUgPT0gVG9rZW5TZXJ2aWNlLkJVREdFVF9UT0tFTlNfS0VZX0FQUExJQ0FUSU9OX1BST0NFU1NfVE9UQUxfRklOQU5DSU5HO1xyXG5cdFx0Y29uc3QgbGVnYWxpemF0aW9uUHJvY2VzcyA9XHJcblx0XHRcdHRva2VuVmFsdWUgPT0gVG9rZW5TZXJ2aWNlLkJVREdFVF9UT0tFTlNfS0VZX0xFR0FMSVpBVElPTl9QUk9DRVNTX1RPVEFMX0FNT1VOVCB8fFxyXG5cdFx0XHR0b2tlblZhbHVlID09IFRva2VuU2VydmljZS5CVURHRVRfVE9LRU5TX0tFWV9MRUdBTElaQVRJT05fUFJPQ0VTU19UT1RBTF9PV05fRk9VTkRTIHx8XHJcblx0XHRcdHRva2VuVmFsdWUgPT0gVG9rZW5TZXJ2aWNlLkJVREdFVF9UT0tFTlNfS0VZX0xFR0FMSVpBVElPTl9QUk9DRVNTX1RPVEFMX0ZJTkFOQ0lORztcclxuXHJcblx0XHRpZiAodG9rZW5WYWx1ZSA9PSBUb2tlblNlcnZpY2UuQlVER0VUX1RPS0VOU19LRVlfVE9UQUxfQU1PVU5UKSB7XHJcblx0XHRcdHZhbHVlRGF0YSA9XHJcblx0XHRcdFx0YnVkZ2V0RHRvLmJ1ZGdldCAmJiBidWRnZXREdG8uYnVkZ2V0LnN1bW1hcnlcclxuXHRcdFx0XHRcdD8gdGhpcy5jdXJyZW5jeVBpcGUudHJhbnNmb3JtKFxyXG5cdFx0XHRcdFx0XHRcdGJ1ZGdldER0by5idWRnZXQuc3VtbWFyeS5idWRnZXRUb3RhbCxcclxuXHRcdFx0XHRcdFx0XHQnZGVmYXVsdCcsXHJcblx0XHRcdFx0XHRcdFx0JycsXHJcblx0XHRcdFx0XHRcdFx0JzEuMC0wJ1xyXG5cdFx0XHRcdFx0ICApXHJcblx0XHRcdFx0XHQ6IDA7XHJcblx0XHR9IGVsc2UgaWYgKHRva2VuVmFsdWUgPT0gVG9rZW5TZXJ2aWNlLkJVREdFVF9UT0tFTlNfS0VZX1JFU1VNRV9DQVRFR09SWV9ZRUFSKSB7XHJcblx0XHRcdC8vIHRoaXMuYWRkSW5mb1Rva2VuUmVzdW1lQ2F0ZWdvcnlZZWFyKHRwcmVzQ29kaWdvLCBpZFRvdGFsQnVkZ2V0LCBidWRnZXREdG8pO1xyXG5cdFx0XHR0aGlzLmFkZEluZm9Ub2tlblJlc3VtZUNhdGVnb3J5WWVhcih0cHJlc0NvZGlnbywgaWRUb3RhbEJ1ZGdldCwgYnVkZ2V0RHRvKTtcclxuXHRcdFx0Y29uc3QgcGxpVG9rZW5Ub3RhbEJ1ZGdldCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkVG90YWxCdWRnZXQpO1xyXG5cdFx0XHRpZiAocGxpVG9rZW5Ub3RhbEJ1ZGdldCkge1xyXG5cdFx0XHRcdHZhbHVlRGF0YSA9IHRoaXMucmVtb3ZlQ29tbWVudHNIdG1sKHBsaVRva2VuVG90YWxCdWRnZXQuaW5uZXJIVE1MKTtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRjb25zb2xlLmxvZygncGxpVG9rZW5Ub3RhbEJ1ZGdldCAtIE5VTEwnLCBwbGlUb2tlblRvdGFsQnVkZ2V0KTtcclxuXHRcdFx0fVxyXG5cdFx0fSBlbHNlIGlmICh0b2tlblZhbHVlID09IFRva2VuU2VydmljZS5CVURHRVRfVE9LRU5TX0tFWV9GRUNIQV9GSU5BTkNJTkdfU1RBUlQpIHtcclxuXHRcdFx0dmFsdWVEYXRhID1cclxuXHRcdFx0XHRidWRnZXREdG8uYnVkZ2V0ICYmIGJ1ZGdldER0by5idWRnZXQuZmluYW5jaW5nU3RhcnRcclxuXHRcdFx0XHRcdD8gYnVkZ2V0RHRvLmJ1ZGdldC5maW5hbmNpbmdTdGFydFxyXG5cdFx0XHRcdFx0OiAnJztcclxuXHJcblx0XHRcdGh0bWwgPSB0aGlzLnRva2VuU2VydmljZS5yZXBsYWNlVG9rZW4oXHJcblx0XHRcdFx0aHRtbCxcclxuXHRcdFx0XHR0b2tlbi52YWx1ZSxcclxuXHRcdFx0XHR2YWx1ZURhdGEsXHJcblx0XHRcdFx0dGhpcy5kYXRhPy5pZGlvbWE/LmxvY2FsZVxyXG5cdFx0XHQpO1xyXG5cdFx0fSBlbHNlIGlmICh0b2tlblZhbHVlID09IFRva2VuU2VydmljZS5CVURHRVRfVE9LRU5TX0tFWV9GRUNIQV9GSU5BTkNJTkdfRU5EKSB7XHJcblx0XHRcdHZhbHVlRGF0YSA9XHJcblx0XHRcdFx0YnVkZ2V0RHRvLmJ1ZGdldCAmJiBidWRnZXREdG8uYnVkZ2V0LmZpbmFuY2luZ0VuZFxyXG5cdFx0XHRcdFx0PyBidWRnZXREdG8uYnVkZ2V0LmZpbmFuY2luZ0VuZFxyXG5cdFx0XHRcdFx0OiAnJztcclxuXHJcblx0XHRcdGh0bWwgPSB0aGlzLnRva2VuU2VydmljZS5yZXBsYWNlVG9rZW4oXHJcblx0XHRcdFx0aHRtbCxcclxuXHRcdFx0XHR0b2tlbi52YWx1ZSxcclxuXHRcdFx0XHR2YWx1ZURhdGEsXHJcblx0XHRcdFx0dGhpcy5kYXRhPy5pZGlvbWE/LmxvY2FsZVxyXG5cdFx0XHQpO1xyXG5cdFx0fSBlbHNlIGlmICh0b2tlblZhbHVlID09IFRva2VuU2VydmljZS5CVURHRVRfVE9LRU5TX0RVUkFUSU9OX1NUVURJRVMpIHtcclxuXHRcdFx0dmFsdWVEYXRhID1cclxuXHRcdFx0XHRidWRnZXREdG8uYnVkZ2V0ICYmIGJ1ZGdldER0by5idWRnZXQuc3R1ZHlTdGFydCAmJiBidWRnZXREdG8uYnVkZ2V0LnN0dWR5RW5kXHJcblx0XHRcdFx0XHQ/IERhdGVVdGlsLmVsYXBzZWRNb250aHMoXHJcblx0XHRcdFx0XHRcdFx0YnVkZ2V0RHRvLmJ1ZGdldC5zdHVkeVN0YXJ0LFxyXG5cdFx0XHRcdFx0XHRcdGJ1ZGdldER0by5idWRnZXQuc3R1ZHlFbmRcclxuXHRcdFx0XHRcdCAgKSArIDFcclxuXHRcdFx0XHRcdDogJyc7XHJcblx0XHR9IGVsc2UgaWYgKHRva2VuVmFsdWUgPT0gVG9rZW5TZXJ2aWNlLkJVREdFVF9UT0tFTlNfRklOQU5DSU5HX0RVUkFUSU9OKSB7XHJcblx0XHRcdHZhbHVlRGF0YSA9XHJcblx0XHRcdFx0YnVkZ2V0RHRvLmJ1ZGdldCAmJiBidWRnZXREdG8uYnVkZ2V0LmZpbmFuY2luZ0VuZCAmJiBidWRnZXREdG8uYnVkZ2V0LmZpbmFuY2luZ1N0YXJ0XHJcblx0XHRcdFx0XHQ/IERhdGVVdGlsLmVsYXBzZWRNb250aHMoXHJcblx0XHRcdFx0XHRcdFx0YnVkZ2V0RHRvLmJ1ZGdldC5maW5hbmNpbmdTdGFydCxcclxuXHRcdFx0XHRcdFx0XHRidWRnZXREdG8uYnVkZ2V0LmZpbmFuY2luZ0VuZFxyXG5cdFx0XHRcdFx0ICApICsgMVxyXG5cdFx0XHRcdFx0OiAnJztcclxuXHRcdH0gZWxzZSBpZiAodG9rZW5WYWx1ZSA9PSBUb2tlblNlcnZpY2UuTEVHQUxJWkFUSU9OX09SX0FQUExJQ0FUSU9OX1RPVEFMX0ZJTkFOQ0lORykge1xyXG5cdFx0XHQvLyBKTVAgLSBNYW50aXMgNjY3NCAtIEFkZCBsb2dpYyB0byBsZWdhbGl6YXRpb24gb3IgYXBwbGljYXRpb24gdG90YWwgZmluYW5jaW5nXHJcblx0XHRcdGlmIChcclxuXHRcdFx0XHR0aGlzLmRhdGEgJiZcclxuXHRcdFx0XHR0aGlzLmRhdGEuZGF0YUZvcm1BcHBsaWNhdGlvbiAmJlxyXG5cdFx0XHRcdHRoaXMuZGF0YS5kYXRhRm9ybUFwcGxpY2F0aW9uLmJ1ZGdldFxyXG5cdFx0XHQpIHtcclxuXHRcdFx0XHRjb25zdCBidWRnZXQgPSB0aGlzLmRhdGEuZGF0YUZvcm1BcHBsaWNhdGlvbi5idWRnZXQ7XHJcblxyXG5cdFx0XHRcdGlmIChidWRnZXQubGVnYWxpemF0aW9uUHJvY2VzcyAmJiBidWRnZXQubGVnYWxpemF0aW9uUHJvY2Vzcy50b3RhbEZpbmFuY2luZykge1xyXG5cdFx0XHRcdFx0Y29uc3QgdG90YWxGaW5hbmNpbmcgPSBOdW1iZXIoYnVkZ2V0LmxlZ2FsaXphdGlvblByb2Nlc3MudG90YWxGaW5hbmNpbmcpO1xyXG5cdFx0XHRcdFx0dmFsdWVEYXRhID0gdG90YWxGaW5hbmNpbmcgKiAxLjAwMztcclxuXHRcdFx0XHR9IGVsc2UgaWYgKGJ1ZGdldC5hcHBsaWNhdGlvblByb2Nlc3MgJiYgYnVkZ2V0LmFwcGxpY2F0aW9uUHJvY2Vzcy50b3RhbEZpbmFuY2luZykge1xyXG5cdFx0XHRcdFx0dmFsdWVEYXRhID0gTnVtYmVyKGJ1ZGdldC5hcHBsaWNhdGlvblByb2Nlc3MudG90YWxGaW5hbmNpbmcpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fSBlbHNlIGlmIChcclxuXHRcdFx0KGFwcGxpY2F0aW9uUHJvY2VzcyB8fCBsZWdhbGl6YXRpb25Qcm9jZXNzKSAmJlxyXG5cdFx0XHR0aGlzLmRhdGEgJiZcclxuXHRcdFx0dGhpcy5kYXRhLmRhdGFGb3JtQXBwbGljYXRpb24gJiZcclxuXHRcdFx0dGhpcy5kYXRhLmRhdGFGb3JtQXBwbGljYXRpb24uYnVkZ2V0XHJcblx0XHQpIHtcclxuXHRcdFx0Ly8gR2V0IHRoZSB0b3RhbCBidWRnZXQgYW1vdW50IGRlcGVuZCBvZiB0aGUgcHJvY2Vzc1xyXG5cdFx0XHRjb25zdCBhcHBCdWRnZXRUb3RhbDogQXBwbGljYXRpb25CdWRnZXRUb3RhbCA9IGFwcGxpY2F0aW9uUHJvY2Vzc1xyXG5cdFx0XHRcdD8gdGhpcy5kYXRhLmRhdGFGb3JtQXBwbGljYXRpb24uYnVkZ2V0LmFwcGxpY2F0aW9uUHJvY2Vzc1xyXG5cdFx0XHRcdDogdGhpcy5kYXRhLmRhdGFGb3JtQXBwbGljYXRpb24uYnVkZ2V0LmxlZ2FsaXphdGlvblByb2Nlc3M7XHJcblx0XHRcdGlmIChhcHBCdWRnZXRUb3RhbCAhPSB1bmRlZmluZWQgJiYgYXBwQnVkZ2V0VG90YWwgIT0gbnVsbCkge1xyXG5cdFx0XHRcdC8vIG5vIG1hdHRlciB0aGUgcHJvY2VzcywgdGhlIGNsYXNzIGlzIHRoZSBzYW1lXHJcblx0XHRcdFx0c3dpdGNoICh0b2tlblZhbHVlKSB7XHJcblx0XHRcdFx0XHRjYXNlIFRva2VuU2VydmljZS5CVURHRVRfVE9LRU5TX0tFWV9BUFBMSUNBVElPTl9QUk9DRVNTX1RPVEFMX0FNT1VOVDpcclxuXHRcdFx0XHRcdGNhc2UgVG9rZW5TZXJ2aWNlLkJVREdFVF9UT0tFTlNfS0VZX0xFR0FMSVpBVElPTl9QUk9DRVNTX1RPVEFMX0FNT1VOVDpcclxuXHRcdFx0XHRcdFx0dmFsdWVEYXRhID0gYXBwQnVkZ2V0VG90YWwudG90YWxBbW91bnQ7XHJcblx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdFx0Y2FzZSBUb2tlblNlcnZpY2UuQlVER0VUX1RPS0VOU19LRVlfQVBQTElDQVRJT05fUFJPQ0VTU19UT1RBTF9PV05fRk9VTkRTOlxyXG5cdFx0XHRcdFx0Y2FzZSBUb2tlblNlcnZpY2UuQlVER0VUX1RPS0VOU19LRVlfTEVHQUxJWkFUSU9OX1BST0NFU1NfVE9UQUxfT1dOX0ZPVU5EUzpcclxuXHRcdFx0XHRcdFx0dmFsdWVEYXRhID0gYXBwQnVkZ2V0VG90YWwudG90YWxPd25GdW5kcztcclxuXHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHRjYXNlIFRva2VuU2VydmljZS5CVURHRVRfVE9LRU5TX0tFWV9BUFBMSUNBVElPTl9QUk9DRVNTX1RPVEFMX0ZJTkFOQ0lORzpcclxuXHRcdFx0XHRcdGNhc2UgVG9rZW5TZXJ2aWNlLkJVREdFVF9UT0tFTlNfS0VZX0xFR0FMSVpBVElPTl9QUk9DRVNTX1RPVEFMX0ZJTkFOQ0lORzpcclxuXHRcdFx0XHRcdFx0dmFsdWVEYXRhID0gYXBwQnVkZ2V0VG90YWwudG90YWxGaW5hbmNpbmc7XHJcblx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fSBlbHNlIGlmICh0b2tlblZhbHVlID09IFRva2VuU2VydmljZS5CVURHRVRfVE9LRU5TX0tFWV9JTlNVUkFOQ0VfQU1PVU5UKSB7XHJcblx0XHRcdGxldCB0b3RhbEZpbmFuY2luZyA9XHJcblx0XHRcdFx0dGhpcy5kYXRhLmRhdGFGb3JtQXBwbGljYXRpb24uYnVkZ2V0LmxlZ2FsaXphdGlvblByb2Nlc3MgJiZcclxuXHRcdFx0XHR0aGlzLmRhdGEuZGF0YUZvcm1BcHBsaWNhdGlvbi5idWRnZXQubGVnYWxpemF0aW9uUHJvY2Vzcy50b3RhbEZpbmFuY2luZztcclxuXHRcdFx0dG90YWxGaW5hbmNpbmcgPVxyXG5cdFx0XHRcdHRvdGFsRmluYW5jaW5nID09IHVuZGVmaW5lZCB8fCB0b3RhbEZpbmFuY2luZyA9PSBudWxsID8gMCA6IE51bWJlcih0b3RhbEZpbmFuY2luZyk7XHJcblx0XHRcdC8vIGxldCB0b3RhbEluc3VyYW5jZUFtb3VudCA9IHRoaXMuZGF0YS5kYXRhRm9ybUFwcGxpY2F0aW9uLnRvdGFsSW5zdXJhbmNlQW1vdW50O1xyXG5cdFx0XHQvLyB0b3RhbEluc3VyYW5jZUFtb3VudCA9XHJcblx0XHRcdC8vIFx0dG90YWxJbnN1cmFuY2VBbW91bnQgPT0gdW5kZWZpbmVkIHx8IHRvdGFsSW5zdXJhbmNlQW1vdW50ID09IG51bGxcclxuXHRcdFx0Ly8gXHRcdD8gMFxyXG5cdFx0XHQvLyBcdFx0OiBOdW1iZXIodG90YWxJbnN1cmFuY2VBbW91bnQpO1xyXG5cdFx0XHR2YWx1ZURhdGEgPSB0b3RhbEZpbmFuY2luZyAqIDEuMDAzO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0Ly8gV2hlbiB0aGUgdG9rZW4gY2FuJ3QgYmUgcmVzb2x2ZVxyXG5cdFx0XHRjb25zb2xlLmVycm9yKCdyZXNvbHZlQnVkZ2V0VG9rZW4gLU5vIHNlIGxvZ3JvIHJlc29sdmVyIGVsIHRva2VuIGRlIHRpcG8gcHJlc3VwdWVzdG8nKTtcclxuXHRcdH1cclxuXHRcdHZhbHVlRGF0YSA9IHZhbHVlRGF0YSA9PT0gbnVsbCA/ICcnIDogdmFsdWVEYXRhO1xyXG5cdFx0aHRtbCA9IHRoaXMudG9rZW5TZXJ2aWNlLnJlcGxhY2VUb2tlbihodG1sLCB0b2tlbi52YWx1ZSwgdmFsdWVEYXRhKTtcclxuXHRcdHJldHVybiB7XHJcblx0XHRcdGh0bWw6IGh0bWwsXHJcblx0XHRcdHZhbHVlOiB2YWx1ZURhdGFcclxuXHRcdH07XHJcblx0fVxyXG5cdHJlc29sdmVUYXNrb2tlbihodG1sOiBzdHJpbmcsIHRva2VuOiBhbnksIHN1YlRva2VuOiBzdHJpbmdbXSk6IGFueSB7XHJcblx0XHRsZXQgdmFsdWVUYXNrID0gbnVsbDtcclxuXHRcdGlmIChzdWJUb2tlbi5sZW5ndGggPiAyKSB7XHJcblx0XHRcdGxldCB0YXNrSWQgPSBOdW1iZXIoc3ViVG9rZW5bMl0pO1xyXG5cdFx0XHRsZXQgdGFzayA9IHRoaXMuZXZhbHVhdGlvbi50YXNrcy5maW5kKCh0KSA9PiB0LmlkVGFzayA9PSB0YXNrSWQpO1xyXG5cdFx0XHR2YWx1ZVRhc2sgPSB0YXNrLnJlc3VsdDtcclxuXHRcdH1cclxuXHRcdGh0bWwgPSB0aGlzLnRva2VuU2VydmljZS5yZXBsYWNlVG9rZW4oaHRtbCwgdG9rZW4udmFsdWUsIHZhbHVlVGFzayk7XHJcblx0XHRyZXR1cm4ge1xyXG5cdFx0XHRodG1sOiBodG1sLFxyXG5cdFx0XHR2YWx1ZTogdmFsdWVUYXNrXHJcblx0XHR9O1xyXG5cdH1cclxuXHJcblx0cmVzb2x2ZVN0YXRpY1Rva2VuKGh0bWw6IHN0cmluZywgdG9rZW46IGFueSwgc3ViVG9rZW46IHN0cmluZ1tdKTogYW55IHtcclxuXHRcdGxldCB2YWx1ZVJlcGxhY2U6IGFueSA9IG51bGw7XHJcblx0XHRpZiAoXHJcblx0XHRcdHN1YlRva2VuWzFdLnRvTG93ZXJDYXNlKCkgPT1cclxuXHRcdFx0VG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfS0VZX0NPRElHT19WRVJJRklDQUNJT04udG9Mb3dlckNhc2UoKVxyXG5cdFx0KSB7XHJcblx0XHRcdHZhbHVlUmVwbGFjZSA9IHRoaXMudW5pcXVlVmVyaWZpY2F0aW9uQ29kZTtcclxuXHRcdFx0aHRtbCA9IHRoaXMudG9rZW5TZXJ2aWNlLnJlcGxhY2VUb2tlbihodG1sLCB0b2tlbi52YWx1ZSwgdGhpcy51bmlxdWVWZXJpZmljYXRpb25Db2RlKTtcclxuXHRcdH0gZWxzZSBpZiAoXHJcblx0XHRcdHN1YlRva2VuWzFdLnRvTG93ZXJDYXNlKCkgPT1cclxuXHRcdFx0VG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfS0VZX0FfUVVJRU5fVkFfRElSSUdJRE8udG9Mb3dlckNhc2UoKVxyXG5cdFx0KSB7XHJcblx0XHRcdC8vIGlmICh0aGlzLmRhdGEuZGF0YURlc3RpbmF0aW9uKSB7XHJcblx0XHRcdGh0bWwgPSB0aGlzLnJlc29sdmVTdGF0aWNUb2tlbnNLZXlBUXVpZW5WYURpcmlnaWRvKGh0bWwsIHRva2VuLnZhbHVlKTtcclxuXHRcdFx0dmFsdWVSZXBsYWNlID0gJyc7XHJcblx0XHRcdC8vIH1cclxuXHRcdH0gZWxzZSBpZiAoXHJcblx0XHRcdHN1YlRva2VuWzFdLnRvTG93ZXJDYXNlKCkgPT0gVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfS0VZX0xFVFRFUl9TSUdOLnRvTG93ZXJDYXNlKClcclxuXHRcdCkge1xyXG5cdFx0XHRodG1sID0gdGhpcy5yZXNvbHZlU3RhdGljVG9rZW5zS2V5U2lnbihodG1sLCB0b2tlbi52YWx1ZSwgc3ViVG9rZW4pO1xyXG5cdFx0XHR2YWx1ZVJlcGxhY2UgPSAnJztcclxuXHRcdH0gZWxzZSBpZiAoXHJcblx0XHRcdHN1YlRva2VuWzFdLnRvTG93ZXJDYXNlKCkgPT1cclxuXHRcdFx0VG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfS0VZX1NBTFVET19DT01QTEVNRU5UQVJJTy50b0xvd2VyQ2FzZSgpXHJcblx0XHQpIHtcclxuXHRcdFx0Ly8gaWYgKHRoaXMuZGF0YS5kYXRhRGVzdGluYXRpb24pIHtcclxuXHRcdFx0aHRtbCA9IHRoaXMucmVzb2x2ZVN0YXRpY1Rva2Vuc0tleVNhbHVkb0NvbXBsZW1lbnRhcmlvKGh0bWwsIHRva2VuLnZhbHVlKTtcclxuXHRcdFx0dmFsdWVSZXBsYWNlID0gJyc7XHJcblx0XHRcdC8vIH1cclxuXHRcdH0gZWxzZSBpZiAoXHJcblx0XHRcdHN1YlRva2VuWzFdLnRvTG93ZXJDYXNlKCkgPT0gVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfS0VZX0ZFQ0hBX0FDVFVBTC50b0xvd2VyQ2FzZSgpXHJcblx0XHQpIHtcclxuXHRcdFx0dmFsdWVSZXBsYWNlID0gbmV3IERhdGUoKTtcclxuXHRcdFx0aHRtbCA9IHRoaXMudG9rZW5TZXJ2aWNlLnJlcGxhY2VUb2tlbihodG1sLCB0b2tlbi52YWx1ZSwgbmV3IERhdGUoKSk7XHJcblx0XHR9IGVsc2UgaWYgKFxyXG5cdFx0XHRzdWJUb2tlblsxXS50b0xvd2VyQ2FzZSgpID09IFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5TX0tFWV9QQVRST0NJTkFET1IudG9Mb3dlckNhc2UoKVxyXG5cdFx0KSB7XHJcblx0XHRcdGNvbnN0IHBhdE5vbWJyZSA9XHJcblx0XHRcdFx0dGhpcy5kYXRhLnBsaVByb21vY2lvbiAmJlxyXG5cdFx0XHRcdHRoaXMuZGF0YS5wbGlQcm9tb2Npb24ucGxpUHJvZ3JhbWEgJiZcclxuXHRcdFx0XHR0aGlzLmRhdGEucGxpUHJvbW9jaW9uLnBsaVByb2dyYW1hLnBsaVBhdHJvY2luYWRvclxyXG5cdFx0XHRcdFx0PyB0aGlzLmRhdGEucGxpUHJvbW9jaW9uLnBsaVByb2dyYW1hLnBsaVBhdHJvY2luYWRvci5wYXROb21icmVcclxuXHRcdFx0XHRcdDogJyc7XHJcblx0XHRcdHZhbHVlUmVwbGFjZSA9IHBhdE5vbWJyZTtcclxuXHRcdFx0aHRtbCA9IHRoaXMudG9rZW5TZXJ2aWNlLnJlcGxhY2VUb2tlbihodG1sLCB0b2tlbi52YWx1ZSwgcGF0Tm9tYnJlKTtcclxuXHRcdH0gZWxzZSBpZiAoXHJcblx0XHRcdHN1YlRva2VuWzFdLnRvTG93ZXJDYXNlKCkgPT0gVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfS0VZX1BST0dSQU1BLnRvTG93ZXJDYXNlKClcclxuXHRcdCkge1xyXG5cdFx0XHRjb25zdCBwcm9nTm9tYnJlID1cclxuXHRcdFx0XHR0aGlzLmRhdGEucGxpUHJvbW9jaW9uICYmIHRoaXMuZGF0YS5wbGlQcm9tb2Npb24ucGxpUHJvZ3JhbWFcclxuXHRcdFx0XHRcdD8gdGhpcy5kYXRhLnBsaVByb21vY2lvbi5wbGlQcm9ncmFtYS5wcm9nTm9tYnJlXHJcblx0XHRcdFx0XHQ6ICcnO1xyXG5cdFx0XHR2YWx1ZVJlcGxhY2UgPSBwcm9nTm9tYnJlO1xyXG5cdFx0XHRodG1sID0gdGhpcy50b2tlblNlcnZpY2UucmVwbGFjZVRva2VuKGh0bWwsIHRva2VuLnZhbHVlLCBwcm9nTm9tYnJlKTtcclxuXHRcdH0gZWxzZSBpZiAoXHJcblx0XHRcdHN1YlRva2VuWzFdLnRvTG93ZXJDYXNlKCkgPT0gVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfS0VZX1BST01PQ0lPTi50b0xvd2VyQ2FzZSgpXHJcblx0XHQpIHtcclxuXHRcdFx0Y29uc3QgcHJvbU5vbWJyZSA9IHRoaXMuZGF0YS5wbGlQcm9tb2Npb24gPyB0aGlzLmRhdGEucGxpUHJvbW9jaW9uLnByb21Ob21icmUgOiAnJztcclxuXHRcdFx0dmFsdWVSZXBsYWNlID0gcHJvbU5vbWJyZTtcclxuXHRcdFx0aHRtbCA9IHRoaXMudG9rZW5TZXJ2aWNlLnJlcGxhY2VUb2tlbihodG1sLCB0b2tlbi52YWx1ZSwgcHJvbU5vbWJyZSk7XHJcblx0XHR9IGVsc2UgaWYgKFxyXG5cdFx0XHRzdWJUb2tlblsxXS50b0xvd2VyQ2FzZSgpID09IFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5TX0tFWV9BTklPX1BST01PQ0lPTi50b0xvd2VyQ2FzZSgpXHJcblx0XHQpIHtcclxuXHRcdFx0Y29uc3QgYW5pb1Byb21vY2lvbiA9XHJcblx0XHRcdFx0dGhpcy5kYXRhLnBsaVByb21vY2lvbiAmJiB0aGlzLmRhdGEucGxpUHJvbW9jaW9uLnByb21BbmlvXHJcblx0XHRcdFx0XHQ/IHRoaXMuZGF0YS5wbGlQcm9tb2Npb24ucHJvbUFuaW9cclxuXHRcdFx0XHRcdDogMDtcclxuXHRcdFx0dmFsdWVSZXBsYWNlID0gYW5pb1Byb21vY2lvbjtcclxuXHRcdFx0aHRtbCA9IHRoaXMudG9rZW5TZXJ2aWNlLnJlcGxhY2VUb2tlbihodG1sLCB0b2tlbi52YWx1ZSwgYW5pb1Byb21vY2lvbik7XHJcblx0XHR9IGVsc2UgaWYgKFxyXG5cdFx0XHRzdWJUb2tlblsxXS50b0xvd2VyQ2FzZSgpID09XHJcblx0XHRcdFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5TX0tFWV9JU09fTU9ORURBX0JBU0UudG9Mb3dlckNhc2UoKVxyXG5cdFx0KSB7XHJcblx0XHRcdGNvbnN0IGJhc2VDdXJyZW5jeSA9XHJcblx0XHRcdFx0dGhpcy5kYXRhLmJ1ZGdldER0b1ByaW1hcnkgJiYgdGhpcy5kYXRhLmJ1ZGdldER0b1ByaW1hcnkuYnVkZ2V0XHJcblx0XHRcdFx0XHQ/IHRoaXMuZGF0YS5idWRnZXREdG9QcmltYXJ5LmJ1ZGdldC5iYXNlQ3VycmVuY3lcclxuXHRcdFx0XHRcdDogdGhpcy5kYXRhLmJ1ZGdldER0b1NlY3VuZGFyeSAmJiB0aGlzLmRhdGEuYnVkZ2V0RHRvU2VjdW5kYXJ5LmJ1ZGdldFxyXG5cdFx0XHRcdFx0PyB0aGlzLmRhdGEuYnVkZ2V0RHRvU2VjdW5kYXJ5LmJ1ZGdldC5iYXNlQ3VycmVuY3lcclxuXHRcdFx0XHRcdDogJyc7XHJcblx0XHRcdHZhbHVlUmVwbGFjZSA9IGJhc2VDdXJyZW5jeTtcclxuXHRcdFx0aHRtbCA9IHRoaXMudG9rZW5TZXJ2aWNlLnJlcGxhY2VUb2tlbihodG1sLCB0b2tlbi52YWx1ZSwgYmFzZUN1cnJlbmN5KTtcclxuXHRcdH0gZWxzZSBpZiAoXHJcblx0XHRcdHN1YlRva2VuWzFdLnRvTG93ZXJDYXNlKCkgPT0gVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfS0VZX1NUQVRVU19OQU1FLnRvTG93ZXJDYXNlKClcclxuXHRcdCkge1xyXG5cdFx0XHRjb25zdCBzdGF0dXNOYW1lID1cclxuXHRcdFx0XHR0aGlzLmRhdGEuZGF0YUZvcm1BcHBsaWNhdGlvbiAmJlxyXG5cdFx0XHRcdFV0aWxTdHJpbmcuaXNWYWxpZCh0aGlzLmRhdGEuZGF0YUZvcm1BcHBsaWNhdGlvbi5zdGF0ZU5hbWUpXHJcblx0XHRcdFx0XHQ/IHRoaXMuZGF0YS5kYXRhRm9ybUFwcGxpY2F0aW9uLnN0YXRlTmFtZVxyXG5cdFx0XHRcdFx0OiAnJztcclxuXHRcdFx0dmFsdWVSZXBsYWNlID0gc3RhdHVzTmFtZTtcclxuXHRcdFx0aHRtbCA9IHRoaXMudG9rZW5TZXJ2aWNlLnJlcGxhY2VUb2tlbihodG1sLCB0b2tlbi52YWx1ZSwgc3RhdHVzTmFtZSk7XHJcblx0XHR9IGVsc2UgaWYgKFxyXG5cdFx0XHRzdWJUb2tlblsxXS50b0xvd2VyQ2FzZSgpID09IFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5TX0tFWV9VU0VSX0lOSVRJQUxTLnRvTG93ZXJDYXNlKClcclxuXHRcdCkge1xyXG5cdFx0XHRjb25zdCBwbGlVc2VyOiBQbGlVc2VyID0gQXV0aGVudGljYXRpb25VdGlsLmdldFBsaVVzZXIoKTtcclxuXHRcdFx0dmFsdWVSZXBsYWNlID0gVXRpbFN0cmluZy5pbml0aWFsTGV0dGVycyhwbGlVc2VyLmZpcnN0bmFtZSArICcgJyArIHBsaVVzZXIubGFzdG5hbWUpO1xyXG5cdFx0XHRodG1sID0gdGhpcy50b2tlblNlcnZpY2UucmVwbGFjZVRva2VuKGh0bWwsIHRva2VuLnZhbHVlLCB2YWx1ZVJlcGxhY2UpO1xyXG5cdFx0fSBlbHNlIGlmIChcclxuXHRcdFx0c3ViVG9rZW5bMV0udG9Mb3dlckNhc2UoKSA9PVxyXG5cdFx0XHRUb2tlblNlcnZpY2UuU1RBVElDX1RPS0VOU19LRVlfTlVNQkVSX0FQUExJQ0FUSU9OLnRvTG93ZXJDYXNlKClcclxuXHRcdCkge1xyXG5cdFx0XHRjb25zdCBudW1iZXIgPVxyXG5cdFx0XHRcdHRoaXMuZGF0YS5kYXRhRm9ybUFwcGxpY2F0aW9uICYmIHRoaXMuZGF0YS5kYXRhRm9ybUFwcGxpY2F0aW9uLm51bWJlclxyXG5cdFx0XHRcdFx0PyB0aGlzLmRhdGEuZGF0YUZvcm1BcHBsaWNhdGlvbi5udW1iZXJcclxuXHRcdFx0XHRcdDogbnVsbDtcclxuXHRcdFx0dmFsdWVSZXBsYWNlID0gbnVtYmVyO1xyXG5cdFx0XHRodG1sID0gdGhpcy50b2tlblNlcnZpY2UucmVwbGFjZVRva2VuKGh0bWwsIHRva2VuLnZhbHVlLCBudW1iZXIpO1xyXG5cdFx0fSBlbHNlIGlmIChcclxuXHRcdFx0c3ViVG9rZW5bMV0udG9Mb3dlckNhc2UoKSA9PSBUb2tlblNlcnZpY2UuU1RBVElDX1RPS0VOU19DT01NSVRURUVfTkFNRS50b0xvd2VyQ2FzZSgpXHJcblx0XHQpIHtcclxuXHRcdFx0Y29uc3QgY29taXRlTm9tYnJlID1cclxuXHRcdFx0XHR0aGlzLmRhdGEuZGF0YUZvcm1CeUZvcm0gJiYgdGhpcy5kYXRhLmRhdGFGb3JtQnlGb3JtLmNvbWl0ZU5vbWJyZVxyXG5cdFx0XHRcdFx0PyB0aGlzLmRhdGEuZGF0YUZvcm1CeUZvcm0uY29taXRlTm9tYnJlXHJcblx0XHRcdFx0XHQ6IG51bGw7XHJcblx0XHRcdHZhbHVlUmVwbGFjZSA9IGNvbWl0ZU5vbWJyZTtcclxuXHRcdFx0aHRtbCA9IHRoaXMudG9rZW5TZXJ2aWNlLnJlcGxhY2VUb2tlbihodG1sLCB0b2tlbi52YWx1ZSwgY29taXRlTm9tYnJlKTtcclxuXHRcdH0gZWxzZSBpZiAoXHJcblx0XHRcdHN1YlRva2VuWzFdLnRvTG93ZXJDYXNlKCkgPT1cclxuXHRcdFx0VG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfQ09NTUlUVEVFX1NFR01FTlRBVElPTi50b0xvd2VyQ2FzZSgpXHJcblx0XHQpIHtcclxuXHRcdFx0Y29uc3QgY29taXRlU2VnbWVudGFjaW9uID1cclxuXHRcdFx0XHR0aGlzLmRhdGEuZGF0YUZvcm1CeUZvcm0gJiZcclxuXHRcdFx0XHR0aGlzLmRhdGEuZGF0YUZvcm1CeUZvcm1bVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfQ09NTUlUVEVFX1NFR01FTlRBVElPTl1cclxuXHRcdFx0XHRcdD8gdGhpcy5kYXRhLmRhdGFGb3JtQnlGb3JtW1Rva2VuU2VydmljZS5TVEFUSUNfVE9LRU5TX0NPTU1JVFRFRV9TRUdNRU5UQVRJT05dXHJcblx0XHRcdFx0XHQ6IG51bGw7XHJcblx0XHRcdHZhbHVlUmVwbGFjZSA9IGNvbWl0ZVNlZ21lbnRhY2lvbjtcclxuXHRcdFx0aHRtbCA9IHRoaXMudG9rZW5TZXJ2aWNlLnJlcGxhY2VUb2tlbihodG1sLCB0b2tlbi52YWx1ZSwgY29taXRlU2VnbWVudGFjaW9uKTtcclxuXHRcdH0gZWxzZSBpZiAoXHJcblx0XHRcdHN1YlRva2VuWzFdLnRvTG93ZXJDYXNlKCkgPT1cclxuXHRcdFx0VG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfQ09NTUlUVEVFX0FHR1JVUEFUSU9OLnRvTG93ZXJDYXNlKClcclxuXHRcdCkge1xyXG5cdFx0XHRjb25zdCBjb21pdGVBZ3J1cGFjaW9uID1cclxuXHRcdFx0XHR0aGlzLmRhdGEuZGF0YUZvcm1CeUZvcm0gJiZcclxuXHRcdFx0XHR0aGlzLmRhdGEuZGF0YUZvcm1CeUZvcm1bVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfQ09NTUlUVEVFX0FHR1JVUEFUSU9OXVxyXG5cdFx0XHRcdFx0PyB0aGlzLmRhdGEuZGF0YUZvcm1CeUZvcm1bVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfQ09NTUlUVEVFX0FHR1JVUEFUSU9OXVxyXG5cdFx0XHRcdFx0OiBudWxsO1xyXG5cdFx0XHR2YWx1ZVJlcGxhY2UgPSBjb21pdGVBZ3J1cGFjaW9uO1xyXG5cdFx0XHRodG1sID0gdGhpcy50b2tlblNlcnZpY2UucmVwbGFjZVRva2VuKGh0bWwsIHRva2VuLnZhbHVlLCBjb21pdGVBZ3J1cGFjaW9uKTtcclxuXHRcdH0gZWxzZSBpZiAoXHJcblx0XHRcdHN1YlRva2VuWzFdLnRvTG93ZXJDYXNlKCkgPT1cclxuXHRcdFx0VG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfQ09NTUlUVEVFX0NVVExJTkVfREFURS50b0xvd2VyQ2FzZSgpXHJcblx0XHQpIHtcclxuXHRcdFx0bGV0IGN1dExpbmVEYXRlID1cclxuXHRcdFx0XHR0aGlzLmRhdGEuZGF0YUZvcm1CeUZvcm0gJiZcclxuXHRcdFx0XHR0aGlzLmRhdGEuZGF0YUZvcm1CeUZvcm1bVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfQ09NTUlUVEVFX0NVVExJTkVfREFURV1cclxuXHRcdFx0XHRcdD8gdGhpcy5kYXRhLmRhdGFGb3JtQnlGb3JtW1Rva2VuU2VydmljZS5TVEFUSUNfVE9LRU5TX0NPTU1JVFRFRV9DVVRMSU5FX0RBVEVdXHJcblx0XHRcdFx0XHQ6IG51bGw7XHJcblx0XHRcdGlmIChjdXRMaW5lRGF0ZSBpbnN0YW5jZW9mIERhdGUpIHtcclxuXHRcdFx0XHRjdXRMaW5lRGF0ZSA9IGN1dExpbmVEYXRlLnRvU3RyaW5nKCk7XHJcblx0XHRcdH1cclxuXHRcdFx0dmFsdWVSZXBsYWNlID0gY3V0TGluZURhdGU7XHJcblx0XHRcdGh0bWwgPSB0aGlzLnRva2VuU2VydmljZS5yZXBsYWNlVG9rZW4oaHRtbCwgdG9rZW4udmFsdWUsIGN1dExpbmVEYXRlKTtcclxuXHRcdH0gZWxzZSBpZiAoXHJcblx0XHRcdHN1YlRva2VuWzFdLnRvTG93ZXJDYXNlKCkgPT0gVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfVE9UQUxfV0VJR0hURUQudG9Mb3dlckNhc2UoKVxyXG5cdFx0KSB7XHJcblx0XHRcdGxldCBiZXN0U2NlbmFyaW9WYWx1ZTogYW55ID0gJyc7XHJcblx0XHRcdGlmICh0aGlzLmV2YWx1YXRpb24gJiYgdGhpcy5ldmFsdWF0aW9uLnNjZW5hcmlvcykge1xyXG5cdFx0XHRcdGxldCBiZXN0U2NlbmFyaW8gPSB0aGlzLmV2YWx1YXRpb24uc2NlbmFyaW9zLmZpbHRlcigocykgPT4gcy5iZXN0KVswXTtcclxuXHRcdFx0XHRpZiAoYmVzdFNjZW5hcmlvKSB7XHJcblx0XHRcdFx0XHRiZXN0U2NlbmFyaW9WYWx1ZSA9IGJlc3RTY2VuYXJpby5yZXN1bHQ7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHRcdGh0bWwgPSB0aGlzLnRva2VuU2VydmljZS5yZXBsYWNlVG9rZW4oaHRtbCwgdG9rZW4udmFsdWUsIGJlc3RTY2VuYXJpb1ZhbHVlKTtcclxuXHRcdH0gZWxzZSBpZiAoXHJcblx0XHRcdHN1YlRva2VuWzFdLnRvTG93ZXJDYXNlKCkgPT1cclxuXHRcdFx0VG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfVVNFUl9UWVBFX0NSRURJVF9TVFVEWS50b0xvd2VyQ2FzZSgpXHJcblx0XHQpIHtcclxuXHRcdFx0Y29uc3QgdXNlclR5cGVDcmVkaXRTdHVkeSA9XHJcblx0XHRcdFx0dGhpcy5kYXRhLmRhdGFGb3JtQnlGb3JtICYmXHJcblx0XHRcdFx0dGhpcy5kYXRhLmRhdGFGb3JtQnlGb3JtW1Rva2VuU2VydmljZS5TVEFUSUNfVE9LRU5TX1VTRVJfVFlQRV9DUkVESVRfU1RVRFldXHJcblx0XHRcdFx0XHQ/IHRoaXMuZGF0YS5kYXRhRm9ybUJ5Rm9ybVtUb2tlblNlcnZpY2UuU1RBVElDX1RPS0VOU19VU0VSX1RZUEVfQ1JFRElUX1NUVURZXVxyXG5cdFx0XHRcdFx0OiBudWxsO1xyXG5cdFx0XHR2YWx1ZVJlcGxhY2UgPSB1c2VyVHlwZUNyZWRpdFN0dWR5O1xyXG5cdFx0XHRodG1sID0gdGhpcy50b2tlblNlcnZpY2UucmVwbGFjZVRva2VuKGh0bWwsIHRva2VuLnZhbHVlLCB1c2VyVHlwZUNyZWRpdFN0dWR5KTtcclxuXHRcdH0gZWxzZSBpZiAoXHJcblx0XHRcdHN1YlRva2VuWzFdLnRvTG93ZXJDYXNlKCkgPT0gVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfQkVOX0NPRElHTy50b0xvd2VyQ2FzZSgpXHJcblx0XHQpIHtcclxuXHRcdFx0dmFsdWVSZXBsYWNlID0gdGhpcy5kYXRhLmRhdGFGb3JtQXBwbGljYXRpb24uYmVuQ29kaWdvO1xyXG5cdFx0XHRodG1sID0gdGhpcy50b2tlblNlcnZpY2UucmVwbGFjZVRva2VuKFxyXG5cdFx0XHRcdGh0bWwsXHJcblx0XHRcdFx0dG9rZW4udmFsdWUsXHJcblx0XHRcdFx0dGhpcy5kYXRhLmRhdGFGb3JtQXBwbGljYXRpb24uYmVuQ29kaWdvXHJcblx0XHRcdCk7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHQvLyBEb24ndCBmaW5kIHRoZSB0b2tlblxyXG5cdFx0XHRjb25zb2xlLmVycm9yKCdObyBzZSBlbmNvbnRybyBlbCB0b2tlbicsIHRva2VuKTtcclxuXHRcdFx0aHRtbCA9IHRoaXMudG9rZW5TZXJ2aWNlLnJlcGxhY2VUb2tlbihodG1sLCB0b2tlbi52YWx1ZSwgJycpO1xyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIHtcclxuXHRcdFx0aHRtbDogaHRtbCxcclxuXHRcdFx0dmFsdWU6IHZhbHVlUmVwbGFjZVxyXG5cdFx0fTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEZpbmQgYWxsIHRoZSB0b2tlbnMgcHJlc2VudCBpbiB0aGUgSFRNTCB0ZXh0LiBPcmdhbml6ZSB0aGlzIHRva2VucyBpbiBmb3VyIGNhdGVnb3JpZXMuXHJcblx0ICogQHBhcmFtIGh0bWwgVGV4dCBvZiB0aGUgaHRtbFxyXG5cdCAqL1xyXG5cdGdldExpc3RUb2tlbnMoaHRtbDogc3RyaW5nKTogYW55W10ge1xyXG5cdFx0Ly8gbGV0IHN0cmluZ3M6IHN0cmluZ1tdID0gaHRtbC5zcGxpdChcIiBcIik7XHJcblx0XHRsZXQgdG9rZW5zOiBhbnlbXSA9IHRoaXMudG9rZW5TZXJ2aWNlLmdldExpc3RUb2tlbnNCeVN0cmluZyhodG1sKTtcclxuXHRcdGxldCB0b2tlbnNDYXRlZ29yeTogYW55W10gPSBbXTtcclxuXHRcdGZvciAobGV0IGluZm9Ub2tlbiBvZiB0b2tlbnMpIHtcclxuXHRcdFx0aWYgKGluZm9Ub2tlbikge1xyXG5cdFx0XHRcdGNvbnN0IGtleVR5cGU6IG51bWJlciA9IFRva2VuU2VydmljZS5nZXRLZXlUeXBlKFxyXG5cdFx0XHRcdFx0aW5mb1Rva2VuLmtleS5yZXBsYWNlKCd7JywgJycpLnJlcGxhY2UoJ30nLCAnJylcclxuXHRcdFx0XHQpO1xyXG5cdFx0XHRcdGlmIChrZXlUeXBlKSB7XHJcblx0XHRcdFx0XHRzd2l0Y2ggKGtleVR5cGUpIHtcclxuXHRcdFx0XHRcdFx0Y2FzZSAxOiAvLyBGb3JtXHJcblx0XHRcdFx0XHRcdFx0aWYgKCF0b2tlbnNDYXRlZ29yeVtUb2tlblNlcnZpY2UuVE9LRU5fTEFCRUxfRk9STV0pIHtcclxuXHRcdFx0XHRcdFx0XHRcdHRva2Vuc0NhdGVnb3J5W1Rva2VuU2VydmljZS5UT0tFTl9MQUJFTF9GT1JNXSA9IFtdO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHR0b2tlbnNDYXRlZ29yeVtUb2tlblNlcnZpY2UuVE9LRU5fTEFCRUxfRk9STV0ucHVzaChpbmZvVG9rZW4pO1xyXG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdFx0XHRjYXNlIDI6IC8vQnVkZ2V0XHJcblx0XHRcdFx0XHRcdFx0aWYgKCF0b2tlbnNDYXRlZ29yeVtUb2tlblNlcnZpY2UuVE9LRU5fTEFCRUxfQlVER0VUXSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0dG9rZW5zQ2F0ZWdvcnlbVG9rZW5TZXJ2aWNlLlRPS0VOX0xBQkVMX0JVREdFVF0gPSBbXTtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0dG9rZW5zQ2F0ZWdvcnlbVG9rZW5TZXJ2aWNlLlRPS0VOX0xBQkVMX0JVREdFVF0ucHVzaChpbmZvVG9rZW4pO1xyXG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdFx0XHRjYXNlIDM6IC8vU3RhdGljXHJcblx0XHRcdFx0XHRcdFx0aWYgKCF0b2tlbnNDYXRlZ29yeVtUb2tlblNlcnZpY2UuVE9LRU5fTEFCRUxfU1RBVElDXSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0dG9rZW5zQ2F0ZWdvcnlbVG9rZW5TZXJ2aWNlLlRPS0VOX0xBQkVMX1NUQVRJQ10gPSBbXTtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0dG9rZW5zQ2F0ZWdvcnlbVG9rZW5TZXJ2aWNlLlRPS0VOX0xBQkVMX1NUQVRJQ10ucHVzaChpbmZvVG9rZW4pO1xyXG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdFx0XHRjYXNlIDQ6IC8vQ2FsY3VsYXRlZFxyXG5cdFx0XHRcdFx0XHRcdGlmICghdG9rZW5zQ2F0ZWdvcnlbVG9rZW5TZXJ2aWNlLlRPS0VOX0xBQkVMX0NBTENVTEFURURdKSB7XHJcblx0XHRcdFx0XHRcdFx0XHR0b2tlbnNDYXRlZ29yeVtUb2tlblNlcnZpY2UuVE9LRU5fTEFCRUxfQ0FMQ1VMQVRFRF0gPSBbXTtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0dG9rZW5zQ2F0ZWdvcnlbVG9rZW5TZXJ2aWNlLlRPS0VOX0xBQkVMX0NBTENVTEFURURdLnB1c2goaW5mb1Rva2VuKTtcclxuXHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdFx0Y2FzZSA1OiAvL1Rhc2tcclxuXHRcdFx0XHRcdFx0XHRpZiAoIXRva2Vuc0NhdGVnb3J5W1Rva2VuU2VydmljZS5UT0tFTl9MQUJFTF9UQVNLTF0pIHtcclxuXHRcdFx0XHRcdFx0XHRcdHRva2Vuc0NhdGVnb3J5W1Rva2VuU2VydmljZS5UT0tFTl9MQUJFTF9UQVNLTF0gPSBbXTtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0dG9rZW5zQ2F0ZWdvcnlbVG9rZW5TZXJ2aWNlLlRPS0VOX0xBQkVMX1RBU0tMXS5wdXNoKGluZm9Ub2tlbik7XHJcblx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gdG9rZW5zQ2F0ZWdvcnk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBJdCByZXNvbHZlcyB0aGUgc3RhdGljIHRva2VuIGRlc3RpbmF0aW9uXHJcblx0ICogQHBhcmFtIHN0cmluZ1RleHRcclxuXHQgKiBAcGFyYW0gdG9rZW5cclxuXHQgKiBAcGFyYW0gZGF0YVZhbHVlXHJcblx0ICovXHJcblx0cmVzb2x2ZVN0YXRpY1Rva2Vuc0tleUFRdWllblZhRGlyaWdpZG8oc3RyaW5nVGV4dDogc3RyaW5nLCB0b2tlblZhbHVlOiBhbnkpOiBzdHJpbmcge1xyXG5cdFx0Ly8gaWYgKHRoaXMuZGF0YS5kYXRhRGVzdGluYXRpb24pIHtcclxuXHRcdHRoaXMuZW5hYmxlRGVzdGluYXRpb24gPSB0cnVlO1xyXG5cdFx0dGhpcy5hZGRJbmZvVG9rZW5EZXN0aW5hdGlvbigpO1xyXG5cdFx0Y29uc3QgcGxpVG9rZW5EZXN0aW5hdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwbGktdG9rZW4tZGVzdGluYXRpb24nKTtcclxuXHRcdGxldCBodG1sID0gJyc7XHJcblx0XHRpZiAocGxpVG9rZW5EZXN0aW5hdGlvbiAmJiBwbGlUb2tlbkRlc3RpbmF0aW9uLmlubmVySFRNTC5sZW5ndGggPiAwKSB7XHJcblx0XHRcdGh0bWwgPSB0aGlzLnJlbW92ZUNvbW1lbnRzSHRtbChwbGlUb2tlbkRlc3RpbmF0aW9uLmlubmVySFRNTCk7XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gdGhpcy50b2tlblNlcnZpY2UucmVwbGFjZVRva2VuKHN0cmluZ1RleHQsIHRva2VuVmFsdWUsIGh0bWwpO1xyXG5cdFx0Ly8gfVxyXG5cdFx0Ly8gcmV0dXJuIHN0cmluZ1RleHQ7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKlxyXG5cdCAqL1xyXG5cdGFkZEluZm9Ub2tlbkRlc3RpbmF0aW9uKCkge1xyXG5cdFx0bGV0IHBsaVRva2VuRGVzdGluYXRpb24gPSAkKCcjcGxpLXRva2VuLWRlc3RpbmF0aW9uJyk7XHJcblx0XHRwbGlUb2tlbkRlc3RpbmF0aW9uLmVtcHR5KCk7XHJcblx0XHRpZiAodGhpcy5kYXRhLmRhdGFEZXN0aW5hdGlvbikge1xyXG5cdFx0XHRsZXQgZGVzdGluYXRpb25JbmZvID0gJCgnPGRpdj48L2Rpdj4nKTtcclxuXHRcdFx0aWYgKHRoaXMuZGF0YS5kYXRhRGVzdGluYXRpb24udGV4dCkge1xyXG5cdFx0XHRcdGxldCB2YWx1ZUluZm8gPSAkKCc8ZGl2PjwvZGl2PicpLnRleHQodGhpcy5kYXRhLmRhdGFEZXN0aW5hdGlvbi50ZXh0KTtcclxuXHRcdFx0XHRkZXN0aW5hdGlvbkluZm8uYXBwZW5kKHZhbHVlSW5mbyk7XHJcblx0XHRcdH1cclxuXHRcdFx0aWYgKHRoaXMuZGF0YS5kYXRhRGVzdGluYXRpb24udGl0bGUpIHtcclxuXHRcdFx0XHRsZXQgdmFsdWVJbmZvID0gJCgnPGRpdj48L2Rpdj4nKS50ZXh0KHRoaXMuZGF0YS5kYXRhRGVzdGluYXRpb24udGl0bGUpO1xyXG5cdFx0XHRcdGRlc3RpbmF0aW9uSW5mby5hcHBlbmQodmFsdWVJbmZvKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRpZiAodGhpcy5kYXRhLmRhdGFEZXN0aW5hdGlvbi5uYW1lIHx8IHRoaXMuZGF0YS5kYXRhRGVzdGluYXRpb24ubGFzdE5hbWUpIHtcclxuXHRcdFx0XHRsZXQgdmFsdWVJbmZvTmFtZSA9IHRoaXMuZGF0YS5kYXRhRGVzdGluYXRpb24ubmFtZVxyXG5cdFx0XHRcdFx0PyB0aGlzLmRhdGEuZGF0YURlc3RpbmF0aW9uLm5hbWUgKyAnICdcclxuXHRcdFx0XHRcdDogJyc7XHJcblx0XHRcdFx0dmFsdWVJbmZvTmFtZSArPSB0aGlzLmRhdGEuZGF0YURlc3RpbmF0aW9uLmxhc3ROYW1lXHJcblx0XHRcdFx0XHQ/IHRoaXMuZGF0YS5kYXRhRGVzdGluYXRpb24ubGFzdE5hbWVcclxuXHRcdFx0XHRcdDogJyc7XHJcblx0XHRcdFx0bGV0IHZhbHVlSW5mbyA9ICQoJzxkaXY+PC9kaXY+JykuYXBwZW5kKCc8c3Ryb25nPicgKyB2YWx1ZUluZm9OYW1lICsgJzwvc3Ryb25nPicpO1xyXG5cdFx0XHRcdGRlc3RpbmF0aW9uSW5mby5hcHBlbmQodmFsdWVJbmZvKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRpZiAodGhpcy5kYXRhLmRhdGFEZXN0aW5hdGlvbi5jYXJnbykge1xyXG5cdFx0XHRcdGxldCB2YWx1ZUluZm8gPSAkKCc8ZGl2PjwvZGl2PicpLnRleHQodGhpcy5kYXRhLmRhdGFEZXN0aW5hdGlvbi5jYXJnbyk7XHJcblx0XHRcdFx0ZGVzdGluYXRpb25JbmZvLmFwcGVuZCh2YWx1ZUluZm8pO1xyXG5cdFx0XHR9XHJcblx0XHRcdGlmICh0aGlzLmRhdGEuZGF0YURlc3RpbmF0aW9uLm9jY3VwYXRpb24pIHtcclxuXHRcdFx0XHRsZXQgdmFsdWVJbmZvID0gJCgnPGRpdj48L2Rpdj4nKS50ZXh0KHRoaXMuZGF0YS5kYXRhRGVzdGluYXRpb24ub2NjdXBhdGlvbik7XHJcblx0XHRcdFx0ZGVzdGluYXRpb25JbmZvLmFwcGVuZCh2YWx1ZUluZm8pO1xyXG5cdFx0XHR9XHJcblx0XHRcdGlmICh0aGlzLmRhdGEuZGF0YURlc3RpbmF0aW9uLmNvbXBhbnkpIHtcclxuXHRcdFx0XHRsZXQgdmFsdWVJbmZvID0gJCgnPGRpdj48L2Rpdj4nKS50ZXh0KHRoaXMuZGF0YS5kYXRhRGVzdGluYXRpb24uY29tcGFueSk7XHJcblx0XHRcdFx0ZGVzdGluYXRpb25JbmZvLmFwcGVuZCh2YWx1ZUluZm8pO1xyXG5cdFx0XHR9XHJcblx0XHRcdGlmICh0aGlzLmRhdGEuZGF0YURlc3RpbmF0aW9uLmFkZHJlc3MgfHwgdGhpcy5kYXRhLmRhdGFEZXN0aW5hdGlvbi5hZGRyZXNzRGV0YWlscykge1xyXG5cdFx0XHRcdGxldCB2YWx1ZUluZm9OYW1lID0gdGhpcy5kYXRhLmRhdGFEZXN0aW5hdGlvbi5hZGRyZXNzXHJcblx0XHRcdFx0XHQ/IHRoaXMuZGF0YS5kYXRhRGVzdGluYXRpb24uYWRkcmVzcyArICcgJ1xyXG5cdFx0XHRcdFx0OiAnJztcclxuXHRcdFx0XHR2YWx1ZUluZm9OYW1lICs9IHRoaXMuZGF0YS5kYXRhRGVzdGluYXRpb24uYWRkcmVzc0RldGFpbHNcclxuXHRcdFx0XHRcdD8gdGhpcy5kYXRhLmRhdGFEZXN0aW5hdGlvbi5hZGRyZXNzRGV0YWlsc1xyXG5cdFx0XHRcdFx0OiAnJztcclxuXHRcdFx0XHRsZXQgdmFsdWVJbmZvID0gJCgnPGRpdj48L2Rpdj4nKS50ZXh0KHZhbHVlSW5mb05hbWUpO1xyXG5cdFx0XHRcdGRlc3RpbmF0aW9uSW5mby5hcHBlbmQodmFsdWVJbmZvKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRpZiAodGhpcy5kYXRhLmRhdGFEZXN0aW5hdGlvbi5jaXR5IHx8IHRoaXMuZGF0YS5kYXRhRGVzdGluYXRpb24uY291bnRyeSkge1xyXG5cdFx0XHRcdGxldCB2YWx1ZUluZm9OYW1lID0gdGhpcy5kYXRhLmRhdGFEZXN0aW5hdGlvbi5jaXR5XHJcblx0XHRcdFx0XHQ/IHRoaXMuZGF0YS5kYXRhRGVzdGluYXRpb24uY2l0eVxyXG5cdFx0XHRcdFx0OiAnJztcclxuXHRcdFx0XHR2YWx1ZUluZm9OYW1lICs9XHJcblx0XHRcdFx0XHR0aGlzLmRhdGEuZGF0YURlc3RpbmF0aW9uLmNpdHkgJiYgdGhpcy5kYXRhLmRhdGFEZXN0aW5hdGlvbi5jb3VudHJ5ID8gJywgJyA6ICcnO1xyXG5cdFx0XHRcdHZhbHVlSW5mb05hbWUgKz0gdGhpcy5kYXRhLmRhdGFEZXN0aW5hdGlvbi5jb3VudHJ5XHJcblx0XHRcdFx0XHQ/IHRoaXMuZGF0YS5kYXRhRGVzdGluYXRpb24uY291bnRyeVxyXG5cdFx0XHRcdFx0OiAnJztcclxuXHRcdFx0XHRsZXQgdmFsdWVJbmZvID0gJCgnPGRpdj48L2Rpdj4nKS50ZXh0KHZhbHVlSW5mb05hbWUpO1xyXG5cdFx0XHRcdGRlc3RpbmF0aW9uSW5mby5hcHBlbmQodmFsdWVJbmZvKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRwbGlUb2tlbkRlc3RpbmF0aW9uLmFwcGVuZChkZXN0aW5hdGlvbkluZm8pO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSXQgcmVzb2x2ZXMgdGhlIHN0YXRpYyB0b2tlbiBkZXN0aW5hdGlvblxyXG5cdCAqIEBwYXJhbSBzdHJpbmdUZXh0XHJcblx0ICogQHBhcmFtIHRva2VuXHJcblx0ICogQHBhcmFtIGRhdGFWYWx1ZVxyXG5cdCAqL1xyXG5cdHJlc29sdmVTdGF0aWNUb2tlbnNLZXlTYWx1ZG9Db21wbGVtZW50YXJpbyhzdHJpbmdUZXh0OiBzdHJpbmcsIHRva2VuVmFsdWU6IGFueSk6IHN0cmluZyB7XHJcblx0XHQvLyBpZiAodGhpcy5kYXRhLmRhdGFEZXN0aW5hdGlvbikge1xyXG5cdFx0dGhpcy5lbmFibGVEZXN0aW5hdGlvbiA9IHRydWU7XHJcblx0XHR0aGlzLmFkZEluZm9Ub2tlblNhbHVkb0NvbXBsZW1lbnRhcmlvKCk7XHJcblx0XHRjb25zdCBwbGlUb2tlbkRlc3RpbmF0aW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BsaS10b2tlbi1jb21wbGVtZW50YXJ5LWdyZWV0aW5nJyk7XHJcblx0XHRsZXQgaHRtbCA9ICcnO1xyXG5cdFx0aWYgKHBsaVRva2VuRGVzdGluYXRpb24pIHtcclxuXHRcdFx0aHRtbCA9IHRoaXMucmVtb3ZlQ29tbWVudHNIdG1sKHBsaVRva2VuRGVzdGluYXRpb24uaW5uZXJIVE1MKTtcclxuXHRcdH1cclxuXHRcdHJldHVybiB0aGlzLnRva2VuU2VydmljZS5yZXBsYWNlVG9rZW4oc3RyaW5nVGV4dCwgdG9rZW5WYWx1ZSwgaHRtbCk7XHJcblx0XHQvLyB9XHJcblx0XHQvLyByZXR1cm4gc3RyaW5nVGV4dDtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqXHJcblx0ICovXHJcblx0YWRkSW5mb1Rva2VuU2FsdWRvQ29tcGxlbWVudGFyaW8oKSB7XHJcblx0XHRsZXQgcGxpVG9rZW5EZXN0aW5hdGlvbiA9ICQoJyNwbGktdG9rZW4tY29tcGxlbWVudGFyeS1ncmVldGluZycpO1xyXG5cdFx0cGxpVG9rZW5EZXN0aW5hdGlvbi5lbXB0eSgpO1xyXG5cdFx0aWYgKHRoaXMuZGF0YS5kYXRhRGVzdGluYXRpb24pIHtcclxuXHRcdFx0bGV0IGRlc3RpbmF0aW9uSW5mbyA9ICQoJzxkaXY+PC9kaXY+Jyk7XHJcblx0XHRcdGlmICh0aGlzLmRhdGEuZGF0YURlc3RpbmF0aW9uLmdyZWV0aW5nKSB7XHJcblx0XHRcdFx0ZGVzdGluYXRpb25JbmZvLmh0bWwodGhpcy5kYXRhLmRhdGFEZXN0aW5hdGlvbi5ncmVldGluZyk7XHJcblx0XHRcdH1cclxuXHRcdFx0aWYgKHRoaXMuZGF0YS5kYXRhRGVzdGluYXRpb24udGl0bGUpIHtcclxuXHRcdFx0XHRjb25zdCB2YWx1ZVRleHQgPVxyXG5cdFx0XHRcdFx0KGRlc3RpbmF0aW9uSW5mby5odG1sKCkubGVuZ3RoID09IDAgPyAnJyA6ICcgJykgK1xyXG5cdFx0XHRcdFx0dGhpcy5kYXRhLmRhdGFEZXN0aW5hdGlvbi50aXRsZTtcclxuXHRcdFx0XHRkZXN0aW5hdGlvbkluZm8uaHRtbChkZXN0aW5hdGlvbkluZm8uaHRtbCgpICsgdmFsdWVUZXh0KTtcclxuXHRcdFx0fVxyXG5cdFx0XHRpZiAodGhpcy5kYXRhLmRhdGFEZXN0aW5hdGlvbi5sYXN0TmFtZSkge1xyXG5cdFx0XHRcdGxldCB2YWx1ZUluZm9OYW1lID0gdGhpcy5kYXRhLmRhdGFEZXN0aW5hdGlvbi5sYXN0TmFtZVxyXG5cdFx0XHRcdFx0PyB0aGlzLmRhdGEuZGF0YURlc3RpbmF0aW9uLmxhc3ROYW1lXHJcblx0XHRcdFx0XHQ6ICcnO1xyXG5cdFx0XHRcdGNvbnN0IHZhbHVlVGV4dCA9XHJcblx0XHRcdFx0XHQoZGVzdGluYXRpb25JbmZvLmh0bWwoKS5sZW5ndGggPT0gMCA/ICcnIDogJyAnKSArXHJcblx0XHRcdFx0XHQnPHN0cm9uZz4nICtcclxuXHRcdFx0XHRcdHZhbHVlSW5mb05hbWUgK1xyXG5cdFx0XHRcdFx0Jzwvc3Ryb25nPic7XHJcblx0XHRcdFx0ZGVzdGluYXRpb25JbmZvLmh0bWwoZGVzdGluYXRpb25JbmZvLmh0bWwoKSArIHZhbHVlVGV4dCk7XHJcblx0XHRcdH1cclxuXHRcdFx0cGxpVG9rZW5EZXN0aW5hdGlvbi5hcHBlbmQoZGVzdGluYXRpb25JbmZvKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHByaXZhdGUgcmVtb3ZlQ29tbWVudHNIdG1sKGh0bWw6IHN0cmluZyk6IHN0cmluZyB7XHJcblx0XHRyZXR1cm4gaHRtbCA/IGh0bWwucmVwbGFjZSgvPCEtLVtcXHNcXFNdKj8tLT4vZywgJycpIDogaHRtbDtcclxuXHR9XHJcblxyXG5cdHJlc29sdmVTdGF0aWNUb2tlbnNLZXlTaWduKGh0bWwsIHRva2VuVmFsdWU6IGFueSwgc3ViVG9rZW46IHN0cmluZ1tdKTogc3RyaW5nIHtcclxuXHRcdGxldCBjb250YWluZXIgPSAkKCc8ZGl2PjwvZGl2PicpO1xyXG5cdFx0bGV0IGltZyA9ICQoJzxpbWcgaWQ9XCInICsgVG9rZW5TZXJ2aWNlLlNJR05fTEVUVEVSX1RBR19JRCArICdcIj4nKTtcclxuXHRcdGltZy5hdHRyKCdzcmMnLCAnJyk7XHJcblx0XHRpZiAoc3ViVG9rZW4ubGVuZ3RoID4gMikge1xyXG5cdFx0XHRpbWcuYXR0cignd2lkdGgnLCBzdWJUb2tlblsyXS50b1N0cmluZygpKTtcclxuXHRcdH1cclxuXHRcdGlmIChzdWJUb2tlbi5sZW5ndGggPiAzKSB7XHJcblx0XHRcdGltZy5hdHRyKCdoZWlnaHQnLCBzdWJUb2tlblszXS50b1N0cmluZygpKTtcclxuXHRcdH1cclxuXHRcdGlmIChzdWJUb2tlbi5sZW5ndGggPiA0KSB7XHJcblx0XHRcdGltZy5hdHRyKCduYW1lJywgc3ViVG9rZW5bNF0udG9TdHJpbmcoKSk7XHJcblx0XHR9XHJcblx0XHRjb250YWluZXIuYXBwZW5kKGltZyk7XHJcblx0XHQvLyByZXR1cm4gY29udGFpbmVyLmh0bWwoKTtcclxuXHRcdHJldHVybiB0aGlzLnRva2VuU2VydmljZS5yZXBsYWNlVG9rZW4oaHRtbCwgdG9rZW5WYWx1ZSwgY29udGFpbmVyLmh0bWwoKSk7XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIGdldFJ1YnJvTGFiZWwoKTogc3RyaW5nIHtcclxuXHRcdHJldHVybiB0aGlzLmRhdGEuaWRpb21hLmxvY2FsZSA9PT0gJ2VzJ1xyXG5cdFx0XHQ/ICdSdWJybydcclxuXHRcdFx0OiB0aGlzLmRhdGEuaWRpb21hLmxvY2FsZSA9PT0gJ2RlJ1xyXG5cdFx0XHQ/ICdQb3N0ZW4nXHJcblx0XHRcdDogJ0l0ZW0nO1xyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBnZXRUb3RhbExhYmVsKCk6IHN0cmluZyB7XHJcblx0XHRyZXR1cm4gdGhpcy5kYXRhLmlkaW9tYS5sb2NhbGUgPT09ICdlcydcclxuXHRcdFx0PyAnVG90YWwnXHJcblx0XHRcdDogdGhpcy5kYXRhLmlkaW9tYS5sb2NhbGUgPT09ICdkZSdcclxuXHRcdFx0PyAnR2VzYW10J1xyXG5cdFx0XHQ6IHRoaXMuZGF0YS5pZGlvbWEubG9jYWxlID09PSAnZnInXHJcblx0XHRcdD8gJ1RvdGFsJ1xyXG5cdFx0XHQ6IHRoaXMuZGF0YS5pZGlvbWEubG9jYWxlID09PSAnaXQnXHJcblx0XHRcdD8gJ1RvdGFsZSdcclxuXHRcdFx0OiAnSXRlbSc7XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIGdldFllYXJMYWJlbCgpOiBzdHJpbmcge1xyXG5cdFx0cmV0dXJuIHRoaXMuZGF0YS5pZGlvbWEubG9jYWxlID09PSAnZXMnXHJcblx0XHRcdD8gJ0HDsW8nXHJcblx0XHRcdDogdGhpcy5kYXRhLmlkaW9tYS5sb2NhbGUgPT09ICdkZSdcclxuXHRcdFx0PyAnSmFocidcclxuXHRcdFx0OiB0aGlzLmRhdGEuaWRpb21hLmxvY2FsZSA9PT0gJ2ZyJ1xyXG5cdFx0XHQ/ICdBbm7DqWUnXHJcblx0XHRcdDogdGhpcy5kYXRhLmlkaW9tYS5sb2NhbGUgPT09ICdpdCdcclxuXHRcdFx0PyAnQW5ubydcclxuXHRcdFx0OiAnWWVhcic7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKlxyXG5cdCAqL1xyXG5cdGFkZEluZm9Ub2tlblJlc3VtZUNhdGVnb3J5WWVhcihcclxuXHRcdHRwcmVzQ29kaWdvOiBudW1iZXIsXHJcblx0XHRpZFRvdGFsQnVkZ2V0OiBzdHJpbmcsXHJcblx0XHRidWRnZXREdG86IEJ1ZGdldER0b1xyXG5cdCkge1xyXG5cdFx0aWYgKHRwcmVzQ29kaWdvID09IEVUaXBvUHJlc3VwdWVzdG8uUFJJTUFSWSkge1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdH1cclxuXHRcdGxldCByZXN1bWVDYXRlZ29yeVllYXJDb250ZW50ID0gJCgnIycgKyBpZFRvdGFsQnVkZ2V0KTtcclxuXHRcdHJlc3VtZUNhdGVnb3J5WWVhckNvbnRlbnQuZW1wdHkoKTtcclxuXHRcdGlmIChidWRnZXREdG8gJiYgYnVkZ2V0RHRvLmJ1ZGdldCAmJiBidWRnZXREdG8uYnVkZ2V0LnN1bW1hcnkpIHtcclxuXHRcdFx0Y29uc3Qgc3VtbWFyeSA9IGJ1ZGdldER0by5idWRnZXQuc3VtbWFyeTtcclxuXHRcdFx0Y29uc3QgdGFibGUgPSAkKCc8dGFibGU+PC90YWJsZT4nKTtcclxuXHRcdFx0dGFibGUuY3NzKCdib3JkZXItc3BhY2luZycsICcycHgnKTtcclxuXHRcdFx0dGFibGUuY3NzKCdib3JkZXItY29sbGFwc2UnLCAnY29sbGFwc2UnKTtcclxuXHRcdFx0Ly90aGVhZFxyXG5cdFx0XHRjb25zdCB0aGVhZCA9ICQoJzx0aGVhZD4nKS5hcHBlbmRUbyh0YWJsZSk7XHJcblx0XHRcdGNvbnN0IHRoUnVicm8gPSAkKCc8dGg+JywgeyBodG1sOiB0aGlzLmdldFJ1YnJvTGFiZWwoKSB9KS5hcHBlbmRUbyh0aGVhZCk7XHJcblx0XHRcdHRoUnVicm8uY3NzKCd0ZXh0LWFsaWduJywgJ2NlbnRlcicpO1xyXG5cdFx0XHR0aFJ1YnJvLmNzcygnYm9yZGVyJywgJzFweCBzb2xpZCBibGFjaycpO1xyXG5cdFx0XHR0aFJ1YnJvLmNzcygnY29sb3InLCAnd2hpdGUnKTtcclxuXHRcdFx0dGhSdWJyby5jc3MoJ2JhY2tncm91bmQtY29sb3InLCAnZ3JleScpO1xyXG5cdFx0XHRsZXQgaXRlcmFjaW9uQW5pbyA9IDA7XHJcblx0XHRcdGZvciAoY29uc3QgeWVhciBvZiBzdW1tYXJ5LnllYXJzKSB7XHJcblx0XHRcdFx0Y29uc3QgdGhZZWFyID0gJCgnPHRoPicsIHsgaHRtbDogdGhpcy5nZXRZZWFyTGFiZWwoKSArICsraXRlcmFjaW9uQW5pbyB9KS5hcHBlbmRUbyhcclxuXHRcdFx0XHRcdHRoZWFkXHJcblx0XHRcdFx0KTtcclxuXHRcdFx0XHR0aFllYXIuY3NzKCd0ZXh0LWFsaWduJywgJ2NlbnRlcicpO1xyXG5cdFx0XHRcdHRoWWVhci5jc3MoJ2JvcmRlcicsICcxcHggc29saWQgYmxhY2snKTtcclxuXHRcdFx0XHR0aFllYXIuY3NzKCdjb2xvcicsICd3aGl0ZScpO1xyXG5cdFx0XHRcdHRoWWVhci5jc3MoJ2JhY2tncm91bmQtY29sb3InLCAnZ3JleScpO1xyXG5cdFx0XHRcdHRoWWVhci5jc3MoJ3dpZHRoJywgJzgwcHgnKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRjb25zdCB0b3RhbExhYmVsID0gJyZuYnNwOycgKyB0aGlzLmdldFRvdGFsTGFiZWwoKSArIHN1bW1hcnkuYmFzZUN1cnJlbmN5ICsgJyZuYnNwOyc7XHJcblx0XHRcdGNvbnN0IHRoVG90YWwgPSAkKCc8dGg+JywgeyBodG1sOiB0b3RhbExhYmVsIH0pLmFwcGVuZFRvKHRoZWFkKTtcclxuXHRcdFx0dGhUb3RhbC5jc3MoJ3RleHQtYWxpZ24nLCAnY2VudGVyJyk7XHJcblx0XHRcdHRoVG90YWwuY3NzKCdib3JkZXInLCAnMXB4IHNvbGlkIGJsYWNrJyk7XHJcblx0XHRcdHRoVG90YWwuY3NzKCdjb2xvcicsICd3aGl0ZScpO1xyXG5cdFx0XHR0aFRvdGFsLmNzcygnYmFja2dyb3VuZC1jb2xvcicsICdncmV5Jyk7XHJcblx0XHRcdHRoVG90YWwuY3NzKCd3aWR0aCcsICc4MHB4Jyk7XHJcblx0XHRcdC8vdGJvZHlcclxuXHRcdFx0bGV0IHRib2R5ID0gJCgnPHRib2R5PicpLmFwcGVuZFRvKHRhYmxlKTtcclxuXHRcdFx0Zm9yIChsZXQgaUNhdCA9IDA7IGlDYXQgPCBzdW1tYXJ5LmNhdGVnb3JpZXMubGVuZ3RoOyBpQ2F0KyspIHtcclxuXHRcdFx0XHRjb25zdCB0ciA9ICQoJzx0cj4nKS5hcHBlbmRUbyh0Ym9keSk7XHJcblx0XHRcdFx0Y29uc3QgY2F0ZWdvcnkgPSBzdW1tYXJ5LmNhdGVnb3JpZXNbaUNhdF07XHJcblx0XHRcdFx0Y29uc3QgcnVicm9MYWJlbCA9XHJcblx0XHRcdFx0XHQnJm5ic3A7Jm5ic3A7JyArXHJcblx0XHRcdFx0XHR0aGlzLnRyYW5zbGF0ZUNhdGVnb3J5KGNhdGVnb3J5LmNhdGVnb3J5KSArXHJcblx0XHRcdFx0XHQnJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7JztcclxuXHRcdFx0XHRjb25zdCB0ZFJ1YnJvID0gJCgnPHRkPicsIHsgaHRtbDogcnVicm9MYWJlbCB9KS5hcHBlbmRUbyh0cik7XHJcblx0XHRcdFx0dGRSdWJyby5jc3MoJ3RleHQtYWxpZ24nLCAnbGVmdCcpO1xyXG5cdFx0XHRcdHRkUnVicm8uY3NzKCdib3JkZXInLCAnMXB4IHNvbGlkIGJsYWNrJyk7XHJcblx0XHRcdFx0dGRSdWJyby5jc3MoJ2ZvbnQtd2VpZ2h0JywgJ2JvbGQnKTtcclxuXHRcdFx0XHRmb3IgKGNvbnN0IHllYXIgb2YgY2F0ZWdvcnkueWVhcnMpIHtcclxuXHRcdFx0XHRcdGNvbnN0IHllYXJUb3RhbCA9XHJcblx0XHRcdFx0XHRcdHllYXIudG90YWwgPT0gMFxyXG5cdFx0XHRcdFx0XHRcdD8gJy0nXHJcblx0XHRcdFx0XHRcdFx0OiB0aGlzLmN1cnJlbmN5UGlwZS50cmFuc2Zvcm0oeWVhci50b3RhbCwgJ2RlZmF1bHQnLCAnJywgJzEuMC0wJyk7XHJcblx0XHRcdFx0XHRjb25zdCB5ZWFyTGFiZWxUb3RhbCA9ICcmbmJzcDsmbmJzcDsnICsgeWVhclRvdGFsICsgJyZuYnNwOyZuYnNwOyc7XHJcblx0XHRcdFx0XHRjb25zdCB0ZFllYXIgPSAkKCc8dGQ+JywgeyBodG1sOiB5ZWFyTGFiZWxUb3RhbCB9KS5hcHBlbmRUbyh0cik7XHJcblx0XHRcdFx0XHR0ZFllYXIuY3NzKCd0ZXh0LWFsaWduJywgJ3JpZ2h0Jyk7XHJcblx0XHRcdFx0XHR0ZFllYXIuY3NzKCdib3JkZXInLCAnMXB4IHNvbGlkIGJsYWNrJyk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGNvbnN0IGNhdGVnb3J5VG90YWwgPVxyXG5cdFx0XHRcdFx0Y2F0ZWdvcnkudG90YWwgPT0gMFxyXG5cdFx0XHRcdFx0XHQ/ICctJ1xyXG5cdFx0XHRcdFx0XHQ6IHRoaXMuY3VycmVuY3lQaXBlLnRyYW5zZm9ybShjYXRlZ29yeS50b3RhbCwgJ2RlZmF1bHQnLCAnJywgJzEuMC0wJyk7XHJcblx0XHRcdFx0Y29uc3QgY2F0ZWdvcnlMYWJlbFRvdGFsID0gJyZuYnNwOyZuYnNwOycgKyBjYXRlZ29yeVRvdGFsICsgJyZuYnNwOyZuYnNwOyc7XHJcblx0XHRcdFx0Y29uc3QgdGRUb3RhbCA9ICQoJzx0ZD4nLCB7IGh0bWw6IGNhdGVnb3J5TGFiZWxUb3RhbCB9KS5hcHBlbmRUbyh0cik7XHJcblx0XHRcdFx0dGRUb3RhbC5jc3MoJ3RleHQtYWxpZ24nLCAncmlnaHQnKTtcclxuXHRcdFx0XHR0ZFRvdGFsLmNzcygnYm9yZGVyJywgJzFweCBzb2xpZCBibGFjaycpO1xyXG5cdFx0XHRcdHRkVG90YWwuY3NzKCdmb250LXdlaWdodCcsICdib2xkJyk7XHJcblx0XHRcdH1cclxuXHRcdFx0Y29uc3QgdHJGaW5hbCA9ICQoJzx0cj4nKS5hcHBlbmRUbyh0Ym9keSk7XHJcblx0XHRcdGNvbnN0IGJhc2VDdXJyZW5jeSA9IHRoaXMuZ2V0VG90YWxMYWJlbCgpICsgJyAnICsgc3VtbWFyeS5iYXNlQ3VycmVuY3kgKyAnJm5ic3A7Jm5ic3A7JztcclxuXHRcdFx0Y29uc3QgdGRGaW5hbFRvdGFsQkMgPSAkKCc8dGQ+JywgeyBodG1sOiBiYXNlQ3VycmVuY3kgfSkuYXBwZW5kVG8odHJGaW5hbCk7XHJcblx0XHRcdHRkRmluYWxUb3RhbEJDLmNzcygndGV4dC1hbGlnbicsICdyaWdodCcpO1xyXG5cdFx0XHR0ZEZpbmFsVG90YWxCQy5jc3MoJ2JvcmRlcicsICcxcHggc29saWQgYmxhY2snKTtcclxuXHRcdFx0dGRGaW5hbFRvdGFsQkMuY3NzKCdjb2xvcicsICd3aGl0ZScpO1xyXG5cdFx0XHR0ZEZpbmFsVG90YWxCQy5jc3MoJ2JhY2tncm91bmQtY29sb3InLCAnZ3JleScpO1xyXG5cdFx0XHRsZXQgYnVkZ2V0VG90YWwgPSAwO1xyXG5cdFx0XHRmb3IgKGNvbnN0IHllYXIgb2Ygc3VtbWFyeS55ZWFycykge1xyXG5cdFx0XHRcdGNvbnN0IHllYXJUb3RhbCA9XHJcblx0XHRcdFx0XHR5ZWFyLnRvdGFsID09IDBcclxuXHRcdFx0XHRcdFx0PyAnLSdcclxuXHRcdFx0XHRcdFx0OiB0aGlzLmN1cnJlbmN5UGlwZS50cmFuc2Zvcm0oeWVhci50b3RhbCwgJ2RlZmF1bHQnLCAnJywgJzEuMC0wJyk7XHJcblx0XHRcdFx0Y29uc3QgeWVhckxhYmVsVG90YWwgPSB5ZWFyVG90YWwgKyAnJm5ic3A7Jm5ic3A7JztcclxuXHRcdFx0XHRjb25zdCB0ZFllYXIgPSAkKCc8dGQ+JywgeyBodG1sOiB5ZWFyTGFiZWxUb3RhbCB9KS5hcHBlbmRUbyh0ckZpbmFsKTtcclxuXHRcdFx0XHR0ZFllYXIuY3NzKCd0ZXh0LWFsaWduJywgJ3JpZ2h0Jyk7XHJcblx0XHRcdFx0dGRZZWFyLmNzcygnYm9yZGVyJywgJzFweCBzb2xpZCBibGFjaycpO1xyXG5cdFx0XHRcdHRkWWVhci5jc3MoJ2NvbG9yJywgJ3doaXRlJyk7XHJcblx0XHRcdFx0dGRZZWFyLmNzcygnYmFja2dyb3VuZC1jb2xvcicsICdncmV5Jyk7XHJcblx0XHRcdFx0YnVkZ2V0VG90YWwgKz0geWVhci50b3RhbDtcclxuXHRcdFx0fVxyXG5cdFx0XHRjb25zdCB0b3RhbEJhc2VDdXJyZW5jeSA9XHJcblx0XHRcdFx0YnVkZ2V0VG90YWwgPT0gMFxyXG5cdFx0XHRcdFx0PyAnLSdcclxuXHRcdFx0XHRcdDogdGhpcy5jdXJyZW5jeVBpcGUudHJhbnNmb3JtKGJ1ZGdldFRvdGFsLCAnZGVmYXVsdCcsICcnLCAnMS4wLTAnKTtcclxuXHRcdFx0Y29uc3QgdG90YWxMYWJlbEJhc2VDdXJyZW5jeSA9ICcmbmJzcDsmbmJzcDsnICsgdG90YWxCYXNlQ3VycmVuY3kgKyAnJm5ic3A7Jm5ic3A7JztcclxuXHRcdFx0Y29uc3QgdGRGaW5hbFRvdGFsID0gJCgnPHRkPicsIHsgaHRtbDogdG90YWxMYWJlbEJhc2VDdXJyZW5jeSB9KS5hcHBlbmRUbyh0ckZpbmFsKTtcclxuXHRcdFx0dGRGaW5hbFRvdGFsLmNzcygndGV4dC1hbGlnbicsICdyaWdodCcpO1xyXG5cdFx0XHR0ZEZpbmFsVG90YWwuY3NzKCdib3JkZXInLCAnMXB4IHNvbGlkIGJsYWNrJyk7XHJcblx0XHRcdHRkRmluYWxUb3RhbC5jc3MoJ2NvbG9yJywgJ3doaXRlJyk7XHJcblx0XHRcdHRkRmluYWxUb3RhbC5jc3MoJ2JhY2tncm91bmQtY29sb3InLCAnZ3JleScpO1xyXG5cdFx0XHRyZXN1bWVDYXRlZ29yeVllYXJDb250ZW50LmFwcGVuZCh0YWJsZSk7XHJcblx0XHR9XHJcblx0fVxyXG59XHJcbiIsIjxkaXYgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiIGlkPVwicGxpLXRva2VuLWRlc3RpbmF0aW9uXCI+XHJcblx0PCEtLSA8ZGl2ICpuZ0lmPVwiZGF0YSAhPSB1bmRlZmluZWQgJiYgZGF0YS5kYXRhRGVzdGluYXRpb24gIT0gdW5kZWZpbmVkXCI+XHJcblxyXG4gICAgICAgIDxkaXYgKm5nSWY9XCJkYXRhLmRhdGFEZXN0aW5hdGlvbi50ZXh0ICE9IHVuZGVmaW5lZFwiPlxyXG4gICAgICAgICAgICB7e2RhdGEuZGF0YURlc3RpbmF0aW9uLnRleHR9fVxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgKm5nSWY9XCJkYXRhLmRhdGFEZXN0aW5hdGlvbi50aXRsZSAhPSB1bmRlZmluZWRcIj5cclxuICAgICAgICAgICAge3tkYXRhLmRhdGFEZXN0aW5hdGlvbi50aXRsZX19XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiAqbmdJZj1cImRhdGEuZGF0YURlc3RpbmF0aW9uLm5hbWUgIT0gdW5kZWZpbmVkIHx8IGRhdGEuZGF0YURlc3RpbmF0aW9uLmxhc3ROYW1lICE9IHVuZGVmaW5lZFwiPlxyXG4gICAgICAgICAgICA8c3Ryb25nPnt7ZGF0YS5kYXRhRGVzdGluYXRpb24ubmFtZX19IHt7ZGF0YS5kYXRhRGVzdGluYXRpb24ubGFzdE5hbWV9fTwvc3Ryb25nPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgKm5nSWY9XCJkYXRhLmRhdGFEZXN0aW5hdGlvbi5jYXJnbyAhPSB1bmRlZmluZWRcIj5cclxuICAgICAgICAgICAge3tkYXRhLmRhdGFEZXN0aW5hdGlvbi5jYXJnb319XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiAqbmdJZj1cImRhdGEuZGF0YURlc3RpbmF0aW9uLm9jY3VwYXRpb24gIT0gdW5kZWZpbmVkXCI+XHJcbiAgICAgICAgICAgIHt7ZGF0YS5kYXRhRGVzdGluYXRpb24ub2NjdXBhdGlvbn19XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiAqbmdJZj1cImRhdGEuZGF0YURlc3RpbmF0aW9uLmNvbXBhbnkgIT0gdW5kZWZpbmVkXCI+XHJcbiAgICAgICAgICAgIHt7ZGF0YS5kYXRhRGVzdGluYXRpb24uY29tcGFueX19XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiAqbmdJZj1cImRhdGEuZGF0YURlc3RpbmF0aW9uLmFkZHJlc3MgIT0gdW5kZWZpbmVkIHx8IGRhdGEuZGF0YURlc3RpbmF0aW9uLmFkZHJlc3NEZXRhaWxzICE9IHVuZGVmaW5lZCBcIj5cclxuICAgICAgICAgICAge3tkYXRhLmRhdGFEZXN0aW5hdGlvbi5hZGRyZXNzfX0ge3tkYXRhLmRhdGFEZXN0aW5hdGlvbi5hZGRyZXNzRGV0YWlsc319XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiAqbmdJZj1cImRhdGEuZGF0YURlc3RpbmF0aW9uLmNpdHkgIT0gdW5kZWZpbmVkIHx8IGRhdGEuZGF0YURlc3RpbmF0aW9uLmNvdW50cnkgIT0gdW5kZWZpbmVkIFwiPlxyXG4gICAgICAgICAgICB7e2RhdGEuZGF0YURlc3RpbmF0aW9uLmNpdHl9fTxzcGFuICpuZ0lmPVwiZGF0YS5kYXRhRGVzdGluYXRpb24uY2l0eSAhPSB1bmRlZmluZWQgJiYgZGF0YS5kYXRhRGVzdGluYXRpb24uY291bnRyeSAhPSB1bmRlZmluZWRcIj4sPC9zcGFuPnt7ZGF0YS5kYXRhRGVzdGluYXRpb24uY291bnRyeX19XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgPC9kaXY+IC0tPlxyXG48L2Rpdj5cclxuPCEtLSBDb21wbGVtZW50YXJ5IGdyZWV0aW5nLS0+XHJcbjxkaXYgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiIGlkPVwicGxpLXRva2VuLWNvbXBsZW1lbnRhcnktZ3JlZXRpbmdcIj5cclxuXHQ8IS0tIDxkaXZcclxuXHRcdCpuZ0lmPVwiXHJcblx0XHRcdGRhdGEgIT0gdW5kZWZpbmVkICYmXHJcblx0XHRcdGRhdGEuZGF0YURlc3RpbmF0aW9uICE9IHVuZGVmaW5lZCAmJlxyXG5cdFx0XHRkYXRhLmRhdGFEZXN0aW5hdGlvbi50YXJnZXRJZCA9PSAyICYmXHJcblx0XHRcdGRhdGEuZGF0YURlc3RpbmF0aW9uLmdyZWV0aW5nICE9IHVuZGVmaW5lZFxyXG5cdFx0XCJcclxuXHQ+XHJcblx0XHR7eyBkYXRhLmRhdGFEZXN0aW5hdGlvbi5ncmVldGluZ1xyXG5cdFx0fX08c3BhbiAqbmdJZj1cImRhdGEuZGF0YURlc3RpbmF0aW9uLnRpdGxlICE9IHVuZGVmaW5lZFwiXHJcblx0XHRcdD4mbmJzcDt7eyBkYXRhLmRhdGFEZXN0aW5hdGlvbi50aXRsZSB9fTwvc3BhblxyXG5cdFx0PjxzcGFuICpuZ0lmPVwiZGF0YS5kYXRhRGVzdGluYXRpb24ubGFzdE5hbWUgIT0gdW5kZWZpbmVkXCJcclxuXHRcdFx0PiZuYnNwO3t7IGRhdGEuZGF0YURlc3RpbmF0aW9uLmxhc3ROYW1lIH19PC9zcGFuXHJcblx0XHQ+OlxyXG5cdDwvZGl2Pi0tPlxyXG48L2Rpdj5cclxuXHJcbjwhLS0gUHJpbWFyeSBidWRnZXQgdG90YWwgc3VtbWFyeSAke3ByZXN1cHVlc3RvXzI4OF9yZXN1bWVDYXRlZ29yeVllYXJ9IC0tPlxyXG48ZGl2IHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIiBpZD1cInBsaS10b2tlbi1wcmluY2lwYWwtYnVkZ2V0LXRvdGFsLXN1bW1hcnlcIj5cclxuXHQ8IS0tIDxkaXY+XHJcblx0XHQ8dGFibGVcclxuXHRcdFx0Km5nSWY9XCJcclxuXHRcdFx0XHRidWRnZXREdG9QcmltYXJ5ICE9PSBudWxsICYmXHJcblx0XHRcdFx0YnVkZ2V0RHRvUHJpbWFyeS5idWRnZXQgJiZcclxuXHRcdFx0XHRidWRnZXREdG9QcmltYXJ5LmJ1ZGdldC5zdW1tYXJ5XHJcblx0XHRcdFwiXHJcblx0XHRcdHN0eWxlPVwiYm9yZGVyLXNwYWNpbmc6IDJweDtib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlO1wiXHJcblx0XHQ+XHJcblx0XHRcdDx0aGVhZD5cclxuXHRcdFx0XHQ8dHIgc3R5bGU9XCJmb250LXdlaWdodDogYm9sZDtcIj5cclxuXHRcdFx0XHRcdDx0ZFxyXG5cdFx0XHRcdFx0XHRzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlcjtib3JkZXI6IDFweCBzb2xpZCBibGFjazsgY29sb3I6IHdoaXRlO2JhY2tncm91bmQtY29sb3I6IGdyZXk7XCJcclxuXHRcdFx0XHRcdD5cclxuXHRcdFx0XHRcdFx0UnVicm9cclxuXHRcdFx0XHRcdDwvdGQ+XHJcblx0XHRcdFx0XHQ8dGRcclxuXHRcdFx0XHRcdFx0Km5nRm9yPVwibGV0IHllYXIgb2YgYnVkZ2V0RHRvUHJpbWFyeS5idWRnZXQuc3VtbWFyeS55ZWFyc1wiXHJcblx0XHRcdFx0XHRcdHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyO2JvcmRlcjogMXB4IHNvbGlkIGJsYWNrOyBjb2xvcjogd2hpdGU7YmFja2dyb3VuZC1jb2xvcjogZ3JleTsgd2lkdGg6ODBweDtcIlxyXG5cdFx0XHRcdFx0PlxyXG5cdFx0XHRcdFx0XHR7eyB5ZWFyLnllYXJOdW1iZXIgfX1cclxuXHRcdFx0XHRcdDwvdGQ+XHJcblx0XHRcdFx0XHQ8dGRcclxuXHRcdFx0XHRcdFx0c3R5bGU9XCJ0ZXh0LWFsaWduOiBjZW50ZXI7Ym9yZGVyOiAxcHggc29saWQgYmxhY2s7IGNvbG9yOiB3aGl0ZTtiYWNrZ3JvdW5kLWNvbG9yOiBncmV5OyB3aWR0aDogMTEwcHg7XCJcclxuXHRcdFx0XHRcdD5cclxuXHRcdFx0XHRcdFx0VG90YWwgKHt7IGJ1ZGdldER0b1ByaW1hcnkuYnVkZ2V0LnN1bW1hcnkuYmFzZUN1cnJlbmN5IH19KVxyXG5cdFx0XHRcdFx0PC90ZD5cclxuXHRcdFx0XHQ8L3RyPlxyXG5cdFx0XHQ8L3RoZWFkPlxyXG5cdFx0XHQ8dGJvZHk+XHJcblx0XHRcdFx0PHRyXHJcblx0XHRcdFx0XHQqbmdGb3I9XCJcclxuXHRcdFx0XHRcdFx0bGV0IGNhdGVnb3J5IG9mIGJ1ZGdldER0b1ByaW1hcnkuYnVkZ2V0LnN1bW1hcnkuY2F0ZWdvcmllcztcclxuXHRcdFx0XHRcdFx0bGV0IGlDYXQgPSBpbmRleFxyXG5cdFx0XHRcdFx0XCJcclxuXHRcdFx0XHQ+XHJcblx0XHRcdFx0XHQ8dGQgc3R5bGU9XCJmb250LXdlaWdodDogYm9sZDt0ZXh0LWFsaWduOiBsZWZ0O2JvcmRlcjogMXB4IHNvbGlkIGJsYWNrO1wiPlxyXG5cdFx0XHRcdFx0XHQmbmJzcDsmbmJzcDt7e1xyXG5cdFx0XHRcdFx0XHRcdHRyYW5zbGF0ZUNhdGVnb3J5KGNhdGVnb3J5LmNhdGVnb3J5KVxyXG5cdFx0XHRcdFx0XHR9fSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1xyXG5cdFx0XHRcdFx0PC90ZD5cclxuXHRcdFx0XHRcdDx0ZFxyXG5cdFx0XHRcdFx0XHQqbmdGb3I9XCJsZXQgeWVhciBvZiBjYXRlZ29yeS55ZWFyc1wiXHJcblx0XHRcdFx0XHRcdHN0eWxlPVwidGV4dC1hbGlnbjogcmlnaHQ7Ym9yZGVyOiAxcHggc29saWQgYmxhY2s7IFwiXHJcblx0XHRcdFx0XHQ+XHJcblx0XHRcdFx0XHRcdCZuYnNwOyZuYnNwO3t7XHJcblx0XHRcdFx0XHRcdFx0eWVhci50b3RhbCA9PSAwID8gJy0nIDogKHllYXIudG90YWwgfCBjdXJyZW5jeTogJ2RlZmF1bHQnOicnOicxLjAtMCcpXHJcblx0XHRcdFx0XHRcdH19Jm5ic3A7Jm5ic3A7XHJcblx0XHRcdFx0XHQ8L3RkPlxyXG5cdFx0XHRcdFx0PHRkIHN0eWxlPVwiZm9udC13ZWlnaHQ6IGJvbGQ7IHRleHQtYWxpZ246IHJpZ2h0O2JvcmRlcjogMXB4IHNvbGlkIGJsYWNrO1wiPlxyXG5cdFx0XHRcdFx0XHQmbmJzcDsmbmJzcDt7e1xyXG5cdFx0XHRcdFx0XHRcdGNhdGVnb3J5LnRvdGFsID09IDBcclxuXHRcdFx0XHRcdFx0XHRcdD8gJy0nXHJcblx0XHRcdFx0XHRcdFx0XHQ6IChjYXRlZ29yeS50b3RhbCB8IGN1cnJlbmN5OiAnZGVmYXVsdCc6Jyc6JzEuMC0wJylcclxuXHRcdFx0XHRcdFx0fX0mbmJzcDsmbmJzcDtcclxuXHRcdFx0XHRcdDwvdGQ+XHJcblx0XHRcdFx0PC90cj5cclxuXHRcdFx0XHQ8dHIgc3R5bGU9XCJmb250LXdlaWdodDogYm9sZDtcIj5cclxuXHRcdFx0XHRcdDx0ZFxyXG5cdFx0XHRcdFx0XHRzdHlsZT1cInRleHQtYWxpZ246IHJpZ2h0O2JvcmRlcjogMXB4IHNvbGlkIGJsYWNrOyBjb2xvcjogd2hpdGU7YmFja2dyb3VuZC1jb2xvcjogZ3JleTtcIlxyXG5cdFx0XHRcdFx0PlxyXG5cdFx0XHRcdFx0XHRUb3RhbCAoe3sgYnVkZ2V0RHRvUHJpbWFyeS5idWRnZXQuc3VtbWFyeS5iYXNlQ3VycmVuY3kgfX0pJm5ic3A7Jm5ic3A7XHJcblx0XHRcdFx0XHQ8L3RkPlxyXG5cdFx0XHRcdFx0PHRkXHJcblx0XHRcdFx0XHRcdCpuZ0Zvcj1cImxldCB5ZWFyIG9mIGJ1ZGdldER0b1ByaW1hcnkuYnVkZ2V0LnN1bW1hcnkueWVhcnNcIlxyXG5cdFx0XHRcdFx0XHRzdHlsZT1cInRleHQtYWxpZ246IHJpZ2h0O2JvcmRlcjogMXB4IHNvbGlkIGJsYWNrOyBjb2xvcjogd2hpdGU7YmFja2dyb3VuZC1jb2xvcjogZ3JleTsgXCJcclxuXHRcdFx0XHRcdD5cclxuXHRcdFx0XHRcdFx0e3tcclxuXHRcdFx0XHRcdFx0XHR5ZWFyLnRvdGFsID09IDAgPyAnLScgOiAoeWVhci50b3RhbCB8IGN1cnJlbmN5OiAnZGVmYXVsdCc6Jyc6JzEuMC0wJylcclxuXHRcdFx0XHRcdFx0fX0mbmJzcDsmbmJzcDtcclxuXHRcdFx0XHRcdDwvdGQ+XHJcblx0XHRcdFx0XHQ8dGRcclxuXHRcdFx0XHRcdFx0c3R5bGU9XCJ0ZXh0LWFsaWduOiByaWdodDtib3JkZXI6IDFweCBzb2xpZCBibGFjazsgY29sb3I6IHdoaXRlO2JhY2tncm91bmQtY29sb3I6IGdyZXk7XCJcclxuXHRcdFx0XHRcdD5cclxuXHRcdFx0XHRcdFx0e3tcclxuXHRcdFx0XHRcdFx0XHRidWRnZXREdG9QcmltYXJ5LmJ1ZGdldC5zdW1tYXJ5LmJ1ZGdldFRvdGFsID09IDBcclxuXHRcdFx0XHRcdFx0XHRcdD8gJy0nXHJcblx0XHRcdFx0XHRcdFx0XHQ6IChidWRnZXREdG9QcmltYXJ5LmJ1ZGdldC5zdW1tYXJ5LmJ1ZGdldFRvdGFsXHJcblx0XHRcdFx0XHRcdFx0XHQgIHwgY3VycmVuY3k6ICdkZWZhdWx0JzonJzonMS4wLTAnKVxyXG5cdFx0XHRcdFx0XHR9fSZuYnNwOyZuYnNwO1xyXG5cdFx0XHRcdFx0PC90ZD5cclxuXHRcdFx0XHQ8L3RyPlxyXG5cdFx0XHQ8L3Rib2R5PlxyXG5cdFx0PC90YWJsZT5cclxuXHQ8L2Rpdj4gLS0+XHJcbjwvZGl2PlxyXG48IS0tIFNlY3VuZGFyeSBidWRnZXQgdG90YWwgc3VtbWFyeSAke3ByZXN1cHVlc3RvXzI4OF9yZXN1bWVDYXRlZ29yeVllYXJ9IC0tPlxyXG48ZGl2IHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIiBpZD1cInBsaS10b2tlbi1zZWN1bmRhcnktYnVkZ2V0LXRvdGFsLXN1bW1hcnlcIj5cclxuXHQ8ZGl2PlxyXG5cdFx0PHRhYmxlXHJcblx0XHRcdCpuZ0lmPVwiXHJcblx0XHRcdFx0YnVkZ2V0RHRvU2VjdW5kYXJ5ICE9PSBudWxsICYmXHJcblx0XHRcdFx0YnVkZ2V0RHRvU2VjdW5kYXJ5LmJ1ZGdldCAmJlxyXG5cdFx0XHRcdGJ1ZGdldER0b1NlY3VuZGFyeS5idWRnZXQuc3VtbWFyeVxyXG5cdFx0XHRcIlxyXG5cdFx0XHRzdHlsZT1cImJvcmRlci1zcGFjaW5nOiAycHg7IGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7IHdpZHRoOiAxMDAlO1wiXHJcblx0XHQ+XHJcblx0XHRcdDx0aGVhZD5cclxuXHRcdFx0XHQ8dHIgc3R5bGU9XCJmb250LXdlaWdodDogYm9sZDtcIj5cclxuXHRcdFx0XHRcdDx0ZFxyXG5cdFx0XHRcdFx0XHRzdHlsZT1cIlxyXG5cdFx0XHRcdFx0XHRcdHRleHQtYWxpZ246IGNlbnRlcjtcclxuXHRcdFx0XHRcdFx0XHRib3JkZXI6IDFweCBzb2xpZCBibGFjaztcclxuXHRcdFx0XHRcdFx0XHRjb2xvcjogd2hpdGU7XHJcblx0XHRcdFx0XHRcdFx0YmFja2dyb3VuZC1jb2xvcjogZ3JleTtcclxuXHRcdFx0XHRcdFx0XCJcclxuXHRcdFx0XHRcdD5cclxuXHRcdFx0XHRcdFx0UnVicm9cclxuXHRcdFx0XHRcdDwvdGQ+XHJcblx0XHRcdFx0XHQ8dGRcclxuXHRcdFx0XHRcdFx0Km5nRm9yPVwibGV0IHllYXIgb2YgYnVkZ2V0RHRvU2VjdW5kYXJ5LmJ1ZGdldC5zdW1tYXJ5LnllYXJzXCJcclxuXHRcdFx0XHRcdFx0c3R5bGU9XCJcclxuXHRcdFx0XHRcdFx0XHR0ZXh0LWFsaWduOiBjZW50ZXI7XHJcblx0XHRcdFx0XHRcdFx0Ym9yZGVyOiAxcHggc29saWQgYmxhY2s7XHJcblx0XHRcdFx0XHRcdFx0Y29sb3I6IHdoaXRlO1xyXG5cdFx0XHRcdFx0XHRcdGJhY2tncm91bmQtY29sb3I6IGdyZXk7XHJcblx0XHRcdFx0XHRcdFx0d2lkdGg6IDgwcHg7XHJcblx0XHRcdFx0XHRcdFwiXHJcblx0XHRcdFx0XHQ+XHJcblx0XHRcdFx0XHRcdHt7IHllYXIueWVhck51bWJlciB9fVxyXG5cdFx0XHRcdFx0PC90ZD5cclxuXHRcdFx0XHRcdDx0ZFxyXG5cdFx0XHRcdFx0XHRzdHlsZT1cIlxyXG5cdFx0XHRcdFx0XHRcdHRleHQtYWxpZ246IGNlbnRlcjtcclxuXHRcdFx0XHRcdFx0XHRib3JkZXI6IDFweCBzb2xpZCBibGFjaztcclxuXHRcdFx0XHRcdFx0XHRjb2xvcjogd2hpdGU7XHJcblx0XHRcdFx0XHRcdFx0YmFja2dyb3VuZC1jb2xvcjogZ3JleTtcclxuXHRcdFx0XHRcdFx0XHR3aWR0aDogMTEwcHg7XHJcblx0XHRcdFx0XHRcdFwiXHJcblx0XHRcdFx0XHQ+XHJcblx0XHRcdFx0XHRcdFRvdGFsICh7eyBidWRnZXREdG9TZWN1bmRhcnkuYnVkZ2V0LnN1bW1hcnkuYmFzZUN1cnJlbmN5IH19KVxyXG5cdFx0XHRcdFx0PC90ZD5cclxuXHRcdFx0XHQ8L3RyPlxyXG5cdFx0XHQ8L3RoZWFkPlxyXG5cdFx0XHQ8dGJvZHk+XHJcblx0XHRcdFx0PHRyXHJcblx0XHRcdFx0XHQqbmdGb3I9XCJcclxuXHRcdFx0XHRcdFx0bGV0IGNhdGVnb3J5IG9mIGJ1ZGdldER0b1NlY3VuZGFyeS5idWRnZXQuc3VtbWFyeS5jYXRlZ29yaWVzO1xyXG5cdFx0XHRcdFx0XHRsZXQgaUNhdCA9IGluZGV4XHJcblx0XHRcdFx0XHRcIlxyXG5cdFx0XHRcdD5cclxuXHRcdFx0XHRcdDx0ZCBzdHlsZT1cImZvbnQtd2VpZ2h0OiBib2xkOyB0ZXh0LWFsaWduOiBsZWZ0OyBib3JkZXI6IDFweCBzb2xpZCBibGFjaztcIj5cclxuXHRcdFx0XHRcdFx0Jm5ic3A7Jm5ic3A7e3tcclxuXHRcdFx0XHRcdFx0XHR0cmFuc2xhdGVDYXRlZ29yeShjYXRlZ29yeS5jYXRlZ29yeSlcclxuXHRcdFx0XHRcdFx0fX0mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtcclxuXHRcdFx0XHRcdDwvdGQ+XHJcblx0XHRcdFx0XHQ8dGRcclxuXHRcdFx0XHRcdFx0Km5nRm9yPVwibGV0IHllYXIgb2YgY2F0ZWdvcnkueWVhcnNcIlxyXG5cdFx0XHRcdFx0XHRzdHlsZT1cInRleHQtYWxpZ246IHJpZ2h0OyBib3JkZXI6IDFweCBzb2xpZCBibGFjaztcIlxyXG5cdFx0XHRcdFx0PlxyXG5cdFx0XHRcdFx0XHQmbmJzcDsmbmJzcDt7e1xyXG5cdFx0XHRcdFx0XHRcdHllYXIudG90YWwgPT0gMCA/ICctJyA6ICh5ZWFyLnRvdGFsIHwgY3VycmVuY3k6ICdkZWZhdWx0JzonJzonMS4wLTAnKVxyXG5cdFx0XHRcdFx0XHR9fSZuYnNwOyZuYnNwO1xyXG5cdFx0XHRcdFx0PC90ZD5cclxuXHRcdFx0XHRcdDx0ZCBzdHlsZT1cImZvbnQtd2VpZ2h0OiBib2xkOyB0ZXh0LWFsaWduOiByaWdodDsgYm9yZGVyOiAxcHggc29saWQgYmxhY2s7XCI+XHJcblx0XHRcdFx0XHRcdCZuYnNwOyZuYnNwO3t7XHJcblx0XHRcdFx0XHRcdFx0Y2F0ZWdvcnkudG90YWwgPT0gMFxyXG5cdFx0XHRcdFx0XHRcdFx0PyAnLSdcclxuXHRcdFx0XHRcdFx0XHRcdDogKGNhdGVnb3J5LnRvdGFsIHwgY3VycmVuY3k6ICdkZWZhdWx0JzonJzonMS4wLTAnKVxyXG5cdFx0XHRcdFx0XHR9fSZuYnNwOyZuYnNwO1xyXG5cdFx0XHRcdFx0PC90ZD5cclxuXHRcdFx0XHQ8L3RyPlxyXG5cdFx0XHRcdDx0ciBzdHlsZT1cImZvbnQtd2VpZ2h0OiBib2xkO1wiPlxyXG5cdFx0XHRcdFx0PHRkXHJcblx0XHRcdFx0XHRcdHN0eWxlPVwiXHJcblx0XHRcdFx0XHRcdFx0dGV4dC1hbGlnbjogcmlnaHQ7XHJcblx0XHRcdFx0XHRcdFx0Ym9yZGVyOiAxcHggc29saWQgYmxhY2s7XHJcblx0XHRcdFx0XHRcdFx0Y29sb3I6IHdoaXRlO1xyXG5cdFx0XHRcdFx0XHRcdGJhY2tncm91bmQtY29sb3I6IGdyZXk7XHJcblx0XHRcdFx0XHRcdFwiXHJcblx0XHRcdFx0XHQ+XHJcblx0XHRcdFx0XHRcdFRvdGFsICh7eyBidWRnZXREdG9TZWN1bmRhcnkuYnVkZ2V0LnN1bW1hcnkuYmFzZUN1cnJlbmN5IH19KSZuYnNwOyZuYnNwO1xyXG5cdFx0XHRcdFx0PC90ZD5cclxuXHRcdFx0XHRcdDx0ZFxyXG5cdFx0XHRcdFx0XHQqbmdGb3I9XCJsZXQgeWVhciBvZiBidWRnZXREdG9TZWN1bmRhcnkuYnVkZ2V0LnN1bW1hcnkueWVhcnNcIlxyXG5cdFx0XHRcdFx0XHRzdHlsZT1cIlxyXG5cdFx0XHRcdFx0XHRcdHRleHQtYWxpZ246IHJpZ2h0O1xyXG5cdFx0XHRcdFx0XHRcdGJvcmRlcjogMXB4IHNvbGlkIGJsYWNrO1xyXG5cdFx0XHRcdFx0XHRcdGNvbG9yOiB3aGl0ZTtcclxuXHRcdFx0XHRcdFx0XHRiYWNrZ3JvdW5kLWNvbG9yOiBncmV5O1xyXG5cdFx0XHRcdFx0XHRcIlxyXG5cdFx0XHRcdFx0PlxyXG5cdFx0XHRcdFx0XHR7e1xyXG5cdFx0XHRcdFx0XHRcdHllYXIudG90YWwgPT0gMCA/ICctJyA6ICh5ZWFyLnRvdGFsIHwgY3VycmVuY3k6ICdkZWZhdWx0JzonJzonMS4wLTAnKVxyXG5cdFx0XHRcdFx0XHR9fSZuYnNwOyZuYnNwO1xyXG5cdFx0XHRcdFx0PC90ZD5cclxuXHRcdFx0XHRcdDx0ZFxyXG5cdFx0XHRcdFx0XHRzdHlsZT1cIlxyXG5cdFx0XHRcdFx0XHRcdHRleHQtYWxpZ246IHJpZ2h0O1xyXG5cdFx0XHRcdFx0XHRcdGJvcmRlcjogMXB4IHNvbGlkIGJsYWNrO1xyXG5cdFx0XHRcdFx0XHRcdGNvbG9yOiB3aGl0ZTtcclxuXHRcdFx0XHRcdFx0XHRiYWNrZ3JvdW5kLWNvbG9yOiBncmV5O1xyXG5cdFx0XHRcdFx0XHRcIlxyXG5cdFx0XHRcdFx0PlxyXG5cdFx0XHRcdFx0XHR7e1xyXG5cdFx0XHRcdFx0XHRcdGJ1ZGdldER0b1NlY3VuZGFyeS5idWRnZXQuc3VtbWFyeS5idWRnZXRUb3RhbCA9PSAwXHJcblx0XHRcdFx0XHRcdFx0XHQ/ICctJ1xyXG5cdFx0XHRcdFx0XHRcdFx0OiAoYnVkZ2V0RHRvU2VjdW5kYXJ5LmJ1ZGdldC5zdW1tYXJ5LmJ1ZGdldFRvdGFsXHJcblx0XHRcdFx0XHRcdFx0XHQgIHwgY3VycmVuY3k6ICdkZWZhdWx0JzonJzonMS4wLTAnKVxyXG5cdFx0XHRcdFx0XHR9fSZuYnNwOyZuYnNwO1xyXG5cdFx0XHRcdFx0PC90ZD5cclxuXHRcdFx0XHQ8L3RyPlxyXG5cdFx0XHQ8L3Rib2R5PlxyXG5cdFx0PC90YWJsZT5cclxuXHQ8L2Rpdj5cclxuPC9kaXY+XHJcbiJdfQ==