@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
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
import { forkJoin } from 'rxjs';
|
|
2
|
+
import { map } from 'rxjs/operators';
|
|
3
|
+
import * as THREE from 'three';
|
|
4
|
+
import { FixtureCapabilityType } from '../../models/fixture-capability';
|
|
5
|
+
import { Fixture3d } from './fixture-3d';
|
|
6
|
+
export class MovingHead3d extends Fixture3d {
|
|
7
|
+
atmosphereMat() {
|
|
8
|
+
const vertexShader = `
|
|
9
|
+
varying vec3 vNormal;
|
|
10
|
+
varying vec3 vWorldPosition;
|
|
11
|
+
|
|
12
|
+
void main(){
|
|
13
|
+
vNormal = normalize(normalMatrix * normal);
|
|
14
|
+
|
|
15
|
+
vec4 worldPosition = modelMatrix * vec4(position, 1.0);
|
|
16
|
+
vWorldPosition = worldPosition.xyz;
|
|
17
|
+
|
|
18
|
+
gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
|
|
19
|
+
}`;
|
|
20
|
+
const fragmentShader = `
|
|
21
|
+
varying vec3 vNormal;
|
|
22
|
+
varying vec3 vWorldPosition;
|
|
23
|
+
|
|
24
|
+
uniform vec3 lightColor;
|
|
25
|
+
uniform float opacity;
|
|
26
|
+
uniform vec3 spotPosition;
|
|
27
|
+
uniform float attenuation;
|
|
28
|
+
uniform float anglePower;
|
|
29
|
+
|
|
30
|
+
void main(){
|
|
31
|
+
float intensity;
|
|
32
|
+
|
|
33
|
+
intensity = distance(vWorldPosition, spotPosition) / attenuation;
|
|
34
|
+
intensity = 1.0 - clamp(intensity, 0.0, 1.0);
|
|
35
|
+
|
|
36
|
+
vec3 normal = vec3(vNormal.x, vNormal.y, abs(vNormal.z));
|
|
37
|
+
float angleIntensity = pow(dot(normal, vec3(0.0, 0.0, 1.0)), anglePower);
|
|
38
|
+
intensity = intensity * angleIntensity * opacity;
|
|
39
|
+
|
|
40
|
+
gl_FragColor = vec4(lightColor, intensity);
|
|
41
|
+
}`;
|
|
42
|
+
const material = new THREE.ShaderMaterial({
|
|
43
|
+
uniforms: {
|
|
44
|
+
attenuation: {
|
|
45
|
+
type: 'f',
|
|
46
|
+
value: 800.0,
|
|
47
|
+
},
|
|
48
|
+
anglePower: {
|
|
49
|
+
type: 'f',
|
|
50
|
+
value: 2,
|
|
51
|
+
},
|
|
52
|
+
spotPosition: {
|
|
53
|
+
type: 'v3',
|
|
54
|
+
value: new THREE.Vector3(0, 0, 0),
|
|
55
|
+
},
|
|
56
|
+
lightColor: {
|
|
57
|
+
type: 'c',
|
|
58
|
+
value: new THREE.Color('white'),
|
|
59
|
+
},
|
|
60
|
+
opacity: {
|
|
61
|
+
type: 'f',
|
|
62
|
+
value: 1.0,
|
|
63
|
+
},
|
|
64
|
+
},
|
|
65
|
+
vertexShader,
|
|
66
|
+
fragmentShader,
|
|
67
|
+
transparent: true,
|
|
68
|
+
depthWrite: false,
|
|
69
|
+
});
|
|
70
|
+
return material;
|
|
71
|
+
}
|
|
72
|
+
createSpotLightBeam() {
|
|
73
|
+
if (this.spotLightBeam) {
|
|
74
|
+
this.spotlightGroup.remove(this.spotLightBeam);
|
|
75
|
+
}
|
|
76
|
+
// TODO update the correct angle from the profile
|
|
77
|
+
const beamAngleDegrees = 14;
|
|
78
|
+
const geometry = new THREE.CylinderGeometry(0.1, beamAngleDegrees * 1.2, 100, 64, 20, false);
|
|
79
|
+
geometry.applyMatrix4(new THREE.Matrix4().makeTranslation(0, -geometry.parameters.height / 2, 0));
|
|
80
|
+
geometry.applyMatrix4(new THREE.Matrix4().makeRotationX(-Math.PI / 2));
|
|
81
|
+
this.atmosphereMaterial = this.atmosphereMat();
|
|
82
|
+
this.spotLightBeam = new THREE.Mesh(geometry, this.atmosphereMaterial);
|
|
83
|
+
this.spotLightBeam.position.set(0, -0.02, 0);
|
|
84
|
+
this.spotLightBeam.receiveShadow = false;
|
|
85
|
+
this.spotLightBeam.castShadow = false;
|
|
86
|
+
this.spotlightGroup.add(this.spotLightBeam);
|
|
87
|
+
this.spotLightBeam.rotation.x = Math.PI / 2;
|
|
88
|
+
}
|
|
89
|
+
createObjects() {
|
|
90
|
+
this.material = new THREE.MeshLambertMaterial({
|
|
91
|
+
color: 0x0d0d0d,
|
|
92
|
+
emissive: 0x0d0d0d,
|
|
93
|
+
});
|
|
94
|
+
this.socket.material = this.material;
|
|
95
|
+
this.arm.material = this.material;
|
|
96
|
+
this.head.material = this.material;
|
|
97
|
+
// Add the head
|
|
98
|
+
this.head.scale.multiplyScalar(0.9);
|
|
99
|
+
this.head.position.set(-0.1, 0, 0);
|
|
100
|
+
const headPivotGroup = new THREE.Object3D();
|
|
101
|
+
headPivotGroup.add(this.head);
|
|
102
|
+
this.headGroup.add(headPivotGroup);
|
|
103
|
+
// Add the spotlight
|
|
104
|
+
this.spotLight = new THREE.SpotLight(0xffffff, 50000);
|
|
105
|
+
this.spotLight.angle = 2;
|
|
106
|
+
this.spotLight.penumbra = 1;
|
|
107
|
+
this.spotLight.decay = 0.01;
|
|
108
|
+
this.spotLight.distance = 0;
|
|
109
|
+
this.spotLight.intensity = 1;
|
|
110
|
+
this.spotLightHelper = new THREE.SpotLightHelper(this.spotLight);
|
|
111
|
+
this.scene.add(this.spotLightHelper);
|
|
112
|
+
const spotLightTarget = new THREE.Object3D();
|
|
113
|
+
this.spotLight.target = spotLightTarget;
|
|
114
|
+
this.spotlightGroup.add(this.spotLight);
|
|
115
|
+
this.spotlightGroup.add(spotLightTarget);
|
|
116
|
+
this.spotLight.position.set(0, -1.4, 0);
|
|
117
|
+
spotLightTarget.position.set(0, -10, 0);
|
|
118
|
+
// Add the point light for the surrounding light
|
|
119
|
+
this.pointLight = new THREE.PointLight(0xffffff, 500, 0, 0.1);
|
|
120
|
+
this.spotlightGroup.add(this.pointLight);
|
|
121
|
+
this.pointLight.position.set(0, -1.4, 0);
|
|
122
|
+
// Add the light beam
|
|
123
|
+
this.createSpotLightBeam();
|
|
124
|
+
this.headGroup.add(this.spotlightGroup);
|
|
125
|
+
// Add the arm
|
|
126
|
+
this.armGroup.add(this.headGroup);
|
|
127
|
+
this.headGroup.position.set(0, -0.6, 0);
|
|
128
|
+
this.armGroup.add(this.arm);
|
|
129
|
+
// Add the socket
|
|
130
|
+
this.objectGroup.add(this.armGroup);
|
|
131
|
+
this.objectGroup.add(this.socket);
|
|
132
|
+
this.socket.position.set(0, 1.2, 0);
|
|
133
|
+
// A moving head has about 32 cm in width
|
|
134
|
+
this.objectGroup.scale.multiplyScalar(9);
|
|
135
|
+
this.scene.add(this.objectGroup);
|
|
136
|
+
this.isLoaded = true;
|
|
137
|
+
}
|
|
138
|
+
constructor(fixtureService, previewMeshService, fixture, scene) {
|
|
139
|
+
super(fixtureService, fixture, scene);
|
|
140
|
+
this.pointLightMaxIntensity = 2;
|
|
141
|
+
this.spotLightLightMaxIntensity = 10;
|
|
142
|
+
this.headGroup = new THREE.Object3D();
|
|
143
|
+
this.spotlightGroup = new THREE.Object3D();
|
|
144
|
+
this.armGroup = new THREE.Object3D();
|
|
145
|
+
this.objectGroup = new THREE.Object3D();
|
|
146
|
+
forkJoin([
|
|
147
|
+
previewMeshService.getMesh('moving_head_socket'),
|
|
148
|
+
previewMeshService.getMesh('moving_head_arm'),
|
|
149
|
+
previewMeshService.getMesh('moving_head_head'),
|
|
150
|
+
])
|
|
151
|
+
.pipe(map(([socket, arm, head]) => {
|
|
152
|
+
this.socket = socket;
|
|
153
|
+
this.arm = arm;
|
|
154
|
+
this.head = head;
|
|
155
|
+
this.createObjects();
|
|
156
|
+
}))
|
|
157
|
+
.subscribe();
|
|
158
|
+
}
|
|
159
|
+
getObject() {
|
|
160
|
+
return this.objectGroup;
|
|
161
|
+
}
|
|
162
|
+
updatePreview(channelValues, masterDimmerValue) {
|
|
163
|
+
super.updatePreview(channelValues, masterDimmerValue);
|
|
164
|
+
if (!this.isLoaded) {
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
// Apply default settings
|
|
168
|
+
let panStart = 0;
|
|
169
|
+
let panEnd = 255;
|
|
170
|
+
let tiltStart = 0;
|
|
171
|
+
let tiltEnd = 255;
|
|
172
|
+
this.pan = 0;
|
|
173
|
+
this.tilt = 0;
|
|
174
|
+
// Apply the known property values
|
|
175
|
+
for (const channelValue of channelValues) {
|
|
176
|
+
const channel = this.fixtureService.getChannelByName(this.fixture, channelValue.channelName);
|
|
177
|
+
const capability = this.getCapabilityInValue(channel, channelValue.value);
|
|
178
|
+
if (capability) {
|
|
179
|
+
switch (capability.capability.type) {
|
|
180
|
+
case FixtureCapabilityType.Pan: {
|
|
181
|
+
panStart = this.fixtureService.getRotationAngleDeg(capability.capability.angleStart) || 0;
|
|
182
|
+
panEnd = this.fixtureService.getRotationAngleDeg(capability.capability.angleEnd) || 540;
|
|
183
|
+
this.pan = channelValue.value / channel.maxValue;
|
|
184
|
+
break;
|
|
185
|
+
}
|
|
186
|
+
case FixtureCapabilityType.Tilt: {
|
|
187
|
+
tiltStart = this.fixtureService.getRotationAngleDeg(capability.capability.angleStart) || 0;
|
|
188
|
+
tiltEnd = this.fixtureService.getRotationAngleDeg(capability.capability.angleEnd) || 2700;
|
|
189
|
+
this.tilt = channelValue.value / channel.maxValue;
|
|
190
|
+
break;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
this.updatePosition(this.objectGroup);
|
|
196
|
+
// calculate the y/x rotation in radiants based on pan/tilt (0-1) respecting the max pan/tilt
|
|
197
|
+
this.armGroup.rotation.y = THREE.MathUtils.degToRad(panEnd * this.pan + panStart) - THREE.MathUtils.degToRad(panEnd / 2);
|
|
198
|
+
this.headGroup.rotation.x = THREE.MathUtils.degToRad(tiltEnd * this.tilt + tiltStart) - THREE.MathUtils.degToRad(tiltEnd / 2);
|
|
199
|
+
// Update the angle (only on change, because it's expensive)
|
|
200
|
+
// TODO update the correct angle from the profile
|
|
201
|
+
const beamAngleDregrees = 14;
|
|
202
|
+
if (this.lastBeamAngleDegrees !== beamAngleDregrees) {
|
|
203
|
+
this.spotLight.angle = THREE.MathUtils.degToRad(beamAngleDregrees);
|
|
204
|
+
this.createSpotLightBeam();
|
|
205
|
+
this.lastBeamAngleDegrees = beamAngleDregrees;
|
|
206
|
+
}
|
|
207
|
+
// Update the material
|
|
208
|
+
if (this.lastSelected !== this.isSelected) {
|
|
209
|
+
if (this.isSelected) {
|
|
210
|
+
this.socket.material = this.selectedMaterial;
|
|
211
|
+
this.arm.material = this.selectedMaterial;
|
|
212
|
+
this.head.material = this.selectedMaterial;
|
|
213
|
+
}
|
|
214
|
+
else {
|
|
215
|
+
this.socket.material = this.material;
|
|
216
|
+
this.arm.material = this.material;
|
|
217
|
+
this.head.material = this.material;
|
|
218
|
+
}
|
|
219
|
+
this.lastSelected = this.isSelected;
|
|
220
|
+
}
|
|
221
|
+
// Apply the colors
|
|
222
|
+
const color = new THREE.Color('rgb(' + this.colorRed + ', ' + this.colorGreen + ', ' + this.colorBlue + ')');
|
|
223
|
+
this.pointLight.color = color;
|
|
224
|
+
this.spotLight.color = color;
|
|
225
|
+
this.spotLightBeam.material.uniforms.lightColor.value = color;
|
|
226
|
+
// Apply the dimmer value
|
|
227
|
+
// Take the color into account for the beam (don't show a black beam)
|
|
228
|
+
const intensityColor = Math.max(this.colorRed, this.colorGreen, this.colorBlue);
|
|
229
|
+
// console.log(Math.min(intensityColor, this.dimmer));
|
|
230
|
+
this.spotLightBeam.material.uniforms.opacity.value = Math.min(intensityColor, this.dimmer);
|
|
231
|
+
this.spotLight.intensity = this.spotLightLightMaxIntensity * this.dimmer;
|
|
232
|
+
this.pointLight.intensity = this.pointLightMaxIntensity * this.dimmer;
|
|
233
|
+
this.spotLightBeam.material.uniforms.spotPosition.value = this.objectGroup.position;
|
|
234
|
+
// this.spotLightHelper.update();
|
|
235
|
+
}
|
|
236
|
+
destroy() {
|
|
237
|
+
this.scene.remove(this.objectGroup);
|
|
238
|
+
this.material.dispose();
|
|
239
|
+
this.atmosphereMaterial.dispose();
|
|
240
|
+
this.spotLightHelper.dispose();
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW92aW5nLWhlYWQtM2QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kZXNpZ25lci9zcmMvbGliL3ByZXZpZXcvbW9kZWxzL21vdmluZy1oZWFkLTNkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDaEMsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3JDLE9BQU8sS0FBSyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBRS9CLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBSXhFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFekMsTUFBTSxPQUFPLFlBQWEsU0FBUSxTQUFTO0lBMkJqQyxhQUFhO1FBQ25CLE1BQU0sWUFBWSxHQUFHOzs7Ozs7Ozs7OztRQVdqQixDQUFDO1FBQ0wsTUFBTSxjQUFjLEdBQUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztRQXFCbkIsQ0FBQztRQUVMLE1BQU0sUUFBUSxHQUFHLElBQUksS0FBSyxDQUFDLGNBQWMsQ0FBQztZQUN4QyxRQUFRLEVBQUU7Z0JBQ1IsV0FBVyxFQUFFO29CQUNYLElBQUksRUFBRSxHQUFHO29CQUNULEtBQUssRUFBRSxLQUFLO2lCQUNiO2dCQUNELFVBQVUsRUFBRTtvQkFDVixJQUFJLEVBQUUsR0FBRztvQkFDVCxLQUFLLEVBQUUsQ0FBQztpQkFDVDtnQkFDRCxZQUFZLEVBQUU7b0JBQ1osSUFBSSxFQUFFLElBQUk7b0JBQ1YsS0FBSyxFQUFFLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztpQkFDbEM7Z0JBQ0QsVUFBVSxFQUFFO29CQUNWLElBQUksRUFBRSxHQUFHO29CQUNULEtBQUssRUFBRSxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDO2lCQUNoQztnQkFDRCxPQUFPLEVBQUU7b0JBQ1AsSUFBSSxFQUFFLEdBQUc7b0JBQ1QsS0FBSyxFQUFFLEdBQUc7aUJBQ1g7YUFDRjtZQUNELFlBQVk7WUFDWixjQUFjO1lBQ2QsV0FBVyxFQUFFLElBQUk7WUFDakIsVUFBVSxFQUFFLEtBQUs7U0FDbEIsQ0FBQyxDQUFDO1FBRUgsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztJQUVPLG1CQUFtQjtRQUN6QixJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN2QixJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDakQsQ0FBQztRQUVELGlEQUFpRDtRQUNqRCxNQUFNLGdCQUFnQixHQUFHLEVBQUUsQ0FBQztRQUM1QixNQUFNLFFBQVEsR0FBRyxJQUFJLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLEVBQUUsZ0JBQWdCLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzdGLFFBQVEsQ0FBQyxZQUFZLENBQUMsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsZUFBZSxDQUFDLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xHLFFBQVEsQ0FBQyxZQUFZLENBQUMsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsYUFBYSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXZFLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDL0MsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQ3ZFLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDN0MsSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO1FBQ3pDLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztRQUV0QyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDNUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFTyxhQUFhO1FBQ2xCLElBQUksQ0FBQyxRQUFnQixHQUFHLElBQUksS0FBSyxDQUFDLG1CQUFtQixDQUFDO1lBQ3JELEtBQUssRUFBRSxRQUFRO1lBQ2YsUUFBUSxFQUFFLFFBQVE7U0FDbkIsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUNyQyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7UUFFbkMsZUFBZTtRQUNmLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNwQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ25DLE1BQU0sY0FBYyxHQUFHLElBQUksS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzVDLGNBQWMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzlCLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBRW5DLG9CQUFvQjtRQUNwQixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksS0FBSyxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDdEQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO1FBQ3pCLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQztRQUM1QixJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7UUFDNUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDO1FBQzVCLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQztRQUU3QixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksS0FBSyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDakUsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBRXJDLE1BQU0sZUFBZSxHQUFHLElBQUksS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzdDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLGVBQWUsQ0FBQztRQUV4QyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDeEMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDekMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN4QyxlQUFlLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFFeEMsZ0RBQWdEO1FBQ2hELElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzlELElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN6QyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBRXpDLHFCQUFxQjtRQUNyQixJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUUzQixJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7UUFFeEMsY0FBYztRQUNkLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNsQyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3hDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUU1QixpQkFBaUI7UUFDakIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNsQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUVwQyx5Q0FBeUM7UUFDekMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXpDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUVqQyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztJQUN2QixDQUFDO0lBRUQsWUFBWSxjQUE4QixFQUFFLGtCQUFzQyxFQUFFLE9BQXNCLEVBQUUsS0FBVTtRQUNwSCxLQUFLLENBQUMsY0FBYyxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztRQXBMdkIsMkJBQXNCLEdBQVcsQ0FBQyxDQUFDO1FBQ25DLCtCQUEwQixHQUFXLEVBQUUsQ0FBQztRQVNqRCxjQUFTLEdBQW1CLElBQUksS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2pELG1CQUFjLEdBQW1CLElBQUksS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3RELGFBQVEsR0FBbUIsSUFBSSxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDaEQsZ0JBQVcsR0FBbUIsSUFBSSxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7UUF5S3pELFFBQVEsQ0FBQztZQUNQLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQztZQUNoRCxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUM7WUFDN0Msa0JBQWtCLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDO1NBQy9DLENBQUM7YUFDQyxJQUFJLENBQ0gsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUU7WUFDMUIsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7WUFDckIsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7WUFDZixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztZQUVqQixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDdkIsQ0FBQyxDQUFDLENBQ0g7YUFDQSxTQUFTLEVBQUUsQ0FBQztJQUNqQixDQUFDO0lBRU0sU0FBUztRQUNkLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUMxQixDQUFDO0lBRU0sYUFBYSxDQUFDLGFBQW9DLEVBQUUsaUJBQXlCO1FBQ2xGLEtBQUssQ0FBQyxhQUFhLENBQUMsYUFBYSxFQUFFLGlCQUFpQixDQUFDLENBQUM7UUFFdEQsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNuQixPQUFPO1FBQ1QsQ0FBQztRQUVELHlCQUF5QjtRQUN6QixJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUM7UUFDakIsSUFBSSxNQUFNLEdBQUcsR0FBRyxDQUFDO1FBRWpCLElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQztRQUNsQixJQUFJLE9BQU8sR0FBRyxHQUFHLENBQUM7UUFFbEIsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFDYixJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztRQUVkLGtDQUFrQztRQUNsQyxLQUFLLE1BQU0sWUFBWSxJQUFJLGFBQWEsRUFBRSxDQUFDO1lBQ3pDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDN0YsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE9BQU8sRUFBRSxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDMUUsSUFBSSxVQUFVLEVBQUUsQ0FBQztnQkFDZixRQUFRLFVBQVUsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUM7b0JBQ25DLEtBQUsscUJBQXFCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQzt3QkFDL0IsUUFBUSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsbUJBQW1CLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7d0JBQzFGLE1BQU0sR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLG1CQUFtQixDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLElBQUksR0FBRyxDQUFDO3dCQUN4RixJQUFJLENBQUMsR0FBRyxHQUFHLFlBQVksQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQzt3QkFDakQsTUFBTTtvQkFDUixDQUFDO29CQUNELEtBQUsscUJBQXFCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQzt3QkFDaEMsU0FBUyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsbUJBQW1CLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7d0JBQzNGLE9BQU8sR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLG1CQUFtQixDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLElBQUksSUFBSSxDQUFDO3dCQUMxRixJQUFJLENBQUMsSUFBSSxHQUFHLFlBQVksQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQzt3QkFDbEQsTUFBTTtvQkFDUixDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUVELElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRXRDLDZGQUE2RjtRQUM3RixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLEdBQUcsUUFBUSxDQUFDLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3pILElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksR0FBRyxTQUFTLENBQUMsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFFOUgsNERBQTREO1FBQzVELGlEQUFpRDtRQUNqRCxNQUFNLGlCQUFpQixHQUFHLEVBQUUsQ0FBQztRQUM3QixJQUFJLElBQUksQ0FBQyxvQkFBb0IsS0FBSyxpQkFBaUIsRUFBRSxDQUFDO1lBQ3BELElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLENBQUM7WUFDbkUsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFDM0IsSUFBSSxDQUFDLG9CQUFvQixHQUFHLGlCQUFpQixDQUFDO1FBQ2hELENBQUM7UUFFRCxzQkFBc0I7UUFDdEIsSUFBSSxJQUFJLENBQUMsWUFBWSxLQUFLLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUMxQyxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDcEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDO2dCQUM3QyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7Z0JBQzFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztZQUM3QyxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztnQkFDckMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztnQkFDbEMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztZQUNyQyxDQUFDO1lBRUQsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQ3RDLENBQUM7UUFFRCxtQkFBbUI7UUFDbkIsTUFBTSxLQUFLLEdBQUcsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksR0FBRyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksR0FBRyxJQUFJLENBQUMsU0FBUyxHQUFHLEdBQUcsQ0FBQyxDQUFDO1FBRTdHLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUU5QixJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDN0IsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBRTlELHlCQUF5QjtRQUN6QixxRUFBcUU7UUFDckUsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2hGLHNEQUFzRDtRQUN0RCxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFM0YsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLDBCQUEwQixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDekUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7UUFFdEUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUM7UUFFcEYsaUNBQWlDO0lBQ25DLENBQUM7SUFFRCxPQUFPO1FBQ0wsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDakMsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZm9ya0pvaW4gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCAqIGFzIFRIUkVFIGZyb20gJ3RocmVlJztcbmltcG9ydCB7IENhY2hlZEZpeHR1cmUgfSBmcm9tICcuLi8uLi9tb2RlbHMvY2FjaGVkLWZpeHR1cmUnO1xuaW1wb3J0IHsgRml4dHVyZUNhcGFiaWxpdHlUeXBlIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2ZpeHR1cmUtY2FwYWJpbGl0eSc7XG5pbXBvcnQgeyBGaXh0dXJlQ2hhbm5lbFZhbHVlIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2ZpeHR1cmUtY2hhbm5lbC12YWx1ZSc7XG5pbXBvcnQgeyBGaXh0dXJlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2ZpeHR1cmUuc2VydmljZSc7XG5pbXBvcnQgeyBQcmV2aWV3TWVzaFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9wcmV2aWV3LW1lc2guc2VydmljZSc7XG5pbXBvcnQgeyBGaXh0dXJlM2QgfSBmcm9tICcuL2ZpeHR1cmUtM2QnO1xuXG5leHBvcnQgY2xhc3MgTW92aW5nSGVhZDNkIGV4dGVuZHMgRml4dHVyZTNkIHtcbiAgcHJpdmF0ZSByZWFkb25seSBwb2ludExpZ2h0TWF4SW50ZW5zaXR5OiBudW1iZXIgPSAyO1xuICBwcml2YXRlIHJlYWRvbmx5IHNwb3RMaWdodExpZ2h0TWF4SW50ZW5zaXR5OiBudW1iZXIgPSAxMDtcblxuICBwcml2YXRlIHBhbjogbnVtYmVyO1xuICBwcml2YXRlIHRpbHQ6IG51bWJlcjtcblxuICBwcml2YXRlIHNvY2tldDogVEhSRUUuTWVzaDtcbiAgcHJpdmF0ZSBhcm06IFRIUkVFLk1lc2g7XG4gIHByaXZhdGUgaGVhZDogVEhSRUUuTWVzaDtcblxuICBwcml2YXRlIGhlYWRHcm91cDogVEhSRUUuT2JqZWN0M0QgPSBuZXcgVEhSRUUuT2JqZWN0M0QoKTtcbiAgcHJpdmF0ZSBzcG90bGlnaHRHcm91cDogVEhSRUUuT2JqZWN0M0QgPSBuZXcgVEhSRUUuT2JqZWN0M0QoKTtcbiAgcHJpdmF0ZSBhcm1Hcm91cDogVEhSRUUuT2JqZWN0M0QgPSBuZXcgVEhSRUUuT2JqZWN0M0QoKTtcbiAgcHJpdmF0ZSBvYmplY3RHcm91cDogVEhSRUUuT2JqZWN0M0QgPSBuZXcgVEhSRUUuT2JqZWN0M0QoKTtcbiAgcHJpdmF0ZSBzcG90TGlnaHQ6IFRIUkVFLlNwb3RMaWdodDtcbiAgcHJpdmF0ZSBzcG90TGlnaHRIZWxwZXI6IFRIUkVFLlNwb3RMaWdodEhlbHBlcjtcbiAgcHJpdmF0ZSBzcG90TGlnaHRCZWFtOiBUSFJFRS5NZXNoO1xuXG4gIHByaXZhdGUgcG9pbnRMaWdodDogVEhSRUUuUG9pbnRMaWdodDtcblxuICBwcml2YXRlIGxhc3RCZWFtQW5nbGVEZWdyZWVzOiBudW1iZXI7XG4gIHByaXZhdGUgbGFzdFNlbGVjdGVkOiBib29sZWFuO1xuXG4gIHByaXZhdGUgbWF0ZXJpYWw6IFRIUkVFLk1lc2hTdGFuZGFyZE1hdGVyaWFsO1xuICBwcml2YXRlIGF0bW9zcGhlcmVNYXRlcmlhbDogVEhSRUUuU2hhZGVyTWF0ZXJpYWw7XG5cbiAgcHJpdmF0ZSBhdG1vc3BoZXJlTWF0KCkge1xuICAgIGNvbnN0IHZlcnRleFNoYWRlciA9IGBcbiAgICAgIHZhcnlpbmcgdmVjMyB2Tm9ybWFsO1xuICAgICAgdmFyeWluZyB2ZWMzIHZXb3JsZFBvc2l0aW9uO1xuXG4gICAgICB2b2lkIG1haW4oKXtcbiAgICAgICAgdk5vcm1hbCA9IG5vcm1hbGl6ZShub3JtYWxNYXRyaXggKiBub3JtYWwpO1xuXG4gICAgICAgIHZlYzQgd29ybGRQb3NpdGlvbiA9IG1vZGVsTWF0cml4ICogdmVjNChwb3NpdGlvbiwgMS4wKTtcbiAgICAgICAgdldvcmxkUG9zaXRpb24gPSB3b3JsZFBvc2l0aW9uLnh5ejtcblxuICAgICAgICBnbF9Qb3NpdGlvblx0PSBwcm9qZWN0aW9uTWF0cml4ICogbW9kZWxWaWV3TWF0cml4ICogdmVjNChwb3NpdGlvbiwgMS4wKTtcbiAgICAgIH1gO1xuICAgIGNvbnN0IGZyYWdtZW50U2hhZGVyID0gYFxuICAgICAgdmFyeWluZyB2ZWMzIHZOb3JtYWw7XG4gICAgICB2YXJ5aW5nIHZlYzMgdldvcmxkUG9zaXRpb247XG5cbiAgICAgIHVuaWZvcm0gdmVjMyBsaWdodENvbG9yO1xuICAgICAgdW5pZm9ybSBmbG9hdFx0b3BhY2l0eTtcbiAgICAgIHVuaWZvcm0gdmVjMyBzcG90UG9zaXRpb247XG4gICAgICB1bmlmb3JtIGZsb2F0IGF0dGVudWF0aW9uO1xuICAgICAgdW5pZm9ybSBmbG9hdFx0YW5nbGVQb3dlcjtcblxuICAgICAgdm9pZCBtYWluKCl7XG4gICAgICAgIGZsb2F0IGludGVuc2l0eTtcblxuICAgICAgICBpbnRlbnNpdHlcdD0gZGlzdGFuY2UodldvcmxkUG9zaXRpb24sIHNwb3RQb3NpdGlvbikgLyBhdHRlbnVhdGlvbjtcbiAgICAgICAgaW50ZW5zaXR5XHQ9IDEuMCAtIGNsYW1wKGludGVuc2l0eSwgMC4wLCAxLjApO1xuXG4gICAgICAgIHZlYzMgbm9ybWFsXHQ9IHZlYzModk5vcm1hbC54LCB2Tm9ybWFsLnksIGFicyh2Tm9ybWFsLnopKTtcbiAgICAgICAgZmxvYXQgYW5nbGVJbnRlbnNpdHlcdD0gcG93KGRvdChub3JtYWwsIHZlYzMoMC4wLCAwLjAsIDEuMCkpLCBhbmdsZVBvd2VyKTtcbiAgICAgICAgaW50ZW5zaXR5XHQ9IGludGVuc2l0eSAqIGFuZ2xlSW50ZW5zaXR5ICogb3BhY2l0eTtcblxuICAgICAgICBnbF9GcmFnQ29sb3JcdD0gdmVjNChsaWdodENvbG9yLCBpbnRlbnNpdHkpO1xuICAgICAgfWA7XG5cbiAgICBjb25zdCBtYXRlcmlhbCA9IG5ldyBUSFJFRS5TaGFkZXJNYXRlcmlhbCh7XG4gICAgICB1bmlmb3Jtczoge1xuICAgICAgICBhdHRlbnVhdGlvbjoge1xuICAgICAgICAgIHR5cGU6ICdmJyxcbiAgICAgICAgICB2YWx1ZTogODAwLjAsXG4gICAgICAgIH0sXG4gICAgICAgIGFuZ2xlUG93ZXI6IHtcbiAgICAgICAgICB0eXBlOiAnZicsXG4gICAgICAgICAgdmFsdWU6IDIsXG4gICAgICAgIH0sXG4gICAgICAgIHNwb3RQb3NpdGlvbjoge1xuICAgICAgICAgIHR5cGU6ICd2MycsXG4gICAgICAgICAgdmFsdWU6IG5ldyBUSFJFRS5WZWN0b3IzKDAsIDAsIDApLFxuICAgICAgICB9LFxuICAgICAgICBsaWdodENvbG9yOiB7XG4gICAgICAgICAgdHlwZTogJ2MnLFxuICAgICAgICAgIHZhbHVlOiBuZXcgVEhSRUUuQ29sb3IoJ3doaXRlJyksXG4gICAgICAgIH0sXG4gICAgICAgIG9wYWNpdHk6IHtcbiAgICAgICAgICB0eXBlOiAnZicsXG4gICAgICAgICAgdmFsdWU6IDEuMCxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB2ZXJ0ZXhTaGFkZXIsXG4gICAgICBmcmFnbWVudFNoYWRlcixcbiAgICAgIHRyYW5zcGFyZW50OiB0cnVlLFxuICAgICAgZGVwdGhXcml0ZTogZmFsc2UsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbWF0ZXJpYWw7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVNwb3RMaWdodEJlYW0oKSB7XG4gICAgaWYgKHRoaXMuc3BvdExpZ2h0QmVhbSkge1xuICAgICAgdGhpcy5zcG90bGlnaHRHcm91cC5yZW1vdmUodGhpcy5zcG90TGlnaHRCZWFtKTtcbiAgICB9XG5cbiAgICAvLyBUT0RPIHVwZGF0ZSB0aGUgY29ycmVjdCBhbmdsZSBmcm9tIHRoZSBwcm9maWxlXG4gICAgY29uc3QgYmVhbUFuZ2xlRGVncmVlcyA9IDE0O1xuICAgIGNvbnN0IGdlb21ldHJ5ID0gbmV3IFRIUkVFLkN5bGluZGVyR2VvbWV0cnkoMC4xLCBiZWFtQW5nbGVEZWdyZWVzICogMS4yLCAxMDAsIDY0LCAyMCwgZmFsc2UpO1xuICAgIGdlb21ldHJ5LmFwcGx5TWF0cml4NChuZXcgVEhSRUUuTWF0cml4NCgpLm1ha2VUcmFuc2xhdGlvbigwLCAtZ2VvbWV0cnkucGFyYW1ldGVycy5oZWlnaHQgLyAyLCAwKSk7XG4gICAgZ2VvbWV0cnkuYXBwbHlNYXRyaXg0KG5ldyBUSFJFRS5NYXRyaXg0KCkubWFrZVJvdGF0aW9uWCgtTWF0aC5QSSAvIDIpKTtcblxuICAgIHRoaXMuYXRtb3NwaGVyZU1hdGVyaWFsID0gdGhpcy5hdG1vc3BoZXJlTWF0KCk7XG4gICAgdGhpcy5zcG90TGlnaHRCZWFtID0gbmV3IFRIUkVFLk1lc2goZ2VvbWV0cnksIHRoaXMuYXRtb3NwaGVyZU1hdGVyaWFsKTtcbiAgICB0aGlzLnNwb3RMaWdodEJlYW0ucG9zaXRpb24uc2V0KDAsIC0wLjAyLCAwKTtcbiAgICB0aGlzLnNwb3RMaWdodEJlYW0ucmVjZWl2ZVNoYWRvdyA9IGZhbHNlO1xuICAgIHRoaXMuc3BvdExpZ2h0QmVhbS5jYXN0U2hhZG93ID0gZmFsc2U7XG5cbiAgICB0aGlzLnNwb3RsaWdodEdyb3VwLmFkZCh0aGlzLnNwb3RMaWdodEJlYW0pO1xuICAgIHRoaXMuc3BvdExpZ2h0QmVhbS5yb3RhdGlvbi54ID0gTWF0aC5QSSAvIDI7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZU9iamVjdHMoKSB7XG4gICAgKHRoaXMubWF0ZXJpYWwgYXMgYW55KSA9IG5ldyBUSFJFRS5NZXNoTGFtYmVydE1hdGVyaWFsKHtcbiAgICAgIGNvbG9yOiAweDBkMGQwZCxcbiAgICAgIGVtaXNzaXZlOiAweDBkMGQwZCxcbiAgICB9KTtcblxuICAgIHRoaXMuc29ja2V0Lm1hdGVyaWFsID0gdGhpcy5tYXRlcmlhbDtcbiAgICB0aGlzLmFybS5tYXRlcmlhbCA9IHRoaXMubWF0ZXJpYWw7XG4gICAgdGhpcy5oZWFkLm1hdGVyaWFsID0gdGhpcy5tYXRlcmlhbDtcblxuICAgIC8vIEFkZCB0aGUgaGVhZFxuICAgIHRoaXMuaGVhZC5zY2FsZS5tdWx0aXBseVNjYWxhcigwLjkpO1xuICAgIHRoaXMuaGVhZC5wb3NpdGlvbi5zZXQoLTAuMSwgMCwgMCk7XG4gICAgY29uc3QgaGVhZFBpdm90R3JvdXAgPSBuZXcgVEhSRUUuT2JqZWN0M0QoKTtcbiAgICBoZWFkUGl2b3RHcm91cC5hZGQodGhpcy5oZWFkKTtcbiAgICB0aGlzLmhlYWRHcm91cC5hZGQoaGVhZFBpdm90R3JvdXApO1xuXG4gICAgLy8gQWRkIHRoZSBzcG90bGlnaHRcbiAgICB0aGlzLnNwb3RMaWdodCA9IG5ldyBUSFJFRS5TcG90TGlnaHQoMHhmZmZmZmYsIDUwMDAwKTtcbiAgICB0aGlzLnNwb3RMaWdodC5hbmdsZSA9IDI7XG4gICAgdGhpcy5zcG90TGlnaHQucGVudW1icmEgPSAxO1xuICAgIHRoaXMuc3BvdExpZ2h0LmRlY2F5ID0gMC4wMTtcbiAgICB0aGlzLnNwb3RMaWdodC5kaXN0YW5jZSA9IDA7XG4gICAgdGhpcy5zcG90TGlnaHQuaW50ZW5zaXR5ID0gMTtcblxuICAgIHRoaXMuc3BvdExpZ2h0SGVscGVyID0gbmV3IFRIUkVFLlNwb3RMaWdodEhlbHBlcih0aGlzLnNwb3RMaWdodCk7XG4gICAgdGhpcy5zY2VuZS5hZGQodGhpcy5zcG90TGlnaHRIZWxwZXIpO1xuXG4gICAgY29uc3Qgc3BvdExpZ2h0VGFyZ2V0ID0gbmV3IFRIUkVFLk9iamVjdDNEKCk7XG4gICAgdGhpcy5zcG90TGlnaHQudGFyZ2V0ID0gc3BvdExpZ2h0VGFyZ2V0O1xuXG4gICAgdGhpcy5zcG90bGlnaHRHcm91cC5hZGQodGhpcy5zcG90TGlnaHQpO1xuICAgIHRoaXMuc3BvdGxpZ2h0R3JvdXAuYWRkKHNwb3RMaWdodFRhcmdldCk7XG4gICAgdGhpcy5zcG90TGlnaHQucG9zaXRpb24uc2V0KDAsIC0xLjQsIDApO1xuICAgIHNwb3RMaWdodFRhcmdldC5wb3NpdGlvbi5zZXQoMCwgLTEwLCAwKTtcblxuICAgIC8vIEFkZCB0aGUgcG9pbnQgbGlnaHQgZm9yIHRoZSBzdXJyb3VuZGluZyBsaWdodFxuICAgIHRoaXMucG9pbnRMaWdodCA9IG5ldyBUSFJFRS5Qb2ludExpZ2h0KDB4ZmZmZmZmLCA1MDAsIDAsIDAuMSk7XG4gICAgdGhpcy5zcG90bGlnaHRHcm91cC5hZGQodGhpcy5wb2ludExpZ2h0KTtcbiAgICB0aGlzLnBvaW50TGlnaHQucG9zaXRpb24uc2V0KDAsIC0xLjQsIDApO1xuXG4gICAgLy8gQWRkIHRoZSBsaWdodCBiZWFtXG4gICAgdGhpcy5jcmVhdGVTcG90TGlnaHRCZWFtKCk7XG5cbiAgICB0aGlzLmhlYWRHcm91cC5hZGQodGhpcy5zcG90bGlnaHRHcm91cCk7XG5cbiAgICAvLyBBZGQgdGhlIGFybVxuICAgIHRoaXMuYXJtR3JvdXAuYWRkKHRoaXMuaGVhZEdyb3VwKTtcbiAgICB0aGlzLmhlYWRHcm91cC5wb3NpdGlvbi5zZXQoMCwgLTAuNiwgMCk7XG4gICAgdGhpcy5hcm1Hcm91cC5hZGQodGhpcy5hcm0pO1xuXG4gICAgLy8gQWRkIHRoZSBzb2NrZXRcbiAgICB0aGlzLm9iamVjdEdyb3VwLmFkZCh0aGlzLmFybUdyb3VwKTtcbiAgICB0aGlzLm9iamVjdEdyb3VwLmFkZCh0aGlzLnNvY2tldCk7XG4gICAgdGhpcy5zb2NrZXQucG9zaXRpb24uc2V0KDAsIDEuMiwgMCk7XG5cbiAgICAvLyBBIG1vdmluZyBoZWFkIGhhcyBhYm91dCAzMiBjbSBpbiB3aWR0aFxuICAgIHRoaXMub2JqZWN0R3JvdXAuc2NhbGUubXVsdGlwbHlTY2FsYXIoOSk7XG5cbiAgICB0aGlzLnNjZW5lLmFkZCh0aGlzLm9iamVjdEdyb3VwKTtcblxuICAgIHRoaXMuaXNMb2FkZWQgPSB0cnVlO1xuICB9XG5cbiAgY29uc3RydWN0b3IoZml4dHVyZVNlcnZpY2U6IEZpeHR1cmVTZXJ2aWNlLCBwcmV2aWV3TWVzaFNlcnZpY2U6IFByZXZpZXdNZXNoU2VydmljZSwgZml4dHVyZTogQ2FjaGVkRml4dHVyZSwgc2NlbmU6IGFueSkge1xuICAgIHN1cGVyKGZpeHR1cmVTZXJ2aWNlLCBmaXh0dXJlLCBzY2VuZSk7XG5cbiAgICBmb3JrSm9pbihbXG4gICAgICBwcmV2aWV3TWVzaFNlcnZpY2UuZ2V0TWVzaCgnbW92aW5nX2hlYWRfc29ja2V0JyksXG4gICAgICBwcmV2aWV3TWVzaFNlcnZpY2UuZ2V0TWVzaCgnbW92aW5nX2hlYWRfYXJtJyksXG4gICAgICBwcmV2aWV3TWVzaFNlcnZpY2UuZ2V0TWVzaCgnbW92aW5nX2hlYWRfaGVhZCcpLFxuICAgIF0pXG4gICAgICAucGlwZShcbiAgICAgICAgbWFwKChbc29ja2V0LCBhcm0sIGhlYWRdKSA9PiB7XG4gICAgICAgICAgdGhpcy5zb2NrZXQgPSBzb2NrZXQ7XG4gICAgICAgICAgdGhpcy5hcm0gPSBhcm07XG4gICAgICAgICAgdGhpcy5oZWFkID0gaGVhZDtcblxuICAgICAgICAgIHRoaXMuY3JlYXRlT2JqZWN0cygpO1xuICAgICAgICB9KVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuICB9XG5cbiAgcHVibGljIGdldE9iamVjdCgpOiBUSFJFRS5PYmplY3QzRCB7XG4gICAgcmV0dXJuIHRoaXMub2JqZWN0R3JvdXA7XG4gIH1cblxuICBwdWJsaWMgdXBkYXRlUHJldmlldyhjaGFubmVsVmFsdWVzOiBGaXh0dXJlQ2hhbm5lbFZhbHVlW10sIG1hc3RlckRpbW1lclZhbHVlOiBudW1iZXIpOiB2b2lkIHtcbiAgICBzdXBlci51cGRhdGVQcmV2aWV3KGNoYW5uZWxWYWx1ZXMsIG1hc3RlckRpbW1lclZhbHVlKTtcblxuICAgIGlmICghdGhpcy5pc0xvYWRlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEFwcGx5IGRlZmF1bHQgc2V0dGluZ3NcbiAgICBsZXQgcGFuU3RhcnQgPSAwO1xuICAgIGxldCBwYW5FbmQgPSAyNTU7XG5cbiAgICBsZXQgdGlsdFN0YXJ0ID0gMDtcbiAgICBsZXQgdGlsdEVuZCA9IDI1NTtcblxuICAgIHRoaXMucGFuID0gMDtcbiAgICB0aGlzLnRpbHQgPSAwO1xuXG4gICAgLy8gQXBwbHkgdGhlIGtub3duIHByb3BlcnR5IHZhbHVlc1xuICAgIGZvciAoY29uc3QgY2hhbm5lbFZhbHVlIG9mIGNoYW5uZWxWYWx1ZXMpIHtcbiAgICAgIGNvbnN0IGNoYW5uZWwgPSB0aGlzLmZpeHR1cmVTZXJ2aWNlLmdldENoYW5uZWxCeU5hbWUodGhpcy5maXh0dXJlLCBjaGFubmVsVmFsdWUuY2hhbm5lbE5hbWUpO1xuICAgICAgY29uc3QgY2FwYWJpbGl0eSA9IHRoaXMuZ2V0Q2FwYWJpbGl0eUluVmFsdWUoY2hhbm5lbCwgY2hhbm5lbFZhbHVlLnZhbHVlKTtcbiAgICAgIGlmIChjYXBhYmlsaXR5KSB7XG4gICAgICAgIHN3aXRjaCAoY2FwYWJpbGl0eS5jYXBhYmlsaXR5LnR5cGUpIHtcbiAgICAgICAgICBjYXNlIEZpeHR1cmVDYXBhYmlsaXR5VHlwZS5QYW46IHtcbiAgICAgICAgICAgIHBhblN0YXJ0ID0gdGhpcy5maXh0dXJlU2VydmljZS5nZXRSb3RhdGlvbkFuZ2xlRGVnKGNhcGFiaWxpdHkuY2FwYWJpbGl0eS5hbmdsZVN0YXJ0KSB8fCAwO1xuICAgICAgICAgICAgcGFuRW5kID0gdGhpcy5maXh0dXJlU2VydmljZS5nZXRSb3RhdGlvbkFuZ2xlRGVnKGNhcGFiaWxpdHkuY2FwYWJpbGl0eS5hbmdsZUVuZCkgfHwgNTQwO1xuICAgICAgICAgICAgdGhpcy5wYW4gPSBjaGFubmVsVmFsdWUudmFsdWUgLyBjaGFubmVsLm1heFZhbHVlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgRml4dHVyZUNhcGFiaWxpdHlUeXBlLlRpbHQ6IHtcbiAgICAgICAgICAgIHRpbHRTdGFydCA9IHRoaXMuZml4dHVyZVNlcnZpY2UuZ2V0Um90YXRpb25BbmdsZURlZyhjYXBhYmlsaXR5LmNhcGFiaWxpdHkuYW5nbGVTdGFydCkgfHwgMDtcbiAgICAgICAgICAgIHRpbHRFbmQgPSB0aGlzLmZpeHR1cmVTZXJ2aWNlLmdldFJvdGF0aW9uQW5nbGVEZWcoY2FwYWJpbGl0eS5jYXBhYmlsaXR5LmFuZ2xlRW5kKSB8fCAyNzAwO1xuICAgICAgICAgICAgdGhpcy50aWx0ID0gY2hhbm5lbFZhbHVlLnZhbHVlIC8gY2hhbm5lbC5tYXhWYWx1ZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMudXBkYXRlUG9zaXRpb24odGhpcy5vYmplY3RHcm91cCk7XG5cbiAgICAvLyBjYWxjdWxhdGUgdGhlIHkveCByb3RhdGlvbiBpbiByYWRpYW50cyBiYXNlZCBvbiBwYW4vdGlsdCAoMC0xKSByZXNwZWN0aW5nIHRoZSBtYXggcGFuL3RpbHRcbiAgICB0aGlzLmFybUdyb3VwLnJvdGF0aW9uLnkgPSBUSFJFRS5NYXRoVXRpbHMuZGVnVG9SYWQocGFuRW5kICogdGhpcy5wYW4gKyBwYW5TdGFydCkgLSBUSFJFRS5NYXRoVXRpbHMuZGVnVG9SYWQocGFuRW5kIC8gMik7XG4gICAgdGhpcy5oZWFkR3JvdXAucm90YXRpb24ueCA9IFRIUkVFLk1hdGhVdGlscy5kZWdUb1JhZCh0aWx0RW5kICogdGhpcy50aWx0ICsgdGlsdFN0YXJ0KSAtIFRIUkVFLk1hdGhVdGlscy5kZWdUb1JhZCh0aWx0RW5kIC8gMik7XG5cbiAgICAvLyBVcGRhdGUgdGhlIGFuZ2xlIChvbmx5IG9uIGNoYW5nZSwgYmVjYXVzZSBpdCdzIGV4cGVuc2l2ZSlcbiAgICAvLyBUT0RPIHVwZGF0ZSB0aGUgY29ycmVjdCBhbmdsZSBmcm9tIHRoZSBwcm9maWxlXG4gICAgY29uc3QgYmVhbUFuZ2xlRHJlZ3JlZXMgPSAxNDtcbiAgICBpZiAodGhpcy5sYXN0QmVhbUFuZ2xlRGVncmVlcyAhPT0gYmVhbUFuZ2xlRHJlZ3JlZXMpIHtcbiAgICAgIHRoaXMuc3BvdExpZ2h0LmFuZ2xlID0gVEhSRUUuTWF0aFV0aWxzLmRlZ1RvUmFkKGJlYW1BbmdsZURyZWdyZWVzKTtcbiAgICAgIHRoaXMuY3JlYXRlU3BvdExpZ2h0QmVhbSgpO1xuICAgICAgdGhpcy5sYXN0QmVhbUFuZ2xlRGVncmVlcyA9IGJlYW1BbmdsZURyZWdyZWVzO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSB0aGUgbWF0ZXJpYWxcbiAgICBpZiAodGhpcy5sYXN0U2VsZWN0ZWQgIT09IHRoaXMuaXNTZWxlY3RlZCkge1xuICAgICAgaWYgKHRoaXMuaXNTZWxlY3RlZCkge1xuICAgICAgICB0aGlzLnNvY2tldC5tYXRlcmlhbCA9IHRoaXMuc2VsZWN0ZWRNYXRlcmlhbDtcbiAgICAgICAgdGhpcy5hcm0ubWF0ZXJpYWwgPSB0aGlzLnNlbGVjdGVkTWF0ZXJpYWw7XG4gICAgICAgIHRoaXMuaGVhZC5tYXRlcmlhbCA9IHRoaXMuc2VsZWN0ZWRNYXRlcmlhbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc29ja2V0Lm1hdGVyaWFsID0gdGhpcy5tYXRlcmlhbDtcbiAgICAgICAgdGhpcy5hcm0ubWF0ZXJpYWwgPSB0aGlzLm1hdGVyaWFsO1xuICAgICAgICB0aGlzLmhlYWQubWF0ZXJpYWwgPSB0aGlzLm1hdGVyaWFsO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmxhc3RTZWxlY3RlZCA9IHRoaXMuaXNTZWxlY3RlZDtcbiAgICB9XG5cbiAgICAvLyBBcHBseSB0aGUgY29sb3JzXG4gICAgY29uc3QgY29sb3IgPSBuZXcgVEhSRUUuQ29sb3IoJ3JnYignICsgdGhpcy5jb2xvclJlZCArICcsICcgKyB0aGlzLmNvbG9yR3JlZW4gKyAnLCAnICsgdGhpcy5jb2xvckJsdWUgKyAnKScpO1xuXG4gICAgdGhpcy5wb2ludExpZ2h0LmNvbG9yID0gY29sb3I7XG5cbiAgICB0aGlzLnNwb3RMaWdodC5jb2xvciA9IGNvbG9yO1xuICAgIHRoaXMuc3BvdExpZ2h0QmVhbS5tYXRlcmlhbC51bmlmb3Jtcy5saWdodENvbG9yLnZhbHVlID0gY29sb3I7XG5cbiAgICAvLyBBcHBseSB0aGUgZGltbWVyIHZhbHVlXG4gICAgLy8gVGFrZSB0aGUgY29sb3IgaW50byBhY2NvdW50IGZvciB0aGUgYmVhbSAoZG9uJ3Qgc2hvdyBhIGJsYWNrIGJlYW0pXG4gICAgY29uc3QgaW50ZW5zaXR5Q29sb3IgPSBNYXRoLm1heCh0aGlzLmNvbG9yUmVkLCB0aGlzLmNvbG9yR3JlZW4sIHRoaXMuY29sb3JCbHVlKTtcbiAgICAvLyBjb25zb2xlLmxvZyhNYXRoLm1pbihpbnRlbnNpdHlDb2xvciwgdGhpcy5kaW1tZXIpKTtcbiAgICB0aGlzLnNwb3RMaWdodEJlYW0ubWF0ZXJpYWwudW5pZm9ybXMub3BhY2l0eS52YWx1ZSA9IE1hdGgubWluKGludGVuc2l0eUNvbG9yLCB0aGlzLmRpbW1lcik7XG5cbiAgICB0aGlzLnNwb3RMaWdodC5pbnRlbnNpdHkgPSB0aGlzLnNwb3RMaWdodExpZ2h0TWF4SW50ZW5zaXR5ICogdGhpcy5kaW1tZXI7XG4gICAgdGhpcy5wb2ludExpZ2h0LmludGVuc2l0eSA9IHRoaXMucG9pbnRMaWdodE1heEludGVuc2l0eSAqIHRoaXMuZGltbWVyO1xuXG4gICAgdGhpcy5zcG90TGlnaHRCZWFtLm1hdGVyaWFsLnVuaWZvcm1zLnNwb3RQb3NpdGlvbi52YWx1ZSA9IHRoaXMub2JqZWN0R3JvdXAucG9zaXRpb247XG5cbiAgICAvLyB0aGlzLnNwb3RMaWdodEhlbHBlci51cGRhdGUoKTtcbiAgfVxuXG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy5zY2VuZS5yZW1vdmUodGhpcy5vYmplY3RHcm91cCk7XG4gICAgdGhpcy5tYXRlcmlhbC5kaXNwb3NlKCk7XG4gICAgdGhpcy5hdG1vc3BoZXJlTWF0ZXJpYWwuZGlzcG9zZSgpO1xuICAgIHRoaXMuc3BvdExpZ2h0SGVscGVyLmRpc3Bvc2UoKTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
import { Component, ElementRef, HostListener, ViewChild } from '@angular/core';
|
|
2
|
+
import * as THREE from 'three';
|
|
3
|
+
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls';
|
|
4
|
+
import { FixtureCategory } from '../models/fixture-profile';
|
|
5
|
+
import { FixtureService } from '../services/fixture.service';
|
|
6
|
+
import { PreviewMeshService } from '../services/preview-mesh.service';
|
|
7
|
+
import { PreviewService } from '../services/preview.service';
|
|
8
|
+
import { ProjectService } from '../services/project.service';
|
|
9
|
+
import { TimelineService } from '../services/timeline.service';
|
|
10
|
+
import { Positioning } from './../models/fixture';
|
|
11
|
+
import { AnimationService } from './../services/animation.service';
|
|
12
|
+
import { ColorChanger3d } from './models/color-changer-3d';
|
|
13
|
+
import { MovingHead3d } from './models/moving-head-3d';
|
|
14
|
+
import * as i0 from "@angular/core";
|
|
15
|
+
import * as i1 from "../services/fixture.service";
|
|
16
|
+
import * as i2 from "../services/preview-mesh.service";
|
|
17
|
+
import * as i3 from "./../services/animation.service";
|
|
18
|
+
import * as i4 from "../services/preview.service";
|
|
19
|
+
import * as i5 from "../services/timeline.service";
|
|
20
|
+
import * as i6 from "../services/project.service";
|
|
21
|
+
const _c0 = ["canvas"];
|
|
22
|
+
export class PreviewComponent {
|
|
23
|
+
constructor(fixtureService, previewMeshService, animationService, previewService, timelineService, projectService) {
|
|
24
|
+
this.fixtureService = fixtureService;
|
|
25
|
+
this.previewMeshService = previewMeshService;
|
|
26
|
+
this.animationService = animationService;
|
|
27
|
+
this.previewService = previewService;
|
|
28
|
+
this.timelineService = timelineService;
|
|
29
|
+
this.projectService = projectService;
|
|
30
|
+
this.fixtures3d = [];
|
|
31
|
+
this.previewService.doUpdateFixtureSetup.subscribe(() => {
|
|
32
|
+
// synchronize the 3d-fixtures to the project fixtures
|
|
33
|
+
this.syncFixtures();
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
syncFixtures() {
|
|
37
|
+
// remove all fixtures
|
|
38
|
+
for (const fixture3d of this.fixtures3d) {
|
|
39
|
+
fixture3d.destroy();
|
|
40
|
+
}
|
|
41
|
+
this.fixtures3d = [];
|
|
42
|
+
// add all fixtures from the project
|
|
43
|
+
for (const fixture of this.fixtureService.cachedFixtures) {
|
|
44
|
+
switch (fixture.profile.categories[0]) {
|
|
45
|
+
case FixtureCategory['Moving Head']:
|
|
46
|
+
this.fixtures3d.push(new MovingHead3d(this.fixtureService, this.previewMeshService, fixture, this.scene));
|
|
47
|
+
break;
|
|
48
|
+
case FixtureCategory['Color Changer']:
|
|
49
|
+
this.fixtures3d.push(new ColorChanger3d(this.fixtureService, this.previewMeshService, fixture, this.scene));
|
|
50
|
+
break;
|
|
51
|
+
case FixtureCategory['Blinder']:
|
|
52
|
+
this.fixtures3d.push(new ColorChanger3d(this.fixtureService, this.previewMeshService, fixture, this.scene));
|
|
53
|
+
break;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
get canvas() {
|
|
58
|
+
return this.canvasRef.nativeElement;
|
|
59
|
+
}
|
|
60
|
+
render() {
|
|
61
|
+
this.renderer.render(this.scene, this.camera);
|
|
62
|
+
}
|
|
63
|
+
updateStagePosition(positioning, xMin, xMax, yMin, yMax, zMin, zMax) {
|
|
64
|
+
let positionCount = 0; // Number of fixtures in the same position
|
|
65
|
+
let positionIndex = 1;
|
|
66
|
+
this.projectService.project.fixtures.forEach((element, index) => {
|
|
67
|
+
if (element.positioning === positioning) {
|
|
68
|
+
positionCount++;
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
this.projectService.project.fixtures.forEach((element, index) => {
|
|
72
|
+
if (element.positioning === positioning) {
|
|
73
|
+
element.positionX = xMin + ((xMax - xMin) / (positionCount + 1)) * positionIndex;
|
|
74
|
+
element.positionY = yMin + ((yMax - yMin) / (positionCount + 1)) * positionIndex;
|
|
75
|
+
element.positionZ = zMin + ((zMax - zMin) / (positionCount + 1)) * positionIndex;
|
|
76
|
+
positionIndex++;
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
animate(timeMillis) {
|
|
81
|
+
if (this.timelineService.playState === 'playing') {
|
|
82
|
+
// Overwrite the current time with the playing time, if we're in playback mode
|
|
83
|
+
timeMillis = this.timelineService.waveSurfer.getCurrentTime() * 1000;
|
|
84
|
+
}
|
|
85
|
+
this.animationService.timeMillis = timeMillis;
|
|
86
|
+
// Update the controls
|
|
87
|
+
if (this.controls) {
|
|
88
|
+
this.controls.update();
|
|
89
|
+
}
|
|
90
|
+
// Update the positions
|
|
91
|
+
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);
|
|
92
|
+
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);
|
|
93
|
+
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);
|
|
94
|
+
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);
|
|
95
|
+
// Update all fixtures and apply the preview properties, if available
|
|
96
|
+
// TODO Update the fixtures only e.g. 40 times per second according to the "real" refresh rate of the DMX interface?
|
|
97
|
+
const presets = this.previewService.getPresets(timeMillis);
|
|
98
|
+
const calculatedFixtures = this.previewService.getChannelValues(timeMillis, presets);
|
|
99
|
+
for (const fixture3d of this.fixtures3d) {
|
|
100
|
+
// Update the fixture properties
|
|
101
|
+
fixture3d.updatePreview(calculatedFixtures.get(fixture3d.fixture) || [], this.projectService.project.masterDimmerValue);
|
|
102
|
+
// Select the fixture, if required
|
|
103
|
+
if (this.fixtureService.settingsSelection) {
|
|
104
|
+
fixture3d.isSelected = this.fixtureService.settingsFixtureIsSelected(fixture3d.fixture.fixture);
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
fixture3d.isSelected = this.previewService.fixtureIsSelected(fixture3d.fixture.fixture.uuid, presets);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
// TODO enable for monitoring the DMX universes
|
|
111
|
+
this.previewService.setUniverseValues(calculatedFixtures, this.projectService.project.masterDimmerValue);
|
|
112
|
+
// Render the scene
|
|
113
|
+
this.render();
|
|
114
|
+
requestAnimationFrame(this.animate.bind(this));
|
|
115
|
+
}
|
|
116
|
+
getAspectRatio() {
|
|
117
|
+
const height = this.canvas.clientHeight;
|
|
118
|
+
if (height === 0) {
|
|
119
|
+
return 0;
|
|
120
|
+
}
|
|
121
|
+
return this.canvas.clientWidth / this.canvas.clientHeight;
|
|
122
|
+
}
|
|
123
|
+
onResize() {
|
|
124
|
+
this.camera.aspect = this.getAspectRatio();
|
|
125
|
+
this.camera.updateProjectionMatrix();
|
|
126
|
+
this.renderer.setSize(this.canvas.clientWidth, this.canvas.clientHeight);
|
|
127
|
+
}
|
|
128
|
+
setupRenderer() {
|
|
129
|
+
this.renderer = new THREE.WebGLRenderer({ antialias: true });
|
|
130
|
+
this.canvas.appendChild(this.renderer.domElement);
|
|
131
|
+
this.renderer.setPixelRatio(devicePixelRatio);
|
|
132
|
+
this.renderer.setSize(this.canvas.clientWidth, this.canvas.clientHeight);
|
|
133
|
+
// this.renderer.shadowMap.enabled = true;
|
|
134
|
+
// this.renderer.gammaInput = true;
|
|
135
|
+
// this.renderer.gammaOutput = true;
|
|
136
|
+
}
|
|
137
|
+
setupCamera() {
|
|
138
|
+
this.camera = new THREE.PerspectiveCamera(35, window.innerWidth / window.innerHeight, 1, 10000);
|
|
139
|
+
this.camera.position.set(-600, 80, 700);
|
|
140
|
+
}
|
|
141
|
+
setupControls() {
|
|
142
|
+
this.controls = new OrbitControls(this.camera, this.renderer.domElement);
|
|
143
|
+
this.controls.enableKeys = false;
|
|
144
|
+
this.controls.rotateSpeed = 0.05;
|
|
145
|
+
this.controls.zoomSpeed = 1.2;
|
|
146
|
+
this.controls.enableDamping = true;
|
|
147
|
+
this.controls.dampingFactor = 0.25;
|
|
148
|
+
this.controls.screenSpacePanning = false;
|
|
149
|
+
this.controls.minDistance = 700;
|
|
150
|
+
// this.controls.zoom = 1000;
|
|
151
|
+
this.controls.maxDistance = 2000;
|
|
152
|
+
this.controls.maxPolarAngle = Math.PI / 2;
|
|
153
|
+
this.controls.target = new THREE.Vector3(0, 200, 0);
|
|
154
|
+
// this.controls.rotation = 100;
|
|
155
|
+
}
|
|
156
|
+
setupScene() {
|
|
157
|
+
// Create a new scene
|
|
158
|
+
this.scene = new THREE.Scene();
|
|
159
|
+
// this.scene.background = new THREE.Color(0x080808);
|
|
160
|
+
// this.scene.fog = new THREE.FogExp2( 0x000000, 0.1 );
|
|
161
|
+
this.previewService.scene = this.scene;
|
|
162
|
+
// Add a little bit of ambient light
|
|
163
|
+
const ambient = new THREE.AmbientLight(0xffffff, 1.5);
|
|
164
|
+
this.scene.add(ambient);
|
|
165
|
+
// Create the stage dimensions
|
|
166
|
+
this.previewService.updateStage();
|
|
167
|
+
const lights = [];
|
|
168
|
+
lights[0] = new THREE.PointLight(0xffffff, 1, 0, 0.1);
|
|
169
|
+
lights[1] = new THREE.PointLight(0xffffff, 1, 0, 0.1);
|
|
170
|
+
lights[2] = new THREE.PointLight(0xffffff, 1, 0, 0.1);
|
|
171
|
+
lights[0].position.set(0, 2000, 0);
|
|
172
|
+
lights[1].position.set(1000, 2000, 1000);
|
|
173
|
+
lights[2].position.set(-1000, -2000, -1000);
|
|
174
|
+
lights[0].castShadow = true;
|
|
175
|
+
lights[1].castShadow = true;
|
|
176
|
+
lights[2].castShadow = true;
|
|
177
|
+
this.scene.add(lights[0]);
|
|
178
|
+
this.scene.add(lights[1]);
|
|
179
|
+
this.scene.add(lights[2]);
|
|
180
|
+
}
|
|
181
|
+
ngAfterViewInit() {
|
|
182
|
+
this.setupRenderer();
|
|
183
|
+
this.setupCamera();
|
|
184
|
+
this.setupControls();
|
|
185
|
+
this.setupScene();
|
|
186
|
+
this.onResize();
|
|
187
|
+
this.animate(null);
|
|
188
|
+
}
|
|
189
|
+
static { this.ɵfac = function PreviewComponent_Factory(t) { return new (t || PreviewComponent)(i0.ɵɵdirectiveInject(i1.FixtureService), i0.ɵɵdirectiveInject(i2.PreviewMeshService), i0.ɵɵdirectiveInject(i3.AnimationService), i0.ɵɵdirectiveInject(i4.PreviewService), i0.ɵɵdirectiveInject(i5.TimelineService), i0.ɵɵdirectiveInject(i6.ProjectService)); }; }
|
|
190
|
+
static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: PreviewComponent, selectors: [["lib-app-preview"]], viewQuery: function PreviewComponent_Query(rf, ctx) { if (rf & 1) {
|
|
191
|
+
i0.ɵɵviewQuery(_c0, 5);
|
|
192
|
+
} if (rf & 2) {
|
|
193
|
+
let _t;
|
|
194
|
+
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.canvasRef = _t.first);
|
|
195
|
+
} }, hostBindings: function PreviewComponent_HostBindings(rf, ctx) { if (rf & 1) {
|
|
196
|
+
i0.ɵɵlistener("resize", function PreviewComponent_resize_HostBindingHandler() { return ctx.onResize(); }, false, i0.ɵɵresolveWindow);
|
|
197
|
+
} }, decls: 2, vars: 0, consts: [["canvas", ""], [1, "h-100", 2, "overflow", "hidden"]], template: function PreviewComponent_Template(rf, ctx) { if (rf & 1) {
|
|
198
|
+
i0.ɵɵelement(0, "div", 1, 0);
|
|
199
|
+
} } }); }
|
|
200
|
+
}
|
|
201
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(PreviewComponent, [{
|
|
202
|
+
type: Component,
|
|
203
|
+
args: [{ selector: 'lib-app-preview', template: "<div class=\"h-100\" #canvas style=\"overflow: hidden\"></div>\n" }]
|
|
204
|
+
}], () => [{ type: i1.FixtureService }, { type: i2.PreviewMeshService }, { type: i3.AnimationService }, { type: i4.PreviewService }, { type: i5.TimelineService }, { type: i6.ProjectService }], { canvasRef: [{
|
|
205
|
+
type: ViewChild,
|
|
206
|
+
args: ['canvas']
|
|
207
|
+
}], onResize: [{
|
|
208
|
+
type: HostListener,
|
|
209
|
+
args: ['window:resize']
|
|
210
|
+
}] }); })();
|
|
211
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(PreviewComponent, { className: "PreviewComponent" }); })();
|
|
212
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJldmlldy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kZXNpZ25lci9zcmMvbGliL3ByZXZpZXcvcHJldmlldy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kZXNpZ25lci9zcmMvbGliL3ByZXZpZXcvcHJldmlldy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWlCLFNBQVMsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM5RixPQUFPLEtBQUssS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMvQixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDMUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzVELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUN0RSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDN0QsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzdELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDbEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDbkUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRTNELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQzs7Ozs7Ozs7O0FBT3ZELE1BQU0sT0FBTyxnQkFBZ0I7SUFXM0IsWUFDVSxjQUE4QixFQUM5QixrQkFBc0MsRUFDdEMsZ0JBQWtDLEVB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SUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUVsQyxNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFDbEIsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksS0FBSyxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN0RCxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3RELE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFFdEQsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNuQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3pDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFNUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7UUFDNUIsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7UUFDNUIsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7UUFFNUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQUVELGVBQWU7UUFDYixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ25CLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFFbEIsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2hCLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDckIsQ0FBQztpRkE1UFUsZ0JBQWdCO29FQUFoQixnQkFBZ0I7Ozs7OztZQUFoQix1RkFBQSxjQUFVLCtCQUFNOztZQ3BCN0IsNEJBQTBEOzs7aUZEb0I3QyxnQkFBZ0I7Y0FMNUIsU0FBUzsyQkFDRSxpQkFBaUI7dU1BYW5CLFNBQVM7a0JBRGhCLFNBQVM7bUJBQUMsUUFBUTtZQXNLWixRQUFRO2tCQURkLFlBQVk7bUJBQUMsZUFBZTs7a0ZBN0tsQixnQkFBZ0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlclZpZXdJbml0LCBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEhvc3RMaXN0ZW5lciwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgKiBhcyBUSFJFRSBmcm9tICd0aHJlZSc7XG5pbXBvcnQgeyBPcmJpdENvbnRyb2xzIH0gZnJvbSAndGhyZWUvZXhhbXBsZXMvanNtL2NvbnRyb2xzL09yYml0Q29udHJvbHMnO1xuaW1wb3J0IHsgRml4dHVyZUNhdGVnb3J5IH0gZnJvbSAnLi4vbW9kZWxzL2ZpeHR1cmUtcHJvZmlsZSc7XG5pbXBvcnQgeyBGaXh0dXJlU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2ZpeHR1cmUuc2VydmljZSc7XG5pbXBvcnQgeyBQcmV2aWV3TWVzaFNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9wcmV2aWV3LW1lc2guc2VydmljZSc7XG5pbXBvcnQgeyBQcmV2aWV3U2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL3ByZXZpZXcuc2VydmljZSc7XG5pbXBvcnQgeyBQcm9qZWN0U2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL3Byb2plY3Quc2VydmljZSc7XG5pbXBvcnQgeyBUaW1lbGluZVNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy90aW1lbGluZS5zZXJ2aWNlJztcbmltcG9ydCB7IFBvc2l0aW9uaW5nIH0gZnJvbSAnLi8uLi9tb2RlbHMvZml4dHVyZSc7XG5pbXBvcnQgeyBBbmltYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi8uLi9zZXJ2aWNlcy9hbmltYXRpb24uc2VydmljZSc7XG5pbXBvcnQgeyBDb2xvckNoYW5nZXIzZCB9IGZyb20gJy4vbW9kZWxzL2NvbG9yLWNoYW5nZXItM2QnO1xuaW1wb3J0IHsgRml4dHVyZTNkIH0gZnJvbSAnLi9tb2RlbHMvZml4dHVyZS0zZCc7XG5pbXBvcnQgeyBNb3ZpbmdIZWFkM2QgfSBmcm9tICcuL21vZGVscy9tb3ZpbmctaGVhZC0zZCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2xpYi1hcHAtcHJldmlldycsXG4gIHRlbXBsYXRlVXJsOiAnLi9wcmV2aWV3LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vcHJldmlldy5jb21wb25lbnQuY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIFByZXZpZXdDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0IHtcbiAgcHJpdmF0ZSByZW5kZXJlcjogVEhSRUUuV2ViR0xSZW5kZXJlcjtcbiAgcHJpdmF0ZSBzY2VuZTogVEhSRUUuU2NlbmU7XG4gIHByaXZhdGUgY2FtZXJhOiBUSFJFRS5QZXJzcGVjdGl2ZUNhbWVyYTtcbiAgcHVibGljIGNvbnRyb2xzOiBPcmJpdENvbnRyb2xzO1xuXG4gIHByaXZhdGUgZml4dHVyZXMzZDogRml4dHVyZTNkW10gPSBbXTtcblxuICBAVmlld0NoaWxkKCdjYW52YXMnKVxuICBwcml2YXRlIGNhbnZhc1JlZjogRWxlbWVudFJlZjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGZpeHR1cmVTZXJ2aWNlOiBGaXh0dXJlU2VydmljZSxcbiAgICBwcml2YXRlIHByZXZpZXdNZXNoU2VydmljZTogUHJldmlld01lc2hTZXJ2aWNlLFxuICAgIHByaXZhdGUgYW5pbWF0aW9uU2VydmljZTogQW5pbWF0aW9uU2VydmljZSxcbiAgICBwcml2YXRlIHByZXZpZXdTZXJ2aWNlOiBQcmV2aWV3U2VydmljZSxcbiAgICBwcml2YXRlIHRpbWVsaW5lU2VydmljZTogVGltZWxpbmVTZXJ2aWNlLFxuICAgIHByaXZhdGUgcHJvamVjdFNlcnZpY2U6IFByb2plY3RTZXJ2aWNlXG4gICkge1xuICAgIHRoaXMucHJldmlld1NlcnZpY2UuZG9VcGRhdGVGaXh0dXJlU2V0dXAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIC8vIHN5bmNocm9uaXplIHRoZSAzZC1maXh0dXJlcyB0byB0aGUgcHJvamVjdCBmaXh0dXJlc1xuICAgICAgdGhpcy5zeW5jRml4dHVyZXMoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc3luY0ZpeHR1cmVzKCkge1xuICAgIC8vIHJlbW92ZSBhbGwgZml4dHVyZXNcbiAgICBmb3IgKGNvbnN0IGZpeHR1cmUzZCBvZiB0aGlzLmZpeHR1cmVzM2QpIHtcbiAgICAgIGZpeHR1cmUzZC5kZXN0cm95KCk7XG4gICAgfVxuICAgIHRoaXMuZml4dHVyZXMzZCA9IFtdO1xuXG4gICAgLy8gYWRkIGFsbCBmaXh0dXJlcyBmcm9tIHRoZSBwcm9qZWN0XG4gICAgZm9yIChjb25zdCBmaXh0dXJlIG9mIHRoaXMuZml4dHVyZVNlcnZpY2UuY2FjaGVkRml4dHVyZXMpIHtcbiAgICAgIHN3aXRjaCAoZml4dHVyZS5wcm9maWxlLmNhdGVnb3JpZXNbMF0pIHtcbiAgICAgICAgY2FzZSBGaXh0dXJlQ2F0ZWdvcnlbJ01vdmluZyBIZWFkJ106XG4gICAgICAgICAgdGhpcy5maXh0dXJlczNkLnB1c2gobmV3IE1vdmluZ0hlYWQzZCh0aGlzLmZpeHR1cmVTZXJ2aWNlLCB0aGlzLnByZXZpZXdNZXNoU2VydmljZSwgZml4dHVyZSwgdGhpcy5zY2VuZSkpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEZpeHR1cmVDYXRlZ29yeVsnQ29sb3IgQ2hhbmdlciddOlxuICAgICAgICAgIHRoaXMuZml4dHVyZXMzZC5wdXNoKG5ldyBDb2xvckNoYW5nZXIzZCh0aGlzLmZpeHR1cmVTZXJ2aWNlLCB0aGlzLnByZXZpZXdNZXNoU2VydmljZSwgZml4dHVyZSwgdGhpcy5zY2VuZSkpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEZpeHR1cmVDYXRlZ29yeVsnQmxpbmRlciddOlxuICAgICAgICAgIHRoaXMuZml4dHVyZXMzZC5wdXNoKG5ldyBDb2xvckNoYW5nZXIzZCh0aGlzLmZpeHR1cmVTZXJ2aWNlLCB0aGlzLnByZXZpZXdNZXNoU2VydmljZSwgZml4dHVyZSwgdGhpcy5zY2VuZSkpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0IGNhbnZhcygpOiBIVE1MQ2FudmFzRWxlbWVudCB7XG4gICAgcmV0dXJuIHRoaXMuY2FudmFzUmVmLm5hdGl2ZUVsZW1lbnQ7XG4gIH1cblxuICBwcml2YXRlIHJlbmRlcigpIHtcbiAgICB0aGlzLnJlbmRlcmVyLnJlbmRlcih0aGlzLnNjZW5lLCB0aGlzLmNhbWVyYSk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVN0YWdlUG9zaXRpb24oXG4gICAgcG9zaXRpb25pbmc6IFBvc2l0aW9uaW5nLFxuICAgIHhNaW46IG51bWJlcixcbiAgICB4TWF4OiBudW1iZXIsXG4gICAgeU1pbjogbnVtYmVyLFxuICAgIHlNYXg6IG51bWJlcixcbiAgICB6TWluOiBudW1iZXIsXG4gICAgek1heDogbnVtYmVyXG4gICkge1xuICAgIGxldCBwb3NpdGlvbkNvdW50ID0gMDsgLy8gTnVtYmVyIG9mIGZpeHR1cmVzIGluIHRoZSBzYW1lIHBvc2l0aW9uXG4gICAgbGV0IHBvc2l0aW9uSW5kZXggPSAxO1xuXG4gICAgdGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LmZpeHR1cmVzLmZvckVhY2goKGVsZW1lbnQsIGluZGV4KSA9PiB7XG4gICAgICBpZiAoZWxlbWVudC5wb3NpdGlvbmluZyA9PT0gcG9zaXRpb25pbmcpIHtcbiAgICAgICAgcG9zaXRpb25Db3VudCsrO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LmZpeHR1cmVzLmZvckVhY2goKGVsZW1lbnQsIGluZGV4KSA9PiB7XG4gICAgICBpZiAoZWxlbWVudC5wb3NpdGlvbmluZyA9PT0gcG9zaXRpb25pbmcpIHtcbiAgICAgICAgZWxlbWVudC5wb3NpdGlvblggPSB4TWluICsgKCh4TWF4IC0geE1pbikgLyAocG9zaXRpb25Db3VudCArIDEpKSAqIHBvc2l0aW9uSW5kZXg7XG4gICAgICAgIGVsZW1lbnQucG9zaXRpb25ZID0geU1pbiArICgoeU1heCAtIHlNaW4pIC8gKHBvc2l0aW9uQ291bnQgKyAxKSkgKiBwb3NpdGlvbkluZGV4O1xuICAgICAgICBlbGVtZW50LnBvc2l0aW9uWiA9IHpNaW4gKyAoKHpNYXggLSB6TWluKSAvIChwb3NpdGlvbkNvdW50ICsgMSkpICogcG9zaXRpb25JbmRleDtcblxuICAgICAgICBwb3NpdGlvbkluZGV4Kys7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFuaW1hdGUodGltZU1pbGxpczogbnVtYmVyKSB7XG4gICAgaWYgKHRoaXMudGltZWxpbmVTZXJ2aWNlLnBsYXlTdGF0ZSA9PT0gJ3BsYXlpbmcnKSB7XG4gICAgICAvLyBPdmVyd3JpdGUgdGhlIGN1cnJlbnQgdGltZSB3aXRoIHRoZSBwbGF5aW5nIHRpbWUsIGlmIHdlJ3JlIGluIHBsYXliYWNrIG1vZGVcbiAgICAgIHRpbWVNaWxsaXMgPSB0aGlzLnRpbWVsaW5lU2VydmljZS53YXZlU3VyZmVyLmdldEN1cnJlbnRUaW1lKCkgKiAxMDAwO1xuICAgIH1cblxuICAgIHRoaXMuYW5pbWF0aW9uU2VydmljZS50aW1lTWlsbGlzID0gdGltZU1pbGxpcztcblxuICAgIC8vIFVwZGF0ZSB0aGUgY29udHJvbHNcbiAgICBpZiAodGhpcy5jb250cm9scykge1xuICAgICAgdGhpcy5jb250cm9scy51cGRhdGUoKTtcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgdGhlIHBvc2l0aW9uc1xuICAgIHRoaXMudXBkYXRlU3RhZ2VQb3NpdGlvbihcbiAgICAgIFBvc2l0aW9uaW5nLnRvcEZyb250LFxuICAgICAgLXRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5zdGFnZVdpZHRoQ20gLyAyLFxuICAgICAgdGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LnN0YWdlV2lkdGhDbSAvIDIsXG4gICAgICB0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3Quc3RhZ2VIZWlnaHRDbSArIHRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5zdGFnZUZsb29ySGVpZ2h0Q20sXG4gICAgICB0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3Quc3RhZ2VIZWlnaHRDbSArIHRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5zdGFnZUZsb29ySGVpZ2h0Q20sXG4gICAgICB0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3Quc3RhZ2VEZXB0aENtIC8gMiAtIDcwLFxuICAgICAgdGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LnN0YWdlRGVwdGhDbSAvIDIgLSA3MFxuICAgICk7XG4gICAgdGhpcy51cGRhdGVTdGFnZVBvc2l0aW9uKFxuICAgICAgUG9zaXRpb25pbmcuYm90dG9tRnJvbnQsXG4gICAgICAtdGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LnN0YWdlV2lkdGhDbSAvIDIsXG4gICAgICB0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3Quc3RhZ2VXaWR0aENtIC8gMixcbiAgICAgIHRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5zdGFnZUZsb29ySGVpZ2h0Q20sXG4gICAgICB0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3Quc3RhZ2VGbG9vckhlaWdodENtLFxuICAgICAgdGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LnN0YWdlRGVwdGhDbSAvIDIgLSA3MCxcbiAgICAgIHRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5zdGFnZURlcHRoQ20gLyAyIC0gNzBcbiAgICApO1xuICAgIHRoaXMudXBkYXRlU3RhZ2VQb3NpdGlvbihcbiAgICAgIFBvc2l0aW9uaW5nLnRvcEJhY2ssXG4gICAgICAtdGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LnN0YWdlV2lkdGhDbSAvIDIsXG4gICAgICB0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3Quc3RhZ2VXaWR0aENtIC8gMixcbiAgICAgIHRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5zdGFnZUhlaWdodENtICsgdGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LnN0YWdlRmxvb3JIZWlnaHRDbSxcbiAgICAgIHRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5zdGFnZUhlaWdodENtICsgdGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LnN0YWdlRmxvb3JIZWlnaHRDbSxcbiAgICAgIC10aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3Quc3RhZ2VEZXB0aENtIC8gMiArIDcwLFxuICAgICAgLXRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5zdGFnZURlcHRoQ20gLyAyICsgNzBcbiAgICApO1xuICAgIHRoaXMudXBkYXRlU3RhZ2VQb3NpdGlvbihcbiAgICAgIFBvc2l0aW9uaW5nLmJvdHRvbUJhY2ssXG4gICAgICAtdGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LnN0YWdlV2lkdGhDbSAvIDIsXG4gICAgICB0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3Quc3RhZ2VXaWR0aENtIC8gMixcbiAgICAgIHRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5zdGFnZUZsb29ySGVpZ2h0Q20sXG4gICAgICB0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3Quc3RhZ2VGbG9vckhlaWdodENtLFxuICAgICAgLXRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5zdGFnZURlcHRoQ20gLyAyICsgNzAsXG4gICAgICAtdGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LnN0YWdlRGVwdGhDbSAvIDIgKyA3MFxuICAgICk7XG5cbiAgICAvLyBVcGRhdGUgYWxsIGZpeHR1cmVzIGFuZCBhcHBseSB0aGUgcHJldmlldyBwcm9wZXJ0aWVzLCBpZiBhdmFpbGFibGVcbiAgICAvLyBUT0RPIFVwZGF0ZSB0aGUgZml4dHVyZXMgb25seSBlLmcuIDQwIHRpbWVzIHBlciBzZWNvbmQgYWNjb3JkaW5nIHRvIHRoZSBcInJlYWxcIiByZWZyZXNoIHJhdGUgb2YgdGhlIERNWCBpbnRlcmZhY2U/XG4gICAgY29uc3QgcHJlc2V0cyA9IHRoaXMucHJldmlld1NlcnZpY2UuZ2V0UHJlc2V0cyh0aW1lTWlsbGlzKTtcblxuICAgIGNvbnN0IGNhbGN1bGF0ZWRGaXh0dXJlcyA9IHRoaXMucHJldmlld1NlcnZpY2UuZ2V0Q2hhbm5lbFZhbHVlcyh0aW1lTWlsbGlzLCBwcmVzZXRzKTtcblxuICAgIGZvciAoY29uc3QgZml4dHVyZTNkIG9mIHRoaXMuZml4dHVyZXMzZCkge1xuICAgICAgLy8gVXBkYXRlIHRoZSBmaXh0dXJlIHByb3BlcnRpZXNcbiAgICAgIGZpeHR1cmUzZC51cGRhdGVQcmV2aWV3KGNhbGN1bGF0ZWRGaXh0dXJlcy5nZXQoZml4dHVyZTNkLmZpeHR1cmUpIHx8IFtdLCB0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3QubWFzdGVyRGltbWVyVmFsdWUpO1xuXG4gICAgICAvLyBTZWxlY3QgdGhlIGZpeHR1cmUsIGlmIHJlcXVpcmVkXG4gICAgICBpZiAodGhpcy5maXh0dXJlU2VydmljZS5zZXR0aW5nc1NlbGVjdGlvbikge1xuICAgICAgICBmaXh0dXJlM2QuaXNTZWxlY3RlZCA9IHRoaXMuZml4dHVyZVNlcnZpY2Uuc2V0dGluZ3NGaXh0dXJlSXNTZWxlY3RlZChmaXh0dXJlM2QuZml4dHVyZS5maXh0dXJlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZpeHR1cmUzZC5pc1NlbGVjdGVkID0gdGhpcy5wcmV2aWV3U2VydmljZS5maXh0dXJlSXNTZWxlY3RlZChmaXh0dXJlM2QuZml4dHVyZS5maXh0dXJlLnV1aWQsIHByZXNldHMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRPRE8gZW5hYmxlIGZvciBtb25pdG9yaW5nIHRoZSBETVggdW5pdmVyc2VzXG4gICAgdGhpcy5wcmV2aWV3U2VydmljZS5zZXRVbml2ZXJzZVZhbHVlcyhjYWxjdWxhdGVkRml4dHVyZXMsIHRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5tYXN0ZXJEaW1tZXJWYWx1ZSk7XG5cbiAgICAvLyBSZW5kZXIgdGhlIHNjZW5lXG4gICAgdGhpcy5yZW5kZXIoKTtcblxuICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSh0aGlzLmFuaW1hdGUuYmluZCh0aGlzKSk7XG4gIH1cblxuICBwcml2YXRlIGdldEFzcGVjdFJhdGlvKCk6IG51bWJlciB7XG4gICAgY29uc3QgaGVpZ2h0ID0gdGhpcy5jYW52YXMuY2xpZW50SGVpZ2h0O1xuXG4gICAgaWYgKGhlaWdodCA9PT0gMCkge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuY2FudmFzLmNsaWVudFdpZHRoIC8gdGhpcy5jYW52YXMuY2xpZW50SGVpZ2h0O1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OnJlc2l6ZScpXG4gIHB1YmxpYyBvblJlc2l6ZSgpIHtcbiAgICB0aGlzLmNhbWVyYS5hc3BlY3QgPSB0aGlzLmdldEFzcGVjdFJhdGlvKCk7XG4gICAgdGhpcy5jYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1xuICAgIHRoaXMucmVuZGVyZXIuc2V0U2l6ZSh0aGlzLmNhbnZhcy5jbGllbnRXaWR0aCwgdGhpcy5jYW52YXMuY2xpZW50SGVpZ2h0KTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0dXBSZW5kZXJlcigpIHtcbiAgICB0aGlzLnJlbmRlcmVyID0gbmV3IFRIUkVFLldlYkdMUmVuZGVyZXIoeyBhbnRpYWxpYXM6IHRydWUgfSk7XG4gICAgdGhpcy5jYW52YXMuYXBwZW5kQ2hpbGQodGhpcy5yZW5kZXJlci5kb21FbGVtZW50KTtcbiAgICB0aGlzLnJlbmRlcmVyLnNldFBpeGVsUmF0aW8oZGV2aWNlUGl4ZWxSYXRpbyk7XG4gICAgdGhpcy5yZW5kZXJlci5zZXRTaXplKHRoaXMuY2FudmFzLmNsaWVudFdpZHRoLCB0aGlzLmNhbnZhcy5jbGllbnRIZWlnaHQpO1xuICAgIC8vIHRoaXMucmVuZGVyZXIuc2hhZG93TWFwLmVuYWJsZWQgPSB0cnVlO1xuICAgIC8vIHRoaXMucmVuZGVyZXIuZ2FtbWFJbnB1dCA9IHRydWU7XG4gICAgLy8gdGhpcy5yZW5kZXJlci5nYW1tYU91dHB1dCA9IHRydWU7XG4gIH1cblxuICBwcml2YXRlIHNldHVwQ2FtZXJhKCkge1xuICAgIHRoaXMuY2FtZXJhID0gbmV3IFRIUkVFLlBlcnNwZWN0aXZlQ2FtZXJhKDM1LCB3aW5kb3cuaW5uZXJXaWR0aCAvIHdpbmRvdy5pbm5lckhlaWdodCwgMSwgMTAwMDApO1xuICAgIHRoaXMuY2FtZXJhLnBvc2l0aW9uLnNldCgtNjAwLCA4MCwgNzAwKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0dXBDb250cm9scygpIHtcbiAgICB0aGlzLmNvbnRyb2xzID0gbmV3IE9yYml0Q29udHJvbHModGhpcy5jYW1lcmEsIHRoaXMucmVuZGVyZXIuZG9tRWxlbWVudCk7XG4gICAgdGhpcy5jb250cm9scy5lbmFibGVLZXlzID0gZmFsc2U7XG4gICAgdGhpcy5jb250cm9scy5yb3RhdGVTcGVlZCA9IDAuMDU7XG4gICAgdGhpcy5jb250cm9scy56b29tU3BlZWQgPSAxLjI7XG4gICAgdGhpcy5jb250cm9scy5lbmFibGVEYW1waW5nID0gdHJ1ZTtcbiAgICB0aGlzLmNvbnRyb2xzLmRhbXBpbmdGYWN0b3IgPSAwLjI1O1xuICAgIHRoaXMuY29udHJvbHMuc2NyZWVuU3BhY2VQYW5uaW5nID0gZmFsc2U7XG4gICAgdGhpcy5jb250cm9scy5taW5EaXN0YW5jZSA9IDcwMDtcbiAgICAvLyB0aGlzLmNvbnRyb2xzLnpvb20gPSAxMDAwO1xuICAgIHRoaXMuY29udHJvbHMubWF4RGlzdGFuY2UgPSAyMDAwO1xuICAgIHRoaXMuY29udHJvbHMubWF4UG9sYXJBbmdsZSA9IE1hdGguUEkgLyAyO1xuICAgIHRoaXMuY29udHJvbHMudGFyZ2V0ID0gbmV3IFRIUkVFLlZlY3RvcjMoMCwgMjAwLCAwKTtcbiAgICAvLyB0aGlzLmNvbnRyb2xzLnJvdGF0aW9uID0gMTAwO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXR1cFNjZW5lKCkge1xuICAgIC8vIENyZWF0ZSBhIG5ldyBzY2VuZVxuICAgIHRoaXMuc2NlbmUgPSBuZXcgVEhSRUUuU2NlbmUoKTtcbiAgICAvLyB0aGlzLnNjZW5lLmJhY2tncm91bmQgPSBuZXcgVEhSRUUuQ29sb3IoMHgwODA4MDgpO1xuICAgIC8vIHRoaXMuc2NlbmUuZm9nXHQ9IG5ldyBUSFJFRS5Gb2dFeHAyKCAweDAwMDAwMCwgMC4xICk7XG5cbiAgICB0aGlzLnByZXZpZXdTZXJ2aWNlLnNjZW5lID0gdGhpcy5zY2VuZTtcblxuICAgIC8vIEFkZCBhIGxpdHRsZSBiaXQgb2YgYW1iaWVudCBsaWdodFxuICAgIGNvbnN0IGFtYmllbnQgPSBuZXcgVEhSRUUuQW1iaWVudExpZ2h0KDB4ZmZmZmZmLCAxLjUpO1xuICAgIHRoaXMuc2NlbmUuYWRkKGFtYmllbnQpO1xuXG4gICAgLy8gQ3JlYXRlIHRoZSBzdGFnZSBkaW1lbnNpb25zXG4gICAgdGhpcy5wcmV2aWV3U2VydmljZS51cGRhdGVTdGFnZSgpO1xuXG4gICAgY29uc3QgbGlnaHRzID0gW107XG4gICAgbGlnaHRzWzBdID0gbmV3IFRIUkVFLlBvaW50TGlnaHQoMHhmZmZmZmYsIDEsIDAsIDAuMSk7XG4gICAgbGlnaHRzWzFdID0gbmV3IFRIUkVFLlBvaW50TGlnaHQoMHhmZmZmZmYsIDEsIDAsIDAuMSk7XG4gICAgbGlnaHRzWzJdID0gbmV3IFRIUkVFLlBvaW50TGlnaHQoMHhmZmZmZmYsIDEsIDAsIDAuMSk7XG5cbiAgICBsaWdodHNbMF0ucG9zaXRpb24uc2V0KDAsIDIwMDAsIDApO1xuICAgIGxpZ2h0c1sxXS5wb3NpdGlvbi5zZXQoMTAwMCwgMjAwMCwgMTAwMCk7XG4gICAgbGlnaHRzWzJdLnBvc2l0aW9uLnNldCgtMTAwMCwgLTIwMDAsIC0xMDAwKTtcblxuICAgIGxpZ2h0c1swXS5jYXN0U2hhZG93ID0gdHJ1ZTtcbiAgICBsaWdodHNbMV0uY2FzdFNoYWRvdyA9IHRydWU7XG4gICAgbGlnaHRzWzJdLmNhc3RTaGFkb3cgPSB0cnVlO1xuXG4gICAgdGhpcy5zY2VuZS5hZGQobGlnaHRzWzBdKTtcbiAgICB0aGlzLnNjZW5lLmFkZChsaWdodHNbMV0pO1xuICAgIHRoaXMuc2NlbmUuYWRkKGxpZ2h0c1syXSk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy5zZXR1cFJlbmRlcmVyKCk7XG4gICAgdGhpcy5zZXR1cENhbWVyYSgpO1xuICAgIHRoaXMuc2V0dXBDb250cm9scygpO1xuICAgIHRoaXMuc2V0dXBTY2VuZSgpO1xuXG4gICAgdGhpcy5vblJlc2l6ZSgpO1xuICAgIHRoaXMuYW5pbWF0ZShudWxsKTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImgtMTAwXCIgI2NhbnZhcyBzdHlsZT1cIm92ZXJmbG93OiBoaWRkZW5cIj48L2Rpdj5cbiJdfQ==
|