@rocketshow/designer 1.31.0 → 1.33.0

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 (339) hide show
  1. package/esm2022/lib/array-sort-pipe.mjs +30 -0
  2. package/esm2022/lib/designer.component.mjs +605 -0
  3. package/esm2022/lib/designer.module.mjs +183 -0
  4. package/esm2022/lib/designer.service.mjs +14 -0
  5. package/esm2022/lib/effect/effect-curve/effect-curve.component.mjs +569 -0
  6. package/esm2022/lib/effect/effect-pan-tilt/effect-pan-tilt.component.mjs +36 -0
  7. package/esm2022/lib/effect/effect.component.mjs +174 -0
  8. package/esm2022/lib/error-dialog/error-dialog.component.mjs +75 -0
  9. package/esm2022/lib/fixture/fixture-capability/fixture-capability-channel/fixture-capability-channel.component.mjs +222 -0
  10. package/esm2022/lib/fixture/fixture-capability/fixture-capability-color/fixture-capability-color.component.mjs +147 -0
  11. package/esm2022/lib/fixture/fixture-capability/fixture-capability-color-wheel/fixture-capability-color-wheel.component.mjs +213 -0
  12. package/esm2022/lib/fixture/fixture-capability/fixture-capability-dimmer/fixture-capability-dimmer.component.mjs +78 -0
  13. package/esm2022/lib/fixture/fixture-capability/fixture-capability-pan-tilt/fixture-capability-pan-tilt.component.mjs +119 -0
  14. package/esm2022/lib/fixture/fixture-capability/fixture-capability.component.mjs +169 -0
  15. package/esm2022/lib/fixture/fixture-channel/fixture-channel.component.mjs +160 -0
  16. package/esm2022/lib/fixture/fixture-settings/fixture-settings-position/fixture-settings-position.component.mjs +365 -0
  17. package/esm2022/lib/fixture/fixture-settings/fixture-settings-stage/fixture-settings-stage.component.mjs +151 -0
  18. package/esm2022/lib/fixture/fixture-settings/fixture-settings.component.mjs +46 -0
  19. package/esm2022/lib/fixture/fixture.component.mjs +138 -0
  20. package/esm2022/lib/fixture-pool/fixture-pool-create-from-file/fixture-pool-create-from-file.component.mjs +145 -0
  21. package/esm2022/lib/fixture-pool/fixture-pool.component.mjs +589 -0
  22. package/esm2022/lib/intro/intro.component.mjs +95 -0
  23. package/esm2022/lib/master-dimmer/master-dimmer.component.mjs +66 -0
  24. package/esm2022/lib/models/cached-fixture-capability.mjs +9 -0
  25. package/esm2022/lib/models/cached-fixture-channel.mjs +7 -0
  26. package/esm2022/lib/models/cached-fixture.mjs +6 -0
  27. package/esm2022/lib/models/color.mjs +8 -0
  28. package/esm2022/lib/models/composition.mjs +46 -0
  29. package/esm2022/lib/models/effect-curve-profile-channel.mjs +15 -0
  30. package/esm2022/lib/models/effect-curve.mjs +69 -0
  31. package/esm2022/lib/models/effect-pan-tilt.mjs +19 -0
  32. package/esm2022/lib/models/effect.mjs +12 -0
  33. package/esm2022/lib/models/fixture-capability-value.mjs +15 -0
  34. package/esm2022/lib/models/fixture-capability.mjs +84 -0
  35. package/esm2022/lib/models/fixture-channel-value.mjs +11 -0
  36. package/esm2022/lib/models/fixture-channel.mjs +24 -0
  37. package/esm2022/lib/models/fixture-mode.mjs +14 -0
  38. package/esm2022/lib/models/fixture-profile.mjs +70 -0
  39. package/esm2022/lib/models/fixture-wheel-slot.mjs +26 -0
  40. package/esm2022/lib/models/fixture-wheel.mjs +15 -0
  41. package/esm2022/lib/models/fixture.mjs +40 -0
  42. package/esm2022/lib/models/preset-region-scene.mjs +8 -0
  43. package/esm2022/lib/models/preset.mjs +56 -0
  44. package/esm2022/lib/models/project.mjs +68 -0
  45. package/esm2022/lib/models/scene-playback-region.mjs +11 -0
  46. package/esm2022/lib/models/scene.mjs +27 -0
  47. package/esm2022/lib/models/universe.mjs +11 -0
  48. package/esm2022/lib/preset/preset-settings/preset-settings.component.mjs +194 -0
  49. package/esm2022/lib/preset/preset.component.mjs +131 -0
  50. package/esm2022/lib/preview/models/color-changer-3d.mjs +167 -0
  51. package/esm2022/lib/preview/models/fixture-3d.mjs +150 -0
  52. package/esm2022/lib/preview/models/moving-head-3d.mjs +243 -0
  53. package/esm2022/lib/preview/preview.component.mjs +212 -0
  54. package/esm2022/lib/project/project-browser/project-browser.component.mjs +143 -0
  55. package/esm2022/lib/project/project-import/project-import.component.mjs +107 -0
  56. package/esm2022/lib/project/project-save/project-save.component.mjs +178 -0
  57. package/esm2022/lib/project/project-share/project-share.component.mjs +71 -0
  58. package/esm2022/lib/scene/scene-settings/scene-settings.component.mjs +146 -0
  59. package/esm2022/lib/scene/scene.component.mjs +110 -0
  60. package/esm2022/lib/services/animation.service.mjs +16 -0
  61. package/esm2022/lib/services/config.service.mjs +27 -0
  62. package/esm2022/lib/services/effect.service.mjs +14 -0
  63. package/esm2022/lib/services/error-dialog.service.mjs +39 -0
  64. package/esm2022/lib/services/fixture-pool.service.mjs +30 -0
  65. package/esm2022/lib/services/fixture.service.mjs +431 -0
  66. package/esm2022/lib/services/hotkey-target-exclude.service.mjs +24 -0
  67. package/esm2022/lib/services/intro.service.mjs +140 -0
  68. package/esm2022/lib/services/preset.service.mjs +400 -0
  69. package/esm2022/lib/services/preview-mesh.service.mjs +57 -0
  70. package/esm2022/lib/services/preview.service.mjs +496 -0
  71. package/esm2022/lib/services/project-load.service.mjs +149 -0
  72. package/esm2022/lib/services/project.service.mjs +97 -0
  73. package/esm2022/lib/services/scene.service.mjs +164 -0
  74. package/esm2022/lib/services/timeline.service.mjs +726 -0
  75. package/esm2022/lib/services/universe.service.mjs +23 -0
  76. package/esm2022/lib/services/user-ensure-login.service.mjs +38 -0
  77. package/esm2022/lib/services/user.service.mjs +89 -0
  78. package/esm2022/lib/services/uuid.service.mjs +23 -0
  79. package/esm2022/lib/services/warning-dialog.service.mjs +38 -0
  80. package/esm2022/lib/timeline/composition-settings/composition-settings.component.mjs +334 -0
  81. package/esm2022/lib/timeline/timeline-grid/timeline-grid.component.mjs +216 -0
  82. package/esm2022/lib/timeline/timeline.component.mjs +418 -0
  83. package/esm2022/lib/user/user-login/user-login.component.mjs +144 -0
  84. package/esm2022/lib/user/user-register/user-register.component.mjs +220 -0
  85. package/esm2022/lib/wait-dialog/wait-dialog.component.mjs +26 -0
  86. package/esm2022/lib/warning-dialog/warning-dialog.component.mjs +68 -0
  87. package/esm2022/public_api.mjs +7 -0
  88. package/esm2022/rocketshow-designer.mjs +5 -0
  89. package/fesm2022/rocketshow-designer.mjs +10626 -0
  90. package/fesm2022/rocketshow-designer.mjs.map +1 -0
  91. package/index.d.ts +5 -0
  92. package/lib/array-sort-pipe.d.ts +3 -0
  93. package/lib/designer.component.d.ts +15 -12
  94. package/lib/designer.module.d.ts +54 -0
  95. package/lib/designer.service.d.ts +3 -0
  96. package/lib/effect/effect-curve/effect-curve.component.d.ts +4 -1
  97. package/lib/effect/effect-pan-tilt/effect-pan-tilt.component.d.ts +3 -0
  98. package/lib/effect/effect.component.d.ts +3 -0
  99. package/lib/error-dialog/error-dialog.component.d.ts +3 -0
  100. package/lib/fixture/fixture-capability/fixture-capability-channel/fixture-capability-channel.component.d.ts +4 -1
  101. package/lib/fixture/fixture-capability/fixture-capability-color/fixture-capability-color.component.d.ts +3 -0
  102. package/lib/fixture/fixture-capability/fixture-capability-color-wheel/fixture-capability-color-wheel.component.d.ts +5 -2
  103. package/lib/fixture/fixture-capability/fixture-capability-dimmer/fixture-capability-dimmer.component.d.ts +3 -0
  104. package/lib/fixture/fixture-capability/fixture-capability-pan-tilt/fixture-capability-pan-tilt.component.d.ts +3 -0
  105. package/lib/fixture/fixture-capability/fixture-capability.component.d.ts +3 -0
  106. package/lib/fixture/fixture-channel/fixture-channel.component.d.ts +3 -0
  107. package/lib/fixture/fixture-settings/fixture-settings-position/fixture-settings-position.component.d.ts +3 -0
  108. package/lib/fixture/fixture-settings/fixture-settings-stage/fixture-settings-stage.component.d.ts +3 -0
  109. package/lib/fixture/fixture-settings/fixture-settings.component.d.ts +3 -0
  110. package/lib/fixture/fixture.component.d.ts +3 -0
  111. package/lib/fixture-pool/fixture-pool-create-from-file/fixture-pool-create-from-file.component.d.ts +3 -0
  112. package/lib/fixture-pool/fixture-pool.component.d.ts +3 -0
  113. package/lib/intro/intro.component.d.ts +3 -0
  114. package/lib/master-dimmer/master-dimmer.component.d.ts +3 -0
  115. package/lib/preset/preset-settings/preset-settings.component.d.ts +3 -0
  116. package/lib/preset/preset.component.d.ts +3 -0
  117. package/lib/preview/preview.component.d.ts +4 -4
  118. package/lib/project/project-browser/project-browser.component.d.ts +3 -0
  119. package/lib/project/project-import/project-import.component.d.ts +3 -0
  120. package/lib/project/project-save/project-save.component.d.ts +3 -0
  121. package/lib/project/project-share/project-share.component.d.ts +3 -0
  122. package/lib/scene/scene-settings/scene-settings.component.d.ts +3 -0
  123. package/lib/scene/scene.component.d.ts +3 -0
  124. package/lib/services/animation.service.d.ts +3 -0
  125. package/lib/services/config.service.d.ts +3 -0
  126. package/lib/services/effect.service.d.ts +3 -0
  127. package/lib/services/error-dialog.service.d.ts +3 -0
  128. package/lib/services/fixture-pool.service.d.ts +3 -0
  129. package/lib/services/fixture.service.d.ts +3 -0
  130. package/lib/services/hotkey-target-exclude.service.d.ts +3 -0
  131. package/lib/services/intro.service.d.ts +3 -0
  132. package/lib/services/preset.service.d.ts +3 -0
  133. package/lib/services/preview-mesh.service.d.ts +3 -0
  134. package/lib/services/preview.service.d.ts +4 -0
  135. package/lib/services/project-load.service.d.ts +3 -0
  136. package/lib/services/project.service.d.ts +3 -0
  137. package/lib/services/scene.service.d.ts +3 -0
  138. package/lib/services/timeline.service.d.ts +4 -1
  139. package/lib/services/universe.service.d.ts +3 -0
  140. package/lib/services/user-ensure-login.service.d.ts +3 -0
  141. package/lib/services/user.service.d.ts +3 -0
  142. package/lib/services/uuid.service.d.ts +3 -0
  143. package/lib/services/warning-dialog.service.d.ts +3 -0
  144. package/lib/timeline/composition-settings/composition-settings.component.d.ts +3 -0
  145. package/lib/timeline/timeline-grid/timeline-grid.component.d.ts +3 -0
  146. package/lib/timeline/timeline.component.d.ts +3 -0
  147. package/lib/user/user-login/user-login.component.d.ts +3 -0
  148. package/lib/user/user-register/user-register.component.d.ts +3 -0
  149. package/lib/wait-dialog/wait-dialog.component.d.ts +3 -0
  150. package/lib/warning-dialog/warning-dialog.component.d.ts +3 -0
  151. package/package.json +20 -22
  152. package/rocketshow-designer-1.33.0.tgz +0 -0
  153. package/bundles/rocketshow-designer.umd.js +0 -9947
  154. package/bundles/rocketshow-designer.umd.js.map +0 -1
  155. package/bundles/rocketshow-designer.umd.min.js +0 -17
  156. package/bundles/rocketshow-designer.umd.min.js.map +0 -1
  157. package/esm2015/lib/array-sort-pipe.js +0 -28
  158. package/esm2015/lib/designer.component.js +0 -411
  159. package/esm2015/lib/designer.module.js +0 -117
  160. package/esm2015/lib/designer.service.js +0 -16
  161. package/esm2015/lib/effect/effect-curve/effect-curve.component.js +0 -325
  162. package/esm2015/lib/effect/effect-pan-tilt/effect-pan-tilt.component.js +0 -30
  163. package/esm2015/lib/effect/effect.component.js +0 -73
  164. package/esm2015/lib/error-dialog/error-dialog.component.js +0 -42
  165. package/esm2015/lib/fixture/fixture-capability/fixture-capability-channel/fixture-capability-channel.component.js +0 -141
  166. package/esm2015/lib/fixture/fixture-capability/fixture-capability-color/fixture-capability-color.component.js +0 -128
  167. package/esm2015/lib/fixture/fixture-capability/fixture-capability-color-wheel/fixture-capability-color-wheel.component.js +0 -163
  168. package/esm2015/lib/fixture/fixture-capability/fixture-capability-dimmer/fixture-capability-dimmer.component.js +0 -60
  169. package/esm2015/lib/fixture/fixture-capability/fixture-capability-pan-tilt/fixture-capability-pan-tilt.component.js +0 -87
  170. package/esm2015/lib/fixture/fixture-capability/fixture-capability.component.js +0 -97
  171. package/esm2015/lib/fixture/fixture-channel/fixture-channel.component.js +0 -66
  172. package/esm2015/lib/fixture/fixture-settings/fixture-settings-position/fixture-settings-position.component.js +0 -200
  173. package/esm2015/lib/fixture/fixture-settings/fixture-settings-stage/fixture-settings-stage.component.js +0 -31
  174. package/esm2015/lib/fixture/fixture-settings/fixture-settings.component.js +0 -35
  175. package/esm2015/lib/fixture/fixture.component.js +0 -70
  176. package/esm2015/lib/fixture-pool/fixture-pool-create-from-file/fixture-pool-create-from-file.component.js +0 -128
  177. package/esm2015/lib/fixture-pool/fixture-pool.component.js +0 -331
  178. package/esm2015/lib/intro/intro.component.js +0 -25
  179. package/esm2015/lib/master-dimmer/master-dimmer.component.js +0 -41
  180. package/esm2015/lib/models/cached-fixture-capability.js +0 -9
  181. package/esm2015/lib/models/cached-fixture-channel.js +0 -7
  182. package/esm2015/lib/models/cached-fixture.js +0 -6
  183. package/esm2015/lib/models/color.js +0 -8
  184. package/esm2015/lib/models/composition.js +0 -46
  185. package/esm2015/lib/models/effect-curve-profile-channel.js +0 -15
  186. package/esm2015/lib/models/effect-curve.js +0 -69
  187. package/esm2015/lib/models/effect-pan-tilt.js +0 -19
  188. package/esm2015/lib/models/effect.js +0 -12
  189. package/esm2015/lib/models/fixture-capability-value.js +0 -15
  190. package/esm2015/lib/models/fixture-capability.js +0 -84
  191. package/esm2015/lib/models/fixture-channel-value.js +0 -11
  192. package/esm2015/lib/models/fixture-channel.js +0 -24
  193. package/esm2015/lib/models/fixture-mode.js +0 -14
  194. package/esm2015/lib/models/fixture-profile.js +0 -70
  195. package/esm2015/lib/models/fixture-wheel-slot.js +0 -26
  196. package/esm2015/lib/models/fixture-wheel.js +0 -15
  197. package/esm2015/lib/models/fixture.js +0 -40
  198. package/esm2015/lib/models/preset-region-scene.js +0 -8
  199. package/esm2015/lib/models/preset.js +0 -56
  200. package/esm2015/lib/models/project.js +0 -68
  201. package/esm2015/lib/models/scene-playback-region.js +0 -11
  202. package/esm2015/lib/models/scene.js +0 -27
  203. package/esm2015/lib/models/universe.js +0 -11
  204. package/esm2015/lib/preset/preset-settings/preset-settings.component.js +0 -66
  205. package/esm2015/lib/preset/preset.component.js +0 -85
  206. package/esm2015/lib/preview/models/color-changer-3d.js +0 -167
  207. package/esm2015/lib/preview/models/fixture-3d.js +0 -150
  208. package/esm2015/lib/preview/models/moving-head-3d.js +0 -233
  209. package/esm2015/lib/preview/preview.component.js +0 -242
  210. package/esm2015/lib/project/project-browser/project-browser.component.js +0 -73
  211. package/esm2015/lib/project/project-import/project-import.component.js +0 -89
  212. package/esm2015/lib/project/project-save/project-save.component.js +0 -105
  213. package/esm2015/lib/project/project-share/project-share.component.js +0 -43
  214. package/esm2015/lib/scene/scene-settings/scene-settings.component.js +0 -52
  215. package/esm2015/lib/scene/scene.component.js +0 -56
  216. package/esm2015/lib/services/animation.service.js +0 -17
  217. package/esm2015/lib/services/config.service.js +0 -28
  218. package/esm2015/lib/services/effect.service.js +0 -16
  219. package/esm2015/lib/services/error-dialog.service.js +0 -44
  220. package/esm2015/lib/services/fixture-pool.service.js +0 -34
  221. package/esm2015/lib/services/fixture.service.js +0 -443
  222. package/esm2015/lib/services/hotkey-target-exclude.service.js +0 -26
  223. package/esm2015/lib/services/intro.service.js +0 -144
  224. package/esm2015/lib/services/preset.service.js +0 -416
  225. package/esm2015/lib/services/preview-mesh.service.js +0 -58
  226. package/esm2015/lib/services/preview.service.js +0 -500
  227. package/esm2015/lib/services/project-load.service.js +0 -171
  228. package/esm2015/lib/services/project.service.js +0 -113
  229. package/esm2015/lib/services/scene.service.js +0 -174
  230. package/esm2015/lib/services/timeline.service.js +0 -738
  231. package/esm2015/lib/services/universe.service.js +0 -24
  232. package/esm2015/lib/services/user-ensure-login.service.js +0 -44
  233. package/esm2015/lib/services/user.service.js +0 -93
  234. package/esm2015/lib/services/uuid.service.js +0 -25
  235. package/esm2015/lib/services/warning-dialog.service.js +0 -43
  236. package/esm2015/lib/timeline/composition-settings/composition-settings.component.js +0 -197
  237. package/esm2015/lib/timeline/timeline-grid/timeline-grid.component.js +0 -55
  238. package/esm2015/lib/timeline/timeline.component.js +0 -239
  239. package/esm2015/lib/user/user-login/user-login.component.js +0 -64
  240. package/esm2015/lib/user/user-register/user-register.component.js +0 -89
  241. package/esm2015/lib/wait-dialog/wait-dialog.component.js +0 -16
  242. package/esm2015/lib/warning-dialog/warning-dialog.component.js +0 -42
  243. package/esm2015/public_api.js +0 -7
  244. package/esm2015/rocketshow-designer.js +0 -61
  245. package/esm5/lib/array-sort-pipe.js +0 -31
  246. package/esm5/lib/designer.component.js +0 -468
  247. package/esm5/lib/designer.module.js +0 -120
  248. package/esm5/lib/designer.service.js +0 -17
  249. package/esm5/lib/effect/effect-curve/effect-curve.component.js +0 -386
  250. package/esm5/lib/effect/effect-pan-tilt/effect-pan-tilt.component.js +0 -31
  251. package/esm5/lib/effect/effect.component.js +0 -75
  252. package/esm5/lib/error-dialog/error-dialog.component.js +0 -43
  253. package/esm5/lib/fixture/fixture-capability/fixture-capability-channel/fixture-capability-channel.component.js +0 -159
  254. package/esm5/lib/fixture/fixture-capability/fixture-capability-color/fixture-capability-color.component.js +0 -130
  255. package/esm5/lib/fixture/fixture-capability/fixture-capability-color-wheel/fixture-capability-color-wheel.component.js +0 -215
  256. package/esm5/lib/fixture/fixture-capability/fixture-capability-dimmer/fixture-capability-dimmer.component.js +0 -61
  257. package/esm5/lib/fixture/fixture-capability/fixture-capability-pan-tilt/fixture-capability-pan-tilt.component.js +0 -88
  258. package/esm5/lib/fixture/fixture-capability/fixture-capability.component.js +0 -130
  259. package/esm5/lib/fixture/fixture-channel/fixture-channel.component.js +0 -68
  260. package/esm5/lib/fixture/fixture-settings/fixture-settings-position/fixture-settings-position.component.js +0 -306
  261. package/esm5/lib/fixture/fixture-settings/fixture-settings-stage/fixture-settings-stage.component.js +0 -32
  262. package/esm5/lib/fixture/fixture-settings/fixture-settings.component.js +0 -36
  263. package/esm5/lib/fixture/fixture.component.js +0 -71
  264. package/esm5/lib/fixture-pool/fixture-pool-create-from-file/fixture-pool-create-from-file.component.js +0 -127
  265. package/esm5/lib/fixture-pool/fixture-pool.component.js +0 -430
  266. package/esm5/lib/intro/intro.component.js +0 -26
  267. package/esm5/lib/master-dimmer/master-dimmer.component.js +0 -42
  268. package/esm5/lib/models/cached-fixture-capability.js +0 -11
  269. package/esm5/lib/models/cached-fixture-channel.js +0 -9
  270. package/esm5/lib/models/cached-fixture.js +0 -8
  271. package/esm5/lib/models/color.js +0 -10
  272. package/esm5/lib/models/composition.js +0 -60
  273. package/esm5/lib/models/effect-curve-profile-channel.js +0 -29
  274. package/esm5/lib/models/effect-curve.js +0 -95
  275. package/esm5/lib/models/effect-pan-tilt.js +0 -24
  276. package/esm5/lib/models/effect.js +0 -14
  277. package/esm5/lib/models/fixture-capability-value.js +0 -17
  278. package/esm5/lib/models/fixture-capability.js +0 -86
  279. package/esm5/lib/models/fixture-channel-value.js +0 -13
  280. package/esm5/lib/models/fixture-channel.js +0 -38
  281. package/esm5/lib/models/fixture-mode.js +0 -16
  282. package/esm5/lib/models/fixture-profile.js +0 -114
  283. package/esm5/lib/models/fixture-wheel-slot.js +0 -28
  284. package/esm5/lib/models/fixture-wheel.js +0 -29
  285. package/esm5/lib/models/fixture.js +0 -42
  286. package/esm5/lib/models/preset-region-scene.js +0 -10
  287. package/esm5/lib/models/preset.js +0 -90
  288. package/esm5/lib/models/project.js +0 -122
  289. package/esm5/lib/models/scene-playback-region.js +0 -13
  290. package/esm5/lib/models/scene.js +0 -29
  291. package/esm5/lib/models/universe.js +0 -13
  292. package/esm5/lib/preset/preset-settings/preset-settings.component.js +0 -67
  293. package/esm5/lib/preset/preset.component.js +0 -86
  294. package/esm5/lib/preview/models/color-changer-3d.js +0 -194
  295. package/esm5/lib/preview/models/fixture-3d.js +0 -196
  296. package/esm5/lib/preview/models/moving-head-3d.js +0 -250
  297. package/esm5/lib/preview/preview.component.js +0 -280
  298. package/esm5/lib/project/project-browser/project-browser.component.js +0 -77
  299. package/esm5/lib/project/project-import/project-import.component.js +0 -88
  300. package/esm5/lib/project/project-save/project-save.component.js +0 -120
  301. package/esm5/lib/project/project-share/project-share.component.js +0 -44
  302. package/esm5/lib/scene/scene-settings/scene-settings.component.js +0 -53
  303. package/esm5/lib/scene/scene.component.js +0 -57
  304. package/esm5/lib/services/animation.service.js +0 -18
  305. package/esm5/lib/services/config.service.js +0 -29
  306. package/esm5/lib/services/effect.service.js +0 -17
  307. package/esm5/lib/services/error-dialog.service.js +0 -46
  308. package/esm5/lib/services/fixture-pool.service.js +0 -36
  309. package/esm5/lib/services/fixture.service.js +0 -643
  310. package/esm5/lib/services/hotkey-target-exclude.service.js +0 -27
  311. package/esm5/lib/services/intro.service.js +0 -145
  312. package/esm5/lib/services/preset.service.js +0 -637
  313. package/esm5/lib/services/preview-mesh.service.js +0 -61
  314. package/esm5/lib/services/preview.service.js +0 -754
  315. package/esm5/lib/services/project-load.service.js +0 -185
  316. package/esm5/lib/services/project.service.js +0 -127
  317. package/esm5/lib/services/scene.service.js +0 -251
  318. package/esm5/lib/services/timeline.service.js +0 -845
  319. package/esm5/lib/services/universe.service.js +0 -36
  320. package/esm5/lib/services/user-ensure-login.service.js +0 -45
  321. package/esm5/lib/services/user.service.js +0 -95
  322. package/esm5/lib/services/uuid.service.js +0 -26
  323. package/esm5/lib/services/warning-dialog.service.js +0 -45
  324. package/esm5/lib/timeline/composition-settings/composition-settings.component.js +0 -206
  325. package/esm5/lib/timeline/timeline-grid/timeline-grid.component.js +0 -56
  326. package/esm5/lib/timeline/timeline.component.js +0 -243
  327. package/esm5/lib/user/user-login/user-login.component.js +0 -66
  328. package/esm5/lib/user/user-register/user-register.component.js +0 -91
  329. package/esm5/lib/wait-dialog/wait-dialog.component.js +0 -18
  330. package/esm5/lib/warning-dialog/warning-dialog.component.js +0 -43
  331. package/esm5/public_api.js +0 -7
  332. package/esm5/rocketshow-designer.js +0 -61
  333. package/fesm2015/rocketshow-designer.js +0 -7945
  334. package/fesm2015/rocketshow-designer.js.map +0 -1
  335. package/fesm5/rocketshow-designer.js +0 -9690
  336. package/fesm5/rocketshow-designer.js.map +0 -1
  337. package/rocketshow-designer-1.31.0.tgz +0 -0
  338. package/rocketshow-designer.d.ts +0 -60
  339. package/rocketshow-designer.metadata.json +0 -1
@@ -0,0 +1,569 @@
1
+ import { Component, ElementRef, Input, ViewChild } from '@angular/core';
2
+ import { TranslateService } from '@ngx-translate/core';
3
+ import { timer } from 'rxjs';
4
+ import { map } from 'rxjs/operators';
5
+ import { EffectCurveProfileChannels } from '../../models/effect-curve-profile-channel';
6
+ import { FixtureCapability, FixtureCapabilityColor, FixtureCapabilityType } from '../../models/fixture-capability';
7
+ import { FixtureService } from '../../services/fixture.service';
8
+ import { PresetService } from '../../services/preset.service';
9
+ import { EffectCurve } from './../../models/effect-curve';
10
+ import { AnimationService } from './../../services/animation.service';
11
+ import * as i0 from "@angular/core";
12
+ import * as i1 from "../../services/preset.service";
13
+ import * as i2 from "./../../services/animation.service";
14
+ import * as i3 from "../../services/fixture.service";
15
+ import * as i4 from "@ngx-translate/core";
16
+ import * as i5 from "@angular/common";
17
+ import * as i6 from "@angular/forms";
18
+ import * as i7 from "ngx-bootstrap-slider";
19
+ import * as i8 from "ngx-bootstrap/popover";
20
+ const _c0 = ["curveGrid"];
21
+ function EffectCurveComponent_div_73_Template(rf, ctx) { if (rf & 1) {
22
+ const _r2 = i0.ɵɵgetCurrentView();
23
+ i0.ɵɵelementStart(0, "div", 29)(1, "input", 30);
24
+ i0.ɵɵlistener("change", function EffectCurveComponent_div_73_Template_input_change_1_listener($event) { const capability_r3 = i0.ɵɵrestoreView(_r2).$implicit; const ctx_r3 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r3.toggleCapability($event, capability_r3)); });
25
+ i0.ɵɵelementEnd();
26
+ i0.ɵɵelementStart(2, "label", 31);
27
+ i0.ɵɵtext(3);
28
+ i0.ɵɵpipe(4, "async");
29
+ i0.ɵɵelementEnd()();
30
+ } if (rf & 2) {
31
+ const capability_r3 = ctx.$implicit;
32
+ const i_r5 = ctx.index;
33
+ const ctx_r3 = i0.ɵɵnextContext();
34
+ i0.ɵɵadvance();
35
+ i0.ɵɵpropertyInterpolate1("id", "capability_", (ctx_r3.curve == null ? null : ctx_r3.curve.uuid) + "_" + i_r5, "");
36
+ i0.ɵɵproperty("ngModel", ctx_r3.capabilityChecked(capability_r3));
37
+ i0.ɵɵadvance();
38
+ i0.ɵɵpropertyInterpolate1("for", "capability_", (ctx_r3.curve == null ? null : ctx_r3.curve.uuid) + "_" + i_r5, "");
39
+ i0.ɵɵadvance();
40
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(4, 6, ctx_r3.getCapabilityName(capability_r3)));
41
+ } }
42
+ function EffectCurveComponent_div_75_div_1_Template(rf, ctx) { if (rf & 1) {
43
+ const _r6 = i0.ɵɵgetCurrentView();
44
+ i0.ɵɵelementStart(0, "div", 29)(1, "input", 30);
45
+ i0.ɵɵlistener("change", function EffectCurveComponent_div_75_div_1_Template_input_change_1_listener($event) { const profile_r7 = i0.ɵɵrestoreView(_r6).$implicit; const ctx_r3 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r3.changeProfileSelection($event, profile_r7)); });
46
+ i0.ɵɵelementEnd();
47
+ i0.ɵɵelementStart(2, "label", 31);
48
+ i0.ɵɵtext(3);
49
+ i0.ɵɵelementEnd()();
50
+ } if (rf & 2) {
51
+ const profile_r7 = ctx.$implicit;
52
+ const ctx_r3 = i0.ɵɵnextContext(2);
53
+ i0.ɵɵadvance();
54
+ i0.ɵɵpropertyInterpolate2("id", "channel_profile_", ctx_r3.curve == null ? null : ctx_r3.curve.uuid, "_", profile_r7.uuid, "");
55
+ i0.ɵɵproperty("ngModel", ctx_r3.selectedProfiles.indexOf(profile_r7) >= 0);
56
+ i0.ɵɵadvance();
57
+ i0.ɵɵpropertyInterpolate2("for", "channel_profile_", ctx_r3.curve == null ? null : ctx_r3.curve.uuid, "_", profile_r7.uuid, "");
58
+ i0.ɵɵadvance();
59
+ i0.ɵɵtextInterpolate(profile_r7.name);
60
+ } }
61
+ function EffectCurveComponent_div_75_Template(rf, ctx) { if (rf & 1) {
62
+ i0.ɵɵelementStart(0, "div");
63
+ i0.ɵɵtemplate(1, EffectCurveComponent_div_75_div_1_Template, 4, 8, "div", 25);
64
+ i0.ɵɵelement(2, "hr", 32);
65
+ i0.ɵɵelementEnd();
66
+ } if (rf & 2) {
67
+ const ctx_r3 = i0.ɵɵnextContext();
68
+ i0.ɵɵadvance();
69
+ i0.ɵɵproperty("ngForOf", ctx_r3.availableProfiles);
70
+ } }
71
+ function EffectCurveComponent_ng_container_76_div_1_Template(rf, ctx) { if (rf & 1) {
72
+ const _r8 = i0.ɵɵgetCurrentView();
73
+ i0.ɵɵelementStart(0, "div", 29)(1, "input", 30);
74
+ i0.ɵɵlistener("change", function EffectCurveComponent_ng_container_76_div_1_Template_input_change_1_listener($event) { const channel_r9 = i0.ɵɵrestoreView(_r8).$implicit; const entry_r10 = i0.ɵɵnextContext().$implicit; const ctx_r3 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r3.toggleChannel($event, entry_r10.key, channel_r9)); });
75
+ i0.ɵɵelementEnd();
76
+ i0.ɵɵelementStart(2, "label", 31);
77
+ i0.ɵɵtext(3);
78
+ i0.ɵɵelementEnd()();
79
+ } if (rf & 2) {
80
+ const channel_r9 = ctx.$implicit;
81
+ const j_r11 = ctx.index;
82
+ const ctx_r11 = i0.ɵɵnextContext();
83
+ const entry_r10 = ctx_r11.$implicit;
84
+ const i_r13 = ctx_r11.index;
85
+ const ctx_r3 = i0.ɵɵnextContext();
86
+ i0.ɵɵadvance();
87
+ i0.ɵɵpropertyInterpolate3("id", "channel_", ctx_r3.curve == null ? null : ctx_r3.curve.uuid, "_", i_r13, "_", j_r11, "");
88
+ i0.ɵɵproperty("ngModel", ctx_r3.channelChecked(entry_r10.key, channel_r9));
89
+ i0.ɵɵadvance();
90
+ i0.ɵɵpropertyInterpolate3("for", "channel_", ctx_r3.curve == null ? null : ctx_r3.curve.uuid, "_", i_r13, "_", j_r11, "");
91
+ i0.ɵɵadvance();
92
+ i0.ɵɵtextInterpolate(ctx_r3.getChannelName(entry_r10.key.name, channel_r9.name));
93
+ } }
94
+ function EffectCurveComponent_ng_container_76_Template(rf, ctx) { if (rf & 1) {
95
+ i0.ɵɵelementContainerStart(0);
96
+ i0.ɵɵtemplate(1, EffectCurveComponent_ng_container_76_div_1_Template, 4, 10, "div", 25);
97
+ i0.ɵɵelementContainerEnd();
98
+ } if (rf & 2) {
99
+ const entry_r10 = ctx.$implicit;
100
+ i0.ɵɵadvance();
101
+ i0.ɵɵproperty("ngForOf", entry_r10.value);
102
+ } }
103
+ export class EffectCurveComponent {
104
+ // whether the effect is currently being edited (open) or not
105
+ set isSelected(value) {
106
+ if (value) {
107
+ // start the update timer
108
+ if (!this.gridUpdateSubscription) {
109
+ this.gridUpdateSubscription = timer(0, 15).subscribe(() => {
110
+ this.redraw();
111
+ });
112
+ }
113
+ }
114
+ else {
115
+ // stop the update timer
116
+ if (this.gridUpdateSubscription) {
117
+ this.gridUpdateSubscription.unsubscribe();
118
+ this.gridUpdateSubscription = undefined;
119
+ }
120
+ }
121
+ }
122
+ constructor(presetService, animationService, fixtureService, translate) {
123
+ this.presetService = presetService;
124
+ this.animationService = animationService;
125
+ this.fixtureService = fixtureService;
126
+ this.translate = translate;
127
+ this.lengthMillisMin = 20;
128
+ this.lengthMillisMax = 8000;
129
+ this.amplitudeMin = 0;
130
+ this.amplitudeMax = 4;
131
+ this.percentageMin = 0;
132
+ this.percentageMax = 1;
133
+ this.phaseMillisMin = -1000;
134
+ this.phaseMillisMax = 1000;
135
+ this.phasingMillisMin = 0;
136
+ this.phasingMillisMax = 1000;
137
+ // the selected capabilities
138
+ this.availableCapabilities = [];
139
+ // the selected channels
140
+ this.availableChannels = new Map();
141
+ this.availableProfiles = [];
142
+ this.selectedProfiles = [];
143
+ this.presetService.fixtureSelectionChanged.subscribe(() => {
144
+ this.updateCapabilitiesAndChannels();
145
+ });
146
+ this.updateCapabilitiesAndChannels();
147
+ }
148
+ ngOnInit() {
149
+ const canvas = this.curveGrid.nativeElement;
150
+ this.ctx = canvas.getContext('2d');
151
+ this.maxWidth = canvas.width;
152
+ this.maxHeight = canvas.height;
153
+ this.redraw();
154
+ }
155
+ drawCurrentValue(currMillis, radius, lineWidth, durationMillis, maxHeight) {
156
+ const currVal = 1 - this.curve.getValueAtMillis(currMillis);
157
+ const x = (this.maxWidth * (currMillis % durationMillis)) / durationMillis;
158
+ const y = maxHeight * currVal + lineWidth;
159
+ this.ctx.beginPath();
160
+ this.ctx.arc(x, y, radius, 0, 2 * Math.PI, false);
161
+ this.ctx.fillStyle = '#fff';
162
+ this.ctx.fill();
163
+ this.ctx.lineWidth = 1;
164
+ this.ctx.strokeStyle = '#000';
165
+ this.ctx.stroke();
166
+ }
167
+ getPhasingCount() {
168
+ let count = 0;
169
+ const countedDmxChannels = [];
170
+ for (const fixtureUuid of this.presetService.selectedPreset.fixtureUuids) {
171
+ const fixture = this.fixtureService.getFixtureByUuid(fixtureUuid);
172
+ if (!countedDmxChannels.includes(fixture.dmxFirstChannel)) {
173
+ count++;
174
+ countedDmxChannels.push(fixture.dmxFirstChannel);
175
+ }
176
+ }
177
+ return count;
178
+ }
179
+ redraw() {
180
+ this.ctx.clearRect(0, 0, this.maxWidth, this.maxHeight);
181
+ this.ctx.fillStyle = '#fff';
182
+ this.ctx.strokeStyle = '#fff';
183
+ // the width of the lines
184
+ const width = 3;
185
+ this.ctx.lineWidth = width;
186
+ let oldX;
187
+ let oldY;
188
+ let step = 50;
189
+ if (length < 500) {
190
+ step = 5;
191
+ }
192
+ const durationMillis = this.curve.lengthMillis * Math.max(Math.round(4 - this.curve.lengthMillis / 1000), 1);
193
+ const maxHeight = this.maxHeight - width * 2;
194
+ // draw the curve
195
+ for (let i = -step * 2; i < durationMillis + step * 2; i += step) {
196
+ const val = 1 - this.curve.getValueAtMillis(i);
197
+ // Scale the values to the grid dimensions
198
+ const x = (this.maxWidth * i) / durationMillis;
199
+ const y = maxHeight * val + width;
200
+ if (oldY) {
201
+ this.ctx.beginPath();
202
+ this.ctx.moveTo(oldX, oldY);
203
+ this.ctx.lineTo(x, y);
204
+ this.ctx.stroke();
205
+ }
206
+ oldX = x;
207
+ oldY = y;
208
+ }
209
+ // draw the current value
210
+ this.drawCurrentValue(this.animationService.timeMillis % durationMillis, 5, width, durationMillis, maxHeight);
211
+ // draw the phasing values (chase), if required
212
+ let phasingCount = 0;
213
+ if (this.curve.phasingMillis > 0 && this.presetService.selectedPreset) {
214
+ phasingCount = this.getPhasingCount();
215
+ }
216
+ for (let i = 1; i < phasingCount; i++) {
217
+ this.drawCurrentValue((this.animationService.timeMillis - i * this.curve.phasingMillis) % durationMillis, 3, width, durationMillis, maxHeight);
218
+ }
219
+ }
220
+ calculateChannelCapabilities() {
221
+ this.availableChannels = this.presetService.getSelectedProfileChannels(this.selectedProfiles);
222
+ }
223
+ changeProfileSelection($event, profile) {
224
+ if (this.selectedProfiles.indexOf(profile) >= 0) {
225
+ this.selectedProfiles.splice(this.selectedProfiles.indexOf(profile), 1);
226
+ }
227
+ else {
228
+ this.selectedProfiles.push(profile);
229
+ }
230
+ this.calculateChannelCapabilities();
231
+ }
232
+ updateCapabilitiesAndChannels() {
233
+ // capabilities
234
+ this.availableCapabilities = [];
235
+ if (this.presetService.hasCapabilityDimmer()) {
236
+ const capability = new FixtureCapability();
237
+ capability.type = FixtureCapabilityType.Intensity;
238
+ this.availableCapabilities.push(capability);
239
+ }
240
+ if (this.presetService.hasCapabilityColor()) {
241
+ let capability = new FixtureCapability();
242
+ capability.type = FixtureCapabilityType.ColorIntensity;
243
+ capability.color = FixtureCapabilityColor.Red;
244
+ this.availableCapabilities.push(capability);
245
+ capability = new FixtureCapability();
246
+ capability.type = FixtureCapabilityType.ColorIntensity;
247
+ capability.color = FixtureCapabilityColor.Green;
248
+ this.availableCapabilities.push(capability);
249
+ capability = new FixtureCapability();
250
+ capability.type = FixtureCapabilityType.ColorIntensity;
251
+ capability.color = FixtureCapabilityColor.Blue;
252
+ this.availableCapabilities.push(capability);
253
+ }
254
+ if (this.presetService.hasCapabilityPanTilt()) {
255
+ let capability = new FixtureCapability();
256
+ capability.type = FixtureCapabilityType.Pan;
257
+ this.availableCapabilities.push(capability);
258
+ capability = new FixtureCapability();
259
+ capability.type = FixtureCapabilityType.Tilt;
260
+ this.availableCapabilities.push(capability);
261
+ }
262
+ // calculate all profiles
263
+ this.availableProfiles = this.presetService.getSelectedProfiles();
264
+ // select all profiles by default
265
+ this.selectedProfiles = [...this.availableProfiles];
266
+ // calculate all channels
267
+ this.calculateChannelCapabilities();
268
+ }
269
+ getCapabilityName(capability) {
270
+ return this.translate
271
+ .get(['designer.fixtureCapabilityType.' + capability.type, 'designer.fixtureCapabilityColor.' + capability.color])
272
+ .pipe(map((result) => {
273
+ let name = '';
274
+ name += result['designer.fixtureCapabilityType.' + capability.type];
275
+ if (capability.color) {
276
+ name += ', ' + result['designer.fixtureCapabilityColor.' + capability.color];
277
+ }
278
+ else {
279
+ return name;
280
+ }
281
+ return name;
282
+ }));
283
+ }
284
+ capabilityChecked(capability) {
285
+ for (const existingCapability of this.curve.capabilities) {
286
+ if (this.fixtureService.capabilitiesMatch(existingCapability.type, capability.type, existingCapability.color, capability.color, null, null, null, null)) {
287
+ return true;
288
+ }
289
+ }
290
+ return false;
291
+ }
292
+ toggleCapability(event, capability) {
293
+ if (event.currentTarget.checked) {
294
+ // add the capability
295
+ this.curve.capabilities.push(capability);
296
+ }
297
+ else {
298
+ // Remove the channel
299
+ for (let i = 0; i < this.curve.capabilities.length; i++) {
300
+ const existingCapability = this.curve.capabilities[i];
301
+ if (this.fixtureService.capabilitiesMatch(existingCapability.type, capability.type, existingCapability.color, capability.color, null, null, null, null)) {
302
+ this.curve.capabilities.splice(i, 1);
303
+ }
304
+ }
305
+ }
306
+ this.presetService.previewLive();
307
+ }
308
+ getChannelName(profileName, channelName) {
309
+ if (this.availableProfiles.length > 1) {
310
+ return profileName + ' - ' + channelName;
311
+ }
312
+ return channelName;
313
+ }
314
+ channelChecked(profile, channel) {
315
+ for (const profileChannels of this.curve.channels) {
316
+ if (profileChannels.profileUuid === profile.uuid) {
317
+ if (profileChannels.channels.includes(channel.name)) {
318
+ return true;
319
+ }
320
+ break;
321
+ }
322
+ }
323
+ return false;
324
+ }
325
+ toggleChannel(event, profile, channel) {
326
+ // add the profile, if necessary
327
+ let profileContained = false;
328
+ for (const profileChannels of this.curve.channels) {
329
+ if (profileChannels.profileUuid === profile.uuid) {
330
+ profileContained = true;
331
+ break;
332
+ }
333
+ }
334
+ if (!profileContained) {
335
+ const profileChannels = new EffectCurveProfileChannels();
336
+ profileChannels.profileUuid = profile.uuid;
337
+ this.curve.channels.push(profileChannels);
338
+ }
339
+ // add or delete the channel
340
+ for (const profileChannels of this.curve.channels) {
341
+ if (profileChannels.profileUuid === profile.uuid) {
342
+ const index = profileChannels.channels.indexOf(channel.name);
343
+ if (index >= 0) {
344
+ profileChannels.channels.splice(index, 1);
345
+ }
346
+ else {
347
+ profileChannels.channels.push(channel.name);
348
+ }
349
+ break;
350
+ }
351
+ }
352
+ this.presetService.previewLive();
353
+ }
354
+ setLengthMillis(value) {
355
+ if (!isNaN(value) && value >= this.lengthMillisMin && value <= this.lengthMillisMax) {
356
+ this.curve.lengthMillis = +value;
357
+ this.presetService.previewLive();
358
+ }
359
+ }
360
+ setAmplitude(value) {
361
+ if (!isNaN(value) && value >= this.amplitudeMin && value <= this.amplitudeMax) {
362
+ this.curve.amplitude = +value;
363
+ this.presetService.previewLive();
364
+ }
365
+ }
366
+ setPosition(value) {
367
+ if (!isNaN(value) && value >= this.percentageMin && value <= this.percentageMax) {
368
+ this.curve.position = +value;
369
+ this.presetService.previewLive();
370
+ }
371
+ }
372
+ setPhaseMillis(value) {
373
+ if (!isNaN(value) && value >= this.phaseMillisMin && value <= this.phaseMillisMax) {
374
+ this.curve.phaseMillis = +value;
375
+ this.presetService.previewLive();
376
+ }
377
+ }
378
+ setPhasingMillis(value) {
379
+ if (!isNaN(value) && value >= this.phasingMillisMin && value <= this.phasingMillisMax) {
380
+ this.curve.phasingMillis = +value;
381
+ this.presetService.previewLive();
382
+ }
383
+ }
384
+ static { this.ɵfac = function EffectCurveComponent_Factory(t) { return new (t || EffectCurveComponent)(i0.ɵɵdirectiveInject(i1.PresetService), i0.ɵɵdirectiveInject(i2.AnimationService), i0.ɵɵdirectiveInject(i3.FixtureService), i0.ɵɵdirectiveInject(i4.TranslateService)); }; }
385
+ static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: EffectCurveComponent, selectors: [["lib-app-effect-curve"]], viewQuery: function EffectCurveComponent_Query(rf, ctx) { if (rf & 1) {
386
+ i0.ɵɵviewQuery(_c0, 7);
387
+ } if (rf & 2) {
388
+ let _t;
389
+ i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.curveGrid = _t.first);
390
+ } }, inputs: { curve: "curve", isSelected: "isSelected" }, decls: 78, vars: 83, consts: [["curveGrid", ""], [1, "mr-3", 2, "float", "left"], [1, "mb-2"], [2, "width", "200px", "height", "20px", 3, "ngModelChange", "ngModel"], [3, "value"], ["width", "200", "height", "100", "viewBox", "150 -75 4850 5150", "preserveAspectRatio", "none", 1, "curve-grid"], [1, "mr-4", 2, "float", "left"], [1, "d-flex"], [1, "my-auto", 2, "width", "100px", "float", "left"], [1, "my-auto", 2, "float", "left"], [2, "width", "80px", 3, "change", "valueChange", "value", "tooltip", "value", "min", "max", "step"], [1, "my-auto"], ["type", "text", 1, "slider-input", 3, "ngModelChange", "ngModel"], [1, "my-auto", "ml-1"], [2, "width", "80px", 3, "change", "valueChange", "value", "tooltip", "min", "max", "step"], [2, "width", "80px", "height", "18px", 3, "change", "valueChange", "value", "tooltip", "min", "max", "step"], [1, "col", "col-auto", "p-0", 2, "margin-right", "1px", "width", "50px", "float", "left"], ["id", "v-pills-tab", "role", "tablist", "aria-orientation", "vertical", 1, "nav", "flex-column", "nav-pills"], ["id", "v-pills-effect-capabilities-tab", "container", "body", "placement", "right", "triggers", "mouseenter:mouseleave", "data-toggle", "pill", "role", "tab", "aria-controls", "v-pills-capabilities", "aria-selected", "true", 1, "nav-link", "px-3", "active", 3, "popover", "href"], ["aria-hidden", "true", 1, "fa", "fa-bolt", "fa-fw"], ["id", "v-pills-effect-channels-tab", "container", "body", "placement", "right", "triggers", "mouseenter:mouseleave", "data-toggle", "pill", "role", "tab", "aria-controls", "v-pills-channels", "aria-selected", "false", 1, "nav-link", "px-3", 3, "popover", "href"], ["aria-hidden", "true", 1, "fa", "fa-sliders", "fa-fw"], [1, "applying-to"], ["id", "v-pills-tabContent", 1, "tab-content", "h-100"], ["role", "tabpanel", 1, "tab-pane", "h-100", "show", "active", 3, "id"], ["class", "form-check", 4, "ngFor", "ngForOf"], ["role", "tabpanel", 1, "tab-pane", "h-100", "show", 3, "id"], [4, "ngIf"], [4, "ngFor", "ngForOf"], [1, "form-check"], ["type", "checkbox", 1, "form-check-input", 3, "change", "id", "ngModel"], [1, "form-check-label", 3, "for"], [1, "my-1", 2, "border-color", "white"]], template: function EffectCurveComponent_Template(rf, ctx) { if (rf & 1) {
391
+ const _r1 = i0.ɵɵgetCurrentView();
392
+ i0.ɵɵelementStart(0, "div", 1)(1, "div", 2)(2, "select", 3);
393
+ i0.ɵɵlistener("ngModelChange", function EffectCurveComponent_Template_select_ngModelChange_2_listener($event) { i0.ɵɵrestoreView(_r1); ctx.curve.curveType = $event; return i0.ɵɵresetView(ctx.presetService.previewLive()); });
394
+ i0.ɵɵelementStart(3, "option", 4);
395
+ i0.ɵɵtext(4);
396
+ i0.ɵɵpipe(5, "translate");
397
+ i0.ɵɵelementEnd();
398
+ i0.ɵɵelementStart(6, "option", 4);
399
+ i0.ɵɵtext(7);
400
+ i0.ɵɵpipe(8, "translate");
401
+ i0.ɵɵelementEnd()()();
402
+ i0.ɵɵelementStart(9, "div");
403
+ i0.ɵɵelement(10, "canvas", 5, 0);
404
+ i0.ɵɵelementEnd()();
405
+ i0.ɵɵelementStart(12, "div", 6)(13, "div", 7)(14, "div", 8);
406
+ i0.ɵɵtext(15);
407
+ i0.ɵɵpipe(16, "translate");
408
+ i0.ɵɵelementEnd();
409
+ i0.ɵɵelementStart(17, "div", 9)(18, "mv-slider", 10);
410
+ i0.ɵɵlistener("change", function EffectCurveComponent_Template_mv_slider_change_18_listener() { i0.ɵɵrestoreView(_r1); ctx.redraw(); return i0.ɵɵresetView(ctx.presetService.previewLive()); });
411
+ i0.ɵɵtwoWayListener("valueChange", function EffectCurveComponent_Template_mv_slider_valueChange_18_listener($event) { i0.ɵɵrestoreView(_r1); i0.ɵɵtwoWayBindingSet(ctx.curve.lengthMillis, $event) || (ctx.curve.lengthMillis = $event); return i0.ɵɵresetView($event); });
412
+ i0.ɵɵelementEnd()();
413
+ i0.ɵɵelementStart(19, "div", 11)(20, "input", 12);
414
+ i0.ɵɵlistener("ngModelChange", function EffectCurveComponent_Template_input_ngModelChange_20_listener($event) { i0.ɵɵrestoreView(_r1); ctx.setLengthMillis($event); return i0.ɵɵresetView(ctx.redraw()); });
415
+ i0.ɵɵelementEnd()();
416
+ i0.ɵɵelementStart(21, "div", 13);
417
+ i0.ɵɵtext(22);
418
+ i0.ɵɵpipe(23, "translate");
419
+ i0.ɵɵelementEnd()();
420
+ i0.ɵɵelementStart(24, "div", 7)(25, "div", 8);
421
+ i0.ɵɵtext(26);
422
+ i0.ɵɵpipe(27, "translate");
423
+ i0.ɵɵelementEnd();
424
+ i0.ɵɵelementStart(28, "div", 9)(29, "mv-slider", 14);
425
+ i0.ɵɵlistener("change", function EffectCurveComponent_Template_mv_slider_change_29_listener() { i0.ɵɵrestoreView(_r1); ctx.redraw(); return i0.ɵɵresetView(ctx.presetService.previewLive()); });
426
+ i0.ɵɵtwoWayListener("valueChange", function EffectCurveComponent_Template_mv_slider_valueChange_29_listener($event) { i0.ɵɵrestoreView(_r1); i0.ɵɵtwoWayBindingSet(ctx.curve.amplitude, $event) || (ctx.curve.amplitude = $event); return i0.ɵɵresetView($event); });
427
+ i0.ɵɵelementEnd()();
428
+ i0.ɵɵelementStart(30, "div", 11)(31, "input", 12);
429
+ i0.ɵɵlistener("ngModelChange", function EffectCurveComponent_Template_input_ngModelChange_31_listener($event) { i0.ɵɵrestoreView(_r1); ctx.setAmplitude($event); return i0.ɵɵresetView(ctx.redraw()); });
430
+ i0.ɵɵelementEnd()()();
431
+ i0.ɵɵelementStart(32, "div", 7)(33, "div", 8);
432
+ i0.ɵɵtext(34);
433
+ i0.ɵɵpipe(35, "translate");
434
+ i0.ɵɵelementEnd();
435
+ i0.ɵɵelementStart(36, "div", 9)(37, "mv-slider", 15);
436
+ i0.ɵɵlistener("change", function EffectCurveComponent_Template_mv_slider_change_37_listener() { i0.ɵɵrestoreView(_r1); ctx.redraw(); return i0.ɵɵresetView(ctx.presetService.previewLive()); });
437
+ i0.ɵɵtwoWayListener("valueChange", function EffectCurveComponent_Template_mv_slider_valueChange_37_listener($event) { i0.ɵɵrestoreView(_r1); i0.ɵɵtwoWayBindingSet(ctx.curve.position, $event) || (ctx.curve.position = $event); return i0.ɵɵresetView($event); });
438
+ i0.ɵɵelementEnd()();
439
+ i0.ɵɵelementStart(38, "div", 11)(39, "input", 12);
440
+ i0.ɵɵlistener("ngModelChange", function EffectCurveComponent_Template_input_ngModelChange_39_listener($event) { i0.ɵɵrestoreView(_r1); ctx.setPosition($event); return i0.ɵɵresetView(ctx.redraw()); });
441
+ i0.ɵɵelementEnd()()();
442
+ i0.ɵɵelementStart(40, "div", 7)(41, "div", 8);
443
+ i0.ɵɵtext(42);
444
+ i0.ɵɵpipe(43, "translate");
445
+ i0.ɵɵelementEnd();
446
+ i0.ɵɵelementStart(44, "div", 9)(45, "mv-slider", 15);
447
+ i0.ɵɵlistener("change", function EffectCurveComponent_Template_mv_slider_change_45_listener() { i0.ɵɵrestoreView(_r1); ctx.redraw(); return i0.ɵɵresetView(ctx.presetService.previewLive()); });
448
+ i0.ɵɵtwoWayListener("valueChange", function EffectCurveComponent_Template_mv_slider_valueChange_45_listener($event) { i0.ɵɵrestoreView(_r1); i0.ɵɵtwoWayBindingSet(ctx.curve.phaseMillis, $event) || (ctx.curve.phaseMillis = $event); return i0.ɵɵresetView($event); });
449
+ i0.ɵɵelementEnd()();
450
+ i0.ɵɵelementStart(46, "div", 11)(47, "input", 12);
451
+ i0.ɵɵlistener("ngModelChange", function EffectCurveComponent_Template_input_ngModelChange_47_listener($event) { i0.ɵɵrestoreView(_r1); ctx.setPhaseMillis($event); return i0.ɵɵresetView(ctx.redraw()); });
452
+ i0.ɵɵelementEnd()();
453
+ i0.ɵɵelementStart(48, "div", 13);
454
+ i0.ɵɵtext(49);
455
+ i0.ɵɵpipe(50, "translate");
456
+ i0.ɵɵelementEnd()();
457
+ i0.ɵɵelementStart(51, "div", 7)(52, "div", 8);
458
+ i0.ɵɵtext(53);
459
+ i0.ɵɵpipe(54, "translate");
460
+ i0.ɵɵelementEnd();
461
+ i0.ɵɵelementStart(55, "div", 9)(56, "mv-slider", 15);
462
+ i0.ɵɵlistener("change", function EffectCurveComponent_Template_mv_slider_change_56_listener() { i0.ɵɵrestoreView(_r1); ctx.redraw(); return i0.ɵɵresetView(ctx.presetService.previewLive()); });
463
+ i0.ɵɵtwoWayListener("valueChange", function EffectCurveComponent_Template_mv_slider_valueChange_56_listener($event) { i0.ɵɵrestoreView(_r1); i0.ɵɵtwoWayBindingSet(ctx.curve.phasingMillis, $event) || (ctx.curve.phasingMillis = $event); return i0.ɵɵresetView($event); });
464
+ i0.ɵɵelementEnd()();
465
+ i0.ɵɵelementStart(57, "div", 11)(58, "input", 12);
466
+ i0.ɵɵlistener("ngModelChange", function EffectCurveComponent_Template_input_ngModelChange_58_listener($event) { i0.ɵɵrestoreView(_r1); ctx.setPhasingMillis($event); return i0.ɵɵresetView(ctx.redraw()); });
467
+ i0.ɵɵelementEnd()();
468
+ i0.ɵɵelementStart(59, "div", 13);
469
+ i0.ɵɵtext(60);
470
+ i0.ɵɵpipe(61, "translate");
471
+ i0.ɵɵelementEnd()()();
472
+ i0.ɵɵelementStart(62, "div", 16)(63, "div", 17)(64, "a", 18);
473
+ i0.ɵɵpipe(65, "translate");
474
+ i0.ɵɵelement(66, "i", 19);
475
+ i0.ɵɵelementEnd();
476
+ i0.ɵɵelementStart(67, "a", 20);
477
+ i0.ɵɵpipe(68, "translate");
478
+ i0.ɵɵelement(69, "i", 21);
479
+ i0.ɵɵelementEnd()()();
480
+ i0.ɵɵelementStart(70, "div", 22)(71, "div", 23)(72, "div", 24);
481
+ i0.ɵɵtemplate(73, EffectCurveComponent_div_73_Template, 5, 8, "div", 25);
482
+ i0.ɵɵelementEnd();
483
+ i0.ɵɵelementStart(74, "div", 26);
484
+ i0.ɵɵtemplate(75, EffectCurveComponent_div_75_Template, 3, 1, "div", 27)(76, EffectCurveComponent_ng_container_76_Template, 2, 1, "ng-container", 28);
485
+ i0.ɵɵpipe(77, "keyvalue");
486
+ i0.ɵɵelementEnd()()();
487
+ } if (rf & 2) {
488
+ i0.ɵɵadvance(2);
489
+ i0.ɵɵproperty("ngModel", ctx.curve.curveType);
490
+ i0.ɵɵadvance();
491
+ i0.ɵɵproperty("value", "sine");
492
+ i0.ɵɵadvance();
493
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(5, 57, "designer.effect.curve-sine"), " ");
494
+ i0.ɵɵadvance(2);
495
+ i0.ɵɵproperty("value", "square");
496
+ i0.ɵɵadvance();
497
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(8, 59, "designer.effect.curve-square"), " ");
498
+ i0.ɵɵadvance(8);
499
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(16, 61, "designer.effect.curve-length"), " ");
500
+ i0.ɵɵadvance(3);
501
+ i0.ɵɵtwoWayProperty("value", ctx.curve.lengthMillis);
502
+ i0.ɵɵproperty("tooltip", "hide")("value", 0)("min", ctx.lengthMillisMin)("max", ctx.lengthMillisMax)("step", 1);
503
+ i0.ɵɵadvance(2);
504
+ i0.ɵɵproperty("ngModel", ctx.curve.lengthMillis);
505
+ i0.ɵɵadvance(2);
506
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(23, 63, "designer.misc.ms"), " ");
507
+ i0.ɵɵadvance(4);
508
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(27, 65, "designer.effect.curve-amplitude"), " ");
509
+ i0.ɵɵadvance(3);
510
+ i0.ɵɵtwoWayProperty("value", ctx.curve.amplitude);
511
+ i0.ɵɵproperty("tooltip", "hide")("min", ctx.amplitudeMin)("max", ctx.amplitudeMax)("step", 0.01);
512
+ i0.ɵɵadvance(2);
513
+ i0.ɵɵproperty("ngModel", ctx.curve.amplitude);
514
+ i0.ɵɵadvance(3);
515
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(35, 67, "designer.effect.curve-position"), " ");
516
+ i0.ɵɵadvance(3);
517
+ i0.ɵɵtwoWayProperty("value", ctx.curve.position);
518
+ i0.ɵɵproperty("tooltip", "hide")("min", ctx.percentageMin)("max", ctx.percentageMax)("step", 0.01);
519
+ i0.ɵɵadvance(2);
520
+ i0.ɵɵproperty("ngModel", ctx.curve.position);
521
+ i0.ɵɵadvance(3);
522
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(43, 69, "designer.effect.curve-phase"), " ");
523
+ i0.ɵɵadvance(3);
524
+ i0.ɵɵtwoWayProperty("value", ctx.curve.phaseMillis);
525
+ i0.ɵɵproperty("tooltip", "hide")("min", ctx.phaseMillisMin)("max", ctx.phaseMillisMax)("step", 1);
526
+ i0.ɵɵadvance(2);
527
+ i0.ɵɵproperty("ngModel", ctx.curve.phaseMillis);
528
+ i0.ɵɵadvance(2);
529
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(50, 71, "designer.misc.ms"), " ");
530
+ i0.ɵɵadvance(4);
531
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(54, 73, "designer.effect.curve-chase"), " ");
532
+ i0.ɵɵadvance(3);
533
+ i0.ɵɵtwoWayProperty("value", ctx.curve.phasingMillis);
534
+ i0.ɵɵproperty("tooltip", "hide")("min", ctx.phasingMillisMin)("max", ctx.phasingMillisMax)("step", 1);
535
+ i0.ɵɵadvance(2);
536
+ i0.ɵɵproperty("ngModel", ctx.curve.phasingMillis);
537
+ i0.ɵɵadvance(2);
538
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(61, 75, "designer.misc.ms"), " ");
539
+ i0.ɵɵadvance(4);
540
+ i0.ɵɵpropertyInterpolate("popover", i0.ɵɵpipeBind1(65, 77, "designer.misc.capabilities"));
541
+ i0.ɵɵpropertyInterpolate1("href", "#v-pills-effect-capabilities-", ctx.curve == null ? null : ctx.curve.uuid, "", i0.ɵɵsanitizeUrl);
542
+ i0.ɵɵadvance(3);
543
+ i0.ɵɵpropertyInterpolate("popover", i0.ɵɵpipeBind1(68, 79, "designer.misc.channels"));
544
+ i0.ɵɵpropertyInterpolate1("href", "#v-pills-effect-channels-", ctx.curve == null ? null : ctx.curve.uuid, "", i0.ɵɵsanitizeUrl);
545
+ i0.ɵɵadvance(5);
546
+ i0.ɵɵpropertyInterpolate1("id", "v-pills-effect-capabilities-", ctx.curve == null ? null : ctx.curve.uuid, "");
547
+ i0.ɵɵadvance();
548
+ i0.ɵɵproperty("ngForOf", ctx.availableCapabilities);
549
+ i0.ɵɵadvance();
550
+ i0.ɵɵpropertyInterpolate1("id", "v-pills-effect-channels-", ctx.curve == null ? null : ctx.curve.uuid, "");
551
+ i0.ɵɵadvance();
552
+ i0.ɵɵproperty("ngIf", ctx.availableProfiles.length > 1);
553
+ i0.ɵɵadvance();
554
+ i0.ɵɵproperty("ngForOf", i0.ɵɵpipeBind1(77, 81, ctx.availableChannels));
555
+ } }, dependencies: [i5.NgForOf, i5.NgIf, i6.NgSelectOption, i6.ɵNgSelectMultipleOption, i6.DefaultValueAccessor, i6.CheckboxControlValueAccessor, i6.SelectControlValueAccessor, i6.NgControlStatus, i6.NgModel, i7.SliderComponent, i8.PopoverDirective, i5.AsyncPipe, i5.KeyValuePipe, i4.TranslatePipe], styles: [".curve-grid[_ngcontent-%COMP%]{background-color:#000;border:1px solid white}.applying-to[_ngcontent-%COMP%]{overflow-y:scroll;height:130px!important;background-color:#222;border:1px solid white;padding:.5rem}.applying-to[_ngcontent-%COMP%] .form-check[_ngcontent-%COMP%]:last-child{margin-bottom:.5rem}"] }); }
556
+ }
557
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(EffectCurveComponent, [{
558
+ type: Component,
559
+ args: [{ selector: 'lib-app-effect-curve', template: "<div class=\"mr-3\" style=\"float: left\">\n <div class=\"mb-2\">\n <select\n [ngModel]=\"curve.curveType\"\n (ngModelChange)=\"curve.curveType = $event; presetService.previewLive()\"\n style=\"width: 200px; height: 20px\"\n >\n <option [value]=\"'sine'\">\n {{ 'designer.effect.curve-sine' | translate }}\n </option>\n <option [value]=\"'square'\">\n {{ 'designer.effect.curve-square' | translate }}\n </option>\n <!-- <option [value]=\"'triangle'\">\n {{ 'designer.effect.curve-triangle' | translate }}</option>\n <option [value]=\"'sawtooth'\">\n {{ 'designer.effect.curve-sawtooth' | translate }}</option>\n <option [value]=\"'reverse-sawtooth'\">\n {{ 'designer.effect.curve-reverse-sawtooth' | translate }}</option> -->\n </select>\n </div>\n <div>\n <canvas #curveGrid class=\"curve-grid\" width=\"200\" height=\"100\" viewBox=\"150 -75 4850 5150\" preserveAspectRatio=\"none\"></canvas>\n </div>\n</div>\n\n<div class=\"mr-4\" style=\"float: left\">\n <div class=\"d-flex\">\n <div class=\"my-auto\" style=\"width: 100px; float: left\">\n {{ 'designer.effect.curve-length' | translate }}\n </div>\n <div class=\"my-auto\" style=\"float: left\">\n <mv-slider\n (change)=\"redraw(); presetService.previewLive()\"\n [(value)]=\"curve.lengthMillis\"\n style=\"width: 80px\"\n [tooltip]=\"'hide'\"\n [value]=\"0\"\n [min]=\"lengthMillisMin\"\n [max]=\"lengthMillisMax\"\n [step]=\"1\"\n ></mv-slider>\n </div>\n <div class=\"my-auto\">\n <input type=\"text\" class=\"slider-input\" [ngModel]=\"curve.lengthMillis\" (ngModelChange)=\"setLengthMillis($event); redraw()\" />\n </div>\n <div class=\"my-auto ml-1\">\n {{ 'designer.misc.ms' | translate }}\n </div>\n </div>\n\n <div class=\"d-flex\">\n <div class=\"my-auto\" style=\"width: 100px; float: left\">\n {{ 'designer.effect.curve-amplitude' | translate }}\n </div>\n <div class=\"my-auto\" style=\"float: left\">\n <mv-slider\n (change)=\"redraw(); presetService.previewLive()\"\n [(value)]=\"curve.amplitude\"\n style=\"width: 80px\"\n [tooltip]=\"'hide'\"\n [min]=\"amplitudeMin\"\n [max]=\"amplitudeMax\"\n [step]=\"0.01\"\n ></mv-slider>\n </div>\n <div class=\"my-auto\">\n <input type=\"text\" class=\"slider-input\" [ngModel]=\"curve.amplitude\" (ngModelChange)=\"setAmplitude($event); redraw()\" />\n </div>\n </div>\n\n <div class=\"d-flex\">\n <div class=\"my-auto\" style=\"width: 100px; float: left\">\n {{ 'designer.effect.curve-position' | translate }}\n </div>\n <div class=\"my-auto\" style=\"float: left\">\n <mv-slider\n (change)=\"redraw(); presetService.previewLive()\"\n [(value)]=\"curve.position\"\n style=\"width: 80px; height: 18px\"\n [tooltip]=\"'hide'\"\n [min]=\"percentageMin\"\n [max]=\"percentageMax\"\n [step]=\"0.01\"\n >\n </mv-slider>\n </div>\n <div class=\"my-auto\">\n <input type=\"text\" class=\"slider-input\" [ngModel]=\"curve.position\" (ngModelChange)=\"setPosition($event); redraw()\" />\n </div>\n </div>\n\n <div class=\"d-flex\">\n <div class=\"my-auto\" style=\"width: 100px; float: left\">\n {{ 'designer.effect.curve-phase' | translate }}\n </div>\n <div class=\"my-auto\" style=\"float: left\">\n <mv-slider\n (change)=\"redraw(); presetService.previewLive()\"\n [(value)]=\"curve.phaseMillis\"\n style=\"width: 80px; height: 18px\"\n [tooltip]=\"'hide'\"\n [min]=\"phaseMillisMin\"\n [max]=\"phaseMillisMax\"\n [step]=\"1\"\n ></mv-slider>\n </div>\n <div class=\"my-auto\">\n <input type=\"text\" class=\"slider-input\" [ngModel]=\"curve.phaseMillis\" (ngModelChange)=\"setPhaseMillis($event); redraw()\" />\n </div>\n <div class=\"my-auto ml-1\">\n {{ 'designer.misc.ms' | translate }}\n </div>\n </div>\n\n <div class=\"d-flex\">\n <div class=\"my-auto\" style=\"width: 100px; float: left\">\n {{ 'designer.effect.curve-chase' | translate }}\n </div>\n <div class=\"my-auto\" style=\"float: left\">\n <mv-slider\n (change)=\"redraw(); presetService.previewLive()\"\n [(value)]=\"curve.phasingMillis\"\n style=\"width: 80px; height: 18px\"\n [tooltip]=\"'hide'\"\n [min]=\"phasingMillisMin\"\n [max]=\"phasingMillisMax\"\n [step]=\"1\"\n ></mv-slider>\n </div>\n <div class=\"my-auto\">\n <input type=\"text\" class=\"slider-input\" [ngModel]=\"curve.phasingMillis\" (ngModelChange)=\"setPhasingMillis($event); redraw()\" />\n </div>\n <div class=\"my-auto ml-1\">\n {{ 'designer.misc.ms' | translate }}\n </div>\n </div>\n</div>\n\n<!-- Menu for the capabilities and channels-->\n<div class=\"col col-auto p-0\" style=\"margin-right: 1px; width: 50px; float: left\">\n <div class=\"nav flex-column nav-pills\" id=\"v-pills-tab\" role=\"tablist\" aria-orientation=\"vertical\">\n <a\n class=\"nav-link px-3 active\"\n id=\"v-pills-effect-capabilities-tab\"\n popover=\"{{ 'designer.misc.capabilities' | translate }}\"\n container=\"body\"\n placement=\"right\"\n triggers=\"mouseenter:mouseleave\"\n data-toggle=\"pill\"\n href=\"#v-pills-effect-capabilities-{{ curve?.uuid }}\"\n role=\"tab\"\n aria-controls=\"v-pills-capabilities\"\n aria-selected=\"true\"\n >\n <i class=\"fa fa-bolt fa-fw\" aria-hidden=\"true\"></i>\n </a>\n <a\n class=\"nav-link px-3\"\n id=\"v-pills-effect-channels-tab\"\n popover=\"{{ 'designer.misc.channels' | translate }}\"\n container=\"body\"\n placement=\"right\"\n triggers=\"mouseenter:mouseleave\"\n data-toggle=\"pill\"\n href=\"#v-pills-effect-channels-{{ curve?.uuid }}\"\n role=\"tab\"\n aria-controls=\"v-pills-channels\"\n aria-selected=\"false\"\n >\n <i class=\"fa fa-sliders fa-fw\" aria-hidden=\"true\"></i>\n </a>\n </div>\n</div>\n\n<div class=\"h-100\" class=\"applying-to\">\n <div class=\"tab-content h-100\" id=\"v-pills-tabContent\">\n <div class=\"tab-pane h-100 show active\" id=\"v-pills-effect-capabilities-{{ curve?.uuid }}\" role=\"tabpanel\">\n <!-- Capabilities-->\n <div *ngFor=\"let capability of availableCapabilities; let i = index\" class=\"form-check\">\n <input\n type=\"checkbox\"\n class=\"form-check-input\"\n id=\"capability_{{ curve?.uuid + '_' + i }}\"\n [ngModel]=\"capabilityChecked(capability)\"\n (change)=\"toggleCapability($event, capability)\"\n />\n <label class=\"form-check-label\" for=\"capability_{{ curve?.uuid + '_' + i }}\">{{ getCapabilityName(capability) | async }}</label>\n </div>\n </div>\n <div class=\"tab-pane h-100 show\" id=\"v-pills-effect-channels-{{ curve?.uuid }}\" role=\"tabpanel\">\n <!-- channels -->\n\n <!-- profile selection -->\n <div *ngIf=\"availableProfiles.length > 1\">\n <div *ngFor=\"let profile of availableProfiles; let i = index\" class=\"form-check\">\n <input\n type=\"checkbox\"\n class=\"form-check-input\"\n id=\"channel_profile_{{ curve?.uuid }}_{{ profile.uuid }}\"\n [ngModel]=\"selectedProfiles.indexOf(profile) >= 0\"\n (change)=\"changeProfileSelection($event, profile)\"\n />\n <label class=\"form-check-label\" for=\"channel_profile_{{ curve?.uuid }}_{{ profile.uuid }}\">{{ profile.name }}</label>\n </div>\n\n <hr class=\"my-1\" style=\"border-color: white\" />\n </div>\n\n <!-- channels -->\n <ng-container *ngFor=\"let entry of availableChannels | keyvalue; let i = index\">\n <div *ngFor=\"let channel of entry.value; let j = index\" class=\"form-check\">\n <input\n type=\"checkbox\"\n class=\"form-check-input\"\n id=\"channel_{{ curve?.uuid }}_{{ i }}_{{ j }}\"\n [ngModel]=\"channelChecked(entry.key, channel)\"\n (change)=\"toggleChannel($event, entry.key, channel)\"\n />\n <label class=\"form-check-label\" for=\"channel_{{ curve?.uuid }}_{{ i }}_{{ j }}\">{{\n getChannelName(entry.key.name, channel.name)\n }}</label>\n </div>\n </ng-container>\n </div>\n </div>\n</div>\n", styles: [".curve-grid{background-color:#000;border:1px solid white}.applying-to{overflow-y:scroll;height:130px!important;background-color:#222;border:1px solid white;padding:.5rem}.applying-to .form-check:last-child{margin-bottom:.5rem}\n"] }]
560
+ }], () => [{ type: i1.PresetService }, { type: i2.AnimationService }, { type: i3.FixtureService }, { type: i4.TranslateService }], { curve: [{
561
+ type: Input
562
+ }], isSelected: [{
563
+ type: Input
564
+ }], curveGrid: [{
565
+ type: ViewChild,
566
+ args: ['curveGrid', { static: true }]
567
+ }] }); })();
568
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(EffectCurveComponent, { className: "EffectCurveComponent" }); })();
569
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWZmZWN0LWN1cnZlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Rlc2lnbmVyL3NyYy9saWIvZWZmZWN0L2VmZmVjdC1jdXJ2ZS9lZmZlY3QtY3VydmUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGVzaWduZXIvc3JjL2xpYi9lZmZlY3QvZWZmZWN0LWN1cnZlL2VmZmVjdC1jdXJ2ZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQVUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZELE9BQU8sRUFBNEIsS0FBSyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3ZELE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVyQyxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUN2RixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsc0JBQXNCLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUVuSCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDaEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQzlELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQzs7Ozs7Ozs7Ozs7OztJQ3lLOUQsQUFERiwrQkFBd0YsZ0JBT3BGO0lBREEsd05BQVUsOENBQW9DLEtBQUM7SUFMakQsaUJBTUU7SUFDRixpQ0FBNkU7SUFBQSxZQUEyQzs7SUFDMUgsQUFEMEgsaUJBQVEsRUFDNUg7Ozs7O0lB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Q0FBNkI7WUFHckUsZUFDRjtZQURFLDJFQUNGO1lBS0UsZUFDRjtZQURFLHNGQUNGO1lBSUksZUFBK0I7WUFBL0IscURBQStCO1lBSy9CLEFBREEsQUFEQSxBQURBLGdDQUFrQiw2QkFDTSw2QkFDQSxXQUNkO1lBSTRCLGVBQStCO1lBQS9CLGlEQUErQjtZQUd2RSxlQUNGO1lBREUsMkVBQ0Y7WUFVRSxlQUF3RDtZQUF4RCx5RkFBd0Q7WUFLeEQsbUlBQXFEO1lBVXJELGVBQW9EO1lBQXBELHFGQUFvRDtZQUtwRCwrSEFBaUQ7WUFZWCxlQUFrRDtZQUFsRCw4R0FBa0Q7WUFFNUQsY0FBMEI7WUFBMUIsbURBQTBCO1lBV3ZCLGNBQThDO1lBQTlDLDBHQUE4QztZQUl2RSxjQUFrQztZQUFsQyx1REFBa0M7WUFnQlIsY0FBaUM7WUFBakMsdUVBQWlDOzs7aUZEaE0xRCxvQkFBb0I7Y0FMaEMsU0FBUzsyQkFDRSxzQkFBc0I7eUlBNkJ2QixLQUFLO2tCQUFiLEtBQUs7WUFJRixVQUFVO2tCQURiLEtBQUs7WUFrQm9DLFNBQVM7a0JBQWxELFNBQVM7bUJBQUMsV0FBVyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTs7a0ZBOUM3QixvQkFBb0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIElucHV0LCBPbkluaXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9uLCB0aW1lciB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgQ2FjaGVkRml4dHVyZUNoYW5uZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvY2FjaGVkLWZpeHR1cmUtY2hhbm5lbCc7XG5pbXBvcnQgeyBFZmZlY3RDdXJ2ZVByb2ZpbGVDaGFubmVscyB9IGZyb20gJy4uLy4uL21vZGVscy9lZmZlY3QtY3VydmUtcHJvZmlsZS1jaGFubmVsJztcbmltcG9ydCB7IEZpeHR1cmVDYXBhYmlsaXR5LCBGaXh0dXJlQ2FwYWJpbGl0eUNvbG9yLCBGaXh0dXJlQ2FwYWJpbGl0eVR5cGUgfSBmcm9tICcuLi8uLi9tb2RlbHMvZml4dHVyZS1jYXBhYmlsaXR5JztcbmltcG9ydCB7IEZpeHR1cmVQcm9maWxlIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2ZpeHR1cmUtcHJvZmlsZSc7XG5pbXBvcnQgeyBGaXh0dXJlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2ZpeHR1cmUuc2VydmljZSc7XG5pbXBvcnQgeyBQcmVzZXRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvcHJlc2V0LnNlcnZpY2UnO1xuaW1wb3J0IHsgRWZmZWN0Q3VydmUgfSBmcm9tICcuLy4uLy4uL21vZGVscy9lZmZlY3QtY3VydmUnO1xuaW1wb3J0IHsgQW5pbWF0aW9uU2VydmljZSB9IGZyb20gJy4vLi4vLi4vc2VydmljZXMvYW5pbWF0aW9uLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsaWItYXBwLWVmZmVjdC1jdXJ2ZScsXG4gIHRlbXBsYXRlVXJsOiAnLi9lZmZlY3QtY3VydmUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9lZmZlY3QtY3VydmUuY29tcG9uZW50LmNzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBFZmZlY3RDdXJ2ZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIHByaXZhdGUgZ3JpZFVwZGF0ZVN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuICBwcml2YXRlIGN0eDogYW55O1xuICBwcml2YXRlIG1heFdpZHRoOiBudW1iZXI7XG4gIHByaXZhdGUgbWF4SGVpZ2h0OiBudW1iZXI7XG5cbiAgcHVibGljIGxlbmd0aE1pbGxpc01pbiA9IDIwO1xuICBwdWJsaWMgbGVuZ3RoTWlsbGlzTWF4ID0gODAwMDtcbiAgcHVibGljIGFtcGxpdHVkZU1pbiA9IDA7XG4gIHB1YmxpYyBhbXBsaXR1ZGVNYXggPSA0O1xuICBwdWJsaWMgcGVyY2VudGFnZU1pbiA9IDA7XG4gIHB1YmxpYyBwZXJjZW50YWdlTWF4ID0gMTtcbiAgcHVibGljIHBoYXNlTWlsbGlzTWluID0gLTEwMDA7XG4gIHB1YmxpYyBwaGFzZU1pbGxpc01heCA9IDEwMDA7XG4gIHB1YmxpYyBwaGFzaW5nTWlsbGlzTWluID0gMDtcbiAgcHVibGljIHBoYXNpbmdNaWxsaXNNYXggPSAxMDAwO1xuXG4gIC8vIHRoZSBzZWxlY3RlZCBjYXBhYmlsaXRpZXNcbiAgcHVibGljIGF2YWlsYWJsZUNhcGFiaWxpdGllczogRml4dHVyZUNhcGFiaWxpdHlbXSA9IFtdO1xuXG4gIC8vIHRoZSBzZWxlY3RlZCBjaGFubmVsc1xuICBwdWJsaWMgYXZhaWxhYmxlQ2hhbm5lbHM6IE1hcDxGaXh0dXJlUHJvZmlsZSwgQ2FjaGVkRml4dHVyZUNoYW5uZWxbXT4gPSBuZXcgTWFwPEZpeHR1cmVQcm9maWxlLCBDYWNoZWRGaXh0dXJlQ2hhbm5lbFtdPigpO1xuICBwdWJsaWMgYXZhaWxhYmxlUHJvZmlsZXM6IEZpeHR1cmVQcm9maWxlW10gPSBbXTtcbiAgcHVibGljIHNlbGVjdGVkUHJvZmlsZXM6IEZpeHR1cmVQcm9maWxlW10gPSBbXTtcblxuICBASW5wdXQoKSBjdXJ2ZTogRWZmZWN0Q3VydmU7XG5cbiAgLy8gd2hldGhlciB0aGUgZWZmZWN0IGlzIGN1cnJlbnRseSBiZWluZyBlZGl0ZWQgKG9wZW4pIG9yIG5vdFxuICBASW5wdXQoKVxuICBzZXQgaXNTZWxlY3RlZCh2YWx1ZTogYm9vbGVhbikge1xuICAgIGlmICh2YWx1ZSkge1xuICAgICAgLy8gc3RhcnQgdGhlIHVwZGF0ZSB0aW1lclxuICAgICAgaWYgKCF0aGlzLmdyaWRVcGRhdGVTdWJzY3JpcHRpb24pIHtcbiAgICAgICAgdGhpcy5ncmlkVXBkYXRlU3Vic2NyaXB0aW9uID0gdGltZXIoMCwgMTUpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5yZWRyYXcoKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHN0b3AgdGhlIHVwZGF0ZSB0aW1lclxuICAgICAgaWYgKHRoaXMuZ3JpZFVwZGF0ZVN1YnNjcmlwdGlvbikge1xuICAgICAgICB0aGlzLmdyaWRVcGRhdGVTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgdGhpcy5ncmlkVXBkYXRlU3Vic2NyaXB0aW9uID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIEBWaWV3Q2hpbGQoJ2N1cnZlR3JpZCcsIHsgc3RhdGljOiB0cnVlIH0pIGN1cnZlR3JpZDogRWxlbWVudFJlZjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcHJlc2V0U2VydmljZTogUHJlc2V0U2VydmljZSxcbiAgICBwcml2YXRlIGFuaW1hdGlvblNlcnZpY2U6IEFuaW1hdGlvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBmaXh0dXJlU2VydmljZTogRml4dHVyZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSB0cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2VcbiAgKSB7XG4gICAgdGhpcy5wcmVzZXRTZXJ2aWNlLmZpeHR1cmVTZWxlY3Rpb25DaGFuZ2VkLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLnVwZGF0ZUNhcGFiaWxpdGllc0FuZENoYW5uZWxzKCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnVwZGF0ZUNhcGFiaWxpdGllc0FuZENoYW5uZWxzKCk7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICBjb25zdCBjYW52YXMgPSB0aGlzLmN1cnZlR3JpZC5uYXRpdmVFbGVtZW50O1xuICAgIHRoaXMuY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gICAgdGhpcy5tYXhXaWR0aCA9IGNhbnZhcy53aWR0aDtcbiAgICB0aGlzLm1heEhlaWdodCA9IGNhbnZhcy5oZWlnaHQ7XG5cbiAgICB0aGlzLnJlZHJhdygpO1xuICB9XG5cbiAgcHJpdmF0ZSBkcmF3Q3VycmVudFZhbHVlKGN1cnJNaWxsaXM6IG51bWJlciwgcmFkaXVzOiBudW1iZXIsIGxpbmVXaWR0aDogbnVtYmVyLCBkdXJhdGlvbk1pbGxpczogbnVtYmVyLCBtYXhIZWlnaHQ6IG51bWJlcikge1xuICAgIGNvbnN0IGN1cnJWYWwgPSAxIC0gdGhpcy5jdXJ2ZS5nZXRWYWx1ZUF0TWlsbGlzKGN1cnJNaWxsaXMpO1xuXG4gICAgY29uc3QgeCA9ICh0aGlzLm1heFdpZHRoICogKGN1cnJNaWxsaXMgJSBkdXJhdGlvbk1pbGxpcykpIC8gZHVyYXRpb25NaWxsaXM7XG4gICAgY29uc3QgeSA9IG1heEhlaWdodCAqIGN1cnJWYWwgKyBsaW5lV2lkdGg7XG5cbiAgICB0aGlzLmN0eC5iZWdpblBhdGgoKTtcbiAgICB0aGlzLmN0eC5hcmMoeCwgeSwgcmFkaXVzLCAwLCAyICogTWF0aC5QSSwgZmFsc2UpO1xuICAgIHRoaXMuY3R4LmZpbGxTdHlsZSA9ICcjZmZmJztcbiAgICB0aGlzLmN0eC5maWxsKCk7XG4gICAgdGhpcy5jdHgubGluZVdpZHRoID0gMTtcbiAgICB0aGlzLmN0eC5zdHJva2VTdHlsZSA9ICcjMDAwJztcbiAgICB0aGlzLmN0eC5zdHJva2UoKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UGhhc2luZ0NvdW50KCk6IG51bWJlciB7XG4gICAgbGV0IGNvdW50ID0gMDtcbiAgICBjb25zdCBjb3VudGVkRG14Q2hhbm5lbHM6IG51bWJlcltdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IGZpeHR1cmVVdWlkIG9mIHRoaXMucHJlc2V0U2VydmljZS5zZWxlY3RlZFByZXNldC5maXh0dXJlVXVpZHMpIHtcbiAgICAgIGNvbnN0IGZpeHR1cmUgPSB0aGlzLmZpeHR1cmVTZXJ2aWNlLmdldEZpeHR1cmVCeVV1aWQoZml4dHVyZVV1aWQpO1xuXG4gICAgICBpZiAoIWNvdW50ZWREbXhDaGFubmVscy5pbmNsdWRlcyhmaXh0dXJlLmRteEZpcnN0Q2hhbm5lbCkpIHtcbiAgICAgICAgY291bnQrKztcbiAgICAgICAgY291bnRlZERteENoYW5uZWxzLnB1c2goZml4dHVyZS5kbXhGaXJzdENoYW5uZWwpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjb3VudDtcbiAgfVxuXG4gIHJlZHJhdygpIHtcbiAgICB0aGlzLmN0eC5jbGVhclJlY3QoMCwgMCwgdGhpcy5tYXhXaWR0aCwgdGhpcy5tYXhIZWlnaHQpO1xuICAgIHRoaXMuY3R4LmZpbGxTdHlsZSA9ICcjZmZmJztcbiAgICB0aGlzLmN0eC5zdHJva2VTdHlsZSA9ICcjZmZmJztcblxuICAgIC8vIHRoZSB3aWR0aCBvZiB0aGUgbGluZXNcbiAgICBjb25zdCB3aWR0aCA9IDM7XG5cbiAgICB0aGlzLmN0eC5saW5lV2lkdGggPSB3aWR0aDtcblxuICAgIGxldCBvbGRYOiBudW1iZXI7XG4gICAgbGV0IG9sZFk6IG51bWJlcjtcblxuICAgIGxldCBzdGVwID0gNTA7XG5cbiAgICBpZiAobGVuZ3RoIDwgNTAwKSB7XG4gICAgICBzdGVwID0gNTtcbiAgICB9XG5cbiAgICBjb25zdCBkdXJhdGlvbk1pbGxpcyA9IHRoaXMuY3VydmUubGVuZ3RoTWlsbGlzICogTWF0aC5tYXgoTWF0aC5yb3VuZCg0IC0gdGhpcy5jdXJ2ZS5sZW5ndGhNaWxsaXMgLyAxMDAwKSwgMSk7XG4gICAgY29uc3QgbWF4SGVpZ2h0ID0gdGhpcy5tYXhIZWlnaHQgLSB3aWR0aCAqIDI7XG5cbiAgICAvLyBkcmF3IHRoZSBjdXJ2ZVxuICAgIGZvciAobGV0IGkgPSAtc3RlcCAqIDI7IGkgPCBkdXJhdGlvbk1pbGxpcyArIHN0ZXAgKiAyOyBpICs9IHN0ZXApIHtcbiAgICAgIGNvbnN0IHZhbCA9IDEgLSB0aGlzLmN1cnZlLmdldFZhbHVlQXRNaWxsaXMoaSk7XG5cbiAgICAgIC8vIFNjYWxlIHRoZSB2YWx1ZXMgdG8gdGhlIGdyaWQgZGltZW5zaW9uc1xuICAgICAgY29uc3QgeCA9ICh0aGlzLm1heFdpZHRoICogaSkgLyBkdXJhdGlvbk1pbGxpcztcbiAgICAgIGNvbnN0IHkgPSBtYXhIZWlnaHQgKiB2YWwgKyB3aWR0aDtcblxuICAgICAgaWYgKG9sZFkpIHtcbiAgICAgICAgdGhpcy5jdHguYmVnaW5QYXRoKCk7XG4gICAgICAgIHRoaXMuY3R4Lm1vdmVUbyhvbGRYLCBvbGRZKTtcbiAgICAgICAgdGhpcy5jdHgubGluZVRvKHgsIHkpO1xuICAgICAgICB0aGlzLmN0eC5zdHJva2UoKTtcbiAgICAgIH1cblxuICAgICAgb2xkWCA9IHg7XG4gICAgICBvbGRZID0geTtcbiAgICB9XG5cbiAgICAvLyBkcmF3IHRoZSBjdXJyZW50IHZhbHVlXG4gICAgdGhpcy5kcmF3Q3VycmVudFZhbHVlKHRoaXMuYW5pbWF0aW9uU2VydmljZS50aW1lTWlsbGlzICUgZHVyYXRpb25NaWxsaXMsIDUsIHdpZHRoLCBkdXJhdGlvbk1pbGxpcywgbWF4SGVpZ2h0KTtcblxuICAgIC8vIGRyYXcgdGhlIHBoYXNpbmcgdmFsdWVzIChjaGFzZSksIGlmIHJlcXVpcmVkXG4gICAgbGV0IHBoYXNpbmdDb3VudCA9IDA7XG5cbiAgICBpZiAodGhpcy5jdXJ2ZS5waGFzaW5nTWlsbGlzID4gMCAmJiB0aGlzLnByZXNldFNlcnZpY2Uuc2VsZWN0ZWRQcmVzZXQpIHtcbiAgICAgIHBoYXNpbmdDb3VudCA9IHRoaXMuZ2V0UGhhc2luZ0NvdW50KCk7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBwaGFzaW5nQ291bnQ7IGkrKykge1xuICAgICAgdGhpcy5kcmF3Q3VycmVudFZhbHVlKFxuICAgICAgICAodGhpcy5hbmltYXRpb25TZXJ2aWNlLnRpbWVNaWxsaXMgLSBpICogdGhpcy5jdXJ2ZS5waGFzaW5nTWlsbGlzKSAlIGR1cmF0aW9uTWlsbGlzLFxuICAgICAgICAzLFxuICAgICAgICB3aWR0aCxcbiAgICAgICAgZHVyYXRpb25NaWxsaXMsXG4gICAgICAgIG1heEhlaWdodFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNhbGN1bGF0ZUNoYW5uZWxDYXBhYmlsaXRpZXMoKSB7XG4gICAgdGhpcy5hdmFpbGFibGVDaGFubmVscyA9IHRoaXMucHJlc2V0U2VydmljZS5nZXRTZWxlY3RlZFByb2ZpbGVDaGFubmVscyh0aGlzLnNlbGVjdGVkUHJvZmlsZXMpO1xuICB9XG5cbiAgY2hhbmdlUHJvZmlsZVNlbGVjdGlvbigkZXZlbnQ6IGFueSwgcHJvZmlsZTogRml4dHVyZVByb2ZpbGUpIHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZFByb2ZpbGVzLmluZGV4T2YocHJvZmlsZSkgPj0gMCkge1xuICAgICAgdGhpcy5zZWxlY3RlZFByb2ZpbGVzLnNwbGljZSh0aGlzLnNlbGVjdGVkUHJvZmlsZXMuaW5kZXhPZihwcm9maWxlKSwgMSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRQcm9maWxlcy5wdXNoKHByb2ZpbGUpO1xuICAgIH1cblxuICAgIHRoaXMuY2FsY3VsYXRlQ2hhbm5lbENhcGFiaWxpdGllcygpO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVDYXBhYmlsaXRpZXNBbmRDaGFubmVscygpIHtcbiAgICAvLyBjYXBhYmlsaXRpZXNcbiAgICB0aGlzLmF2YWlsYWJsZUNhcGFiaWxpdGllcyA9IFtdO1xuXG4gICAgaWYgKHRoaXMucHJlc2V0U2VydmljZS5oYXNDYXBhYmlsaXR5RGltbWVyKCkpIHtcbiAgICAgIGNvbnN0IGNhcGFiaWxpdHkgPSBuZXcgRml4dHVyZUNhcGFiaWxpdHkoKTtcbiAgICAgIGNhcGFiaWxpdHkudHlwZSA9IEZpeHR1cmVDYXBhYmlsaXR5VHlwZS5JbnRlbnNpdHk7XG4gICAgICB0aGlzLmF2YWlsYWJsZUNhcGFiaWxpdGllcy5wdXNoKGNhcGFiaWxpdHkpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnByZXNldFNlcnZpY2UuaGFzQ2FwYWJpbGl0eUNvbG9yKCkpIHtcbiAgICAgIGxldCBjYXBhYmlsaXR5ID0gbmV3IEZpeHR1cmVDYXBhYmlsaXR5KCk7XG4gICAgICBjYXBhYmlsaXR5LnR5cGUgPSBGaXh0dXJlQ2FwYWJpbGl0eVR5cGUuQ29sb3JJbnRlbnNpdHk7XG4gICAgICBjYXBhYmlsaXR5LmNvbG9yID0gRml4dHVyZUNhcGFiaWxpdHlDb2xvci5SZWQ7XG4gICAgICB0aGlzLmF2YWlsYWJsZUNhcGFiaWxpdGllcy5wdXNoKGNhcGFiaWxpdHkpO1xuXG4gICAgICBjYXBhYmlsaXR5ID0gbmV3IEZpeHR1cmVDYXBhYmlsaXR5KCk7XG4gICAgICBjYXBhYmlsaXR5LnR5cGUgPSBGaXh0dXJlQ2FwYWJpbGl0eVR5cGUuQ29sb3JJbnRlbnNpdHk7XG4gICAgICBjYXBhYmlsaXR5LmNvbG9yID0gRml4dHVyZUNhcGFiaWxpdHlDb2xvci5HcmVlbjtcbiAgICAgIHRoaXMuYXZhaWxhYmxlQ2FwYWJpbGl0aWVzLnB1c2goY2FwYWJpbGl0eSk7XG5cbiAgICAgIGNhcGFiaWxpdHkgPSBuZXcgRml4dHVyZUNhcGFiaWxpdHkoKTtcbiAgICAgIGNhcGFiaWxpdHkudHlwZSA9IEZpeHR1cmVDYXBhYmlsaXR5VHlwZS5Db2xvckludGVuc2l0eTtcbiAgICAgIGNhcGFiaWxpdHkuY29sb3IgPSBGaXh0dXJlQ2FwYWJpbGl0eUNvbG9yLkJsdWU7XG4gICAgICB0aGlzLmF2YWlsYWJsZUNhcGFiaWxpdGllcy5wdXNoKGNhcGFiaWxpdHkpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnByZXNldFNlcnZpY2UuaGFzQ2FwYWJpbGl0eVBhblRpbHQoKSkge1xuICAgICAgbGV0IGNhcGFiaWxpdHkgPSBuZXcgRml4dHVyZUNhcGFiaWxpdHkoKTtcbiAgICAgIGNhcGFiaWxpdHkudHlwZSA9IEZpeHR1cmVDYXBhYmlsaXR5VHlwZS5QYW47XG4gICAgICB0aGlzLmF2YWlsYWJsZUNhcGFiaWxpdGllcy5wdXNoKGNhcGFiaWxpdHkpO1xuXG4gICAgICBjYXBhYmlsaXR5ID0gbmV3IEZpeHR1cmVDYXBhYmlsaXR5KCk7XG4gICAgICBjYXBhYmlsaXR5LnR5cGUgPSBGaXh0dXJlQ2FwYWJpbGl0eVR5cGUuVGlsdDtcbiAgICAgIHRoaXMuYXZhaWxhYmxlQ2FwYWJpbGl0aWVzLnB1c2goY2FwYWJpbGl0eSk7XG4gICAgfVxuXG4gICAgLy8gY2FsY3VsYXRlIGFsbCBwcm9maWxlc1xuICAgIHRoaXMuYXZhaWxhYmxlUHJvZmlsZXMgPSB0aGlzLnByZXNldFNlcnZpY2UuZ2V0U2VsZWN0ZWRQcm9maWxlcygpO1xuXG4gICAgLy8gc2VsZWN0IGFsbCBwcm9maWxlcyBieSBkZWZhdWx0XG4gICAgdGhpcy5zZWxlY3RlZFByb2ZpbGVzID0gWy4uLnRoaXMuYXZhaWxhYmxlUHJvZmlsZXNdO1xuXG4gICAgLy8gY2FsY3VsYXRlIGFsbCBjaGFubmVsc1xuICAgIHRoaXMuY2FsY3VsYXRlQ2hhbm5lbENhcGFiaWxpdGllcygpO1xuICB9XG5cbiAgZ2V0Q2FwYWJpbGl0eU5hbWUoY2FwYWJpbGl0eTogRml4dHVyZUNhcGFiaWxpdHkpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLnRyYW5zbGF0ZVxuICAgICAgLmdldChbJ2Rlc2lnbmVyLmZpeHR1cmVDYXBhYmlsaXR5VHlwZS4nICsgY2FwYWJpbGl0eS50eXBlLCAnZGVzaWduZXIuZml4dHVyZUNhcGFiaWxpdHlDb2xvci4nICsgY2FwYWJpbGl0eS5jb2xvcl0pXG4gICAgICAucGlwZShcbiAgICAgICAgbWFwKChyZXN1bHQ6IHN0cmluZykgPT4ge1xuICAgICAgICAgIGxldCBuYW1lID0gJyc7XG4gICAgICAgICAgbmFtZSArPSByZXN1bHRbJ2Rlc2lnbmVyLmZpeHR1cmVDYXBhYmlsaXR5VHlwZS4nICsgY2FwYWJpbGl0eS50eXBlXTtcblxuICAgICAgICAgIGlmIChjYXBhYmlsaXR5LmNvbG9yKSB7XG4gICAgICAgICAgICBuYW1lICs9ICcsICcgKyByZXN1bHRbJ2Rlc2lnbmVyLmZpeHR1cmVDYXBhYmlsaXR5Q29sb3IuJyArIGNhcGFiaWxpdHkuY29sb3JdO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbmFtZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gbmFtZTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gIH1cblxuICBjYXBhYmlsaXR5Q2hlY2tlZChjYXBhYmlsaXR5OiBGaXh0dXJlQ2FwYWJpbGl0eSk6IGJvb2xlYW4ge1xuICAgIGZvciAoY29uc3QgZXhpc3RpbmdDYXBhYmlsaXR5IG9mIHRoaXMuY3VydmUuY2FwYWJpbGl0aWVzKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMuZml4dHVyZVNlcnZpY2UuY2FwYWJpbGl0aWVzTWF0Y2goXG4gICAgICAgICAgZXhpc3RpbmdDYXBhYmlsaXR5LnR5cGUsXG4gICAgICAgICAgY2FwYWJpbGl0eS50eXBlLFxuICAgICAgICAgIGV4aXN0aW5nQ2FwYWJpbGl0eS5jb2xvcixcbiAgICAgICAgICBjYXBhYmlsaXR5LmNvbG9yLFxuICAgICAgICAgIG51bGwsXG4gICAgICAgICAgbnVsbCxcbiAgICAgICAgICBudWxsLFxuICAgICAgICAgIG51bGxcbiAgICAgICAgKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB0b2dnbGVDYXBhYmlsaXR5KGV2ZW50OiBhbnksIGNhcGFiaWxpdHk6IEZpeHR1cmVDYXBhYmlsaXR5KSB7XG4gICAgaWYgKGV2ZW50LmN1cnJlbnRUYXJnZXQuY2hlY2tlZCkge1xuICAgICAgLy8gYWRkIHRoZSBjYXBhYmlsaXR5XG4gICAgICB0aGlzLmN1cnZlLmNhcGFiaWxpdGllcy5wdXNoKGNhcGFiaWxpdHkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBSZW1vdmUgdGhlIGNoYW5uZWxcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jdXJ2ZS5jYXBhYmlsaXRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgZXhpc3RpbmdDYXBhYmlsaXR5ID0gdGhpcy5jdXJ2ZS5jYXBhYmlsaXRpZXNbaV07XG4gICAgICAgIGlmIChcbiAgICAgICAgICB0aGlzLmZpeHR1cmVTZXJ2aWNlLmNhcGFiaWxpdGllc01hdGNoKFxuICAgICAgICAgICAgZXhpc3RpbmdDYXBhYmlsaXR5LnR5cGUsXG4gICAgICAgICAgICBjYXBhYmlsaXR5LnR5cGUsXG4gICAgICAgICAgICBleGlzdGluZ0NhcGFiaWxpdHkuY29sb3IsXG4gICAgICAgICAgICBjYXBhYmlsaXR5LmNvbG9yLFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgbnVsbFxuICAgICAgICAgIClcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5jdXJ2ZS5jYXBhYmlsaXRpZXMuc3BsaWNlKGksIDEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5wcmVzZXRTZXJ2aWNlLnByZXZpZXdMaXZlKCk7XG4gIH1cblxuICBnZXRDaGFubmVsTmFtZShwcm9maWxlTmFtZTogc3RyaW5nLCBjaGFubmVsTmFtZTogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMuYXZhaWxhYmxlUHJvZmlsZXMubGVuZ3RoID4gMSkge1xuICAgICAgcmV0dXJuIHByb2ZpbGVOYW1lICsgJyAtICcgKyBjaGFubmVsTmFtZTtcbiAgICB9XG5cbiAgICByZXR1cm4gY2hhbm5lbE5hbWU7XG4gIH1cblxuICBjaGFubmVsQ2hlY2tlZChwcm9maWxlOiBGaXh0dXJlUHJvZmlsZSwgY2hhbm5lbDogQ2FjaGVkRml4dHVyZUNoYW5uZWwpOiBib29sZWFuIHtcbiAgICBmb3IgKGNvbnN0IHByb2ZpbGVDaGFubmVscyBvZiB0aGlzLmN1cnZlLmNoYW5uZWxzKSB7XG4gICAgICBpZiAocHJvZmlsZUNoYW5uZWxzLnByb2ZpbGVVdWlkID09PSBwcm9maWxlLnV1aWQpIHtcbiAgICAgICAgaWYgKHByb2ZpbGVDaGFubmVscy5jaGFubmVscy5pbmNsdWRlcyhjaGFubmVsLm5hbWUpKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB0b2dnbGVDaGFubmVsKGV2ZW50OiBhbnksIHByb2ZpbGU6IEZpeHR1cmVQcm9maWxlLCBjaGFubmVsOiBDYWNoZWRGaXh0dXJlQ2hhbm5lbCkge1xuICAgIC8vIGFkZCB0aGUgcHJvZmlsZSwgaWYgbmVjZXNzYXJ5XG4gICAgbGV0IHByb2ZpbGVDb250YWluZWQgPSBmYWxzZTtcbiAgICBmb3IgKGNvbnN0IHByb2ZpbGVDaGFubmVscyBvZiB0aGlzLmN1cnZlLmNoYW5uZWxzKSB7XG4gICAgICBpZiAocHJvZmlsZUNoYW5uZWxzLnByb2ZpbGVVdWlkID09PSBwcm9maWxlLnV1aWQpIHtcbiAgICAgICAgcHJvZmlsZUNvbnRhaW5lZCA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghcHJvZmlsZUNvbnRhaW5lZCkge1xuICAgICAgY29uc3QgcHJvZmlsZUNoYW5uZWxzID0gbmV3IEVmZmVjdEN1cnZlUHJvZmlsZUNoYW5uZWxzKCk7XG4gICAgICBwcm9maWxlQ2hhbm5lbHMucHJvZmlsZVV1aWQgPSBwcm9maWxlLnV1aWQ7XG4gICAgICB0aGlzLmN1cnZlLmNoYW5uZWxzLnB1c2gocHJvZmlsZUNoYW5uZWxzKTtcbiAgICB9XG5cbiAgICAvLyBhZGQgb3IgZGVsZXRlIHRoZSBjaGFubmVsXG4gICAgZm9yIChjb25zdCBwcm9maWxlQ2hhbm5lbHMgb2YgdGhpcy5jdXJ2ZS5jaGFubmVscykge1xuICAgICAgaWYgKHByb2ZpbGVDaGFubmVscy5wcm9maWxlVXVpZCA9PT0gcHJvZmlsZS51dWlkKSB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gcHJvZmlsZUNoYW5uZWxzLmNoYW5uZWxzLmluZGV4T2YoY2hhbm5lbC5uYW1lKTtcblxuICAgICAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgICAgIHByb2ZpbGVDaGFubmVscy5jaGFubmVscy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByb2ZpbGVDaGFubmVscy5jaGFubmVscy5wdXNoKGNoYW5uZWwubmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnByZXNldFNlcnZpY2UucHJldmlld0xpdmUoKTtcbiAgfVxuXG4gIHNldExlbmd0aE1pbGxpcyh2YWx1ZTogYW55KSB7XG4gICAgaWYgKCFpc05hTih2YWx1ZSkgJiYgdmFsdWUgPj0gdGhpcy5sZW5ndGhNaWxsaXNNaW4gJiYgdmFsdWUgPD0gdGhpcy5sZW5ndGhNaWxsaXNNYXgpIHtcbiAgICAgIHRoaXMuY3VydmUubGVuZ3RoTWlsbGlzID0gK3ZhbHVlO1xuICAgICAgdGhpcy5wcmVzZXRTZXJ2aWNlLnByZXZpZXdMaXZlKCk7XG4gICAgfVxuICB9XG5cbiAgc2V0QW1wbGl0dWRlKHZhbHVlOiBhbnkpIHtcbiAgICBpZiAoIWlzTmFOKHZhbHVlKSAmJiB2YWx1ZSA+PSB0aGlzLmFtcGxpdHVkZU1pbiAmJiB2YWx1ZSA8PSB0aGlzLmFtcGxpdHVkZU1heCkge1xuICAgICAgdGhpcy5jdXJ2ZS5hbXBsaXR1ZGUgPSArdmFsdWU7XG4gICAgICB0aGlzLnByZXNldFNlcnZpY2UucHJldmlld0xpdmUoKTtcbiAgICB9XG4gIH1cblxuICBzZXRQb3NpdGlvbih2YWx1ZTogYW55KSB7XG4gICAgaWYgKCFpc05hTih2YWx1ZSkgJiYgdmFsdWUgPj0gdGhpcy5wZXJjZW50YWdlTWluICYmIHZhbHVlIDw9IHRoaXMucGVyY2VudGFnZU1heCkge1xuICAgICAgdGhpcy5jdXJ2ZS5wb3NpdGlvbiA9ICt2YWx1ZTtcbiAgICAgIHRoaXMucHJlc2V0U2VydmljZS5wcmV2aWV3TGl2ZSgpO1xuICAgIH1cbiAgfVxuXG4gIHNldFBoYXNlTWlsbGlzKHZhbHVlOiBhbnkpIHtcbiAgICBpZiAoIWlzTmFOKHZhbHVlKSAmJiB2YWx1ZSA+PSB0aGlzLnBoYXNlTWlsbGlzTWluICYmIHZhbHVlIDw9IHRoaXMucGhhc2VNaWxsaXNNYXgpIHtcbiAgICAgIHRoaXMuY3VydmUucGhhc2VNaWxsaXMgPSArdmFsdWU7XG4gICAgICB0aGlzLnByZXNldFNlcnZpY2UucHJldmlld0xpdmUoKTtcbiAgICB9XG4gIH1cblxuICBzZXRQaGFzaW5nTWlsbGlzKHZhbHVlOiBhbnkpIHtcbiAgICBpZiAoIWlzTmFOKHZhbHVlKSAmJiB2YWx1ZSA+PSB0aGlzLnBoYXNpbmdNaWxsaXNNaW4gJiYgdmFsdWUgPD0gdGhpcy5waGFzaW5nTWlsbGlzTWF4KSB7XG4gICAgICB0aGlzLmN1cnZlLnBoYXNpbmdNaWxsaXMgPSArdmFsdWU7XG4gICAgICB0aGlzLnByZXNldFNlcnZpY2UucHJldmlld0xpdmUoKTtcbiAgICB9XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJtci0zXCIgc3R5bGU9XCJmbG9hdDogbGVmdFwiPlxuICA8ZGl2IGNsYXNzPVwibWItMlwiPlxuICAgIDxzZWxlY3RcbiAgICAgIFtuZ01vZGVsXT1cImN1cnZlLmN1cnZlVHlwZVwiXG4gICAgICAobmdNb2RlbENoYW5nZSk9XCJjdXJ2ZS5jdXJ2ZVR5cGUgPSAkZXZlbnQ7IHByZXNldFNlcnZpY2UucHJldmlld0xpdmUoKVwiXG4gICAgICBzdHlsZT1cIndpZHRoOiAyMDBweDsgaGVpZ2h0OiAyMHB4XCJcbiAgICA+XG4gICAgICA8b3B0aW9uIFt2YWx1ZV09XCInc2luZSdcIj5cbiAgICAgICAge3sgJ2Rlc2lnbmVyLmVmZmVjdC5jdXJ2ZS1zaW5lJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgPC9vcHRpb24+XG4gICAgICA8b3B0aW9uIFt2YWx1ZV09XCInc3F1YXJlJ1wiPlxuICAgICAgICB7eyAnZGVzaWduZXIuZWZmZWN0LmN1cnZlLXNxdWFyZScgfCB0cmFuc2xhdGUgfX1cbiAgICAgIDwvb3B0aW9uPlxuICAgICAgPCEtLSA8b3B0aW9uIFt2YWx1ZV09XCIndHJpYW5nbGUnXCI+XG4gICAgICAgIHt7ICdkZXNpZ25lci5lZmZlY3QuY3VydmUtdHJpYW5nbGUnIHwgdHJhbnNsYXRlIH19PC9vcHRpb24+XG4gICAgICA8b3B0aW9uIFt2YWx1ZV09XCInc2F3dG9vdGgnXCI+XG4gICAgICAgIHt7ICdkZXNpZ25lci5lZmZlY3QuY3VydmUtc2F3dG9vdGgnIHwgdHJhbnNsYXRlIH19PC9vcHRpb24+XG4gICAgICA8b3B0aW9uIFt2YWx1ZV09XCIncmV2ZXJzZS1zYXd0b290aCdcIj5cbiAgICAgICAge3sgJ2Rlc2lnbmVyLmVmZmVjdC5jdXJ2ZS1yZXZlcnNlLXNhd3Rvb3RoJyB8IHRyYW5zbGF0ZSB9fTwvb3B0aW9uPiAtLT5cbiAgICA8L3NlbGVjdD5cbiAgPC9kaXY+XG4gIDxkaXY+XG4gICAgPGNhbnZhcyAjY3VydmVHcmlkIGNsYXNzPVwiY3VydmUtZ3JpZFwiIHdpZHRoPVwiMjAwXCIgaGVpZ2h0PVwiMTAwXCIgdmlld0JveD1cIjE1MCAtNzUgNDg1MCA1MTUwXCIgcHJlc2VydmVBc3BlY3RSYXRpbz1cIm5vbmVcIj48L2NhbnZhcz5cbiAgPC9kaXY+XG48L2Rpdj5cblxuPGRpdiBjbGFzcz1cIm1yLTRcIiBzdHlsZT1cImZsb2F0OiBsZWZ0XCI+XG4gIDxkaXYgY2xhc3M9XCJkLWZsZXhcIj5cbiAgICA8ZGl2IGNsYXNzPVwibXktYXV0b1wiIHN0eWxlPVwid2lkdGg6IDEwMHB4OyBmbG9hdDogbGVmdFwiPlxuICAgICAge3sgJ2Rlc2lnbmVyLmVmZmVjdC5jdXJ2ZS1sZW5ndGgnIHwgdHJhbnNsYXRlIH19XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cIm15LWF1dG9cIiBzdHlsZT1cImZsb2F0OiBsZWZ0XCI+XG4gICAgICA8bXYtc2xpZGVyXG4gICAgICAgIChjaGFuZ2UpPVwicmVkcmF3KCk7IHByZXNldFNlcnZpY2UucHJldmlld0xpdmUoKVwiXG4gICAgICAgIFsodmFsdWUpXT1cImN1cnZlLmxlbmd0aE1pbGxpc1wiXG4gICAgICAgIHN0eWxlPVwid2lkdGg6IDgwcHhcIlxuICAgICAgICBbdG9vbHRpcF09XCInaGlkZSdcIlxuICAgICAgICBbdmFsdWVdPVwiMFwiXG4gICAgICAgIFttaW5dPVwibGVuZ3RoTWlsbGlzTWluXCJcbiAgICAgICAgW21heF09XCJsZW5ndGhNaWxsaXNNYXhcIlxuICAgICAgICBbc3RlcF09XCIxXCJcbiAgICAgID48L212LXNsaWRlcj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwibXktYXV0b1wiPlxuICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJzbGlkZXItaW5wdXRcIiBbbmdNb2RlbF09XCJjdXJ2ZS5sZW5ndGhNaWxsaXNcIiAobmdNb2RlbENoYW5nZSk9XCJzZXRMZW5ndGhNaWxsaXMoJGV2ZW50KTsgcmVkcmF3KClcIiAvPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJteS1hdXRvIG1sLTFcIj5cbiAgICAgIHt7ICdkZXNpZ25lci5taXNjLm1zJyB8IHRyYW5zbGF0ZSB9fVxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8ZGl2IGNsYXNzPVwiZC1mbGV4XCI+XG4gICAgPGRpdiBjbGFzcz1cIm15LWF1dG9cIiBzdHlsZT1cIndpZHRoOiAxMDBweDsgZmxvYXQ6IGxlZnRcIj5cbiAgICAgIHt7ICdkZXNpZ25lci5lZmZlY3QuY3VydmUtYW1wbGl0dWRlJyB8IHRyYW5zbGF0ZSB9fVxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJteS1hdXRvXCIgc3R5bGU9XCJmbG9hdDogbGVmdFwiPlxuICAgICAgPG12LXNsaWRlclxuICAgICAgICAoY2hhbmdlKT1cInJlZHJhdygpOyBwcmVzZXRTZXJ2aWNlLnByZXZpZXdMaXZlKClcIlxuICAgICAgICBbKHZhbHVlKV09XCJjdXJ2ZS5hbXBsaXR1ZGVcIlxuICAgICAgICBzdHlsZT1cIndpZHRoOiA4MHB4XCJcbiAgICAgICAgW3Rvb2x0aXBdPVwiJ2hpZGUnXCJcbiAgICAgICAgW21pbl09XCJhbXBsaXR1ZGVNaW5cIlxuICAgICAgICBbbWF4XT1cImFtcGxpdHVkZU1heFwiXG4gICAgICAgIFtzdGVwXT1cIjAuMDFcIlxuICAgICAgPjwvbXYtc2xpZGVyPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJteS1hdXRvXCI+XG4gICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cInNsaWRlci1pbnB1dFwiIFtuZ01vZGVsXT1cImN1cnZlLmFtcGxpdHVkZVwiIChuZ01vZGVsQ2hhbmdlKT1cInNldEFtcGxpdHVkZSgkZXZlbnQpOyByZWRyYXcoKVwiIC8+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDxkaXYgY2xhc3M9XCJkLWZsZXhcIj5cbiAgICA8ZGl2IGNsYXNzPVwibXktYXV0b1wiIHN0eWxlPVwid2lkdGg6IDEwMHB4OyBmbG9hdDogbGVmdFwiPlxuICAgICAge3sgJ2Rlc2lnbmVyLmVmZmVjdC5jdXJ2ZS1wb3NpdGlvbicgfCB0cmFuc2xhdGUgfX1cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwibXktYXV0b1wiIHN0eWxlPVwiZmxvYXQ6IGxlZnRcIj5cbiAgICAgIDxtdi1zbGlkZXJcbiAgICAgICAgKGNoYW5nZSk9XCJyZWRyYXcoKTsgcHJlc2V0U2VydmljZS5wcmV2aWV3TGl2ZSgpXCJcbiAgICAgICAgWyh2YWx1ZSldPVwiY3VydmUucG9zaXRpb25cIlxuICAgICAgICBzdHlsZT1cIndpZHRoOiA4MHB4OyBoZWlnaHQ6IDE4cHhcIlxuICAgICAgICBbdG9vbHRpcF09XCInaGlkZSdcIlxuICAgICAgICBbbWluXT1cInBlcmNlbnRhZ2VNaW5cIlxuICAgICAgICBbbWF4XT1cInBlcmNlbnRhZ2VNYXhcIlxuICAgICAgICBbc3RlcF09XCIwLjAxXCJcbiAgICAgID5cbiAgICAgIDwvbXYtc2xpZGVyPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJteS1hdXRvXCI+XG4gICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cInNsaWRlci1pbnB1dFwiIFtuZ01vZGVsXT1cImN1cnZlLnBvc2l0aW9uXCIgKG5nTW9kZWxDaGFuZ2UpPVwic2V0UG9zaXRpb24oJGV2ZW50KTsgcmVkcmF3KClcIiAvPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8ZGl2IGNsYXNzPVwiZC1mbGV4XCI+XG4gICAgPGRpdiBjbGFzcz1cIm15LWF1dG9cIiBzdHlsZT1cIndpZHRoOiAxMDBweDsgZmxvYXQ6IGxlZnRcIj5cbiAgICAgIHt7ICdkZXNpZ25lci5lZmZlY3QuY3VydmUtcGhhc2UnIHwgdHJhbnNsYXRlIH19XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cIm15LWF1dG9cIiBzdHlsZT1cImZsb2F0OiBsZWZ0XCI+XG4gICAgICA8bXYtc2xpZGVyXG4gICAgICAgIChjaGFuZ2UpPVwicmVkcmF3KCk7IHByZXNldFNlcnZpY2UucHJldmlld0xpdmUoKVwiXG4gICAgICAgIFsodmFsdWUpXT1cImN1cnZlLnBoYXNlTWlsbGlzXCJcbiAgICAgICAgc3R5bGU9XCJ3aWR0aDogODBweDsgaGVpZ2h0OiAxOHB4XCJcbiAgICAgICAgW3Rvb2x0aXBdPVwiJ2hpZGUnXCJcbiAgICAgICAgW21pbl09XCJwaGFzZU1pbGxpc01pblwiXG4gICAgICAgIFttYXhdPVwicGhhc2VNaWxsaXNNYXhcIlxuICAgICAgICBbc3RlcF09XCIxXCJcbiAgICAgID48L212LXNsaWRlcj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwibXktYXV0b1wiPlxuICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJzbGlkZXItaW5wdXRcIiBbbmdNb2RlbF09XCJjdXJ2ZS5waGFzZU1pbGxpc1wiIChuZ01vZGVsQ2hhbmdlKT1cInNldFBoYXNlTWlsbGlzKCRldmVudCk7IHJlZHJhdygpXCIgLz5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwibXktYXV0byBtbC0xXCI+XG4gICAgICB7eyAnZGVzaWduZXIubWlzYy5tcycgfCB0cmFuc2xhdGUgfX1cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPGRpdiBjbGFzcz1cImQtZmxleFwiPlxuICAgIDxkaXYgY2xhc3M9XCJteS1hdXRvXCIgc3R5bGU9XCJ3aWR0aDogMTAwcHg7IGZsb2F0OiBsZWZ0XCI+XG4gICAgICB7eyAnZGVzaWduZXIuZWZmZWN0LmN1cnZlLWNoYXNlJyB8IHRyYW5zbGF0ZSB9fVxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJteS1hdXRvXCIgc3R5bGU9XCJmbG9hdDogbGVmdFwiPlxuICAgICAgPG12LXNsaWRlclxuICAgICAgICAoY2hhbmdlKT1cInJlZHJhdygpOyBwcmVzZXRTZXJ2aWNlLnByZXZpZXdMaXZlKClcIlxuICAgICAgICBbKHZhbHVlKV09XCJjdXJ2ZS5waGFzaW5nTWlsbGlzXCJcbiAgICAgICAgc3R5bGU9XCJ3aWR0aDogODBweDsgaGVpZ2h0OiAxOHB4XCJcbiAgICAgICAgW3Rvb2x0aXBdPVwiJ2hpZGUnXCJcbiAgICAgICAgW21pbl09XCJwaGFzaW5nTWlsbGlzTWluXCJcbiAgICAgICAgW21heF09XCJwaGFzaW5nTWlsbGlzTWF4XCJcbiAgICAgICAgW3N0ZXBdPVwiMVwiXG4gICAgICA+PC9tdi1zbGlkZXI+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cIm15LWF1dG9cIj5cbiAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwic2xpZGVyLWlucHV0XCIgW25nTW9kZWxdPVwiY3VydmUucGhhc2luZ01pbGxpc1wiIChuZ01vZGVsQ2hhbmdlKT1cInNldFBoYXNpbmdNaWxsaXMoJGV2ZW50KTsgcmVkcmF3KClcIiAvPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJteS1hdXRvIG1sLTFcIj5cbiAgICAgIHt7ICdkZXNpZ25lci5taXNjLm1zJyB8IHRyYW5zbGF0ZSB9fVxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuXG48IS0tIE1lbnUgZm9yIHRoZSBjYXBhYmlsaXRpZXMgYW5kIGNoYW5uZWxzLS0+XG48ZGl2IGNsYXNzPVwiY29sIGNvbC1hdXRvIHAtMFwiIHN0eWxlPVwibWFyZ2luLXJpZ2h0OiAxcHg7IHdpZHRoOiA1MHB4OyBmbG9hdDogbGVmdFwiPlxuICA8ZGl2IGNsYXNzPVwibmF2IGZsZXgtY29sdW1uIG5hdi1waWxsc1wiIGlkPVwidi1waWxscy10YWJcIiByb2xlPVwidGFibGlzdFwiIGFyaWEtb3JpZW50YXRpb249XCJ2ZXJ0aWNhbFwiPlxuICAgIDxhXG4gICAgICBjbGFzcz1cIm5hdi1saW5rIHB4LTMgYWN0aXZlXCJcbiAgICAgIGlkPVwidi1waWxscy1lZmZlY3QtY2FwYWJpbGl0aWVzLXRhYlwiXG4gICAgICBwb3BvdmVyPVwie3sgJ2Rlc2lnbmVyLm1pc2MuY2FwYWJpbGl0aWVzJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICBjb250YWluZXI9XCJib2R5XCJcbiAgICAgIHBsYWNlbWVudD1cInJpZ2h0XCJcbiAgICAgIHRyaWdnZXJzPVwibW91c2VlbnRlcjptb3VzZWxlYXZlXCJcbiAgICAgIGRhdGEtdG9nZ2xlPVwicGlsbFwiXG4gICAgICBocmVmPVwiI3YtcGlsbHMtZWZmZWN0LWNhcGFiaWxpdGllcy17eyBjdXJ2ZT8udXVpZCB9fVwiXG4gICAgICByb2xlPVwidGFiXCJcbiAgICAgIGFyaWEtY29udHJvbHM9XCJ2LXBpbGxzLWNhcGFiaWxpdGllc1wiXG4gICAgICBhcmlhLXNlbGVjdGVkPVwidHJ1ZVwiXG4gICAgPlxuICAgICAgPGkgY2xhc3M9XCJmYSBmYS1ib2x0IGZhLWZ3XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgIDwvYT5cbiAgICA8YVxuICAgICAgY2xhc3M9XCJuYXYtbGluayBweC0zXCJcbiAgICAgIGlkPVwidi1waWxscy1lZmZlY3QtY2hhbm5lbHMtdGFiXCJcbiAgICAgIHBvcG92ZXI9XCJ7eyAnZGVzaWduZXIubWlzYy5jaGFubmVscycgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgY29udGFpbmVyPVwiYm9keVwiXG4gICAgICBwbGFjZW1lbnQ9XCJyaWdodFwiXG4gICAgICB0cmlnZ2Vycz1cIm1vdXNlZW50ZXI6bW91c2VsZWF2ZVwiXG4gICAgICBkYXRhLXRvZ2dsZT1cInBpbGxcIlxuICAgICAgaHJlZj1cIiN2LXBpbGxzLWVmZmVjdC1jaGFubmVscy17eyBjdXJ2ZT8udXVpZCB9fVwiXG4gICAgICByb2xlPVwidGFiXCJcbiAgICAgIGFyaWEtY29udHJvbHM9XCJ2LXBpbGxzLWNoYW5uZWxzXCJcbiAgICAgIGFyaWEtc2VsZWN0ZWQ9XCJmYWxzZVwiXG4gICAgPlxuICAgICAgPGkgY2xhc3M9XCJmYSBmYS1zbGlkZXJzIGZhLWZ3XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgIDwvYT5cbiAgPC9kaXY+XG48L2Rpdj5cblxuPGRpdiBjbGFzcz1cImgtMTAwXCIgY2xhc3M9XCJhcHBseWluZy10b1wiPlxuICA8ZGl2IGNsYXNzPVwidGFiLWNvbnRlbnQgaC0xMDBcIiBpZD1cInYtcGlsbHMtdGFiQ29udGVudFwiPlxuICAgIDxkaXYgY2xhc3M9XCJ0YWItcGFuZSBoLTEwMCBzaG93IGFjdGl2ZVwiIGlkPVwidi1waWxscy1lZmZlY3QtY2FwYWJpbGl0aWVzLXt7IGN1cnZlPy51dWlkIH19XCIgcm9sZT1cInRhYnBhbmVsXCI+XG4gICAgICA8IS0tIENhcGFiaWxpdGllcy0tPlxuICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgY2FwYWJpbGl0eSBvZiBhdmFpbGFibGVDYXBhYmlsaXRpZXM7IGxldCBpID0gaW5kZXhcIiBjbGFzcz1cImZvcm0tY2hlY2tcIj5cbiAgICAgICAgPGlucHV0XG4gICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICBjbGFzcz1cImZvcm0tY2hlY2staW5wdXRcIlxuICAgICAgICAgIGlkPVwiY2FwYWJpbGl0eV97eyBjdXJ2ZT8udXVpZCArICdfJyArIGkgfX1cIlxuICAgICAgICAgIFtuZ01vZGVsXT1cImNhcGFiaWxpdHlDaGVja2VkKGNhcGFiaWxpdHkpXCJcbiAgICAgICAgICAoY2hhbmdlKT1cInRvZ2dsZUNhcGFiaWxpdHkoJGV2ZW50LCBjYXBhYmlsaXR5KVwiXG4gICAgICAgIC8+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWxcIiBmb3I9XCJjYXBhYmlsaXR5X3t7IGN1cnZlPy51dWlkICsgJ18nICsgaSB9fVwiPnt7IGdldENhcGFiaWxpdHlOYW1lKGNhcGFiaWxpdHkpIHwgYXN5bmMgfX08L2xhYmVsPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cInRhYi1wYW5lIGgtMTAwIHNob3dcIiBpZD1cInYtcGlsbHMtZWZmZWN0LWNoYW5uZWxzLXt7IGN1cnZlPy51dWlkIH19XCIgcm9sZT1cInRhYnBhbmVsXCI+XG4gICAgICA8IS0tIGNoYW5uZWxzIC0tPlxuXG4gICAgICA8IS0tIHByb2ZpbGUgc2VsZWN0aW9uIC0tPlxuICAgICAgPGRpdiAqbmdJZj1cImF2YWlsYWJsZVByb2ZpbGVzLmxlbmd0aCA+IDFcIj5cbiAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcHJvZmlsZSBvZiBhdmFpbGFibGVQcm9maWxlczsgbGV0IGkgPSBpbmRleFwiIGNsYXNzPVwiZm9ybS1jaGVja1wiPlxuICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dFwiXG4gICAgICAgICAgICBpZD1cImNoYW5uZWxfcHJvZmlsZV97eyBjdXJ2ZT8udXVpZCB9fV97eyBwcm9maWxlLnV1aWQgfX1cIlxuICAgICAgICAgICAgW25nTW9kZWxdPVwic2VsZWN0ZWRQcm9maWxlcy5pbmRleE9mKHByb2ZpbGUpID49IDBcIlxuICAgICAgICAgICAgKGNoYW5nZSk9XCJjaGFuZ2VQcm9maWxlU2VsZWN0aW9uKCRldmVudCwgcHJvZmlsZSlcIlxuICAgICAgICAgIC8+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbFwiIGZvcj1cImNoYW5uZWxfcHJvZmlsZV97eyBjdXJ2ZT8udXVpZCB9fV97eyBwcm9maWxlLnV1aWQgfX1cIj57eyBwcm9maWxlLm5hbWUgfX08L2xhYmVsPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8aHIgY2xhc3M9XCJteS0xXCIgc3R5bGU9XCJib3JkZXItY29sb3I6IHdoaXRlXCIgLz5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIGNoYW5uZWxzIC0tPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZW50cnkgb2YgYXZhaWxhYmxlQ2hhbm5lbHMgfCBrZXl2YWx1ZTsgbGV0IGkgPSBpbmRleFwiPlxuICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBjaGFubmVsIG9mIGVudHJ5LnZhbHVlOyBsZXQgaiA9IGluZGV4XCIgY2xhc3M9XCJmb3JtLWNoZWNrXCI+XG4gICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0XCJcbiAgICAgICAgICAgIGlkPVwiY2hhbm5lbF97eyBjdXJ2ZT8udXVpZCB9fV97eyBpIH19X3t7IGogfX1cIlxuICAgICAgICAgICAgW25nTW9kZWxdPVwiY2hhbm5lbENoZWNrZWQoZW50cnkua2V5LCBjaGFubmVsKVwiXG4gICAgICAgICAgICAoY2hhbmdlKT1cInRvZ2dsZUNoYW5uZWwoJGV2ZW50LCBlbnRyeS5rZXksIGNoYW5uZWwpXCJcbiAgICAgICAgICAvPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWxcIiBmb3I9XCJjaGFubmVsX3t7IGN1cnZlPy51dWlkIH19X3t7IGkgfX1fe3sgaiB9fVwiPnt7XG4gICAgICAgICAgICBnZXRDaGFubmVsTmFtZShlbnRyeS5rZXkubmFtZSwgY2hhbm5lbC5uYW1lKVxuICAgICAgICAgIH19PC9sYWJlbD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==