@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,250 +0,0 @@
|
|
|
1
|
-
import { __extends, __read, __values } from "tslib";
|
|
2
|
-
import { forkJoin } from 'rxjs';
|
|
3
|
-
import { map } from 'rxjs/operators';
|
|
4
|
-
import * as THREE from 'three';
|
|
5
|
-
import { FixtureCapabilityType } from '../../models/fixture-capability';
|
|
6
|
-
import { Fixture3d } from './fixture-3d';
|
|
7
|
-
var MovingHead3d = /** @class */ (function (_super) {
|
|
8
|
-
__extends(MovingHead3d, _super);
|
|
9
|
-
function MovingHead3d(fixtureService, previewMeshService, fixture, scene) {
|
|
10
|
-
var _this = _super.call(this, fixtureService, fixture, scene) || this;
|
|
11
|
-
_this.pointLightMaxIntensity = 2;
|
|
12
|
-
_this.spotLightLightMaxIntensity = 10;
|
|
13
|
-
_this.headGroup = new THREE.Object3D();
|
|
14
|
-
_this.spotlightGroup = new THREE.Object3D();
|
|
15
|
-
_this.armGroup = new THREE.Object3D();
|
|
16
|
-
_this.objectGroup = new THREE.Object3D();
|
|
17
|
-
forkJoin([
|
|
18
|
-
previewMeshService.getMesh('moving_head_socket'),
|
|
19
|
-
previewMeshService.getMesh('moving_head_arm'),
|
|
20
|
-
previewMeshService.getMesh('moving_head_head'),
|
|
21
|
-
])
|
|
22
|
-
.pipe(map(function (_a) {
|
|
23
|
-
var _b = __read(_a, 3), socket = _b[0], arm = _b[1], head = _b[2];
|
|
24
|
-
_this.socket = socket;
|
|
25
|
-
_this.arm = arm;
|
|
26
|
-
_this.head = head;
|
|
27
|
-
_this.createObjects();
|
|
28
|
-
}))
|
|
29
|
-
.subscribe();
|
|
30
|
-
return _this;
|
|
31
|
-
}
|
|
32
|
-
MovingHead3d.prototype.atmosphereMat = function () {
|
|
33
|
-
var vertexShader = [
|
|
34
|
-
'varying vec3 vVertexWorldPosition;',
|
|
35
|
-
'varying vec3 vVertexNormal;',
|
|
36
|
-
'void main(){',
|
|
37
|
-
' vVertexNormal = normalize(normalMatrix * normal);',
|
|
38
|
-
' vVertexWorldPosition = (modelMatrix * vec4(position, 1.0)).xyz;',
|
|
39
|
-
' // set gl_Position',
|
|
40
|
-
' gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);',
|
|
41
|
-
'}',
|
|
42
|
-
].join('\n');
|
|
43
|
-
var fragmentShader = [
|
|
44
|
-
'uniform vec3 glowColor;',
|
|
45
|
-
'uniform float coeficient;',
|
|
46
|
-
'uniform float power;',
|
|
47
|
-
'uniform float opacity;',
|
|
48
|
-
'varying vec3 vVertexNormal;',
|
|
49
|
-
'varying vec3 vVertexWorldPosition;',
|
|
50
|
-
'void main(){',
|
|
51
|
-
' vec3 worldCameraToVertex= vVertexWorldPosition - cameraPosition;',
|
|
52
|
-
' vec3 viewCameraToVertex = (viewMatrix * vec4(worldCameraToVertex, 0.0)).xyz;',
|
|
53
|
-
' viewCameraToVertex = normalize(viewCameraToVertex);',
|
|
54
|
-
' float intensity = pow(coeficient + dot(vVertexNormal, viewCameraToVertex), power);',
|
|
55
|
-
' gl_FragColor = vec4(glowColor, intensity * opacity);',
|
|
56
|
-
'}',
|
|
57
|
-
].join('\n');
|
|
58
|
-
// create custom material from the shader code above
|
|
59
|
-
// that is within specially labeled script tags
|
|
60
|
-
var material = new THREE.ShaderMaterial({
|
|
61
|
-
uniforms: {
|
|
62
|
-
coeficient: {
|
|
63
|
-
type: 'f',
|
|
64
|
-
value: 0.3,
|
|
65
|
-
},
|
|
66
|
-
power: {
|
|
67
|
-
type: 'f',
|
|
68
|
-
value: 1.3,
|
|
69
|
-
},
|
|
70
|
-
opacity: {
|
|
71
|
-
type: 'f',
|
|
72
|
-
value: 1.0,
|
|
73
|
-
},
|
|
74
|
-
glowColor: {
|
|
75
|
-
type: 'c',
|
|
76
|
-
value: new THREE.Color('white'),
|
|
77
|
-
},
|
|
78
|
-
},
|
|
79
|
-
vertexShader: vertexShader,
|
|
80
|
-
fragmentShader: fragmentShader,
|
|
81
|
-
// blending: THREE.AdditiveBlending,
|
|
82
|
-
transparent: true,
|
|
83
|
-
depthWrite: false,
|
|
84
|
-
});
|
|
85
|
-
return material;
|
|
86
|
-
};
|
|
87
|
-
MovingHead3d.prototype.createSpotLightBeam = function () {
|
|
88
|
-
if (this.spotLightBeam) {
|
|
89
|
-
this.spotlightGroup.remove(this.spotLightBeam);
|
|
90
|
-
}
|
|
91
|
-
// TODO update the correct angle from the profile
|
|
92
|
-
var beamAngleDegrees = 14;
|
|
93
|
-
var geometry = new THREE.CylinderGeometry(0.1, beamAngleDegrees * 1.2, 100, 64, 20, false);
|
|
94
|
-
geometry.applyMatrix(new THREE.Matrix4().makeTranslation(0, -geometry.parameters.height / 2, 0));
|
|
95
|
-
geometry.applyMatrix(new THREE.Matrix4().makeRotationX(-Math.PI / 2));
|
|
96
|
-
// var zrak_mat = new THREE.MeshBasicMaterial({ color: 0xffffff, blending: THREE.AdditiveBlending, opacity: 0.1 });
|
|
97
|
-
this.atmosphereMaterial = this.atmosphereMat();
|
|
98
|
-
this.spotLightBeam = new THREE.Mesh(geometry, this.atmosphereMaterial);
|
|
99
|
-
this.spotLightBeam.position.set(0, -0.02, 0);
|
|
100
|
-
this.spotlightGroup.add(this.spotLightBeam);
|
|
101
|
-
this.spotLightBeam.rotation.x = Math.PI / 2;
|
|
102
|
-
};
|
|
103
|
-
MovingHead3d.prototype.createObjects = function () {
|
|
104
|
-
this.material = new THREE.MeshLambertMaterial({
|
|
105
|
-
color: 0x0d0d0d,
|
|
106
|
-
emissive: 0x0d0d0d,
|
|
107
|
-
});
|
|
108
|
-
this.socket.material = this.material;
|
|
109
|
-
this.arm.material = this.material;
|
|
110
|
-
this.head.material = this.material;
|
|
111
|
-
// Add the head
|
|
112
|
-
this.head.scale.multiplyScalar(0.9);
|
|
113
|
-
this.head.position.set(-0.1, 0, 0);
|
|
114
|
-
var headPivotGroup = new THREE.Object3D();
|
|
115
|
-
headPivotGroup.add(this.head);
|
|
116
|
-
this.headGroup.add(headPivotGroup);
|
|
117
|
-
// Add the spotlight
|
|
118
|
-
this.spotLight = new THREE.SpotLight(0xffffff, 1);
|
|
119
|
-
this.spotLight.angle = 0.244;
|
|
120
|
-
this.spotLight.penumbra = 0.5;
|
|
121
|
-
this.spotLight.decay = 2;
|
|
122
|
-
this.spotLight.distance = 60000;
|
|
123
|
-
this.spotLight.castShadow = false;
|
|
124
|
-
this.spotLight.intensity = 10;
|
|
125
|
-
this.spotLightHelper = new THREE.SpotLightHelper(this.spotLight);
|
|
126
|
-
// scene.add(this.spotLightHelper);
|
|
127
|
-
var spotLightTarget = new THREE.Object3D();
|
|
128
|
-
this.spotLight.target = spotLightTarget;
|
|
129
|
-
this.spotlightGroup.add(this.spotLight);
|
|
130
|
-
this.spotlightGroup.add(spotLightTarget);
|
|
131
|
-
this.spotLight.position.set(0, -1.4, 0);
|
|
132
|
-
spotLightTarget.position.set(0, -10, 0);
|
|
133
|
-
// Add the point light for the surrounding light
|
|
134
|
-
this.pointLight = new THREE.PointLight(0xffffff, 2, 1000);
|
|
135
|
-
this.spotlightGroup.add(this.pointLight);
|
|
136
|
-
this.pointLight.position.set(0, -1.4, 0);
|
|
137
|
-
// Add the light beam
|
|
138
|
-
this.createSpotLightBeam();
|
|
139
|
-
this.headGroup.add(this.spotlightGroup);
|
|
140
|
-
// Add the arm
|
|
141
|
-
this.armGroup.add(this.headGroup);
|
|
142
|
-
this.headGroup.position.set(0, -0.6, 0);
|
|
143
|
-
this.armGroup.add(this.arm);
|
|
144
|
-
// Add the socket
|
|
145
|
-
this.objectGroup.add(this.armGroup);
|
|
146
|
-
this.objectGroup.add(this.socket);
|
|
147
|
-
this.socket.position.set(0, 1.2, 0);
|
|
148
|
-
// A moving head has about 32 cm in width
|
|
149
|
-
this.objectGroup.scale.multiplyScalar(9);
|
|
150
|
-
this.scene.add(this.objectGroup);
|
|
151
|
-
this.isLoaded = true;
|
|
152
|
-
};
|
|
153
|
-
MovingHead3d.prototype.getObject = function () {
|
|
154
|
-
return this.objectGroup;
|
|
155
|
-
};
|
|
156
|
-
MovingHead3d.prototype.updatePreview = function (channelValues, masterDimmerValue) {
|
|
157
|
-
var e_1, _a;
|
|
158
|
-
_super.prototype.updatePreview.call(this, channelValues, masterDimmerValue);
|
|
159
|
-
if (!this.isLoaded) {
|
|
160
|
-
return;
|
|
161
|
-
}
|
|
162
|
-
// Apply default settings
|
|
163
|
-
var panStart = 0;
|
|
164
|
-
var panEnd = 255;
|
|
165
|
-
var tiltStart = 0;
|
|
166
|
-
var tiltEnd = 255;
|
|
167
|
-
this.pan = 0;
|
|
168
|
-
this.tilt = 0;
|
|
169
|
-
try {
|
|
170
|
-
// Apply the known property values
|
|
171
|
-
for (var channelValues_1 = __values(channelValues), channelValues_1_1 = channelValues_1.next(); !channelValues_1_1.done; channelValues_1_1 = channelValues_1.next()) {
|
|
172
|
-
var channelValue = channelValues_1_1.value;
|
|
173
|
-
var channel = this.fixtureService.getChannelByName(this.fixture, channelValue.channelName);
|
|
174
|
-
var capability = this.getCapabilityInValue(channel, channelValue.value);
|
|
175
|
-
if (capability) {
|
|
176
|
-
switch (capability.capability.type) {
|
|
177
|
-
case FixtureCapabilityType.Pan: {
|
|
178
|
-
panStart = this.fixtureService.getRotationAngleDeg(capability.capability.angleStart) || 0;
|
|
179
|
-
panEnd = this.fixtureService.getRotationAngleDeg(capability.capability.angleEnd) || 540;
|
|
180
|
-
this.pan = channelValue.value / channel.maxValue;
|
|
181
|
-
break;
|
|
182
|
-
}
|
|
183
|
-
case FixtureCapabilityType.Tilt: {
|
|
184
|
-
tiltStart = this.fixtureService.getRotationAngleDeg(capability.capability.angleStart) || 0;
|
|
185
|
-
tiltEnd = this.fixtureService.getRotationAngleDeg(capability.capability.angleEnd) || 2700;
|
|
186
|
-
this.tilt = channelValue.value / channel.maxValue;
|
|
187
|
-
break;
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
194
|
-
finally {
|
|
195
|
-
try {
|
|
196
|
-
if (channelValues_1_1 && !channelValues_1_1.done && (_a = channelValues_1.return)) _a.call(channelValues_1);
|
|
197
|
-
}
|
|
198
|
-
finally { if (e_1) throw e_1.error; }
|
|
199
|
-
}
|
|
200
|
-
this.updatePosition(this.objectGroup);
|
|
201
|
-
// calculate the y/x rotation in radiants based on pan/tilt (0-1) respecting the max pan/tilt
|
|
202
|
-
this.armGroup.rotation.y = THREE.Math.degToRad(panEnd * this.pan + panStart) - THREE.Math.degToRad(panEnd / 2);
|
|
203
|
-
this.headGroup.rotation.x = THREE.Math.degToRad(tiltEnd * this.tilt + tiltStart) - THREE.Math.degToRad(tiltEnd / 2);
|
|
204
|
-
// Update the angle (only on change, because it's expensive)
|
|
205
|
-
// TODO update the correct angle from the profile
|
|
206
|
-
var beamAngleDregrees = 14;
|
|
207
|
-
if (this.lastBeamAngleDegrees !== beamAngleDregrees) {
|
|
208
|
-
this.spotLight.angle = THREE.Math.degToRad(beamAngleDregrees);
|
|
209
|
-
this.createSpotLightBeam();
|
|
210
|
-
this.lastBeamAngleDegrees = beamAngleDregrees;
|
|
211
|
-
}
|
|
212
|
-
// Update the material
|
|
213
|
-
if (this.lastSelected !== this.isSelected) {
|
|
214
|
-
if (this.isSelected) {
|
|
215
|
-
this.socket.material = this.selectedMaterial;
|
|
216
|
-
this.arm.material = this.selectedMaterial;
|
|
217
|
-
this.head.material = this.selectedMaterial;
|
|
218
|
-
}
|
|
219
|
-
else {
|
|
220
|
-
this.socket.material = this.material;
|
|
221
|
-
this.arm.material = this.material;
|
|
222
|
-
this.head.material = this.material;
|
|
223
|
-
}
|
|
224
|
-
this.lastSelected = this.isSelected;
|
|
225
|
-
}
|
|
226
|
-
// Update the light helpers
|
|
227
|
-
this.spotLightHelper.update();
|
|
228
|
-
// Apply the colors
|
|
229
|
-
var color = new THREE.Color('rgb(' + this.colorRed + ', ' + this.colorGreen + ', ' + this.colorBlue + ')');
|
|
230
|
-
this.pointLight.color = color;
|
|
231
|
-
this.spotLight.color = color;
|
|
232
|
-
this.spotLightBeam.material.uniforms.glowColor.value = color;
|
|
233
|
-
// Apply the dimmer value
|
|
234
|
-
// Take the color into account for the beam (don't show a black beam)
|
|
235
|
-
var intensityColor = Math.max(this.colorRed, this.colorGreen, this.colorBlue);
|
|
236
|
-
this.spotLightBeam.material.uniforms.opacity.value = Math.min(intensityColor, this.dimmer);
|
|
237
|
-
this.spotLight.intensity = this.spotLightLightMaxIntensity * this.dimmer;
|
|
238
|
-
this.pointLight.intensity = this.pointLightMaxIntensity * this.dimmer;
|
|
239
|
-
// this.spotLightBeam.material.uniforms.viewVector.value =
|
|
240
|
-
// new THREE.Vector3().subVectors(this.camera.position, this.spotLightBeam.position);
|
|
241
|
-
};
|
|
242
|
-
MovingHead3d.prototype.destroy = function () {
|
|
243
|
-
this.scene.remove(this.objectGroup);
|
|
244
|
-
this.material.dispose();
|
|
245
|
-
this.atmosphereMaterial.dispose();
|
|
246
|
-
};
|
|
247
|
-
return MovingHead3d;
|
|
248
|
-
}(Fixture3d));
|
|
249
|
-
export { MovingHead3d };
|
|
250
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW92aW5nLWhlYWQtM2QuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Acm9ja2V0c2hvdy9kZXNpZ25lci8iLCJzb3VyY2VzIjpbImxpYi9wcmV2aWV3L21vZGVscy9tb3ZpbmctaGVhZC0zZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNoQyxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDckMsT0FBTyxLQUFLLEtBQUssTUFBTSxPQUFPLENBQUM7QUFFL0IsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFJeEUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUV6QztJQUFrQyxnQ0FBUztJQWdMekMsc0JBQVksY0FBOEIsRUFBRSxrQkFBc0MsRUFBRSxPQUFzQixFQUFFLEtBQVU7UUFBdEgsWUFDRSxrQkFBTSxjQUFjLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxTQWlCdEM7UUFqTWdCLDRCQUFzQixHQUFXLENBQUMsQ0FBQztRQUNuQyxnQ0FBMEIsR0FBVyxFQUFFLENBQUM7UUFTakQsZUFBUyxHQUFtQixJQUFJLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNqRCxvQkFBYyxHQUFtQixJQUFJLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUN0RCxjQUFRLEdBQW1CLElBQUksS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2hELGlCQUFXLEdBQW1CLElBQUksS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBcUt6RCxRQUFRLENBQUM7WUFDUCxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsb0JBQW9CLENBQUM7WUFDaEQsa0JBQWtCLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDO1lBQzdDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQztTQUMvQyxDQUFDO2FBQ0MsSUFBSSxDQUNILEdBQUcs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Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZm9ya0pvaW4gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCAqIGFzIFRIUkVFIGZyb20gJ3RocmVlJztcbmltcG9ydCB7IENhY2hlZEZpeHR1cmUgfSBmcm9tICcuLi8uLi9tb2RlbHMvY2FjaGVkLWZpeHR1cmUnO1xuaW1wb3J0IHsgRml4dHVyZUNhcGFiaWxpdHlUeXBlIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2ZpeHR1cmUtY2FwYWJpbGl0eSc7XG5pbXBvcnQgeyBGaXh0dXJlQ2hhbm5lbFZhbHVlIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2ZpeHR1cmUtY2hhbm5lbC12YWx1ZSc7XG5pbXBvcnQgeyBGaXh0dXJlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2ZpeHR1cmUuc2VydmljZSc7XG5pbXBvcnQgeyBQcmV2aWV3TWVzaFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9wcmV2aWV3LW1lc2guc2VydmljZSc7XG5pbXBvcnQgeyBGaXh0dXJlM2QgfSBmcm9tICcuL2ZpeHR1cmUtM2QnO1xuXG5leHBvcnQgY2xhc3MgTW92aW5nSGVhZDNkIGV4dGVuZHMgRml4dHVyZTNkIHtcbiAgcHJpdmF0ZSByZWFkb25seSBwb2ludExpZ2h0TWF4SW50ZW5zaXR5OiBudW1iZXIgPSAyO1xuICBwcml2YXRlIHJlYWRvbmx5IHNwb3RMaWdodExpZ2h0TWF4SW50ZW5zaXR5OiBudW1iZXIgPSAxMDtcblxuICBwcml2YXRlIHBhbjogbnVtYmVyO1xuICBwcml2YXRlIHRpbHQ6IG51bWJlcjtcblxuICBwcml2YXRlIHNvY2tldDogVEhSRUUuTWVzaDtcbiAgcHJpdmF0ZSBhcm06IFRIUkVFLk1lc2g7XG4gIHByaXZhdGUgaGVhZDogVEhSRUUuTWVzaDtcblxuICBwcml2YXRlIGhlYWRHcm91cDogVEhSRUUuT2JqZWN0M0QgPSBuZXcgVEhSRUUuT2JqZWN0M0QoKTtcbiAgcHJpdmF0ZSBzcG90bGlnaHRHcm91cDogVEhSRUUuT2JqZWN0M0QgPSBuZXcgVEhSRUUuT2JqZWN0M0QoKTtcbiAgcHJpdmF0ZSBhcm1Hcm91cDogVEhSRUUuT2JqZWN0M0QgPSBuZXcgVEhSRUUuT2JqZWN0M0QoKTtcbiAgcHJpdmF0ZSBvYmplY3RHcm91cDogVEhSRUUuT2JqZWN0M0QgPSBuZXcgVEhSRUUuT2JqZWN0M0QoKTtcbiAgcHJpdmF0ZSBzcG90TGlnaHQ6IFRIUkVFLlNwb3RMaWdodDtcbiAgcHJpdmF0ZSBzcG90TGlnaHRIZWxwZXI6IFRIUkVFLlNwb3RMaWdodEhlbHBlcjtcbiAgcHJpdmF0ZSBzcG90TGlnaHRCZWFtOiBUSFJFRS5NZXNoO1xuXG4gIHByaXZhdGUgcG9pbnRMaWdodDogVEhSRUUuUG9pbnRMaWdodDtcblxuICBwcml2YXRlIGxhc3RCZWFtQW5nbGVEZWdyZWVzOiBudW1iZXI7XG4gIHByaXZhdGUgbGFzdFNlbGVjdGVkOiBib29sZWFuO1xuXG4gIHByaXZhdGUgbWF0ZXJpYWw6IFRIUkVFLk1lc2hTdGFuZGFyZE1hdGVyaWFsO1xuICBwcml2YXRlIGF0bW9zcGhlcmVNYXRlcmlhbDogVEhSRUUuU2hhZGVyTWF0ZXJpYWw7XG5cbiAgcHJpdmF0ZSBhdG1vc3BoZXJlTWF0KCkge1xuICAgIGNvbnN0IHZlcnRleFNoYWRlciA9IFtcbiAgICAgICd2YXJ5aW5nIHZlYzNcdHZWZXJ0ZXhXb3JsZFBvc2l0aW9uOycsXG4gICAgICAndmFyeWluZyB2ZWMzXHR2VmVydGV4Tm9ybWFsOycsXG5cbiAgICAgICd2b2lkIG1haW4oKXsnLFxuICAgICAgJ1x0dlZlcnRleE5vcm1hbCA9IG5vcm1hbGl6ZShub3JtYWxNYXRyaXggKiBub3JtYWwpOycsXG5cbiAgICAgICdcdHZWZXJ0ZXhXb3JsZFBvc2l0aW9uID0gKG1vZGVsTWF0cml4ICogdmVjNChwb3NpdGlvbiwgMS4wKSkueHl6OycsXG5cbiAgICAgICdcdC8vIHNldCBnbF9Qb3NpdGlvbicsXG4gICAgICAnXHRnbF9Qb3NpdGlvblx0PSBwcm9qZWN0aW9uTWF0cml4ICogbW9kZWxWaWV3TWF0cml4ICogdmVjNChwb3NpdGlvbiwgMS4wKTsnLFxuICAgICAgJ30nLFxuICAgIF0uam9pbignXFxuJyk7XG4gICAgY29uc3QgZnJhZ21lbnRTaGFkZXIgPSBbXG4gICAgICAndW5pZm9ybSB2ZWMzXHRnbG93Q29sb3I7JyxcbiAgICAgICd1bmlmb3JtIGZsb2F0XHRjb2VmaWNpZW50OycsXG4gICAgICAndW5pZm9ybSBmbG9hdFx0cG93ZXI7JyxcbiAgICAgICd1bmlmb3JtIGZsb2F0XHRvcGFjaXR5OycsXG5cbiAgICAgICd2YXJ5aW5nIHZlYzNcdHZWZXJ0ZXhOb3JtYWw7JyxcbiAgICAgICd2YXJ5aW5nIHZlYzNcdHZWZXJ0ZXhXb3JsZFBvc2l0aW9uOycsXG5cbiAgICAgICd2b2lkIG1haW4oKXsnLFxuICAgICAgJ1x0dmVjMyB3b3JsZENhbWVyYVRvVmVydGV4PSB2VmVydGV4V29ybGRQb3NpdGlvbiAtIGNhbWVyYVBvc2l0aW9uOycsXG4gICAgICAnXHR2ZWMzIHZpZXdDYW1lcmFUb1ZlcnRleFx0PSAodmlld01hdHJpeCAqIHZlYzQod29ybGRDYW1lcmFUb1ZlcnRleCwgMC4wKSkueHl6OycsXG4gICAgICAnXHR2aWV3Q2FtZXJhVG9WZXJ0ZXhcdD0gbm9ybWFsaXplKHZpZXdDYW1lcmFUb1ZlcnRleCk7JyxcbiAgICAgICdcdGZsb2F0IGludGVuc2l0eVx0XHQ9IHBvdyhjb2VmaWNpZW50ICsgZG90KHZWZXJ0ZXhOb3JtYWwsIHZpZXdDYW1lcmFUb1ZlcnRleCksIHBvd2VyKTsnLFxuICAgICAgJ1x0Z2xfRnJhZ0NvbG9yXHRcdD0gdmVjNChnbG93Q29sb3IsIGludGVuc2l0eSAqIG9wYWNpdHkpOycsXG4gICAgICAnfScsXG4gICAgXS5qb2luKCdcXG4nKTtcblxuICAgIC8vIGNyZWF0ZSBjdXN0b20gbWF0ZXJpYWwgZnJvbSB0aGUgc2hhZGVyIGNvZGUgYWJvdmVcbiAgICAvLyB0aGF0IGlzIHdpdGhpbiBzcGVjaWFsbHkgbGFiZWxlZCBzY3JpcHQgdGFnc1xuICAgIGNvbnN0IG1hdGVyaWFsID0gbmV3IFRIUkVFLlNoYWRlck1hdGVyaWFsKHtcbiAgICAgIHVuaWZvcm1zOiB7XG4gICAgICAgIGNvZWZpY2llbnQ6IHtcbiAgICAgICAgICB0eXBlOiAnZicsXG4gICAgICAgICAgdmFsdWU6IDAuMyxcbiAgICAgICAgfSxcbiAgICAgICAgcG93ZXI6IHtcbiAgICAgICAgICB0eXBlOiAnZicsXG4gICAgICAgICAgdmFsdWU6IDEuMyxcbiAgICAgICAgfSxcbiAgICAgICAgb3BhY2l0eToge1xuICAgICAgICAgIHR5cGU6ICdmJyxcbiAgICAgICAgICB2YWx1ZTogMS4wLFxuICAgICAgICB9LFxuICAgICAgICBnbG93Q29sb3I6IHtcbiAgICAgICAgICB0eXBlOiAnYycsXG4gICAgICAgICAgdmFsdWU6IG5ldyBUSFJFRS5Db2xvcignd2hpdGUnKSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB2ZXJ0ZXhTaGFkZXIsXG4gICAgICBmcmFnbWVudFNoYWRlcixcbiAgICAgIC8vIGJsZW5kaW5nOiBUSFJFRS5BZGRpdGl2ZUJsZW5kaW5nLFxuICAgICAgdHJhbnNwYXJlbnQ6IHRydWUsXG4gICAgICBkZXB0aFdyaXRlOiBmYWxzZSxcbiAgICB9KTtcblxuICAgIHJldHVybiBtYXRlcmlhbDtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlU3BvdExpZ2h0QmVhbSgpIHtcbiAgICBpZiAodGhpcy5zcG90TGlnaHRCZWFtKSB7XG4gICAgICB0aGlzLnNwb3RsaWdodEdyb3VwLnJlbW92ZSh0aGlzLnNwb3RMaWdodEJlYW0pO1xuICAgIH1cblxuICAgIC8vIFRPRE8gdXBkYXRlIHRoZSBjb3JyZWN0IGFuZ2xlIGZyb20gdGhlIHByb2ZpbGVcbiAgICBjb25zdCBiZWFtQW5nbGVEZWdyZWVzID0gMTQ7XG4gICAgY29uc3QgZ2VvbWV0cnkgPSBuZXcgVEhSRUUuQ3lsaW5kZXJHZW9tZXRyeSgwLjEsIGJlYW1BbmdsZURlZ3JlZXMgKiAxLjIsIDEwMCwgNjQsIDIwLCBmYWxzZSk7XG4gICAgZ2VvbWV0cnkuYXBwbHlNYXRyaXgobmV3IFRIUkVFLk1hdHJpeDQoKS5tYWtlVHJhbnNsYXRpb24oMCwgLWdlb21ldHJ5LnBhcmFtZXRlcnMuaGVpZ2h0IC8gMiwgMCkpO1xuICAgIGdlb21ldHJ5LmFwcGx5TWF0cml4KG5ldyBUSFJFRS5NYXRyaXg0KCkubWFrZVJvdGF0aW9uWCgtTWF0aC5QSSAvIDIpKTtcblxuICAgIC8vIHZhciB6cmFrX21hdCA9IG5ldyBUSFJFRS5NZXNoQmFzaWNNYXRlcmlhbCh7IGNvbG9yOiAweGZmZmZmZiwgYmxlbmRpbmc6IFRIUkVFLkFkZGl0aXZlQmxlbmRpbmcsIG9wYWNpdHk6IDAuMSB9KTtcblxuICAgIHRoaXMuYXRtb3NwaGVyZU1hdGVyaWFsID0gdGhpcy5hdG1vc3BoZXJlTWF0KCk7XG4gICAgdGhpcy5zcG90TGlnaHRCZWFtID0gbmV3IFRIUkVFLk1lc2goZ2VvbWV0cnksIHRoaXMuYXRtb3NwaGVyZU1hdGVyaWFsKTtcbiAgICB0aGlzLnNwb3RMaWdodEJlYW0ucG9zaXRpb24uc2V0KDAsIC0wLjAyLCAwKTtcblxuICAgIHRoaXMuc3BvdGxpZ2h0R3JvdXAuYWRkKHRoaXMuc3BvdExpZ2h0QmVhbSk7XG4gICAgdGhpcy5zcG90TGlnaHRCZWFtLnJvdGF0aW9uLnggPSBNYXRoLlBJIC8gMjtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlT2JqZWN0cygpIHtcbiAgICAodGhpcy5tYXRlcmlhbCBhcyBhbnkpID0gbmV3IFRIUkVFLk1lc2hMYW1iZXJ0TWF0ZXJpYWwoe1xuICAgICAgY29sb3I6IDB4MGQwZDBkLFxuICAgICAgZW1pc3NpdmU6IDB4MGQwZDBkLFxuICAgIH0pO1xuXG4gICAgdGhpcy5zb2NrZXQubWF0ZXJpYWwgPSB0aGlzLm1hdGVyaWFsO1xuICAgIHRoaXMuYXJtLm1hdGVyaWFsID0gdGhpcy5tYXRlcmlhbDtcbiAgICB0aGlzLmhlYWQubWF0ZXJpYWwgPSB0aGlzLm1hdGVyaWFsO1xuXG4gICAgLy8gQWRkIHRoZSBoZWFkXG4gICAgdGhpcy5oZWFkLnNjYWxlLm11bHRpcGx5U2NhbGFyKDAuOSk7XG4gICAgdGhpcy5oZWFkLnBvc2l0aW9uLnNldCgtMC4xLCAwLCAwKTtcbiAgICBjb25zdCBoZWFkUGl2b3RHcm91cCA9IG5ldyBUSFJFRS5PYmplY3QzRCgpO1xuICAgIGhlYWRQaXZvdEdyb3VwLmFkZCh0aGlzLmhlYWQpO1xuICAgIHRoaXMuaGVhZEdyb3VwLmFkZChoZWFkUGl2b3RHcm91cCk7XG5cbiAgICAvLyBBZGQgdGhlIHNwb3RsaWdodFxuICAgIHRoaXMuc3BvdExpZ2h0ID0gbmV3IFRIUkVFLlNwb3RMaWdodCgweGZmZmZmZiwgMSk7XG4gICAgdGhpcy5zcG90TGlnaHQuYW5nbGUgPSAwLjI0NDtcbiAgICB0aGlzLnNwb3RMaWdodC5wZW51bWJyYSA9IDAuNTtcbiAgICB0aGlzLnNwb3RMaWdodC5kZWNheSA9IDI7XG4gICAgdGhpcy5zcG90TGlnaHQuZGlzdGFuY2UgPSA2MDAwMDtcbiAgICB0aGlzLnNwb3RMaWdodC5jYXN0U2hhZG93ID0gZmFsc2U7XG4gICAgdGhpcy5zcG90TGlnaHQuaW50ZW5zaXR5ID0gMTA7XG5cbiAgICB0aGlzLnNwb3RMaWdodEhlbHBlciA9IG5ldyBUSFJFRS5TcG90TGlnaHRIZWxwZXIodGhpcy5zcG90TGlnaHQpO1xuICAgIC8vIHNjZW5lLmFkZCh0aGlzLnNwb3RMaWdodEhlbHBlcik7XG5cbiAgICBjb25zdCBzcG90TGlnaHRUYXJnZXQgPSBuZXcgVEhSRUUuT2JqZWN0M0QoKTtcbiAgICB0aGlzLnNwb3RMaWdodC50YXJnZXQgPSBzcG90TGlnaHRUYXJnZXQ7XG5cbiAgICB0aGlzLnNwb3RsaWdodEdyb3VwLmFkZCh0aGlzLnNwb3RMaWdodCk7XG4gICAgdGhpcy5zcG90bGlnaHRHcm91cC5hZGQoc3BvdExpZ2h0VGFyZ2V0KTtcbiAgICB0aGlzLnNwb3RMaWdodC5wb3NpdGlvbi5zZXQoMCwgLTEuNCwgMCk7XG4gICAgc3BvdExpZ2h0VGFyZ2V0LnBvc2l0aW9uLnNldCgwLCAtMTAsIDApO1xuXG4gICAgLy8gQWRkIHRoZSBwb2ludCBsaWdodCBmb3IgdGhlIHN1cnJvdW5kaW5nIGxpZ2h0XG4gICAgdGhpcy5wb2ludExpZ2h0ID0gbmV3IFRIUkVFLlBvaW50TGlnaHQoMHhmZmZmZmYsIDIsIDEwMDApO1xuICAgIHRoaXMuc3BvdGxpZ2h0R3JvdXAuYWRkKHRoaXMucG9pbnRMaWdodCk7XG4gICAgdGhpcy5wb2ludExpZ2h0LnBvc2l0aW9uLnNldCgwLCAtMS40LCAwKTtcblxuICAgIC8vIEFkZCB0aGUgbGlnaHQgYmVhbVxuICAgIHRoaXMuY3JlYXRlU3BvdExpZ2h0QmVhbSgpO1xuXG4gICAgdGhpcy5oZWFkR3JvdXAuYWRkKHRoaXMuc3BvdGxpZ2h0R3JvdXApO1xuXG4gICAgLy8gQWRkIHRoZSBhcm1cbiAgICB0aGlzLmFybUdyb3VwLmFkZCh0aGlzLmhlYWRHcm91cCk7XG4gICAgdGhpcy5oZWFkR3JvdXAucG9zaXRpb24uc2V0KDAsIC0wLjYsIDApO1xuICAgIHRoaXMuYXJtR3JvdXAuYWRkKHRoaXMuYXJtKTtcblxuICAgIC8vIEFkZCB0aGUgc29ja2V0XG4gICAgdGhpcy5vYmplY3RHcm91cC5hZGQodGhpcy5hcm1Hcm91cCk7XG4gICAgdGhpcy5vYmplY3RHcm91cC5hZGQodGhpcy5zb2NrZXQpO1xuICAgIHRoaXMuc29ja2V0LnBvc2l0aW9uLnNldCgwLCAxLjIsIDApO1xuXG4gICAgLy8gQSBtb3ZpbmcgaGVhZCBoYXMgYWJvdXQgMzIgY20gaW4gd2lkdGhcbiAgICB0aGlzLm9iamVjdEdyb3VwLnNjYWxlLm11bHRpcGx5U2NhbGFyKDkpO1xuXG4gICAgdGhpcy5zY2VuZS5hZGQodGhpcy5vYmplY3RHcm91cCk7XG5cbiAgICB0aGlzLmlzTG9hZGVkID0gdHJ1ZTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKGZpeHR1cmVTZXJ2aWNlOiBGaXh0dXJlU2VydmljZSwgcHJldmlld01lc2hTZXJ2aWNlOiBQcmV2aWV3TWVzaFNlcnZpY2UsIGZpeHR1cmU6IENhY2hlZEZpeHR1cmUsIHNjZW5lOiBhbnkpIHtcbiAgICBzdXBlcihmaXh0dXJlU2VydmljZSwgZml4dHVyZSwgc2NlbmUpO1xuXG4gICAgZm9ya0pvaW4oW1xuICAgICAgcHJldmlld01lc2hTZXJ2aWNlLmdldE1lc2goJ21vdmluZ19oZWFkX3NvY2tldCcpLFxuICAgICAgcHJldmlld01lc2hTZXJ2aWNlLmdldE1lc2goJ21vdmluZ19oZWFkX2FybScpLFxuICAgICAgcHJldmlld01lc2hTZXJ2aWNlLmdldE1lc2goJ21vdmluZ19oZWFkX2hlYWQnKSxcbiAgICBdKVxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcCgoW3NvY2tldCwgYXJtLCBoZWFkXSkgPT4ge1xuICAgICAgICAgIHRoaXMuc29ja2V0ID0gc29ja2V0O1xuICAgICAgICAgIHRoaXMuYXJtID0gYXJtO1xuICAgICAgICAgIHRoaXMuaGVhZCA9IGhlYWQ7XG5cbiAgICAgICAgICB0aGlzLmNyZWF0ZU9iamVjdHMoKTtcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRPYmplY3QoKTogVEhSRUUuT2JqZWN0M0Qge1xuICAgIHJldHVybiB0aGlzLm9iamVjdEdyb3VwO1xuICB9XG5cbiAgcHVibGljIHVwZGF0ZVByZXZpZXcoY2hhbm5lbFZhbHVlczogRml4dHVyZUNoYW5uZWxWYWx1ZVtdLCBtYXN0ZXJEaW1tZXJWYWx1ZTogbnVtYmVyKTogdm9pZCB7XG4gICAgc3VwZXIudXBkYXRlUHJldmlldyhjaGFubmVsVmFsdWVzLCBtYXN0ZXJEaW1tZXJWYWx1ZSk7XG5cbiAgICBpZiAoIXRoaXMuaXNMb2FkZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBBcHBseSBkZWZhdWx0IHNldHRpbmdzXG4gICAgbGV0IHBhblN0YXJ0ID0gMDtcbiAgICBsZXQgcGFuRW5kID0gMjU1O1xuXG4gICAgbGV0IHRpbHRTdGFydCA9IDA7XG4gICAgbGV0IHRpbHRFbmQgPSAyNTU7XG5cbiAgICB0aGlzLnBhbiA9IDA7XG4gICAgdGhpcy50aWx0ID0gMDtcblxuICAgIC8vIEFwcGx5IHRoZSBrbm93biBwcm9wZXJ0eSB2YWx1ZXNcbiAgICBmb3IgKGNvbnN0IGNoYW5uZWxWYWx1ZSBvZiBjaGFubmVsVmFsdWVzKSB7XG4gICAgICBjb25zdCBjaGFubmVsID0gdGhpcy5maXh0dXJlU2VydmljZS5nZXRDaGFubmVsQnlOYW1lKHRoaXMuZml4dHVyZSwgY2hhbm5lbFZhbHVlLmNoYW5uZWxOYW1lKTtcbiAgICAgIGNvbnN0IGNhcGFiaWxpdHkgPSB0aGlzLmdldENhcGFiaWxpdHlJblZhbHVlKGNoYW5uZWwsIGNoYW5uZWxWYWx1ZS52YWx1ZSk7XG4gICAgICBpZiAoY2FwYWJpbGl0eSkge1xuICAgICAgICBzd2l0Y2ggKGNhcGFiaWxpdHkuY2FwYWJpbGl0eS50eXBlKSB7XG4gICAgICAgICAgY2FzZSBGaXh0dXJlQ2FwYWJpbGl0eVR5cGUuUGFuOiB7XG4gICAgICAgICAgICBwYW5TdGFydCA9IHRoaXMuZml4dHVyZVNlcnZpY2UuZ2V0Um90YXRpb25BbmdsZURlZyhjYXBhYmlsaXR5LmNhcGFiaWxpdHkuYW5nbGVTdGFydCkgfHwgMDtcbiAgICAgICAgICAgIHBhbkVuZCA9IHRoaXMuZml4dHVyZVNlcnZpY2UuZ2V0Um90YXRpb25BbmdsZURlZyhjYXBhYmlsaXR5LmNhcGFiaWxpdHkuYW5nbGVFbmQpIHx8IDU0MDtcbiAgICAgICAgICAgIHRoaXMucGFuID0gY2hhbm5lbFZhbHVlLnZhbHVlIC8gY2hhbm5lbC5tYXhWYWx1ZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlIEZpeHR1cmVDYXBhYmlsaXR5VHlwZS5UaWx0OiB7XG4gICAgICAgICAgICB0aWx0U3RhcnQgPSB0aGlzLmZpeHR1cmVTZXJ2aWNlLmdldFJvdGF0aW9uQW5nbGVEZWcoY2FwYWJpbGl0eS5jYXBhYmlsaXR5LmFuZ2xlU3RhcnQpIHx8IDA7XG4gICAgICAgICAgICB0aWx0RW5kID0gdGhpcy5maXh0dXJlU2VydmljZS5nZXRSb3RhdGlvbkFuZ2xlRGVnKGNhcGFiaWxpdHkuY2FwYWJpbGl0eS5hbmdsZUVuZCkgfHwgMjcwMDtcbiAgICAgICAgICAgIHRoaXMudGlsdCA9IGNoYW5uZWxWYWx1ZS52YWx1ZSAvIGNoYW5uZWwubWF4VmFsdWU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnVwZGF0ZVBvc2l0aW9uKHRoaXMub2JqZWN0R3JvdXApO1xuXG4gICAgLy8gY2FsY3VsYXRlIHRoZSB5L3ggcm90YXRpb24gaW4gcmFkaWFudHMgYmFzZWQgb24gcGFuL3RpbHQgKDAtMSkgcmVzcGVjdGluZyB0aGUgbWF4IHBhbi90aWx0XG4gICAgdGhpcy5hcm1Hcm91cC5yb3RhdGlvbi55ID0gVEhSRUUuTWF0aC5kZWdUb1JhZChwYW5FbmQgKiB0aGlzLnBhbiArIHBhblN0YXJ0KSAtIFRIUkVFLk1hdGguZGVnVG9SYWQocGFuRW5kIC8gMik7XG4gICAgdGhpcy5oZWFkR3JvdXAucm90YXRpb24ueCA9IFRIUkVFLk1hdGguZGVnVG9SYWQodGlsdEVuZCAqIHRoaXMudGlsdCArIHRpbHRTdGFydCkgLSBUSFJFRS5NYXRoLmRlZ1RvUmFkKHRpbHRFbmQgLyAyKTtcblxuICAgIC8vIFVwZGF0ZSB0aGUgYW5nbGUgKG9ubHkgb24gY2hhbmdlLCBiZWNhdXNlIGl0J3MgZXhwZW5zaXZlKVxuICAgIC8vIFRPRE8gdXBkYXRlIHRoZSBjb3JyZWN0IGFuZ2xlIGZyb20gdGhlIHByb2ZpbGVcbiAgICBjb25zdCBiZWFtQW5nbGVEcmVncmVlcyA9IDE0O1xuICAgIGlmICh0aGlzLmxhc3RCZWFtQW5nbGVEZWdyZWVzICE9PSBiZWFtQW5nbGVEcmVncmVlcykge1xuICAgICAgdGhpcy5zcG90TGlnaHQuYW5nbGUgPSBUSFJFRS5NYXRoLmRlZ1RvUmFkKGJlYW1BbmdsZURyZWdyZWVzKTtcbiAgICAgIHRoaXMuY3JlYXRlU3BvdExpZ2h0QmVhbSgpO1xuICAgICAgdGhpcy5sYXN0QmVhbUFuZ2xlRGVncmVlcyA9IGJlYW1BbmdsZURyZWdyZWVzO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSB0aGUgbWF0ZXJpYWxcbiAgICBpZiAodGhpcy5sYXN0U2VsZWN0ZWQgIT09IHRoaXMuaXNTZWxlY3RlZCkge1xuICAgICAgaWYgKHRoaXMuaXNTZWxlY3RlZCkge1xuICAgICAgICB0aGlzLnNvY2tldC5tYXRlcmlhbCA9IHRoaXMuc2VsZWN0ZWRNYXRlcmlhbDtcbiAgICAgICAgdGhpcy5hcm0ubWF0ZXJpYWwgPSB0aGlzLnNlbGVjdGVkTWF0ZXJpYWw7XG4gICAgICAgIHRoaXMuaGVhZC5tYXRlcmlhbCA9IHRoaXMuc2VsZWN0ZWRNYXRlcmlhbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc29ja2V0Lm1hdGVyaWFsID0gdGhpcy5tYXRlcmlhbDtcbiAgICAgICAgdGhpcy5hcm0ubWF0ZXJpYWwgPSB0aGlzLm1hdGVyaWFsO1xuICAgICAgICB0aGlzLmhlYWQubWF0ZXJpYWwgPSB0aGlzLm1hdGVyaWFsO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmxhc3RTZWxlY3RlZCA9IHRoaXMuaXNTZWxlY3RlZDtcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgdGhlIGxpZ2h0IGhlbHBlcnNcbiAgICB0aGlzLnNwb3RMaWdodEhlbHBlci51cGRhdGUoKTtcblxuICAgIC8vIEFwcGx5IHRoZSBjb2xvcnNcbiAgICBjb25zdCBjb2xvciA9IG5ldyBUSFJFRS5Db2xvcigncmdiKCcgKyB0aGlzLmNvbG9yUmVkICsgJywgJyArIHRoaXMuY29sb3JHcmVlbiArICcsICcgKyB0aGlzLmNvbG9yQmx1ZSArICcpJyk7XG5cbiAgICB0aGlzLnBvaW50TGlnaHQuY29sb3IgPSBjb2xvcjtcblxuICAgIHRoaXMuc3BvdExpZ2h0LmNvbG9yID0gY29sb3I7XG4gICAgKHRoaXMuc3BvdExpZ2h0QmVhbS5tYXRlcmlhbCBhcyBhbnkpLnVuaWZvcm1zLmdsb3dDb2xvci52YWx1ZSA9IGNvbG9yO1xuXG4gICAgLy8gQXBwbHkgdGhlIGRpbW1lciB2YWx1ZVxuICAgIC8vIFRha2UgdGhlIGNvbG9yIGludG8gYWNjb3VudCBmb3IgdGhlIGJlYW0gKGRvbid0IHNob3cgYSBibGFjayBiZWFtKVxuICAgIGNvbnN0IGludGVuc2l0eUNvbG9yID0gTWF0aC5tYXgodGhpcy5jb2xvclJlZCwgdGhpcy5jb2xvckdyZWVuLCB0aGlzLmNvbG9yQmx1ZSk7XG4gICAgKHRoaXMuc3BvdExpZ2h0QmVhbS5tYXRlcmlhbCBhcyBhbnkpLnVuaWZvcm1zLm9wYWNpdHkudmFsdWUgPSBNYXRoLm1pbihpbnRlbnNpdHlDb2xvciwgdGhpcy5kaW1tZXIpO1xuXG4gICAgdGhpcy5zcG90TGlnaHQuaW50ZW5zaXR5ID0gdGhpcy5zcG90TGlnaHRMaWdodE1heEludGVuc2l0eSAqIHRoaXMuZGltbWVyO1xuICAgIHRoaXMucG9pbnRMaWdodC5pbnRlbnNpdHkgPSB0aGlzLnBvaW50TGlnaHRNYXhJbnRlbnNpdHkgKiB0aGlzLmRpbW1lcjtcblxuICAgIC8vIHRoaXMuc3BvdExpZ2h0QmVhbS5tYXRlcmlhbC51bmlmb3Jtcy52aWV3VmVjdG9yLnZhbHVlID1cbiAgICAvLyAgICAgbmV3IFRIUkVFLlZlY3RvcjMoKS5zdWJWZWN0b3JzKHRoaXMuY2FtZXJhLnBvc2l0aW9uLCB0aGlzLnNwb3RMaWdodEJlYW0ucG9zaXRpb24pO1xuICB9XG5cbiAgZGVzdHJveSgpIHtcbiAgICB0aGlzLnNjZW5lLnJlbW92ZSh0aGlzLm9iamVjdEdyb3VwKTtcbiAgICB0aGlzLm1hdGVyaWFsLmRpc3Bvc2UoKTtcbiAgICB0aGlzLmF0bW9zcGhlcmVNYXRlcmlhbC5kaXNwb3NlKCk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -1,280 +0,0 @@
|
|
|
1
|
-
import { __decorate, __metadata, __values } from "tslib";
|
|
2
|
-
import { Component, ElementRef, HostListener, ViewChild } from '@angular/core';
|
|
3
|
-
import * as THREE from 'three';
|
|
4
|
-
import STATS from 'three/examples/js/libs/stats.min';
|
|
5
|
-
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls';
|
|
6
|
-
import { FixtureCategory } from '../models/fixture-profile';
|
|
7
|
-
import { FixtureService } from '../services/fixture.service';
|
|
8
|
-
import { PreviewMeshService } from '../services/preview-mesh.service';
|
|
9
|
-
import { PreviewService } from '../services/preview.service';
|
|
10
|
-
import { ProjectService } from '../services/project.service';
|
|
11
|
-
import { TimelineService } from '../services/timeline.service';
|
|
12
|
-
import { Positioning } from './../models/fixture';
|
|
13
|
-
import { AnimationService } from './../services/animation.service';
|
|
14
|
-
import { ColorChanger3d } from './models/color-changer-3d';
|
|
15
|
-
import { MovingHead3d } from './models/moving-head-3d';
|
|
16
|
-
var PreviewComponent = /** @class */ (function () {
|
|
17
|
-
function PreviewComponent(fixtureService, previewMeshService, animationService, previewService, timelineService, projectService) {
|
|
18
|
-
var _this = this;
|
|
19
|
-
this.fixtureService = fixtureService;
|
|
20
|
-
this.previewMeshService = previewMeshService;
|
|
21
|
-
this.animationService = animationService;
|
|
22
|
-
this.previewService = previewService;
|
|
23
|
-
this.timelineService = timelineService;
|
|
24
|
-
this.projectService = projectService;
|
|
25
|
-
this.stats = STATS();
|
|
26
|
-
// private rendererStats = new THREEx.RendererStats();
|
|
27
|
-
this.fixtures3d = [];
|
|
28
|
-
this.previewService.doUpdateFixtureSetup.subscribe(function () {
|
|
29
|
-
// synchronize the 3d-fixtures to the project fixtures
|
|
30
|
-
_this.syncFixtures();
|
|
31
|
-
});
|
|
32
|
-
}
|
|
33
|
-
PreviewComponent.prototype.syncFixtures = function () {
|
|
34
|
-
var e_1, _a, e_2, _b;
|
|
35
|
-
try {
|
|
36
|
-
// remove all fixtures
|
|
37
|
-
for (var _c = __values(this.fixtures3d), _d = _c.next(); !_d.done; _d = _c.next()) {
|
|
38
|
-
var fixture3d = _d.value;
|
|
39
|
-
fixture3d.destroy();
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
43
|
-
finally {
|
|
44
|
-
try {
|
|
45
|
-
if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
|
|
46
|
-
}
|
|
47
|
-
finally { if (e_1) throw e_1.error; }
|
|
48
|
-
}
|
|
49
|
-
this.fixtures3d = [];
|
|
50
|
-
try {
|
|
51
|
-
// add all fixtures from the project
|
|
52
|
-
for (var _e = __values(this.fixtureService.cachedFixtures), _f = _e.next(); !_f.done; _f = _e.next()) {
|
|
53
|
-
var fixture = _f.value;
|
|
54
|
-
switch (fixture.profile.categories[0]) {
|
|
55
|
-
case FixtureCategory['Moving Head']:
|
|
56
|
-
this.fixtures3d.push(new MovingHead3d(this.fixtureService, this.previewMeshService, fixture, this.scene));
|
|
57
|
-
break;
|
|
58
|
-
case FixtureCategory['Color Changer']:
|
|
59
|
-
this.fixtures3d.push(new ColorChanger3d(this.fixtureService, this.previewMeshService, fixture, this.scene));
|
|
60
|
-
break;
|
|
61
|
-
case FixtureCategory['Blinder']:
|
|
62
|
-
this.fixtures3d.push(new ColorChanger3d(this.fixtureService, this.previewMeshService, fixture, this.scene));
|
|
63
|
-
break;
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
catch (e_2_1) { e_2 = { error: e_2_1 }; }
|
|
68
|
-
finally {
|
|
69
|
-
try {
|
|
70
|
-
if (_f && !_f.done && (_b = _e.return)) _b.call(_e);
|
|
71
|
-
}
|
|
72
|
-
finally { if (e_2) throw e_2.error; }
|
|
73
|
-
}
|
|
74
|
-
};
|
|
75
|
-
Object.defineProperty(PreviewComponent.prototype, "canvas", {
|
|
76
|
-
get: function () {
|
|
77
|
-
return this.canvasRef.nativeElement;
|
|
78
|
-
},
|
|
79
|
-
enumerable: true,
|
|
80
|
-
configurable: true
|
|
81
|
-
});
|
|
82
|
-
PreviewComponent.prototype.render = function () {
|
|
83
|
-
this.renderer.render(this.scene, this.camera);
|
|
84
|
-
};
|
|
85
|
-
PreviewComponent.prototype.updateStagePosition = function (positioning, xMin, xMax, yMin, yMax, zMin, zMax) {
|
|
86
|
-
var positionCount = 0; // Number of fixtures in the same position
|
|
87
|
-
var positionIndex = 1;
|
|
88
|
-
this.projectService.project.fixtures.forEach(function (element, index) {
|
|
89
|
-
if (element.positioning === positioning) {
|
|
90
|
-
positionCount++;
|
|
91
|
-
}
|
|
92
|
-
});
|
|
93
|
-
this.projectService.project.fixtures.forEach(function (element, index) {
|
|
94
|
-
if (element.positioning === positioning) {
|
|
95
|
-
element.positionX = xMin + ((xMax - xMin) / (positionCount + 1)) * positionIndex;
|
|
96
|
-
element.positionY = yMin + ((yMax - yMin) / (positionCount + 1)) * positionIndex;
|
|
97
|
-
element.positionZ = zMin + ((zMax - zMin) / (positionCount + 1)) * positionIndex;
|
|
98
|
-
positionIndex++;
|
|
99
|
-
}
|
|
100
|
-
});
|
|
101
|
-
};
|
|
102
|
-
PreviewComponent.prototype.animate = function (timeMillis) {
|
|
103
|
-
var e_3, _a;
|
|
104
|
-
this.stats.begin();
|
|
105
|
-
if (this.timelineService.playState === 'playing') {
|
|
106
|
-
// Overwrite the current time with the playing time, if we're in playback mode
|
|
107
|
-
timeMillis = this.timelineService.waveSurfer.getCurrentTime() * 1000;
|
|
108
|
-
}
|
|
109
|
-
this.animationService.timeMillis = timeMillis;
|
|
110
|
-
// Update the controls
|
|
111
|
-
if (this.controls) {
|
|
112
|
-
this.controls.update();
|
|
113
|
-
}
|
|
114
|
-
// Update the positions
|
|
115
|
-
this.updateStagePosition(Positioning.topFront, -this.projectService.project.stageWidthCm / 2, this.projectService.project.stageWidthCm / 2, this.projectService.project.stageHeightCm + this.projectService.project.stageFloorHeightCm, this.projectService.project.stageHeightCm + this.projectService.project.stageFloorHeightCm, this.projectService.project.stageDepthCm / 2 - 70, this.projectService.project.stageDepthCm / 2 - 70);
|
|
116
|
-
this.updateStagePosition(Positioning.bottomFront, -this.projectService.project.stageWidthCm / 2, this.projectService.project.stageWidthCm / 2, this.projectService.project.stageFloorHeightCm, this.projectService.project.stageFloorHeightCm, this.projectService.project.stageDepthCm / 2 - 70, this.projectService.project.stageDepthCm / 2 - 70);
|
|
117
|
-
this.updateStagePosition(Positioning.topBack, -this.projectService.project.stageWidthCm / 2, this.projectService.project.stageWidthCm / 2, this.projectService.project.stageHeightCm + this.projectService.project.stageFloorHeightCm, this.projectService.project.stageHeightCm + this.projectService.project.stageFloorHeightCm, -this.projectService.project.stageDepthCm / 2 + 70, -this.projectService.project.stageDepthCm / 2 + 70);
|
|
118
|
-
this.updateStagePosition(Positioning.bottomBack, -this.projectService.project.stageWidthCm / 2, this.projectService.project.stageWidthCm / 2, this.projectService.project.stageFloorHeightCm, this.projectService.project.stageFloorHeightCm, -this.projectService.project.stageDepthCm / 2 + 70, -this.projectService.project.stageDepthCm / 2 + 70);
|
|
119
|
-
// Update all fixtures and apply the preview properties, if available
|
|
120
|
-
// TODO Update the fixtures only e.g. 40 times per second according to the "real" refresh rate of the DMX interface?
|
|
121
|
-
var presets = this.previewService.getPresets(timeMillis);
|
|
122
|
-
var calculatedFixtures = this.previewService.getChannelValues(timeMillis, presets);
|
|
123
|
-
try {
|
|
124
|
-
for (var _b = __values(this.fixtures3d), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
125
|
-
var fixture3d = _c.value;
|
|
126
|
-
// Update the fixture properties
|
|
127
|
-
fixture3d.updatePreview(calculatedFixtures.get(fixture3d.fixture) || [], this.projectService.project.masterDimmerValue);
|
|
128
|
-
// Select the fixture, if required
|
|
129
|
-
if (this.fixtureService.settingsSelection) {
|
|
130
|
-
fixture3d.isSelected = this.fixtureService.settingsFixtureIsSelected(fixture3d.fixture.fixture);
|
|
131
|
-
}
|
|
132
|
-
else {
|
|
133
|
-
fixture3d.isSelected = this.previewService.fixtureIsSelected(fixture3d.fixture.fixture.uuid, presets);
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
catch (e_3_1) { e_3 = { error: e_3_1 }; }
|
|
138
|
-
finally {
|
|
139
|
-
try {
|
|
140
|
-
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
|
141
|
-
}
|
|
142
|
-
finally { if (e_3) throw e_3.error; }
|
|
143
|
-
}
|
|
144
|
-
// TODO enable for monitoring the DMX universes
|
|
145
|
-
this.previewService.setUniverseValues(calculatedFixtures, this.projectService.project.masterDimmerValue);
|
|
146
|
-
// Update the statistics
|
|
147
|
-
// this.rendererStats.update(this.renderer);
|
|
148
|
-
// Render the scene
|
|
149
|
-
this.render();
|
|
150
|
-
this.stats.end();
|
|
151
|
-
requestAnimationFrame(this.animate.bind(this));
|
|
152
|
-
};
|
|
153
|
-
PreviewComponent.prototype.getAspectRatio = function () {
|
|
154
|
-
var height = this.canvas.clientHeight;
|
|
155
|
-
if (height === 0) {
|
|
156
|
-
return 0;
|
|
157
|
-
}
|
|
158
|
-
return this.canvas.clientWidth / this.canvas.clientHeight;
|
|
159
|
-
};
|
|
160
|
-
PreviewComponent.prototype.onResize = function () {
|
|
161
|
-
this.camera.aspect = this.getAspectRatio();
|
|
162
|
-
this.camera.updateProjectionMatrix();
|
|
163
|
-
this.renderer.setSize(this.canvas.clientWidth, this.canvas.clientHeight);
|
|
164
|
-
};
|
|
165
|
-
PreviewComponent.prototype.setupRenderer = function () {
|
|
166
|
-
this.renderer = new THREE.WebGLRenderer({ antialias: true });
|
|
167
|
-
this.canvas.appendChild(this.renderer.domElement);
|
|
168
|
-
this.renderer.setPixelRatio(devicePixelRatio);
|
|
169
|
-
this.renderer.setSize(this.canvas.clientWidth, this.canvas.clientHeight);
|
|
170
|
-
this.renderer.shadowMap.enabled = false;
|
|
171
|
-
this.renderer.gammaInput = true;
|
|
172
|
-
this.renderer.gammaOutput = true;
|
|
173
|
-
};
|
|
174
|
-
PreviewComponent.prototype.setupCamera = function () {
|
|
175
|
-
this.camera = new THREE.PerspectiveCamera(35, window.innerWidth / window.innerHeight, 1, 10000);
|
|
176
|
-
this.camera.position.set(-600, 80, 700);
|
|
177
|
-
};
|
|
178
|
-
PreviewComponent.prototype.setupControls = function () {
|
|
179
|
-
this.controls = new OrbitControls(this.camera, this.renderer.domElement);
|
|
180
|
-
this.controls.enableKeys = false;
|
|
181
|
-
this.controls.rotateSpeed = 0.05;
|
|
182
|
-
this.controls.zoomSpeed = 1.2;
|
|
183
|
-
this.controls.enableDamping = true;
|
|
184
|
-
this.controls.dampingFactor = 0.25;
|
|
185
|
-
this.controls.screenSpacePanning = false;
|
|
186
|
-
this.controls.minDistance = 700;
|
|
187
|
-
// this.controls.zoom = 1000;
|
|
188
|
-
this.controls.maxDistance = 2000;
|
|
189
|
-
this.controls.maxPolarAngle = Math.PI / 2;
|
|
190
|
-
this.controls.target = new THREE.Vector3(0, 200, 0);
|
|
191
|
-
// this.controls.rotation = 100;
|
|
192
|
-
};
|
|
193
|
-
PreviewComponent.prototype.setupFloor = function () {
|
|
194
|
-
var width = 4000;
|
|
195
|
-
var height = 1;
|
|
196
|
-
var geometry = new THREE.BoxGeometry(width, height, width);
|
|
197
|
-
var material = new THREE.MeshStandardMaterial({ color: 0x0d0d0d });
|
|
198
|
-
var floor = new THREE.Mesh(geometry.clone(), material);
|
|
199
|
-
floor.receiveShadow = false;
|
|
200
|
-
floor.castShadow = false;
|
|
201
|
-
floor.position.set(0, -height / 2, 0);
|
|
202
|
-
this.scene.add(floor);
|
|
203
|
-
};
|
|
204
|
-
PreviewComponent.prototype.setupStats = function () {
|
|
205
|
-
// this.rendererStats.domElement.style.position = 'absolute';
|
|
206
|
-
// this.rendererStats.domElement.style.left = '0px';
|
|
207
|
-
// this.rendererStats.domElement.style.bottom = '0px';
|
|
208
|
-
// this.canvas.appendChild(this.rendererStats.domElement);
|
|
209
|
-
this.stats.domElement.style.position = 'absolute';
|
|
210
|
-
this.stats.domElement.style.left = '0px';
|
|
211
|
-
this.canvas.appendChild(this.stats.domElement);
|
|
212
|
-
};
|
|
213
|
-
PreviewComponent.prototype.setupScene = function () {
|
|
214
|
-
// Create a new scene
|
|
215
|
-
this.scene = new THREE.Scene();
|
|
216
|
-
this.previewService.scene = this.scene;
|
|
217
|
-
// Add a little bit of ambient light
|
|
218
|
-
var ambient = new THREE.AmbientLight(0xffffff, 0.8);
|
|
219
|
-
this.scene.add(ambient);
|
|
220
|
-
// Add a floor
|
|
221
|
-
this.setupFloor();
|
|
222
|
-
// Create the stage dimensions
|
|
223
|
-
this.previewService.updateStage();
|
|
224
|
-
// TODO refine. background light in a color of the fixtures?
|
|
225
|
-
var lights = [];
|
|
226
|
-
lights[0] = new THREE.PointLight(0xffffff, 0.5, 0);
|
|
227
|
-
lights[1] = new THREE.PointLight(0xffffff, 0.5, 0);
|
|
228
|
-
lights[2] = new THREE.PointLight(0xffffff, 0.5, 0);
|
|
229
|
-
lights[0].position.set(0, 2000, 0);
|
|
230
|
-
lights[1].position.set(1000, 2000, 1000);
|
|
231
|
-
lights[2].position.set(-1000, -2000, -1000);
|
|
232
|
-
this.scene.add(lights[0]);
|
|
233
|
-
this.scene.add(lights[1]);
|
|
234
|
-
this.scene.add(lights[2]);
|
|
235
|
-
// Create the stats
|
|
236
|
-
this.setupStats();
|
|
237
|
-
};
|
|
238
|
-
PreviewComponent.prototype.ngAfterViewInit = function () {
|
|
239
|
-
this.setupRenderer();
|
|
240
|
-
this.setupCamera();
|
|
241
|
-
this.setupControls();
|
|
242
|
-
this.setupScene();
|
|
243
|
-
this.onResize();
|
|
244
|
-
this.animate(null);
|
|
245
|
-
};
|
|
246
|
-
PreviewComponent.ctorParameters = function () { return [
|
|
247
|
-
{ type: FixtureService },
|
|
248
|
-
{ type: PreviewMeshService },
|
|
249
|
-
{ type: AnimationService },
|
|
250
|
-
{ type: PreviewService },
|
|
251
|
-
{ type: TimelineService },
|
|
252
|
-
{ type: ProjectService }
|
|
253
|
-
]; };
|
|
254
|
-
__decorate([
|
|
255
|
-
ViewChild('canvas'),
|
|
256
|
-
__metadata("design:type", ElementRef)
|
|
257
|
-
], PreviewComponent.prototype, "canvasRef", void 0);
|
|
258
|
-
__decorate([
|
|
259
|
-
HostListener('window:resize'),
|
|
260
|
-
__metadata("design:type", Function),
|
|
261
|
-
__metadata("design:paramtypes", []),
|
|
262
|
-
__metadata("design:returntype", void 0)
|
|
263
|
-
], PreviewComponent.prototype, "onResize", null);
|
|
264
|
-
PreviewComponent = __decorate([
|
|
265
|
-
Component({
|
|
266
|
-
selector: 'lib-app-preview',
|
|
267
|
-
template: "<div class=\"h-100\" #canvas style=\"overflow: hidden\"></div>\n",
|
|
268
|
-
styles: [""]
|
|
269
|
-
}),
|
|
270
|
-
__metadata("design:paramtypes", [FixtureService,
|
|
271
|
-
PreviewMeshService,
|
|
272
|
-
AnimationService,
|
|
273
|
-
PreviewService,
|
|
274
|
-
TimelineService,
|
|
275
|
-
ProjectService])
|
|
276
|
-
], PreviewComponent);
|
|
277
|
-
return PreviewComponent;
|
|
278
|
-
}());
|
|
279
|
-
export { PreviewComponent };
|
|
280
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJldmlldy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Acm9ja2V0c2hvdy9kZXNpZ25lci8iLCJzb3VyY2VzIjpbImxpYi9wcmV2aWV3L3ByZXZpZXcuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQWlCLFNBQVMsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM5RixPQUFPLEtBQUssS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMvQixPQUFPLEtBQUssTUFBTSxrQ0FBa0MsQ0FBQztBQUNyRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDMUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzVELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUN0RSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDN0QsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzdELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDbEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDbkUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRTNELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQU92RDtJQWNFLDBCQUNVLGNBQThCLEVBQzlCLGtCQUFzQyxFQUN0QyxnQkFBa0MsRUFDbEMsY0FBOEIsRUFDOUIsZUFBZ0MsRUFDaEMsY0FBOEI7UUFOeEMsaUJBWUM7UUFYUyxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFD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QUFDLENBQUM7UUFDMUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFMUIsbUJBQW1CO1FBQ25CLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUNwQixDQUFDO0lBRUQsMENBQWUsR0FBZjtRQUNFLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDbkIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUVsQixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDaEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNyQixDQUFDOztnQkFqUnlCLGNBQWM7Z0JBQ1Ysa0JBQWtCO2dCQUNwQixnQkFBZ0I7Z0JBQ2xCLGNBQWM7Z0JBQ2IsZUFBZTtnQkFDaEIsY0FBYzs7SUFSeEM7UUFEQyxTQUFTLENBQUMsUUFBUSxDQUFDO2tDQUNELFVBQVU7dURBQUM7SUE0SzlCO1FBREMsWUFBWSxDQUFDLGVBQWUsQ0FBQzs7OztvREFLN0I7SUE1TFUsZ0JBQWdCO1FBTDVCLFNBQVMsQ0FBQztZQUNULFFBQVEsRUFBRSxpQkFBaUI7WUFDM0IsNEVBQXVDOztTQUV4QyxDQUFDO3lDQWdCMEIsY0FBYztZQUNWLGtCQUFrQjtZQUNwQixnQkFBZ0I7WUFDbEIsY0FBYztZQUNiLGVBQWU7WUFDaEIsY0FBYztPQXBCN0IsZ0JBQWdCLENBaVM1QjtJQUFELHVCQUFDO0NBQUEsQUFqU0QsSUFpU0M7U0FqU1ksZ0JBQWdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBIb3N0TGlzdGVuZXIsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0ICogYXMgVEhSRUUgZnJvbSAndGhyZWUnO1xuaW1wb3J0IFNUQVRTIGZyb20gJ3RocmVlL2V4YW1wbGVzL2pzL2xpYnMvc3RhdHMubWluJztcbmltcG9ydCB7IE9yYml0Q29udHJvbHMgfSBmcm9tICd0aHJlZS9leGFtcGxlcy9qc20vY29udHJvbHMvT3JiaXRDb250cm9scyc7XG5pbXBvcnQgeyBGaXh0dXJlQ2F0ZWdvcnkgfSBmcm9tICcuLi9tb2RlbHMvZml4dHVyZS1wcm9maWxlJztcbmltcG9ydCB7IEZpeHR1cmVTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvZml4dHVyZS5zZXJ2aWNlJztcbmltcG9ydCB7IFByZXZpZXdNZXNoU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL3ByZXZpZXctbWVzaC5zZXJ2aWNlJztcbmltcG9ydCB7IFByZXZpZXdTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvcHJldmlldy5zZXJ2aWNlJztcbmltcG9ydCB7IFByb2plY3RTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvcHJvamVjdC5zZXJ2aWNlJztcbmltcG9ydCB7IFRpbWVsaW5lU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL3RpbWVsaW5lLnNlcnZpY2UnO1xuaW1wb3J0IHsgUG9zaXRpb25pbmcgfSBmcm9tICcuLy4uL21vZGVscy9maXh0dXJlJztcbmltcG9ydCB7IEFuaW1hdGlvblNlcnZpY2UgfSBmcm9tICcuLy4uL3NlcnZpY2VzL2FuaW1hdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IENvbG9yQ2hhbmdlcjNkIH0gZnJvbSAnLi9tb2RlbHMvY29sb3ItY2hhbmdlci0zZCc7XG5pbXBvcnQgeyBGaXh0dXJlM2QgfSBmcm9tICcuL21vZGVscy9maXh0dXJlLTNkJztcbmltcG9ydCB7IE1vdmluZ0hlYWQzZCB9IGZyb20gJy4vbW9kZWxzL21vdmluZy1oZWFkLTNkJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbGliLWFwcC1wcmV2aWV3JyxcbiAgdGVtcGxhdGVVcmw6ICcuL3ByZXZpZXcuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9wcmV2aWV3LmNvbXBvbmVudC5jc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgUHJldmlld0NvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQge1xuICBwcml2YXRlIHJlbmRlcmVyOiBUSFJFRS5XZWJHTFJlbmRlcmVyO1xuICBwcml2YXRlIHNjZW5lOiBUSFJFRS5TY2VuZTtcbiAgcHJpdmF0ZSBjYW1lcmE6IFRIUkVFLlBlcnNwZWN0aXZlQ2FtZXJhO1xuICBwdWJsaWMgY29udHJvbHM6IE9yYml0Q29udHJvbHM7XG5cbiAgcHJpdmF0ZSBzdGF0czogYW55ID0gU1RBVFMoKTtcbiAgLy8gcHJpdmF0ZSByZW5kZXJlclN0YXRzID0gbmV3IFRIUkVFeC5SZW5kZXJlclN0YXRzKCk7XG5cbiAgcHJpdmF0ZSBmaXh0dXJlczNkOiBGaXh0dXJlM2RbXSA9IFtdO1xuXG4gIEBWaWV3Q2hpbGQoJ2NhbnZhcycpXG4gIHByaXZhdGUgY2FudmFzUmVmOiBFbGVtZW50UmVmO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgZml4dHVyZVNlcnZpY2U6IEZpeHR1cmVTZXJ2aWNlLFxuICAgIHByaXZhdGUgcHJldmlld01lc2hTZXJ2aWNlOiBQcmV2aWV3TWVzaFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBhbmltYXRpb25TZXJ2aWNlOiBBbmltYXRpb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgcHJldmlld1NlcnZpY2U6IFByZXZpZXdTZXJ2aWNlLFxuICAgIHByaXZhdGUgdGltZWxpbmVTZXJ2aWNlOiBUaW1lbGluZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBwcm9qZWN0U2VydmljZTogUHJvamVjdFNlcnZpY2VcbiAgKSB7XG4gICAgdGhpcy5wcmV2aWV3U2VydmljZS5kb1VwZGF0ZUZpeHR1cmVTZXR1cC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgLy8gc3luY2hyb25pemUgdGhlIDNkLWZpeHR1cmVzIHRvIHRoZSBwcm9qZWN0IGZpeHR1cmVzXG4gICAgICB0aGlzLnN5bmNGaXh0dXJlcygpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzeW5jRml4dHVyZXMoKSB7XG4gICAgLy8gcmVtb3ZlIGFsbCBmaXh0dXJlc1xuICAgIGZvciAoY29uc3QgZml4dHVyZTNkIG9mIHRoaXMuZml4dHVyZXMzZCkge1xuICAgICAgZml4dHVyZTNkLmRlc3Ryb3koKTtcbiAgICB9XG4gICAgdGhpcy5maXh0dXJlczNkID0gW107XG5cbiAgICAvLyBhZGQgYWxsIGZpeHR1cmVzIGZyb20gdGhlIHByb2plY3RcbiAgICBmb3IgKGNvbnN0IGZpeHR1cmUgb2YgdGhpcy5maXh0dXJlU2VydmljZS5jYWNoZWRGaXh0dXJlcykge1xuICAgICAgc3dpdGNoIChmaXh0dXJlLnByb2ZpbGUuY2F0ZWdvcmllc1swXSkge1xuICAgICAgICBjYXNlIEZpeHR1cmVDYXRlZ29yeVsnTW92aW5nIEhlYWQnXTpcbiAgICAgICAgICB0aGlzLmZpeHR1cmVzM2QucHVzaChuZXcgTW92aW5nSGVhZDNkKHRoaXMuZml4dHVyZVNlcnZpY2UsIHRoaXMucHJldmlld01lc2hTZXJ2aWNlLCBmaXh0dXJlLCB0aGlzLnNjZW5lKSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgRml4dHVyZUNhdGVnb3J5WydDb2xvciBDaGFuZ2VyJ106XG4gICAgICAgICAgdGhpcy5maXh0dXJlczNkLnB1c2gobmV3IENvbG9yQ2hhbmdlcjNkKHRoaXMuZml4dHVyZVNlcnZpY2UsIHRoaXMucHJldmlld01lc2hTZXJ2aWNlLCBmaXh0dXJlLCB0aGlzLnNjZW5lKSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgRml4dHVyZUNhdGVnb3J5WydCbGluZGVyJ106XG4gICAgICAgICAgdGhpcy5maXh0dXJlczNkLnB1c2gobmV3IENvbG9yQ2hhbmdlcjNkKHRoaXMuZml4dHVyZVNlcnZpY2UsIHRoaXMucHJldmlld01lc2hTZXJ2aWNlLCBmaXh0dXJlLCB0aGlzLnNjZW5lKSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXQgY2FudmFzKCk6IEhUTUxDYW52YXNFbGVtZW50IHtcbiAgICByZXR1cm4gdGhpcy5jYW52YXNSZWYubmF0aXZlRWxlbWVudDtcbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyKCkge1xuICAgIHRoaXMucmVuZGVyZXIucmVuZGVyKHRoaXMuc2NlbmUsIHRoaXMuY2FtZXJhKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlU3RhZ2VQb3NpdGlvbihcbiAgICBwb3NpdGlvbmluZzogUG9zaXRpb25pbmcsXG4gICAgeE1pbjogbnVtYmVyLFxuICAgIHhNYXg6IG51bWJlcixcbiAgICB5TWluOiBudW1iZXIsXG4gICAgeU1heDogbnVtYmVyLFxuICAgIHpNaW46IG51bWJlcixcbiAgICB6TWF4OiBudW1iZXJcbiAgKSB7XG4gICAgbGV0IHBvc2l0aW9uQ291bnQgPSAwOyAvLyBOdW1iZXIgb2YgZml4dHVyZXMgaW4gdGhlIHNhbWUgcG9zaXRpb25cbiAgICBsZXQgcG9zaXRpb25JbmRleCA9IDE7XG5cbiAgICB0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3QuZml4dHVyZXMuZm9yRWFjaCgoZWxlbWVudCwgaW5kZXgpID0+IHtcbiAgICAgIGlmIChlbGVtZW50LnBvc2l0aW9uaW5nID09PSBwb3NpdGlvbmluZykge1xuICAgICAgICBwb3NpdGlvbkNvdW50Kys7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3QuZml4dHVyZXMuZm9yRWFjaCgoZWxlbWVudCwgaW5kZXgpID0+IHtcbiAgICAgIGlmIChlbGVtZW50LnBvc2l0aW9uaW5nID09PSBwb3NpdGlvbmluZykge1xuICAgICAgICBlbGVtZW50LnBvc2l0aW9uWCA9IHhNaW4gKyAoKHhNYXggLSB4TWluKSAvIChwb3NpdGlvbkNvdW50ICsgMSkpICogcG9zaXRpb25JbmRleDtcbiAgICAgICAgZWxlbWVudC5wb3NpdGlvblkgPSB5TWluICsgKCh5TWF4IC0geU1pbikgLyAocG9zaXRpb25Db3VudCArIDEpKSAqIHBvc2l0aW9uSW5kZXg7XG4gICAgICAgIGVsZW1lbnQucG9zaXRpb25aID0gek1pbiArICgoek1heCAtIHpNaW4pIC8gKHBvc2l0aW9uQ291bnQgKyAxKSkgKiBwb3NpdGlvbkluZGV4O1xuXG4gICAgICAgIHBvc2l0aW9uSW5kZXgrKztcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYW5pbWF0ZSh0aW1lTWlsbGlzOiBudW1iZXIpIHtcbiAgICB0aGlzLnN0YXRzLmJlZ2luKCk7XG5cbiAgICBpZiAodGhpcy50aW1lbGluZVNlcnZpY2UucGxheVN0YXRlID09PSAncGxheWluZycpIHtcbiAgICAgIC8vIE92ZXJ3cml0ZSB0aGUgY3VycmVudCB0aW1lIHdpdGggdGhlIHBsYXlpbmcgdGltZSwgaWYgd2UncmUgaW4gcGxheWJhY2sgbW9kZVxuICAgICAgdGltZU1pbGxpcyA9IHRoaXMudGltZWxpbmVTZXJ2aWNlLndhdmVTdXJmZXIuZ2V0Q3VycmVudFRpbWUoKSAqIDEwMDA7XG4gICAgfVxuXG4gICAgdGhpcy5hbmltYXRpb25TZXJ2aWNlLnRpbWVNaWxsaXMgPSB0aW1lTWlsbGlzO1xuXG4gICAgLy8gVXBkYXRlIHRoZSBjb250cm9sc1xuICAgIGlmICh0aGlzLmNvbnRyb2xzKSB7XG4gICAgICB0aGlzLmNvbnRyb2xzLnVwZGF0ZSgpO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSB0aGUgcG9zaXRpb25zXG4gICAgdGhpcy51cGRhdGVTdGFnZVBvc2l0aW9uKFxuICAgICAgUG9zaXRpb25pbmcudG9wRnJvbnQsXG4gICAgICAtdGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LnN0YWdlV2lkdGhDbSAvIDIsXG4gICAgICB0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3Quc3RhZ2VXaWR0aENtIC8gMixcbiAgICAgIHRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5zdGFnZUhlaWdodENtICsgdGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LnN0YWdlRmxvb3JIZWlnaHRDbSxcbiAgICAgIHRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5zdGFnZUhlaWdodENtICsgdGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LnN0YWdlRmxvb3JIZWlnaHRDbSxcbiAgICAgIHRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5zdGFnZURlcHRoQ20gLyAyIC0gNzAsXG4gICAgICB0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3Quc3RhZ2VEZXB0aENtIC8gMiAtIDcwXG4gICAgKTtcbiAgICB0aGlzLnVwZGF0ZVN0YWdlUG9zaXRpb24oXG4gICAgICBQb3NpdGlvbmluZy5ib3R0b21Gcm9udCxcbiAgICAgIC10aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3Quc3RhZ2VXaWR0aENtIC8gMixcbiAgICAgIHRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5zdGFnZVdpZHRoQ20gLyAyLFxuICAgICAgdGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LnN0YWdlRmxvb3JIZWlnaHRDbSxcbiAgICAgIHRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5zdGFnZUZsb29ySGVpZ2h0Q20sXG4gICAgICB0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3Quc3RhZ2VEZXB0aENtIC8gMiAtIDcwLFxuICAgICAgdGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LnN0YWdlRGVwdGhDbSAvIDIgLSA3MFxuICAgICk7XG4gICAgdGhpcy51cGRhdGVTdGFnZVBvc2l0aW9uKFxuICAgICAgUG9zaXRpb25pbmcudG9wQmFjayxcbiAgICAgIC10aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3Quc3RhZ2VXaWR0aENtIC8gMixcbiAgICAgIHRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5zdGFnZVdpZHRoQ20gLyAyLFxuICAgICAgdGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LnN0YWdlSGVpZ2h0Q20gKyB0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3Quc3RhZ2VGbG9vckhlaWdodENtLFxuICAgICAgdGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LnN0YWdlSGVpZ2h0Q20gKyB0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3Quc3RhZ2VGbG9vckhlaWdodENtLFxuICAgICAgLXRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5zdGFnZURlcHRoQ20gLyAyICsgNzAsXG4gICAgICAtdGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LnN0YWdlRGVwdGhDbSAvIDIgKyA3MFxuICAgICk7XG4gICAgdGhpcy51cGRhdGVTdGFnZVBvc2l0aW9uKFxuICAgICAgUG9zaXRpb25pbmcuYm90dG9tQmFjayxcbiAgICAgIC10aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3Quc3RhZ2VXaWR0aENtIC8gMixcbiAgICAgIHRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5zdGFnZVdpZHRoQ20gLyAyLFxuICAgICAgdGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LnN0YWdlRmxvb3JIZWlnaHRDbSxcbiAgICAgIHRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5zdGFnZUZsb29ySGVpZ2h0Q20sXG4gICAgICAtdGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LnN0YWdlRGVwdGhDbSAvIDIgKyA3MCxcbiAgICAgIC10aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3Quc3RhZ2VEZXB0aENtIC8gMiArIDcwXG4gICAgKTtcblxuICAgIC8vIFVwZGF0ZSBhbGwgZml4dHVyZXMgYW5kIGFwcGx5IHRoZSBwcmV2aWV3IHByb3BlcnRpZXMsIGlmIGF2YWlsYWJsZVxuICAgIC8vIFRPRE8gVXBkYXRlIHRoZSBmaXh0dXJlcyBvbmx5IGUuZy4gNDAgdGltZXMgcGVyIHNlY29uZCBhY2NvcmRpbmcgdG8gdGhlIFwicmVhbFwiIHJlZnJlc2ggcmF0ZSBvZiB0aGUgRE1YIGludGVyZmFjZT9cbiAgICBjb25zdCBwcmVzZXRzID0gdGhpcy5wcmV2aWV3U2VydmljZS5nZXRQcmVzZXRzKHRpbWVNaWxsaXMpO1xuXG4gICAgY29uc3QgY2FsY3VsYXRlZEZpeHR1cmVzID0gdGhpcy5wcmV2aWV3U2VydmljZS5nZXRDaGFubmVsVmFsdWVzKHRpbWVNaWxsaXMsIHByZXNldHMpO1xuXG4gICAgZm9yIChjb25zdCBmaXh0dXJlM2Qgb2YgdGhpcy5maXh0dXJlczNkKSB7XG4gICAgICAvLyBVcGRhdGUgdGhlIGZpeHR1cmUgcHJvcGVydGllc1xuICAgICAgZml4dHVyZTNkLnVwZGF0ZVByZXZpZXcoY2FsY3VsYXRlZEZpeHR1cmVzLmdldChmaXh0dXJlM2QuZml4dHVyZSkgfHwgW10sIHRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5tYXN0ZXJEaW1tZXJWYWx1ZSk7XG5cbiAgICAgIC8vIFNlbGVjdCB0aGUgZml4dHVyZSwgaWYgcmVxdWlyZWRcbiAgICAgIGlmICh0aGlzLmZpeHR1cmVTZXJ2aWNlLnNldHRpbmdzU2VsZWN0aW9uKSB7XG4gICAgICAgIGZpeHR1cmUzZC5pc1NlbGVjdGVkID0gdGhpcy5maXh0dXJlU2VydmljZS5zZXR0aW5nc0ZpeHR1cmVJc1NlbGVjdGVkKGZpeHR1cmUzZC5maXh0dXJlLmZpeHR1cmUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZml4dHVyZTNkLmlzU2VsZWN0ZWQgPSB0aGlzLnByZXZpZXdTZXJ2aWNlLmZpeHR1cmVJc1NlbGVjdGVkKGZpeHR1cmUzZC5maXh0dXJlLmZpeHR1cmUudXVpZCwgcHJlc2V0cyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVE9ETyBlbmFibGUgZm9yIG1vbml0b3JpbmcgdGhlIERNWCB1bml2ZXJzZXNcbiAgICB0aGlzLnByZXZpZXdTZXJ2aWNlLnNldFVuaXZlcnNlVmFsdWVzKGNhbGN1bGF0ZWRGaXh0dXJlcywgdGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0Lm1hc3RlckRpbW1lclZhbHVlKTtcblxuICAgIC8vIFVwZGF0ZSB0aGUgc3RhdGlzdGljc1xuICAgIC8vIHRoaXMucmVuZGVyZXJTdGF0cy51cGRhdGUodGhpcy5yZW5kZXJlcik7XG5cbiAgICAvLyBSZW5kZXIgdGhlIHNjZW5lXG4gICAgdGhpcy5yZW5kZXIoKTtcblxuICAgIHRoaXMuc3RhdHMuZW5kKCk7XG5cbiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGhpcy5hbmltYXRlLmJpbmQodGhpcykpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRBc3BlY3RSYXRpbygpOiBudW1iZXIge1xuICAgIGNvbnN0IGhlaWdodCA9IHRoaXMuY2FudmFzLmNsaWVudEhlaWdodDtcblxuICAgIGlmIChoZWlnaHQgPT09IDApIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmNhbnZhcy5jbGllbnRXaWR0aCAvIHRoaXMuY2FudmFzLmNsaWVudEhlaWdodDtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpyZXNpemUnKVxuICBwdWJsaWMgb25SZXNpemUoKSB7XG4gICAgdGhpcy5jYW1lcmEuYXNwZWN0ID0gdGhpcy5nZXRBc3BlY3RSYXRpbygpO1xuICAgIHRoaXMuY2FtZXJhLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTtcbiAgICB0aGlzLnJlbmRlcmVyLnNldFNpemUodGhpcy5jYW52YXMuY2xpZW50V2lkdGgsIHRoaXMuY2FudmFzLmNsaWVudEhlaWdodCk7XG4gIH1cblxuICBwcml2YXRlIHNldHVwUmVuZGVyZXIoKSB7XG4gICAgdGhpcy5yZW5kZXJlciA9IG5ldyBUSFJFRS5XZWJHTFJlbmRlcmVyKHsgYW50aWFsaWFzOiB0cnVlIH0pO1xuICAgIHRoaXMuY2FudmFzLmFwcGVuZENoaWxkKHRoaXMucmVuZGVyZXIuZG9tRWxlbWVudCk7XG4gICAgdGhpcy5yZW5kZXJlci5zZXRQaXhlbFJhdGlvKGRldmljZVBpeGVsUmF0aW8pO1xuICAgIHRoaXMucmVuZGVyZXIuc2V0U2l6ZSh0aGlzLmNhbnZhcy5jbGllbnRXaWR0aCwgdGhpcy5jYW52YXMuY2xpZW50SGVpZ2h0KTtcbiAgICB0aGlzLnJlbmRlcmVyLnNoYWRvd01hcC5lbmFibGVkID0gZmFsc2U7XG4gICAgdGhpcy5yZW5kZXJlci5nYW1tYUlucHV0ID0gdHJ1ZTtcbiAgICB0aGlzLnJlbmRlcmVyLmdhbW1hT3V0cHV0ID0gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0dXBDYW1lcmEoKSB7XG4gICAgdGhpcy5jYW1lcmEgPSBuZXcgVEhSRUUuUGVyc3BlY3RpdmVDYW1lcmEoMzUsIHdpbmRvdy5pbm5lcldpZHRoIC8gd2luZG93LmlubmVySGVpZ2h0LCAxLCAxMDAwMCk7XG4gICAgdGhpcy5jYW1lcmEucG9zaXRpb24uc2V0KC02MDAsIDgwLCA3MDApO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXR1cENvbnRyb2xzKCkge1xuICAgIHRoaXMuY29udHJvbHMgPSBuZXcgT3JiaXRDb250cm9scyh0aGlzLmNhbWVyYSwgdGhpcy5yZW5kZXJlci5kb21FbGVtZW50KTtcbiAgICB0aGlzLmNvbnRyb2xzLmVuYWJsZUtleXMgPSBmYWxzZTtcbiAgICB0aGlzLmNvbnRyb2xzLnJvdGF0ZVNwZWVkID0gMC4wNTtcbiAgICB0aGlzLmNvbnRyb2xzLnpvb21TcGVlZCA9IDEuMjtcbiAgICB0aGlzLmNvbnRyb2xzLmVuYWJsZURhbXBpbmcgPSB0cnVlO1xuICAgIHRoaXMuY29udHJvbHMuZGFtcGluZ0ZhY3RvciA9IDAuMjU7XG4gICAgdGhpcy5jb250cm9scy5zY3JlZW5TcGFjZVBhbm5pbmcgPSBmYWxzZTtcbiAgICB0aGlzLmNvbnRyb2xzLm1pbkRpc3RhbmNlID0gNzAwO1xuICAgIC8vIHRoaXMuY29udHJvbHMuem9vbSA9IDEwMDA7XG4gICAgdGhpcy5jb250cm9scy5tYXhEaXN0YW5jZSA9IDIwMDA7XG4gICAgdGhpcy5jb250cm9scy5tYXhQb2xhckFuZ2xlID0gTWF0aC5QSSAvIDI7XG4gICAgdGhpcy5jb250cm9scy50YXJnZXQgPSBuZXcgVEhSRUUuVmVjdG9yMygwLCAyMDAsIDApO1xuICAgIC8vIHRoaXMuY29udHJvbHMucm90YXRpb24gPSAxMDA7XG4gIH1cblxuICBwcml2YXRlIHNldHVwRmxvb3IoKSB7XG4gICAgY29uc3Qgd2lkdGggPSA0MDAwO1xuICAgIGNvbnN0IGhlaWdodCA9IDE7XG5cbiAgICBjb25zdCBnZW9tZXRyeSA9IG5ldyBUSFJFRS5Cb3hHZW9tZXRyeSh3aWR0aCwgaGVpZ2h0LCB3aWR0aCk7XG4gICAgY29uc3QgbWF0ZXJpYWwgPSBuZXcgVEhSRUUuTWVzaFN0YW5kYXJkTWF0ZXJpYWwoeyBjb2xvcjogMHgwZDBkMGQgfSk7XG5cbiAgICBjb25zdCBmbG9vciA9IG5ldyBUSFJFRS5NZXNoKGdlb21ldHJ5LmNsb25lKCksIG1hdGVyaWFsKTtcbiAgICBmbG9vci5yZWNlaXZlU2hhZG93ID0gZmFsc2U7XG4gICAgZmxvb3IuY2FzdFNoYWRvdyA9IGZhbHNlO1xuICAgIGZsb29yLnBvc2l0aW9uLnNldCgwLCAtaGVpZ2h0IC8gMiwgMCk7XG4gICAgdGhpcy5zY2VuZS5hZGQoZmxvb3IpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXR1cFN0YXRzKCkge1xuICAgIC8vIHRoaXMucmVuZGVyZXJTdGF0cy5kb21FbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbiAgICAvLyB0aGlzLnJlbmRlcmVyU3RhdHMuZG9tRWxlbWVudC5zdHlsZS5sZWZ0ID0gJzBweCc7XG4gICAgLy8gdGhpcy5yZW5kZXJlclN0YXRzLmRvbUVsZW1lbnQuc3R5bGUuYm90dG9tID0gJzBweCc7XG4gICAgLy8gdGhpcy5jYW52YXMuYXBwZW5kQ2hpbGQodGhpcy5yZW5kZXJlclN0YXRzLmRvbUVsZW1lbnQpO1xuXG4gICAgdGhpcy5zdGF0cy5kb21FbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbiAgICB0aGlzLnN0YXRzLmRvbUVsZW1lbnQuc3R5bGUubGVmdCA9ICcwcHgnO1xuICAgIHRoaXMuY2FudmFzLmFwcGVuZENoaWxkKHRoaXMuc3RhdHMuZG9tRWxlbWVudCk7XG4gIH1cblxuICBwcml2YXRlIHNldHVwU2NlbmUoKSB7XG4gICAgLy8gQ3JlYXRlIGEgbmV3IHNjZW5lXG4gICAgdGhpcy5zY2VuZSA9IG5ldyBUSFJFRS5TY2VuZSgpO1xuXG4gICAgdGhpcy5wcmV2aWV3U2VydmljZS5zY2VuZSA9IHRoaXMuc2NlbmU7XG5cbiAgICAvLyBBZGQgYSBsaXR0bGUgYml0IG9mIGFtYmllbnQgbGlnaHRcbiAgICBjb25zdCBhbWJpZW50ID0gbmV3IFRIUkVFLkFtYmllbnRMaWdodCgweGZmZmZmZiwgMC44KTtcbiAgICB0aGlzLnNjZW5lLmFkZChhbWJpZW50KTtcblxuICAgIC8vIEFkZCBhIGZsb29yXG4gICAgdGhpcy5zZXR1cEZsb29yKCk7XG5cbiAgICAvLyBDcmVhdGUgdGhlIHN0YWdlIGRpbWVuc2lvbnNcbiAgICB0aGlzLnByZXZpZXdTZXJ2aWNlLnVwZGF0ZVN0YWdlKCk7XG5cbiAgICAvLyBUT0RPIHJlZmluZS4gYmFja2dyb3VuZCBsaWdodCBpbiBhIGNvbG9yIG9mIHRoZSBmaXh0dXJlcz9cbiAgICBjb25zdCBsaWdodHMgPSBbXTtcbiAgICBsaWdodHNbMF0gPSBuZXcgVEhSRUUuUG9pbnRMaWdodCgweGZmZmZmZiwgMC41LCAwKTtcbiAgICBsaWdodHNbMV0gPSBuZXcgVEhSRUUuUG9pbnRMaWdodCgweGZmZmZmZiwgMC41LCAwKTtcbiAgICBsaWdodHNbMl0gPSBuZXcgVEhSRUUuUG9pbnRMaWdodCgweGZmZmZmZiwgMC41LCAwKTtcblxuICAgIGxpZ2h0c1swXS5wb3NpdGlvbi5zZXQoMCwgMjAwMCwgMCk7XG4gICAgbGlnaHRzWzFdLnBvc2l0aW9uLnNldCgxMDAwLCAyMDAwLCAxMDAwKTtcbiAgICBsaWdodHNbMl0ucG9zaXRpb24uc2V0KC0xMDAwLCAtMjAwMCwgLTEwMDApO1xuXG4gICAgdGhpcy5zY2VuZS5hZGQobGlnaHRzWzBdKTtcbiAgICB0aGlzLnNjZW5lLmFkZChsaWdodHNbMV0pO1xuICAgIHRoaXMuc2NlbmUuYWRkKGxpZ2h0c1syXSk7XG5cbiAgICAvLyBDcmVhdGUgdGhlIHN0YXRzXG4gICAgdGhpcy5zZXR1cFN0YXRzKCk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy5zZXR1cFJlbmRlcmVyKCk7XG4gICAgdGhpcy5zZXR1cENhbWVyYSgpO1xuICAgIHRoaXMuc2V0dXBDb250cm9scygpO1xuICAgIHRoaXMuc2V0dXBTY2VuZSgpO1xuXG4gICAgdGhpcy5vblJlc2l6ZSgpO1xuICAgIHRoaXMuYW5pbWF0ZShudWxsKTtcbiAgfVxufVxuIl19
|