@rocketshow/designer 1.32.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.
- package/esm2022/lib/array-sort-pipe.mjs +30 -0
- package/esm2022/lib/designer.component.mjs +605 -0
- package/esm2022/lib/designer.module.mjs +183 -0
- package/esm2022/lib/designer.service.mjs +14 -0
- package/esm2022/lib/effect/effect-curve/effect-curve.component.mjs +569 -0
- package/esm2022/lib/effect/effect-pan-tilt/effect-pan-tilt.component.mjs +36 -0
- package/esm2022/lib/effect/effect.component.mjs +174 -0
- package/esm2022/lib/error-dialog/error-dialog.component.mjs +75 -0
- package/esm2022/lib/fixture/fixture-capability/fixture-capability-channel/fixture-capability-channel.component.mjs +222 -0
- package/esm2022/lib/fixture/fixture-capability/fixture-capability-color/fixture-capability-color.component.mjs +147 -0
- package/esm2022/lib/fixture/fixture-capability/fixture-capability-color-wheel/fixture-capability-color-wheel.component.mjs +213 -0
- package/esm2022/lib/fixture/fixture-capability/fixture-capability-dimmer/fixture-capability-dimmer.component.mjs +78 -0
- package/esm2022/lib/fixture/fixture-capability/fixture-capability-pan-tilt/fixture-capability-pan-tilt.component.mjs +119 -0
- package/esm2022/lib/fixture/fixture-capability/fixture-capability.component.mjs +169 -0
- package/esm2022/lib/fixture/fixture-channel/fixture-channel.component.mjs +160 -0
- package/esm2022/lib/fixture/fixture-settings/fixture-settings-position/fixture-settings-position.component.mjs +365 -0
- package/esm2022/lib/fixture/fixture-settings/fixture-settings-stage/fixture-settings-stage.component.mjs +151 -0
- package/esm2022/lib/fixture/fixture-settings/fixture-settings.component.mjs +46 -0
- package/esm2022/lib/fixture/fixture.component.mjs +138 -0
- package/esm2022/lib/fixture-pool/fixture-pool-create-from-file/fixture-pool-create-from-file.component.mjs +145 -0
- package/esm2022/lib/fixture-pool/fixture-pool.component.mjs +589 -0
- package/esm2022/lib/intro/intro.component.mjs +95 -0
- package/esm2022/lib/master-dimmer/master-dimmer.component.mjs +66 -0
- package/esm2022/lib/models/cached-fixture-capability.mjs +9 -0
- package/esm2022/lib/models/cached-fixture-channel.mjs +7 -0
- package/esm2022/lib/models/cached-fixture.mjs +6 -0
- package/esm2022/lib/models/color.mjs +8 -0
- package/esm2022/lib/models/composition.mjs +46 -0
- package/esm2022/lib/models/effect-curve-profile-channel.mjs +15 -0
- package/esm2022/lib/models/effect-curve.mjs +69 -0
- package/esm2022/lib/models/effect-pan-tilt.mjs +19 -0
- package/esm2022/lib/models/effect.mjs +12 -0
- package/esm2022/lib/models/fixture-capability-value.mjs +15 -0
- package/esm2022/lib/models/fixture-capability.mjs +84 -0
- package/esm2022/lib/models/fixture-channel-value.mjs +11 -0
- package/esm2022/lib/models/fixture-channel.mjs +24 -0
- package/esm2022/lib/models/fixture-mode.mjs +14 -0
- package/esm2022/lib/models/fixture-profile.mjs +70 -0
- package/esm2022/lib/models/fixture-wheel-slot.mjs +26 -0
- package/esm2022/lib/models/fixture-wheel.mjs +15 -0
- package/esm2022/lib/models/fixture.mjs +40 -0
- package/esm2022/lib/models/preset-region-scene.mjs +8 -0
- package/esm2022/lib/models/preset.mjs +56 -0
- package/esm2022/lib/models/project.mjs +68 -0
- package/esm2022/lib/models/scene-playback-region.mjs +11 -0
- package/esm2022/lib/models/scene.mjs +27 -0
- package/esm2022/lib/models/universe.mjs +11 -0
- package/esm2022/lib/preset/preset-settings/preset-settings.component.mjs +194 -0
- package/esm2022/lib/preset/preset.component.mjs +131 -0
- package/esm2022/lib/preview/models/color-changer-3d.mjs +167 -0
- package/esm2022/lib/preview/models/fixture-3d.mjs +150 -0
- package/esm2022/lib/preview/models/moving-head-3d.mjs +243 -0
- package/esm2022/lib/preview/preview.component.mjs +212 -0
- package/esm2022/lib/project/project-browser/project-browser.component.mjs +143 -0
- package/esm2022/lib/project/project-import/project-import.component.mjs +107 -0
- package/esm2022/lib/project/project-save/project-save.component.mjs +178 -0
- package/esm2022/lib/project/project-share/project-share.component.mjs +71 -0
- package/esm2022/lib/scene/scene-settings/scene-settings.component.mjs +146 -0
- package/esm2022/lib/scene/scene.component.mjs +110 -0
- package/esm2022/lib/services/animation.service.mjs +16 -0
- package/esm2022/lib/services/config.service.mjs +27 -0
- package/esm2022/lib/services/effect.service.mjs +14 -0
- package/esm2022/lib/services/error-dialog.service.mjs +39 -0
- package/esm2022/lib/services/fixture-pool.service.mjs +30 -0
- package/esm2022/lib/services/fixture.service.mjs +431 -0
- package/esm2022/lib/services/hotkey-target-exclude.service.mjs +24 -0
- package/esm2022/lib/services/intro.service.mjs +140 -0
- package/esm2022/lib/services/preset.service.mjs +400 -0
- package/esm2022/lib/services/preview-mesh.service.mjs +57 -0
- package/esm2022/lib/services/preview.service.mjs +496 -0
- package/esm2022/lib/services/project-load.service.mjs +149 -0
- package/esm2022/lib/services/project.service.mjs +97 -0
- package/esm2022/lib/services/scene.service.mjs +164 -0
- package/esm2022/lib/services/timeline.service.mjs +726 -0
- package/esm2022/lib/services/universe.service.mjs +23 -0
- package/esm2022/lib/services/user-ensure-login.service.mjs +38 -0
- package/esm2022/lib/services/user.service.mjs +89 -0
- package/esm2022/lib/services/uuid.service.mjs +23 -0
- package/esm2022/lib/services/warning-dialog.service.mjs +38 -0
- package/esm2022/lib/timeline/composition-settings/composition-settings.component.mjs +334 -0
- package/esm2022/lib/timeline/timeline-grid/timeline-grid.component.mjs +216 -0
- package/esm2022/lib/timeline/timeline.component.mjs +418 -0
- package/esm2022/lib/user/user-login/user-login.component.mjs +144 -0
- package/esm2022/lib/user/user-register/user-register.component.mjs +220 -0
- package/esm2022/lib/wait-dialog/wait-dialog.component.mjs +26 -0
- package/esm2022/lib/warning-dialog/warning-dialog.component.mjs +68 -0
- package/esm2022/public_api.mjs +7 -0
- package/esm2022/rocketshow-designer.mjs +5 -0
- package/fesm2022/rocketshow-designer.mjs +10626 -0
- package/fesm2022/rocketshow-designer.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/array-sort-pipe.d.ts +3 -0
- package/lib/designer.component.d.ts +15 -12
- package/lib/designer.module.d.ts +54 -0
- package/lib/designer.service.d.ts +3 -0
- package/lib/effect/effect-curve/effect-curve.component.d.ts +4 -1
- package/lib/effect/effect-pan-tilt/effect-pan-tilt.component.d.ts +3 -0
- package/lib/effect/effect.component.d.ts +3 -0
- package/lib/error-dialog/error-dialog.component.d.ts +3 -0
- package/lib/fixture/fixture-capability/fixture-capability-channel/fixture-capability-channel.component.d.ts +4 -1
- package/lib/fixture/fixture-capability/fixture-capability-color/fixture-capability-color.component.d.ts +3 -0
- package/lib/fixture/fixture-capability/fixture-capability-color-wheel/fixture-capability-color-wheel.component.d.ts +5 -2
- package/lib/fixture/fixture-capability/fixture-capability-dimmer/fixture-capability-dimmer.component.d.ts +3 -0
- package/lib/fixture/fixture-capability/fixture-capability-pan-tilt/fixture-capability-pan-tilt.component.d.ts +3 -0
- package/lib/fixture/fixture-capability/fixture-capability.component.d.ts +3 -0
- package/lib/fixture/fixture-channel/fixture-channel.component.d.ts +3 -0
- package/lib/fixture/fixture-settings/fixture-settings-position/fixture-settings-position.component.d.ts +3 -0
- package/lib/fixture/fixture-settings/fixture-settings-stage/fixture-settings-stage.component.d.ts +3 -0
- package/lib/fixture/fixture-settings/fixture-settings.component.d.ts +3 -0
- package/lib/fixture/fixture.component.d.ts +3 -0
- package/lib/fixture-pool/fixture-pool-create-from-file/fixture-pool-create-from-file.component.d.ts +3 -0
- package/lib/fixture-pool/fixture-pool.component.d.ts +3 -0
- package/lib/intro/intro.component.d.ts +3 -0
- package/lib/master-dimmer/master-dimmer.component.d.ts +3 -0
- package/lib/preset/preset-settings/preset-settings.component.d.ts +3 -0
- package/lib/preset/preset.component.d.ts +3 -0
- package/lib/preview/preview.component.d.ts +4 -4
- package/lib/project/project-browser/project-browser.component.d.ts +3 -0
- package/lib/project/project-import/project-import.component.d.ts +3 -0
- package/lib/project/project-save/project-save.component.d.ts +3 -0
- package/lib/project/project-share/project-share.component.d.ts +3 -0
- package/lib/scene/scene-settings/scene-settings.component.d.ts +3 -0
- package/lib/scene/scene.component.d.ts +3 -0
- package/lib/services/animation.service.d.ts +3 -0
- package/lib/services/config.service.d.ts +3 -0
- package/lib/services/effect.service.d.ts +3 -0
- package/lib/services/error-dialog.service.d.ts +3 -0
- package/lib/services/fixture-pool.service.d.ts +3 -0
- package/lib/services/fixture.service.d.ts +3 -0
- package/lib/services/hotkey-target-exclude.service.d.ts +3 -0
- package/lib/services/intro.service.d.ts +3 -0
- package/lib/services/preset.service.d.ts +3 -0
- package/lib/services/preview-mesh.service.d.ts +3 -0
- package/lib/services/preview.service.d.ts +4 -0
- package/lib/services/project-load.service.d.ts +3 -0
- package/lib/services/project.service.d.ts +3 -0
- package/lib/services/scene.service.d.ts +3 -0
- package/lib/services/timeline.service.d.ts +4 -1
- package/lib/services/universe.service.d.ts +3 -0
- package/lib/services/user-ensure-login.service.d.ts +3 -0
- package/lib/services/user.service.d.ts +3 -0
- package/lib/services/uuid.service.d.ts +3 -0
- package/lib/services/warning-dialog.service.d.ts +3 -0
- package/lib/timeline/composition-settings/composition-settings.component.d.ts +3 -0
- package/lib/timeline/timeline-grid/timeline-grid.component.d.ts +3 -0
- package/lib/timeline/timeline.component.d.ts +3 -0
- package/lib/user/user-login/user-login.component.d.ts +3 -0
- package/lib/user/user-register/user-register.component.d.ts +3 -0
- package/lib/wait-dialog/wait-dialog.component.d.ts +3 -0
- package/lib/warning-dialog/warning-dialog.component.d.ts +3 -0
- package/package.json +20 -22
- package/rocketshow-designer-1.33.0.tgz +0 -0
- package/bundles/rocketshow-designer.umd.js +0 -9966
- package/bundles/rocketshow-designer.umd.js.map +0 -1
- package/bundles/rocketshow-designer.umd.min.js +0 -17
- package/bundles/rocketshow-designer.umd.min.js.map +0 -1
- package/esm2015/lib/array-sort-pipe.js +0 -28
- package/esm2015/lib/designer.component.js +0 -411
- package/esm2015/lib/designer.module.js +0 -117
- package/esm2015/lib/designer.service.js +0 -16
- package/esm2015/lib/effect/effect-curve/effect-curve.component.js +0 -325
- package/esm2015/lib/effect/effect-pan-tilt/effect-pan-tilt.component.js +0 -30
- package/esm2015/lib/effect/effect.component.js +0 -73
- package/esm2015/lib/error-dialog/error-dialog.component.js +0 -42
- package/esm2015/lib/fixture/fixture-capability/fixture-capability-channel/fixture-capability-channel.component.js +0 -141
- package/esm2015/lib/fixture/fixture-capability/fixture-capability-color/fixture-capability-color.component.js +0 -128
- package/esm2015/lib/fixture/fixture-capability/fixture-capability-color-wheel/fixture-capability-color-wheel.component.js +0 -163
- package/esm2015/lib/fixture/fixture-capability/fixture-capability-dimmer/fixture-capability-dimmer.component.js +0 -60
- package/esm2015/lib/fixture/fixture-capability/fixture-capability-pan-tilt/fixture-capability-pan-tilt.component.js +0 -87
- package/esm2015/lib/fixture/fixture-capability/fixture-capability.component.js +0 -97
- package/esm2015/lib/fixture/fixture-channel/fixture-channel.component.js +0 -66
- package/esm2015/lib/fixture/fixture-settings/fixture-settings-position/fixture-settings-position.component.js +0 -200
- package/esm2015/lib/fixture/fixture-settings/fixture-settings-stage/fixture-settings-stage.component.js +0 -31
- package/esm2015/lib/fixture/fixture-settings/fixture-settings.component.js +0 -35
- package/esm2015/lib/fixture/fixture.component.js +0 -70
- package/esm2015/lib/fixture-pool/fixture-pool-create-from-file/fixture-pool-create-from-file.component.js +0 -128
- package/esm2015/lib/fixture-pool/fixture-pool.component.js +0 -331
- package/esm2015/lib/intro/intro.component.js +0 -25
- package/esm2015/lib/master-dimmer/master-dimmer.component.js +0 -41
- package/esm2015/lib/models/cached-fixture-capability.js +0 -9
- package/esm2015/lib/models/cached-fixture-channel.js +0 -7
- package/esm2015/lib/models/cached-fixture.js +0 -6
- package/esm2015/lib/models/color.js +0 -8
- package/esm2015/lib/models/composition.js +0 -46
- package/esm2015/lib/models/effect-curve-profile-channel.js +0 -15
- package/esm2015/lib/models/effect-curve.js +0 -69
- package/esm2015/lib/models/effect-pan-tilt.js +0 -19
- package/esm2015/lib/models/effect.js +0 -12
- package/esm2015/lib/models/fixture-capability-value.js +0 -15
- package/esm2015/lib/models/fixture-capability.js +0 -84
- package/esm2015/lib/models/fixture-channel-value.js +0 -11
- package/esm2015/lib/models/fixture-channel.js +0 -24
- package/esm2015/lib/models/fixture-mode.js +0 -14
- package/esm2015/lib/models/fixture-profile.js +0 -70
- package/esm2015/lib/models/fixture-wheel-slot.js +0 -26
- package/esm2015/lib/models/fixture-wheel.js +0 -15
- package/esm2015/lib/models/fixture.js +0 -40
- package/esm2015/lib/models/preset-region-scene.js +0 -8
- package/esm2015/lib/models/preset.js +0 -56
- package/esm2015/lib/models/project.js +0 -68
- package/esm2015/lib/models/scene-playback-region.js +0 -11
- package/esm2015/lib/models/scene.js +0 -27
- package/esm2015/lib/models/universe.js +0 -11
- package/esm2015/lib/preset/preset-settings/preset-settings.component.js +0 -66
- package/esm2015/lib/preset/preset.component.js +0 -85
- package/esm2015/lib/preview/models/color-changer-3d.js +0 -167
- package/esm2015/lib/preview/models/fixture-3d.js +0 -150
- package/esm2015/lib/preview/models/moving-head-3d.js +0 -233
- package/esm2015/lib/preview/preview.component.js +0 -242
- package/esm2015/lib/project/project-browser/project-browser.component.js +0 -73
- package/esm2015/lib/project/project-import/project-import.component.js +0 -89
- package/esm2015/lib/project/project-save/project-save.component.js +0 -105
- package/esm2015/lib/project/project-share/project-share.component.js +0 -43
- package/esm2015/lib/scene/scene-settings/scene-settings.component.js +0 -52
- package/esm2015/lib/scene/scene.component.js +0 -56
- package/esm2015/lib/services/animation.service.js +0 -17
- package/esm2015/lib/services/config.service.js +0 -28
- package/esm2015/lib/services/effect.service.js +0 -16
- package/esm2015/lib/services/error-dialog.service.js +0 -44
- package/esm2015/lib/services/fixture-pool.service.js +0 -34
- package/esm2015/lib/services/fixture.service.js +0 -443
- package/esm2015/lib/services/hotkey-target-exclude.service.js +0 -26
- package/esm2015/lib/services/intro.service.js +0 -144
- package/esm2015/lib/services/preset.service.js +0 -416
- package/esm2015/lib/services/preview-mesh.service.js +0 -58
- package/esm2015/lib/services/preview.service.js +0 -500
- package/esm2015/lib/services/project-load.service.js +0 -171
- package/esm2015/lib/services/project.service.js +0 -113
- package/esm2015/lib/services/scene.service.js +0 -174
- package/esm2015/lib/services/timeline.service.js +0 -738
- package/esm2015/lib/services/universe.service.js +0 -24
- package/esm2015/lib/services/user-ensure-login.service.js +0 -44
- package/esm2015/lib/services/user.service.js +0 -93
- package/esm2015/lib/services/uuid.service.js +0 -25
- package/esm2015/lib/services/warning-dialog.service.js +0 -43
- package/esm2015/lib/timeline/composition-settings/composition-settings.component.js +0 -197
- package/esm2015/lib/timeline/timeline-grid/timeline-grid.component.js +0 -55
- package/esm2015/lib/timeline/timeline.component.js +0 -239
- package/esm2015/lib/user/user-login/user-login.component.js +0 -64
- package/esm2015/lib/user/user-register/user-register.component.js +0 -89
- package/esm2015/lib/wait-dialog/wait-dialog.component.js +0 -16
- package/esm2015/lib/warning-dialog/warning-dialog.component.js +0 -42
- package/esm2015/public_api.js +0 -7
- package/esm2015/rocketshow-designer.js +0 -61
- package/esm5/lib/array-sort-pipe.js +0 -31
- package/esm5/lib/designer.component.js +0 -468
- package/esm5/lib/designer.module.js +0 -120
- package/esm5/lib/designer.service.js +0 -17
- package/esm5/lib/effect/effect-curve/effect-curve.component.js +0 -386
- package/esm5/lib/effect/effect-pan-tilt/effect-pan-tilt.component.js +0 -31
- package/esm5/lib/effect/effect.component.js +0 -75
- package/esm5/lib/error-dialog/error-dialog.component.js +0 -43
- package/esm5/lib/fixture/fixture-capability/fixture-capability-channel/fixture-capability-channel.component.js +0 -159
- package/esm5/lib/fixture/fixture-capability/fixture-capability-color/fixture-capability-color.component.js +0 -130
- package/esm5/lib/fixture/fixture-capability/fixture-capability-color-wheel/fixture-capability-color-wheel.component.js +0 -215
- package/esm5/lib/fixture/fixture-capability/fixture-capability-dimmer/fixture-capability-dimmer.component.js +0 -61
- package/esm5/lib/fixture/fixture-capability/fixture-capability-pan-tilt/fixture-capability-pan-tilt.component.js +0 -88
- package/esm5/lib/fixture/fixture-capability/fixture-capability.component.js +0 -130
- package/esm5/lib/fixture/fixture-channel/fixture-channel.component.js +0 -68
- package/esm5/lib/fixture/fixture-settings/fixture-settings-position/fixture-settings-position.component.js +0 -306
- package/esm5/lib/fixture/fixture-settings/fixture-settings-stage/fixture-settings-stage.component.js +0 -32
- package/esm5/lib/fixture/fixture-settings/fixture-settings.component.js +0 -36
- package/esm5/lib/fixture/fixture.component.js +0 -71
- package/esm5/lib/fixture-pool/fixture-pool-create-from-file/fixture-pool-create-from-file.component.js +0 -127
- package/esm5/lib/fixture-pool/fixture-pool.component.js +0 -430
- package/esm5/lib/intro/intro.component.js +0 -26
- package/esm5/lib/master-dimmer/master-dimmer.component.js +0 -42
- package/esm5/lib/models/cached-fixture-capability.js +0 -11
- package/esm5/lib/models/cached-fixture-channel.js +0 -9
- package/esm5/lib/models/cached-fixture.js +0 -8
- package/esm5/lib/models/color.js +0 -10
- package/esm5/lib/models/composition.js +0 -60
- package/esm5/lib/models/effect-curve-profile-channel.js +0 -29
- package/esm5/lib/models/effect-curve.js +0 -95
- package/esm5/lib/models/effect-pan-tilt.js +0 -24
- package/esm5/lib/models/effect.js +0 -14
- package/esm5/lib/models/fixture-capability-value.js +0 -17
- package/esm5/lib/models/fixture-capability.js +0 -86
- package/esm5/lib/models/fixture-channel-value.js +0 -13
- package/esm5/lib/models/fixture-channel.js +0 -38
- package/esm5/lib/models/fixture-mode.js +0 -16
- package/esm5/lib/models/fixture-profile.js +0 -114
- package/esm5/lib/models/fixture-wheel-slot.js +0 -28
- package/esm5/lib/models/fixture-wheel.js +0 -29
- package/esm5/lib/models/fixture.js +0 -42
- package/esm5/lib/models/preset-region-scene.js +0 -10
- package/esm5/lib/models/preset.js +0 -90
- package/esm5/lib/models/project.js +0 -122
- package/esm5/lib/models/scene-playback-region.js +0 -13
- package/esm5/lib/models/scene.js +0 -29
- package/esm5/lib/models/universe.js +0 -13
- package/esm5/lib/preset/preset-settings/preset-settings.component.js +0 -67
- package/esm5/lib/preset/preset.component.js +0 -86
- package/esm5/lib/preview/models/color-changer-3d.js +0 -194
- package/esm5/lib/preview/models/fixture-3d.js +0 -196
- package/esm5/lib/preview/models/moving-head-3d.js +0 -250
- package/esm5/lib/preview/preview.component.js +0 -280
- package/esm5/lib/project/project-browser/project-browser.component.js +0 -77
- package/esm5/lib/project/project-import/project-import.component.js +0 -88
- package/esm5/lib/project/project-save/project-save.component.js +0 -120
- package/esm5/lib/project/project-share/project-share.component.js +0 -44
- package/esm5/lib/scene/scene-settings/scene-settings.component.js +0 -53
- package/esm5/lib/scene/scene.component.js +0 -57
- package/esm5/lib/services/animation.service.js +0 -18
- package/esm5/lib/services/config.service.js +0 -29
- package/esm5/lib/services/effect.service.js +0 -17
- package/esm5/lib/services/error-dialog.service.js +0 -46
- package/esm5/lib/services/fixture-pool.service.js +0 -36
- package/esm5/lib/services/fixture.service.js +0 -643
- package/esm5/lib/services/hotkey-target-exclude.service.js +0 -27
- package/esm5/lib/services/intro.service.js +0 -145
- package/esm5/lib/services/preset.service.js +0 -637
- package/esm5/lib/services/preview-mesh.service.js +0 -61
- package/esm5/lib/services/preview.service.js +0 -754
- package/esm5/lib/services/project-load.service.js +0 -185
- package/esm5/lib/services/project.service.js +0 -127
- package/esm5/lib/services/scene.service.js +0 -251
- package/esm5/lib/services/timeline.service.js +0 -845
- package/esm5/lib/services/universe.service.js +0 -36
- package/esm5/lib/services/user-ensure-login.service.js +0 -45
- package/esm5/lib/services/user.service.js +0 -95
- package/esm5/lib/services/uuid.service.js +0 -26
- package/esm5/lib/services/warning-dialog.service.js +0 -45
- package/esm5/lib/timeline/composition-settings/composition-settings.component.js +0 -206
- package/esm5/lib/timeline/timeline-grid/timeline-grid.component.js +0 -56
- package/esm5/lib/timeline/timeline.component.js +0 -243
- package/esm5/lib/user/user-login/user-login.component.js +0 -66
- package/esm5/lib/user/user-register/user-register.component.js +0 -91
- package/esm5/lib/wait-dialog/wait-dialog.component.js +0 -18
- package/esm5/lib/warning-dialog/warning-dialog.component.js +0 -43
- package/esm5/public_api.js +0 -7
- package/esm5/rocketshow-designer.js +0 -61
- package/fesm2015/rocketshow-designer.js +0 -7945
- package/fesm2015/rocketshow-designer.js.map +0 -1
- package/fesm5/rocketshow-designer.js +0 -9690
- package/fesm5/rocketshow-designer.js.map +0 -1
- package/rocketshow-designer-1.32.0.tgz +0 -0
- package/rocketshow-designer.d.ts +0 -60
- package/rocketshow-designer.metadata.json +0 -1
|
@@ -1,754 +0,0 @@
|
|
|
1
|
-
import { __decorate, __metadata, __values } from "tslib";
|
|
2
|
-
import { Injectable } from '@angular/core';
|
|
3
|
-
import { Subject } from 'rxjs';
|
|
4
|
-
import * as THREE from 'three';
|
|
5
|
-
import { EffectCurve } from '../models/effect-curve';
|
|
6
|
-
import { FixtureCapabilityType } from '../models/fixture-capability';
|
|
7
|
-
import { FixtureChannelValue } from '../models/fixture-channel-value';
|
|
8
|
-
import { PresetRegionScene } from '../models/preset-region-scene';
|
|
9
|
-
import { FixtureService } from './fixture.service';
|
|
10
|
-
import { PresetService } from './preset.service';
|
|
11
|
-
import { ProjectService } from './project.service';
|
|
12
|
-
import { SceneService } from './scene.service';
|
|
13
|
-
import { TimelineService } from './timeline.service';
|
|
14
|
-
import { UniverseService } from './universe.service';
|
|
15
|
-
import * as i0 from "@angular/core";
|
|
16
|
-
import * as i1 from "./preset.service";
|
|
17
|
-
import * as i2 from "./fixture.service";
|
|
18
|
-
import * as i3 from "./scene.service";
|
|
19
|
-
import * as i4 from "./timeline.service";
|
|
20
|
-
import * as i5 from "./universe.service";
|
|
21
|
-
import * as i6 from "./project.service";
|
|
22
|
-
var PreviewService = /** @class */ (function () {
|
|
23
|
-
function PreviewService(presetService, fixtureService, sceneService, timelineService, universeService, projectService) {
|
|
24
|
-
this.presetService = presetService;
|
|
25
|
-
this.fixtureService = fixtureService;
|
|
26
|
-
this.sceneService = sceneService;
|
|
27
|
-
this.timelineService = timelineService;
|
|
28
|
-
this.universeService = universeService;
|
|
29
|
-
this.projectService = projectService;
|
|
30
|
-
this.doUpdateFixtureSetup = new Subject();
|
|
31
|
-
this.stageMeshes = [];
|
|
32
|
-
this.stageMaterial = new THREE.MeshStandardMaterial({ color: 0x0d0d0d });
|
|
33
|
-
}
|
|
34
|
-
PreviewService.prototype.getAlreadyCalculatedFixture = function (fixtures, fixtureIndex) {
|
|
35
|
-
// Has this fixture already been calculated (same universe and dmx start address as a fixture before)
|
|
36
|
-
// --> return it
|
|
37
|
-
for (var i = 0; i < fixtureIndex; i++) {
|
|
38
|
-
var calculatedFixture = fixtures[i];
|
|
39
|
-
if (calculatedFixture.fixture.dmxUniverseUuid === fixtures[fixtureIndex].fixture.dmxUniverseUuid &&
|
|
40
|
-
calculatedFixture.fixture.dmxFirstChannel === fixtures[fixtureIndex].fixture.dmxFirstChannel) {
|
|
41
|
-
return calculatedFixture;
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
return undefined;
|
|
45
|
-
};
|
|
46
|
-
PreviewService.prototype.getPresets = function (timeMillis) {
|
|
47
|
-
var e_1, _a, e_2, _b;
|
|
48
|
-
// Get relevant presets in correct order to process with their corresponding scene, if available
|
|
49
|
-
var presets = [];
|
|
50
|
-
if (this.timelineService.playState === 'playing') {
|
|
51
|
-
// Only use active presets in current regions
|
|
52
|
-
presets = this.timelineService.getPresetsInTime(timeMillis);
|
|
53
|
-
}
|
|
54
|
-
else {
|
|
55
|
-
if (this.projectService.project.previewPreset) {
|
|
56
|
-
// Only preview the selected preset
|
|
57
|
-
if (this.presetService.selectedPreset) {
|
|
58
|
-
presets.push(new PresetRegionScene(this.presetService.selectedPreset, undefined, undefined));
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
else {
|
|
62
|
-
// Preview the selected scenes
|
|
63
|
-
for (var sceneIndex = this.projectService.project.scenes.length - 1; sceneIndex >= 0; sceneIndex--) {
|
|
64
|
-
try {
|
|
65
|
-
for (var _c = (e_1 = void 0, __values(this.sceneService.selectedScenes)), _d = _c.next(); !_d.done; _d = _c.next()) {
|
|
66
|
-
var scene = _d.value;
|
|
67
|
-
if (scene.uuid === this.projectService.project.scenes[sceneIndex].uuid) {
|
|
68
|
-
for (var presetIndex = this.projectService.project.presets.length - 1; presetIndex >= 0; presetIndex--) {
|
|
69
|
-
try {
|
|
70
|
-
for (var _e = (e_2 = void 0, __values(scene.presetUuids)), _f = _e.next(); !_f.done; _f = _e.next()) {
|
|
71
|
-
var presetUuid = _f.value;
|
|
72
|
-
// Loop over the presets in the preset service to retain the preset order
|
|
73
|
-
if (presetUuid === this.projectService.project.presets[presetIndex].uuid) {
|
|
74
|
-
presets.push(new PresetRegionScene(this.projectService.project.presets[presetIndex], undefined, scene));
|
|
75
|
-
break;
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
catch (e_2_1) { e_2 = { error: e_2_1 }; }
|
|
80
|
-
finally {
|
|
81
|
-
try {
|
|
82
|
-
if (_f && !_f.done && (_b = _e.return)) _b.call(_e);
|
|
83
|
-
}
|
|
84
|
-
finally { if (e_2) throw e_2.error; }
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
91
|
-
finally {
|
|
92
|
-
try {
|
|
93
|
-
if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
|
|
94
|
-
}
|
|
95
|
-
finally { if (e_1) throw e_1.error; }
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
return presets;
|
|
101
|
-
};
|
|
102
|
-
PreviewService.prototype.mixChannelValue = function (existingChannelValues, channelValue, intensityPercentage, defaultValue) {
|
|
103
|
-
var e_3, _a;
|
|
104
|
-
if (defaultValue === void 0) { defaultValue = 0; }
|
|
105
|
-
var newValue = channelValue.value;
|
|
106
|
-
var existingValue = defaultValue;
|
|
107
|
-
if (intensityPercentage < 1) {
|
|
108
|
-
try {
|
|
109
|
-
// We need to mix a possibly existing value (or the default value 0) with the new value (fading)
|
|
110
|
-
// Get the existant value for this property
|
|
111
|
-
for (var existingChannelValues_1 = __values(existingChannelValues), existingChannelValues_1_1 = existingChannelValues_1.next(); !existingChannelValues_1_1.done; existingChannelValues_1_1 = existingChannelValues_1.next()) {
|
|
112
|
-
var existingChannelValue = existingChannelValues_1_1.value;
|
|
113
|
-
if (existingChannelValue.channelName === channelValue.channelName &&
|
|
114
|
-
existingChannelValue.profileUuid === channelValue.profileUuid) {
|
|
115
|
-
existingValue = existingChannelValue.value;
|
|
116
|
-
break;
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
catch (e_3_1) { e_3 = { error: e_3_1 }; }
|
|
121
|
-
finally {
|
|
122
|
-
try {
|
|
123
|
-
if (existingChannelValues_1_1 && !existingChannelValues_1_1.done && (_a = existingChannelValues_1.return)) _a.call(existingChannelValues_1);
|
|
124
|
-
}
|
|
125
|
-
finally { if (e_3) throw e_3.error; }
|
|
126
|
-
}
|
|
127
|
-
// Mix the existing value with the new value
|
|
128
|
-
newValue = existingValue * (1 - intensityPercentage) + newValue * intensityPercentage;
|
|
129
|
-
}
|
|
130
|
-
// Remove the existant value, if available
|
|
131
|
-
for (var i = 0; i < existingChannelValues.length; i++) {
|
|
132
|
-
if (existingChannelValues[i].channelName === channelValue.channelName &&
|
|
133
|
-
existingChannelValues[i].profileUuid === channelValue.profileUuid) {
|
|
134
|
-
existingChannelValues.splice(i, 1);
|
|
135
|
-
break;
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
// Add the new value
|
|
139
|
-
var fixtureChannelValue = new FixtureChannelValue();
|
|
140
|
-
fixtureChannelValue.channelName = channelValue.channelName;
|
|
141
|
-
fixtureChannelValue.profileUuid = channelValue.profileUuid;
|
|
142
|
-
fixtureChannelValue.value = newValue;
|
|
143
|
-
existingChannelValues.push(fixtureChannelValue);
|
|
144
|
-
};
|
|
145
|
-
// Get the fixture index inside the passed preset (used for chasing)
|
|
146
|
-
PreviewService.prototype.getFixtureIndex = function (preset, fixtureUuid) {
|
|
147
|
-
var e_4, _a, e_5, _b;
|
|
148
|
-
var index = 0;
|
|
149
|
-
var countedDmxChannels = [];
|
|
150
|
-
try {
|
|
151
|
-
// Loop over the global fixtures to retain the order
|
|
152
|
-
for (var _c = __values(this.projectService.project.fixtures), _d = _c.next(); !_d.done; _d = _c.next()) {
|
|
153
|
-
var fixture = _d.value;
|
|
154
|
-
try {
|
|
155
|
-
for (var _e = (e_5 = void 0, __values(preset.fixtureUuids)), _f = _e.next(); !_f.done; _f = _e.next()) {
|
|
156
|
-
var presetFixtureUuid = _f.value;
|
|
157
|
-
if (presetFixtureUuid === fixture.uuid) {
|
|
158
|
-
if (fixture.uuid === fixtureUuid) {
|
|
159
|
-
return index;
|
|
160
|
-
}
|
|
161
|
-
// don't count fixtures on the same channel as already counted ones
|
|
162
|
-
if (!countedDmxChannels.includes(fixture.dmxFirstChannel)) {
|
|
163
|
-
countedDmxChannels.push(fixture.dmxFirstChannel);
|
|
164
|
-
index++;
|
|
165
|
-
}
|
|
166
|
-
break;
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
catch (e_5_1) { e_5 = { error: e_5_1 }; }
|
|
171
|
-
finally {
|
|
172
|
-
try {
|
|
173
|
-
if (_f && !_f.done && (_b = _e.return)) _b.call(_e);
|
|
174
|
-
}
|
|
175
|
-
finally { if (e_5) throw e_5.error; }
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
catch (e_4_1) { e_4 = { error: e_4_1 }; }
|
|
180
|
-
finally {
|
|
181
|
-
try {
|
|
182
|
-
if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
|
|
183
|
-
}
|
|
184
|
-
finally { if (e_4) throw e_4.error; }
|
|
185
|
-
}
|
|
186
|
-
// Not found in the preset
|
|
187
|
-
return undefined;
|
|
188
|
-
};
|
|
189
|
-
PreviewService.prototype.getPresetIntensity = function (preset, timeMillis) {
|
|
190
|
-
// When fading is in progress (on preset or scene-level), the current preset does not
|
|
191
|
-
// fully cover underlying values.
|
|
192
|
-
// -> 0 = no covering at all, 1 = fully cover (no fading)
|
|
193
|
-
var intensityPercentageScene = 1;
|
|
194
|
-
var intensityPercentagePreset = 1;
|
|
195
|
-
var intensityPercentage = 1;
|
|
196
|
-
if (preset.region && preset.scene) {
|
|
197
|
-
// Fade out is stronger than fade in (if they overlap)
|
|
198
|
-
// Take away intensity for scene fading
|
|
199
|
-
var sceneStartMillis = preset.scene.fadeInPre ? preset.region.startMillis - preset.scene.fadeInMillis : preset.region.startMillis;
|
|
200
|
-
var sceneEndMillis = preset.scene.fadeOutPost ? preset.region.endMillis + preset.scene.fadeOutMillis : preset.region.endMillis;
|
|
201
|
-
if (timeMillis > sceneEndMillis - preset.scene.fadeOutMillis && timeMillis < sceneEndMillis) {
|
|
202
|
-
// Scene fades out
|
|
203
|
-
intensityPercentageScene = (sceneEndMillis - timeMillis) / preset.scene.fadeOutMillis;
|
|
204
|
-
}
|
|
205
|
-
else if (timeMillis < sceneStartMillis + preset.scene.fadeInMillis && timeMillis > sceneStartMillis) {
|
|
206
|
-
// Scene fades in
|
|
207
|
-
intensityPercentageScene = (timeMillis - sceneStartMillis) / preset.scene.fadeInMillis;
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
if (preset.region && preset.preset) {
|
|
211
|
-
// Take away intensity for preset fading
|
|
212
|
-
var presetStartMillis = preset.preset.startMillis === undefined ? preset.region.startMillis : preset.region.startMillis + preset.preset.startMillis;
|
|
213
|
-
var presetEndMillis = preset.preset.endMillis === undefined ? preset.region.endMillis : preset.region.startMillis + preset.preset.endMillis;
|
|
214
|
-
// extend the running time, if fading is done outside the boundaries
|
|
215
|
-
presetStartMillis -= preset.preset.fadeInPre ? preset.preset.fadeInMillis : 0;
|
|
216
|
-
presetEndMillis += preset.preset.fadeOutPost ? preset.preset.fadeOutMillis : 0;
|
|
217
|
-
if (timeMillis > presetEndMillis - preset.preset.fadeOutMillis && timeMillis < presetEndMillis) {
|
|
218
|
-
// Preset fades out
|
|
219
|
-
intensityPercentagePreset = (presetEndMillis - timeMillis) / preset.preset.fadeOutMillis;
|
|
220
|
-
}
|
|
221
|
-
else if (timeMillis < presetStartMillis + preset.preset.fadeInMillis && timeMillis > presetStartMillis) {
|
|
222
|
-
// Preset fades in
|
|
223
|
-
intensityPercentagePreset = (timeMillis - presetStartMillis) / preset.preset.fadeInMillis;
|
|
224
|
-
}
|
|
225
|
-
intensityPercentage = intensityPercentageScene * intensityPercentagePreset;
|
|
226
|
-
}
|
|
227
|
-
return intensityPercentage;
|
|
228
|
-
};
|
|
229
|
-
PreviewService.prototype.mixCapabilityValues = function (preset, cachedFixture, values, intensityPercentage) {
|
|
230
|
-
var e_6, _a, e_7, _b, e_8, _c;
|
|
231
|
-
var hasColor = false;
|
|
232
|
-
try {
|
|
233
|
-
// mix the preset capability values
|
|
234
|
-
for (var _d = __values(preset.preset.fixtureCapabilityValues), _e = _d.next(); !_e.done; _e = _d.next()) {
|
|
235
|
-
var presetCapabilityValue = _e.value;
|
|
236
|
-
try {
|
|
237
|
-
for (var _f = (e_7 = void 0, __values(cachedFixture.channels)), _g = _f.next(); !_g.done; _g = _f.next()) {
|
|
238
|
-
var cachedChannel = _g.value;
|
|
239
|
-
if (cachedChannel.channel) {
|
|
240
|
-
try {
|
|
241
|
-
for (var _h = (e_8 = void 0, __values(cachedChannel.capabilities)), _j = _h.next(); !_j.done; _j = _h.next()) {
|
|
242
|
-
var channelCapability = _j.value;
|
|
243
|
-
if (this.fixtureService.capabilitiesMatch(presetCapabilityValue.type, channelCapability.capability.type, presetCapabilityValue.color, channelCapability.capability.color, presetCapabilityValue.wheel, channelCapability.wheelName, presetCapabilityValue.profileUuid, cachedFixture.profile.uuid)) {
|
|
244
|
-
// the capabilities match -> apply the value, if possible
|
|
245
|
-
if ((presetCapabilityValue.type === FixtureCapabilityType.Intensity ||
|
|
246
|
-
presetCapabilityValue.type === FixtureCapabilityType.ColorIntensity) &&
|
|
247
|
-
presetCapabilityValue.valuePercentage >= 0) {
|
|
248
|
-
// intensity and colorIntensity (dimmer and color)
|
|
249
|
-
var valuePercentage = presetCapabilityValue.valuePercentage;
|
|
250
|
-
var defaultValue = 0;
|
|
251
|
-
// brightness property
|
|
252
|
-
if (cachedChannel.capabilities.length === 1) {
|
|
253
|
-
// the only capability in this channel
|
|
254
|
-
var fixtureChannelValue = new FixtureChannelValue();
|
|
255
|
-
fixtureChannelValue.channelName = cachedChannel.name;
|
|
256
|
-
fixtureChannelValue.profileUuid = cachedFixture.profile.uuid;
|
|
257
|
-
fixtureChannelValue.value = cachedChannel.maxValue * valuePercentage;
|
|
258
|
-
this.mixChannelValue(values, fixtureChannelValue, intensityPercentage, defaultValue);
|
|
259
|
-
if (presetCapabilityValue.type === FixtureCapabilityType.ColorIntensity) {
|
|
260
|
-
hasColor = true;
|
|
261
|
-
}
|
|
262
|
-
}
|
|
263
|
-
else {
|
|
264
|
-
// more than one capability in the channel
|
|
265
|
-
if (channelCapability.capability.brightness === 'off' && valuePercentage === 0) {
|
|
266
|
-
var fixtureChannelValue = new FixtureChannelValue();
|
|
267
|
-
fixtureChannelValue.channelName = cachedChannel.name;
|
|
268
|
-
fixtureChannelValue.profileUuid = cachedFixture.profile.uuid;
|
|
269
|
-
fixtureChannelValue.value = channelCapability.centerValue;
|
|
270
|
-
this.mixChannelValue(values, fixtureChannelValue, intensityPercentage, defaultValue);
|
|
271
|
-
if (presetCapabilityValue.type === FixtureCapabilityType.ColorIntensity) {
|
|
272
|
-
hasColor = true;
|
|
273
|
-
}
|
|
274
|
-
}
|
|
275
|
-
else if ((channelCapability.capability.brightnessStart === 'dark' || channelCapability.capability.brightnessStart === 'off') &&
|
|
276
|
-
channelCapability.capability.brightnessEnd === 'bright') {
|
|
277
|
-
var value = (channelCapability.capability.dmxRange[1] - channelCapability.capability.dmxRange[0]) * valuePercentage +
|
|
278
|
-
channelCapability.capability.dmxRange[0];
|
|
279
|
-
var fixtureChannelValue = new FixtureChannelValue();
|
|
280
|
-
fixtureChannelValue.channelName = cachedChannel.name;
|
|
281
|
-
fixtureChannelValue.profileUuid = cachedFixture.profile.uuid;
|
|
282
|
-
fixtureChannelValue.value = value;
|
|
283
|
-
this.mixChannelValue(values, fixtureChannelValue, intensityPercentage, defaultValue);
|
|
284
|
-
if (presetCapabilityValue.type === FixtureCapabilityType.ColorIntensity) {
|
|
285
|
-
hasColor = true;
|
|
286
|
-
}
|
|
287
|
-
}
|
|
288
|
-
}
|
|
289
|
-
}
|
|
290
|
-
else if ((presetCapabilityValue.type === FixtureCapabilityType.Pan || presetCapabilityValue.type === FixtureCapabilityType.Tilt) &&
|
|
291
|
-
presetCapabilityValue.valuePercentage >= 0) {
|
|
292
|
-
var fixtureChannelValue = new FixtureChannelValue();
|
|
293
|
-
fixtureChannelValue.channelName = cachedChannel.name;
|
|
294
|
-
fixtureChannelValue.profileUuid = cachedFixture.profile.uuid;
|
|
295
|
-
fixtureChannelValue.value = cachedChannel.maxValue * presetCapabilityValue.valuePercentage;
|
|
296
|
-
this.mixChannelValue(values, fixtureChannelValue, 1);
|
|
297
|
-
}
|
|
298
|
-
else if (presetCapabilityValue.type === FixtureCapabilityType.WheelSlot &&
|
|
299
|
-
channelCapability.capability.slotNumber === presetCapabilityValue.slotNumber) {
|
|
300
|
-
// wheel slot (color, gobo, etc.)
|
|
301
|
-
var fixtureChannelValue = new FixtureChannelValue();
|
|
302
|
-
fixtureChannelValue.channelName = cachedChannel.name;
|
|
303
|
-
fixtureChannelValue.profileUuid = cachedFixture.profile.uuid;
|
|
304
|
-
fixtureChannelValue.value = channelCapability.centerValue;
|
|
305
|
-
this.mixChannelValue(values, fixtureChannelValue, 1);
|
|
306
|
-
// check, whether we just set a color wheel value
|
|
307
|
-
if (channelCapability.wheelIsColor) {
|
|
308
|
-
hasColor = true;
|
|
309
|
-
}
|
|
310
|
-
}
|
|
311
|
-
}
|
|
312
|
-
}
|
|
313
|
-
}
|
|
314
|
-
catch (e_8_1) { e_8 = { error: e_8_1 }; }
|
|
315
|
-
finally {
|
|
316
|
-
try {
|
|
317
|
-
if (_j && !_j.done && (_c = _h.return)) _c.call(_h);
|
|
318
|
-
}
|
|
319
|
-
finally { if (e_8) throw e_8.error; }
|
|
320
|
-
}
|
|
321
|
-
}
|
|
322
|
-
// approximate the color from a color or a different color wheel, if necessary
|
|
323
|
-
if (!hasColor && cachedChannel.colorWheel) {
|
|
324
|
-
var capability = this.presetService.getApproximatedColorWheelCapability(preset.preset, cachedChannel);
|
|
325
|
-
if (capability) {
|
|
326
|
-
// we found an approximated color in the available wheel channel
|
|
327
|
-
var fixtureChannelValue = new FixtureChannelValue();
|
|
328
|
-
fixtureChannelValue.channelName = cachedChannel.name;
|
|
329
|
-
fixtureChannelValue.profileUuid = cachedFixture.profile.uuid;
|
|
330
|
-
fixtureChannelValue.value = capability.centerValue;
|
|
331
|
-
this.mixChannelValue(values, fixtureChannelValue, 1);
|
|
332
|
-
}
|
|
333
|
-
}
|
|
334
|
-
}
|
|
335
|
-
}
|
|
336
|
-
catch (e_7_1) { e_7 = { error: e_7_1 }; }
|
|
337
|
-
finally {
|
|
338
|
-
try {
|
|
339
|
-
if (_g && !_g.done && (_b = _f.return)) _b.call(_f);
|
|
340
|
-
}
|
|
341
|
-
finally { if (e_7) throw e_7.error; }
|
|
342
|
-
}
|
|
343
|
-
}
|
|
344
|
-
}
|
|
345
|
-
catch (e_6_1) { e_6 = { error: e_6_1 }; }
|
|
346
|
-
finally {
|
|
347
|
-
try {
|
|
348
|
-
if (_e && !_e.done && (_a = _d.return)) _a.call(_d);
|
|
349
|
-
}
|
|
350
|
-
finally { if (e_6) throw e_6.error; }
|
|
351
|
-
}
|
|
352
|
-
};
|
|
353
|
-
PreviewService.prototype.mixChannelValues = function (preset, cachedFixture, values, intensityPercentage) {
|
|
354
|
-
var e_9, _a, e_10, _b;
|
|
355
|
-
try {
|
|
356
|
-
// mix the preset channel values
|
|
357
|
-
for (var _c = __values(cachedFixture.channels), _d = _c.next(); !_d.done; _d = _c.next()) {
|
|
358
|
-
var cachedChannel = _d.value;
|
|
359
|
-
if (cachedChannel.channel) {
|
|
360
|
-
try {
|
|
361
|
-
for (var _e = (e_10 = void 0, __values(preset.preset.fixtureChannelValues)), _f = _e.next(); !_f.done; _f = _e.next()) {
|
|
362
|
-
var channelValue = _f.value;
|
|
363
|
-
if (cachedFixture.profile.uuid === channelValue.profileUuid && cachedChannel.name === channelValue.channelName) {
|
|
364
|
-
this.mixChannelValue(values, channelValue, intensityPercentage);
|
|
365
|
-
}
|
|
366
|
-
}
|
|
367
|
-
}
|
|
368
|
-
catch (e_10_1) { e_10 = { error: e_10_1 }; }
|
|
369
|
-
finally {
|
|
370
|
-
try {
|
|
371
|
-
if (_f && !_f.done && (_b = _e.return)) _b.call(_e);
|
|
372
|
-
}
|
|
373
|
-
finally { if (e_10) throw e_10.error; }
|
|
374
|
-
}
|
|
375
|
-
}
|
|
376
|
-
}
|
|
377
|
-
}
|
|
378
|
-
catch (e_9_1) { e_9 = { error: e_9_1 }; }
|
|
379
|
-
finally {
|
|
380
|
-
try {
|
|
381
|
-
if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
|
|
382
|
-
}
|
|
383
|
-
finally { if (e_9) throw e_9.error; }
|
|
384
|
-
}
|
|
385
|
-
};
|
|
386
|
-
PreviewService.prototype.mixEffects = function (timeMillis, fixtureIndex, preset, cachedFixture, values, intensityPercentage) {
|
|
387
|
-
var e_11, _a, e_12, _b, e_13, _c, e_14, _d, e_15, _e, e_16, _f, e_17, _g;
|
|
388
|
-
try {
|
|
389
|
-
for (var _h = __values(preset.preset.effects), _j = _h.next(); !_j.done; _j = _h.next()) {
|
|
390
|
-
var effect = _j.value;
|
|
391
|
-
if (effect.visible) {
|
|
392
|
-
// EffectCurve
|
|
393
|
-
if (effect instanceof EffectCurve) {
|
|
394
|
-
var effectCurve = effect;
|
|
395
|
-
try {
|
|
396
|
-
// capabilities
|
|
397
|
-
for (var _k = (e_12 = void 0, __values(effectCurve.capabilities)), _l = _k.next(); !_l.done; _l = _k.next()) {
|
|
398
|
-
var capability = _l.value;
|
|
399
|
-
try {
|
|
400
|
-
for (var _m = (e_13 = void 0, __values(cachedFixture.channels)), _o = _m.next(); !_o.done; _o = _m.next()) {
|
|
401
|
-
var cachedChannel = _o.value;
|
|
402
|
-
try {
|
|
403
|
-
for (var _p = (e_14 = void 0, __values(cachedChannel.capabilities)), _q = _p.next(); !_q.done; _q = _p.next()) {
|
|
404
|
-
var channelCapability = _q.value;
|
|
405
|
-
if (this.fixtureService.capabilitiesMatch(capability.type, channelCapability.capability.type, capability.color, channelCapability.capability.color, null, null, null, null)) {
|
|
406
|
-
var fixtureChannelValue = new FixtureChannelValue();
|
|
407
|
-
fixtureChannelValue.channelName = cachedChannel.name;
|
|
408
|
-
fixtureChannelValue.profileUuid = cachedFixture.profile.uuid;
|
|
409
|
-
fixtureChannelValue.value = cachedChannel.maxValue * effectCurve.getValueAtMillis(timeMillis, fixtureIndex);
|
|
410
|
-
this.mixChannelValue(values, fixtureChannelValue, intensityPercentage);
|
|
411
|
-
}
|
|
412
|
-
}
|
|
413
|
-
}
|
|
414
|
-
catch (e_14_1) { e_14 = { error: e_14_1 }; }
|
|
415
|
-
finally {
|
|
416
|
-
try {
|
|
417
|
-
if (_q && !_q.done && (_d = _p.return)) _d.call(_p);
|
|
418
|
-
}
|
|
419
|
-
finally { if (e_14) throw e_14.error; }
|
|
420
|
-
}
|
|
421
|
-
}
|
|
422
|
-
}
|
|
423
|
-
catch (e_13_1) { e_13 = { error: e_13_1 }; }
|
|
424
|
-
finally {
|
|
425
|
-
try {
|
|
426
|
-
if (_o && !_o.done && (_c = _m.return)) _c.call(_m);
|
|
427
|
-
}
|
|
428
|
-
finally { if (e_13) throw e_13.error; }
|
|
429
|
-
}
|
|
430
|
-
}
|
|
431
|
-
}
|
|
432
|
-
catch (e_12_1) { e_12 = { error: e_12_1 }; }
|
|
433
|
-
finally {
|
|
434
|
-
try {
|
|
435
|
-
if (_l && !_l.done && (_b = _k.return)) _b.call(_k);
|
|
436
|
-
}
|
|
437
|
-
finally { if (e_12) throw e_12.error; }
|
|
438
|
-
}
|
|
439
|
-
try {
|
|
440
|
-
// channels
|
|
441
|
-
for (var _r = (e_15 = void 0, __values(effectCurve.channels)), _s = _r.next(); !_s.done; _s = _r.next()) {
|
|
442
|
-
var channelProfile = _s.value;
|
|
443
|
-
if (channelProfile.profileUuid === cachedFixture.profile.uuid) {
|
|
444
|
-
try {
|
|
445
|
-
for (var _t = (e_16 = void 0, __values(channelProfile.channels)), _u = _t.next(); !_u.done; _u = _t.next()) {
|
|
446
|
-
var channel = _u.value;
|
|
447
|
-
try {
|
|
448
|
-
for (var _v = (e_17 = void 0, __values(cachedFixture.channels)), _w = _v.next(); !_w.done; _w = _v.next()) {
|
|
449
|
-
var cachedChannel = _w.value;
|
|
450
|
-
if (cachedChannel.name === channel) {
|
|
451
|
-
var fixtureChannelValue = new FixtureChannelValue();
|
|
452
|
-
fixtureChannelValue.channelName = cachedChannel.name;
|
|
453
|
-
fixtureChannelValue.profileUuid = cachedFixture.profile.uuid;
|
|
454
|
-
fixtureChannelValue.value = cachedChannel.maxValue * effectCurve.getValueAtMillis(timeMillis, fixtureIndex);
|
|
455
|
-
this.mixChannelValue(values, fixtureChannelValue, intensityPercentage);
|
|
456
|
-
}
|
|
457
|
-
}
|
|
458
|
-
}
|
|
459
|
-
catch (e_17_1) { e_17 = { error: e_17_1 }; }
|
|
460
|
-
finally {
|
|
461
|
-
try {
|
|
462
|
-
if (_w && !_w.done && (_g = _v.return)) _g.call(_v);
|
|
463
|
-
}
|
|
464
|
-
finally { if (e_17) throw e_17.error; }
|
|
465
|
-
}
|
|
466
|
-
}
|
|
467
|
-
}
|
|
468
|
-
catch (e_16_1) { e_16 = { error: e_16_1 }; }
|
|
469
|
-
finally {
|
|
470
|
-
try {
|
|
471
|
-
if (_u && !_u.done && (_f = _t.return)) _f.call(_t);
|
|
472
|
-
}
|
|
473
|
-
finally { if (e_16) throw e_16.error; }
|
|
474
|
-
}
|
|
475
|
-
break;
|
|
476
|
-
}
|
|
477
|
-
}
|
|
478
|
-
}
|
|
479
|
-
catch (e_15_1) { e_15 = { error: e_15_1 }; }
|
|
480
|
-
finally {
|
|
481
|
-
try {
|
|
482
|
-
if (_s && !_s.done && (_e = _r.return)) _e.call(_r);
|
|
483
|
-
}
|
|
484
|
-
finally { if (e_15) throw e_15.error; }
|
|
485
|
-
}
|
|
486
|
-
}
|
|
487
|
-
// TODO other effects (PanTilt, etc.)
|
|
488
|
-
}
|
|
489
|
-
}
|
|
490
|
-
}
|
|
491
|
-
catch (e_11_1) { e_11 = { error: e_11_1 }; }
|
|
492
|
-
finally {
|
|
493
|
-
try {
|
|
494
|
-
if (_j && !_j.done && (_a = _h.return)) _a.call(_h);
|
|
495
|
-
}
|
|
496
|
-
finally { if (e_11) throw e_11.error; }
|
|
497
|
-
}
|
|
498
|
-
};
|
|
499
|
-
// return all fixture uuids with their corresponding channel values
|
|
500
|
-
PreviewService.prototype.getChannelValues = function (timeMillis, presets) {
|
|
501
|
-
var e_18, _a, e_19, _b;
|
|
502
|
-
// Loop over all relevant presets and calc the property values from the presets (capabilities and effects)
|
|
503
|
-
var calculatedFixtures = new Map();
|
|
504
|
-
for (var i = 0; i < this.fixtureService.cachedFixtures.length; i++) {
|
|
505
|
-
var cachedFixture = this.fixtureService.cachedFixtures[i];
|
|
506
|
-
// all values of the current fixture channels
|
|
507
|
-
var values = [];
|
|
508
|
-
var alreadyCalculatedFixture = this.getAlreadyCalculatedFixture(this.fixtureService.cachedFixtures, i);
|
|
509
|
-
if (alreadyCalculatedFixture) {
|
|
510
|
-
// only relevant for the preview --> reuse all calculated values
|
|
511
|
-
values = Object.assign([], calculatedFixtures.get(alreadyCalculatedFixture));
|
|
512
|
-
}
|
|
513
|
-
else {
|
|
514
|
-
try {
|
|
515
|
-
// apply the default values
|
|
516
|
-
for (var _c = (e_18 = void 0, __values(cachedFixture.channels)), _d = _c.next(); !_d.done; _d = _c.next()) {
|
|
517
|
-
var cachedChannel = _d.value;
|
|
518
|
-
if (cachedChannel.channel) {
|
|
519
|
-
if (cachedChannel.channel.defaultValue) {
|
|
520
|
-
var fixtureChannelValue = new FixtureChannelValue();
|
|
521
|
-
fixtureChannelValue.channelName = cachedChannel.name;
|
|
522
|
-
fixtureChannelValue.profileUuid = cachedFixture.profile.uuid;
|
|
523
|
-
fixtureChannelValue.value = cachedChannel.defaultValue;
|
|
524
|
-
this.mixChannelValue(values, fixtureChannelValue, 1);
|
|
525
|
-
}
|
|
526
|
-
}
|
|
527
|
-
}
|
|
528
|
-
}
|
|
529
|
-
catch (e_18_1) { e_18 = { error: e_18_1 }; }
|
|
530
|
-
finally {
|
|
531
|
-
try {
|
|
532
|
-
if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
|
|
533
|
-
}
|
|
534
|
-
finally { if (e_18) throw e_18.error; }
|
|
535
|
-
}
|
|
536
|
-
try {
|
|
537
|
-
for (var presets_1 = (e_19 = void 0, __values(presets)), presets_1_1 = presets_1.next(); !presets_1_1.done; presets_1_1 = presets_1.next()) {
|
|
538
|
-
var preset = presets_1_1.value;
|
|
539
|
-
// search for this fixture in the preset and get it's preset-specific index (for chasing effects)
|
|
540
|
-
var fixtureIndex = this.getFixtureIndex(preset.preset, cachedFixture.fixture.uuid);
|
|
541
|
-
if (fixtureIndex >= 0) {
|
|
542
|
-
// this fixture is also in the preset -> mix the required values (overwrite existing values,
|
|
543
|
-
// if set multiple times)
|
|
544
|
-
var intensityPercentage = this.getPresetIntensity(preset, timeMillis);
|
|
545
|
-
this.mixCapabilityValues(preset, cachedFixture, values, intensityPercentage);
|
|
546
|
-
this.mixChannelValues(preset, cachedFixture, values, intensityPercentage);
|
|
547
|
-
this.mixEffects(timeMillis, fixtureIndex, preset, cachedFixture, values, intensityPercentage);
|
|
548
|
-
}
|
|
549
|
-
}
|
|
550
|
-
}
|
|
551
|
-
catch (e_19_1) { e_19 = { error: e_19_1 }; }
|
|
552
|
-
finally {
|
|
553
|
-
try {
|
|
554
|
-
if (presets_1_1 && !presets_1_1.done && (_b = presets_1.return)) _b.call(presets_1);
|
|
555
|
-
}
|
|
556
|
-
finally { if (e_19) throw e_19.error; }
|
|
557
|
-
}
|
|
558
|
-
}
|
|
559
|
-
// Store the calculated values for subsequent fixtures on the same DMX address
|
|
560
|
-
calculatedFixtures.set(cachedFixture, values);
|
|
561
|
-
}
|
|
562
|
-
return calculatedFixtures;
|
|
563
|
-
};
|
|
564
|
-
PreviewService.prototype.setUniverseValues = function (fixtures, masterDimmerValue) {
|
|
565
|
-
var e_20, _a;
|
|
566
|
-
var _this = this;
|
|
567
|
-
// TODO only, if monitoring is enabled
|
|
568
|
-
return;
|
|
569
|
-
try {
|
|
570
|
-
// Reset all DMX universes
|
|
571
|
-
for (var _b = __values(this.universeService.universes), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
572
|
-
var universe = _c.value;
|
|
573
|
-
universe.channelValues = [];
|
|
574
|
-
for (var i = 0; i < 512; i++) {
|
|
575
|
-
universe.channelValues.push(0);
|
|
576
|
-
}
|
|
577
|
-
}
|
|
578
|
-
}
|
|
579
|
-
catch (e_20_1) { e_20 = { error: e_20_1 }; }
|
|
580
|
-
finally {
|
|
581
|
-
try {
|
|
582
|
-
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
|
583
|
-
}
|
|
584
|
-
finally { if (e_20) throw e_20.error; }
|
|
585
|
-
}
|
|
586
|
-
// loop over each fixture
|
|
587
|
-
fixtures.forEach(function (channelValues, cachedFixture) {
|
|
588
|
-
var e_21, _a;
|
|
589
|
-
// TODO Get the correct universe for this fixture
|
|
590
|
-
var universe = _this.universeService.getUniverseByUuid(cachedFixture.fixture.dmxUniverseUuid);
|
|
591
|
-
// loop over each channel for this fixture
|
|
592
|
-
for (var channelIndex = 0; channelIndex < cachedFixture.mode.channels.length; channelIndex++) {
|
|
593
|
-
var channelObj = cachedFixture.mode.channels[channelIndex];
|
|
594
|
-
if (typeof channelObj === 'string') {
|
|
595
|
-
var channelName = channelObj;
|
|
596
|
-
try {
|
|
597
|
-
// match this mode channel with a channel value
|
|
598
|
-
for (var channelValues_1 = (e_21 = void 0, __values(channelValues)), channelValues_1_1 = channelValues_1.next(); !channelValues_1_1.done; channelValues_1_1 = channelValues_1.next()) {
|
|
599
|
-
var channelValue = channelValues_1_1.value;
|
|
600
|
-
var channel = _this.fixtureService.getChannelByName(cachedFixture, channelName);
|
|
601
|
-
if (channel && channel.channel) {
|
|
602
|
-
var fineIndex = channel.channel.fineChannelAliases.indexOf(channelName);
|
|
603
|
-
if (channel.name === channelValue.channelName || fineIndex > -1) {
|
|
604
|
-
var universeChannel = cachedFixture.fixture.dmxFirstChannel + channelIndex;
|
|
605
|
-
var dmxValue = Math.floor(channelValue.value / Math.pow(256, channel.channel.fineChannelAliases.length - (fineIndex + 1))) % 256;
|
|
606
|
-
// TODO
|
|
607
|
-
break;
|
|
608
|
-
}
|
|
609
|
-
}
|
|
610
|
-
}
|
|
611
|
-
}
|
|
612
|
-
catch (e_21_1) { e_21 = { error: e_21_1 }; }
|
|
613
|
-
finally {
|
|
614
|
-
try {
|
|
615
|
-
if (channelValues_1_1 && !channelValues_1_1.done && (_a = channelValues_1.return)) _a.call(channelValues_1);
|
|
616
|
-
}
|
|
617
|
-
finally { if (e_21) throw e_21.error; }
|
|
618
|
-
}
|
|
619
|
-
}
|
|
620
|
-
}
|
|
621
|
-
});
|
|
622
|
-
};
|
|
623
|
-
PreviewService.prototype.fixtureIsSelected = function (uuid, presets) {
|
|
624
|
-
var e_22, _a, e_23, _b;
|
|
625
|
-
try {
|
|
626
|
-
for (var presets_2 = __values(presets), presets_2_1 = presets_2.next(); !presets_2_1.done; presets_2_1 = presets_2.next()) {
|
|
627
|
-
var preset = presets_2_1.value;
|
|
628
|
-
try {
|
|
629
|
-
for (var _c = (e_23 = void 0, __values(preset.preset.fixtureUuids)), _d = _c.next(); !_d.done; _d = _c.next()) {
|
|
630
|
-
var fixtureUuid = _d.value;
|
|
631
|
-
if (fixtureUuid === uuid) {
|
|
632
|
-
return true;
|
|
633
|
-
}
|
|
634
|
-
}
|
|
635
|
-
}
|
|
636
|
-
catch (e_23_1) { e_23 = { error: e_23_1 }; }
|
|
637
|
-
finally {
|
|
638
|
-
try {
|
|
639
|
-
if (_d && !_d.done && (_b = _c.return)) _b.call(_c);
|
|
640
|
-
}
|
|
641
|
-
finally { if (e_23) throw e_23.error; }
|
|
642
|
-
}
|
|
643
|
-
}
|
|
644
|
-
}
|
|
645
|
-
catch (e_22_1) { e_22 = { error: e_22_1 }; }
|
|
646
|
-
finally {
|
|
647
|
-
try {
|
|
648
|
-
if (presets_2_1 && !presets_2_1.done && (_a = presets_2.return)) _a.call(presets_2);
|
|
649
|
-
}
|
|
650
|
-
finally { if (e_22) throw e_22.error; }
|
|
651
|
-
}
|
|
652
|
-
return false;
|
|
653
|
-
};
|
|
654
|
-
PreviewService.prototype.updateFixtureSetup = function () {
|
|
655
|
-
this.doUpdateFixtureSetup.next();
|
|
656
|
-
};
|
|
657
|
-
PreviewService.prototype.updateStage = function () {
|
|
658
|
-
var e_24, _a;
|
|
659
|
-
if (!this.scene) {
|
|
660
|
-
return;
|
|
661
|
-
}
|
|
662
|
-
var geometry;
|
|
663
|
-
var mesh;
|
|
664
|
-
try {
|
|
665
|
-
// Remove old meshes from the scene
|
|
666
|
-
for (var _b = __values(this.stageMeshes), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
667
|
-
var existingMesh = _c.value;
|
|
668
|
-
this.scene.remove(existingMesh);
|
|
669
|
-
existingMesh.geometry.dispose();
|
|
670
|
-
}
|
|
671
|
-
}
|
|
672
|
-
catch (e_24_1) { e_24 = { error: e_24_1 }; }
|
|
673
|
-
finally {
|
|
674
|
-
try {
|
|
675
|
-
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
|
676
|
-
}
|
|
677
|
-
finally { if (e_24) throw e_24.error; }
|
|
678
|
-
}
|
|
679
|
-
this.stageMeshes = [];
|
|
680
|
-
// Floor
|
|
681
|
-
geometry = new THREE.BoxBufferGeometry(this.projectService.project.stageWidthCm, this.projectService.project.stageFloorHeightCm, this.projectService.project.stageDepthCm);
|
|
682
|
-
mesh = new THREE.Mesh(geometry.clone(), this.stageMaterial);
|
|
683
|
-
mesh.receiveShadow = false;
|
|
684
|
-
mesh.castShadow = false;
|
|
685
|
-
mesh.position.set(0, this.projectService.project.stageFloorHeightCm / 2, 0);
|
|
686
|
-
this.scene.add(mesh);
|
|
687
|
-
this.stageMeshes.push(mesh);
|
|
688
|
-
// Pillar front left
|
|
689
|
-
geometry = new THREE.BoxBufferGeometry(this.projectService.project.stagePillarWidthCm, this.projectService.project.stageHeightCm, this.projectService.project.stagePillarWidthCm);
|
|
690
|
-
mesh = new THREE.Mesh(geometry.clone(), this.stageMaterial);
|
|
691
|
-
mesh.receiveShadow = false;
|
|
692
|
-
mesh.castShadow = false;
|
|
693
|
-
mesh.position.set(-this.projectService.project.stageWidthCm / 2 + this.projectService.project.stagePillarWidthCm / 2, this.projectService.project.stageHeightCm / 2 + this.projectService.project.stageFloorHeightCm, this.projectService.project.stageDepthCm / 2 - this.projectService.project.stagePillarWidthCm / 2);
|
|
694
|
-
this.scene.add(mesh);
|
|
695
|
-
this.stageMeshes.push(mesh);
|
|
696
|
-
// Pillar front right
|
|
697
|
-
geometry = new THREE.BoxBufferGeometry(this.projectService.project.stagePillarWidthCm, this.projectService.project.stageHeightCm, this.projectService.project.stagePillarWidthCm);
|
|
698
|
-
mesh = new THREE.Mesh(geometry.clone(), this.stageMaterial);
|
|
699
|
-
mesh.receiveShadow = false;
|
|
700
|
-
mesh.castShadow = false;
|
|
701
|
-
mesh.position.set(this.projectService.project.stageWidthCm / 2 - this.projectService.project.stagePillarWidthCm / 2, this.projectService.project.stageHeightCm / 2 + this.projectService.project.stageFloorHeightCm, this.projectService.project.stageDepthCm / 2 - this.projectService.project.stagePillarWidthCm / 2);
|
|
702
|
-
this.scene.add(mesh);
|
|
703
|
-
this.stageMeshes.push(mesh);
|
|
704
|
-
// Pillar back left
|
|
705
|
-
geometry = new THREE.BoxBufferGeometry(this.projectService.project.stagePillarWidthCm, this.projectService.project.stageHeightCm, this.projectService.project.stagePillarWidthCm);
|
|
706
|
-
mesh = new THREE.Mesh(geometry.clone(), this.stageMaterial);
|
|
707
|
-
mesh.receiveShadow = false;
|
|
708
|
-
mesh.castShadow = false;
|
|
709
|
-
mesh.position.set(-this.projectService.project.stageWidthCm / 2 + this.projectService.project.stagePillarWidthCm / 2, this.projectService.project.stageHeightCm / 2 + this.projectService.project.stageFloorHeightCm, -this.projectService.project.stageDepthCm / 2 + this.projectService.project.stagePillarWidthCm / 2);
|
|
710
|
-
this.scene.add(mesh);
|
|
711
|
-
this.stageMeshes.push(mesh);
|
|
712
|
-
// Pillar back right
|
|
713
|
-
geometry = new THREE.BoxBufferGeometry(this.projectService.project.stagePillarWidthCm, this.projectService.project.stageHeightCm, this.projectService.project.stagePillarWidthCm);
|
|
714
|
-
mesh = new THREE.Mesh(geometry.clone(), this.stageMaterial);
|
|
715
|
-
mesh.receiveShadow = false;
|
|
716
|
-
mesh.castShadow = false;
|
|
717
|
-
mesh.position.set(this.projectService.project.stageWidthCm / 2 - this.projectService.project.stagePillarWidthCm / 2, this.projectService.project.stageHeightCm / 2 + this.projectService.project.stageFloorHeightCm, -this.projectService.project.stageDepthCm / 2 + this.projectService.project.stagePillarWidthCm / 2);
|
|
718
|
-
this.scene.add(mesh);
|
|
719
|
-
this.stageMeshes.push(mesh);
|
|
720
|
-
// Ceiling
|
|
721
|
-
geometry = new THREE.BoxBufferGeometry(this.projectService.project.stageWidthCm, this.projectService.project.stageCeilingHeightCm, this.projectService.project.stageDepthCm);
|
|
722
|
-
mesh = new THREE.Mesh(geometry.clone(), this.stageMaterial);
|
|
723
|
-
mesh.receiveShadow = false;
|
|
724
|
-
mesh.castShadow = false;
|
|
725
|
-
mesh.position.set(0, this.projectService.project.stageHeightCm +
|
|
726
|
-
this.projectService.project.stageCeilingHeightCm / 2 +
|
|
727
|
-
this.projectService.project.stageFloorHeightCm, 0);
|
|
728
|
-
this.scene.add(mesh);
|
|
729
|
-
this.stageMeshes.push(mesh);
|
|
730
|
-
};
|
|
731
|
-
PreviewService.ctorParameters = function () { return [
|
|
732
|
-
{ type: PresetService },
|
|
733
|
-
{ type: FixtureService },
|
|
734
|
-
{ type: SceneService },
|
|
735
|
-
{ type: TimelineService },
|
|
736
|
-
{ type: UniverseService },
|
|
737
|
-
{ type: ProjectService }
|
|
738
|
-
]; };
|
|
739
|
-
PreviewService.ɵprov = i0.ɵɵdefineInjectable({ factory: function PreviewService_Factory() { return new PreviewService(i0.ɵɵinject(i1.PresetService), i0.ɵɵinject(i2.FixtureService), i0.ɵɵinject(i3.SceneService), i0.ɵɵinject(i4.TimelineService), i0.ɵɵinject(i5.UniverseService), i0.ɵɵinject(i6.ProjectService)); }, token: PreviewService, providedIn: "root" });
|
|
740
|
-
PreviewService = __decorate([
|
|
741
|
-
Injectable({
|
|
742
|
-
providedIn: 'root',
|
|
743
|
-
}),
|
|
744
|
-
__metadata("design:paramtypes", [PresetService,
|
|
745
|
-
FixtureService,
|
|
746
|
-
SceneService,
|
|
747
|
-
TimelineService,
|
|
748
|
-
UniverseService,
|
|
749
|
-
ProjectService])
|
|
750
|
-
], PreviewService);
|
|
751
|
-
return PreviewService;
|
|
752
|
-
}());
|
|
753
|
-
export { PreviewService };
|
|
754
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJldmlldy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQHJvY2tldHNob3cvZGVzaWduZXIvIiwic291cmNlcyI6WyJsaWIvc2VydmljZXMvcHJldmlldy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxLQUFLLEtBQUssTUFBTSxPQUFPLENBQUM7QUFFL0IsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3JELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ3JFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBRXRFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBRWxFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDakQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDckQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG9CQUFvQixDQUFDOzs7Ozs7OztBQUtyRDtJQVFFLHdCQUNVLGFBQTRCLEVBQzVCLGNBQThCLEVBQzlCLFlBQTBCLEVBQzFCLGVBQWdDLEVBQ2hDLGVBQWdDLEVBQ2hDLGNBQThCO1FBTDlCLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQzVCLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM5QixpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUMxQixvQkFBZSxHQUFmLGVBQWUs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QWM7UUFIMUIsVUFBVSxDQUFDO1lBQ1YsVUFBVSxFQUFFLE1BQU07U0FDbkIsQ0FBQzt5Q0FVeUIsYUFBYTtZQUNaLGNBQWM7WUFDaEIsWUFBWTtZQUNULGVBQWU7WUFDZixlQUFlO1lBQ2hCLGNBQWM7T0FkN0IsY0FBYyxDQWluQjFCO3lCQXJvQkQ7Q0Fxb0JDLEFBam5CRCxJQWluQkM7U0FqbkJZLGNBQWMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgKiBhcyBUSFJFRSBmcm9tICd0aHJlZSc7XG5pbXBvcnQgeyBDYWNoZWRGaXh0dXJlIH0gZnJvbSAnLi4vbW9kZWxzL2NhY2hlZC1maXh0dXJlJztcbmltcG9ydCB7IEVmZmVjdEN1cnZlIH0gZnJvbSAnLi4vbW9kZWxzL2VmZmVjdC1jdXJ2ZSc7XG5pbXBvcnQgeyBGaXh0dXJlQ2FwYWJpbGl0eVR5cGUgfSBmcm9tICcuLi9tb2RlbHMvZml4dHVyZS1jYXBhYmlsaXR5JztcbmltcG9ydCB7IEZpeHR1cmVDaGFubmVsVmFsdWUgfSBmcm9tICcuLi9tb2RlbHMvZml4dHVyZS1jaGFubmVsLXZhbHVlJztcbmltcG9ydCB7IFByZXNldCB9IGZyb20gJy4uL21vZGVscy9wcmVzZXQnO1xuaW1wb3J0IHsgUHJlc2V0UmVnaW9uU2NlbmUgfSBmcm9tICcuLi9tb2RlbHMvcHJlc2V0LXJlZ2lvbi1zY2VuZSc7XG5pbXBvcnQgeyBVbml2ZXJzZSB9IGZyb20gJy4uL21vZGVscy91bml2ZXJzZSc7XG5pbXBvcnQgeyBGaXh0dXJlU2VydmljZSB9IGZyb20gJy4vZml4dHVyZS5zZXJ2aWNlJztcbmltcG9ydCB7IFByZXNldFNlcnZpY2UgfSBmcm9tICcuL3ByZXNldC5zZXJ2aWNlJztcbmltcG9ydCB7IFByb2plY3RTZXJ2aWNlIH0gZnJvbSAnLi9wcm9qZWN0LnNlcnZpY2UnO1xuaW1wb3J0IHsgU2NlbmVTZXJ2aWNlIH0gZnJvbSAnLi9zY2VuZS5zZXJ2aWNlJztcbmltcG9ydCB7IFRpbWVsaW5lU2VydmljZSB9IGZyb20gJy4vdGltZWxpbmUuc2VydmljZSc7XG5pbXBvcnQgeyBVbml2ZXJzZVNlcnZpY2UgfSBmcm9tICcuL3VuaXZlcnNlLnNlcnZpY2UnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgUHJldmlld1NlcnZpY2Uge1xuICBwdWJsaWMgZG9VcGRhdGVGaXh0dXJlU2V0dXA6IFN1YmplY3Q8dm9pZD4gPSBuZXcgU3ViamVjdCgpO1xuXG4gIHB1YmxpYyBzY2VuZTogVEhSRUUuU2NlbmU7XG5cbiAgcHJpdmF0ZSBzdGFnZU1lc2hlczogVEhSRUUuTWVzaFtdID0gW107XG4gIHByaXZhdGUgc3RhZ2VNYXRlcmlhbCA9IG5ldyBUSFJFRS5NZXNoU3RhbmRhcmRNYXRlcmlhbCh7IGNvbG9yOiAweDBkMGQwZCB9KTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHByZXNldFNlcnZpY2U6IFByZXNldFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBmaXh0dXJlU2VydmljZTogRml4dHVyZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBzY2VuZVNlcnZpY2U6IFNjZW5lU2VydmljZSxcbiAgICBwcml2YXRlIHRpbWVsaW5lU2VydmljZTogVGltZWxpbmVTZXJ2aWNlLFxuICAgIHByaXZhdGUgdW5pdmVyc2VTZXJ2aWNlOiBVbml2ZXJzZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBwcm9qZWN0U2VydmljZTogUHJvamVjdFNlcnZpY2VcbiAgKSB7fVxuXG4gIHByaXZhdGUgZ2V0QWxyZWFkeUNhbGN1bGF0ZWRGaXh0dXJlKGZpeHR1cmVzOiBDYWNoZWRGaXh0dXJlW10sIGZpeHR1cmVJbmRleDogbnVtYmVyKTogQ2FjaGVkRml4dHVyZSB7XG4gICAgLy8gSGFzIHRoaXMgZml4dHVyZSBhbHJlYWR5IGJlZW4gY2FsY3VsYXRlZCAoc2FtZSB1bml2ZXJzZSBhbmQgZG14IHN0YXJ0IGFkZHJlc3MgYXMgYSBmaXh0dXJlIGJlZm9yZSlcbiAgICAvLyAtLT4gcmV0dXJuIGl0XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaXh0dXJlSW5kZXg7IGkrKykge1xuICAgICAgY29uc3QgY2FsY3VsYXRlZEZpeHR1cmUgPSBmaXh0dXJlc1tpXTtcblxuICAgICAgaWYgKFxuICAgICAgICBjYWxjdWxhdGVkRml4dHVyZS5maXh0dXJlLmRteFVuaXZlcnNlVXVpZCA9PT0gZml4dHVyZXNbZml4dHVyZUluZGV4XS5maXh0dXJlLmRteFVuaXZlcnNlVXVpZCAmJlxuICAgICAgICBjYWxjdWxhdGVkRml4dHVyZS5maXh0dXJlLmRteEZpcnN0Q2hhbm5lbCA9PT0gZml4dHVyZXNbZml4dHVyZUluZGV4XS5maXh0dXJlLmRteEZpcnN0Q2hhbm5lbFxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBjYWxjdWxhdGVkRml4dHVyZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIGdldFByZXNldHModGltZU1pbGxpczogbnVtYmVyKTogUHJlc2V0UmVnaW9uU2NlbmVbXSB7XG4gICAgLy8gR2V0IHJlbGV2YW50IHByZXNldHMgaW4gY29ycmVjdCBvcmRlciB0byBwcm9jZXNzIHdpdGggdGhlaXIgY29ycmVzcG9uZGluZyBzY2VuZSwgaWYgYXZhaWxhYmxlXG4gICAgbGV0IHByZXNldHM6IFByZXNldFJlZ2lvblNjZW5lW10gPSBbXTtcblxuICAgIGlmICh0aGlzLnRpbWVsaW5lU2VydmljZS5wbGF5U3RhdGUgPT09ICdwbGF5aW5nJykge1xuICAgICAgLy8gT25seSB1c2UgYWN0aXZlIHByZXNldHMgaW4gY3VycmVudCByZWdpb25zXG4gICAgICBwcmVzZXRzID0gdGhpcy50aW1lbGluZVNlcnZpY2UuZ2V0UHJlc2V0c0luVGltZSh0aW1lTWlsbGlzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5wcmV2aWV3UHJlc2V0KSB7XG4gICAgICAgIC8vIE9ubHkgcHJldmlldyB0aGUgc2VsZWN0ZWQgcHJlc2V0XG4gICAgICAgIGlmICh0aGlzLnByZXNldFNlcnZpY2Uuc2VsZWN0ZWRQcmVzZXQpIHtcbiAgICAgICAgICBwcmVzZXRzLnB1c2gobmV3IFByZXNldFJlZ2lvblNjZW5lKHRoaXMucHJlc2V0U2VydmljZS5zZWxlY3RlZFByZXNldCwgdW5kZWZpbmVkLCB1bmRlZmluZWQpKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gUHJldmlldyB0aGUgc2VsZWN0ZWQgc2NlbmVzXG4gICAgICAgIGZvciAobGV0IHNjZW5lSW5kZXggPSB0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3Quc2NlbmVzLmxlbmd0aCAtIDE7IHNjZW5lSW5kZXggPj0gMDsgc2NlbmVJbmRleC0tKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBzY2VuZSBvZiB0aGlzLnNjZW5lU2VydmljZS5zZWxlY3RlZFNjZW5lcykge1xuICAgICAgICAgICAgaWYgKHNjZW5lLnV1aWQgPT09IHRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5zY2VuZXNbc2NlbmVJbmRleF0udXVpZCkge1xuICAgICAgICAgICAgICBmb3IgKGxldCBwcmVzZXRJbmRleCA9IHRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5wcmVzZXRzLmxlbmd0aCAtIDE7IHByZXNldEluZGV4ID49IDA7IHByZXNldEluZGV4LS0pIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHByZXNldFV1aWQgb2Ygc2NlbmUucHJlc2V0VXVpZHMpIHtcbiAgICAgICAgICAgICAgICAgIC8vIExvb3Agb3ZlciB0aGUgcHJlc2V0cyBpbiB0aGUgcHJlc2V0IHNlcnZpY2UgdG8gcmV0YWluIHRoZSBwcmVzZXQgb3JkZXJcbiAgICAgICAgICAgICAgICAgIGlmIChwcmVzZXRVdWlkID09PSB0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3QucHJlc2V0c1twcmVzZXRJbmRleF0udXVpZCkge1xuICAgICAgICAgICAgICAgICAgICBwcmVzZXRzLnB1c2gobmV3IFByZXNldFJlZ2lvblNjZW5lKHRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5wcmVzZXRzW3ByZXNldEluZGV4XSwgdW5kZWZpbmVkLCBzY2VuZSkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcHJlc2V0cztcbiAgfVxuXG4gIHByaXZhdGUgbWl4Q2hhbm5lbFZhbHVlKFxuICAgIGV4aXN0aW5nQ2hhbm5lbFZhbHVlczogRml4dHVyZUNoYW5uZWxWYWx1ZVtdLFxuICAgIGNoYW5uZWxWYWx1ZTogRml4dHVyZUNoYW5uZWxWYWx1ZSxcbiAgICBpbnRlbnNpdHlQZXJjZW50YWdlOiBudW1iZXIsXG4gICAgZGVmYXVsdFZhbHVlOiBudW1iZXIgPSAwXG4gICkge1xuICAgIGxldCBuZXdWYWx1ZTogbnVtYmVyID0gY2hhbm5lbFZhbHVlLnZhbHVlO1xuICAgIGxldCBleGlzdGluZ1ZhbHVlOiBudW1iZXIgPSBkZWZhdWx0VmFsdWU7XG5cbiAgICBpZiAoaW50ZW5zaXR5UGVyY2VudGFnZSA8IDEpIHtcbiAgICAgIC8vIFdlIG5lZWQgdG8gbWl4IGEgcG9zc2libHkgZXhpc3RpbmcgdmFsdWUgKG9yIHRoZSBkZWZhdWx0IHZhbHVlIDApIHdpdGggdGhlIG5ldyB2YWx1ZSAoZmFkaW5nKVxuXG4gICAgICAvLyBHZXQgdGhlIGV4aXN0YW50IHZhbHVlIGZvciB0aGlzIHByb3BlcnR5XG4gICAgICBmb3IgKGNvbnN0IGV4aXN0aW5nQ2hhbm5lbFZhbHVlIG9mIGV4aXN0aW5nQ2hhbm5lbFZhbHVlcykge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgZXhpc3RpbmdDaGFubmVsVmFsdWUuY2hhbm5lbE5hbWUgPT09IGNoYW5uZWxWYWx1ZS5jaGFubmVsTmFtZSAmJlxuICAgICAgICAgIGV4aXN0aW5nQ2hhbm5lbFZhbHVlLnByb2ZpbGVVdWlkID09PSBjaGFubmVsVmFsdWUucHJvZmlsZVV1aWRcbiAgICAgICAgKSB7XG4gICAgICAgICAgZXhpc3RpbmdWYWx1ZSA9IGV4aXN0aW5nQ2hhbm5lbFZhbHVlLnZhbHVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIE1peCB0aGUgZXhpc3RpbmcgdmFsdWUgd2l0aCB0aGUgbmV3IHZhbHVlXG4gICAgICBuZXdWYWx1ZSA9IGV4aXN0aW5nVmFsdWUgKiAoMSAtIGludGVuc2l0eVBlcmNlbnRhZ2UpICsgbmV3VmFsdWUgKiBpbnRlbnNpdHlQZXJjZW50YWdlO1xuICAgIH1cblxuICAgIC8vIFJlbW92ZSB0aGUgZXhpc3RhbnQgdmFsdWUsIGlmIGF2YWlsYWJsZVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXhpc3RpbmdDaGFubmVsVmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoXG4gICAgICAgIGV4aXN0aW5nQ2hhbm5lbFZhbHVlc1tpXS5jaGFubmVsTmFtZSA9PT0gY2hhbm5lbFZhbHVlLmNoYW5uZWxOYW1lICYmXG4gICAgICAgIGV4aXN0aW5nQ2hhbm5lbFZhbHVlc1tpXS5wcm9maWxlVXVpZCA9PT0gY2hhbm5lbFZhbHVlLnByb2ZpbGVVdWlkXG4gICAgICApIHtcbiAgICAgICAgZXhpc3RpbmdDaGFubmVsVmFsdWVzLnNwbGljZShpLCAxKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQWRkIHRoZSBuZXcgdmFsdWVcbiAgICBjb25zdCBmaXh0dXJlQ2hhbm5lbFZhbHVlID0gbmV3IEZpeHR1cmVDaGFubmVsVmFsdWUoKTtcbiAgICBmaXh0dXJlQ2hhbm5lbFZhbHVlLmNoYW5uZWxOYW1lID0gY2hhbm5lbFZhbHVlLmNoYW5uZWxOYW1lO1xuICAgIGZpeHR1cmVDaGFubmVsVmFsdWUucHJvZmlsZVV1aWQgPSBjaGFubmVsVmFsdWUucHJvZmlsZVV1aWQ7XG4gICAgZml4dHVyZUNoYW5uZWxWYWx1ZS52YWx1ZSA9IG5ld1ZhbHVlO1xuICAgIGV4aXN0aW5nQ2hhbm5lbFZhbHVlcy5wdXNoKGZpeHR1cmVDaGFubmVsVmFsdWUpO1xuICB9XG5cbiAgLy8gR2V0IHRoZSBmaXh0dXJlIGluZGV4IGluc2lkZSB0aGUgcGFzc2VkIHByZXNldCAodXNlZCBmb3IgY2hhc2luZylcbiAgcHJpdmF0ZSBnZXRGaXh0dXJlSW5kZXgocHJlc2V0OiBQcmVzZXQsIGZpeHR1cmVVdWlkOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIGxldCBpbmRleCA9IDA7XG4gICAgY29uc3QgY291bnRlZERteENoYW5uZWxzOiBudW1iZXJbXSA9IFtdO1xuXG4gICAgLy8gTG9vcCBvdmVyIHRoZSBnbG9iYWwgZml4dHVyZXMgdG8gcmV0YWluIHRoZSBvcmRlclxuICAgIGZvciAoY29uc3QgZml4dHVyZSBvZiB0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3QuZml4dHVyZXMpIHtcbiAgICAgIGZvciAoY29uc3QgcHJlc2V0Rml4dHVyZVV1aWQgb2YgcHJlc2V0LmZpeHR1cmVVdWlkcykge1xuICAgICAgICBpZiAocHJlc2V0Rml4dHVyZVV1aWQgPT09IGZpeHR1cmUudXVpZCkge1xuICAgICAgICAgIGlmIChmaXh0dXJlLnV1aWQgPT09IGZpeHR1cmVVdWlkKSB7XG4gICAgICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gZG9uJ3QgY291bnQgZml4dHVyZXMgb24gdGhlIHNhbWUgY2hhbm5lbCBhcyBhbHJlYWR5IGNvdW50ZWQgb25lc1xuICAgICAgICAgIGlmICghY291bnRlZERteENoYW5uZWxzLmluY2x1ZGVzKGZpeHR1cmUuZG14Rmlyc3RDaGFubmVsKSkge1xuICAgICAgICAgICAgY291bnRlZERteENoYW5uZWxzLnB1c2goZml4dHVyZS5kbXhGaXJzdENoYW5uZWwpO1xuICAgICAgICAgICAgaW5kZXgrKztcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBOb3QgZm91bmQgaW4gdGhlIHByZXNldFxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIGdldFByZXNldEludGVuc2l0eShwcmVzZXQ6IFByZXNldFJlZ2lvblNjZW5lLCB0aW1lTWlsbGlzOiBudW1iZXIpOiBudW1iZXIge1xuICAgIC8vIFdoZW4gZmFkaW5nIGlzIGluIHByb2dyZXNzIChvbiBwcmVzZXQgb3Igc2NlbmUtbGV2ZWwpLCB0aGUgY3VycmVudCBwcmVzZXQgZG9lcyBub3RcbiAgICAvLyBmdWxseSBjb3ZlciB1bmRlcmx5aW5nIHZhbHVlcy5cbiAgICAvLyAtPiAwID0gbm8gY292ZXJpbmcgYXQgYWxsLCAxID0gZnVsbHkgY292ZXIgKG5vIGZhZGluZylcbiAgICBsZXQgaW50ZW5zaXR5UGVyY2VudGFnZVNjZW5lID0gMTtcbiAgICBsZXQgaW50ZW5zaXR5UGVyY2VudGFnZVByZXNldCA9IDE7XG4gICAgbGV0IGludGVuc2l0eVBlcmNlbnRhZ2UgPSAxO1xuXG4gICAgaWYgKHByZXNldC5yZWdpb24gJiYgcHJlc2V0LnNjZW5lKSB7XG4gICAgICAvLyBGYWRlIG91dCBpcyBzdHJvbmdlciB0aGFuIGZhZGUgaW4gKGlmIHRoZXkgb3ZlcmxhcClcblxuICAgICAgLy8gVGFrZSBhd2F5IGludGVuc2l0eSBmb3Igc2NlbmUgZmFkaW5nXG4gICAgICBjb25zdCBzY2VuZVN0YXJ0TWlsbGlzID0gcHJlc2V0LnNjZW5lLmZhZGVJblByZSA/IHByZXNldC5yZWdpb24uc3RhcnRNaWxsaXMgLSBwcmVzZXQuc2NlbmUuZmFkZUluTWlsbGlzIDogcHJlc2V0LnJlZ2lvbi5zdGFydE1pbGxpcztcbiAgICAgIGNvbnN0IHNjZW5lRW5kTWlsbGlzID0gcHJlc2V0LnNjZW5lLmZhZGVPdXRQb3N0ID8gcHJlc2V0LnJlZ2lvbi5lbmRNaWxsaXMgKyBwcmVzZXQuc2NlbmUuZmFkZU91dE1pbGxpcyA6IHByZXNldC5yZWdpb24uZW5kTWlsbGlzO1xuXG4gICAgICBpZiAodGltZU1pbGxpcyA+IHNjZW5lRW5kTWlsbGlzIC0gcHJlc2V0LnNjZW5lLmZhZGVPdXRNaWxsaXMgJiYgdGltZU1pbGxpcyA8IHNjZW5lRW5kTWlsbGlzKSB7XG4gICAgICAgIC8vIFNjZW5lIGZhZGVzIG91dFxuICAgICAgICBpbnRlbnNpdHlQZXJjZW50YWdlU2NlbmUgPSAoc2NlbmVFbmRNaWxsaXMgLSB0aW1lTWlsbGlzKSAvIHByZXNldC5zY2VuZS5mYWRlT3V0TWlsbGlzO1xuICAgICAgfSBlbHNlIGlmICh0aW1lTWlsbGlzIDwgc2NlbmVTdGFydE1pbGxpcyArIHByZXNldC5zY2VuZS5mYWRlSW5NaWxsaXMgJiYgdGltZU1pbGxpcyA+IHNjZW5lU3RhcnRNaWxsaXMpIHtcbiAgICAgICAgLy8gU2NlbmUgZmFkZXMgaW5cbiAgICAgICAgaW50ZW5zaXR5UGVyY2VudGFnZVNjZW5lID0gKHRpbWVNaWxsaXMgLSBzY2VuZVN0YXJ0TWlsbGlzKSAvIHByZXNldC5zY2VuZS5mYWRlSW5NaWxsaXM7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHByZXNldC5yZWdpb24gJiYgcHJlc2V0LnByZXNldCkge1xuICAgICAgLy8gVGFrZSBhd2F5IGludGVuc2l0eSBmb3IgcHJlc2V0IGZhZGluZ1xuICAgICAgbGV0IHByZXNldFN0YXJ0TWlsbGlzID1cbiAgICAgICAgcHJlc2V0LnByZXNldC5zdGFydE1pbGxpcyA9PT0gdW5kZWZpbmVkID8gcHJlc2V0LnJlZ2lvbi5zdGFydE1pbGxpcyA6IHByZXNldC5yZWdpb24uc3RhcnRNaWxsaXMgKyBwcmVzZXQucHJlc2V0LnN0YXJ0TWlsbGlzO1xuXG4gICAgICBsZXQgcHJlc2V0RW5kTWlsbGlzID1cbiAgICAgICAgcHJlc2V0LnByZXNldC5lbmRNaWxsaXMgPT09IHVuZGVmaW5lZCA/IHByZXNldC5yZWdpb24uZW5kTWlsbGlzIDogcHJlc2V0LnJlZ2lvbi5zdGFydE1pbGxpcyArIHByZXNldC5wcmVzZXQuZW5kTWlsbGlzO1xuXG4gICAgICAvLyBleHRlbmQgdGhlIHJ1bm5pbmcgdGltZSwgaWYgZmFkaW5nIGlzIGRvbmUgb3V0c2lkZSB0aGUgYm91bmRhcmllc1xuICAgICAgcHJlc2V0U3RhcnRNaWxsaXMgLT0gcHJlc2V0LnByZXNldC5mYWRlSW5QcmUgPyBwcmVzZXQucHJlc2V0LmZhZGVJbk1pbGxpcyA6IDA7XG4gICAgICBwcmVzZXRFbmRNaWxsaXMgKz0gcHJlc2V0LnByZXNldC5mYWRlT3V0UG9zdCA/IHByZXNldC5wcmVzZXQuZmFkZU91dE1pbGxpcyA6IDA7XG5cbiAgICAgIGlmICh0aW1lTWlsbGlzID4gcHJlc2V0RW5kTWlsbGlzIC0gcHJlc2V0LnByZXNldC5mYWRlT3V0TWlsbGlzICYmIHRpbWVNaWxsaXMgPCBwcmVzZXRFbmRNaWxsaXMpIHtcbiAgICAgICAgLy8gUHJlc2V0IGZhZGVzIG91dFxuICAgICAgICBpbnRlbnNpdHlQZXJjZW50YWdlUHJlc2V0ID0gKHByZXNldEVuZE1pbGxpcyAtIHRpbWVNaWxsaXMpIC8gcHJlc2V0LnByZXNldC5mYWRlT3V0TWlsbGlzO1xuICAgICAgfSBlbHNlIGlmICh0aW1lTWlsbGlzIDwgcHJlc2V0U3RhcnRNaWxsaXMgKyBwcmVzZXQucHJlc2V0LmZhZGVJbk1pbGxpcyAmJiB0aW1lTWlsbGlzID4gcHJlc2V0U3RhcnRNaWxsaXMpIHtcbiAgICAgICAgLy8gUHJlc2V0IGZhZGVzIGluXG4gICAgICAgIGludGVuc2l0eVBlcmNlbnRhZ2VQcmVzZXQgPSAodGltZU1pbGxpcyAtIHByZXNldFN0YXJ0TWlsbGlzKSAvIHByZXNldC5wcmVzZXQuZmFkZUluTWlsbGlzO1xuICAgICAgfVxuXG4gICAgICBpbnRlbnNpdHlQZXJjZW50YWdlID0gaW50ZW5zaXR5UGVyY2VudGFnZVNjZW5lICogaW50ZW5zaXR5UGVyY2VudGFnZVByZXNldDtcbiAgICB9XG5cbiAgICByZXR1cm4gaW50ZW5zaXR5UGVyY2VudGFnZTtcbiAgfVxuXG4gIHByaXZhdGUgbWl4Q2FwYWJpbGl0eVZhbHVlcyhcbiAgICBwcmVzZXQ6IFByZXNldFJlZ2lvblNjZW5lLFxuICAgIGNhY2hlZEZpeHR1cmU6IENhY2hlZEZpeHR1cmUsXG4gICAgdmFsdWVzOiBGaXh0dXJlQ2hhbm5lbFZhbHVlW10sXG4gICAgaW50ZW5zaXR5UGVyY2VudGFnZTogbnVtYmVyXG4gICkge1xuICAgIGxldCBoYXNDb2xvciA9IGZhbHNlO1xuXG4gICAgLy8gbWl4IHRoZSBwcmVzZXQgY2FwYWJpbGl0eSB2YWx1ZXNcbiAgICBmb3IgKGNvbnN0IHByZXNldENhcGFiaWxpdHlWYWx1ZSBvZiBwcmVzZXQucHJlc2V0LmZpeHR1cmVDYXBhYmlsaXR5VmFsdWVzKSB7XG4gICAgICBmb3IgKGNvbnN0IGNhY2hlZENoYW5uZWwgb2YgY2FjaGVkRml4dHVyZS5jaGFubmVscykge1xuICAgICAgICBpZiAoY2FjaGVkQ2hhbm5lbC5jaGFubmVsKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBjaGFubmVsQ2FwYWJpbGl0eSBvZiBjYWNoZWRDaGFubmVsLmNhcGFiaWxpdGllcykge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICB0aGlzLmZpeHR1cmVTZXJ2aWNlLmNhcGFiaWxpdGllc01hdGNoKFxuICAgICAgICAgICAgICAgIHByZXNldENhcGFiaWxpdHlWYWx1ZS50eXBlLFxuICAgICAgICAgICAgICAgIGNoYW5uZWxDYXBhYmlsaXR5LmNhcGFiaWxpdHkudHlwZSxcbiAgICAgICAgICAgICAgICBwcmVzZXRDYXBhYmlsaXR5VmFsdWUuY29sb3IsXG4gICAgICAgICAgICAgICAgY2hhbm5lbENhcGFiaWxpdHkuY2FwYWJpbGl0eS5jb2xvcixcbiAgICAgICAgICAgICAgICBwcmVzZXRDYXBhYmlsaXR5VmFsdWUud2hlZWwsXG4gICAgICAgICAgICAgICAgY2hhbm5lbENhcGFiaWxpdHkud2hlZWxOYW1lLFxuICAgICAgICAgICAgICAgIHByZXNldENhcGFiaWxpdHlWYWx1ZS5wcm9maWxlVXVpZCxcbiAgICAgICAgICAgICAgICBjYWNoZWRGaXh0dXJlLnByb2ZpbGUudXVpZFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgLy8gdGhlIGNhcGFiaWxpdGllcyBtYXRjaCAtPiBhcHBseSB0aGUgdmFsdWUsIGlmIHBvc3NpYmxlXG4gICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAocHJlc2V0Q2FwYWJpbGl0eVZhbHVlLnR5cGUgPT09IEZpeHR1cmVDYXBhYmlsaXR5VHlwZS5JbnRlbnNpdHkgfHxcbiAgICAgICAgICAgICAgICAgIHByZXNldENhcGFiaWxpdHlWYWx1ZS50eXBlID09PSBGaXh0dXJlQ2FwYWJpbGl0eVR5cGUuQ29sb3JJbnRlbnNpdHkpICYmXG4gICAgICAgICAgICAgICAgcHJlc2V0Q2FwYWJpbGl0eVZhbHVlLnZhbHVlUGVyY2VudGFnZSA+PSAwXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIC8vIGludGVuc2l0eSBhbmQgY29sb3JJbnRlbnNpdHkgKGRpbW1lciBhbmQgY29sb3IpXG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWVQZXJjZW50YWdlID0gcHJlc2V0Q2FwYWJpbGl0eVZhbHVlLnZhbHVlUGVyY2VudGFnZTtcbiAgICAgICAgICAgICAgICBjb25zdCBkZWZhdWx0VmFsdWUgPSAwO1xuXG4gICAgICAgICAgICAgICAgLy8gYnJpZ2h0bmVzcyBwcm9wZXJ0eVxuICAgICAgICAgICAgICAgIGlmIChjYWNoZWRDaGFubmVsLmNhcGFiaWxpdGllcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgIC8vIHRoZSBvbmx5IGNhcGFiaWxpdHkgaW4gdGhpcyBjaGFubmVsXG4gICAgICAgICAgICAgICAgICBjb25zdCBmaXh0dXJlQ2hhbm5lbFZhbHVlID0gbmV3IEZpeHR1cmVDaGFubmVsVmFsdWUoKTtcbiAgICAgICAgICAgICAgICAgIGZpeHR1cmVDaGFubmVsVmFsdWUuY2hhbm5lbE5hbWUgPSBjYWNoZWRDaGFubmVsLm5hbWU7XG4gICAgICAgICAgICAgICAgICBmaXh0dXJlQ2hhbm5lbFZhbHVlLnByb2ZpbGVVdWlkID0gY2FjaGVkRml4dHVyZS5wcm9maWxlLnV1aWQ7XG4gICAgICAgICAgICAgICAgICBmaXh0dXJlQ2hhbm5lbFZhbHVlLnZhbHVlID0gY2FjaGVkQ2hhbm5lbC5tYXhWYWx1ZSAqIHZhbHVlUGVyY2VudGFnZTtcbiAgICAgICAgICAgICAgICAgIHRoaXMubWl4Q2hhbm5lbFZhbHVlKHZhbHVlcywgZml4dHVyZUNoYW5uZWxWYWx1ZSwgaW50ZW5zaXR5UGVyY2VudGFnZSwgZGVmYXVsdFZhbHVlKTtcblxuICAgICAgICAgICAgICAgICAgaWYgKHByZXNldENhcGFiaWxpdHlWYWx1ZS50eXBlID09PSBGaXh0dXJlQ2FwYWJpbGl0eVR5cGUuQ29sb3JJbnRlbnNpdHkpIHtcbiAgICAgICAgICAgICAgICAgICAgaGFzQ29sb3IgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAvLyBtb3JlIHRoYW4gb25lIGNhcGFiaWxpdHkgaW4gdGhlIGNoYW5uZWxcbiAgICAgICAgICAgICAgICAgIGlmIChjaGFubmVsQ2FwYWJpbGl0eS5jYXBhYmlsaXR5LmJyaWdodG5lc3MgPT09ICdvZmYnICYmIHZhbHVlUGVyY2VudGFnZSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmaXh0dXJlQ2hhbm5lbFZhbHVlID0gbmV3IEZpeHR1cmVDaGFubmVsVmFsdWUoKTtcbiAgICAgICAgICAgICAgICAgICAgZml4dHVyZUNoYW5uZWxWYWx1ZS5jaGFubmVsTmFtZSA9IGNhY2hlZENoYW5uZWwubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgZml4dHVyZUNoYW5uZWxWYWx1ZS5wcm9maWxlVXVpZCA9IGNhY2hlZEZpeHR1cmUucHJvZmlsZS51dWlkO1xuICAgICAgICAgICAgICAgICAgICBmaXh0dXJlQ2hhbm5lbFZhbHVlLnZhbHVlID0gY2hhbm5lbENhcGFiaWxpdHkuY2VudGVyVmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWl4Q2hhbm5lbFZhbHVlKHZhbHVlcywgZml4dHVyZUNoYW5uZWxWYWx1ZSwgaW50ZW5zaXR5UGVyY2VudGFnZSwgZGVmYXVsdFZhbHVlKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAocHJlc2V0Q2FwYWJpbGl0eVZhbHVlLnR5cGUgPT09IEZpeHR1cmVDYXBhYmlsaXR5VHlwZS5Db2xvckludGVuc2l0eSkge1xuICAgICAgICAgICAgICAgICAgICAgIGhhc0NvbG9yID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAgICAgKGNoYW5uZWxDYXBhYmlsaXR5LmNhcGFiaWxpdHkuYnJpZ2h0bmVzc1N0YXJ0ID09PSAnZGFyaycgfHwgY2hhbm5lbENhcGFiaWxpdHkuY2FwYWJpbGl0eS5icmlnaHRuZXNzU3RhcnQgPT09ICdvZmYnKSAmJlxuICAgICAgICAgICAgICAgICAgICBjaGFubmVsQ2FwYWJpbGl0eS5jYXBhYmlsaXR5LmJyaWdodG5lc3NFbmQgPT09ICdicmlnaHQnXG4gICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPVxuICAgICAgICAgICAgICAgICAgICAgIChjaGFubmVsQ2FwYWJpbGl0eS5jYXBhYmlsaXR5LmRteFJhbmdlWzFdIC0gY2hhbm5lbENhcGFiaWxpdHkuY2FwYWJpbGl0eS5kbXhSYW5nZVswXSkgKiB2YWx1ZVBlcmNlbnRhZ2UgK1xuICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxDYXBhYmlsaXR5LmNhcGFiaWxpdHkuZG14UmFuZ2VbMF07XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZml4dHVyZUNoYW5uZWxWYWx1ZSA9IG5ldyBGaXh0dXJlQ2hhbm5lbFZhbHVlKCk7XG4gICAgICAgICAgICAgICAgICAgIGZpeHR1cmVDaGFubmVsVmFsdWUuY2hhbm5lbE5hbWUgPSBjYWNoZWRDaGFubmVsLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgIGZpeHR1cmVDaGFubmVsVmFsdWUucHJvZmlsZVV1aWQgPSBjYWNoZWRGaXh0dXJlLnByb2ZpbGUudXVpZDtcbiAgICAgICAgICAgICAgICAgICAgZml4dHVyZUNoYW5uZWxWYWx1ZS52YWx1ZSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1peENoYW5uZWxWYWx1ZSh2YWx1ZXMsIGZpeHR1cmVDaGFubmVsVmFsdWUsIGludGVuc2l0eVBlcmNlbnRhZ2UsIGRlZmF1bHRWYWx1ZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHByZXNldENhcGFiaWxpdHlWYWx1ZS50eXBlID09PSBGaXh0dXJlQ2FwYWJpbGl0eVR5cGUuQ29sb3JJbnRlbnNpdHkpIHtcbiAgICAgICAgICAgICAgICAgICAgICBoYXNDb2xvciA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgKHByZXNldENhcGFiaWxpdHlWYWx1ZS50eXBlID09PSBGaXh0dXJlQ2FwYWJpbGl0eVR5cGUuUGFuIHx8IHByZXNldENhcGFiaWxpdHlWYWx1ZS50eXBlID09PSBGaXh0dXJlQ2FwYWJpbGl0eVR5cGUuVGlsdCkgJiZcbiAgICAgICAgICAgICAgICBwcmVzZXRDYXBhYmlsaXR5VmFsdWUudmFsdWVQZXJjZW50YWdlID49IDBcbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZml4dHVyZUNoYW5uZWxWYWx1ZSA9IG5ldyBGaXh0dXJlQ2hhbm5lbFZhbHVlKCk7XG4gICAgICAgICAgICAgICAgZml4dHVyZUNoYW5uZWxWYWx1ZS5jaGFubmVsTmFtZSA9IGNhY2hlZENoYW5uZWwubmFtZTtcbiAgICAgICAgICAgICAgICBmaXh0dXJlQ2hhbm5lbFZhbHVlLnByb2ZpbGVVdWlkID0gY2FjaGVkRml4dHVyZS5wcm9maWxlLnV1aWQ7XG4gICAgICAgICAgICAgICAgZml4dHVyZUNoYW5uZWxWYWx1ZS52YWx1ZSA9IGNhY2hlZENoYW5uZWwubWF4VmFsdWUgKiBwcmVzZXRDYXBhYmlsaXR5VmFsdWUudmFsdWVQZXJjZW50YWdlO1xuICAgICAgICAgICAgICAgIHRoaXMubWl4Q2hhbm5lbFZhbHVlKHZhbHVlcywgZml4dHVyZUNoYW5uZWxWYWx1ZSwgMSk7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgcHJlc2V0Q2FwYWJpbGl0eVZhbHVlLnR5cGUgPT09IEZpeHR1cmVDYXBhYmlsaXR5VHlwZS5XaGVlbFNsb3QgJiZcbiAgICAgICAgICAgICAgICBjaGFubmVsQ2FwYWJpbGl0eS5jYXBhYmlsaXR5LnNsb3ROdW1iZXIgPT09IHByZXNldENhcGFiaWxpdHlWYWx1ZS5zbG90TnVtYmVyXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIC8vIHdoZWVsIHNsb3QgKGNvbG9yLCBnb2JvLCBldGMuKVxuICAgICAgICAgICAgICAgIGNvbnN0IGZpeHR1cmVDaGFubmVsVmFsdWUgPSBuZXcgRml4dHVyZUNoYW5uZWxWYWx1ZSgpO1xuICAgICAgICAgICAgICAgIGZpeHR1cmVDaGFubmVsVmFsdWUuY2hhbm5lbE5hbWUgPSBjYWNoZWRDaGFubmVsLm5hbWU7XG4gICAgICAgICAgICAgICAgZml4dHVyZUNoYW5uZWxWYWx1ZS5wcm9maWxlVXVpZCA9IGNhY2hlZEZpeHR1cmUucHJvZmlsZS51dWlkO1xuICAgICAgICAgICAgICAgIGZpeHR1cmVDaGFubmVsVmFsdWUudmFsdWUgPSBjaGFubmVsQ2FwYWJpbGl0eS5jZW50ZXJWYWx1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLm1peENoYW5uZWxWYWx1ZSh2YWx1ZXMsIGZpeHR1cmVDaGFubmVsVmFsdWUsIDEpO1xuXG4gICAgICAgICAgICAgICAgLy8gY2hlY2ssIHdoZXRoZXIgd2UganVzdCBzZXQgYSBjb2xvciB3aGVlbCB2YWx1ZVxuICAgICAgICAgICAgICAgIGlmIChjaGFubmVsQ2FwYWJpbGl0eS53aGVlbElzQ29sb3IpIHtcbiAgICAgICAgICAgICAgICAgIGhhc0NvbG9yID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBhcHByb3hpbWF0ZSB0aGUgY29sb3IgZnJvbSBhIGNvbG9yIG9yIGEgZGlmZmVyZW50IGNvbG9yIHdoZWVsLCBpZiBuZWNlc3NhcnlcbiAgICAgICAgaWYgKCFoYXNDb2xvciAmJiBjYWNoZWRDaGFubmVsLmNvbG9yV2hlZWwpIHtcbiAgICAgICAgICBjb25zdCBjYXBhYmlsaXR5ID0gdGhpcy5wcmVzZXRTZXJ2aWNlLmdldEFwcHJveGltYXRlZENvbG9yV2hlZWxDYXBhYmlsaXR5KHByZXNldC5wcmVzZXQsIGNhY2hlZENoYW5uZWwpO1xuXG4gICAgICAgICAgaWYgKGNhcGFiaWxpdHkpIHtcbiAgICAgICAgICAgIC8vIHdlIGZvdW5kIGFuIGFwcHJveGltYXRlZCBjb2xvciBpbiB0aGUgYXZhaWxhYmxlIHdoZWVsIGNoYW5uZWxcbiAgICAgICAgICAgIGNvbnN0IGZpeHR1cmVDaGFubmVsVmFsdWUgPSBuZXcgRml4dHVyZUNoYW5uZWxWYWx1ZSgpO1xuICAgICAgICAgICAgZml4dHVyZUNoYW5uZWxWYWx1ZS5jaGFubmVsTmFtZSA9IGNhY2hlZENoYW5uZWwubmFtZTtcbiAgICAgICAgICAgIGZpeHR1cmVDaGFubmVsVmFsdWUucHJvZmlsZVV1aWQgPSBjYWNoZWRGaXh0dXJlLnByb2ZpbGUudXVpZDtcbiAgICAgICAgICAgIGZpeHR1cmVDaGFubmVsVmFsdWUudmFsdWUgPSBjYXBhYmlsaXR5LmNlbnRlclZhbHVlO1xuICAgICAgICAgICAgdGhpcy5taXhDaGFubmVsVmFsdWUodmFsdWVzLCBmaXh0dXJlQ2hhbm5lbFZhbHVlLCAxKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG1peENoYW5uZWxWYWx1ZXMoXG4gICAgcHJlc2V0OiBQcmVzZXRSZWdpb25TY2VuZSxcbiAgICBjYWNoZWRGaXh0dXJlOiBDYWNoZWRGaXh0dXJlLFxuICAgIHZhbHVlczogRml4dHVyZUNoYW5uZWxWYWx1ZVtdLFxuICAgIGludGVuc2l0eVBlcmNlbnRhZ2U6IG51bWJlclxuICApIHtcbiAgICAvLyBtaXggdGhlIHByZXNldCBjaGFubmVsIHZhbHVlc1xuICAgIGZvciAoY29uc3QgY2FjaGVkQ2hhbm5lbCBvZiBjYWNoZWRGaXh0dXJlLmNoYW5uZWxzKSB7XG4gICAgICBpZiAoY2FjaGVkQ2hhbm5lbC5jaGFubmVsKSB7XG4gICAgICAgIGZvciAoY29uc3QgY2hhbm5lbFZhbHVlIG9mIHByZXNldC5wcmVzZXQuZml4dHVyZUNoYW5uZWxWYWx1ZXMpIHtcbiAgICAgICAgICBpZiAoY2FjaGVkRml4dHVyZS5wcm9maWxlLnV1aWQgPT09IGNoYW5uZWxWYWx1ZS5wcm9maWxlVXVpZCAmJiBjYWNoZWRDaGFubmVsLm5hbWUgPT09IGNoYW5uZWxWYWx1ZS5jaGFubmVsTmFtZSkge1xuICAgICAgICAgICAgdGhpcy5taXhDaGFubmVsVmFsdWUodmFsdWVzLCBjaGFubmVsVmFsdWUsIGludGVuc2l0eVBlcmNlbnRhZ2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbWl4RWZmZWN0cyhcbiAgICB0aW1lTWlsbGlzOiBudW1iZXIsXG4gICAgZml4dHVyZUluZGV4OiBudW1iZXIsXG4gICAgcHJlc2V0OiBQcmVzZXRSZWdpb25TY2VuZSxcbiAgICBjYWNoZWRGaXh0dXJlOiBDYWNoZWRGaXh0dXJlLFxuICAgIHZhbHVlczogRml4dHVyZUNoYW5uZWxWYWx1ZVtdLFxuICAgIGludGVuc2l0eVBlcmNlbnRhZ2U6IG51bWJlclxuICApIHtcbiAgICBmb3IgKGNvbnN0IGVmZmVjdCBvZiBwcmVzZXQucHJlc2V0LmVmZmVjdHMpIHtcbiAgICAgIGlmIChlZmZlY3QudmlzaWJsZSkge1xuICAgICAgICAvLyBFZmZlY3RDdXJ2ZVxuICAgICAgICBpZiAoZWZmZWN0IGluc3RhbmNlb2YgRWZmZWN0Q3VydmUpIHtcbiAgICAgICAgICBjb25zdCBlZmZlY3RDdXJ2ZSA9IGVmZmVjdCBhcyBFZmZlY3RDdXJ2ZTtcblxuICAgICAgICAgIC8vIGNhcGFiaWxpdGllc1xuICAgICAgICAgIGZvciAoY29uc3QgY2FwYWJpbGl0eSBvZiBlZmZlY3RDdXJ2ZS5jYXBhYmlsaXRpZXMpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgY2FjaGVkQ2hhbm5lbCBvZiBjYWNoZWRGaXh0dXJlLmNoYW5uZWxzKSB7XG4gICAgICAgICAgICAgIGZvciAoY29uc3QgY2hhbm5lbENhcGFiaWxpdHkgb2YgY2FjaGVkQ2hhbm5lbC5jYXBhYmlsaXRpZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICB0aGlzLmZpeHR1cmVTZXJ2aWNlLmNhcGFiaWxpdGllc01hdGNoKFxuICAgICAgICAgICAgICAgICAgICBjYXBhYmlsaXR5LnR5cGUsXG4gICAgICAgICAgICAgICAgICAgIGNoYW5uZWxDYXBhYmlsaXR5LmNhcGFiaWxpdHkudHlwZSxcbiAgICAgICAgICAgICAgICAgICAgY2FwYWJpbGl0eS5jb2xvcixcbiAgICAgICAgICAgICAgICAgICAgY2hhbm5lbENhcGFiaWxpdHkuY2FwYWJpbGl0eS5jb2xvcixcbiAgICAgICAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgbnVsbFxuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgY29uc3QgZml4dHVyZUNoYW5uZWxWYWx1ZSA9IG5ldyBGaXh0dXJlQ2hhbm5lbFZhbHVlKCk7XG4gICAgICAgICAgICAgICAgICBmaXh0dXJlQ2hhbm5lbFZhbHVlLmNoYW5uZWxOYW1lID0gY2FjaGVkQ2hhbm5lbC5uYW1lO1xuICAgICAgICAgICAgICAgICAgZml4dHVyZUNoYW5uZWxWYWx1ZS5wcm9maWxlVXVpZCA9IGNhY2hlZEZpeHR1cmUucHJvZmlsZS51dWlkO1xuICAgICAgICAgICAgICAgICAgZml4dHVyZUNoYW5uZWxWYWx1ZS52YWx1ZSA9IGNhY2hlZENoYW5uZWwubWF4VmFsdWUgKiBlZmZlY3RDdXJ2ZS5nZXRWYWx1ZUF0TWlsbGlzKHRpbWVNaWxsaXMsIGZpeHR1cmVJbmRleCk7XG4gICAgICAgICAgICAgICAgICB0aGlzLm1peENoYW5uZWxWYWx1ZSh2YWx1ZXMsIGZpeHR1cmVDaGFubmVsVmFsdWUsIGludGVuc2l0eVBlcmNlbnRhZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIGNoYW5uZWxzXG4gICAgICAgICAgZm9yIChjb25zdCBjaGFubmVsUHJvZmlsZSBvZiBlZmZlY3RDdXJ2ZS5jaGFubmVscykge1xuICAgICAgICAgICAgaWYgKGNoYW5uZWxQcm9maWxlLnByb2ZpbGVVdWlkID09PSBjYWNoZWRGaXh0dXJlLnByb2ZpbGUudXVpZCkge1xuICAgICAgICAgICAgICBmb3IgKGNvbnN0IGNoYW5uZWwgb2YgY2hhbm5lbFByb2ZpbGUuY2hhbm5lbHMpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGNhY2hlZENoYW5uZWwgb2YgY2FjaGVkRml4dHVyZS5jaGFubmVscykge1xuICAgICAgICAgICAgICAgICAgaWYgKGNhY2hlZENoYW5uZWwubmFtZSA9PT0gY2hhbm5lbCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmaXh0dXJlQ2hhbm5lbFZhbHVlID0gbmV3IEZpeHR1cmVDaGFubmVsVmFsdWUoKTtcbiAgICAgICAgICAgICAgICAgICAgZml4dHVyZUNoYW5uZWxWYWx1ZS5jaGFubmVsTmFtZSA9IGNhY2hlZENoYW5uZWwubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgZml4dHVyZUNoYW5uZWxWYWx1ZS5wcm9maWxlVXVpZCA9IGNhY2hlZEZpeHR1cmUucHJvZmlsZS51dWlkO1xuICAgICAgICAgICAgICAgICAgICBmaXh0dXJlQ2hhbm5lbFZhbHVlLnZhbHVlID0gY2FjaGVkQ2hhbm5lbC5tYXhWYWx1ZSAqIGVmZmVjdEN1cnZlLmdldFZhbHVlQXRNaWxsaXModGltZU1pbGxpcywgZml4dHVyZUluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5taXhDaGFubmVsVmFsdWUodmFsdWVzLCBmaXh0dXJlQ2hhbm5lbFZhbHVlLCBpbnRlbnNpdHlQZXJjZW50YWdlKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUT0RPIG90aGVyIGVmZmVjdHMgKFBhblRpbHQsIGV0Yy4pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gcmV0dXJuIGFsbCBmaXh0dXJlIHV1aWRzIHdpdGggdGhlaXIgY29ycmVzcG9uZGluZyBjaGFubmVsIHZhbHVlc1xuICBwdWJsaWMgZ2V0Q2hhbm5lbFZhbHVlcyh0aW1lTWlsbGlzOiBudW1iZXIsIHByZXNldHM6IFByZXNldFJlZ2lvblNjZW5lW10pOiBNYXA8Q2FjaGVkRml4dHVyZSwgRml4dHVyZUNoYW5uZWxWYWx1ZVtdPiB7XG4gICAgLy8gTG9vcCBvdmVyIGFsbCByZWxldmFudCBwcmVzZXRzIGFuZCBjYWxjIHRoZSBwcm9wZXJ0eSB2YWx1ZXMgZnJvbSB0aGUgcHJlc2V0cyAoY2FwYWJpbGl0aWVzIGFuZCBlZmZlY3RzKVxuICAgIGNvbnN0IGNhbGN1bGF0ZWRGaXh0dXJlcyA9IG5ldyBNYXA8Q2FjaGVkRml4dHVyZSwgRml4dHVyZUNoYW5uZWxWYWx1ZVtdPigpO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmZpeHR1cmVTZXJ2aWNlLmNhY2hlZEZpeHR1cmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBjYWNoZWRGaXh0dXJlID0gdGhpcy5maXh0dXJlU2VydmljZS5jYWNoZWRGaXh0dXJlc1tpXTtcblxuICAgICAgLy8gYWxsIHZhbHVlcyBvZiB0aGUgY3VycmVudCBmaXh0dXJlIGNoYW5uZWxzXG4gICAgICBsZXQgdmFsdWVzOiBGaXh0dXJlQ2hhbm5lbFZhbHVlW10gPSBbXTtcblxuICAgICAgY29uc3QgYWxyZWFkeUNhbGN1bGF0ZWRGaXh0dXJlID0gdGhpcy5nZXRBbHJlYWR5Q2FsY3VsYXRlZEZpeHR1cmUodGhpcy5maXh0dXJlU2VydmljZS5jYWNoZWRGaXh0dXJlcywgaSk7XG5cbiAgICAgIGlmIChhbHJlYWR5Q2FsY3VsYXRlZEZpeHR1cmUpIHtcbiAgICAgICAgLy8gb25seSByZWxldmFudCBmb3IgdGhlIHByZXZpZXcgLS0+IHJldXNlIGFsbCBjYWxjdWxhdGVkIHZhbHVlc1xuICAgICAgICB2YWx1ZXMgPSBPYmplY3QuYXNzaWduKFtdLCBjYWxjdWxhdGVkRml4dHVyZXMuZ2V0KGFscmVhZHlDYWxjdWxhdGVkRml4dHVyZSkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gYXBwbHkgdGhlIGRlZmF1bHQgdmFsdWVzXG4gICAgICAgIGZvciAoY29uc3QgY2FjaGVkQ2hhbm5lbCBvZiBjYWNoZWRGaXh0dXJlLmNoYW5uZWxzKSB7XG4gICAgICAgICAgaWYgKGNhY2hlZENoYW5uZWwuY2hhbm5lbCkge1xuICAgICAgICAgICAgaWYgKGNhY2hlZENoYW5uZWwuY2hhbm5lbC5kZWZhdWx0VmFsdWUpIHtcbiAgICAgICAgICAgICAgY29uc3QgZml4dHVyZUNoYW5uZWxWYWx1ZSA9IG5ldyBGaXh0dXJlQ2hhbm5lbFZhbHVlKCk7XG4gICAgICAgICAgICAgIGZpeHR1cmVDaGFubmVsVmFsdWUuY2hhbm5lbE5hbWUgPSBjYWNoZWRDaGFubmVsLm5hbWU7XG4gICAgICAgICAgICAgIGZpeHR1cmVDaGFubmVsVmFsdWUucHJvZmlsZVV1aWQgPSBjYWNoZWRGaXh0dXJlLnByb2ZpbGUudXVpZDtcbiAgICAgICAgICAgICAgZml4dHVyZUNoYW5uZWxWYWx1ZS52YWx1ZSA9IGNhY2hlZENoYW5uZWwuZGVmYXVsdFZhbHVlO1xuICAgICAgICAgICAgICB0aGlzLm1peENoYW5uZWxWYWx1ZSh2YWx1ZXMsIGZpeHR1cmVDaGFubmVsVmFsdWUsIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgcHJlc2V0IG9mIHByZXNldHMpIHtcbiAgICAgICAgICAvLyBzZWFyY2ggZm9yIHRoaXMgZml4dHVyZSBpbiB0aGUgcHJlc2V0IGFuZCBnZXQgaXQncyBwcmVzZXQtc3BlY2lmaWMgaW5kZXggKGZvciBjaGFzaW5nIGVmZmVjdHMpXG4gICAgICAgICAgY29uc3QgZml4dHVyZUluZGV4ID0gdGhpcy5nZXRGaXh0dXJlSW5kZXgocHJlc2V0LnByZXNldCwgY2FjaGVkRml4dHVyZS5maXh0dXJlLnV1aWQpO1xuXG4gICAgICAgICAgaWYgKGZpeHR1cmVJbmRleCA+PSAwKSB7XG4gICAgICAgICAgICAvLyB0aGlzIGZpeHR1cmUgaXMgYWxzbyBpbiB0aGUgcHJlc2V0IC0+IG1peCB0aGUgcmVxdWlyZWQgdmFsdWVzIChvdmVyd3JpdGUgZXhpc3RpbmcgdmFsdWVzLFxuICAgICAgICAgICAgLy8gaWYgc2V0IG11bHRpcGxlIHRpbWVzKVxuICAgICAgICAgICAgY29uc3QgaW50ZW5zaXR5UGVyY2VudGFnZSA9IHRoaXMuZ2V0UHJlc2V0SW50ZW5zaXR5KHByZXNldCwgdGltZU1pbGxpcyk7XG5cbiAgICAgICAgICAgIHRoaXMubWl4Q2FwYWJpbGl0eVZhbHVlcyhwcmVzZXQsIGNhY2hlZEZpeHR1cmUsIHZhbHVlcywgaW50ZW5zaXR5UGVyY2VudGFnZSk7XG4gICAgICAgICAgICB0aGlzLm1peENoYW5uZWxWYWx1ZXMocHJlc2V0LCBjYWNoZWRGaXh0dXJlLCB2YWx1ZXMsIGludGVuc2l0eVBlcmNlbnRhZ2UpO1xuICAgICAgICAgICAgdGhpcy5taXhFZmZlY3RzKHRpbWVNaWxsaXMsIGZpeHR1cmVJbmRleCwgcHJlc2V0LCBjYWNoZWRGaXh0dXJlLCB2YWx1ZXMsIGludGVuc2l0eVBlcmNlbnRhZ2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBTdG9yZSB0aGUgY2FsY3VsYXRlZCB2YWx1ZXMgZm9yIHN1YnNlcXVlbnQgZml4dHVyZXMgb24gdGhlIHNhbWUgRE1YIGFkZHJlc3NcbiAgICAgIGNhbGN1bGF0ZWRGaXh0dXJlcy5zZXQoY2FjaGVkRml4dHVyZSwgdmFsdWVzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY2FsY3VsYXRlZEZpeHR1cmVzO1xuICB9XG5cbiAgcHVibGljIHNldFVuaXZlcnNlVmFsdWVzKGZpeHR1cmVzOiBNYXA8Q2FjaGVkRml4dHVyZSwgRml4dHVyZUNoYW5uZWxWYWx1ZVtdPiwgbWFzdGVyRGltbWVyVmFsdWU6IG51bWJlcikge1xuICAgIC8vIFRPRE8gb25seSwgaWYgbW9uaXRvcmluZyBpcyBlbmFibGVkXG4gICAgcmV0dXJuO1xuXG4gICAgLy8gUmVzZXQgYWxsIERNWCB1bml2ZXJzZXNcbiAgICBmb3IgKGNvbnN0IHVuaXZlcnNlIG9mIHRoaXMudW5pdmVyc2VTZXJ2aWNlLnVuaXZlcnNlcykge1xuICAgICAgdW5pdmVyc2UuY2hhbm5lbFZhbHVlcyA9IFtdO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCA1MTI7IGkrKykge1xuICAgICAgICB1bml2ZXJzZS5jaGFubmVsVmFsdWVzLnB1c2goMCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gbG9vcCBvdmVyIGVhY2ggZml4dHVyZVxuICAgIGZpeHR1cmVzLmZvckVhY2goKGNoYW5uZWxWYWx1ZXM6IEZpeHR1cmVDaGFubmVsVmFsdWVbXSwgY2FjaGVkRml4dHVyZTogQ2FjaGVkRml4dHVyZSkgPT4ge1xuICAgICAgLy8gVE9ETyBHZXQgdGhlIGNvcnJlY3QgdW5pdmVyc2UgZm9yIHRoaXMgZml4dHVyZVxuICAgICAgY29uc3QgdW5pdmVyc2U6IFVuaXZlcnNlID0gdGhpcy51bml2ZXJzZVNlcnZpY2UuZ2V0VW5pdmVyc2VCeVV1aWQoY2FjaGVkRml4dHVyZS5maXh0dXJlLmRteFVuaXZlcnNlVXVpZCk7XG5cbiAgICAgIC8vIGxvb3Agb3ZlciBlYWNoIGNoYW5uZWwgZm9yIHRoaXMgZml4dHVyZVxuICAgICAgZm9yIChsZXQgY2hhbm5lbEluZGV4ID0gMDsgY2hhbm5lbEluZGV4IDwgY2FjaGVkRml4dHVyZS5tb2RlLmNoYW5uZWxzLmxlbmd0aDsgY2hhbm5lbEluZGV4KyspIHtcbiAgICAgICAgY29uc3QgY2hhbm5lbE9iaiA9IGNhY2hlZEZpeHR1cmUubW9kZS5jaGFubmVsc1tjaGFubmVsSW5kZXhdO1xuICAgICAgICBpZiAodHlwZW9mIGNoYW5uZWxPYmogPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgY29uc3QgY2hhbm5lbE5hbWUgPSBjaGFubmVsT2JqO1xuICAgICAgICAgIC8vIG1hdGNoIHRoaXMgbW9kZSBjaGFubmVsIHdpdGggYSBjaGFubmVsIHZhbHVlXG4gICAgICAgICAgZm9yIChjb25zdCBjaGFubmVsVmFsdWUgb2YgY2hhbm5lbFZhbHVlcykge1xuICAgICAgICAgICAgY29uc3QgY2hhbm5lbCA9IHRoaXMuZml4dHVyZVNlcnZpY2UuZ2V0Q2hhbm5lbEJ5TmFtZShjYWNoZWRGaXh0dXJlLCBjaGFubmVsTmFtZSk7XG4gICAgICAgICAgICBpZiAoY2hhbm5lbCAmJiBjaGFubmVsLmNoYW5uZWwpIHtcbiAgICAgICAgICAgICAgY29uc3QgZmluZUluZGV4ID0gY2hhbm5lbC5jaGFubmVsLmZpbmVDaGFubmVsQWxpYXNlcy5pbmRleE9mKGNoYW5uZWxOYW1lKTtcbiAgICAgICAgICAgICAgaWYgKGNoYW5uZWwubmFtZSA9PT0gY2hhbm5lbFZhbHVlLmNoYW5uZWxOYW1lIHx8IGZpbmVJbmRleCA+IC0xKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdW5pdmVyc2VDaGFubmVsID0gY2FjaGVkRml4dHVyZS5maXh0dXJlLmRteEZpcnN0Q2hhbm5lbCArIGNoYW5uZWxJbmRleDtcbiAgICAgICAgICAgICAgICBjb25zdCBkbXhWYWx1ZSA9XG4gICAgICAgICAgICAgICAgICBNYXRoLmZsb29yKGNoYW5uZWxWYWx1ZS52YWx1ZSAvIE1hdGgucG93KDI1NiwgY2hhbm5lbC5jaGFubmVsLmZpbmVDaGFubmVsQWxpYXNlcy5sZW5ndGggLSAoZmluZUluZGV4ICsgMSkpKSAlIDI1NjtcbiAgICAgICAgICAgICAgICAvLyBUT0RPXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBmaXh0dXJlSXNTZWxlY3RlZCh1dWlkOiBzdHJpbmcsIHByZXNldHM6IFByZXNldFJlZ2lvblNjZW5lW10pOiBib29sZWFuIHtcbiAgICBmb3IgKGNvbnN0IHByZXNldCBvZiBwcmVzZXRzKSB7XG4gICAgICBmb3IgKGNvbnN0IGZpeHR1cmVVdWlkIG9mIHByZXNldC5wcmVzZXQuZml4dHVyZVV1aWRzKSB7XG4gICAgICAgIGlmIChmaXh0dXJlVXVpZCA9PT0gdXVpZCkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHVibGljIHVwZGF0ZUZpeHR1cmVTZXR1cCgpIHtcbiAgICB0aGlzLmRvVXBkYXRlRml4dHVyZVNldHVwLm5leHQoKTtcbiAgfVxuXG4gIHB1YmxpYyB1cGRhdGVTdGFnZSgpIHtcbiAgICBpZiAoIXRoaXMuc2NlbmUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgZ2VvbWV0cnk6IGFueTtcbiAgICBsZXQgbWVzaDogYW55O1xuXG4gICAgLy8gUmVtb3ZlIG9sZCBtZXNoZXMgZnJvbSB0aGUgc2NlbmVcbiAgICBmb3IgKGNvbnN0IGV4aXN0aW5nTWVzaCBvZiB0aGlzLnN0YWdlTWVzaGVzKSB7XG4gICAgICB0aGlzLnNjZW5lLnJlbW92ZShleGlzdGluZ01lc2gpO1xuICAgICAgZXhpc3RpbmdNZXNoLmdlb21ldHJ5LmRpc3Bvc2UoKTtcbiAgICB9XG4gICAgdGhpcy5zdGFnZU1lc2hlcyA9IFtdO1xuXG4gICAgLy8gRmxvb3JcbiAgICBnZW9tZXRyeSA9IG5ldyBUSFJFRS5Cb3hCdWZmZXJHZW9tZXRyeShcbiAgICAgIHRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5zdGFnZVdpZHRoQ20sXG4gICAgICB0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3Quc3RhZ2VGbG9vckhlaWdodENtLFxuICAgICAgdGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LnN0YWdlRGVwdGhDbVxuICAgICk7XG4gICAgbWVzaCA9IG5ldyBUSFJFRS5NZXNoKGdlb21ldHJ5LmNsb25lKCksIHRoaXMuc3RhZ2VNYXRlcmlhbCk7XG4gICAgbWVzaC5yZWNlaXZlU2hhZG93ID0gZmFsc2U7XG4gICAgbWVzaC5jYXN0U2hhZG93ID0gZmFsc2U7XG4gICAgbWVzaC5wb3NpdGlvbi5zZXQoMCwgdGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LnN0YWdlRmxvb3JIZWlnaHRDbSAvIDIsIDApO1xuICAgIHRoaXMuc2NlbmUuYWRkKG1lc2gpO1xuICAgIHRoaXMuc3RhZ2VNZXNoZXMucHVzaChtZXNoKTtcblxuICAgIC8vIFBpbGxhciBmcm9udCBsZWZ0XG4gICAgZ2VvbWV0cnkgPSBuZXcgVEhSRUUuQm94QnVmZmVyR2VvbWV0cnkoXG4gICAgICB0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3Quc3RhZ2VQaWxsYXJXaWR0aENtLFxuICAgICAgdGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LnN0YWdlSGVpZ2h0Q20sXG4gICAgICB0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3Quc3RhZ2VQaWxsYXJXaWR0aENtXG4gICAgKTtcbiAgICBtZXNoID0gbmV3IFRIUkVFLk1lc2goZ2VvbWV0cnkuY2xvbmUoKSwgdGhpcy5zdGFnZU1hdGVyaWFsKTtcbiAgICBtZXNoLnJlY2VpdmVTaGFkb3cgPSBmYWxzZTtcbiAgICBtZXNoLmNhc3RTaGFkb3cgPSBmYWxzZTtcbiAgICBtZXNoLnBvc2l0aW9uLnNldChcbiAgICAgIC10aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3Quc3RhZ2VXaWR0aENtIC8gMiArIHRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5zdGFnZVBpbGxhcldpZHRoQ20gLyAyLFxuICAgICAgdGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LnN0YWdlSGVpZ2h0Q20gLyAyICsgdGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LnN0YWdlRmxvb3JIZWlnaHRDbSxcbiAgICAgIHRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5zdGFnZURlcHRoQ20gLyAyIC0gdGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LnN0YWdlUGlsbGFyV2lkdGhDbSAvIDJcbiAgICApO1xuICAgIHRoaXMuc2NlbmUuYWRkKG1lc2gpO1xuICAgIHRoaXMuc3RhZ2VNZXNoZXMucHVzaChtZXNoKTtcblxuICAgIC8vIFBpbGxhciBmcm9udCByaWdodFxuICAgIGdlb21ldHJ5ID0gbmV3IFRIUkVFLkJveEJ1ZmZlckdlb21ldHJ5KFxuICAgICAgdGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LnN0YWdlUGlsbGFyV2lkdGhDbSxcbiAgICAgIHRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5zdGFnZUhlaWdodENtLFxuICAgICAgdGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LnN0YWdlUGlsbGFyV2lkdGhDbVxuICAgICk7XG4gICAgbWVzaCA9IG5ldyBUSFJFRS5NZXNoKGdlb21ldHJ5LmNsb25lKCksIHRoaXMuc3RhZ2VNYXRlcmlhbCk7XG4gICAgbWVzaC5yZWNlaXZlU2hhZG93ID0gZmFsc2U7XG4gICAgbWVzaC5jYXN0U2hhZG93ID0gZmFsc2U7XG4gICAgbWVzaC5wb3NpdGlvbi5zZXQoXG4gICAgICB0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3Quc3RhZ2VXaWR0aENtIC8gMiAtIHRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5zdGFnZVBpbGxhcldpZHRoQ20gLyAyLFxuICAgICAgdGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LnN0YWdlSGVpZ2h0Q20gLyAyICsgdGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LnN0YWdlRmxvb3JIZWlnaHRDbSxcbiAgICAgIHRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5zdGFnZURlcHRoQ20gLyAyIC0gdGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LnN0YWdlUGlsbGFyV2lkdGhDbSAvIDJcbiAgICApO1xuICAgIHRoaXMuc2NlbmUuYWRkKG1lc2gpO1xuICAgIHRoaXMuc3RhZ2VNZXNoZXMucHVzaChtZXNoKTtcblxuICAgIC8vIFBpbGxhciBiYWNrIGxlZnRcbiAgICBnZW9tZXRyeSA9IG5ldyBUSFJFRS5Cb3hCdWZmZXJHZW9tZXRyeShcbiAgICAgIHRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5zdGFnZVBpbGxhcldpZHRoQ20sXG4gICAgICB0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3Quc3RhZ2VIZWlnaHRDbSxcbiAgICAgIHRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5zdGFnZVBpbGxhcldpZHRoQ21cbiAgICApO1xuICAgIG1lc2ggPSBuZXcgVEhSRUUuTWVzaChnZW9tZXRyeS5jbG9uZSgpLCB0aGlzLnN0YWdlTWF0ZXJpYWwpO1xuICAgIG1lc2gucmVjZWl2ZVNoYWRvdyA9IGZhbHNlO1xuICAgIG1lc2guY2FzdFNoYWRvdyA9IGZhbHNlO1xuICAgIG1lc2gucG9zaXRpb24uc2V0KFxuICAgICAgLXRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5zdGFnZVdpZHRoQ20gLyAyICsgdGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LnN0YWdlUGlsbGFyV2lkdGhDbSAvIDIsXG4gICAgICB0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3Quc3RhZ2VIZWlnaHRDbSAvIDIgKyB0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3Quc3RhZ2VGbG9vckhlaWdodENtLFxuICAgICAgLXRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5zdGFnZURlcHRoQ20gLyAyICsgdGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LnN0YWdlUGlsbGFyV2lkdGhDbSAvIDJcbiAgICApO1xuICAgIHRoaXMuc2NlbmUuYWRkKG1lc2gpO1xuICAgIHRoaXMuc3RhZ2VNZXNoZXMucHVzaChtZXNoKTtcblxuICAgIC8vIFBpbGxhciBiYWNrIHJpZ2h0XG4gICAgZ2VvbWV0cnkgPSBuZXcgVEhSRUUuQm94QnVmZmVyR2VvbWV0cnkoXG4gICAgICB0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3Quc3RhZ2VQaWxsYXJXaWR0aENtLFxuICAgICAgdGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LnN0YWdlSGVpZ2h0Q20sXG4gICAgICB0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3Quc3RhZ2VQaWxsYXJXaWR0aENtXG4gICAgKTtcbiAgICBtZXNoID0gbmV3IFRIUkVFLk1lc2goZ2VvbWV0cnkuY2xvbmUoKSwgdGhpcy5zdGFnZU1hdGVyaWFsKTtcbiAgICBtZXNoLnJlY2VpdmVTaGFkb3cgPSBmYWxzZTtcbiAgICBtZXNoLmNhc3RTaGFkb3cgPSBmYWxzZTtcbiAgICBtZXNoLnBvc2l0aW9uLnNldChcbiAgICAgIHRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5zdGFnZVdpZHRoQ20gLyAyIC0gdGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LnN0YWdlUGlsbGFyV2lkdGhDbSAvIDIsXG4gICAgICB0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3Quc3RhZ2VIZWlnaHRDbSAvIDIgKyB0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3Quc3RhZ2VGbG9vckhlaWdodENtLFxuICAgICAgLXRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5zdGFnZURlcHRoQ20gLyAyICsgdGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LnN0YWdlUGlsbGFyV2lkdGhDbSAvIDJcbiAgICApO1xuICAgIHRoaXMuc2NlbmUuYWRkKG1lc2gpO1xuICAgIHRoaXMuc3RhZ2VNZXNoZXMucHVzaChtZXNoKTtcblxuICAgIC8vIENlaWxpbmdcbiAgICBnZW9tZXRyeSA9IG5ldyBUSFJFRS5Cb3hCdWZmZXJHZW9tZXRyeShcbiAgICAgIHRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5zdGFnZVdpZHRoQ20sXG4gICAgICB0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3Quc3RhZ2VDZWlsaW5nSGVpZ2h0Q20sXG4gICAgICB0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3Quc3RhZ2VEZXB0aENtXG4gICAgKTtcbiAgICBtZXNoID0gbmV3IFRIUkVFLk1lc2goZ2VvbWV0cnkuY2xvbmUoKSwgdGhpcy5zdGFnZU1hdGVyaWFsKTtcbiAgICBtZXNoLnJlY2VpdmVTaGFkb3cgPSBmYWxzZTtcbiAgICBtZXNoLmNhc3RTaGFkb3cgPSBmYWxzZTtcbiAgICBtZXNoLnBvc2l0aW9uLnNldChcbiAgICAgIDAsXG4gICAgICB0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3Quc3RhZ2VIZWlnaHRDbSArXG4gICAgICAgIHRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5zdGFnZUNlaWxpbmdIZWlnaHRDbSAvIDIgK1xuICAgICAgICB0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3Quc3RhZ2VGbG9vckhlaWdodENtLFxuICAgICAgMFxuICAgICk7XG4gICAgdGhpcy5zY2VuZS5hZGQobWVzaCk7XG4gICAgdGhpcy5zdGFnZU1lc2hlcy5wdXNoKG1lc2gpO1xuICB9XG59XG4iXX0=
|