@lowcodeunit/applications-flow-common 1.33.156-lets-get-social-ish → 1.33.157-lets-get-social-ish

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (265) hide show
  1. package/esm2020/lcu.api.mjs +76 -0
  2. package/esm2020/lib/applications-flow.module.mjs +328 -0
  3. package/esm2020/lib/controls/build-pipeline-form/build-pipeline-form.component.mjs +242 -0
  4. package/esm2020/lib/controls/devops-source-control-form/devops-source-control-form.component.mjs +446 -0
  5. package/esm2020/lib/controls/edit-application-form/edit-application-form.component.mjs +67 -0
  6. package/esm2020/lib/controls/processor-details-form/processor-details-form.component.mjs +318 -0
  7. package/esm2020/lib/controls/security-toggle/security-toggle.component.mjs +58 -0
  8. package/esm2020/lib/controls/source-control-form/source-control-form.component.mjs +69 -0
  9. package/esm2020/lib/dialogs/build-pipeline-dialog/build-pipeline-dialog.component.mjs +29 -0
  10. package/esm2020/lib/dialogs/custom-domain-dialog/custom-domain-dialog.component.mjs +35 -0
  11. package/esm2020/lib/dialogs/edit-application-dialog/edit-application-dialog.component.mjs +33 -0
  12. package/esm2020/lib/dialogs/source-control-dialog/source-control-dialog.component.mjs +29 -0
  13. package/esm2020/lib/elements/analytics-card/analytics-card.component.mjs +28 -0
  14. package/esm2020/lib/elements/base-form/base-form.component.mjs +57 -0
  15. package/esm2020/lib/elements/breadcrumb/breadcrumb.component.mjs +115 -0
  16. package/esm2020/lib/elements/card-carousel/card-carousel.component.mjs +70 -0
  17. package/esm2020/lib/elements/dynamic-tabs/dynamic-tabs.component.mjs +74 -0
  18. package/esm2020/lib/elements/feed-card-sm/feed-card-sm.component.mjs +40 -0
  19. package/esm2020/lib/elements/flow-tool/flow-tool.component.mjs +75 -0
  20. package/esm2020/lib/elements/form-card/form-card.component.mjs +33 -0
  21. package/esm2020/lib/elements/gh-control/gh-control.component.mjs +78 -0
  22. package/esm2020/lib/elements/main-feed-card/main-feed-card.component.mjs +34 -0
  23. package/esm2020/lib/elements/project-info-card/project-info-card.component.mjs +60 -0
  24. package/esm2020/lib/elements/projects/controls/builds/builds.component.mjs +32 -0
  25. package/esm2020/lib/elements/projects/controls/create-project-wizard/create-project-wizard.component.mjs +145 -0
  26. package/esm2020/lib/elements/projects/controls/forms/source-control/source-control.component.mjs +285 -0
  27. package/esm2020/lib/elements/projects/controls/git-auth/git-auth.component.mjs +26 -0
  28. package/esm2020/lib/elements/projects/controls/header/header.component.mjs +83 -0
  29. package/esm2020/lib/elements/projects/controls/hosting-details-form-group/hosting-details-form-group.component.mjs +118 -0
  30. package/esm2020/lib/elements/projects/controls/project-items/project-items.component.mjs +54 -0
  31. package/esm2020/lib/elements/projects/controls/project-tabs/project-tabs.component.mjs +103 -0
  32. package/esm2020/lib/elements/projects/controls/recent-activities/recent-activities.component.mjs +14 -0
  33. package/esm2020/lib/elements/projects/controls/tabs/apps-flow/apps-flow.component.mjs +561 -0
  34. package/esm2020/lib/elements/projects/controls/tabs/apps-flow/npm-package-select/npm-package-select.component.mjs +72 -0
  35. package/esm2020/lib/elements/projects/controls/tabs/devops/devops.component.mjs +242 -0
  36. package/esm2020/lib/elements/projects/controls/tabs/dfs-modifiers/dfs-modifiers.component.mjs +179 -0
  37. package/esm2020/lib/elements/projects/controls/tabs/domains/domains.component.mjs +140 -0
  38. package/esm2020/lib/elements/projects/controls/tabs/general/forms/base-form-test/base-form-test.component.mjs +90 -0
  39. package/esm2020/lib/elements/projects/controls/tabs/general/forms/project-details/project-details.component.mjs +142 -0
  40. package/esm2020/lib/elements/projects/controls/tabs/general/forms/root-directory/root-directory.component.mjs +124 -0
  41. package/esm2020/lib/elements/projects/controls/tabs/general/general.component.mjs +40 -0
  42. package/esm2020/lib/elements/projects/projects.component.mjs +92 -0
  43. package/esm2020/lib/elements/slotted-card/slotted-card.component.mjs +49 -0
  44. package/esm2020/lib/elements/three-column/three-column.component.mjs +30 -0
  45. package/esm2020/lib/elements/two-column-header/two-column-header.component.mjs +15 -0
  46. package/esm2020/lib/models/actions.model.mjs +3 -0
  47. package/esm2020/lib/models/base-form-config.model.mjs +6 -0
  48. package/esm2020/lib/models/card-form-config.model.mjs +6 -0
  49. package/esm2020/lib/models/dev-settings-preset.model.mjs +3 -0
  50. package/esm2020/lib/models/domain.model.mjs +3 -0
  51. package/esm2020/lib/models/dynamic-tabs.model.mjs +6 -0
  52. package/esm2020/lib/models/form-actions.model.mjs +3 -0
  53. package/esm2020/lib/models/form.model.mjs +6 -0
  54. package/esm2020/lib/models/form.values.model.mjs +11 -0
  55. package/esm2020/lib/models/project-actions.model.mjs +6 -0
  56. package/esm2020/lib/models/user-feed.model.mjs +12 -0
  57. package/{esm2015/lib/services/applications-flow.service.js → esm2020/lib/services/applications-flow.service.mjs} +9 -13
  58. package/esm2020/lib/services/eac.service.mjs +176 -0
  59. package/esm2020/lib/services/forms.service.mjs +132 -0
  60. package/esm2020/lib/services/npm.service.mjs +77 -0
  61. package/esm2020/lib/services/project.service.mjs +323 -0
  62. package/esm2020/lib/state/applications-flow-state.context.mjs +36 -0
  63. package/esm2020/lib/state/applications-flow.state.mjs +72 -0
  64. package/esm2020/lowcodeunit-applications-flow-common.mjs +5 -0
  65. package/fesm2015/lowcodeunit-applications-flow-common.mjs +5596 -0
  66. package/fesm2015/lowcodeunit-applications-flow-common.mjs.map +1 -0
  67. package/fesm2020/lowcodeunit-applications-flow-common.mjs +5472 -0
  68. package/fesm2020/lowcodeunit-applications-flow-common.mjs.map +1 -0
  69. package/lcu.api.d.ts +39 -2
  70. package/lib/applications-flow.module.d.ts +53 -1
  71. package/lib/controls/build-pipeline-form/build-pipeline-form.component.d.ts +3 -1
  72. package/lib/controls/devops-source-control-form/devops-source-control-form.component.d.ts +3 -1
  73. package/lib/controls/edit-application-form/edit-application-form.component.d.ts +3 -1
  74. package/lib/controls/processor-details-form/processor-details-form.component.d.ts +3 -1
  75. package/lib/controls/security-toggle/security-toggle.component.d.ts +3 -1
  76. package/lib/controls/source-control-form/source-control-form.component.d.ts +3 -1
  77. package/lib/dialogs/build-pipeline-dialog/build-pipeline-dialog.component.d.ts +3 -1
  78. package/lib/dialogs/custom-domain-dialog/custom-domain-dialog.component.d.ts +3 -1
  79. package/lib/dialogs/edit-application-dialog/edit-application-dialog.component.d.ts +3 -1
  80. package/lib/dialogs/source-control-dialog/source-control-dialog.component.d.ts +3 -1
  81. package/lib/elements/analytics-card/analytics-card.component.d.ts +3 -1
  82. package/lib/elements/base-form/base-form.component.d.ts +3 -1
  83. package/lib/elements/breadcrumb/breadcrumb.component.d.ts +3 -1
  84. package/lib/elements/card-carousel/card-carousel.component.d.ts +3 -1
  85. package/lib/elements/dynamic-tabs/dynamic-tabs.component.d.ts +3 -1
  86. package/lib/elements/feed-card-sm/feed-card-sm.component.d.ts +3 -1
  87. package/lib/elements/flow-tool/flow-tool.component.d.ts +28 -0
  88. package/lib/elements/form-card/form-card.component.d.ts +3 -1
  89. package/lib/elements/gh-control/gh-control.component.d.ts +3 -1
  90. package/lib/elements/main-feed-card/main-feed-card.component.d.ts +3 -1
  91. package/lib/elements/project-info-card/project-info-card.component.d.ts +3 -1
  92. package/lib/elements/projects/controls/builds/builds.component.d.ts +3 -1
  93. package/lib/elements/projects/controls/create-project-wizard/create-project-wizard.component.d.ts +3 -1
  94. package/lib/elements/projects/controls/forms/source-control/source-control.component.d.ts +3 -1
  95. package/lib/elements/projects/controls/git-auth/git-auth.component.d.ts +3 -1
  96. package/lib/elements/projects/controls/header/header.component.d.ts +3 -1
  97. package/lib/elements/projects/controls/hosting-details-form-group/hosting-details-form-group.component.d.ts +3 -1
  98. package/lib/elements/projects/controls/project-items/project-items.component.d.ts +3 -1
  99. package/lib/elements/projects/controls/project-tabs/project-tabs.component.d.ts +3 -1
  100. package/lib/elements/projects/controls/recent-activities/recent-activities.component.d.ts +3 -1
  101. package/lib/elements/projects/controls/tabs/apps-flow/apps-flow.component.d.ts +3 -1
  102. package/lib/elements/projects/controls/tabs/apps-flow/npm-package-select/npm-package-select.component.d.ts +3 -1
  103. package/lib/elements/projects/controls/tabs/devops/devops.component.d.ts +3 -1
  104. package/lib/elements/projects/controls/tabs/dfs-modifiers/dfs-modifiers.component.d.ts +3 -1
  105. package/lib/elements/projects/controls/tabs/domains/domains.component.d.ts +3 -1
  106. package/lib/elements/projects/controls/tabs/general/forms/base-form-test/base-form-test.component.d.ts +3 -1
  107. package/lib/elements/projects/controls/tabs/general/forms/project-details/project-details.component.d.ts +3 -1
  108. package/lib/elements/projects/controls/tabs/general/forms/root-directory/root-directory.component.d.ts +3 -1
  109. package/lib/elements/projects/controls/tabs/general/general.component.d.ts +3 -1
  110. package/lib/elements/projects/projects.component.d.ts +3 -1
  111. package/lib/elements/slotted-card/slotted-card.component.d.ts +3 -1
  112. package/lib/elements/three-column/three-column.component.d.ts +3 -1
  113. package/lib/elements/two-column-header/two-column-header.component.d.ts +3 -1
  114. package/lib/models/actions.model.d.ts +0 -1
  115. package/lib/models/base-form-config.model.d.ts +0 -1
  116. package/lib/models/card-form-config.model.d.ts +0 -1
  117. package/lib/models/dev-settings-preset.model.d.ts +0 -1
  118. package/lib/models/domain.model.d.ts +0 -1
  119. package/lib/models/dynamic-tabs.model.d.ts +0 -1
  120. package/lib/models/form-actions.model.d.ts +0 -1
  121. package/lib/models/form.model.d.ts +0 -1
  122. package/lib/models/form.values.model.d.ts +0 -1
  123. package/lib/models/project-actions.model.d.ts +0 -1
  124. package/lib/models/user-feed.model.d.ts +0 -1
  125. package/lib/services/applications-flow.service.d.ts +3 -1
  126. package/lib/services/eac.service.d.ts +3 -1
  127. package/lib/services/forms.service.d.ts +3 -1
  128. package/lib/services/npm.service.d.ts +3 -1
  129. package/lib/services/project.service.d.ts +3 -1
  130. package/lib/state/applications-flow-state.context.d.ts +3 -1
  131. package/lib/state/applications-flow.state.d.ts +0 -1
  132. package/lowcodeunit-applications-flow-common.d.ts +1 -25
  133. package/package.json +20 -12
  134. package/bundles/lowcodeunit-applications-flow-common.umd.js +0 -6968
  135. package/bundles/lowcodeunit-applications-flow-common.umd.js.map +0 -1
  136. package/bundles/lowcodeunit-applications-flow-common.umd.min.js +0 -16
  137. package/bundles/lowcodeunit-applications-flow-common.umd.min.js.map +0 -1
  138. package/esm2015/lcu.api.js +0 -38
  139. package/esm2015/lib/applications-flow.module.js +0 -218
  140. package/esm2015/lib/controls/build-pipeline-form/build-pipeline-form.component.js +0 -210
  141. package/esm2015/lib/controls/devops-source-control-form/devops-source-control-form.component.js +0 -412
  142. package/esm2015/lib/controls/edit-application-form/edit-application-form.component.js +0 -60
  143. package/esm2015/lib/controls/processor-details-form/processor-details-form.component.js +0 -330
  144. package/esm2015/lib/controls/security-toggle/security-toggle.component.js +0 -51
  145. package/esm2015/lib/controls/source-control-form/source-control-form.component.js +0 -61
  146. package/esm2015/lib/dialogs/build-pipeline-dialog/build-pipeline-dialog.component.js +0 -25
  147. package/esm2015/lib/dialogs/custom-domain-dialog/custom-domain-dialog.component.js +0 -31
  148. package/esm2015/lib/dialogs/edit-application-dialog/edit-application-dialog.component.js +0 -29
  149. package/esm2015/lib/dialogs/source-control-dialog/source-control-dialog.component.js +0 -25
  150. package/esm2015/lib/elements/analytics-card/analytics-card.component.js +0 -21
  151. package/esm2015/lib/elements/base-form/base-form.component.js +0 -61
  152. package/esm2015/lib/elements/breadcrumb/breadcrumb.component.js +0 -113
  153. package/esm2015/lib/elements/card-carousel/card-carousel.component.js +0 -67
  154. package/esm2015/lib/elements/dynamic-tabs/dynamic-tabs.component.js +0 -69
  155. package/esm2015/lib/elements/feed-card-sm/feed-card-sm.component.js +0 -31
  156. package/esm2015/lib/elements/form-card/form-card.component.js +0 -22
  157. package/esm2015/lib/elements/gh-control/gh-control.component.js +0 -72
  158. package/esm2015/lib/elements/main-feed-card/main-feed-card.component.js +0 -24
  159. package/esm2015/lib/elements/project-info-card/project-info-card.component.js +0 -39
  160. package/esm2015/lib/elements/projects/controls/builds/builds.component.js +0 -26
  161. package/esm2015/lib/elements/projects/controls/create-project-wizard/create-project-wizard.component.js +0 -145
  162. package/esm2015/lib/elements/projects/controls/forms/source-control/source-control.component.js +0 -262
  163. package/esm2015/lib/elements/projects/controls/git-auth/git-auth.component.js +0 -25
  164. package/esm2015/lib/elements/projects/controls/header/header.component.js +0 -75
  165. package/esm2015/lib/elements/projects/controls/hosting-details-form-group/hosting-details-form-group.component.js +0 -102
  166. package/esm2015/lib/elements/projects/controls/project-items/project-items.component.js +0 -49
  167. package/esm2015/lib/elements/projects/controls/project-tabs/project-tabs.component.js +0 -91
  168. package/esm2015/lib/elements/projects/controls/recent-activities/recent-activities.component.js +0 -15
  169. package/esm2015/lib/elements/projects/controls/tabs/apps-flow/apps-flow.component.js +0 -590
  170. package/esm2015/lib/elements/projects/controls/tabs/apps-flow/npm-package-select/npm-package-select.component.js +0 -62
  171. package/esm2015/lib/elements/projects/controls/tabs/devops/devops.component.js +0 -202
  172. package/esm2015/lib/elements/projects/controls/tabs/dfs-modifiers/dfs-modifiers.component.js +0 -178
  173. package/esm2015/lib/elements/projects/controls/tabs/domains/domains.component.js +0 -133
  174. package/esm2015/lib/elements/projects/controls/tabs/general/forms/base-form-test/base-form-test.component.js +0 -86
  175. package/esm2015/lib/elements/projects/controls/tabs/general/forms/project-details/project-details.component.js +0 -129
  176. package/esm2015/lib/elements/projects/controls/tabs/general/forms/root-directory/root-directory.component.js +0 -113
  177. package/esm2015/lib/elements/projects/controls/tabs/general/general.component.js +0 -46
  178. package/esm2015/lib/elements/projects/projects.component.js +0 -92
  179. package/esm2015/lib/elements/slotted-card/slotted-card.component.js +0 -30
  180. package/esm2015/lib/elements/three-column/three-column.component.js +0 -32
  181. package/esm2015/lib/elements/two-column-header/two-column-header.component.js +0 -15
  182. package/esm2015/lib/models/actions.model.js +0 -3
  183. package/esm2015/lib/models/base-form-config.model.js +0 -6
  184. package/esm2015/lib/models/card-form-config.model.js +0 -6
  185. package/esm2015/lib/models/dev-settings-preset.model.js +0 -3
  186. package/esm2015/lib/models/domain.model.js +0 -3
  187. package/esm2015/lib/models/dynamic-tabs.model.js +0 -6
  188. package/esm2015/lib/models/form-actions.model.js +0 -3
  189. package/esm2015/lib/models/form.model.js +0 -6
  190. package/esm2015/lib/models/form.values.model.js +0 -11
  191. package/esm2015/lib/models/project-actions.model.js +0 -6
  192. package/esm2015/lib/models/user-feed.model.js +0 -12
  193. package/esm2015/lib/services/eac.service.js +0 -223
  194. package/esm2015/lib/services/forms.service.js +0 -131
  195. package/esm2015/lib/services/npm.service.js +0 -79
  196. package/esm2015/lib/services/project.service.js +0 -340
  197. package/esm2015/lib/state/applications-flow-state.context.js +0 -37
  198. package/esm2015/lib/state/applications-flow.state.js +0 -72
  199. package/esm2015/lowcodeunit-applications-flow-common.js +0 -29
  200. package/fesm2015/lowcodeunit-applications-flow-common.js +0 -5364
  201. package/fesm2015/lowcodeunit-applications-flow-common.js.map +0 -1
  202. package/lcu.api.d.ts.map +0 -1
  203. package/lib/applications-flow.module.d.ts.map +0 -1
  204. package/lib/controls/build-pipeline-form/build-pipeline-form.component.d.ts.map +0 -1
  205. package/lib/controls/devops-source-control-form/devops-source-control-form.component.d.ts.map +0 -1
  206. package/lib/controls/edit-application-form/edit-application-form.component.d.ts.map +0 -1
  207. package/lib/controls/processor-details-form/processor-details-form.component.d.ts.map +0 -1
  208. package/lib/controls/security-toggle/security-toggle.component.d.ts.map +0 -1
  209. package/lib/controls/source-control-form/source-control-form.component.d.ts.map +0 -1
  210. package/lib/dialogs/build-pipeline-dialog/build-pipeline-dialog.component.d.ts.map +0 -1
  211. package/lib/dialogs/custom-domain-dialog/custom-domain-dialog.component.d.ts.map +0 -1
  212. package/lib/dialogs/edit-application-dialog/edit-application-dialog.component.d.ts.map +0 -1
  213. package/lib/dialogs/source-control-dialog/source-control-dialog.component.d.ts.map +0 -1
  214. package/lib/elements/analytics-card/analytics-card.component.d.ts.map +0 -1
  215. package/lib/elements/base-form/base-form.component.d.ts.map +0 -1
  216. package/lib/elements/breadcrumb/breadcrumb.component.d.ts.map +0 -1
  217. package/lib/elements/card-carousel/card-carousel.component.d.ts.map +0 -1
  218. package/lib/elements/dynamic-tabs/dynamic-tabs.component.d.ts.map +0 -1
  219. package/lib/elements/feed-card-sm/feed-card-sm.component.d.ts.map +0 -1
  220. package/lib/elements/form-card/form-card.component.d.ts.map +0 -1
  221. package/lib/elements/gh-control/gh-control.component.d.ts.map +0 -1
  222. package/lib/elements/main-feed-card/main-feed-card.component.d.ts.map +0 -1
  223. package/lib/elements/project-info-card/project-info-card.component.d.ts.map +0 -1
  224. package/lib/elements/projects/controls/builds/builds.component.d.ts.map +0 -1
  225. package/lib/elements/projects/controls/create-project-wizard/create-project-wizard.component.d.ts.map +0 -1
  226. package/lib/elements/projects/controls/forms/source-control/source-control.component.d.ts.map +0 -1
  227. package/lib/elements/projects/controls/git-auth/git-auth.component.d.ts.map +0 -1
  228. package/lib/elements/projects/controls/header/header.component.d.ts.map +0 -1
  229. package/lib/elements/projects/controls/hosting-details-form-group/hosting-details-form-group.component.d.ts.map +0 -1
  230. package/lib/elements/projects/controls/project-items/project-items.component.d.ts.map +0 -1
  231. package/lib/elements/projects/controls/project-tabs/project-tabs.component.d.ts.map +0 -1
  232. package/lib/elements/projects/controls/recent-activities/recent-activities.component.d.ts.map +0 -1
  233. package/lib/elements/projects/controls/tabs/apps-flow/apps-flow.component.d.ts.map +0 -1
  234. package/lib/elements/projects/controls/tabs/apps-flow/npm-package-select/npm-package-select.component.d.ts.map +0 -1
  235. package/lib/elements/projects/controls/tabs/devops/devops.component.d.ts.map +0 -1
  236. package/lib/elements/projects/controls/tabs/dfs-modifiers/dfs-modifiers.component.d.ts.map +0 -1
  237. package/lib/elements/projects/controls/tabs/domains/domains.component.d.ts.map +0 -1
  238. package/lib/elements/projects/controls/tabs/general/forms/base-form-test/base-form-test.component.d.ts.map +0 -1
  239. package/lib/elements/projects/controls/tabs/general/forms/project-details/project-details.component.d.ts.map +0 -1
  240. package/lib/elements/projects/controls/tabs/general/forms/root-directory/root-directory.component.d.ts.map +0 -1
  241. package/lib/elements/projects/controls/tabs/general/general.component.d.ts.map +0 -1
  242. package/lib/elements/projects/projects.component.d.ts.map +0 -1
  243. package/lib/elements/slotted-card/slotted-card.component.d.ts.map +0 -1
  244. package/lib/elements/three-column/three-column.component.d.ts.map +0 -1
  245. package/lib/elements/two-column-header/two-column-header.component.d.ts.map +0 -1
  246. package/lib/models/actions.model.d.ts.map +0 -1
  247. package/lib/models/base-form-config.model.d.ts.map +0 -1
  248. package/lib/models/card-form-config.model.d.ts.map +0 -1
  249. package/lib/models/dev-settings-preset.model.d.ts.map +0 -1
  250. package/lib/models/domain.model.d.ts.map +0 -1
  251. package/lib/models/dynamic-tabs.model.d.ts.map +0 -1
  252. package/lib/models/form-actions.model.d.ts.map +0 -1
  253. package/lib/models/form.model.d.ts.map +0 -1
  254. package/lib/models/form.values.model.d.ts.map +0 -1
  255. package/lib/models/project-actions.model.d.ts.map +0 -1
  256. package/lib/models/user-feed.model.d.ts.map +0 -1
  257. package/lib/services/applications-flow.service.d.ts.map +0 -1
  258. package/lib/services/eac.service.d.ts.map +0 -1
  259. package/lib/services/forms.service.d.ts.map +0 -1
  260. package/lib/services/npm.service.d.ts.map +0 -1
  261. package/lib/services/project.service.d.ts.map +0 -1
  262. package/lib/state/applications-flow-state.context.d.ts.map +0 -1
  263. package/lib/state/applications-flow.state.d.ts.map +0 -1
  264. package/lowcodeunit-applications-flow-common.d.ts.map +0 -1
  265. package/lowcodeunit-applications-flow-common.metadata.json +0 -1
@@ -0,0 +1,242 @@
1
+ import { Component, Input } from '@angular/core';
2
+ import { Validators, } from '@angular/forms';
3
+ import { Guid } from '@lcu/common';
4
+ import { ProjectHostingDetails, } from '../../state/applications-flow.state';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "../../services/eac.service";
7
+ import * as i2 from "@angular/forms";
8
+ import * as i3 from "../../services/applications-flow.service";
9
+ import * as i4 from "@angular/material/card";
10
+ import * as i5 from "@angular/material/form-field";
11
+ import * as i6 from "@angular/material/select";
12
+ import * as i7 from "@angular/material/core";
13
+ import * as i8 from "@angular/material/icon";
14
+ import * as i9 from "@lowcodeunit/app-host-common";
15
+ import * as i10 from "@angular/material/button";
16
+ import * as i11 from "@angular/common";
17
+ import * as i12 from "@angular/material/input";
18
+ import * as i13 from "@angular/flex-layout/flex";
19
+ export class BuildPipelineFormComponent {
20
+ constructor(eacSvc, formBuilder, appsFlowSvc) {
21
+ this.eacSvc = eacSvc;
22
+ this.formBuilder = formBuilder;
23
+ this.appsFlowSvc = appsFlowSvc;
24
+ this.HostingDetails = new ProjectHostingDetails();
25
+ }
26
+ get Artifact() {
27
+ // console.log("ARTIFACT: ", this.Environment?.Artifacts[this.ArtifactLookup]);
28
+ return this.Environment?.Artifacts && this.ArtifactLookup
29
+ ? this.Environment?.Artifacts[this.ArtifactLookup] || {}
30
+ : {};
31
+ }
32
+ get ArtifactLookup() {
33
+ const artLookup = this.DevOpsAction?.ArtifactLookups
34
+ ? this.DevOpsAction?.ArtifactLookups[0]
35
+ : null;
36
+ return artLookup;
37
+ }
38
+ get BuildPipelineFormControl() {
39
+ return this.BuildPipelineFormGroup?.get('buildPipeline');
40
+ }
41
+ get DevOpsAction() {
42
+ return this.Environment.DevOpsActions && this.DevOpsActionLookup
43
+ ? this.Environment.DevOpsActions[this.DevOpsActionLookup] || {}
44
+ : {};
45
+ }
46
+ get DevOpsActions() {
47
+ return this.Environment.DevOpsActions || {};
48
+ }
49
+ get DevOpsActionNameFormControl() {
50
+ return this.BuildPipelineFormGroup.get('devOpsActionName');
51
+ }
52
+ get NPMTokenFormControl() {
53
+ return this.BuildPipelineFormGroup.get('npmToken');
54
+ }
55
+ // (ho) => ho.Lookup === this.BuildPipeline
56
+ get SelectedHostingOption() {
57
+ return this.HostingDetails?.HostingOptions?.find((ho) => ho.Lookup === this.BuildPipeline);
58
+ }
59
+ get SelectedHostingOptionInputControlValues() {
60
+ return this.SelectedHostingOption?.Inputs?.reduce((prev, cur) => {
61
+ const res = {
62
+ ...prev,
63
+ };
64
+ res[cur.Lookup] = this.BuildPipelineFormGroup.controls[cur.Lookup].value;
65
+ return res;
66
+ }, {});
67
+ }
68
+ get SourceControlLookups() {
69
+ return Object.keys(this.SourceControls || {});
70
+ }
71
+ get SourceControls() {
72
+ return this.Environment.Sources || {};
73
+ }
74
+ ngOnInit() {
75
+ // console.log('BuildPipeline = ', this.BuildPipeline)
76
+ // this.BuildPipelineFormGroup = this.formBuilder.group({});
77
+ // if (this.BuildPipelineFormGroup != null) {
78
+ // this.BuildPipelineFormGroup.removeControl('hostingDetails');
79
+ // }
80
+ // this.BuildPipelineFormGroup.addControl(
81
+ // 'hostingDetails',
82
+ this.BuildPipelineFormGroup = this.formBuilder.group({
83
+ buildPipeline: [this.BuildPipeline, [Validators.required]],
84
+ });
85
+ // );
86
+ this.loadProjectHostingDetails();
87
+ // this.setupControlsForForm();
88
+ }
89
+ //API METHODS
90
+ BuildPipelineChanged() {
91
+ //for some reason this value is coming back undefined
92
+ // console.log("build pipeline value: ", this.BuildPipelineFormControl?.value)
93
+ this.BuildPipeline = this.BuildPipelineFormControl?.value;
94
+ this.setupControlsForForm();
95
+ }
96
+ SubmitBuildPipeline() {
97
+ // console.log("submitting build pipeline: ", this.BuildPipelineFormGroup.value);
98
+ this.SaveEnvironment();
99
+ }
100
+ SaveEnvironment() {
101
+ const saveEnvReq = {
102
+ Environment: {
103
+ ...this.Environment,
104
+ Artifacts: this.Environment.Artifacts || {},
105
+ DevOpsActions: this.Environment.DevOpsActions || {},
106
+ Secrets: this.Environment.Secrets || {},
107
+ Sources: this.Environment.Sources || {},
108
+ },
109
+ EnvironmentLookup: this.EnvironmentLookup,
110
+ EnterpriseDataTokens: {},
111
+ };
112
+ let artifactLookup;
113
+ let artifact = {
114
+ ...this.Artifact,
115
+ ...this.SelectedHostingOptionInputControlValues,
116
+ };
117
+ if (!this.ArtifactLookup) {
118
+ artifactLookup = Guid.CreateRaw();
119
+ artifact = {
120
+ ...artifact,
121
+ Type: this.SelectedHostingOption.ArtifactType,
122
+ Name: this.SelectedHostingOption.Name,
123
+ NPMRegistry: 'https://registry.npmjs.org/',
124
+ };
125
+ }
126
+ else {
127
+ artifactLookup = this.ArtifactLookup;
128
+ }
129
+ saveEnvReq.Environment.Artifacts[artifactLookup] = artifact;
130
+ let devOpsActionLookup;
131
+ if (!this.DevOpsActionLookup) {
132
+ devOpsActionLookup = Guid.CreateRaw();
133
+ const doa = {
134
+ ...this.DevOpsAction,
135
+ ArtifactLookups: [artifactLookup],
136
+ Name: this.DevOpsActionNameFormControl.value,
137
+ Path: this.SelectedHostingOption.Path,
138
+ Templates: this.SelectedHostingOption.Templates,
139
+ };
140
+ if (this.NPMTokenFormControl?.value) {
141
+ const secretLookup = 'npm-access-token';
142
+ doa.SecretLookups = [secretLookup];
143
+ saveEnvReq.Environment.Secrets[secretLookup] = {
144
+ Name: 'NPM Access Token',
145
+ DataTokenLookup: secretLookup,
146
+ KnownAs: 'NPM_TOKEN',
147
+ };
148
+ saveEnvReq.EnterpriseDataTokens[secretLookup] = {
149
+ Name: saveEnvReq.Environment.Secrets[secretLookup].Name,
150
+ Description: saveEnvReq.Environment.Secrets[secretLookup].Name,
151
+ Value: this.NPMTokenFormControl.value,
152
+ };
153
+ }
154
+ saveEnvReq.Environment.DevOpsActions[devOpsActionLookup] = doa;
155
+ }
156
+ else {
157
+ devOpsActionLookup = this.DevOpsActionLookup;
158
+ const doa = {
159
+ ...this.DevOpsAction,
160
+ Name: this.DevOpsActionNameFormControl.value,
161
+ };
162
+ saveEnvReq.Environment.DevOpsActions[devOpsActionLookup] = doa;
163
+ }
164
+ this.eacSvc.SaveEnvironmentAsCode(saveEnvReq);
165
+ }
166
+ // Helpers
167
+ setupControlsForForm() {
168
+ // this.BuildPipeline =
169
+ // this.BuildPipeline || this.HostingDetails?.HostingOptions
170
+ // ? this.HostingDetails?.HostingOptions[0]?.Lookup
171
+ // : '';
172
+ // console.log("hosting details: ", this.HostingDetails)
173
+ for (const ctrlName in this.BuildPipelineFormGroup.controls) {
174
+ //devOpsAction doesn't exist
175
+ //removes hosting details
176
+ if (ctrlName !== 'buildPipeline' && ctrlName !== 'devOpsAction') {
177
+ // console.log("removing control: ", ctrlName)
178
+ this.BuildPipelineFormGroup.removeControl(ctrlName);
179
+ }
180
+ }
181
+ this.BuildPipelineFormGroup.addControl('devOpsActionName', this.formBuilder.control(this.DevOpsAction?.Name || this.SelectedHostingOption?.Name || '', [Validators.required]));
182
+ // console.log("selected hosting options: ", this.SelectedHostingOption.Inputs);
183
+ this.SelectedHostingOption?.Inputs?.forEach((input) => {
184
+ const validators = input.Required ? [Validators.required] : [];
185
+ this.BuildPipelineFormGroup.addControl(input.Lookup, this.formBuilder.control(this.Artifact[input.Lookup] || input.DefaultValue || '', validators));
186
+ // if (this.Disabled) {
187
+ // this.FormGroup.controls[input.Lookup].disable();
188
+ // }
189
+ });
190
+ if (this.BuildPipelineFormControl?.value === 'npm-release') {
191
+ if (!this.BuildPipelineFormGroup.controls.npmToken) {
192
+ this.BuildPipelineFormGroup.addControl('npmToken', this.formBuilder.control('', this.Disabled ? [] : [Validators.required]));
193
+ if (this.Disabled) {
194
+ this.BuildPipelineFormGroup.controls.npmToken.disable();
195
+ }
196
+ }
197
+ }
198
+ else if (this.BuildPipelineFormControl?.value === 'github-artifacts-release') {
199
+ if (this.BuildPipelineFormGroup.controls.npmToken) {
200
+ this.BuildPipelineFormGroup.removeControl('npmToken');
201
+ }
202
+ }
203
+ }
204
+ loadProjectHostingDetails() {
205
+ this.HostingDetails.Loading = true;
206
+ this.appsFlowSvc.NewLoadProjectHostingDetails().subscribe((response) => {
207
+ this.HostingDetails = response.Model;
208
+ // console.log("response: ", response);
209
+ this.HostingDetails.Loading = false;
210
+ const hostOption = this.HostingDetails?.HostingOptions?.find((ho) => ho.Path === this.DevOpsAction.Path);
211
+ this.BuildPipeline = hostOption.Lookup;
212
+ // console.log("Build Pipeline HERE= ", this.BuildPipeline);
213
+ this.setupControlsForForm();
214
+ }, (err) => {
215
+ console.log('ERR: ', err);
216
+ this.HostingDetails.Loading = false;
217
+ });
218
+ console.log('HOSTING DETAILS: ', this.HostingDetails);
219
+ }
220
+ }
221
+ BuildPipelineFormComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: BuildPipelineFormComponent, deps: [{ token: i1.EaCService }, { token: i2.FormBuilder }, { token: i3.ApplicationsFlowService }], target: i0.ɵɵFactoryTarget.Component });
222
+ BuildPipelineFormComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.2", type: BuildPipelineFormComponent, selector: "lcu-build-pipeline-form", inputs: { DevOpsActionLookup: ["devops-action-lookup", "DevOpsActionLookup"], Disabled: ["disabled", "Disabled"], Environment: ["environment", "Environment"], EnvironmentLookup: ["environment-lookup", "EnvironmentLookup"], HostingDetails: ["hosting-details", "HostingDetails"] }, ngImport: i0, template: "<form class=\"form-card\" [formGroup]=\"BuildPipelineFormGroup\" (ngSubmit)=\"SubmitBuildPipeline()\">\n <mat-card\n class=\"spread\" \n >\n <mat-card-header>\n <mat-card-title> Build Pipeline </mat-card-title>\n\n <mat-hint>\n Changes made here are reflected for all sources using this\n DevOpsAction\n </mat-hint>\n </mat-card-header>\n\n <mat-card-content>\n\n\n <div *ngIf=\"!HostingDetails?.Loading\">\n <mat-form-field class=\"mat-full-width\">\n <mat-select\n formControlName=\"buildPipeline\"\n placeholder=\"Build Pipeline\"\n [disabled]=\"Disabled\"\n (selectionChange)=\"BuildPipelineChanged()\"\n required\n >\n <ng-container\n *ngFor=\"let hostOption of HostingDetails?.HostingOptions; let i = index\"\n >\n <mat-option [value]=\"hostOption.Lookup\">\n {{ hostOption.Name }}\n </mat-option>\n </ng-container>\n </mat-select>\n \n <mat-hint>\n <ng-container *ngFor=\"let hostOption of HostingDetails?.HostingOptions\">\n <span *ngIf=\"BuildPipeline == hostOption?.Lookup\">\n {{ hostOption.Description }}\n </span>\n </ng-container>\n </mat-hint>\n </mat-form-field>\n \n <mat-form-field class=\"mat-full-width\">\n <input\n matInput\n formControlName=\"devOpsActionName\"\n placeholder=\"Name of DevOps Action\"\n required=\"true\"\n />\n </mat-form-field>\n \n <ng-container *ngFor=\"let input of SelectedHostingOption?.Inputs\">\n <mat-form-field class=\"mat-full-width\">\n <input\n matInput\n [formControlName]=\"input.Lookup\"\n [placeholder]=\"input.Placeholder\"\n [required]=\"input.Required\"\n />\n \n <mat-hint>{{ input.Hint }}</mat-hint>\n </mat-form-field>\n </ng-container>\n \n <div *ngIf=\"BuildPipeline == 'npm-release'\">\n <mat-form-field class=\"mat-full-width with-hint padding-bottom-4\">\n <mat-icon matPrefix>security</mat-icon>\n \n <input\n id=\"npm-token\"\n matInput\n type=\"text\"\n formControlName=\"npmToken\"\n placeholder=\"NPM token\"\n [required]=\"!Disabled\"\n style=\"-webkit-text-security: disc;\"\n />\n <mat-hint>\n Securely publish to NPM, provide an NPM Personal Access Token (PAT) with publish access to the organization used for your NPM packages. \n Learn how to create and view access tokens \n <a\n href=\"https://docs.npmjs.com/creating-and-viewing-access-tokens\"\n target=\"_blank\"\n >\n here.\n </a>\n </mat-hint>\n </mat-form-field>\n </div>\n </div>\n \n <div *ngIf=\"HostingDetails?.Loading\">\n <div class=\"spread\">\n <lcu-loader style=\"margin: auto\" [loading]=\"true\"></lcu-loader>\n \n <div class=\"margin-3\">\n <h4 class=\"mat-title\">Loading hosting details</h4>\n </div>\n </div>\n </div>\n </mat-card-content>\n <mat-card-actions fxLayoutAlign=\"center center\">\n\n <button \n mat-raised-button \n type=\"submit\" \n fxFlex=\"100%\" \n color=\"primary\" \n [disabled]=\"!BuildPipelineFormGroup.valid || !BuildPipelineFormGroup.dirty\">\n <mat-icon>save</mat-icon>\n Save Build Pipeline\n </button>\n \n </mat-card-actions>\n </mat-card>\n</form>\n", styles: [""], components: [{ type: i4.MatCard, selector: "mat-card", exportAs: ["matCard"] }, { type: i4.MatCardHeader, selector: "mat-card-header" }, { type: i5.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { type: i6.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { type: i7.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { type: i8.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i9.LoaderComponent, selector: "lcu-loader", inputs: ["diameter", "hide-inner", "loading"] }, { type: i10.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }], directives: [{ type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i4.MatCardTitle, selector: "mat-card-title, [mat-card-title], [matCardTitle]" }, { type: i5.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { type: i4.MatCardContent, selector: "mat-card-content, [mat-card-content], [matCardContent]" }, { type: i11.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { type: i11.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i12.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i5.MatPrefix, selector: "[matPrefix]" }, { type: i4.MatCardActions, selector: "mat-card-actions", inputs: ["align"], exportAs: ["matCardActions"] }, { type: i13.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { type: i13.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }] });
223
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: BuildPipelineFormComponent, decorators: [{
224
+ type: Component,
225
+ args: [{ selector: 'lcu-build-pipeline-form', template: "<form class=\"form-card\" [formGroup]=\"BuildPipelineFormGroup\" (ngSubmit)=\"SubmitBuildPipeline()\">\n <mat-card\n class=\"spread\" \n >\n <mat-card-header>\n <mat-card-title> Build Pipeline </mat-card-title>\n\n <mat-hint>\n Changes made here are reflected for all sources using this\n DevOpsAction\n </mat-hint>\n </mat-card-header>\n\n <mat-card-content>\n\n\n <div *ngIf=\"!HostingDetails?.Loading\">\n <mat-form-field class=\"mat-full-width\">\n <mat-select\n formControlName=\"buildPipeline\"\n placeholder=\"Build Pipeline\"\n [disabled]=\"Disabled\"\n (selectionChange)=\"BuildPipelineChanged()\"\n required\n >\n <ng-container\n *ngFor=\"let hostOption of HostingDetails?.HostingOptions; let i = index\"\n >\n <mat-option [value]=\"hostOption.Lookup\">\n {{ hostOption.Name }}\n </mat-option>\n </ng-container>\n </mat-select>\n \n <mat-hint>\n <ng-container *ngFor=\"let hostOption of HostingDetails?.HostingOptions\">\n <span *ngIf=\"BuildPipeline == hostOption?.Lookup\">\n {{ hostOption.Description }}\n </span>\n </ng-container>\n </mat-hint>\n </mat-form-field>\n \n <mat-form-field class=\"mat-full-width\">\n <input\n matInput\n formControlName=\"devOpsActionName\"\n placeholder=\"Name of DevOps Action\"\n required=\"true\"\n />\n </mat-form-field>\n \n <ng-container *ngFor=\"let input of SelectedHostingOption?.Inputs\">\n <mat-form-field class=\"mat-full-width\">\n <input\n matInput\n [formControlName]=\"input.Lookup\"\n [placeholder]=\"input.Placeholder\"\n [required]=\"input.Required\"\n />\n \n <mat-hint>{{ input.Hint }}</mat-hint>\n </mat-form-field>\n </ng-container>\n \n <div *ngIf=\"BuildPipeline == 'npm-release'\">\n <mat-form-field class=\"mat-full-width with-hint padding-bottom-4\">\n <mat-icon matPrefix>security</mat-icon>\n \n <input\n id=\"npm-token\"\n matInput\n type=\"text\"\n formControlName=\"npmToken\"\n placeholder=\"NPM token\"\n [required]=\"!Disabled\"\n style=\"-webkit-text-security: disc;\"\n />\n <mat-hint>\n Securely publish to NPM, provide an NPM Personal Access Token (PAT) with publish access to the organization used for your NPM packages. \n Learn how to create and view access tokens \n <a\n href=\"https://docs.npmjs.com/creating-and-viewing-access-tokens\"\n target=\"_blank\"\n >\n here.\n </a>\n </mat-hint>\n </mat-form-field>\n </div>\n </div>\n \n <div *ngIf=\"HostingDetails?.Loading\">\n <div class=\"spread\">\n <lcu-loader style=\"margin: auto\" [loading]=\"true\"></lcu-loader>\n \n <div class=\"margin-3\">\n <h4 class=\"mat-title\">Loading hosting details</h4>\n </div>\n </div>\n </div>\n </mat-card-content>\n <mat-card-actions fxLayoutAlign=\"center center\">\n\n <button \n mat-raised-button \n type=\"submit\" \n fxFlex=\"100%\" \n color=\"primary\" \n [disabled]=\"!BuildPipelineFormGroup.valid || !BuildPipelineFormGroup.dirty\">\n <mat-icon>save</mat-icon>\n Save Build Pipeline\n </button>\n \n </mat-card-actions>\n </mat-card>\n</form>\n", styles: [""] }]
226
+ }], ctorParameters: function () { return [{ type: i1.EaCService }, { type: i2.FormBuilder }, { type: i3.ApplicationsFlowService }]; }, propDecorators: { DevOpsActionLookup: [{
227
+ type: Input,
228
+ args: ['devops-action-lookup']
229
+ }], Disabled: [{
230
+ type: Input,
231
+ args: ['disabled']
232
+ }], Environment: [{
233
+ type: Input,
234
+ args: ['environment']
235
+ }], EnvironmentLookup: [{
236
+ type: Input,
237
+ args: ['environment-lookup']
238
+ }], HostingDetails: [{
239
+ type: Input,
240
+ args: ['hosting-details']
241
+ }] } });
242
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGQtcGlwZWxpbmUtZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21tb24vc3JjL2xpYi9jb250cm9scy9idWlsZC1waXBlbGluZS1mb3JtL2J1aWxkLXBpcGVsaW5lLWZvcm0uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tbW9uL3NyYy9saWIvY29udHJvbHMvYnVpbGQtcGlwZWxpbmUtZm9ybS9idWlsZC1waXBlbGluZS1mb3JtLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQ3pELE9BQU8sRUFJTCxVQUFVLEdBQ1gsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQXVCLElBQUksRUFBRSxNQUFNLGFBQWEsQ0FBQztBQVl4RCxPQUFPLEVBQ0wscUJBQXFCLEdBRXRCLE1BQU0scUNBQXFDLENBQUM7Ozs7Ozs7Ozs7Ozs7OztBQU83QyxNQUFNLE9BQU8sMEJBQTBCO0lBeUZyQyxZQUNZLE1BQWtCLEVBQ2xCLFdBQXdCLEVBQ3hCLFdBQW9DO1FBRnBDLFdBQU0sR0FBTixNQUFNLENBQVk7UUFDbEIsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDeEIsZ0JBQVcsR0FBWCxXQUFXLENBQXlCO1FBRTlDLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxxQkFBcUIsRUFBRSxDQUFDO0lBQ3BELENBQUM7SUExRUQsSUFBVyxRQUFRO1FBQ2pCLCtFQUErRTtRQUMvRSxPQUFPLElBQUksQ0FBQyxXQUFXLEVBQUUsU0FBUyxJQUFJLElBQUksQ0FBQyxjQUFjO1lBQ3ZELENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLFNBQVMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRTtZQUN4RCxDQUFDLENBQUMsRUFB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QixjQUFjO3NCQURwQixLQUFLO3VCQUFDLGlCQUFpQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgQWJzdHJhY3RDb250cm9sLFxuICBGb3JtQnVpbGRlcixcbiAgRm9ybUdyb3VwLFxuICBWYWxpZGF0b3JzLFxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBCYXNlTW9kZWxlZFJlc3BvbnNlLCBHdWlkIH0gZnJvbSAnQGxjdS9jb21tb24nO1xuaW1wb3J0IHtcbiAgRWFDQXJ0aWZhY3QsXG4gIEVhQ0Rldk9wc0FjdGlvbixcbiAgRWFDRW52aXJvbm1lbnRBc0NvZGUsXG4gIEVhQ1NvdXJjZUNvbnRyb2wsXG59IGZyb20gJ0BzZW1hbnRpY2pzL2NvbW1vbic7XG5pbXBvcnQgeyBBcHBsaWNhdGlvbnNGbG93U2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2FwcGxpY2F0aW9ucy1mbG93LnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgRWFDU2VydmljZSxcbiAgU2F2ZUVudmlyb25tZW50QXNDb2RlRXZlbnRSZXF1ZXN0LFxufSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9lYWMuc2VydmljZSc7XG5pbXBvcnQge1xuICBQcm9qZWN0SG9zdGluZ0RldGFpbHMsXG4gIFByb2plY3RIb3N0aW5nT3B0aW9uLFxufSBmcm9tICcuLi8uLi9zdGF0ZS9hcHBsaWNhdGlvbnMtZmxvdy5zdGF0ZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2xjdS1idWlsZC1waXBlbGluZS1mb3JtJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2J1aWxkLXBpcGVsaW5lLWZvcm0uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9idWlsZC1waXBlbGluZS1mb3JtLmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIEJ1aWxkUGlwZWxpbmVGb3JtQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgLy9QUk9QRVJUSUVTXG5cbiAgLy8gQElucHV0KCdidWlsZC1waXBlbGluZScpXG4gIHB1YmxpYyBCdWlsZFBpcGVsaW5lOiBzdHJpbmc7XG5cbiAgQElucHV0KCdkZXZvcHMtYWN0aW9uLWxvb2t1cCcpXG4gIHB1YmxpYyBEZXZPcHNBY3Rpb25Mb29rdXA6IHN0cmluZztcblxuICBASW5wdXQoJ2Rpc2FibGVkJylcbiAgcHVibGljIERpc2FibGVkOiBib29sZWFuO1xuXG4gIEBJbnB1dCgnZW52aXJvbm1lbnQnKVxuICBwdWJsaWMgRW52aXJvbm1lbnQ6IEVhQ0Vudmlyb25tZW50QXNDb2RlO1xuXG4gIEBJbnB1dCgnZW52aXJvbm1lbnQtbG9va3VwJylcbiAgcHVibGljIEVudmlyb25tZW50TG9va3VwOiBzdHJpbmc7XG5cbiAgQElucHV0KCdob3N0aW5nLWRldGFpbHMnKVxuICBwdWJsaWMgSG9zdGluZ0RldGFpbHM6IFByb2plY3RIb3N0aW5nRGV0YWlscztcblxuICBwdWJsaWMgZ2V0IEFydGlmYWN0KCk6IEVhQ0FydGlmYWN0IHtcbiAgICAvLyBjb25zb2xlLmxvZyhcIkFSVElGQUNUOiBcIiwgdGhpcy5FbnZpcm9ubWVudD8uQXJ0aWZhY3RzW3RoaXMuQXJ0aWZhY3RMb29rdXBdKTtcbiAgICByZXR1cm4gdGhpcy5FbnZpcm9ubWVudD8uQXJ0aWZhY3RzICYmIHRoaXMuQXJ0aWZhY3RMb29rdXBcbiAgICAgID8gdGhpcy5FbnZpcm9ubWVudD8uQXJ0aWZhY3RzW3RoaXMuQXJ0aWZhY3RMb29rdXBdIHx8IHt9XG4gICAgICA6IHt9O1xuICB9XG5cbiAgcHVibGljIGdldCBBcnRpZmFjdExvb2t1cCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IGFydExvb2t1cCA9IHRoaXMuRGV2T3BzQWN0aW9uPy5BcnRpZmFjdExvb2t1cHNcbiAgICAgID8gdGhpcy5EZXZPcHNBY3Rpb24/LkFydGlmYWN0TG9va3Vwc1swXVxuICAgICAgOiBudWxsO1xuXG4gICAgcmV0dXJuIGFydExvb2t1cDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgQnVpbGRQaXBlbGluZUZvcm1Db250cm9sKCk6IEFic3RyYWN0Q29udHJvbCB7XG4gICAgcmV0dXJuIHRoaXMuQnVpbGRQaXBlbGluZUZvcm1Hcm91cD8uZ2V0KCdidWlsZFBpcGVsaW5lJyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IERldk9wc0FjdGlvbigpOiBFYUNEZXZPcHNBY3Rpb24ge1xuICAgIHJldHVybiB0aGlzLkVudmlyb25tZW50LkRldk9wc0FjdGlvbnMgJiYgdGhpcy5EZXZPcHNBY3Rpb25Mb29rdXBcbiAgICAgID8gdGhpcy5FbnZpcm9ubWVudC5EZXZPcHNBY3Rpb25zW3RoaXMuRGV2T3BzQWN0aW9uTG9va3VwXSB8fCB7fVxuICAgICAgOiB7fTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgRGV2T3BzQWN0aW9ucygpOiB7IFtsb29rdXA6IHN0cmluZ106IEVhQ0Rldk9wc0FjdGlvbiB9IHtcbiAgICByZXR1cm4gdGhpcy5FbnZpcm9ubWVudC5EZXZPcHNBY3Rpb25zIHx8IHt9O1xuICB9XG5cbiAgcHVibGljIGdldCBEZXZPcHNBY3Rpb25OYW1lRm9ybUNvbnRyb2woKTogQWJzdHJhY3RDb250cm9sIHtcbiAgICByZXR1cm4gdGhpcy5CdWlsZFBpcGVsaW5lRm9ybUdyb3VwLmdldCgnZGV2T3BzQWN0aW9uTmFtZScpO1xuICB9XG5cbiAgcHVibGljIGdldCBOUE1Ub2tlbkZvcm1Db250cm9sKCk6IEFic3RyYWN0Q29udHJvbCB7XG4gICAgcmV0dXJuIHRoaXMuQnVpbGRQaXBlbGluZUZvcm1Hcm91cC5nZXQoJ25wbVRva2VuJyk7XG4gIH1cblxuICAvLyAoaG8pID0+IGhvLkxvb2t1cCA9PT0gdGhpcy5CdWlsZFBpcGVsaW5lXG4gIHB1YmxpYyBnZXQgU2VsZWN0ZWRIb3N0aW5nT3B0aW9uKCk6IFByb2plY3RIb3N0aW5nT3B0aW9uIHtcbiAgICByZXR1cm4gdGhpcy5Ib3N0aW5nRGV0YWlscz8uSG9zdGluZ09wdGlvbnM/LmZpbmQoXG4gICAgICAoaG8pID0+IGhvLkxvb2t1cCA9PT0gdGhpcy5CdWlsZFBpcGVsaW5lXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgU2VsZWN0ZWRIb3N0aW5nT3B0aW9uSW5wdXRDb250cm9sVmFsdWVzKCk6IHtcbiAgICBbbG9va3VwOiBzdHJpbmddOiBhbnk7XG4gIH0ge1xuICAgIHJldHVybiB0aGlzLlNlbGVjdGVkSG9zdGluZ09wdGlvbj8uSW5wdXRzPy5yZWR1Y2UoKHByZXYsIGN1cikgPT4ge1xuICAgICAgY29uc3QgcmVzID0ge1xuICAgICAgICAuLi5wcmV2LFxuICAgICAgfTtcblxuICAgICAgcmVzW2N1ci5Mb29rdXBdID0gdGhpcy5CdWlsZFBpcGVsaW5lRm9ybUdyb3VwLmNvbnRyb2xzW2N1ci5Mb29rdXBdLnZhbHVlO1xuXG4gICAgICByZXR1cm4gcmVzO1xuICAgIH0sIHt9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgU291cmNlQ29udHJvbExvb2t1cHMoKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuU291cmNlQ29udHJvbHMgfHwge30pO1xuICB9XG5cbiAgcHVibGljIGdldCBTb3VyY2VDb250cm9scygpOiB7IFtsb29rdXA6IHN0cmluZ106IEVhQ1NvdXJjZUNvbnRyb2wgfSB7XG4gICAgcmV0dXJuIHRoaXMuRW52aXJvbm1lbnQuU291cmNlcyB8fCB7fTtcbiAgfVxuXG4gIHB1YmxpYyBCdWlsZFBpcGVsaW5lRm9ybUdyb3VwOiBGb3JtR3JvdXA7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIGVhY1N2YzogRWFDU2VydmljZSxcbiAgICBwcm90ZWN0ZWQgZm9ybUJ1aWxkZXI6IEZvcm1CdWlsZGVyLFxuICAgIHByb3RlY3RlZCBhcHBzRmxvd1N2YzogQXBwbGljYXRpb25zRmxvd1NlcnZpY2VcbiAgKSB7XG4gICAgdGhpcy5Ib3N0aW5nRGV0YWlscyA9IG5ldyBQcm9qZWN0SG9zdGluZ0RldGFpbHMoKTtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAvLyBjb25zb2xlLmxvZygnQnVpbGRQaXBlbGluZSA9ICcsIHRoaXMuQnVpbGRQaXBlbGluZSlcblxuICAgIC8vIHRoaXMuQnVpbGRQaXBlbGluZUZvcm1Hcm91cCA9IHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoe30pO1xuXG4gICAgLy8gaWYgKHRoaXMuQnVpbGRQaXBlbGluZUZvcm1Hcm91cCAhPSBudWxsKSB7XG4gICAgLy8gICB0aGlzLkJ1aWxkUGlwZWxpbmVGb3JtR3JvdXAucmVtb3ZlQ29udHJvbCgnaG9zdGluZ0RldGFpbHMnKTtcbiAgICAvLyB9XG5cbiAgICAvLyB0aGlzLkJ1aWxkUGlwZWxpbmVGb3JtR3JvdXAuYWRkQ29udHJvbChcbiAgICAvLyAgICdob3N0aW5nRGV0YWlscycsXG4gICAgdGhpcy5CdWlsZFBpcGVsaW5lRm9ybUdyb3VwID0gdGhpcy5mb3JtQnVpbGRlci5ncm91cCh7XG4gICAgICBidWlsZFBpcGVsaW5lOiBbdGhpcy5CdWlsZFBpcGVsaW5lLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF1dLFxuICAgIH0pO1xuICAgIC8vICk7XG5cbiAgICB0aGlzLmxvYWRQcm9qZWN0SG9zdGluZ0RldGFpbHMoKTtcbiAgICAvLyB0aGlzLnNldHVwQ29udHJvbHNGb3JGb3JtKCk7XG4gIH1cblxuICAvL0FQSSBNRVRIT0RTXG5cbiAgcHVibGljIEJ1aWxkUGlwZWxpbmVDaGFuZ2VkKCk6IHZvaWQge1xuICAgIC8vZm9yIHNvbWUgcmVhc29uIHRoaXMgdmFsdWUgaXMgY29taW5nIGJhY2sgdW5kZWZpbmVkXG4gICAgLy8gY29uc29sZS5sb2coXCJidWlsZCBwaXBlbGluZSB2YWx1ZTogXCIsIHRoaXMuQnVpbGRQaXBlbGluZUZvcm1Db250cm9sPy52YWx1ZSlcbiAgICB0aGlzLkJ1aWxkUGlwZWxpbmUgPSB0aGlzLkJ1aWxkUGlwZWxpbmVGb3JtQ29udHJvbD8udmFsdWU7XG5cbiAgICB0aGlzLnNldHVwQ29udHJvbHNGb3JGb3JtKCk7XG4gIH1cblxuICBwdWJsaWMgU3VibWl0QnVpbGRQaXBlbGluZSgpIHtcbiAgICAvLyBjb25zb2xlLmxvZyhcInN1Ym1pdHRpbmcgYnVpbGQgcGlwZWxpbmU6IFwiLCB0aGlzLkJ1aWxkUGlwZWxpbmVGb3JtR3JvdXAudmFsdWUpO1xuICAgIHRoaXMuU2F2ZUVudmlyb25tZW50KCk7XG4gIH1cblxuICBwdWJsaWMgU2F2ZUVudmlyb25tZW50KCk6IHZvaWQge1xuICAgIGNvbnN0IHNhdmVFbnZSZXE6IFNhdmVFbnZpcm9ubWVudEFzQ29kZUV2ZW50UmVxdWVzdCA9IHtcbiAgICAgIEVudmlyb25tZW50OiB7XG4gICAgICAgIC4uLnRoaXMuRW52aXJvbm1lbnQsXG4gICAgICAgIEFydGlmYWN0czogdGhpcy5FbnZpcm9ubWVudC5BcnRpZmFjdHMgfHwge30sXG4gICAgICAgIERldk9wc0FjdGlvbnM6IHRoaXMuRW52aXJvbm1lbnQuRGV2T3BzQWN0aW9ucyB8fCB7fSxcbiAgICAgICAgU2VjcmV0czogdGhpcy5FbnZpcm9ubWVudC5TZWNyZXRzIHx8IHt9LFxuICAgICAgICBTb3VyY2VzOiB0aGlzLkVudmlyb25tZW50LlNvdXJjZXMgfHwge30sXG4gICAgICB9LFxuICAgICAgRW52aXJvbm1lbnRMb29rdXA6IHRoaXMuRW52aXJvbm1lbnRMb29rdXAsXG4gICAgICBFbnRlcnByaXNlRGF0YVRva2Vuczoge30sXG4gICAgfTtcblxuICAgIGxldCBhcnRpZmFjdExvb2t1cDogc3RyaW5nO1xuXG4gICAgbGV0IGFydGlmYWN0OiBFYUNBcnRpZmFjdCA9IHtcbiAgICAgIC4uLnRoaXMuQXJ0aWZhY3QsXG4gICAgICAuLi50aGlzLlNlbGVjdGVkSG9zdGluZ09wdGlvbklucHV0Q29udHJvbFZhbHVlcyxcbiAgICB9O1xuXG4gICAgaWYgKCF0aGlzLkFydGlmYWN0TG9va3VwKSB7XG4gICAgICBhcnRpZmFjdExvb2t1cCA9IEd1aWQuQ3JlYXRlUmF3KCk7XG5cbiAgICAgIGFydGlmYWN0ID0ge1xuICAgICAgICAuLi5hcnRpZmFjdCxcbiAgICAgICAgVHlwZTogdGhpcy5TZWxlY3RlZEhvc3RpbmdPcHRpb24uQXJ0aWZhY3RUeXBlLFxuICAgICAgICBOYW1lOiB0aGlzLlNlbGVjdGVkSG9zdGluZ09wdGlvbi5OYW1lLFxuICAgICAgICBOUE1SZWdpc3RyeTogJ2h0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnLycsXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBhcnRpZmFjdExvb2t1cCA9IHRoaXMuQXJ0aWZhY3RMb29rdXA7XG4gICAgfVxuXG4gICAgc2F2ZUVudlJlcS5FbnZpcm9ubWVudC5BcnRpZmFjdHNbYXJ0aWZhY3RMb29rdXBdID0gYXJ0aWZhY3Q7XG5cbiAgICBsZXQgZGV2T3BzQWN0aW9uTG9va3VwOiBzdHJpbmc7XG5cbiAgICBpZiAoIXRoaXMuRGV2T3BzQWN0aW9uTG9va3VwKSB7XG4gICAgICBkZXZPcHNBY3Rpb25Mb29rdXAgPSBHdWlkLkNyZWF0ZVJhdygpO1xuXG4gICAgICBjb25zdCBkb2E6IEVhQ0Rldk9wc0FjdGlvbiA9IHtcbiAgICAgICAgLi4udGhpcy5EZXZPcHNBY3Rpb24sXG4gICAgICAgIEFydGlmYWN0TG9va3VwczogW2FydGlmYWN0TG9va3VwXSxcbiAgICAgICAgTmFtZTogdGhpcy5EZXZPcHNBY3Rpb25OYW1lRm9ybUNvbnRyb2wudmFsdWUsXG4gICAgICAgIFBhdGg6IHRoaXMuU2VsZWN0ZWRIb3N0aW5nT3B0aW9uLlBhdGgsXG4gICAgICAgIFRlbXBsYXRlczogdGhpcy5TZWxlY3RlZEhvc3RpbmdPcHRpb24uVGVtcGxhdGVzLFxuICAgICAgfTtcblxuICAgICAgaWYgKHRoaXMuTlBNVG9rZW5Gb3JtQ29udHJvbD8udmFsdWUpIHtcbiAgICAgICAgY29uc3Qgc2VjcmV0TG9va3VwID0gJ25wbS1hY2Nlc3MtdG9rZW4nO1xuXG4gICAgICAgIGRvYS5TZWNyZXRMb29rdXBzID0gW3NlY3JldExvb2t1cF07XG5cbiAgICAgICAgc2F2ZUVudlJlcS5FbnZpcm9ubWVudC5TZWNyZXRzW3NlY3JldExvb2t1cF0gPSB7XG4gICAgICAgICAgTmFtZTogJ05QTSBBY2Nlc3MgVG9rZW4nLFxuICAgICAgICAgIERhdGFUb2tlbkxvb2t1cDogc2VjcmV0TG9va3VwLFxuICAgICAgICAgIEtub3duQXM6ICdOUE1fVE9LRU4nLFxuICAgICAgICB9O1xuXG4gICAgICAgIHNhdmVFbnZSZXEuRW50ZXJwcmlzZURhdGFUb2tlbnNbc2VjcmV0TG9va3VwXSA9IHtcbiAgICAgICAgICBOYW1lOiBzYXZlRW52UmVxLkVudmlyb25tZW50LlNlY3JldHNbc2VjcmV0TG9va3VwXS5OYW1lLFxuICAgICAgICAgIERlc2NyaXB0aW9uOiBzYXZlRW52UmVxLkVudmlyb25tZW50LlNlY3JldHNbc2VjcmV0TG9va3VwXS5OYW1lLFxuICAgICAgICAgIFZhbHVlOiB0aGlzLk5QTVRva2VuRm9ybUNvbnRyb2wudmFsdWUsXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHNhdmVFbnZSZXEuRW52aXJvbm1lbnQuRGV2T3BzQWN0aW9uc1tkZXZPcHNBY3Rpb25Mb29rdXBdID0gZG9hO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZXZPcHNBY3Rpb25Mb29rdXAgPSB0aGlzLkRldk9wc0FjdGlvbkxvb2t1cDtcblxuICAgICAgY29uc3QgZG9hOiBFYUNEZXZPcHNBY3Rpb24gPSB7XG4gICAgICAgIC4uLnRoaXMuRGV2T3BzQWN0aW9uLFxuICAgICAgICBOYW1lOiB0aGlzLkRldk9wc0FjdGlvbk5hbWVGb3JtQ29udHJvbC52YWx1ZSxcbiAgICAgIH07XG5cbiAgICAgIHNhdmVFbnZSZXEuRW52aXJvbm1lbnQuRGV2T3BzQWN0aW9uc1tkZXZPcHNBY3Rpb25Mb29rdXBdID0gZG9hO1xuICAgIH1cblxuICAgIHRoaXMuZWFjU3ZjLlNhdmVFbnZpcm9ubWVudEFzQ29kZShzYXZlRW52UmVxKTtcbiAgfVxuXG4gIC8vICBIZWxwZXJzXG4gIHByb3RlY3RlZCBzZXR1cENvbnRyb2xzRm9yRm9ybSgpOiB2b2lkIHtcbiAgICAvLyB0aGlzLkJ1aWxkUGlwZWxpbmUgPVxuICAgIC8vICAgICAgICAgdGhpcy5CdWlsZFBpcGVsaW5lIHx8IHRoaXMuSG9zdGluZ0RldGFpbHM/Lkhvc3RpbmdPcHRpb25zXG4gICAgLy8gICAgICAgICAgID8gdGhpcy5Ib3N0aW5nRGV0YWlscz8uSG9zdGluZ09wdGlvbnNbMF0/Lkxvb2t1cFxuICAgIC8vICAgICAgICAgICA6ICcnO1xuXG4gICAgLy8gY29uc29sZS5sb2coXCJob3N0aW5nIGRldGFpbHM6IFwiLCB0aGlzLkhvc3RpbmdEZXRhaWxzKVxuXG4gICAgZm9yIChjb25zdCBjdHJsTmFtZSBpbiB0aGlzLkJ1aWxkUGlwZWxpbmVGb3JtR3JvdXAuY29udHJvbHMpIHtcbiAgICAgIC8vZGV2T3BzQWN0aW9uIGRvZXNuJ3QgZXhpc3RcbiAgICAgIC8vcmVtb3ZlcyBob3N0aW5nIGRldGFpbHNcbiAgICAgIGlmIChjdHJsTmFtZSAhPT0gJ2J1aWxkUGlwZWxpbmUnICYmIGN0cmxOYW1lICE9PSAnZGV2T3BzQWN0aW9uJykge1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhcInJlbW92aW5nIGNvbnRyb2w6IFwiLCBjdHJsTmFtZSlcbiAgICAgICAgdGhpcy5CdWlsZFBpcGVsaW5lRm9ybUdyb3VwLnJlbW92ZUNvbnRyb2woY3RybE5hbWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuQnVpbGRQaXBlbGluZUZvcm1Hcm91cC5hZGRDb250cm9sKFxuICAgICAgJ2Rldk9wc0FjdGlvbk5hbWUnLFxuICAgICAgdGhpcy5mb3JtQnVpbGRlci5jb250cm9sKFxuICAgICAgICB0aGlzLkRldk9wc0FjdGlvbj8uTmFtZSB8fCB0aGlzLlNlbGVjdGVkSG9zdGluZ09wdGlvbj8uTmFtZSB8fCAnJyxcbiAgICAgICAgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXG4gICAgICApXG4gICAgKTtcblxuICAgIC8vIGNvbnNvbGUubG9nKFwic2VsZWN0ZWQgaG9zdGluZyBvcHRpb25zOiBcIiwgdGhpcy5TZWxlY3RlZEhvc3RpbmdPcHRpb24uSW5wdXRzKTtcblxuICAgIHRoaXMuU2VsZWN0ZWRIb3N0aW5nT3B0aW9uPy5JbnB1dHM/LmZvckVhY2goKGlucHV0KSA9PiB7XG4gICAgICBjb25zdCB2YWxpZGF0b3JzID0gaW5wdXQuUmVxdWlyZWQgPyBbVmFsaWRhdG9ycy5yZXF1aXJlZF0gOiBbXTtcblxuICAgICAgdGhpcy5CdWlsZFBpcGVsaW5lRm9ybUdyb3VwLmFkZENvbnRyb2woXG4gICAgICAgIGlucHV0Lkxvb2t1cCxcbiAgICAgICAgdGhpcy5mb3JtQnVpbGRlci5jb250cm9sKFxuICAgICAgICAgIHRoaXMuQXJ0aWZhY3RbaW5wdXQuTG9va3VwXSB8fCBpbnB1dC5EZWZhdWx0VmFsdWUgfHwgJycsXG4gICAgICAgICAgdmFsaWRhdG9yc1xuICAgICAgICApXG4gICAgICApO1xuXG4gICAgICAvLyBpZiAodGhpcy5EaXNhYmxlZCkge1xuICAgICAgLy8gICB0aGlzLkZvcm1Hcm91cC5jb250cm9sc1tpbnB1dC5Mb29rdXBdLmRpc2FibGUoKTtcbiAgICAgIC8vIH1cbiAgICB9KTtcblxuICAgIGlmICh0aGlzLkJ1aWxkUGlwZWxpbmVGb3JtQ29udHJvbD8udmFsdWUgPT09ICducG0tcmVsZWFzZScpIHtcbiAgICAgIGlmICghdGhpcy5CdWlsZFBpcGVsaW5lRm9ybUdyb3VwLmNvbnRyb2xzLm5wbVRva2VuKSB7XG4gICAgICAgIHRoaXMuQnVpbGRQaXBlbGluZUZvcm1Hcm91cC5hZGRDb250cm9sKFxuICAgICAgICAgICducG1Ub2tlbicsXG4gICAgICAgICAgdGhpcy5mb3JtQnVpbGRlci5jb250cm9sKFxuICAgICAgICAgICAgJycsXG4gICAgICAgICAgICB0aGlzLkRpc2FibGVkID8gW10gOiBbVmFsaWRhdG9ycy5yZXF1aXJlZF1cbiAgICAgICAgICApXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHRoaXMuRGlzYWJsZWQpIHtcbiAgICAgICAgICB0aGlzLkJ1aWxkUGlwZWxpbmVGb3JtR3JvdXAuY29udHJvbHMubnBtVG9rZW4uZGlzYWJsZSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHRoaXMuQnVpbGRQaXBlbGluZUZvcm1Db250cm9sPy52YWx1ZSA9PT0gJ2dpdGh1Yi1hcnRpZmFjdHMtcmVsZWFzZSdcbiAgICApIHtcbiAgICAgIGlmICh0aGlzLkJ1aWxkUGlwZWxpbmVGb3JtR3JvdXAuY29udHJvbHMubnBtVG9rZW4pIHtcbiAgICAgICAgdGhpcy5CdWlsZFBpcGVsaW5lRm9ybUdyb3VwLnJlbW92ZUNvbnRyb2woJ25wbVRva2VuJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGxvYWRQcm9qZWN0SG9zdGluZ0RldGFpbHMoKTogdm9pZCB7XG4gICAgdGhpcy5Ib3N0aW5nRGV0YWlscy5Mb2FkaW5nID0gdHJ1ZTtcbiAgICB0aGlzLmFwcHNGbG93U3ZjLk5ld0xvYWRQcm9qZWN0SG9zdGluZ0RldGFpbHMoKS5zdWJzY3JpYmUoXG4gICAgICAocmVzcG9uc2U6IEJhc2VNb2RlbGVkUmVzcG9uc2U8UHJvamVjdEhvc3RpbmdEZXRhaWxzPikgPT4ge1xuICAgICAgICB0aGlzLkhvc3RpbmdEZXRhaWxzID0gcmVzcG9uc2UuTW9kZWw7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwicmVzcG9uc2U6IFwiLCByZXNwb25zZSk7XG4gICAgICAgIHRoaXMuSG9zdGluZ0RldGFpbHMuTG9hZGluZyA9IGZhbHNlO1xuXG4gICAgICAgIGNvbnN0IGhvc3RPcHRpb24gPSB0aGlzLkhvc3RpbmdEZXRhaWxzPy5Ib3N0aW5nT3B0aW9ucz8uZmluZChcbiAgICAgICAgICAoaG8pID0+IGhvLlBhdGggPT09IHRoaXMuRGV2T3BzQWN0aW9uLlBhdGhcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5CdWlsZFBpcGVsaW5lID0gaG9zdE9wdGlvbi5Mb29rdXA7XG5cbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJCdWlsZCBQaXBlbGluZSBIRVJFPSBcIiwgdGhpcy5CdWlsZFBpcGVsaW5lKTtcblxuICAgICAgICB0aGlzLnNldHVwQ29udHJvbHNGb3JGb3JtKCk7XG4gICAgICB9LFxuICAgICAgKGVycikgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZygnRVJSOiAnLCBlcnIpO1xuICAgICAgICB0aGlzLkhvc3RpbmdEZXRhaWxzLkxvYWRpbmcgPSBmYWxzZTtcbiAgICAgIH1cbiAgICApO1xuICAgIGNvbnNvbGUubG9nKCdIT1NUSU5HIERFVEFJTFM6ICcsIHRoaXMuSG9zdGluZ0RldGFpbHMpO1xuICB9XG59XG4iLCI8Zm9ybSBjbGFzcz1cImZvcm0tY2FyZFwiIFtmb3JtR3JvdXBdPVwiQnVpbGRQaXBlbGluZUZvcm1Hcm91cFwiIChuZ1N1Ym1pdCk9XCJTdWJtaXRCdWlsZFBpcGVsaW5lKClcIj5cbiAgICA8bWF0LWNhcmRcbiAgICAgIGNsYXNzPVwic3ByZWFkXCIgIFxuICAgID5cbiAgICAgIDxtYXQtY2FyZC1oZWFkZXI+XG4gICAgICAgIDxtYXQtY2FyZC10aXRsZT4gQnVpbGQgUGlwZWxpbmUgPC9tYXQtY2FyZC10aXRsZT5cblxuICAgICAgICA8bWF0LWhpbnQ+XG4gICAgICAgICAgQ2hhbmdlcyBtYWRlIGhlcmUgYXJlIHJlZmxlY3RlZCBmb3IgYWxsIHNvdXJjZXMgdXNpbmcgdGhpc1xuICAgICAgICAgIERldk9wc0FjdGlvblxuICAgICAgICA8L21hdC1oaW50PlxuICAgICAgPC9tYXQtY2FyZC1oZWFkZXI+XG5cbiAgICAgIDxtYXQtY2FyZC1jb250ZW50PlxuXG5cbiAgICAgICAgPGRpdiAgKm5nSWY9XCIhSG9zdGluZ0RldGFpbHM/LkxvYWRpbmdcIj5cbiAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJtYXQtZnVsbC13aWR0aFwiPlxuICAgICAgICAgICAgPG1hdC1zZWxlY3RcbiAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiYnVpbGRQaXBlbGluZVwiXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiQnVpbGQgUGlwZWxpbmVcIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiRGlzYWJsZWRcIlxuICAgICAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIkJ1aWxkUGlwZWxpbmVDaGFuZ2VkKClcIlxuICAgICAgICAgICAgICByZXF1aXJlZFxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGhvc3RPcHRpb24gb2YgSG9zdGluZ0RldGFpbHM/Lkhvc3RpbmdPcHRpb25zOyBsZXQgaSA9IGluZGV4XCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uIFt2YWx1ZV09XCJob3N0T3B0aW9uLkxvb2t1cFwiPlxuICAgICAgICAgICAgICAgICAge3sgaG9zdE9wdGlvbi5OYW1lIH19XG4gICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgICAgXG4gICAgICAgICAgICA8bWF0LWhpbnQ+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGhvc3RPcHRpb24gb2YgSG9zdGluZ0RldGFpbHM/Lkhvc3RpbmdPcHRpb25zXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJCdWlsZFBpcGVsaW5lID09IGhvc3RPcHRpb24/Lkxvb2t1cFwiPlxuICAgICAgICAgICAgICAgICAge3sgaG9zdE9wdGlvbi5EZXNjcmlwdGlvbiB9fVxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L21hdC1oaW50PlxuICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgIFxuICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cIm1hdC1mdWxsLXdpZHRoXCI+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiZGV2T3BzQWN0aW9uTmFtZVwiXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiTmFtZSBvZiBEZXZPcHMgQWN0aW9uXCJcbiAgICAgICAgICAgICAgcmVxdWlyZWQ9XCJ0cnVlXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaW5wdXQgb2YgU2VsZWN0ZWRIb3N0aW5nT3B0aW9uPy5JbnB1dHNcIj5cbiAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cIm1hdC1mdWxsLXdpZHRoXCI+XG4gICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJpbnB1dC5Mb29rdXBcIlxuICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJpbnB1dC5QbGFjZWhvbGRlclwiXG4gICAgICAgICAgICAgICAgW3JlcXVpcmVkXT1cImlucHV0LlJlcXVpcmVkXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgXG4gICAgICAgICAgICAgIDxtYXQtaGludD57eyBpbnB1dC5IaW50IH19PC9tYXQtaGludD5cbiAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIFxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJCdWlsZFBpcGVsaW5lID09ICducG0tcmVsZWFzZSdcIj5cbiAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cIm1hdC1mdWxsLXdpZHRoIHdpdGgtaGludCBwYWRkaW5nLWJvdHRvbS00XCI+XG4gICAgICAgICAgICAgIDxtYXQtaWNvbiBtYXRQcmVmaXg+c2VjdXJpdHk8L21hdC1pY29uPlxuICAgICAgICBcbiAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgaWQ9XCJucG0tdG9rZW5cIlxuICAgICAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cIm5wbVRva2VuXCJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIk5QTSB0b2tlblwiXG4gICAgICAgICAgICAgICAgW3JlcXVpcmVkXT1cIiFEaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgc3R5bGU9XCItd2Via2l0LXRleHQtc2VjdXJpdHk6IGRpc2M7XCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPG1hdC1oaW50PlxuICAgICAgICAgICAgICAgIFNlY3VyZWx5IHB1Ymxpc2ggdG8gTlBNLCBwcm92aWRlIGFuIE5QTSBQZXJzb25hbCBBY2Nlc3MgVG9rZW4gKFBBVCkgd2l0aCBwdWJsaXNoIGFjY2VzcyB0byB0aGUgb3JnYW5pemF0aW9uIHVzZWQgZm9yIHlvdXIgTlBNIHBhY2thZ2VzLiAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgTGVhcm4gaG93IHRvIGNyZWF0ZSBhbmQgdmlldyBhY2Nlc3MgdG9rZW5zIFxuICAgICAgICAgICAgICAgIDxhXG4gICAgICAgICAgICAgICAgICBocmVmPVwiaHR0cHM6Ly9kb2NzLm5wbWpzLmNvbS9jcmVhdGluZy1hbmQtdmlld2luZy1hY2Nlc3MtdG9rZW5zXCJcbiAgICAgICAgICAgICAgICAgIHRhcmdldD1cIl9ibGFua1wiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgaGVyZS5cbiAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgIDwvbWF0LWhpbnQ+XG4gICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgXG4gICAgICAgIDxkaXYgKm5nSWY9XCJIb3N0aW5nRGV0YWlscz8uTG9hZGluZ1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzcHJlYWRcIj5cbiAgICAgICAgICAgIDxsY3UtbG9hZGVyIHN0eWxlPVwibWFyZ2luOiBhdXRvXCIgW2xvYWRpbmddPVwidHJ1ZVwiPjwvbGN1LWxvYWRlcj5cbiAgICAgICAgXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWFyZ2luLTNcIj5cbiAgICAgICAgICAgICAgPGg0IGNsYXNzPVwibWF0LXRpdGxlXCI+TG9hZGluZyBob3N0aW5nIGRldGFpbHM8L2g0PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9tYXQtY2FyZC1jb250ZW50PlxuICAgICAgPG1hdC1jYXJkLWFjdGlvbnMgZnhMYXlvdXRBbGlnbj1cImNlbnRlciBjZW50ZXJcIj5cblxuICAgICAgICA8YnV0dG9uIFxuICAgICAgICAgIG1hdC1yYWlzZWQtYnV0dG9uIFxuICAgICAgICAgIHR5cGU9XCJzdWJtaXRcIiBcbiAgICAgICAgICBmeEZsZXg9XCIxMDAlXCIgXG4gICAgICAgICAgY29sb3I9XCJwcmltYXJ5XCIgXG4gICAgICAgICAgW2Rpc2FibGVkXT1cIiFCdWlsZFBpcGVsaW5lRm9ybUdyb3VwLnZhbGlkIHx8ICFCdWlsZFBpcGVsaW5lRm9ybUdyb3VwLmRpcnR5XCI+XG4gICAgICAgICAgPG1hdC1pY29uPnNhdmU8L21hdC1pY29uPlxuICAgICAgICAgIFNhdmUgQnVpbGQgUGlwZWxpbmVcbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIFxuICAgIDwvbWF0LWNhcmQtYWN0aW9ucz5cbiAgICA8L21hdC1jYXJkPlxuPC9mb3JtPlxuIl19