@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,589 @@
1
+ import { Component, HostListener } from '@angular/core';
2
+ import { TranslateService } from '@ngx-translate/core';
3
+ import { BsModalRef, BsModalService } from 'ngx-bootstrap/modal';
4
+ import { ToastrService } from 'ngx-toastr';
5
+ import { Subject } from 'rxjs';
6
+ import { catchError, finalize } from 'rxjs/operators';
7
+ import { Fixture } from '../models/fixture';
8
+ import { ConfigService } from '../services/config.service';
9
+ import { FixtureService } from '../services/fixture.service';
10
+ import { PresetService } from '../services/preset.service';
11
+ import { PreviewService } from '../services/preview.service';
12
+ import { ProjectService } from '../services/project.service';
13
+ import { UuidService } from '../services/uuid.service';
14
+ import { FixturePoolCreateFromFileComponent } from './fixture-pool-create-from-file/fixture-pool-create-from-file.component';
15
+ import * as i0 from "@angular/core";
16
+ import * as i1 from "ngx-bootstrap/modal";
17
+ import * as i2 from "../services/fixture.service";
18
+ import * as i3 from "../services/uuid.service";
19
+ import * as i4 from "../services/project.service";
20
+ import * as i5 from "../services/preview.service";
21
+ import * as i6 from "@ngx-translate/core";
22
+ import * as i7 from "ngx-toastr";
23
+ import * as i8 from "../services/preset.service";
24
+ import * as i9 from "../services/config.service";
25
+ import * as i10 from "@angular/common";
26
+ import * as i11 from "@angular/forms";
27
+ import * as i12 from "ngx-bootstrap/popover";
28
+ import * as i13 from "ngx-sortablejs-plus";
29
+ import * as i14 from "../array-sort-pipe";
30
+ function FixturePoolComponent_a_15_Template(rf, ctx) { if (rf & 1) {
31
+ i0.ɵɵelementStart(0, "a", 44)(1, "p", 45);
32
+ i0.ɵɵelement(2, "i", 46);
33
+ i0.ɵɵelementEnd()();
34
+ } }
35
+ function FixturePoolComponent_div_16_Template(rf, ctx) { if (rf & 1) {
36
+ const _r1 = i0.ɵɵgetCurrentView();
37
+ i0.ɵɵelementStart(0, "div", 47)(1, "div", 5)(2, "div", 48)(3, "p", 49);
38
+ i0.ɵɵelement(4, "span");
39
+ i0.ɵɵtext(5);
40
+ i0.ɵɵelementEnd()();
41
+ i0.ɵɵelementStart(6, "div", 50)(7, "a", 51);
42
+ i0.ɵɵlistener("click", function FixturePoolComponent_div_16_Template_a_click_7_listener() { const profile_r2 = i0.ɵɵrestoreView(_r1).$implicit; const ctx_r2 = i0.ɵɵnextContext(); ctx_r2.addFixture(profile_r2); return i0.ɵɵresetView(false); });
43
+ i0.ɵɵelement(8, "i", 19);
44
+ i0.ɵɵelementEnd()()()();
45
+ } if (rf & 2) {
46
+ const profile_r2 = ctx.$implicit;
47
+ const ctx_r2 = i0.ɵɵnextContext();
48
+ i0.ɵɵadvance(4);
49
+ i0.ɵɵclassMapInterpolate1("icon-", ctx_r2.fixtureService.getFixtureIconClass(profile_r2), " mr-1");
50
+ i0.ɵɵadvance();
51
+ i0.ɵɵtextInterpolate2(" ", profile_r2.manufacturerName, " - ", profile_r2.name, " ");
52
+ } }
53
+ function FixturePoolComponent_button_27_i_1_Template(rf, ctx) { if (rf & 1) {
54
+ i0.ɵɵelement(0, "i", 55);
55
+ } }
56
+ function FixturePoolComponent_button_27_i_2_Template(rf, ctx) { if (rf & 1) {
57
+ i0.ɵɵelement(0, "i", 56);
58
+ } }
59
+ function FixturePoolComponent_button_27_Template(rf, ctx) { if (rf & 1) {
60
+ const _r4 = i0.ɵɵgetCurrentView();
61
+ i0.ɵɵelementStart(0, "button", 52);
62
+ i0.ɵɵlistener("click", function FixturePoolComponent_button_27_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r4); const ctx_r2 = i0.ɵɵnextContext(); ctx_r2.updateProfiles(); return i0.ɵɵresetView(false); });
63
+ i0.ɵɵtemplate(1, FixturePoolComponent_button_27_i_1_Template, 1, 0, "i", 53)(2, FixturePoolComponent_button_27_i_2_Template, 1, 0, "i", 54);
64
+ i0.ɵɵtext(3);
65
+ i0.ɵɵpipe(4, "translate");
66
+ i0.ɵɵelementEnd();
67
+ } if (rf & 2) {
68
+ const ctx_r2 = i0.ɵɵnextContext();
69
+ i0.ɵɵproperty("disabled", ctx_r2.updatingProfiles);
70
+ i0.ɵɵadvance();
71
+ i0.ɵɵproperty("ngIf", ctx_r2.updatingProfiles);
72
+ i0.ɵɵadvance();
73
+ i0.ɵɵproperty("ngIf", !ctx_r2.updatingProfiles);
74
+ i0.ɵɵadvance();
75
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(4, 4, "designer.fixture-pool.update-profiles"), " ");
76
+ } }
77
+ function FixturePoolComponent_div_47_Template(rf, ctx) { if (rf & 1) {
78
+ const _r5 = i0.ɵɵgetCurrentView();
79
+ i0.ɵɵelementStart(0, "div", 57);
80
+ i0.ɵɵlistener("click", function FixturePoolComponent_div_47_Template_div_click_0_listener() { const fixture_r6 = i0.ɵɵrestoreView(_r5).$implicit; const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.selectFixture(fixture_r6)); });
81
+ i0.ɵɵelementStart(1, "div", 5)(2, "div", 58);
82
+ i0.ɵɵelement(3, "i", 59);
83
+ i0.ɵɵelementEnd();
84
+ i0.ɵɵelementStart(4, "div", 60)(5, "p", 49);
85
+ i0.ɵɵelement(6, "span");
86
+ i0.ɵɵtext(7);
87
+ i0.ɵɵelementEnd()();
88
+ i0.ɵɵelementStart(8, "div", 61)(9, "a", 51);
89
+ i0.ɵɵlistener("click", function FixturePoolComponent_div_47_Template_a_click_9_listener() { const fixture_r6 = i0.ɵɵrestoreView(_r5).$implicit; const ctx_r2 = i0.ɵɵnextContext(); ctx_r2.removeFixture(fixture_r6); return i0.ɵɵresetView(false); });
90
+ i0.ɵɵelement(10, "i", 62);
91
+ i0.ɵɵelementEnd()()()();
92
+ } if (rf & 2) {
93
+ const fixture_r6 = ctx.$implicit;
94
+ const ctx_r2 = i0.ɵɵnextContext();
95
+ i0.ɵɵclassProp("active", fixture_r6 == ctx_r2.selectedFixture);
96
+ i0.ɵɵadvance(6);
97
+ i0.ɵɵclassMapInterpolate1("icon-", ctx_r2.fixtureService.getFixtureIconClass(ctx_r2.fixtureService.getProfileByUuid(fixture_r6.profileUuid)), " mr-1");
98
+ i0.ɵɵadvance();
99
+ i0.ɵɵtextInterpolate1("", fixture_r6.name, " ");
100
+ } }
101
+ function FixturePoolComponent_div_64_Template(rf, ctx) { if (rf & 1) {
102
+ const _r7 = i0.ɵɵgetCurrentView();
103
+ i0.ɵɵelementStart(0, "div", 63);
104
+ i0.ɵɵlistener("mousedown", function FixturePoolComponent_div_64_Template_div_mousedown_0_listener($event) { i0.ɵɵrestoreView(_r7); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.channelMouseDown($event)); })("mouseover", function FixturePoolComponent_div_64_Template_div_mouseover_0_listener($event) { i0.ɵɵrestoreView(_r7); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.channelMouseOver($event)); });
105
+ i0.ɵɵelementStart(1, "div", 64)(2, "div", 65)(3, "small");
106
+ i0.ɵɵtext(4, "\u00A0");
107
+ i0.ɵɵelementEnd()()()();
108
+ } if (rf & 2) {
109
+ const i_r8 = ctx.index;
110
+ const ctx_r2 = i0.ɵɵnextContext();
111
+ i0.ɵɵclassProp("dmx-channel-occupied", ctx_r2.channelOccupied(i_r8))("dmx-channel-occupied-start", ctx_r2.channelOccupiedStart(i_r8))("dmx-channel-occupied-end", ctx_r2.channelOccupiedEnd(i_r8))("dmx-channel-selected", ctx_r2.channelSelected(i_r8))("dmx-channel-overlapped", ctx_r2.channelOverlapped(i_r8));
112
+ i0.ɵɵpropertyInterpolate("popover", i_r8 + 1);
113
+ i0.ɵɵattribute("data-index", i_r8);
114
+ i0.ɵɵadvance();
115
+ i0.ɵɵclassProp("dmx-channel-text-visible", ctx_r2.showChannelNumbers);
116
+ i0.ɵɵattribute("data-index", i_r8);
117
+ i0.ɵɵadvance();
118
+ i0.ɵɵattribute("data-index", i_r8);
119
+ i0.ɵɵadvance();
120
+ i0.ɵɵattribute("data-index", i_r8);
121
+ } }
122
+ function FixturePoolComponent_div_66_option_13_Template(rf, ctx) { if (rf & 1) {
123
+ i0.ɵɵelementStart(0, "option", 72);
124
+ i0.ɵɵtext(1);
125
+ i0.ɵɵpipe(2, "translate");
126
+ i0.ɵɵelementEnd();
127
+ } if (rf & 2) {
128
+ const mode_r10 = ctx.$implicit;
129
+ i0.ɵɵproperty("ngValue", mode_r10.shortName || mode_r10.name);
130
+ i0.ɵɵadvance();
131
+ i0.ɵɵtextInterpolate3(" ", mode_r10.name, " - ", mode_r10.channels.length, " ", i0.ɵɵpipeBind1(2, 4, "designer.fixture-pool.channels"), " ");
132
+ } }
133
+ function FixturePoolComponent_div_66_option_20_Template(rf, ctx) { if (rf & 1) {
134
+ i0.ɵɵelementStart(0, "option", 72);
135
+ i0.ɵɵtext(1);
136
+ i0.ɵɵelementEnd();
137
+ } if (rf & 2) {
138
+ const i_r11 = ctx.index;
139
+ i0.ɵɵproperty("ngValue", i_r11);
140
+ i0.ɵɵadvance();
141
+ i0.ɵɵtextInterpolate1(" ", i_r11 + 1, " ");
142
+ } }
143
+ function FixturePoolComponent_div_66_Template(rf, ctx) { if (rf & 1) {
144
+ const _r9 = i0.ɵɵgetCurrentView();
145
+ i0.ɵɵelementStart(0, "div")(1, "div", 20)(2, "label", 66);
146
+ i0.ɵɵtext(3);
147
+ i0.ɵɵpipe(4, "translate");
148
+ i0.ɵɵelementEnd();
149
+ i0.ɵɵelementStart(5, "div", 67)(6, "input", 68);
150
+ i0.ɵɵtwoWayListener("ngModelChange", function FixturePoolComponent_div_66_Template_input_ngModelChange_6_listener($event) { i0.ɵɵrestoreView(_r9); const ctx_r2 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r2.selectedFixture.name, $event) || (ctx_r2.selectedFixture.name = $event); return i0.ɵɵresetView($event); });
151
+ i0.ɵɵelementEnd()()();
152
+ i0.ɵɵelementStart(7, "div", 20)(8, "label", 69);
153
+ i0.ɵɵtext(9);
154
+ i0.ɵɵpipe(10, "translate");
155
+ i0.ɵɵelementEnd();
156
+ i0.ɵɵelementStart(11, "div", 67)(12, "select", 70);
157
+ i0.ɵɵlistener("ngModelChange", function FixturePoolComponent_div_66_Template_select_ngModelChange_12_listener($event) { i0.ɵɵrestoreView(_r9); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.selectedFixture.modeShortName = $event); });
158
+ i0.ɵɵtemplate(13, FixturePoolComponent_div_66_option_13_Template, 3, 6, "option", 71);
159
+ i0.ɵɵelementEnd()()();
160
+ i0.ɵɵelementStart(14, "div", 20)(15, "label", 69);
161
+ i0.ɵɵtext(16);
162
+ i0.ɵɵpipe(17, "translate");
163
+ i0.ɵɵelementEnd();
164
+ i0.ɵɵelementStart(18, "div", 67)(19, "select", 70);
165
+ i0.ɵɵlistener("ngModelChange", function FixturePoolComponent_div_66_Template_select_ngModelChange_19_listener($event) { i0.ɵɵrestoreView(_r9); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.selectedFixture.dmxFirstChannel = $event); });
166
+ i0.ɵɵtemplate(20, FixturePoolComponent_div_66_option_20_Template, 2, 2, "option", 71);
167
+ i0.ɵɵelementEnd()()();
168
+ i0.ɵɵelementStart(21, "div", 20);
169
+ i0.ɵɵelement(22, "label", 69);
170
+ i0.ɵɵelementStart(23, "div", 67)(24, "button", 43);
171
+ i0.ɵɵlistener("click", function FixturePoolComponent_div_66_Template_button_click_24_listener() { i0.ɵɵrestoreView(_r9); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.addCopy(ctx_r2.selectedFixture)); });
172
+ i0.ɵɵtext(25);
173
+ i0.ɵɵpipe(26, "translate");
174
+ i0.ɵɵelementEnd()()()();
175
+ } if (rf & 2) {
176
+ const ctx_r2 = i0.ɵɵnextContext();
177
+ i0.ɵɵadvance(3);
178
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(4, 9, "designer.fixture-pool.fixture-name"));
179
+ i0.ɵɵadvance(3);
180
+ i0.ɵɵtwoWayProperty("ngModel", ctx_r2.selectedFixture.name);
181
+ i0.ɵɵadvance(3);
182
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(10, 11, "designer.fixture-pool.mode"));
183
+ i0.ɵɵadvance(3);
184
+ i0.ɵɵproperty("ngModel", ctx_r2.selectedFixture.modeShortName);
185
+ i0.ɵɵadvance();
186
+ i0.ɵɵproperty("ngForOf", ctx_r2.selectedFixtureProfile.modes);
187
+ i0.ɵɵadvance(3);
188
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(17, 13, "designer.fixture-pool.first-channel"));
189
+ i0.ɵɵadvance(3);
190
+ i0.ɵɵproperty("ngModel", ctx_r2.selectedFixture.dmxFirstChannel);
191
+ i0.ɵɵadvance();
192
+ i0.ɵɵproperty("ngForOf", ctx_r2.dmxChannels);
193
+ i0.ɵɵadvance(5);
194
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(26, 15, "designer.fixture.add-copy"), " ");
195
+ } }
196
+ export class FixturePoolComponent {
197
+ constructor(bsModalRef, fixtureService, uuidService, projectService, previewService, translateService, toastrService, presetService, configService, modalService) {
198
+ this.bsModalRef = bsModalRef;
199
+ this.fixtureService = fixtureService;
200
+ this.uuidService = uuidService;
201
+ this.projectService = projectService;
202
+ this.previewService = previewService;
203
+ this.translateService = translateService;
204
+ this.toastrService = toastrService;
205
+ this.presetService = presetService;
206
+ this.configService = configService;
207
+ this.modalService = modalService;
208
+ this.loadingProfiles = false;
209
+ this.dmxChannels = [];
210
+ this.showChannelNumbers = false;
211
+ this.onClose = new Subject();
212
+ this.fixturePool = [...this.projectService.project.fixtures];
213
+ if (this.fixturePool.length > 0) {
214
+ this.selectFixture(this.fixturePool[0]);
215
+ }
216
+ }
217
+ ngOnInit() {
218
+ for (let i = 0; i < 512; i++) {
219
+ this.dmxChannels.push(0);
220
+ }
221
+ this.loadProfiles();
222
+ }
223
+ loadProfiles() {
224
+ this.loadingProfiles = true;
225
+ this.fixtureService.getSearchProfiles().subscribe((profiles) => {
226
+ this.profiles = profiles;
227
+ this.filterProfiles();
228
+ this.loadingProfiles = false;
229
+ });
230
+ }
231
+ selectFixture(fixture) {
232
+ this.selectedFixtureProfile = undefined;
233
+ if (fixture) {
234
+ this.selectedFixtureProfile = this.fixtureService.getProfileByUuid(fixture.profileUuid);
235
+ }
236
+ this.selectedFixture = fixture;
237
+ }
238
+ filterProfiles() {
239
+ if (!this.searchExpression || !this.profiles) {
240
+ this.filteredProfiles = this.profiles;
241
+ return;
242
+ }
243
+ this.filteredProfiles = [];
244
+ const keywords = this.searchExpression.split(' ');
245
+ for (const profile of this.profiles) {
246
+ let foundKeywords = 0;
247
+ for (const keyword of keywords) {
248
+ if (profile.uuid.toLowerCase().indexOf(keyword.toLowerCase()) !== -1 ||
249
+ profile.name.toLowerCase().indexOf(keyword.toLowerCase()) !== -1 ||
250
+ profile.manufacturerName.toLowerCase().indexOf(keyword.toLowerCase()) !== -1) {
251
+ foundKeywords++;
252
+ }
253
+ }
254
+ if (foundKeywords === keywords.length) {
255
+ this.filteredProfiles.push(profile);
256
+ }
257
+ }
258
+ }
259
+ addFixture(searchProfile) {
260
+ // Load the profile details, if not already done. There is only a
261
+ // minimal profile passed from the search.
262
+ this.fixtureService.loadProfileByUuid(searchProfile.uuid).subscribe(() => {
263
+ const profile = this.fixtureService.getProfileByUuid(searchProfile.uuid);
264
+ const newFixture = this.fixtureService.addFixture(profile, this.fixturePool);
265
+ this.selectFixture(newFixture);
266
+ });
267
+ }
268
+ addCopy(originalFixture) {
269
+ const fixture = new Fixture();
270
+ fixture.uuid = this.uuidService.getUuid();
271
+ fixture.profileUuid = originalFixture.profileUuid;
272
+ fixture.name = originalFixture.name;
273
+ fixture.modeShortName = originalFixture.modeShortName;
274
+ fixture.dmxFirstChannel = originalFixture.dmxFirstChannel;
275
+ fixture.dmxUniverseUuid = originalFixture.dmxUniverseUuid;
276
+ this.fixturePool.push(fixture);
277
+ this.selectFixture(fixture);
278
+ }
279
+ removeFixture(fixture) {
280
+ for (let i = 0; i < this.fixturePool.length; i++) {
281
+ if (this.fixturePool[i].uuid === fixture.uuid) {
282
+ if (this.selectedFixture === this.fixturePool[i]) {
283
+ this.selectFixture(undefined);
284
+ }
285
+ this.fixturePool.splice(i, 1);
286
+ break;
287
+ }
288
+ }
289
+ if (!this.selectedFixture && this.fixturePool && this.fixturePool.length > 0) {
290
+ this.selectFixture((this.selectedFixture = this.fixturePool[0]));
291
+ }
292
+ // remove unused profiles
293
+ for (let i = 0; i < this.projectService.project.fixtureProfiles.length; i++) {
294
+ let profileUsed = false;
295
+ for (const fixtureInPool of this.fixturePool) {
296
+ if (fixtureInPool.profileUuid === this.projectService.project.fixtureProfiles[i].uuid) {
297
+ profileUsed = true;
298
+ break;
299
+ }
300
+ }
301
+ if (!profileUsed) {
302
+ this.projectService.project.fixtureProfiles.splice(i, 1);
303
+ }
304
+ }
305
+ }
306
+ channelOccupied(index) {
307
+ for (const fixture of this.fixturePool) {
308
+ const mode = this.fixtureService.getModeByFixture(this.fixtureService.getProfileByUuid(fixture.profileUuid), fixture);
309
+ if (index >= fixture.dmxFirstChannel && index < fixture.dmxFirstChannel + mode.channels.length) {
310
+ return true;
311
+ }
312
+ }
313
+ return false;
314
+ }
315
+ channelOccupiedStart(index) {
316
+ for (const fixture of this.fixturePool) {
317
+ if (index === fixture.dmxFirstChannel) {
318
+ return true;
319
+ }
320
+ }
321
+ return false;
322
+ }
323
+ channelOccupiedEnd(index) {
324
+ for (const fixture of this.fixturePool) {
325
+ const mode = this.fixtureService.getModeByFixture(this.fixtureService.getProfileByUuid(fixture.profileUuid), fixture);
326
+ if (index === fixture.dmxFirstChannel + mode.channels.length - 1) {
327
+ return true;
328
+ }
329
+ }
330
+ return false;
331
+ }
332
+ channelOverlapped(index) {
333
+ let occupiedFixture;
334
+ for (const fixture of this.fixturePool) {
335
+ const mode = this.fixtureService.getModeByFixture(this.fixtureService.getProfileByUuid(fixture.profileUuid), fixture);
336
+ if (index >= fixture.dmxFirstChannel && index < fixture.dmxFirstChannel + mode.channels.length) {
337
+ if (occupiedFixture) {
338
+ if (occupiedFixture.dmxFirstChannel !== fixture.dmxFirstChannel || occupiedFixture.modeShortName !== fixture.modeShortName) {
339
+ // fixtures are allowed to overlap, if they start at the same channel and
340
+ // use the same mode. otherwise it's not allowed.
341
+ return true;
342
+ }
343
+ }
344
+ else {
345
+ occupiedFixture = fixture;
346
+ }
347
+ }
348
+ }
349
+ return false;
350
+ }
351
+ channelMouseDown(event) {
352
+ // start dragging
353
+ const selectedIndex = event.target.dataset.index;
354
+ let newSelectedFixture;
355
+ // find a dragging fixture and select it, but don't change the selection, if the
356
+ // currently selected fixture might also be selected (on overlapped fixtures)
357
+ for (const fixture of this.fixturePool) {
358
+ const mode = this.fixtureService.getModeByFixture(this.fixtureService.getProfileByUuid(fixture.profileUuid), fixture);
359
+ if (selectedIndex >= fixture.dmxFirstChannel && selectedIndex <= fixture.dmxFirstChannel + mode.channels.length - 1) {
360
+ if (this.selectedFixture === fixture) {
361
+ newSelectedFixture = fixture;
362
+ break;
363
+ }
364
+ if (!newSelectedFixture) {
365
+ newSelectedFixture = fixture;
366
+ }
367
+ }
368
+ }
369
+ if (newSelectedFixture) {
370
+ if (newSelectedFixture !== this.selectedFixture) {
371
+ this.selectFixture(newSelectedFixture);
372
+ }
373
+ this.channelDragFixture = newSelectedFixture;
374
+ this.channelDragOffset = selectedIndex - newSelectedFixture.dmxFirstChannel;
375
+ }
376
+ }
377
+ channelSelected(index) {
378
+ if (!this.selectedFixture) {
379
+ return false;
380
+ }
381
+ if (index >= this.selectedFixture.dmxFirstChannel) {
382
+ const mode = this.fixtureService.getModeByFixture(this.fixtureService.getProfileByUuid(this.selectedFixture.profileUuid), this.selectedFixture);
383
+ if (index < this.selectedFixture.dmxFirstChannel + mode.channels.length) {
384
+ return true;
385
+ }
386
+ }
387
+ return false;
388
+ }
389
+ // register mouse up globally (e.g. also outside the DMX mapping)
390
+ mouseUp(event) {
391
+ // finish dragging
392
+ this.channelDragFixture = undefined;
393
+ this.channelDragOffset = undefined;
394
+ }
395
+ channelMouseOver(event) {
396
+ // perform dragging
397
+ const selectedIndex = event.target.dataset.index;
398
+ if (this.channelDragFixture &&
399
+ selectedIndex - this.channelDragOffset >= 0 &&
400
+ selectedIndex -
401
+ this.channelDragOffset +
402
+ this.fixtureService.getModeByFixture(this.fixtureService.getProfileByUuid(this.channelDragFixture.profileUuid), this.channelDragFixture).channels.length -
403
+ 1 <=
404
+ 511) {
405
+ this.channelDragFixture.dmxFirstChannel = selectedIndex - this.channelDragOffset;
406
+ }
407
+ }
408
+ ok() {
409
+ // don't allow OK if overlapping fixtures exist
410
+ for (let i = 0; i < this.dmxChannels.length; i++) {
411
+ if (this.channelOverlapped(i)) {
412
+ const msg = 'designer.fixture-pool.channel-occupied';
413
+ const title = 'designer.fixture-pool.channel-occupied-title';
414
+ this.translateService.get([msg, title]).subscribe((result) => {
415
+ this.toastrService.error(result[msg], result[title]);
416
+ });
417
+ return;
418
+ }
419
+ }
420
+ this.projectService.project.fixtures = this.fixturePool;
421
+ this.fixtureService.updateCachedFixtures();
422
+ this.presetService.removeDeletedFixtures();
423
+ this.previewService.updateFixtureSetup();
424
+ this.presetService.updateFixtureSelection();
425
+ this.presetService.fixtureSelectionChanged.next();
426
+ this.presetService.previewLive();
427
+ this.onClose.next(1);
428
+ this.bsModalRef.hide();
429
+ }
430
+ cancel() {
431
+ this.onClose.next(2);
432
+ this.bsModalRef.hide();
433
+ }
434
+ updateProfiles() {
435
+ this.updatingProfiles = true;
436
+ // TODO
437
+ this.fixtureService
438
+ .updateProfiles()
439
+ .pipe(finalize(() => {
440
+ this.updatingProfiles = false;
441
+ }), catchError(() => {
442
+ const msg = 'designer.fixture-pool.profiles-update-error';
443
+ const title = 'designer.fixture-pool.profiles-update-error-title';
444
+ this.translateService.get([msg, title]).subscribe((result) => {
445
+ this.toastrService.error(result[msg], result[title]);
446
+ });
447
+ return undefined;
448
+ }))
449
+ .subscribe(() => {
450
+ this.loadProfiles();
451
+ const msg = 'designer.fixture-pool.profiles-updated';
452
+ const title = 'designer.fixture-pool.profiles-updated-title';
453
+ this.translateService.get([msg, title]).subscribe((result) => {
454
+ this.toastrService.success(result[msg], result[title]);
455
+ });
456
+ });
457
+ }
458
+ createFixtureFromProfileFile() {
459
+ const bsModalRef = this.modalService.show(FixturePoolCreateFromFileComponent, { keyboard: true, ignoreBackdropClick: false });
460
+ bsModalRef.content.onClose.subscribe((profile) => {
461
+ const newFixture = this.fixtureService.addFixture(profile, this.fixturePool);
462
+ this.selectFixture(newFixture);
463
+ });
464
+ }
465
+ handleKeyboardEvent(event) {
466
+ this.ok();
467
+ }
468
+ static { this.ɵfac = function FixturePoolComponent_Factory(t) { return new (t || FixturePoolComponent)(i0.ɵɵdirectiveInject(i1.BsModalRef), i0.ɵɵdirectiveInject(i2.FixtureService), i0.ɵɵdirectiveInject(i3.UuidService), i0.ɵɵdirectiveInject(i4.ProjectService), i0.ɵɵdirectiveInject(i5.PreviewService), i0.ɵɵdirectiveInject(i6.TranslateService), i0.ɵɵdirectiveInject(i7.ToastrService), i0.ɵɵdirectiveInject(i8.PresetService), i0.ɵɵdirectiveInject(i9.ConfigService), i0.ɵɵdirectiveInject(i1.BsModalService)); }; }
469
+ static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: FixturePoolComponent, selectors: [["lib-app-fixture-pool"]], hostBindings: function FixturePoolComponent_HostBindings(rf, ctx) { if (rf & 1) {
470
+ i0.ɵɵlistener("mouseup", function FixturePoolComponent_mouseup_HostBindingHandler($event) { return ctx.mouseUp($event); }, false, i0.ɵɵresolveWindow)("keydown.enter", function FixturePoolComponent_keydown_enter_HostBindingHandler($event) { return ctx.handleKeyboardEvent($event); }, false, i0.ɵɵresolveDocument);
471
+ } }, decls: 74, vars: 37, consts: [[1, "modal-header"], [1, "modal-title", "pull-left"], ["type", "button", "aria-label", "Close", 1, "close", "pull-right", 3, "click"], ["aria-hidden", "true"], [1, "modal-body"], [1, "row"], [1, "col-6"], ["type", "text", "id", "searchSet", 1, "form-control", "input-block", "mb-3", 3, "input", "placeholder"], [1, "card", "border-secondary", "w-100", 2, "height", "200px"], [1, "card-body", "p-0", "w-100"], [1, "list-group", "list-group-flush", "w-100"], ["class", "list-group-item flex-column align-items-start d-flex", 4, "ngIf"], ["class", "list-group-item", 4, "ngFor", "ngForOf"], [1, "d-inline-block", "mb-0", "mt-2"], ["href", "https://open-fixture-library.org/", "target", "_blank"], ["href", "https://open-fixture-library.org/fixture-editor", "target", "_blank", "role", "button", 1, "mt-2", "btn", "btn-secondary", "btn-sm", "float-right"], ["aria-hidden", "true", 1, "fa", "fa-file-o"], ["type", "button", "class", "mr-2 mt-2 btn btn-secondary btn-sm float-right", "role", "button", 3, "disabled", "click", 4, "ngIf"], ["type", "button", "role", "button", 1, "btn", "btn-secondary", 3, "click"], ["aria-hidden", "true", 1, "fa", "fa-plus"], [1, "form-group", "row"], [1, "col-lg-4", "col-form-label"], [1, "col-lg-8"], [1, "custom-select"], [1, "card", "border-secondary", 2, "height", "235px"], [1, "card-body", "p-0"], [1, "list-group", "list-group-flush", 3, "sortablejs"], ["class", "list-group-item", "style", "cursor: pointer", 3, "active", "click", 4, "ngFor", "ngForOf"], [1, "row", "mt-3"], [1, "col"], ["id", "myTab", "role", "tablist", 1, "nav", "nav-tabs", "mb-4"], [1, "nav-item"], ["id", "sets-tab", "data-toggle", "tab", "href", "#dmx", "role", "tab", 1, "nav-link", "active"], ["aria-hidden", "true", 1, "icon-ola"], ["id", "compositions-tab", "data-toggle", "tab", "href", "#settings", "role", "tab", 1, "nav-link"], ["aria-hidden", "true", 1, "fa", "fa-cog"], ["id", "myTabContent", 1, "tab-content"], ["id", "dmx", "role", "tabpanel", 1, "tab-pane", "show", "active"], ["class", "dmx-channel", "placement", "top", "triggers", "mouseenter:mouseleave", 3, "dmx-channel-occupied", "dmx-channel-occupied-start", "dmx-channel-occupied-end", "dmx-channel-selected", "dmx-channel-overlapped", "popover", "mousedown", "mouseover", 4, "ngFor", "ngForOf"], ["id", "settings", "role", "tabpanel", 1, "tab-pane"], [4, "ngIf"], [1, "modal-footer"], ["href", "#", "role", "button", 1, "mr-3", "my-auto", 3, "click"], ["type", "button", 1, "btn", "btn-primary", 3, "click"], [1, "list-group-item", "flex-column", "align-items-start", "d-flex"], [1, "mb-0", "mx-auto"], [1, "fa", "fa-spinner", "fa-pulse", "fa-fw"], [1, "list-group-item"], [1, "col-10", "col-auto", "my-auto", "pl-2"], [1, "mb-0"], [1, "col-2", "my-auto"], ["href", "#", "role", "button", 1, "btn", "btn-primary", "btn-sm", "float-right", 3, "click"], ["type", "button", "role", "button", 1, "mr-2", "mt-2", "btn", "btn-secondary", "btn-sm", "float-right", 3, "click", "disabled"], ["class", "fa fa-spinner fa-pulse fa-fw", "aria-hidden", "true", 4, "ngIf"], ["class", "fa fa-download fa-fw", "aria-hidden", "true", 4, "ngIf"], ["aria-hidden", "true", 1, "fa", "fa-spinner", "fa-pulse", "fa-fw"], ["aria-hidden", "true", 1, "fa", "fa-download", "fa-fw"], [1, "list-group-item", 2, "cursor", "pointer", 3, "click"], [1, "col-auto", "list-sort-handle", "my-auto", 2, "cursor", "move", "cursor", "-webkit-grabbing"], ["aria-hidden", "true", 1, "fa", "fa-bars"], [1, "col-auto", "flex-grow", "pl-0", "my-auto"], [1, "col-auto", "my-auto"], ["aria-hidden", "true", 1, "fa", "fa-minus"], ["placement", "top", "triggers", "mouseenter:mouseleave", 1, "dmx-channel", 3, "mousedown", "mouseover", "popover"], [1, "d-flex", "w-100", "dmx-channel-text"], [1, "m-auto", 2, "font-size", "11px"], ["for", "fixtureName", 1, "col-lg-3", "col-form-label"], [1, "col-lg-9"], ["type", "text", "maxlength", "200", "id", "fixtureName", 1, "form-control", 3, "ngModelChange", "ngModel"], [1, "col-lg-3", "col-form-label"], [1, "custom-select", 3, "ngModelChange", "ngModel"], [3, "ngValue", 4, "ngFor", "ngForOf"], [3, "ngValue"]], template: function FixturePoolComponent_Template(rf, ctx) { if (rf & 1) {
472
+ i0.ɵɵelementStart(0, "div", 0)(1, "h4", 1);
473
+ i0.ɵɵtext(2);
474
+ i0.ɵɵpipe(3, "translate");
475
+ i0.ɵɵelementEnd();
476
+ i0.ɵɵelementStart(4, "button", 2);
477
+ i0.ɵɵlistener("click", function FixturePoolComponent_Template_button_click_4_listener() { ctx.cancel(); return false; });
478
+ i0.ɵɵelementStart(5, "span", 3);
479
+ i0.ɵɵtext(6, "\u00D7");
480
+ i0.ɵɵelementEnd()()();
481
+ i0.ɵɵelementStart(7, "div", 4)(8, "div", 5)(9, "div", 6)(10, "input", 7);
482
+ i0.ɵɵpipe(11, "translate");
483
+ i0.ɵɵlistener("input", function FixturePoolComponent_Template_input_input_10_listener($event) { ctx.searchExpression = $event.target.value; return ctx.filterProfiles(); });
484
+ i0.ɵɵelementEnd();
485
+ i0.ɵɵelementStart(12, "div", 8)(13, "div", 9)(14, "div", 10);
486
+ i0.ɵɵtemplate(15, FixturePoolComponent_a_15_Template, 3, 0, "a", 11)(16, FixturePoolComponent_div_16_Template, 9, 5, "div", 12);
487
+ i0.ɵɵpipe(17, "sort");
488
+ i0.ɵɵelementEnd()()();
489
+ i0.ɵɵelementStart(18, "div")(19, "p", 13);
490
+ i0.ɵɵtext(20, " Powered by the ");
491
+ i0.ɵɵelementStart(21, "a", 14);
492
+ i0.ɵɵtext(22, "Open Fixture Library");
493
+ i0.ɵɵelementEnd()();
494
+ i0.ɵɵelementStart(23, "a", 15);
495
+ i0.ɵɵelement(24, "i", 16);
496
+ i0.ɵɵtext(25);
497
+ i0.ɵɵpipe(26, "translate");
498
+ i0.ɵɵelementEnd();
499
+ i0.ɵɵtemplate(27, FixturePoolComponent_button_27_Template, 5, 6, "button", 17);
500
+ i0.ɵɵelementEnd()();
501
+ i0.ɵɵelementStart(28, "div", 6)(29, "div", 5)(30, "div", 6)(31, "button", 18);
502
+ i0.ɵɵlistener("click", function FixturePoolComponent_Template_button_click_31_listener() { return ctx.createFixtureFromProfileFile(); });
503
+ i0.ɵɵelement(32, "i", 19);
504
+ i0.ɵɵtext(33);
505
+ i0.ɵɵpipe(34, "translate");
506
+ i0.ɵɵelementEnd()();
507
+ i0.ɵɵelementStart(35, "div", 6)(36, "div", 20)(37, "label", 21);
508
+ i0.ɵɵtext(38);
509
+ i0.ɵɵpipe(39, "translate");
510
+ i0.ɵɵelementEnd();
511
+ i0.ɵɵelementStart(40, "div", 22)(41, "select", 23)(42, "option");
512
+ i0.ɵɵtext(43, "Universe 1");
513
+ i0.ɵɵelementEnd()()()()()();
514
+ i0.ɵɵelementStart(44, "div", 24)(45, "div", 25)(46, "div", 26);
515
+ i0.ɵɵtemplate(47, FixturePoolComponent_div_47_Template, 11, 6, "div", 27);
516
+ i0.ɵɵelementEnd()()()()();
517
+ i0.ɵɵelementStart(48, "div", 28)(49, "div", 29)(50, "ul", 30)(51, "li", 31)(52, "a", 32);
518
+ i0.ɵɵelement(53, "i", 33);
519
+ i0.ɵɵtext(54);
520
+ i0.ɵɵpipe(55, "translate");
521
+ i0.ɵɵelementEnd()();
522
+ i0.ɵɵelementStart(56, "li", 31)(57, "a", 34);
523
+ i0.ɵɵelement(58, "i", 35);
524
+ i0.ɵɵtext(59);
525
+ i0.ɵɵpipe(60, "translate");
526
+ i0.ɵɵelementEnd()()();
527
+ i0.ɵɵelementStart(61, "div", 36)(62, "div", 37)(63, "div");
528
+ i0.ɵɵtemplate(64, FixturePoolComponent_div_64_Template, 5, 17, "div", 38);
529
+ i0.ɵɵelementEnd()();
530
+ i0.ɵɵelementStart(65, "div", 39);
531
+ i0.ɵɵtemplate(66, FixturePoolComponent_div_66_Template, 27, 17, "div", 40);
532
+ i0.ɵɵelementEnd()()()()();
533
+ i0.ɵɵelementStart(67, "div", 41)(68, "a", 42);
534
+ i0.ɵɵlistener("click", function FixturePoolComponent_Template_a_click_68_listener() { ctx.cancel(); return false; });
535
+ i0.ɵɵtext(69);
536
+ i0.ɵɵpipe(70, "translate");
537
+ i0.ɵɵelementEnd();
538
+ i0.ɵɵelementStart(71, "button", 43);
539
+ i0.ɵɵlistener("click", function FixturePoolComponent_Template_button_click_71_listener() { return ctx.ok(); });
540
+ i0.ɵɵtext(72);
541
+ i0.ɵɵpipe(73, "translate");
542
+ i0.ɵɵelementEnd()();
543
+ } if (rf & 2) {
544
+ i0.ɵɵadvance(2);
545
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(3, 16, "designer.fixture-pool.title"));
546
+ i0.ɵɵadvance(8);
547
+ i0.ɵɵpropertyInterpolate("placeholder", i0.ɵɵpipeBind1(11, 18, "designer.fixture-pool.search-profiles"));
548
+ i0.ɵɵadvance(5);
549
+ i0.ɵɵproperty("ngIf", ctx.loadingProfiles);
550
+ i0.ɵɵadvance();
551
+ i0.ɵɵproperty("ngForOf", i0.ɵɵpipeBind2(17, 20, ctx.filteredProfiles, "uuid"));
552
+ i0.ɵɵadvance(9);
553
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(26, 23, "designer.fixture-pool.add-profile"), " ");
554
+ i0.ɵɵadvance(2);
555
+ i0.ɵɵproperty("ngIf", ctx.configService.localProfiles);
556
+ i0.ɵɵadvance(6);
557
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(34, 25, "designer.fixture-pool.create-fixture-from-profile-file"), " ");
558
+ i0.ɵɵadvance(5);
559
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(39, 27, "designer.fixture-pool.universe"));
560
+ i0.ɵɵadvance(8);
561
+ i0.ɵɵproperty("sortablejs", ctx.fixturePool);
562
+ i0.ɵɵadvance();
563
+ i0.ɵɵproperty("ngForOf", ctx.fixturePool);
564
+ i0.ɵɵadvance(7);
565
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(55, 29, "designer.fixture-pool.dmx"), " ");
566
+ i0.ɵɵadvance(5);
567
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(60, 31, "designer.fixture-pool.settings"), " ");
568
+ i0.ɵɵadvance(5);
569
+ i0.ɵɵproperty("ngForOf", ctx.dmxChannels);
570
+ i0.ɵɵadvance(2);
571
+ i0.ɵɵproperty("ngIf", ctx.selectedFixture && ctx.selectedFixtureProfile);
572
+ i0.ɵɵadvance(3);
573
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(70, 33, "designer.misc.cancel"), " ");
574
+ i0.ɵɵadvance(3);
575
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(73, 35, "designer.misc.ok"));
576
+ } }, dependencies: [i10.NgForOf, i10.NgIf, i11.NgSelectOption, i11.ɵNgSelectMultipleOption, i11.DefaultValueAccessor, i11.SelectControlValueAccessor, i11.NgControlStatus, i11.MaxLengthValidator, i11.NgModel, i12.PopoverDirective, i13.SortablejsDirective, i6.TranslatePipe, i14.ArraySortPipe], styles: [".list-group-item[_ngcontent-%COMP%]{padding:.3rem 1.25rem}.dmx-channel[_ngcontent-%COMP%]{display:flex;float:left;width:28px;border:1px solid white;margin-left:-1px;margin-bottom:-1px;padding-bottom:2px}.dmx-channel-occupied[_ngcontent-%COMP%]{background-color:#63462e;border-left:none;border-right:none;cursor:move}.dmx-channel-occupied-start[_ngcontent-%COMP%]{border-left:1px solid white;border-top-left-radius:8px;border-bottom-left-radius:8px}.dmx-channel-occupied-end[_ngcontent-%COMP%]{border-right:1px solid white;border-top-right-radius:8px;border-bottom-right-radius:8px}.dmx-channel-selected[_ngcontent-%COMP%]{background-color:#fd7e14}.dmx-channel-overlapped[_ngcontent-%COMP%]{background-color:red;border:1px solid red;cursor:move}.card[_ngcontent-%COMP%]{overflow:auto}"] }); }
577
+ }
578
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(FixturePoolComponent, [{
579
+ type: Component,
580
+ args: [{ selector: 'lib-app-fixture-pool', template: "<div class=\"modal-header\">\n <h4 class=\"modal-title pull-left\">{{ 'designer.fixture-pool.title' | translate }}</h4>\n <button type=\"button\" class=\"close pull-right\" aria-label=\"Close\" (click)=\"cancel(); (false)\">\n <span aria-hidden=\"true\">&times;</span>\n </button>\n</div>\n<div class=\"modal-body\">\n <div class=\"row\">\n <div class=\"col-6\">\n <!-- Search for profiles -->\n <input\n type=\"text\"\n class=\"form-control input-block mb-3\"\n id=\"searchSet\"\n placeholder=\"{{ 'designer.fixture-pool.search-profiles' | translate }}\"\n (input)=\"searchExpression = $event.target.value; filterProfiles()\"\n />\n\n <!-- Profiles -->\n <div class=\"card border-secondary w-100\" style=\"height: 200px\">\n <div class=\"card-body p-0 w-100\">\n <div class=\"list-group list-group-flush w-100\">\n <a *ngIf=\"loadingProfiles\" class=\"list-group-item flex-column align-items-start d-flex\">\n <p class=\"mb-0 mx-auto\">\n <i class=\"fa fa-spinner fa-pulse fa-fw\"></i>\n </p>\n </a>\n\n <div class=\"list-group-item\" *ngFor=\"let profile of filteredProfiles | sort: 'uuid'\">\n <div class=\"row\">\n <div class=\"col-10 col-auto my-auto pl-2\">\n <p class=\"mb-0\">\n <span class=\"icon-{{ fixtureService.getFixtureIconClass(profile) }} mr-1\"></span> {{ profile.manufacturerName }} -\n {{ profile.name }}\n </p>\n </div>\n <div class=\"col-2 my-auto\">\n <a class=\"btn btn-primary btn-sm float-right\" href=\"#\" role=\"button\" (click)=\"addFixture(profile); (false)\">\n <i class=\"fa fa-plus\" aria-hidden=\"true\"></i>\n </a>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div>\n <p class=\"d-inline-block mb-0 mt-2\">\n Powered by the <a href=\"https://open-fixture-library.org/\" target=\"_blank\">Open Fixture Library</a>\n </p>\n <a\n class=\"mt-2 btn btn-secondary btn-sm float-right\"\n href=\"https://open-fixture-library.org/fixture-editor\"\n target=\"_blank\"\n role=\"button\"\n >\n <i class=\"fa fa-file-o\" aria-hidden=\"true\"></i> {{ 'designer.fixture-pool.add-profile' | translate }}\n </a>\n <button\n *ngIf=\"configService.localProfiles\"\n type=\"button\"\n class=\"mr-2 mt-2 btn btn-secondary btn-sm float-right\"\n (click)=\"updateProfiles(); (false)\"\n [disabled]=\"updatingProfiles\"\n role=\"button\"\n >\n <i *ngIf=\"updatingProfiles\" class=\"fa fa-spinner fa-pulse fa-fw\" aria-hidden=\"true\"></i>\n <i *ngIf=\"!updatingProfiles\" class=\"fa fa-download fa-fw\" aria-hidden=\"true\"></i>\n {{ 'designer.fixture-pool.update-profiles' | translate }}\n </button>\n </div>\n </div>\n <div class=\"col-6\">\n <div class=\"row\">\n <!-- Add fixture from local profile -->\n <div class=\"col-6\">\n <button type=\"button\" class=\"btn btn-secondary\" (click)=\"createFixtureFromProfileFile()\" role=\"button\">\n <i class=\"fa fa-plus\" aria-hidden=\"true\"></i> {{ 'designer.fixture-pool.create-fixture-from-profile-file' | translate }}\n </button>\n </div>\n\n <!-- Universe -->\n <div class=\"col-6\">\n <div class=\"form-group row\">\n <label class=\"col-lg-4 col-form-label\">{{ 'designer.fixture-pool.universe' | translate }}</label>\n <div class=\"col-lg-8\">\n <select class=\"custom-select\">\n <option>Universe 1</option>\n </select>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Fixtures -->\n <div class=\"card border-secondary\" style=\"height: 235px\">\n <div class=\"card-body p-0\">\n <div class=\"list-group list-group-flush\" [sortablejs]=\"fixturePool\">\n <div\n class=\"list-group-item\"\n *ngFor=\"let fixture of fixturePool\"\n [class.active]=\"fixture == selectedFixture\"\n (click)=\"selectFixture(fixture)\"\n style=\"cursor: pointer\"\n >\n <div class=\"row\">\n <div class=\"col-auto list-sort-handle my-auto\" style=\"cursor: move; cursor: -webkit-grabbing\">\n <i class=\"fa fa-bars\" aria-hidden=\"true\"></i>\n </div>\n <div class=\"col-auto flex-grow pl-0 my-auto\">\n <p class=\"mb-0\">\n <span class=\"icon-{{ fixtureService.getFixtureIconClass(fixtureService.getProfileByUuid(fixture.profileUuid)) }} mr-1\">\n </span\n >{{ fixture.name }}\n </p>\n </div>\n <div class=\"col-auto my-auto\">\n <a class=\"btn btn-primary btn-sm float-right\" href=\"#\" role=\"button\" (click)=\"removeFixture(fixture); (false)\">\n <i class=\"fa fa-minus\" aria-hidden=\"true\"></i>\n </a>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"row mt-3\">\n <div class=\"col\">\n <!-- Tab navigation -->\n <ul class=\"nav nav-tabs mb-4\" id=\"myTab\" role=\"tablist\">\n <li class=\"nav-item\">\n <a class=\"nav-link active\" id=\"sets-tab\" data-toggle=\"tab\" href=\"#dmx\" role=\"tab\">\n <i class=\"icon-ola\" aria-hidden=\"true\"></i> {{ 'designer.fixture-pool.dmx' | translate }}\n </a>\n </li>\n <li class=\"nav-item\">\n <a class=\"nav-link\" id=\"compositions-tab\" data-toggle=\"tab\" href=\"#settings\" role=\"tab\">\n <i class=\"fa fa-cog\" aria-hidden=\"true\"></i> {{ 'designer.fixture-pool.settings' | translate }}\n </a>\n </li>\n </ul>\n\n <!-- Tab content -->\n <div class=\"tab-content\" id=\"myTabContent\">\n <!-- DMX universe overview-->\n <div class=\"tab-pane show active\" id=\"dmx\" role=\"tabpanel\">\n <!-- Show all channel numbers -->\n <!-- <div class=\"form-group row\">\n <div class=\"col-auto flex-grow\"></div>\n <div class=\"col-lg-3 d-flex\">\n <div class=\"form-check my-auto ml-auto\">\n <input type=\"checkbox\" class=\"form-check-input\" id=\"showChannelNumbers\" [ngModel]=\"showChannelNumbers\"\n (ngModelChange)=\"showChannelNumbers = $event\">\n <label class=\"form-check-label\" for=\"showChannelNumbers\">Show channels</label>\n </div>\n </div>\n </div> -->\n\n <!-- List of DMX channels -->\n <div>\n <div\n *ngFor=\"let channel of dmxChannels; let i = index\"\n class=\"dmx-channel\"\n [class.dmx-channel-occupied]=\"channelOccupied(i)\"\n [class.dmx-channel-occupied-start]=\"channelOccupiedStart(i)\"\n [class.dmx-channel-occupied-end]=\"channelOccupiedEnd(i)\"\n [class.dmx-channel-selected]=\"channelSelected(i)\"\n [class.dmx-channel-overlapped]=\"channelOverlapped(i)\"\n (mousedown)=\"channelMouseDown($event)\"\n (mouseover)=\"channelMouseOver($event)\"\n [attr.data-index]=\"i\"\n popover=\"{{ i + 1 }}\"\n placement=\"top\"\n triggers=\"mouseenter:mouseleave\"\n >\n <div class=\"d-flex w-100 dmx-channel-text\" [attr.data-index]=\"i\" [class.dmx-channel-text-visible]=\"showChannelNumbers\">\n <div class=\"m-auto\" style=\"font-size: 11px\" [attr.data-index]=\"i\"><small [attr.data-index]=\"i\">&nbsp;</small></div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Fixture settings -->\n <div class=\"tab-pane\" id=\"settings\" role=\"tabpanel\">\n <div *ngIf=\"selectedFixture && selectedFixtureProfile\">\n <div class=\"form-group row\">\n <label class=\"col-lg-3 col-form-label\" for=\"fixtureName\">{{ 'designer.fixture-pool.fixture-name' | translate }}</label>\n <div class=\"col-lg-9\">\n <input type=\"text\" class=\"form-control\" [(ngModel)]=\"selectedFixture.name\" maxlength=\"200\" id=\"fixtureName\" />\n </div>\n </div>\n\n <div class=\"form-group row\">\n <label class=\"col-lg-3 col-form-label\">{{ 'designer.fixture-pool.mode' | translate }}</label>\n <div class=\"col-lg-9\">\n <select\n class=\"custom-select\"\n [ngModel]=\"selectedFixture.modeShortName\"\n (ngModelChange)=\"selectedFixture.modeShortName = $event\"\n >\n <option *ngFor=\"let mode of selectedFixtureProfile.modes\" [ngValue]=\"mode.shortName || mode.name\">\n {{ mode.name }}\n - {{ mode.channels.length }}\n {{ 'designer.fixture-pool.channels' | translate }}\n </option>\n </select>\n </div>\n </div>\n\n <div class=\"form-group row\">\n <label class=\"col-lg-3 col-form-label\">{{ 'designer.fixture-pool.first-channel' | translate }}</label>\n <div class=\"col-lg-9\">\n <select\n class=\"custom-select\"\n [ngModel]=\"selectedFixture.dmxFirstChannel\"\n (ngModelChange)=\"selectedFixture.dmxFirstChannel = $event\"\n >\n <option *ngFor=\"let channel of dmxChannels; let i = index\" [ngValue]=\"i\">\n {{ i + 1 }}\n </option>\n </select>\n </div>\n </div>\n\n <div class=\"form-group row\">\n <label class=\"col-lg-3 col-form-label\"></label>\n <div class=\"col-lg-9\">\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"addCopy(selectedFixture)\">\n {{ 'designer.fixture.add-copy' | translate }}\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n<div class=\"modal-footer\">\n <a class=\"mr-3 my-auto\" href=\"#\" role=\"button\" (click)=\"cancel(); (false)\">\n {{ 'designer.misc.cancel' | translate }}\n </a>\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"ok()\">{{ 'designer.misc.ok' | translate }}</button>\n</div>\n", styles: [".list-group-item{padding:.3rem 1.25rem}.dmx-channel{display:flex;float:left;width:28px;border:1px solid white;margin-left:-1px;margin-bottom:-1px;padding-bottom:2px}.dmx-channel-occupied{background-color:#63462e;border-left:none;border-right:none;cursor:move}.dmx-channel-occupied-start{border-left:1px solid white;border-top-left-radius:8px;border-bottom-left-radius:8px}.dmx-channel-occupied-end{border-right:1px solid white;border-top-right-radius:8px;border-bottom-right-radius:8px}.dmx-channel-selected{background-color:#fd7e14}.dmx-channel-overlapped{background-color:red;border:1px solid red;cursor:move}.card{overflow:auto}\n"] }]
581
+ }], () => [{ type: i1.BsModalRef }, { type: i2.FixtureService }, { type: i3.UuidService }, { type: i4.ProjectService }, { type: i5.PreviewService }, { type: i6.TranslateService }, { type: i7.ToastrService }, { type: i8.PresetService }, { type: i9.ConfigService }, { type: i1.BsModalService }], { mouseUp: [{
582
+ type: HostListener,
583
+ args: ['window:mouseup', ['$event']]
584
+ }], handleKeyboardEvent: [{
585
+ type: HostListener,
586
+ args: ['document:keydown.enter', ['$event']]
587
+ }] }); })();
588
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(FixturePoolComponent, { className: "FixturePoolComponent" }); })();
589
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZml4dHVyZS1wb29sLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Rlc2lnbmVyL3NyYy9saWIvZml4dHVyZS1wb29sL2ZpeHR1cmUtcG9vbC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kZXNpZ25lci9zcmMvbGliL2ZpeHR1cmUtcG9vbC9maXh0dXJlLXBvb2wuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFDaEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdkQsT0FBTyxFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFNUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzNELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzdELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGtDQUFrQyxFQUFFLE1BQU0seUVBQXlFLENBQUM7Ozs7Ozs7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RG1HLGlCQUFTLEVBQ3RHOztZQXBQOEIsZUFBK0M7WUFBL0MsMEVBQStDO1lBYTNFLGVBQXVFO1lBQXZFLHdHQUF1RTtZQVEvRCxlQUFxQjtZQUFyQiwwQ0FBcUI7WUFNd0IsY0FBa0M7WUFBbEMsOEVBQWtDO1lBNEJyQyxlQUNsRDtZQURrRCw0RkFDbEQ7WUFFRyxlQUFpQztZQUFqQyxzREFBaUM7WUFrQmMsZUFDaEQ7WUFEZ0QsaUhBQ2hEO1lBTXlDLGVBQWtEO1lBQWxELDhFQUFrRDtZQWFsRCxlQUEwQjtZQUExQiw0Q0FBMEI7WUFHM0MsY0FBYztZQUFkLHlDQUFjO1lBa0NRLGVBQzlDO1lBRDhDLG9GQUM5QztZQUkrQyxlQUMvQztZQUQrQyx5RkFDL0M7WUF1QndCLGVBQWdCO1lBQWhCLHlDQUFnQjtZQXVCbEMsZUFBK0M7WUFBL0Msd0VBQStDO1lBd0QzRCxlQUNGO1lBREUsK0VBQ0Y7WUFDNkQsZUFBb0M7WUFBcEMsZ0VBQW9DOzs7aUZEL050RixvQkFBb0I7Y0FMaEMsU0FBUzsyQkFDRSxzQkFBc0I7NFNBc1FoQyxPQUFPO2tCQUROLFlBQVk7bUJBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUM7WUFzRzFDLG1CQUFtQjtrQkFEbEIsWUFBWTttQkFBQyx3QkFBd0IsRUFBRSxDQUFDLFFBQVEsQ0FBQzs7a0ZBdFd2QyxvQkFBb0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEhvc3RMaXN0ZW5lciwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBCc01vZGFsUmVmLCBCc01vZGFsU2VydmljZSB9IGZyb20gJ25neC1ib290c3RyYXAvbW9kYWwnO1xuaW1wb3J0IHsgVG9hc3RyU2VydmljZSB9IGZyb20gJ25neC10b2FzdHInO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgY2F0Y2hFcnJvciwgZmluYWxpemUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBGaXh0dXJlIH0gZnJvbSAnLi4vbW9kZWxzL2ZpeHR1cmUnO1xuaW1wb3J0IHsgRml4dHVyZVByb2ZpbGUgfSBmcm9tICcuLi9tb2RlbHMvZml4dHVyZS1wcm9maWxlJztcbmltcG9ydCB7IENvbmZpZ1NlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9jb25maWcuc2VydmljZSc7XG5pbXBvcnQgeyBGaXh0dXJlU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2ZpeHR1cmUuc2VydmljZSc7XG5pbXBvcnQgeyBQcmVzZXRTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvcHJlc2V0LnNlcnZpY2UnO1xuaW1wb3J0IHsgUHJldmlld1NlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9wcmV2aWV3LnNlcnZpY2UnO1xuaW1wb3J0IHsgUHJvamVjdFNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9wcm9qZWN0LnNlcnZpY2UnO1xuaW1wb3J0IHsgVXVpZFNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy91dWlkLnNlcnZpY2UnO1xuaW1wb3J0IHsgRml4dHVyZVBvb2xDcmVhdGVGcm9tRmlsZUNvbXBvbmVudCB9IGZyb20gJy4vZml4dHVyZS1wb29sLWNyZWF0ZS1mcm9tLWZpbGUvZml4dHVyZS1wb29sLWNyZWF0ZS1mcm9tLWZpbGUuY29tcG9uZW50JztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbGliLWFwcC1maXh0dXJlLXBvb2wnLFxuICB0ZW1wbGF0ZVVybDogJy4vZml4dHVyZS1wb29sLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZml4dHVyZS1wb29sLmNvbXBvbmVudC5jc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgRml4dHVyZVBvb2xDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBwcml2YXRlIHByb2ZpbGVzOiBGaXh0dXJlUHJvZmlsZVtdO1xuICBwdWJsaWMgZmlsdGVyZWRQcm9maWxlczogRml4dHVyZVByb2ZpbGVbXTtcbiAgcHVibGljIGxvYWRpbmdQcm9maWxlcyA9IGZhbHNlO1xuXG4gIHB1YmxpYyBmaXh0dXJlUG9vbDogRml4dHVyZVtdO1xuXG4gIHB1YmxpYyBkbXhDaGFubmVsczogbnVtYmVyW10gPSBbXTtcbiAgcHVibGljIHNlbGVjdGVkRml4dHVyZTogRml4dHVyZTtcbiAgcHVibGljIHNlbGVjdGVkRml4dHVyZVByb2ZpbGU6IEZpeHR1cmVQcm9maWxlO1xuICBwdWJsaWMgc2hvd0NoYW5uZWxOdW1iZXJzID0gZmFsc2U7XG4gIHB1YmxpYyBjaGFubmVsRHJhZ0ZpeHR1cmU6IEZpeHR1cmU7XG4gIHB1YmxpYyBjaGFubmVsRHJhZ09mZnNldDogbnVtYmVyO1xuXG4gIHB1YmxpYyBvbkNsb3NlOiBTdWJqZWN0PG51bWJlcj4gPSBuZXcgU3ViamVjdCgpO1xuXG4gIHB1YmxpYyBzZWFyY2hFeHByZXNzaW9uOiBzdHJpbmc7XG5cbiAgcHVibGljIHVwZGF0aW5nUHJvZmlsZXM6IGJvb2xlYW47XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGJzTW9kYWxSZWY6IEJzTW9kYWxSZWYsXG4gICAgcHVibGljIGZpeHR1cmVTZXJ2aWNlOiBGaXh0dXJlU2VydmljZSxcbiAgICBwcml2YXRlIHV1aWRTZXJ2aWNlOiBVdWlkU2VydmljZSxcbiAgICBwdWJsaWMgcHJvamVjdFNlcnZpY2U6IFByb2plY3RTZXJ2aWNlLFxuICAgIHByaXZhdGUgcHJldmlld1NlcnZpY2U6IFByZXZpZXdTZXJ2aWNlLFxuICAgIHByaXZhdGUgdHJhbnNsYXRlU2VydmljZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICBwcml2YXRlIHRvYXN0clNlcnZpY2U6IFRvYXN0clNlcnZpY2UsXG4gICAgcHJpdmF0ZSBwcmVzZXRTZXJ2aWNlOiBQcmVzZXRTZXJ2aWNlLFxuICAgIHB1YmxpYyBjb25maWdTZXJ2aWNlOiBDb25maWdTZXJ2aWNlLFxuICAgIHByaXZhdGUgbW9kYWxTZXJ2aWNlOiBCc01vZGFsU2VydmljZVxuICApIHtcbiAgICB0aGlzLmZpeHR1cmVQb29sID0gWy4uLnRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5maXh0dXJlc107XG5cbiAgICBpZiAodGhpcy5maXh0dXJlUG9vbC5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnNlbGVjdEZpeHR1cmUodGhpcy5maXh0dXJlUG9vbFswXSk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCA1MTI7IGkrKykge1xuICAgICAgdGhpcy5kbXhDaGFubmVscy5wdXNoKDApO1xuICAgIH1cblxuICAgIHRoaXMubG9hZFByb2ZpbGVzKCk7XG4gIH1cblxuICBwcml2YXRlIGxvYWRQcm9maWxlcygpIHtcbiAgICB0aGlzLmxvYWRpbmdQcm9maWxlcyA9IHRydWU7XG5cbiAgICB0aGlzLmZpeHR1cmVTZXJ2aWNlLmdldFNlYXJjaFByb2ZpbGVzKCkuc3Vic2NyaWJlKChwcm9maWxlcykgPT4ge1xuICAgICAgdGhpcy5wcm9maWxlcyA9IHByb2ZpbGVzO1xuICAgICAgdGhpcy5maWx0ZXJQcm9maWxlcygpO1xuICAgICAgdGhpcy5sb2FkaW5nUHJvZmlsZXMgPSBmYWxzZTtcbiAgICB9KTtcbiAgfVxuXG4gIHNlbGVjdEZpeHR1cmUoZml4dHVyZTogRml4dHVyZSkge1xuICAgIHRoaXMuc2VsZWN0ZWRGaXh0dXJlUHJvZmlsZSA9IHVuZGVmaW5lZDtcbiAgICBpZiAoZml4dHVyZSkge1xuICAgICAgdGhpcy5zZWxlY3RlZEZpeHR1cmVQcm9maWxlID0gdGhpcy5maXh0dXJlU2VydmljZS5nZXRQcm9maWxlQnlVdWlkKGZpeHR1cmUucHJvZmlsZVV1aWQpO1xuICAgIH1cbiAgICB0aGlzLnNlbGVjdGVkRml4dHVyZSA9IGZpeHR1cmU7XG4gIH1cblxuICBmaWx0ZXJQcm9maWxlcygpIHtcbiAgICBpZiAoIXRoaXMuc2VhcmNoRXhwcmVzc2lvbiB8fCAhdGhpcy5wcm9maWxlcykge1xuICAgICAgdGhpcy5maWx0ZXJlZFByb2ZpbGVzID0gdGhpcy5wcm9maWxlcztcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmZpbHRlcmVkUHJvZmlsZXMgPSBbXTtcblxuICAgIGNvbnN0IGtleXdvcmRzID0gdGhpcy5zZWFyY2hFeHByZXNzaW9uLnNwbGl0KCcgJyk7XG5cbiAgICBmb3IgKGNvbnN0IHByb2ZpbGUgb2YgdGhpcy5wcm9maWxlcykge1xuICAgICAgbGV0IGZvdW5kS2V5d29yZHMgPSAwO1xuXG4gICAgICBmb3IgKGNvbnN0IGtleXdvcmQgb2Yga2V5d29yZHMpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHByb2ZpbGUudXVpZC50b0xvd2VyQ2FzZSgpLmluZGV4T2Yoa2V5d29yZC50b0xvd2VyQ2FzZSgpKSAhPT0gLTEgfHxcbiAgICAgICAgICBwcm9maWxlLm5hbWUudG9Mb3dlckNhc2UoKS5pbmRleE9mKGtleXdvcmQudG9Mb3dlckNhc2UoKSkgIT09IC0xIHx8XG4gICAgICAgICAgcHJvZmlsZS5tYW51ZmFjdHVyZXJOYW1lLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihrZXl3b3JkLnRvTG93ZXJDYXNlKCkpICE9PSAtMVxuICAgICAgICApIHtcbiAgICAgICAgICBmb3VuZEtleXdvcmRzKys7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGZvdW5kS2V5d29yZHMgPT09IGtleXdvcmRzLmxlbmd0aCkge1xuICAgICAgICB0aGlzLmZpbHRlcmVkUHJvZmlsZXMucHVzaChwcm9maWxlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhZGRGaXh0dXJlKHNlYXJjaFByb2ZpbGU6IEZpeHR1cmVQcm9maWxlKSB7XG4gICAgLy8gTG9hZCB0aGUgcHJvZmlsZSBkZXRhaWxzLCBpZiBub3QgYWxyZWFkeSBkb25lLiBUaGVyZSBpcyBvbmx5IGFcbiAgICAvLyBtaW5pbWFsIHByb2ZpbGUgcGFzc2VkIGZyb20gdGhlIHNlYXJjaC5cbiAgICB0aGlzLmZpeHR1cmVTZXJ2aWNlLmxvYWRQcm9maWxlQnlVdWlkKHNlYXJjaFByb2ZpbGUudXVpZCkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIGNvbnN0IHByb2ZpbGUgPSB0aGlzLmZpeHR1cmVTZXJ2aWNlLmdldFByb2ZpbGVCeVV1aWQoc2VhcmNoUHJvZmlsZS51dWlkKTtcbiAgICAgIGNvbnN0IG5ld0ZpeHR1cmUgPSB0aGlzLmZpeHR1cmVTZXJ2aWNlLmFkZEZpeHR1cmUocHJvZmlsZSwgdGhpcy5maXh0dXJlUG9vbCk7XG4gICAgICB0aGlzLnNlbGVjdEZpeHR1cmUobmV3Rml4dHVyZSk7XG4gICAgfSk7XG4gIH1cblxuICBhZGRDb3B5KG9yaWdpbmFsRml4dHVyZTogRml4dHVyZSkge1xuICAgIGNvbnN0IGZpeHR1cmUgPSBuZXcgRml4dHVyZSgpO1xuICAgIGZpeHR1cmUudXVpZCA9IHRoaXMudXVpZFNlcnZpY2UuZ2V0VXVpZCgpO1xuICAgIGZpeHR1cmUucHJvZmlsZVV1aWQgPSBvcmlnaW5hbEZpeHR1cmUucHJvZmlsZVV1aWQ7XG4gICAgZml4dHVyZS5uYW1lID0gb3JpZ2luYWxGaXh0dXJlLm5hbWU7XG4gICAgZml4dHVyZS5tb2RlU2hvcnROYW1lID0gb3JpZ2luYWxGaXh0dXJlLm1vZGVTaG9ydE5hbWU7XG4gICAgZml4dHVyZS5kbXhGaXJzdENoYW5uZWwgPSBvcmlnaW5hbEZpeHR1cmUuZG14Rmlyc3RDaGFubmVsO1xuICAgIGZpeHR1cmUuZG14VW5pdmVyc2VVdWlkID0gb3JpZ2luYWxGaXh0dXJlLmRteFVuaXZlcnNlVXVpZDtcblxuICAgIHRoaXMuZml4dHVyZVBvb2wucHVzaChmaXh0dXJlKTtcbiAgICB0aGlzLnNlbGVjdEZpeHR1cmUoZml4dHVyZSk7XG4gIH1cblxuICByZW1vdmVGaXh0dXJlKGZpeHR1cmU6IEZpeHR1cmUpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuZml4dHVyZVBvb2wubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLmZpeHR1cmVQb29sW2ldLnV1aWQgPT09IGZpeHR1cmUudXVpZCkge1xuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZEZpeHR1cmUgPT09IHRoaXMuZml4dHVyZVBvb2xbaV0pIHtcbiAgICAgICAgICB0aGlzLnNlbGVjdEZpeHR1cmUodW5kZWZpbmVkKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZpeHR1cmVQb29sLnNwbGljZShpLCAxKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkRml4dHVyZSAmJiB0aGlzLmZpeHR1cmVQb29sICYmIHRoaXMuZml4dHVyZVBvb2wubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5zZWxlY3RGaXh0dXJlKCh0aGlzLnNlbGVjdGVkRml4dHVyZSA9IHRoaXMuZml4dHVyZVBvb2xbMF0pKTtcbiAgICB9XG5cbiAgICAvLyByZW1vdmUgdW51c2VkIHByb2ZpbGVzXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3QuZml4dHVyZVByb2ZpbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBsZXQgcHJvZmlsZVVzZWQgPSBmYWxzZTtcblxuICAgICAgZm9yIChjb25zdCBmaXh0dXJlSW5Qb29sIG9mIHRoaXMuZml4dHVyZVBvb2wpIHtcbiAgICAgICAgaWYgKGZpeHR1cmVJblBvb2wucHJvZmlsZVV1aWQgPT09IHRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5maXh0dXJlUHJvZmlsZXNbaV0udXVpZCkge1xuICAgICAgICAgIHByb2ZpbGVVc2VkID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoIXByb2ZpbGVVc2VkKSB7XG4gICAgICAgIHRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5maXh0dXJlUHJvZmlsZXMuc3BsaWNlKGksIDEpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNoYW5uZWxPY2N1cGllZChpbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgZm9yIChjb25zdCBmaXh0dXJlIG9mIHRoaXMuZml4dHVyZVBvb2wpIHtcbiAgICAgIGNvbnN0IG1vZGUgPSB0aGlzLmZpeHR1cmVTZXJ2aWNlLmdldE1vZGVCeUZpeHR1cmUodGhpcy5maXh0dXJlU2VydmljZS5nZXRQcm9maWxlQnlVdWlkKGZpeHR1cmUucHJvZmlsZVV1aWQpLCBmaXh0dXJlKTtcblxuICAgICAgaWYgKGluZGV4ID49IGZpeHR1cmUuZG14Rmlyc3RDaGFubmVsICYmIGluZGV4IDwgZml4dHVyZS5kbXhGaXJzdENoYW5uZWwgKyBtb2RlLmNoYW5uZWxzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjaGFubmVsT2NjdXBpZWRTdGFydChpbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgZm9yIChjb25zdCBmaXh0dXJlIG9mIHRoaXMuZml4dHVyZVBvb2wpIHtcbiAgICAgIGlmIChpbmRleCA9PT0gZml4dHVyZS5kbXhGaXJzdENoYW5uZWwpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY2hhbm5lbE9jY3VwaWVkRW5kKGluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBmb3IgKGNvbnN0IGZpeHR1cmUgb2YgdGhpcy5maXh0dXJlUG9vbCkge1xuICAgICAgY29uc3QgbW9kZSA9IHRoaXMuZml4dHVyZVNlcnZpY2UuZ2V0TW9kZUJ5Rml4dHVyZSh0aGlzLmZpeHR1cmVTZXJ2aWNlLmdldFByb2ZpbGVCeVV1aWQoZml4dHVyZS5wcm9maWxlVXVpZCksIGZpeHR1cmUpO1xuXG4gICAgICBpZiAoaW5kZXggPT09IGZpeHR1cmUuZG14Rmlyc3RDaGFubmVsICsgbW9kZS5jaGFubmVscy5sZW5ndGggLSAxKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNoYW5uZWxPdmVybGFwcGVkKGluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBsZXQgb2NjdXBpZWRGaXh0dXJlOiBGaXh0dXJlO1xuXG4gICAgZm9yIChjb25zdCBmaXh0dXJlIG9mIHRoaXMuZml4dHVyZVBvb2wpIHtcbiAgICAgIGNvbnN0IG1vZGUgPSB0aGlzLmZpeHR1cmVTZXJ2aWNlLmdldE1vZGVCeUZpeHR1cmUodGhpcy5maXh0dXJlU2VydmljZS5nZXRQcm9maWxlQnlVdWlkKGZpeHR1cmUucHJvZmlsZVV1aWQpLCBmaXh0dXJlKTtcblxuICAgICAgaWYgKGluZGV4ID49IGZpeHR1cmUuZG14Rmlyc3RDaGFubmVsICYmIGluZGV4IDwgZml4dHVyZS5kbXhGaXJzdENoYW5uZWwgKyBtb2RlLmNoYW5uZWxzLmxlbmd0aCkge1xuICAgICAgICBpZiAob2NjdXBpZWRGaXh0dXJlKSB7XG4gICAgICAgICAgaWYgKG9jY3VwaWVkRml4dHVyZS5kbXhGaXJzdENoYW5uZWwgIT09IGZpeHR1cmUuZG14Rmlyc3RDaGFubmVsIHx8IG9jY3VwaWVkRml4dHVyZS5tb2RlU2hvcnROYW1lICE9PSBmaXh0dXJlLm1vZGVTaG9ydE5hbWUpIHtcbiAgICAgICAgICAgIC8vIGZpeHR1cmVzIGFyZSBhbGxvd2VkIHRvIG92ZXJsYXAsIGlmIHRoZXkgc3RhcnQgYXQgdGhlIHNhbWUgY2hhbm5lbCBhbmRcbiAgICAgICAgICAgIC8vIHVzZSB0aGUgc2FtZSBtb2RlLiBvdGhlcndpc2UgaXQncyBub3QgYWxsb3dlZC5cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvY2N1cGllZEZpeHR1cmUgPSBmaXh0dXJlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY2hhbm5lbE1vdXNlRG93bihldmVudDogYW55KSB7XG4gICAgLy8gc3RhcnQgZHJhZ2dpbmdcbiAgICBjb25zdCBzZWxlY3RlZEluZGV4ID0gZXZlbnQudGFyZ2V0LmRhdGFzZXQuaW5kZXg7XG4gICAgbGV0IG5ld1NlbGVjdGVkRml4dHVyZTogRml4dHVyZTtcblxuICAgIC8vIGZpbmQgYSBkcmFnZ2luZyBmaXh0dXJlIGFuZCBzZWxlY3QgaXQsIGJ1dCBkb24ndCBjaGFuZ2UgdGhlIHNlbGVjdGlvbiwgaWYgdGhlXG4gICAgLy8gY3VycmVudGx5IHNlbGVjdGVkIGZpeHR1cmUgbWlnaHQgYWxzbyBiZSBzZWxlY3RlZCAob24gb3ZlcmxhcHBlZCBmaXh0dXJlcylcbiAgICBmb3IgKGNvbnN0IGZpeHR1cmUgb2YgdGhpcy5maXh0dXJlUG9vbCkge1xuICAgICAgY29uc3QgbW9kZSA9IHRoaXMuZml4dHVyZVNlcnZpY2UuZ2V0TW9kZUJ5Rml4dHVyZSh0aGlzLmZpeHR1cmVTZXJ2aWNlLmdldFByb2ZpbGVCeVV1aWQoZml4dHVyZS5wcm9maWxlVXVpZCksIGZpeHR1cmUpO1xuXG4gICAgICBpZiAoc2VsZWN0ZWRJbmRleCA+PSBmaXh0dXJlLmRteEZpcnN0Q2hhbm5lbCAmJiBzZWxlY3RlZEluZGV4IDw9IGZpeHR1cmUuZG14Rmlyc3RDaGFubmVsICsgbW9kZS5jaGFubmVscy5sZW5ndGggLSAxKSB7XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGVkRml4dHVyZSA9PT0gZml4dHVyZSkge1xuICAgICAgICAgIG5ld1NlbGVjdGVkRml4dHVyZSA9IGZpeHR1cmU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIW5ld1NlbGVjdGVkRml4dHVyZSkge1xuICAgICAgICAgIG5ld1NlbGVjdGVkRml4dHVyZSA9IGZpeHR1cmU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobmV3U2VsZWN0ZWRGaXh0dXJlKSB7XG4gICAgICBpZiAobmV3U2VsZWN0ZWRGaXh0dXJlICE9PSB0aGlzLnNlbGVjdGVkRml4dHVyZSkge1xuICAgICAgICB0aGlzLnNlbGVjdEZpeHR1cmUobmV3U2VsZWN0ZWRGaXh0dXJlKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5jaGFubmVsRHJhZ0ZpeHR1cmUgPSBuZXdTZWxlY3RlZEZpeHR1cmU7XG4gICAgICB0aGlzLmNoYW5uZWxEcmFnT2Zmc2V0ID0gc2VsZWN0ZWRJbmRleCAtIG5ld1NlbGVjdGVkRml4dHVyZS5kbXhGaXJzdENoYW5uZWw7XG4gICAgfVxuICB9XG5cbiAgY2hhbm5lbFNlbGVjdGVkKGluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWRGaXh0dXJlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKGluZGV4ID49IHRoaXMuc2VsZWN0ZWRGaXh0dXJlLmRteEZpcnN0Q2hhbm5lbCkge1xuICAgICAgY29uc3QgbW9kZSA9IHRoaXMuZml4dHVyZVNlcnZpY2UuZ2V0TW9kZUJ5Rml4dHVyZShcbiAgICAgICAgdGhpcy5maXh0dXJlU2VydmljZS5nZXRQcm9maWxlQnlVdWlkKHRoaXMuc2VsZWN0ZWRGaXh0dXJlLnByb2ZpbGVVdWlkKSxcbiAgICAgICAgdGhpcy5zZWxlY3RlZEZpeHR1cmVcbiAgICAgICk7XG5cbiAgICAgIGlmIChpbmRleCA8IHRoaXMuc2VsZWN0ZWRGaXh0dXJlLmRteEZpcnN0Q2hhbm5lbCArIG1vZGUuY2hhbm5lbHMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIHJlZ2lzdGVyIG1vdXNlIHVwIGdsb2JhbGx5IChlLmcuIGFsc28gb3V0c2lkZSB0aGUgRE1YIG1hcHBpbmcpXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzptb3VzZXVwJywgWyckZXZlbnQnXSlcbiAgbW91c2VVcChldmVudDogYW55KSB7XG4gICAgLy8gZmluaXNoIGRyYWdnaW5nXG4gICAgdGhpcy5jaGFubmVsRHJhZ0ZpeHR1cmUgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5jaGFubmVsRHJhZ09mZnNldCA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGNoYW5uZWxNb3VzZU92ZXIoZXZlbnQ6IGFueSkge1xuICAgIC8vIHBlcmZvcm0gZHJhZ2dpbmdcbiAgICBjb25zdCBzZWxlY3RlZEluZGV4ID0gZXZlbnQudGFyZ2V0LmRhdGFzZXQuaW5kZXg7XG5cbiAgICBpZiAoXG4gICAgICB0aGlzLmNoYW5uZWxEcmFnRml4dHVyZSAmJlxuICAgICAgc2VsZWN0ZWRJbmRleCAtIHRoaXMuY2hhbm5lbERyYWdPZmZzZXQgPj0gMCAmJlxuICAgICAgc2VsZWN0ZWRJbmRleCAtXG4gICAgICAgIHRoaXMuY2hhbm5lbERyYWdPZmZzZXQgK1xuICAgICAgICB0aGlzLmZpeHR1cmVTZXJ2aWNlLmdldE1vZGVCeUZpeHR1cmUoXG4gICAgICAgICAgdGhpcy5maXh0dXJlU2VydmljZS5nZXRQcm9maWxlQnlVdWlkKHRoaXMuY2hhbm5lbERyYWdGaXh0dXJlLnByb2ZpbGVVdWlkKSxcbiAgICAgICAgICB0aGlzLmNoYW5uZWxEcmFnRml4dHVyZVxuICAgICAgICApLmNoYW5uZWxzLmxlbmd0aCAtXG4gICAgICAgIDEgPD1cbiAgICAgICAgNTExXG4gICAgKSB7XG4gICAgICB0aGlzLmNoYW5uZWxEcmFnRml4dHVyZS5kbXhGaXJzdENoYW5uZWwgPSBzZWxlY3RlZEluZGV4IC0gdGhpcy5jaGFubmVsRHJhZ09mZnNldDtcbiAgICB9XG4gIH1cblxuICBvaygpIHtcbiAgICAvLyBkb24ndCBhbGxvdyBPSyBpZiBvdmVybGFwcGluZyBmaXh0dXJlcyBleGlzdFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5kbXhDaGFubmVscy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMuY2hhbm5lbE92ZXJsYXBwZWQoaSkpIHtcbiAgICAgICAgY29uc3QgbXNnID0gJ2Rlc2lnbmVyLmZpeHR1cmUtcG9vbC5jaGFubmVsLW9jY3VwaWVkJztcbiAgICAgICAgY29uc3QgdGl0bGUgPSAnZGVzaWduZXIuZml4dHVyZS1wb29sLmNoYW5uZWwtb2NjdXBpZWQtdGl0bGUnO1xuXG4gICAgICAgIHRoaXMudHJhbnNsYXRlU2VydmljZS5nZXQoW21zZywgdGl0bGVdKS5zdWJzY3JpYmUoKHJlc3VsdCkgPT4ge1xuICAgICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5lcnJvcihyZXN1bHRbbXNnXSwgcmVzdWx0W3RpdGxlXSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3QuZml4dHVyZXMgPSB0aGlzLmZpeHR1cmVQb29sO1xuXG4gICAgdGhpcy5maXh0dXJlU2VydmljZS51cGRhdGVDYWNoZWRGaXh0dXJlcygpO1xuICAgIHRoaXMucHJlc2V0U2VydmljZS5yZW1vdmVEZWxldGVkRml4dHVyZXMoKTtcbiAgICB0aGlzLnByZXZpZXdTZXJ2aWNlLnVwZGF0ZUZpeHR1cmVTZXR1cCgpO1xuICAgIHRoaXMucHJlc2V0U2VydmljZS51cGRhdGVGaXh0dXJlU2VsZWN0aW9uKCk7XG4gICAgdGhpcy5wcmVzZXRTZXJ2aWNlLmZpeHR1cmVTZWxlY3Rpb25DaGFuZ2VkLm5leHQoKTtcbiAgICB0aGlzLnByZXNldFNlcnZpY2UucHJldmlld0xpdmUoKTtcblxuICAgIHRoaXMub25DbG9zZS5uZXh0KDEpO1xuICAgIHRoaXMuYnNNb2RhbFJlZi5oaWRlKCk7XG4gIH1cblxuICBjYW5jZWwoKSB7XG4gICAgdGhpcy5vbkNsb3NlLm5leHQoMik7XG4gICAgdGhpcy5ic01vZGFsUmVmLmhpZGUoKTtcbiAgfVxuXG4gIHVwZGF0ZVByb2ZpbGVzKCkge1xuICAgIHRoaXMudXBkYXRpbmdQcm9maWxlcyA9IHRydWU7XG5cbiAgICAvLyBUT0RPXG4gICAgdGhpcy5maXh0dXJlU2VydmljZVxuICAgICAgLnVwZGF0ZVByb2ZpbGVzKClcbiAgICAgIC5waXBlKFxuICAgICAgICBmaW5hbGl6ZSgoKSA9PiB7XG4gICAgICAgICAgdGhpcy51cGRhdGluZ1Byb2ZpbGVzID0gZmFsc2U7XG4gICAgICAgIH0pLFxuICAgICAgICBjYXRjaEVycm9yKCgpID0+IHtcbiAgICAgICAgICBjb25zdCBtc2cgPSAnZGVzaWduZXIuZml4dHVyZS1wb29sLnByb2ZpbGVzLXVwZGF0ZS1lcnJvcic7XG4gICAgICAgICAgY29uc3QgdGl0bGUgPSAnZGVzaWduZXIuZml4dHVyZS1wb29sLnByb2ZpbGVzLXVwZGF0ZS1lcnJvci10aXRsZSc7XG5cbiAgICAgICAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuZ2V0KFttc2csIHRpdGxlXSkuc3Vic2NyaWJlKChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5lcnJvcihyZXN1bHRbbXNnXSwgcmVzdWx0W3RpdGxlXSk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9KVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMubG9hZFByb2ZpbGVzKCk7XG5cbiAgICAgICAgY29uc3QgbXNnID0gJ2Rlc2lnbmVyLmZpeHR1cmUtcG9vbC5wcm9maWxlcy11cGRhdGVkJztcbiAgICAgICAgY29uc3QgdGl0bGUgPSAnZGVzaWduZXIuZml4dHVyZS1wb29sLnByb2ZpbGVzLXVwZGF0ZWQtdGl0bGUnO1xuXG4gICAgICAgIHRoaXMudHJhbnNsYXRlU2VydmljZS5nZXQoW21zZywgdGl0bGVdKS5zdWJzY3JpYmUoKHJlc3VsdCkgPT4ge1xuICAgICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5zdWNjZXNzKHJlc3VsdFttc2ddLCByZXN1bHRbdGl0bGVdKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIGNyZWF0ZUZpeHR1cmVGcm9tUHJvZmlsZUZpbGUoKSB7XG4gICAgY29uc3QgYnNNb2RhbFJlZiA9IHRoaXMubW9kYWxTZXJ2aWNlLnNob3coRml4dHVyZVBvb2xDcmVhdGVGcm9tRmlsZUNvbXBvbmVudCwgeyBrZXlib2FyZDogdHJ1ZSwgaWdub3JlQmFja2Ryb3BDbGljazogZmFsc2UgfSk7XG4gICAgKGJzTW9kYWxSZWYuY29udGVudCBhcyBGaXh0dXJlUG9vbENyZWF0ZUZyb21GaWxlQ29tcG9uZW50KS5vbkNsb3NlLnN1YnNjcmliZSgocHJvZmlsZTogRml4dHVyZVByb2ZpbGUpID0+IHtcbiAgICAgIGNvbnN0IG5ld0ZpeHR1cmUgPSB0aGlzLmZpeHR1cmVTZXJ2aWNlLmFkZEZpeHR1cmUocHJvZmlsZSwgdGhpcy5maXh0dXJlUG9vbCk7XG4gICAgICB0aGlzLnNlbGVjdEZpeHR1cmUobmV3Rml4dHVyZSk7XG4gICAgfSk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDprZXlkb3duLmVudGVyJywgWyckZXZlbnQnXSlcbiAgaGFuZGxlS2V5Ym9hcmRFdmVudChldmVudDogYW55KSB7XG4gICAgdGhpcy5vaygpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyXCI+XG4gIDxoNCBjbGFzcz1cIm1vZGFsLXRpdGxlIHB1bGwtbGVmdFwiPnt7ICdkZXNpZ25lci5maXh0dXJlLXBvb2wudGl0bGUnIHwgdHJhbnNsYXRlIH19PC9oND5cbiAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjbG9zZSBwdWxsLXJpZ2h0XCIgYXJpYS1sYWJlbD1cIkNsb3NlXCIgKGNsaWNrKT1cImNhbmNlbCgpOyAoZmFsc2UpXCI+XG4gICAgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCI+JnRpbWVzOzwvc3Bhbj5cbiAgPC9idXR0b24+XG48L2Rpdj5cbjxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5XCI+XG4gIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY29sLTZcIj5cbiAgICAgIDwhLS0gU2VhcmNoIGZvciBwcm9maWxlcyAtLT5cbiAgICAgIDxpbnB1dFxuICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIGlucHV0LWJsb2NrIG1iLTNcIlxuICAgICAgICBpZD1cInNlYXJjaFNldFwiXG4gICAgICAgIHBsYWNlaG9sZGVyPVwie3sgJ2Rlc2lnbmVyLmZpeHR1cmUtcG9vbC5zZWFyY2gtcHJvZmlsZXMnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgKGlucHV0KT1cInNlYXJjaEV4cHJlc3Npb24gPSAkZXZlbnQudGFyZ2V0LnZhbHVlOyBmaWx0ZXJQcm9maWxlcygpXCJcbiAgICAgIC8+XG5cbiAgICAgIDwhLS0gUHJvZmlsZXMgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiY2FyZCBib3JkZXItc2Vjb25kYXJ5IHctMTAwXCIgc3R5bGU9XCJoZWlnaHQ6IDIwMHB4XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWJvZHkgcC0wIHctMTAwXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImxpc3QtZ3JvdXAgbGlzdC1ncm91cC1mbHVzaCB3LTEwMFwiPlxuICAgICAgICAgICAgPGEgKm5nSWY9XCJsb2FkaW5nUHJvZmlsZXNcIiBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSBmbGV4LWNvbHVtbiBhbGlnbi1pdGVtcy1zdGFydCBkLWZsZXhcIj5cbiAgICAgICAgICAgICAgPHAgY2xhc3M9XCJtYi0wIG14LWF1dG9cIj5cbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXNwaW5uZXIgZmEtcHVsc2UgZmEtZndcIj48L2k+XG4gICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgIDwvYT5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbVwiICpuZ0Zvcj1cImxldCBwcm9maWxlIG9mIGZpbHRlcmVkUHJvZmlsZXMgfCBzb3J0OiAndXVpZCdcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTAgY29sLWF1dG8gbXktYXV0byBwbC0yXCI+XG4gICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cIm1iLTBcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpY29uLXt7IGZpeHR1cmVTZXJ2aWNlLmdldEZpeHR1cmVJY29uQ2xhc3MocHJvZmlsZSkgfX0gbXItMVwiPjwvc3Bhbj4ge3sgcHJvZmlsZS5tYW51ZmFjdHVyZXJOYW1lIH19IC1cbiAgICAgICAgICAgICAgICAgICAge3sgcHJvZmlsZS5uYW1lIH19XG4gICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0yIG15LWF1dG9cIj5cbiAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IGJ0bi1zbSBmbG9hdC1yaWdodFwiIGhyZWY9XCIjXCIgcm9sZT1cImJ1dHRvblwiIChjbGljayk9XCJhZGRGaXh0dXJlKHByb2ZpbGUpOyAoZmFsc2UpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtcGx1c1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXY+XG4gICAgICAgIDxwIGNsYXNzPVwiZC1pbmxpbmUtYmxvY2sgbWItMCBtdC0yXCI+XG4gICAgICAgICAgUG93ZXJlZCBieSB0aGUgPGEgaHJlZj1cImh0dHBzOi8vb3Blbi1maXh0dXJlLWxpYnJhcnkub3JnL1wiIHRhcmdldD1cIl9ibGFua1wiPk9wZW4gRml4dHVyZSBMaWJyYXJ5PC9hPlxuICAgICAgICA8L3A+XG4gICAgICAgIDxhXG4gICAgICAgICAgY2xhc3M9XCJtdC0yIGJ0biBidG4tc2Vjb25kYXJ5IGJ0bi1zbSBmbG9hdC1yaWdodFwiXG4gICAgICAgICAgaHJlZj1cImh0dHBzOi8vb3Blbi1maXh0dXJlLWxpYnJhcnkub3JnL2ZpeHR1cmUtZWRpdG9yXCJcbiAgICAgICAgICB0YXJnZXQ9XCJfYmxhbmtcIlxuICAgICAgICAgIHJvbGU9XCJidXR0b25cIlxuICAgICAgICA+XG4gICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1maWxlLW9cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+IHt7ICdkZXNpZ25lci5maXh0dXJlLXBvb2wuYWRkLXByb2ZpbGUnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgIDwvYT5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICpuZ0lmPVwiY29uZmlnU2VydmljZS5sb2NhbFByb2ZpbGVzXCJcbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBjbGFzcz1cIm1yLTIgbXQtMiBidG4gYnRuLXNlY29uZGFyeSBidG4tc20gZmxvYXQtcmlnaHRcIlxuICAgICAgICAgIChjbGljayk9XCJ1cGRhdGVQcm9maWxlcygpOyAoZmFsc2UpXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwidXBkYXRpbmdQcm9maWxlc1wiXG4gICAgICAgICAgcm9sZT1cImJ1dHRvblwiXG4gICAgICAgID5cbiAgICAgICAgICA8aSAqbmdJZj1cInVwZGF0aW5nUHJvZmlsZXNcIiBjbGFzcz1cImZhIGZhLXNwaW5uZXIgZmEtcHVsc2UgZmEtZndcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgPGkgKm5nSWY9XCIhdXBkYXRpbmdQcm9maWxlc1wiIGNsYXNzPVwiZmEgZmEtZG93bmxvYWQgZmEtZndcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAge3sgJ2Rlc2lnbmVyLmZpeHR1cmUtcG9vbC51cGRhdGUtcHJvZmlsZXMnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImNvbC02XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XG4gICAgICAgIDwhLS0gQWRkIGZpeHR1cmUgZnJvbSBsb2NhbCBwcm9maWxlIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTZcIj5cbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tc2Vjb25kYXJ5XCIgKGNsaWNrKT1cImNyZWF0ZUZpeHR1cmVGcm9tUHJvZmlsZUZpbGUoKVwiIHJvbGU9XCJidXR0b25cIj5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtcGx1c1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT4ge3sgJ2Rlc2lnbmVyLmZpeHR1cmUtcG9vbC5jcmVhdGUtZml4dHVyZS1mcm9tLXByb2ZpbGUtZmlsZScgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBVbml2ZXJzZSAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtbGctNCBjb2wtZm9ybS1sYWJlbFwiPnt7ICdkZXNpZ25lci5maXh0dXJlLXBvb2wudW5pdmVyc2UnIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbGctOFwiPlxuICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiY3VzdG9tLXNlbGVjdFwiPlxuICAgICAgICAgICAgICAgIDxvcHRpb24+VW5pdmVyc2UgMTwvb3B0aW9uPlxuICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIEZpeHR1cmVzIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImNhcmQgYm9yZGVyLXNlY29uZGFyeVwiIHN0eWxlPVwiaGVpZ2h0OiAyMzVweFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5IHAtMFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaXN0LWdyb3VwIGxpc3QtZ3JvdXAtZmx1c2hcIiBbc29ydGFibGVqc109XCJmaXh0dXJlUG9vbFwiPlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbVwiXG4gICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBmaXh0dXJlIG9mIGZpeHR1cmVQb29sXCJcbiAgICAgICAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJmaXh0dXJlID09IHNlbGVjdGVkRml4dHVyZVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RGaXh0dXJlKGZpeHR1cmUpXCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJjdXJzb3I6IHBvaW50ZXJcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1hdXRvIGxpc3Qtc29ydC1oYW5kbGUgbXktYXV0b1wiIHN0eWxlPVwiY3Vyc29yOiBtb3ZlOyBjdXJzb3I6IC13ZWJraXQtZ3JhYmJpbmdcIj5cbiAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtYmFyc1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLWF1dG8gZmxleC1ncm93IHBsLTAgbXktYXV0b1wiPlxuICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJtYi0wXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaWNvbi17eyBmaXh0dXJlU2VydmljZS5nZXRGaXh0dXJlSWNvbkNsYXNzKGZpeHR1cmVTZXJ2aWNlLmdldFByb2ZpbGVCeVV1aWQoZml4dHVyZS5wcm9maWxlVXVpZCkpIH19IG1yLTFcIj5cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuXG4gICAgICAgICAgICAgICAgICAgID57eyBmaXh0dXJlLm5hbWUgfX1cbiAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLWF1dG8gbXktYXV0b1wiPlxuICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgYnRuLXNtIGZsb2F0LXJpZ2h0XCIgaHJlZj1cIiNcIiByb2xlPVwiYnV0dG9uXCIgKGNsaWNrKT1cInJlbW92ZUZpeHR1cmUoZml4dHVyZSk7IChmYWxzZSlcIj5cbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1taW51c1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJyb3cgbXQtM1wiPlxuICAgIDxkaXYgY2xhc3M9XCJjb2xcIj5cbiAgICAgIDwhLS0gVGFiIG5hdmlnYXRpb24gLS0+XG4gICAgICA8dWwgY2xhc3M9XCJuYXYgbmF2LXRhYnMgbWItNFwiIGlkPVwibXlUYWJcIiByb2xlPVwidGFibGlzdFwiPlxuICAgICAgICA8bGkgY2xhc3M9XCJuYXYtaXRlbVwiPlxuICAgICAgICAgIDxhIGNsYXNzPVwibmF2LWxpbmsgYWN0aXZlXCIgaWQ9XCJzZXRzLXRhYlwiIGRhdGEtdG9nZ2xlPVwidGFiXCIgaHJlZj1cIiNkbXhcIiByb2xlPVwidGFiXCI+XG4gICAgICAgICAgICA8aSBjbGFzcz1cImljb24tb2xhXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPiB7eyAnZGVzaWduZXIuZml4dHVyZS1wb29sLmRteCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICA8L2E+XG4gICAgICAgIDwvbGk+XG4gICAgICAgIDxsaSBjbGFzcz1cIm5hdi1pdGVtXCI+XG4gICAgICAgICAgPGEgY2xhc3M9XCJuYXYtbGlua1wiIGlkPVwiY29tcG9zaXRpb25zLXRhYlwiIGRhdGEtdG9nZ2xlPVwidGFiXCIgaHJlZj1cIiNzZXR0aW5nc1wiIHJvbGU9XCJ0YWJcIj5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtY29nXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPiB7eyAnZGVzaWduZXIuZml4dHVyZS1wb29sLnNldHRpbmdzJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgIDwvYT5cbiAgICAgICAgPC9saT5cbiAgICAgIDwvdWw+XG5cbiAgICAgIDwhLS0gVGFiIGNvbnRlbnQgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwidGFiLWNvbnRlbnRcIiBpZD1cIm15VGFiQ29udGVudFwiPlxuICAgICAgICA8IS0tIERNWCB1bml2ZXJzZSBvdmVydmlldy0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidGFiLXBhbmUgc2hvdyBhY3RpdmVcIiBpZD1cImRteFwiIHJvbGU9XCJ0YWJwYW5lbFwiPlxuICAgICAgICAgIDwhLS0gU2hvdyBhbGwgY2hhbm5lbCBudW1iZXJzIC0tPlxuICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLWF1dG8gZmxleC1ncm93XCI+PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLWxnLTMgZC1mbGV4XCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNoZWNrIG15LWF1dG8gbWwtYXV0b1wiPlxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBjbGFzcz1cImZvcm0tY2hlY2staW5wdXRcIiBpZD1cInNob3dDaGFubmVsTnVtYmVyc1wiIFtuZ01vZGVsXT1cInNob3dDaGFubmVsTnVtYmVyc1wiXG4gICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJzaG93Q2hhbm5lbE51bWJlcnMgPSAkZXZlbnRcIj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsXCIgZm9yPVwic2hvd0NoYW5uZWxOdW1iZXJzXCI+U2hvdyBjaGFubmVsczwvbGFiZWw+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+IC0tPlxuXG4gICAgICAgICAgPCEtLSBMaXN0IG9mIERNWCBjaGFubmVscyAtLT5cbiAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgY2hhbm5lbCBvZiBkbXhDaGFubmVsczsgbGV0IGkgPSBpbmRleFwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiZG14LWNoYW5uZWxcIlxuICAgICAgICAgICAgICBbY2xhc3MuZG14LWNoYW5uZWwtb2NjdXBpZWRdPVwiY2hhbm5lbE9jY3VwaWVkKGkpXCJcbiAgICAgICAgICAgICAgW2NsYXNzLmRteC1jaGFubmVsLW9jY3VwaWVkLXN0YXJ0XT1cImNoYW5uZWxPY2N1cGllZFN0YXJ0KGkpXCJcbiAgICAgICAgICAgICAgW2NsYXNzLmRteC1jaGFubmVsLW9jY3VwaWVkLWVuZF09XCJjaGFubmVsT2NjdXBpZWRFbmQoaSlcIlxuICAgICAgICAgICAgICBbY2xhc3MuZG14LWNoYW5uZWwtc2VsZWN0ZWRdPVwiY2hhbm5lbFNlbGVjdGVkKGkpXCJcbiAgICAgICAgICAgICAgW2NsYXNzLmRteC1jaGFubmVsLW92ZXJsYXBwZWRdPVwiY2hhbm5lbE92ZXJsYXBwZWQoaSlcIlxuICAgICAgICAgICAgICAobW91c2Vkb3duKT1cImNoYW5uZWxNb3VzZURvd24oJGV2ZW50KVwiXG4gICAgICAgICAgICAgIChtb3VzZW92ZXIpPVwiY2hhbm5lbE1vdXNlT3ZlcigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgW2F0dHIuZGF0YS1pbmRleF09XCJpXCJcbiAgICAgICAgICAgICAgcG9wb3Zlcj1cInt7IGkgKyAxIH19XCJcbiAgICAgICAgICAgICAgcGxhY2VtZW50PVwidG9wXCJcbiAgICAgICAgICAgICAgdHJpZ2dlcnM9XCJtb3VzZWVudGVyOm1vdXNlbGVhdmVcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IHctMTAwIGRteC1jaGFubmVsLXRleHRcIiBbYXR0ci5kYXRhLWluZGV4XT1cImlcIiBbY2xhc3MuZG14LWNoYW5uZWwtdGV4dC12aXNpYmxlXT1cInNob3dDaGFubmVsTnVtYmVyc1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtLWF1dG9cIiBzdHlsZT1cImZvbnQtc2l6ZTogMTFweFwiIFthdHRyLmRhdGEtaW5kZXhdPVwiaVwiPjxzbWFsbCBbYXR0ci5kYXRhLWluZGV4XT1cImlcIj4mbmJzcDs8L3NtYWxsPjwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIEZpeHR1cmUgc2V0dGluZ3MgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0YWItcGFuZVwiIGlkPVwic2V0dGluZ3NcIiByb2xlPVwidGFicGFuZWxcIj5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwic2VsZWN0ZWRGaXh0dXJlICYmIHNlbGVjdGVkRml4dHVyZVByb2ZpbGVcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtbGctMyBjb2wtZm9ybS1sYWJlbFwiIGZvcj1cImZpeHR1cmVOYW1lXCI+e3sgJ2Rlc2lnbmVyLmZpeHR1cmUtcG9vbC5maXh0dXJlLW5hbWUnIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1sZy05XCI+XG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBbKG5nTW9kZWwpXT1cInNlbGVjdGVkRml4dHVyZS5uYW1lXCIgbWF4bGVuZ3RoPVwiMjAwXCIgaWQ9XCJmaXh0dXJlTmFtZVwiIC8+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtbGctMyBjb2wtZm9ybS1sYWJlbFwiPnt7ICdkZXNpZ25lci5maXh0dXJlLXBvb2wubW9kZScgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLWxnLTlcIj5cbiAgICAgICAgICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImN1c3RvbS1zZWxlY3RcIlxuICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwic2VsZWN0ZWRGaXh0dXJlLm1vZGVTaG9ydE5hbWVcIlxuICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwic2VsZWN0ZWRGaXh0dXJlLm1vZGVTaG9ydE5hbWUgPSAkZXZlbnRcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IG1vZGUgb2Ygc2VsZWN0ZWRGaXh0dXJlUHJvZmlsZS5tb2Rlc1wiIFtuZ1ZhbHVlXT1cIm1vZGUuc2hvcnROYW1lIHx8IG1vZGUubmFtZVwiPlxuICAgICAgICAgICAgICAgICAgICB7eyBtb2RlLm5hbWUgfX1cbiAgICAgICAgICAgICAgICAgICAgLSB7eyBtb2RlLmNoYW5uZWxzLmxlbmd0aCB9fVxuICAgICAgICAgICAgICAgICAgICB7eyAnZGVzaWduZXIuZml4dHVyZS1wb29sLmNoYW5uZWxzJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtbGctMyBjb2wtZm9ybS1sYWJlbFwiPnt7ICdkZXNpZ25lci5maXh0dXJlLXBvb2wuZmlyc3QtY2hhbm5lbCcgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLWxnLTlcIj5cbiAgICAgICAgICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImN1c3RvbS1zZWxlY3RcIlxuICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwic2VsZWN0ZWRGaXh0dXJlLmRteEZpcnN0Q2hhbm5lbFwiXG4gICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJzZWxlY3RlZEZpeHR1cmUuZG14Rmlyc3RDaGFubmVsID0gJGV2ZW50XCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBjaGFubmVsIG9mIGRteENoYW5uZWxzOyBsZXQgaSA9IGluZGV4XCIgW25nVmFsdWVdPVwiaVwiPlxuICAgICAgICAgICAgICAgICAgICB7eyBpICsgMSB9fVxuICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtbGctMyBjb2wtZm9ybS1sYWJlbFwiPjwvbGFiZWw+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbGctOVwiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCIgKGNsaWNrKT1cImFkZENvcHkoc2VsZWN0ZWRGaXh0dXJlKVwiPlxuICAgICAgICAgICAgICAgICAge3sgJ2Rlc2lnbmVyLmZpeHR1cmUuYWRkLWNvcHknIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG48ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyXCI+XG4gIDxhIGNsYXNzPVwibXItMyBteS1hdXRvXCIgaHJlZj1cIiNcIiByb2xlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImNhbmNlbCgpOyAoZmFsc2UpXCI+XG4gICAge3sgJ2Rlc2lnbmVyLm1pc2MuY2FuY2VsJyB8IHRyYW5zbGF0ZSB9fVxuICA8L2E+XG4gIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCIgKGNsaWNrKT1cIm9rKClcIj57eyAnZGVzaWduZXIubWlzYy5vaycgfCB0cmFuc2xhdGUgfX08L2J1dHRvbj5cbjwvZGl2PlxuIl19